From 89d78096ffe1e162c02b2099b5fe5dc5787f21ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20M=C3=BChleisen?= Date: Wed, 17 Apr 2024 16:23:10 +0200 Subject: [PATCH 1/2] update vendored duckdb --- src/duckdb/extension/icu/icu-timezone.cpp | 4 +- src/duckdb/extension/icu/icu_extension.cpp | 8 +- .../extension/json/buffered_json_reader.cpp | 13 +- .../json/include/buffered_json_reader.hpp | 2 + .../extension/json/include/json_scan.hpp | 20 +- .../json/include/json_serializer.hpp | 9 +- .../extension/json/include/json_structure.hpp | 6 +- src/duckdb/extension/json/json_functions.cpp | 9 +- .../json_functions/json_serialize_plan.cpp | 20 +- .../json_functions/json_serialize_sql.cpp | 21 +- .../json/json_functions/json_structure.cpp | 41 +- .../json/json_functions/read_json.cpp | 40 +- src/duckdb/extension/json/json_scan.cpp | 90 +- .../extension/parquet/column_reader.cpp | 15 +- .../extension/parquet/column_writer.cpp | 51 +- .../parquet/include/parquet_writer.hpp | 6 +- .../extension/parquet/parquet_extension.cpp | 33 +- .../extension/parquet/parquet_metadata.cpp | 2 +- .../extension/parquet/parquet_writer.cpp | 6 +- .../extension/parquet/zstd_file_system.cpp | 2 +- src/duckdb/src/catalog/catalog.cpp | 6 +- src/duckdb/src/catalog/catalog_entry.cpp | 8 + .../catalog_entry/duck_schema_entry.cpp | 26 +- .../catalog_entry/duck_table_entry.cpp | 17 +- .../catalog_entry/index_catalog_entry.cpp | 10 +- .../catalog_entry/sequence_catalog_entry.cpp | 2 +- .../catalog_entry/table_catalog_entry.cpp | 13 +- .../src/catalog/catalog_search_path.cpp | 5 + src/duckdb/src/catalog/catalog_set.cpp | 4 +- .../src/catalog/default/default_functions.cpp | 12 +- .../src/catalog/default/default_schemas.cpp | 2 +- .../src/catalog/default/default_views.cpp | 14 +- .../src/catalog/dependency_catalog_set.cpp | 3 +- src/duckdb/src/catalog/dependency_list.cpp | 100 +- src/duckdb/src/catalog/dependency_manager.cpp | 121 +- src/duckdb/src/catalog/duck_catalog.cpp | 2 +- src/duckdb/src/common/adbc/adbc.cpp | 332 +- .../src/common/arrow/appender/union_data.cpp | 4 +- src/duckdb/src/common/box_renderer.cpp | 24 +- src/duckdb/src/common/crypto/md5.cpp | 3 +- src/duckdb/src/common/enum_util.cpp | 308 +- .../src/common/enums/expression_type.cpp | 4 + .../src/common/enums/optimizer_type.cpp | 2 +- src/duckdb/src/common/file_system.cpp | 73 +- src/duckdb/src/common/filename_pattern.cpp | 26 +- src/duckdb/src/common/gzip_file_system.cpp | 2 +- src/duckdb/src/common/http_state.cpp | 2 +- src/duckdb/src/common/local_file_system.cpp | 143 +- src/duckdb/src/common/multi_file_reader.cpp | 76 +- .../src/common/row_operations/row_matcher.cpp | 4 +- .../serializer/buffered_file_reader.cpp | 14 +- .../serializer/buffered_file_writer.cpp | 45 +- src/duckdb/src/common/string_util.cpp | 5 +- src/duckdb/src/common/tree_renderer.cpp | 99 +- src/duckdb/src/common/types.cpp | 9 +- src/duckdb/src/common/types/bit.cpp | 12 +- src/duckdb/src/common/types/data_chunk.cpp | 4 +- src/duckdb/src/common/types/hash.cpp | 12 +- src/duckdb/src/common/types/hyperloglog.cpp | 2 + .../common/types/row/tuple_data_allocator.cpp | 13 + .../common/types/row/tuple_data_layout.cpp | 12 +- src/duckdb/src/common/types/uuid.cpp | 2 +- src/duckdb/src/common/types/vector.cpp | 36 +- .../comparison_operators.cpp | 38 +- .../common/vector_operations/generators.cpp | 2 +- .../vector_operations/is_distinct_from.cpp | 377 +- .../common/vector_operations/vector_hash.cpp | 75 +- src/duckdb/src/common/virtual_file_system.cpp | 53 +- .../aggregate/algebraic/avg.cpp | 4 +- .../aggregate/distributive/minmax.cpp | 6 +- .../aggregate/distributive/sum.cpp | 47 +- .../aggregate/holistic/quantile.cpp | 3 + .../core_functions/aggregate/nested/list.cpp | 2 + .../src/core_functions/core_functions.cpp | 2 +- .../src/core_functions/function_list.cpp | 4 +- .../scalar/date/time_bucket.cpp | 2 +- .../scalar/generic/system_functions.cpp | 63 +- .../scalar/list/array_slice.cpp | 2 +- .../core_functions/scalar/list/flatten.cpp | 127 +- .../scalar/list/list_aggregates.cpp | 4 +- .../core_functions/scalar/list/list_sort.cpp | 3 + .../core_functions/scalar/math/numeric.cpp | 5 +- .../src/core_functions/scalar/string/hex.cpp | 6 +- .../core_functions/scalar/string/repeat.cpp | 33 +- .../src/execution/column_binding_resolver.cpp | 12 +- .../src/execution/expression_executor.cpp | 4 - .../execute_comparison.cpp | 199 +- .../expression_executor/execute_function.cpp | 2 - .../execution/expression_executor_state.cpp | 2 +- src/duckdb/src/execution/index/art/art.cpp | 4 +- .../src/execution/index/unknown_index.cpp | 26 +- src/duckdb/src/execution/join_hashtable.cpp | 2 +- .../nested_loop_join_mark.cpp | 1 - .../csv_scanner/buffer_manager/csv_buffer.cpp | 17 +- .../buffer_manager/csv_buffer_manager.cpp | 33 +- .../buffer_manager/csv_file_handle.cpp | 18 +- .../csv_scanner/scanner/scanner_boundary.cpp | 14 +- .../scanner/string_value_scanner.cpp | 513 +- .../csv_scanner/sniffer/csv_sniffer.cpp | 13 +- .../csv_scanner/sniffer/dialect_detection.cpp | 29 +- .../csv_scanner/sniffer/type_detection.cpp | 2 +- .../state_machine/csv_state_machine_cache.cpp | 20 +- .../table_function/csv_file_scanner.cpp | 27 +- .../table_function/global_csv_state.cpp | 227 +- .../operator/csv_scanner/util/csv_error.cpp | 158 +- .../csv_scanner/util/csv_reader_options.cpp | 109 +- .../operator/helper/physical_vacuum.cpp | 25 +- .../operator/join/physical_iejoin.cpp | 2 + .../operator/persistent/csv_rejects_table.cpp | 141 +- .../physical_batch_copy_to_file.cpp | 4 +- .../persistent/physical_batch_insert.cpp | 19 +- .../persistent/physical_copy_database.cpp | 2 +- .../operator/persistent/physical_export.cpp | 10 +- .../operator/schema/physical_attach.cpp | 2 +- .../execution/physical_plan/plan_simple.cpp | 9 - .../execution/physical_plan/plan_vacuum.cpp | 18 + .../src/execution/physical_plan_generator.cpp | 8 +- .../execution/radix_partitioned_hashtable.cpp | 187 +- src/duckdb/src/execution/reservoir_sample.cpp | 2 +- src/duckdb/src/execution/window_executor.cpp | 76 +- .../src/execution/window_segment_tree.cpp | 43 +- .../aggregate/sorted_aggregate_function.cpp | 2 +- src/duckdb/src/function/cast/enum_casts.cpp | 75 +- .../src/function/cast/vector_cast_helpers.cpp | 19 +- src/duckdb/src/function/cast_rules.cpp | 10 +- .../src/function/compression_config.cpp | 2 +- src/duckdb/src/function/function_binder.cpp | 89 +- src/duckdb/src/function/function_set.cpp | 18 +- .../src/function/pragma/pragma_queries.cpp | 3 +- .../compress_integral.cpp | 26 +- .../compress_string.cpp | 4 +- .../src/function/scalar/list/list_select.cpp | 7 +- .../src/function/scalar/list/list_zip.cpp | 9 +- .../function/scalar/operators/arithmetic.cpp | 92 +- .../src/function/scalar/sequence/nextval.cpp | 2 +- .../src/function/scalar/strftime_format.cpp | 56 +- .../function/scalar/string/caseconvert.cpp | 12 +- .../src/function/scalar/string/length.cpp | 25 +- .../src/function/scalar/string/like.cpp | 2 +- .../string/regexp/regexp_extract_all.cpp | 2 +- .../scalar/system/aggregate_export.cpp | 6 +- src/duckdb/src/function/table/arrow.cpp | 8 +- .../table/arrow/arrow_array_scan_state.cpp | 2 +- src/duckdb/src/function/table/copy_csv.cpp | 30 +- src/duckdb/src/function/table/read_csv.cpp | 91 +- src/duckdb/src/function/table/sniff_csv.cpp | 20 +- .../table/system/duckdb_constraints.cpp | 2 +- .../table/system/duckdb_databases.cpp | 8 +- .../table/system/duckdb_extensions.cpp | 14 +- .../table/system/duckdb_sequences.cpp | 3 +- .../function/table/system/duckdb_tables.cpp | 4 +- .../table/system/pragma_metadata_info.cpp | 11 +- .../table/system/pragma_table_info.cpp | 16 +- src/duckdb/src/function/table/table_scan.cpp | 5 +- .../function/table/version/pragma_version.cpp | 6 +- .../src/include/duckdb/catalog/catalog.hpp | 8 +- .../include/duckdb/catalog/catalog_entry.hpp | 7 +- .../catalog_entry/duck_index_entry.hpp | 2 +- .../catalog_entry/duck_schema_entry.hpp | 2 +- .../catalog_entry/sequence_catalog_entry.hpp | 2 +- .../include/duckdb/catalog/catalog_set.hpp | 6 +- .../catalog/default/default_functions.hpp | 6 +- .../src/include/duckdb/catalog/dependency.hpp | 30 +- .../duckdb/catalog/dependency_list.hpp | 45 +- .../duckdb/catalog/dependency_manager.hpp | 33 +- .../include/duckdb/catalog/duck_catalog.hpp | 2 +- .../include/duckdb/catalog/standard_entry.hpp | 4 + .../src/include/duckdb/common/allocator.hpp | 6 +- .../duckdb/common/arrow/arrow_wrapper.hpp | 2 +- .../src/include/duckdb/common/bit_utils.hpp | 2 +- .../include/duckdb/common/box_renderer.hpp | 32 +- .../src/include/duckdb/common/crypto/md5.hpp | 1 - .../src/include/duckdb/common/enum_util.hpp | 32 + .../duckdb/common/enums/expression_type.hpp | 6 +- .../src/include/duckdb/common/exception.hpp | 115 +- .../common/exception/binder_exception.hpp | 24 +- .../common/exception/catalog_exception.hpp | 8 +- .../common/exception/conversion_exception.hpp | 12 +- .../common/exception/http_exception.hpp | 6 +- .../common/exception/parser_exception.hpp | 8 +- .../exception/transaction_exception.hpp | 4 +- .../duckdb/common/exception_format_value.hpp | 4 +- .../include/duckdb/common/extra_type_info.hpp | 4 +- .../include/duckdb/common/file_open_flags.hpp | 134 + .../src/include/duckdb/common/file_opener.hpp | 15 +- .../src/include/duckdb/common/file_system.hpp | 71 +- .../duckdb/common/filename_pattern.hpp | 10 +- .../include/duckdb/common/fixed_size_map.hpp | 26 +- .../src/include/duckdb/common/helper.hpp | 89 +- .../src/include/duckdb/common/http_state.hpp | 2 +- .../src/include/duckdb/common/hugeint.hpp | 4 +- .../include/duckdb/common/index_vector.hpp | 20 +- .../duckdb/common/local_file_system.hpp | 23 +- .../include/duckdb/common/memory_safety.hpp | 6 +- .../common/multi_file_reader_options.hpp | 2 +- .../duckdb/common/opener_file_system.hpp | 74 +- .../include/duckdb/common/operator/abs.hpp | 16 +- .../include/duckdb/common/optional_ptr.hpp | 10 +- .../duckdb/common/pipe_file_system.hpp | 2 +- .../src/include/duckdb/common/platform.h | 2 +- .../src/include/duckdb/common/printer.hpp | 10 +- .../src/include/duckdb/common/profiler.hpp | 4 +- .../display/terminal_progress_bar_display.hpp | 10 +- .../include/duckdb/common/random_engine.hpp | 2 +- .../src/include/duckdb/common/re2_regex.hpp | 14 +- .../serializer/buffered_file_reader.hpp | 3 + .../serializer/buffered_file_writer.hpp | 4 +- .../serializer/deserialization_data.hpp | 23 +- .../duckdb/common/serializer/deserializer.hpp | 12 + .../serializer/serialization_traits.hpp | 14 + .../duckdb/common/serializer/serializer.hpp | 16 + .../duckdb/common/sort/duckdb_pdqsort.hpp | 3 + .../duckdb/common/sort/partition_state.hpp | 2 + .../src/include/duckdb/common/string_util.hpp | 8 +- .../include/duckdb/common/tree_renderer.hpp | 49 +- .../src/include/duckdb/common/typedefs.hpp | 10 +- .../src/include/duckdb/common/types.hpp | 24 +- .../duckdb/common/types/cast_helpers.hpp | 3 +- .../types/column/column_data_collection.hpp | 20 +- .../column_data_collection_iterators.hpp | 10 +- .../types/column/partitioned_column_data.hpp | 2 +- .../common/types/constraint_conflict_info.hpp | 3 +- .../duckdb/common/types/data_chunk.hpp | 4 +- .../src/include/duckdb/common/types/date.hpp | 2 +- .../src/include/duckdb/common/types/hash.hpp | 10 +- .../duckdb/common/types/hyperloglog.hpp | 2 +- .../include/duckdb/common/types/interval.hpp | 8 +- .../types/row/partitioned_tuple_data.hpp | 2 +- .../common/types/row/tuple_data_layout.hpp | 13 +- .../common/types/row/tuple_data_segment.hpp | 2 +- .../duckdb/common/types/selection_vector.hpp | 24 +- .../duckdb/common/types/string_heap.hpp | 2 +- .../duckdb/common/types/string_type.hpp | 41 +- .../src/include/duckdb/common/types/time.hpp | 4 +- .../include/duckdb/common/types/timestamp.hpp | 6 +- .../src/include/duckdb/common/types/uuid.hpp | 4 +- .../src/include/duckdb/common/types/value.hpp | 4 +- .../include/duckdb/common/types/vector.hpp | 22 +- .../duckdb/common/types/vector_buffer.hpp | 2 +- .../src/include/duckdb/common/uhugeint.hpp | 4 +- .../include/duckdb/common/union_by_name.hpp | 2 +- .../src/include/duckdb/common/unique_ptr.hpp | 29 +- .../src/include/duckdb/common/vector.hpp | 42 +- .../vector_operations/aggregate_executor.hpp | 2 + .../common/vector_operations/general_cast.hpp | 3 +- .../vector_operations/generic_executor.hpp | 5 +- .../vector_operations/unary_executor.hpp | 5 +- .../vector_operations/vector_operations.hpp | 82 +- .../duckdb/common/virtual_file_system.hpp | 21 +- .../aggregate/distributive_functions.hpp | 2 +- .../core_functions/aggregate/sum_helpers.hpp | 14 +- .../duckdb/core_functions/function_list.hpp | 2 +- .../core_functions/lambda_functions.hpp | 3 +- .../duckdb/execution/aggregate_hashtable.hpp | 2 +- .../execution/column_binding_resolver.hpp | 2 +- .../duckdb/execution/expression_executor.hpp | 2 +- .../execution/expression_executor_state.hpp | 7 +- .../duckdb/execution/merge_sort_tree.hpp | 6 +- .../operator/aggregate/aggregate_object.hpp | 4 +- .../aggregate/distinct_aggregate_data.hpp | 2 +- .../operator/csv_scanner/base_scanner.hpp | 2 +- .../csv_scanner/column_count_scanner.hpp | 3 - .../operator/csv_scanner/csv_buffer.hpp | 15 +- .../csv_scanner/csv_buffer_manager.hpp | 3 + .../operator/csv_scanner/csv_error.hpp | 62 +- .../operator/csv_scanner/csv_file_handle.hpp | 5 + .../operator/csv_scanner/csv_file_scanner.hpp | 1 + .../operator/csv_scanner/csv_option.hpp | 10 +- .../csv_scanner/csv_reader_options.hpp | 34 +- .../csv_scanner/csv_state_machine.hpp | 4 + .../operator/csv_scanner/global_csv_state.hpp | 4 +- .../operator/csv_scanner/skip_scanner.hpp | 3 - .../csv_scanner/string_value_scanner.hpp | 75 +- .../helper/physical_batch_collector.hpp | 2 +- .../helper/physical_explain_analyze.hpp | 2 +- .../operator/helper/physical_prepare.hpp | 6 +- .../operator/helper/physical_set.hpp | 2 +- .../operator/helper/physical_vacuum.hpp | 5 +- .../operator/persistent/csv_rejects_table.hpp | 21 +- .../execution/physical_operator_states.hpp | 12 +- .../execution/physical_plan_generator.hpp | 3 +- .../duckdb/execution/window_executor.hpp | 2 +- .../duckdb/execution/window_segment_tree.hpp | 2 +- .../duckdb/function/aggregate_function.hpp | 2 +- .../function/cast/cast_function_set.hpp | 10 +- .../duckdb/function/cast/default_casts.hpp | 8 +- .../function/cast/vector_cast_helpers.hpp | 12 +- .../duckdb/function/compression_function.hpp | 8 +- .../include/duckdb/function/copy_function.hpp | 23 +- .../src/include/duckdb/function/function.hpp | 6 +- .../duckdb/function/function_binder.hpp | 47 +- .../function/function_serialization.hpp | 2 +- .../include/duckdb/function/function_set.hpp | 2 +- .../duckdb/function/pragma_function.hpp | 2 +- .../include/duckdb/function/scalar/regexp.hpp | 6 +- .../function/scalar/strftime_format.hpp | 14 +- .../function/scalar/string_functions.hpp | 6 +- .../duckdb/function/scalar_function.hpp | 12 +- .../include/duckdb/function/table/arrow.hpp | 4 +- .../table/arrow/arrow_duck_schema.hpp | 8 +- .../duckdb/function/table/read_csv.hpp | 4 +- .../duckdb/function/table/table_scan.hpp | 2 +- .../duckdb/function/table_function.hpp | 23 +- .../include/duckdb/function/udf_function.hpp | 126 +- .../src/include/duckdb/main/appender.hpp | 12 +- .../include/duckdb/main/attached_database.hpp | 4 +- .../main/buffered_data/buffered_data.hpp | 4 +- .../buffered_data/simple_buffered_data.hpp | 2 +- .../duckdb/main/capi/capi_internal.hpp | 4 +- .../main/chunk_scan_state/query_result.hpp | 4 +- .../include/duckdb/main/client_context.hpp | 2 +- .../main/client_context_file_opener.hpp | 5 +- .../src/include/duckdb/main/client_data.hpp | 1 + .../include/duckdb/main/client_properties.hpp | 3 +- src/duckdb/src/include/duckdb/main/config.hpp | 19 +- .../src/include/duckdb/main/connection.hpp | 53 +- .../src/include/duckdb/main/database.hpp | 22 +- .../duckdb/main/database_file_opener.hpp | 58 + .../duckdb/main/database_path_and_type.hpp | 4 +- .../src/include/duckdb/main/error_manager.hpp | 12 +- .../include/duckdb/main/extension_entries.hpp | 8 + .../include/duckdb/main/extension_helper.hpp | 1 + .../duckdb/main/external_dependencies.hpp | 3 +- .../duckdb/main/prepared_statement.hpp | 16 +- .../include/duckdb/main/query_profiler.hpp | 61 +- .../src/include/duckdb/main/query_result.hpp | 6 +- .../src/include/duckdb/main/relation.hpp | 2 +- .../duckdb/main/relation/query_relation.hpp | 2 +- .../src/include/duckdb/main/secret/secret.hpp | 18 +- .../duckdb/main/secret/secret_manager.hpp | 4 +- .../duckdb/main/secret/secret_storage.hpp | 8 +- .../src/include/duckdb/main/settings.hpp | 148 +- .../optimizer/column_lifetime_analyzer.hpp | 45 + .../optimizer/compressed_materialization.hpp | 24 +- .../join_order/cardinality_estimator.hpp | 4 +- .../optimizer/join_order/cost_model.hpp | 2 +- .../duckdb/optimizer/join_order/join_node.hpp | 2 +- .../optimizer/join_order/query_graph.hpp | 2 +- .../join_order/query_graph_manager.hpp | 2 +- .../optimizer/join_order/relation_manager.hpp | 2 +- .../optimizer/matcher/expression_matcher.hpp | 14 +- .../optimizer/matcher/function_matcher.hpp | 14 +- .../duckdb/optimizer/matcher/type_matcher.hpp | 2 +- .../include/duckdb/optimizer/optimizer.hpp | 3 + .../optimizer/statistics_propagator.hpp | 62 +- .../duckdb/optimizer/unnest_rewriter.hpp | 2 +- .../src/include/duckdb/parallel/event.hpp | 2 +- .../include/duckdb/parallel/executor_task.hpp | 2 +- .../src/include/duckdb/parallel/interrupt.hpp | 4 +- .../duckdb/parallel/pipeline_event.hpp | 2 +- .../src/include/duckdb/parser/column_list.hpp | 8 +- .../parser/constraints/unique_constraint.hpp | 57 +- .../parser/expression/bound_expression.hpp | 2 +- .../positional_reference_expression.hpp | 2 +- .../parser/expression/star_expression.hpp | 2 +- .../alter_scalar_function_info.hpp | 2 +- .../parsed_data/alter_table_function_info.hpp | 2 +- .../parser/parsed_data/alter_table_info.hpp | 2 +- .../parser/parsed_data/copy_database_info.hpp | 40 + .../parsed_data/create_function_info.hpp | 3 +- .../parser/parsed_data/create_index_info.hpp | 1 + .../duckdb/parser/parsed_data/create_info.hpp | 3 +- .../parser/parsed_data/create_macro_info.hpp | 2 +- .../create_pragma_function_info.hpp | 2 +- .../parser/parsed_data/create_secret_info.hpp | 4 +- .../parser/parsed_data/extra_drop_info.hpp | 6 +- .../duckdb/parser/parsed_data/parse_info.hpp | 5 +- .../duckdb/parser/parsed_data/vacuum_info.hpp | 7 +- .../src/include/duckdb/parser/parser.hpp | 2 +- .../duckdb/parser/parser_extension.hpp | 6 +- .../duckdb/parser/query_error_context.hpp | 2 +- .../src/include/duckdb/parser/transformer.hpp | 8 +- .../include/duckdb/planner/bind_context.hpp | 4 +- .../src/include/duckdb/planner/binder.hpp | 25 +- .../src/include/duckdb/planner/expression.hpp | 2 +- .../expression/bound_case_expression.hpp | 2 +- .../expression/bound_cast_expression.hpp | 2 +- .../expression/bound_default_expression.hpp | 2 +- .../expression/bound_expanded_expression.hpp | 34 + .../expression/bound_subquery_expression.hpp | 2 +- .../duckdb/planner/expression_binder.hpp | 1 + .../expression_binder/base_select_binder.hpp | 13 +- .../expression_binder/column_alias_binder.hpp | 7 +- .../expression_binder/group_binder.hpp | 5 +- .../expression_binder/having_binder.hpp | 8 +- .../expression_binder/order_binder.hpp | 20 +- .../expression_binder/qualify_binder.hpp | 9 +- .../expression_binder/select_bind_state.hpp | 52 + .../expression_binder/select_binder.hpp | 14 +- .../table_function_binder.hpp | 7 +- .../duckdb/planner/expression_iterator.hpp | 2 + .../planner/filter/conjunction_filter.hpp | 9 +- .../duckdb/planner/logical_operator.hpp | 2 + .../include/duckdb/planner/logical_tokens.hpp | 1 + .../include/duckdb/planner/operator/list.hpp | 1 + .../operator/logical_copy_database.hpp | 16 +- .../operator/logical_create_secret.hpp | 2 +- .../planner/operator/logical_cteref.hpp | 4 +- .../planner/operator/logical_delim_get.hpp | 2 +- .../planner/operator/logical_dummy_scan.hpp | 2 +- .../planner/operator/logical_explain.hpp | 2 +- .../planner/operator/logical_export.hpp | 4 +- .../operator/logical_expression_get.hpp | 4 +- .../operator/logical_extension_operator.hpp | 4 +- .../operator/logical_materialized_cte.hpp | 4 +- .../planner/operator/logical_pragma.hpp | 2 +- .../planner/operator/logical_prepare.hpp | 5 +- .../operator/logical_recursive_cte.hpp | 6 +- .../duckdb/planner/operator/logical_reset.hpp | 2 +- .../duckdb/planner/operator/logical_set.hpp | 3 +- .../planner/operator/logical_vacuum.hpp | 52 + .../duckdb/planner/operator_extension.hpp | 2 +- .../parsed_data/bound_create_table_info.hpp | 4 +- .../planner/query_node/bound_select_node.hpp | 9 +- .../subquery/flatten_dependent_join.hpp | 4 +- .../duckdb/storage/arena_allocator.hpp | 5 +- .../duckdb/storage/buffer/block_handle.hpp | 2 +- .../include/duckdb/storage/buffer_manager.hpp | 6 +- .../storage/checkpoint/row_group_writer.hpp | 5 +- .../checkpoint/string_checkpoint_state.hpp | 2 +- .../storage/checkpoint/table_data_writer.hpp | 6 +- .../duckdb/storage/checkpoint_manager.hpp | 10 +- .../storage/compression/alp/alp_analyze.hpp | 2 +- .../storage/compression/alp/alp_compress.hpp | 2 +- .../storage/compression/alp/alp_fetch.hpp | 2 +- .../storage/compression/alp/alp_scan.hpp | 2 +- .../compression/alprd/algorithm/alprd.hpp | 6 +- .../compression/alprd/alprd_analyze.hpp | 4 +- .../compression/alprd/alprd_compress.hpp | 2 +- .../storage/compression/alprd/alprd_fetch.hpp | 2 +- .../storage/compression/alprd/alprd_scan.hpp | 6 +- .../chimp/algorithm/flag_buffer.hpp | 2 +- .../chimp/algorithm/leading_zero_buffer.hpp | 6 +- .../storage/compression/chimp/chimp.hpp | 6 +- .../compression/chimp/chimp_analyze.hpp | 1 - .../storage/compression/chimp/chimp_fetch.hpp | 2 +- .../storage/compression/chimp/chimp_scan.hpp | 8 +- .../storage/compression/patas/patas.hpp | 8 +- .../compression/patas/patas_analyze.hpp | 1 - .../storage/compression/patas/patas_fetch.hpp | 2 +- .../storage/compression/patas/patas_scan.hpp | 6 +- .../include/duckdb/storage/data_pointer.hpp | 2 +- .../src/include/duckdb/storage/index.hpp | 2 +- .../include/duckdb/storage/magic_bytes.hpp | 2 +- .../include/duckdb/storage/object_cache.hpp | 6 +- .../duckdb/storage/optimistic_data_writer.hpp | 2 +- .../duckdb/storage/partial_block_manager.hpp | 2 +- .../storage/single_file_block_manager.hpp | 5 +- .../storage/standard_buffer_manager.hpp | 48 +- .../statistics/numeric_stats_union.hpp | 6 +- .../storage/statistics/segment_statistics.hpp | 4 +- .../include/duckdb/storage/storage_info.hpp | 4 +- .../duckdb/storage/storage_manager.hpp | 8 +- .../duckdb/storage/string_uncompressed.hpp | 15 +- .../duckdb/storage/table/append_state.hpp | 2 +- .../duckdb/storage/table/chunk_info.hpp | 4 +- .../storage/table/column_checkpoint_state.hpp | 2 +- .../duckdb/storage/table/column_data.hpp | 11 +- .../duckdb/storage/table/data_table_info.hpp | 5 +- .../duckdb/storage/table/row_group.hpp | 2 +- .../storage/table/row_group_segment_tree.hpp | 2 +- .../storage/table/row_version_manager.hpp | 3 +- .../duckdb/storage/table/scan_state.hpp | 6 +- .../duckdb/storage/table/segment_lock.hpp | 2 +- .../duckdb/storage/table/segment_tree.hpp | 8 +- .../storage/table/standard_column_data.hpp | 2 + .../duckdb/storage/table/table_index_list.hpp | 5 +- .../duckdb/storage/table/table_statistics.hpp | 2 +- .../duckdb/storage/table/update_segment.hpp | 2 +- .../duckdb/storage/table_storage_info.hpp | 3 +- .../duckdb/storage/write_ahead_log.hpp | 2 +- .../duckdb/transaction/delete_info.hpp | 21 +- .../duckdb/transaction/transaction.hpp | 2 +- .../duckdb/transaction/transaction_data.hpp | 2 +- .../duckdb/transaction/undo_buffer.hpp | 2 +- .../duckdb/transaction/update_info.hpp | 2 +- src/duckdb/src/main/appender.cpp | 2 +- src/duckdb/src/main/attached_database.cpp | 14 +- src/duckdb/src/main/capi/arrow-c.cpp | 8 +- src/duckdb/src/main/capi/cast/utils-c.cpp | 2 +- src/duckdb/src/main/capi/duckdb-c.cpp | 2 +- src/duckdb/src/main/capi/pending-c.cpp | 2 +- src/duckdb/src/main/capi/prepared-c.cpp | 4 +- src/duckdb/src/main/capi/result-c.cpp | 8 +- src/duckdb/src/main/client_context.cpp | 16 +- .../src/main/client_context_file_opener.cpp | 18 +- src/duckdb/src/main/client_data.cpp | 5 + src/duckdb/src/main/config.cpp | 164 +- src/duckdb/src/main/database.cpp | 38 +- src/duckdb/src/main/database_manager.cpp | 5 +- .../src/main/database_path_and_type.cpp | 8 +- src/duckdb/src/main/error_manager.cpp | 2 +- .../src/main/extension/extension_alias.cpp | 18 +- .../src/main/extension/extension_helper.cpp | 15 +- .../src/main/extension/extension_install.cpp | 2 +- .../src/main/extension/extension_load.cpp | 148 +- src/duckdb/src/main/query_profiler.cpp | 119 +- src/duckdb/src/main/secret/secret_manager.cpp | 3 +- src/duckdb/src/main/secret/secret_storage.cpp | 2 +- src/duckdb/src/main/settings/settings.cpp | 146 +- .../optimizer/column_lifetime_analyzer.cpp | 9 +- .../optimizer/compressed_materialization.cpp | 54 +- .../compress_aggregate.cpp | 3 + src/duckdb/src/optimizer/cse_optimizer.cpp | 10 +- .../join_order/cardinality_estimator.cpp | 16 +- src/duckdb/src/optimizer/optimizer.cpp | 31 +- .../pushdown/pushdown_cross_product.cpp | 21 +- .../pushdown/pushdown_inner_join.cpp | 11 +- .../pushdown/pushdown_set_operation.cpp | 4 +- .../src/optimizer/remove_unused_columns.cpp | 6 +- .../rule/ordered_aggregate_optimizer.cpp | 4 +- .../expression/propagate_aggregate.cpp | 2 +- .../expression/propagate_between.cpp | 16 +- .../statistics/expression/propagate_case.cpp | 2 +- .../statistics/expression/propagate_cast.cpp | 2 +- .../expression/propagate_columnref.cpp | 2 +- .../expression/propagate_comparison.cpp | 14 +- .../expression/propagate_conjunction.cpp | 12 +- .../expression/propagate_constant.cpp | 2 +- .../expression/propagate_function.cpp | 4 +- .../expression/propagate_operator.cpp | 20 +- .../operator/propagate_aggregate.cpp | 2 +- .../operator/propagate_cross_product.cpp | 2 +- .../statistics/operator/propagate_filter.cpp | 21 +- .../statistics/operator/propagate_get.cpp | 4 +- .../statistics/operator/propagate_join.cpp | 18 +- .../statistics/operator/propagate_limit.cpp | 2 +- .../statistics/operator/propagate_order.cpp | 2 +- .../operator/propagate_projection.cpp | 4 +- .../operator/propagate_set_operation.cpp | 2 +- .../statistics/operator/propagate_window.cpp | 2 +- .../src/optimizer/statistics_propagator.cpp | 57 +- .../src/parallel/pipeline_finish_event.cpp | 2 +- src/duckdb/src/parallel/task_scheduler.cpp | 9 +- .../parser/constraints/unique_constraint.cpp | 6 +- .../parser/parsed_data/create_index_info.cpp | 64 + .../src/parser/parsed_data/vacuum_info.cpp | 1 + .../expression/transform_function.cpp | 18 +- .../expression/transform_subquery.cpp | 24 + .../transform/helpers/transform_cte.cpp | 9 +- .../statement/transform_create_function.cpp | 3 +- .../statement/transform_create_index.cpp | 3 + .../transform/statement/transform_delete.cpp | 8 +- .../transform/statement/transform_insert.cpp | 8 +- .../statement/transform_pivot_stmt.cpp | 8 +- .../transform/statement/transform_pragma.cpp | 2 +- .../transform/statement/transform_select.cpp | 7 +- .../statement/transform_select_node.cpp | 10 +- .../transform/statement/transform_update.cpp | 7 +- .../transform/statement/transform_use.cpp | 5 +- src/duckdb/src/parser/transformer.cpp | 16 +- src/duckdb/src/planner/binder.cpp | 84 +- .../expression/bind_aggregate_expression.cpp | 57 +- .../expression/bind_unnest_expression.cpp | 11 +- .../expression/bind_window_expression.cpp | 62 +- .../binder/query_node/bind_cte_node.cpp | 45 +- .../binder/query_node/bind_select_node.cpp | 247 +- .../binder/query_node/bind_setop_node.cpp | 54 +- .../binder/query_node/plan_cte_node.cpp | 29 + .../binder/query_node/plan_subquery.cpp | 20 +- .../planner/binder/statement/bind_copy.cpp | 5 +- .../binder/statement/bind_copy_database.cpp | 51 +- .../planner/binder/statement/bind_create.cpp | 23 +- .../binder/statement/bind_create_table.cpp | 20 +- .../planner/binder/statement/bind_insert.cpp | 23 +- .../planner/binder/statement/bind_pragma.cpp | 6 +- .../src/planner/binder/statement/bind_set.cpp | 3 + .../planner/binder/statement/bind_vacuum.cpp | 131 +- .../binder/tableref/bind_basetableref.cpp | 100 +- .../planner/binder/tableref/bind_pivot.cpp | 3 + .../binder/tableref/bind_subqueryref.cpp | 2 +- .../binder/tableref/bind_table_function.cpp | 10 +- .../expression/bound_cast_expression.cpp | 14 +- .../expression/bound_expanded_expression.cpp | 22 + .../expression_binder/base_select_binder.cpp | 69 +- .../expression_binder/column_alias_binder.cpp | 13 +- .../expression_binder/group_binder.cpp | 9 +- .../expression_binder/having_binder.cpp | 24 +- .../expression_binder/lateral_binder.cpp | 16 +- .../expression_binder/order_binder.cpp | 68 +- .../expression_binder/qualify_binder.cpp | 25 +- .../expression_binder/select_bind_state.cpp | 52 + .../expression_binder/select_binder.cpp | 48 +- .../table_function_binder.cpp | 26 +- src/duckdb/src/planner/logical_operator.cpp | 23 +- .../operator/logical_copy_database.cpp | 18 +- .../src/planner/operator/logical_delete.cpp | 2 +- .../src/planner/operator/logical_get.cpp | 2 +- .../src/planner/operator/logical_insert.cpp | 2 +- .../src/planner/operator/logical_update.cpp | 2 +- .../src/planner/operator/logical_vacuum.cpp | 65 + src/duckdb/src/planner/planner.cpp | 8 +- .../subquery/flatten_dependent_join.cpp | 53 +- src/duckdb/src/storage/arena_allocator.cpp | 9 + .../buffer/buffer_pool_reservation.cpp | 2 +- src/duckdb/src/storage/buffer_manager.cpp | 12 +- .../storage/checkpoint/table_data_writer.cpp | 5 +- src/duckdb/src/storage/checkpoint_manager.cpp | 23 +- .../src/storage/compression/bitpacking.cpp | 7 +- .../compression/string_uncompressed.cpp | 2 +- src/duckdb/src/storage/data_pointer.cpp | 2 +- src/duckdb/src/storage/data_table.cpp | 25 +- src/duckdb/src/storage/local_storage.cpp | 13 +- src/duckdb/src/storage/magic_bytes.cpp | 11 +- .../src/storage/partial_block_manager.cpp | 2 +- .../serialize_logical_operator.cpp | 29 +- .../storage/serialization/serialize_nodes.cpp | 22 +- .../serialization/serialize_parse_info.cpp | 23 + .../src/storage/single_file_block_manager.cpp | 65 +- .../src/storage/standard_buffer_manager.cpp | 26 +- .../src/storage/statistics/array_stats.cpp | 2 +- .../storage/statistics/base_statistics.cpp | 5 +- .../src/storage/statistics/list_stats.cpp | 2 +- .../src/storage/statistics/struct_stats.cpp | 2 +- src/duckdb/src/storage/storage_info.cpp | 38 +- src/duckdb/src/storage/storage_manager.cpp | 31 +- src/duckdb/src/storage/table/chunk_info.cpp | 14 +- src/duckdb/src/storage/table/column_data.cpp | 154 +- src/duckdb/src/storage/table/row_group.cpp | 14 +- .../src/storage/table/row_version_manager.cpp | 4 +- .../storage/table/standard_column_data.cpp | 4 + .../src/storage/table/update_segment.cpp | 4 +- src/duckdb/src/storage/table_index_list.cpp | 7 +- .../src/storage/temporary_file_manager.cpp | 2 +- src/duckdb/src/storage/wal_replay.cpp | 15 +- src/duckdb/src/storage/write_ahead_log.cpp | 7 +- src/duckdb/src/transaction/cleanup_state.cpp | 13 +- src/duckdb/src/transaction/commit_state.cpp | 15 +- .../src/transaction/duck_transaction.cpp | 26 +- src/duckdb/src/transaction/rollback_state.cpp | 2 +- .../src/transaction/transaction_context.cpp | 2 +- src/duckdb/src/transaction/undo_buffer.cpp | 4 +- src/duckdb/third_party/fmt/include/fmt/core.h | 5 - src/duckdb/third_party/fsst/fsst.h | 2 +- src/duckdb/third_party/fsst/libfsst.cpp | 141 +- src/duckdb/third_party/fsst/libfsst.hpp | 13 - .../third_party/hyperloglog/hyperloglog.hpp | 4 + .../libpg_query/include/nodes/parsenodes.hpp | 9 +- .../libpg_query/include/parser/gram.hpp | 3 +- .../libpg_query/src_backend_parser_gram.cpp | 30755 ++++++++-------- .../libpg_query/src_backend_parser_scan.cpp | 837 +- src/duckdb/third_party/lz4/lz4.cpp | 2605 ++ src/duckdb/third_party/lz4/lz4.hpp | 843 + .../third_party/parquet/parquet_types.cpp | 3 + .../third_party/parquet/parquet_types.h | 3 +- src/duckdb/third_party/re2/re2/bitmap256.cc | 44 + src/duckdb/third_party/re2/re2/bitmap256.h | 38 +- src/duckdb/third_party/re2/re2/bitstate.cc | 55 +- src/duckdb/third_party/re2/re2/compile.cc | 310 +- src/duckdb/third_party/re2/re2/dfa.cc | 355 +- .../third_party/re2/re2/filtered_re2.cc | 22 +- src/duckdb/third_party/re2/re2/filtered_re2.h | 50 +- src/duckdb/third_party/re2/re2/mimics_pcre.cc | 32 +- src/duckdb/third_party/re2/re2/nfa.cc | 222 +- src/duckdb/third_party/re2/re2/onepass.cc | 21 +- src/duckdb/third_party/re2/re2/parse.cc | 325 +- src/duckdb/third_party/re2/re2/perl_groups.cc | 70 +- src/duckdb/third_party/re2/re2/pod_array.h | 55 + src/duckdb/third_party/re2/re2/prefilter.cc | 80 +- src/duckdb/third_party/re2/re2/prefilter.h | 26 +- .../third_party/re2/re2/prefilter_tree.cc | 154 +- .../third_party/re2/re2/prefilter_tree.h | 9 +- src/duckdb/third_party/re2/re2/prog.cc | 373 +- src/duckdb/third_party/re2/re2/prog.h | 121 +- src/duckdb/third_party/re2/re2/re2.cc | 554 +- src/duckdb/third_party/re2/re2/re2.h | 478 +- src/duckdb/third_party/re2/re2/regexp.cc | 242 +- src/duckdb/third_party/re2/re2/regexp.h | 85 +- src/duckdb/third_party/re2/re2/set.cc | 57 +- src/duckdb/third_party/re2/re2/set.h | 17 +- src/duckdb/third_party/re2/re2/simplify.cc | 91 +- src/duckdb/third_party/re2/re2/sparse_array.h | 392 + src/duckdb/third_party/re2/re2/sparse_set.h | 264 + src/duckdb/third_party/re2/re2/stringpiece.cc | 2 +- src/duckdb/third_party/re2/re2/stringpiece.h | 19 +- src/duckdb/third_party/re2/re2/tostring.cc | 14 +- .../third_party/re2/re2/unicode_casefold.cc | 49 +- .../third_party/re2/re2/unicode_casefold.h | 2 +- .../third_party/re2/re2/unicode_groups.cc | 9585 ++--- .../third_party/re2/re2/unicode_groups.h | 2 +- src/duckdb/third_party/re2/re2/walker-inl.h | 41 +- src/duckdb/third_party/re2/util/logging.h | 32 +- src/duckdb/third_party/re2/util/mix.h | 8 +- src/duckdb/third_party/re2/util/mutex.h | 63 +- src/duckdb/third_party/re2/util/rune.cc | 10 +- src/duckdb/third_party/re2/util/strutil.cc | 17 +- src/duckdb/third_party/re2/util/strutil.h | 4 +- src/duckdb/third_party/re2/util/utf.h | 2 +- src/duckdb/third_party/re2/util/util.h | 10 +- .../utf8proc/include/utf8proc_wrapper.hpp | 2 + .../third_party/utf8proc/utf8proc_wrapper.cpp | 37 +- src/duckdb/ub_src_common.cpp | 2 - src/duckdb/ub_src_execution_physical_plan.cpp | 2 + src/duckdb/ub_src_planner_expression.cpp | 2 + .../ub_src_planner_expression_binder.cpp | 2 + src/duckdb/ub_src_planner_operator.cpp | 2 + 696 files changed, 35402 insertions(+), 26984 deletions(-) create mode 100644 src/duckdb/src/execution/physical_plan/plan_vacuum.cpp create mode 100644 src/duckdb/src/include/duckdb/common/file_open_flags.hpp create mode 100644 src/duckdb/src/include/duckdb/main/database_file_opener.hpp create mode 100644 src/duckdb/src/include/duckdb/optimizer/column_lifetime_analyzer.hpp create mode 100644 src/duckdb/src/include/duckdb/parser/parsed_data/copy_database_info.hpp create mode 100644 src/duckdb/src/include/duckdb/planner/expression/bound_expanded_expression.hpp create mode 100644 src/duckdb/src/include/duckdb/planner/expression_binder/select_bind_state.hpp create mode 100644 src/duckdb/src/include/duckdb/planner/operator/logical_vacuum.hpp create mode 100644 src/duckdb/src/planner/expression/bound_expanded_expression.cpp create mode 100644 src/duckdb/src/planner/expression_binder/select_bind_state.cpp create mode 100644 src/duckdb/src/planner/operator/logical_vacuum.cpp create mode 100644 src/duckdb/third_party/lz4/lz4.cpp create mode 100644 src/duckdb/third_party/lz4/lz4.hpp create mode 100644 src/duckdb/third_party/re2/re2/bitmap256.cc create mode 100644 src/duckdb/third_party/re2/re2/pod_array.h create mode 100644 src/duckdb/third_party/re2/re2/sparse_array.h create mode 100644 src/duckdb/third_party/re2/re2/sparse_set.h diff --git a/src/duckdb/extension/icu/icu-timezone.cpp b/src/duckdb/extension/icu/icu-timezone.cpp index 032b3ab0..bd0f9d21 100644 --- a/src/duckdb/extension/icu/icu-timezone.cpp +++ b/src/duckdb/extension/icu/icu-timezone.cpp @@ -3,6 +3,7 @@ #include "duckdb/common/types/timestamp.hpp" #include "duckdb/common/exception/conversion_exception.hpp" #include "duckdb/function/cast/cast_function_set.hpp" +#include "duckdb/function/cast_rules.hpp" #include "duckdb/main/extension_util.hpp" #include "duckdb/parser/parsed_data/create_scalar_function_info.hpp" #include "duckdb/parser/parsed_data/create_table_function_info.hpp" @@ -183,7 +184,8 @@ struct ICUFromNaiveTimestamp : public ICUDateFunc { auto &config = DBConfig::GetConfig(db); auto &casts = config.GetCastFunctions(); - casts.RegisterCastFunction(LogicalType::TIMESTAMP, LogicalType::TIMESTAMP_TZ, BindCastFromNaive); + const auto implicit_cost = CastRules::ImplicitCast(LogicalType::TIMESTAMP, LogicalType::TIMESTAMP_TZ); + casts.RegisterCastFunction(LogicalType::TIMESTAMP, LogicalType::TIMESTAMP_TZ, BindCastFromNaive, implicit_cost); casts.RegisterCastFunction(LogicalType::TIMESTAMP_MS, LogicalType::TIMESTAMP_TZ, BindCastFromNaive); casts.RegisterCastFunction(LogicalType::TIMESTAMP_NS, LogicalType::TIMESTAMP_TZ, BindCastFromNaive); casts.RegisterCastFunction(LogicalType::TIMESTAMP_S, LogicalType::TIMESTAMP_TZ, BindCastFromNaive); diff --git a/src/duckdb/extension/icu/icu_extension.cpp b/src/duckdb/extension/icu/icu_extension.cpp index a798f2f2..bf09f4e1 100644 --- a/src/duckdb/extension/icu/icu_extension.cpp +++ b/src/duckdb/extension/icu/icu_extension.cpp @@ -221,7 +221,7 @@ static void SetICUCalendar(ClientContext &context, SetScope scope, Value ¶me } } -void IcuExtension::Load(DuckDB &ddb) { +static void LoadInternal(DuckDB &ddb) { auto &db = *ddb.instance; // iterate over all the collations @@ -275,6 +275,10 @@ void IcuExtension::Load(DuckDB &ddb) { ExtensionUtil::RegisterFunction(db, cal_names); } +void IcuExtension::Load(DuckDB &ddb) { + LoadInternal(ddb); +} + std::string IcuExtension::Name() { return "icu"; } @@ -285,7 +289,7 @@ extern "C" { DUCKDB_EXTENSION_API void icu_init(duckdb::DatabaseInstance &db) { // NOLINT duckdb::DuckDB db_wrapper(db); - db_wrapper.LoadExtension(); + duckdb::LoadInternal(db_wrapper); } DUCKDB_EXTENSION_API const char *icu_version() { // NOLINT diff --git a/src/duckdb/extension/json/buffered_json_reader.cpp b/src/duckdb/extension/json/buffered_json_reader.cpp index 2e465386..c5dc68f5 100644 --- a/src/duckdb/extension/json/buffered_json_reader.cpp +++ b/src/duckdb/extension/json/buffered_json_reader.cpp @@ -44,6 +44,10 @@ bool JSONFileHandle::RequestedReadsComplete() { return requested_reads == actual_reads; } +bool JSONFileHandle::LastReadRequested() const { + return last_read_requested; +} + idx_t JSONFileHandle::FileSize() const { return file_size; } @@ -56,6 +60,10 @@ bool JSONFileHandle::CanSeek() const { return can_seek; } +bool JSONFileHandle::IsPipe() const { + return file_handle->IsPipe(); +} + FileHandle &JSONFileHandle::GetHandle() { return *file_handle; } @@ -193,9 +201,8 @@ BufferedJSONReader::BufferedJSONReader(ClientContext &context, BufferedJSONReade void BufferedJSONReader::OpenJSONFile() { lock_guard guard(lock); if (!IsOpen()) { - auto &file_system = FileSystem::GetFileSystem(context); - auto regular_file_handle = file_system.OpenFile(file_name.c_str(), FileFlags::FILE_FLAGS_READ, - FileLockType::NO_LOCK, options.compression); + auto &fs = FileSystem::GetFileSystem(context); + auto regular_file_handle = fs.OpenFile(file_name, FileFlags::FILE_FLAGS_READ | options.compression); file_handle = make_uniq(std::move(regular_file_handle), BufferAllocator::Get(context)); } Reset(); diff --git a/src/duckdb/extension/json/include/buffered_json_reader.hpp b/src/duckdb/extension/json/include/buffered_json_reader.hpp index b4a894a5..6fddc78a 100644 --- a/src/duckdb/extension/json/include/buffered_json_reader.hpp +++ b/src/duckdb/extension/json/include/buffered_json_reader.hpp @@ -60,11 +60,13 @@ struct JSONFileHandle { void Reset(); bool RequestedReadsComplete(); + bool LastReadRequested() const; idx_t FileSize() const; idx_t Remaining() const; bool CanSeek() const; + bool IsPipe() const; FileHandle &GetHandle(); diff --git a/src/duckdb/extension/json/include/json_scan.hpp b/src/duckdb/extension/json/include/json_scan.hpp index 959c3e14..1e0b9dc2 100644 --- a/src/duckdb/extension/json/include/json_scan.hpp +++ b/src/duckdb/extension/json/include/json_scan.hpp @@ -9,13 +9,13 @@ #pragma once #include "buffered_json_reader.hpp" -#include "json_enums.hpp" #include "duckdb/common/multi_file_reader.hpp" #include "duckdb/common/mutex.hpp" #include "duckdb/common/pair.hpp" #include "duckdb/common/types/type_map.hpp" #include "duckdb/function/scalar/strftime_format.hpp" #include "duckdb/function/table_function.hpp" +#include "json_enums.hpp" #include "json_transform.hpp" namespace duckdb { @@ -226,14 +226,20 @@ struct JSONScanLocalState { private: bool ReadNextBuffer(JSONScanGlobalState &gstate); - bool ReadNextBufferInternal(JSONScanGlobalState &gstate, optional_idx &buffer_index, bool &file_done); - bool ReadNextBufferSeek(JSONScanGlobalState &gstate, optional_idx &buffer_index, bool &file_done); - bool ReadNextBufferNoSeek(JSONScanGlobalState &gstate, optional_idx &buffer_index, bool &file_done); + bool ReadNextBufferInternal(JSONScanGlobalState &gstate, AllocatedData &buffer, optional_idx &buffer_index, + bool &file_done); + bool ReadNextBufferSeek(JSONScanGlobalState &gstate, AllocatedData &buffer, optional_idx &buffer_index, + bool &file_done); + bool ReadNextBufferNoSeek(JSONScanGlobalState &gstate, AllocatedData &buffer, optional_idx &buffer_index, + bool &file_done); + AllocatedData AllocateBuffer(JSONScanGlobalState &gstate); + data_ptr_t GetReconstructBuffer(JSONScanGlobalState &gstate); + void SkipOverArrayStart(); - void ReadAndAutoDetect(JSONScanGlobalState &gstate, optional_idx &buffer_index); - bool ReconstructFirstObject(); - void ParseNextChunk(); + void ReadAndAutoDetect(JSONScanGlobalState &gstate, AllocatedData &buffer, optional_idx &buffer_index); + bool ReconstructFirstObject(JSONScanGlobalState &gstate); + void ParseNextChunk(JSONScanGlobalState &gstate); void ParseJSON(char *const json_start, const idx_t json_size, const idx_t remaining); void ThrowObjectSizeError(const idx_t object_size); diff --git a/src/duckdb/extension/json/include/json_serializer.hpp b/src/duckdb/extension/json/include/json_serializer.hpp index 17f5f53d..d8f80a50 100644 --- a/src/duckdb/extension/json/include/json_serializer.hpp +++ b/src/duckdb/extension/json/include/json_serializer.hpp @@ -25,15 +25,16 @@ struct JsonSerializer : Serializer { void PushValue(yyjson_mut_val *val); public: - explicit JsonSerializer(yyjson_mut_doc *doc, bool skip_if_null, bool skip_if_empty) + explicit JsonSerializer(yyjson_mut_doc *doc, bool skip_if_null, bool skip_if_empty, bool skip_if_default) : doc(doc), stack({yyjson_mut_obj(doc)}), skip_if_null(skip_if_null), skip_if_empty(skip_if_empty) { serialize_enum_as_string = true; - serialize_default_values = true; + serialize_default_values = !skip_if_default; } template - static yyjson_mut_val *Serialize(T &value, yyjson_mut_doc *doc, bool skip_if_null, bool skip_if_empty) { - JsonSerializer serializer(doc, skip_if_null, skip_if_empty); + static yyjson_mut_val *Serialize(T &value, yyjson_mut_doc *doc, bool skip_if_null, bool skip_if_empty, + bool skip_if_default) { + JsonSerializer serializer(doc, skip_if_null, skip_if_empty, skip_if_default); value.Serialize(serializer); return serializer.GetRootObject(); } diff --git a/src/duckdb/extension/json/include/json_structure.hpp b/src/duckdb/extension/json/include/json_structure.hpp index 7fcd43b3..1f008777 100644 --- a/src/duckdb/extension/json/include/json_structure.hpp +++ b/src/duckdb/extension/json/include/json_structure.hpp @@ -19,7 +19,7 @@ struct StrpTimeFormat; struct JSONStructureNode { public: JSONStructureNode(); - JSONStructureNode(yyjson_val *key_p, yyjson_val *val_p); + JSONStructureNode(yyjson_val *key_p, yyjson_val *val_p, const bool ignore_errors); //! Disable copy constructors JSONStructureNode(const JSONStructureNode &other) = delete; @@ -64,7 +64,7 @@ struct JSONStructureDescription { JSONStructureDescription &operator=(JSONStructureDescription &&) noexcept; JSONStructureNode &GetOrCreateChild(); - JSONStructureNode &GetOrCreateChild(yyjson_val *key, yyjson_val *val); + JSONStructureNode &GetOrCreateChild(yyjson_val *key, yyjson_val *val, const bool ignore_errors); public: //! Type of this description @@ -80,7 +80,7 @@ struct JSONStructureDescription { struct JSONStructure { public: - static void ExtractStructure(yyjson_val *val, JSONStructureNode &node); + static void ExtractStructure(yyjson_val *val, JSONStructureNode &node, const bool ignore_errors); static LogicalType StructureToType(ClientContext &context, const JSONStructureNode &node, const idx_t max_depth, const double field_appearance_threshold, idx_t depth = 0, idx_t sample_count = DConstants::INVALID_INDEX); diff --git a/src/duckdb/extension/json/json_functions.cpp b/src/duckdb/extension/json/json_functions.cpp index db2a6ed4..e8241d6e 100644 --- a/src/duckdb/extension/json/json_functions.cpp +++ b/src/duckdb/extension/json/json_functions.cpp @@ -15,6 +15,9 @@ namespace duckdb { using JSONPathType = JSONCommon::JSONPathType; static JSONPathType CheckPath(const Value &path_val, string &path, size_t &len) { + if (path_val.IsNull()) { + throw InternalException("JSON path cannot be NULL"); + } const auto path_str_val = path_val.DefaultCastAs(LogicalType::VARCHAR); auto path_str = path_str_val.GetValueUnsafe(); len = path_str.GetSize(); @@ -58,9 +61,11 @@ unique_ptr JSONReadFunctionData::Bind(ClientContext &context, Scal size_t len = 0; JSONPathType path_type = JSONPathType::REGULAR; if (arguments[1]->IsFoldable()) { - constant = true; const auto path_val = ExpressionExecutor::EvaluateScalar(context, *arguments[1]); - path_type = CheckPath(path_val, path, len); + if (!path_val.IsNull()) { + constant = true; + path_type = CheckPath(path_val, path, len); + } } bound_function.arguments[1] = LogicalType::VARCHAR; if (path_type == JSONCommon::JSONPathType::WILDCARD) { diff --git a/src/duckdb/extension/json/json_functions/json_serialize_plan.cpp b/src/duckdb/extension/json/json_functions/json_serialize_plan.cpp index bfe34b1f..1fe6c8cf 100644 --- a/src/duckdb/extension/json/json_functions/json_serialize_plan.cpp +++ b/src/duckdb/extension/json/json_functions/json_serialize_plan.cpp @@ -19,16 +19,19 @@ namespace duckdb { struct JsonSerializePlanBindData : public FunctionData { bool skip_if_null = false; bool skip_if_empty = false; + bool skip_if_default = false; bool format = false; bool optimize = false; - JsonSerializePlanBindData(bool skip_if_null_p, bool skip_if_empty_p, bool format_p, bool optimize_p) - : skip_if_null(skip_if_null_p), skip_if_empty(skip_if_empty_p), format(format_p), optimize(optimize_p) { + JsonSerializePlanBindData(bool skip_if_null_p, bool skip_if_empty_p, bool skip_if_default_p, bool format_p, + bool optimize_p) + : skip_if_null(skip_if_null_p), skip_if_empty(skip_if_empty_p), skip_if_default(skip_if_default_p), + format(format_p), optimize(optimize_p) { } public: unique_ptr Copy() const override { - return make_uniq(skip_if_null, skip_if_empty, format, optimize); + return make_uniq(skip_if_null, skip_if_empty, skip_if_default, format, optimize); } bool Equals(const FunctionData &other_p) const override { return true; @@ -48,6 +51,7 @@ static unique_ptr JsonSerializePlanBind(ClientContext &context, Sc // Optional arguments bool skip_if_null = false; bool skip_if_empty = false; + bool skip_if_default = false; bool format = false; bool optimize = false; @@ -69,6 +73,11 @@ static unique_ptr JsonSerializePlanBind(ClientContext &context, Sc throw BinderException("json_serialize_plan: 'skip_empty' argument must be a boolean"); } skip_if_empty = BooleanValue::Get(ExpressionExecutor::EvaluateScalar(context, *arg)); + } else if (arg->alias == "skip_default") { + if (arg->return_type.id() != LogicalTypeId::BOOLEAN) { + throw BinderException("json_serialize_plan: 'skip_default' argument must be a boolean"); + } + skip_if_default = BooleanValue::Get(ExpressionExecutor::EvaluateScalar(context, *arg)); } else if (arg->alias == "format") { if (arg->return_type.id() != LogicalTypeId::BOOLEAN) { throw BinderException("json_serialize_plan: 'format' argument must be a boolean"); @@ -83,7 +92,7 @@ static unique_ptr JsonSerializePlanBind(ClientContext &context, Sc throw BinderException(StringUtil::Format("json_serialize_plan: Unknown argument '%s'", arg->alias.c_str())); } } - return make_uniq(skip_if_null, skip_if_empty, format, optimize); + return make_uniq(skip_if_null, skip_if_empty, skip_if_default, format, optimize); } static bool OperatorSupportsSerialization(LogicalOperator &op, string &operator_name) { @@ -144,7 +153,8 @@ static void JsonSerializePlanFunction(DataChunk &args, ExpressionState &state, V throw InvalidInputException("Operator '%s' does not support serialization", operator_name); } - auto plan_json = JsonSerializer::Serialize(*plan, doc, info.skip_if_null, info.skip_if_empty); + auto plan_json = + JsonSerializer::Serialize(*plan, doc, info.skip_if_null, info.skip_if_empty, info.skip_if_default); yyjson_mut_arr_append(plans_arr, plan_json); } diff --git a/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp b/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp index 3d3adb67..17fd3336 100644 --- a/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +++ b/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp @@ -12,15 +12,17 @@ namespace duckdb { struct JsonSerializeBindData : public FunctionData { bool skip_if_null = false; bool skip_if_empty = false; + bool skip_if_default = false; bool format = false; - JsonSerializeBindData(bool skip_if_null_p, bool skip_if_empty_p, bool format_p) - : skip_if_null(skip_if_null_p), skip_if_empty(skip_if_empty_p), format(format_p) { + JsonSerializeBindData(bool skip_if_null_p, bool skip_if_empty_p, bool skip_if_default_p, bool format_p) + : skip_if_null(skip_if_null_p), skip_if_empty(skip_if_empty_p), skip_if_default(skip_if_default_p), + format(format_p) { } public: unique_ptr Copy() const override { - return make_uniq(skip_if_null, skip_if_empty, format); + return make_uniq(skip_if_null, skip_if_empty, skip_if_default, format); } bool Equals(const FunctionData &other_p) const override { return true; @@ -41,6 +43,7 @@ static unique_ptr JsonSerializeBind(ClientContext &context, Scalar bool skip_if_null = false; bool skip_if_empty = false; + bool skip_if_default = false; bool format = false; for (idx_t i = 1; i < arguments.size(); i++) { @@ -66,11 +69,16 @@ static unique_ptr JsonSerializeBind(ClientContext &context, Scalar throw BinderException("json_serialize_sql: 'format' argument must be a boolean"); } format = BooleanValue::Get(ExpressionExecutor::EvaluateScalar(context, *arg)); + } else if (arg->alias == "skip_default") { + if (arg->return_type.id() != LogicalTypeId::BOOLEAN) { + throw BinderException("json_serialize_sql: 'skip_default' argument must be a boolean"); + } + skip_if_default = BooleanValue::Get(ExpressionExecutor::EvaluateScalar(context, *arg)); } else { - throw BinderException(StringUtil::Format("json_serialize_sql: Unknown argument '%s'", arg->alias.c_str())); + throw BinderException(StringUtil::Format("json_serialize_sql: Unknown argument '%s'", arg->alias)); } } - return make_uniq(skip_if_null, skip_if_empty, format); + return make_uniq(skip_if_null, skip_if_empty, skip_if_default, format); } static void JsonSerializeFunction(DataChunk &args, ExpressionState &state, Vector &result) { @@ -97,7 +105,8 @@ static void JsonSerializeFunction(DataChunk &args, ExpressionState &state, Vecto throw NotImplementedException("Only SELECT statements can be serialized to json!"); } auto &select = statement->Cast(); - auto json = JsonSerializer::Serialize(select, doc, info.skip_if_null, info.skip_if_empty); + auto json = + JsonSerializer::Serialize(select, doc, info.skip_if_null, info.skip_if_empty, info.skip_if_default); yyjson_mut_arr_append(statements_arr, json); } diff --git a/src/duckdb/extension/json/json_functions/json_structure.cpp b/src/duckdb/extension/json/json_functions/json_structure.cpp index ad319c6a..0fd574f8 100644 --- a/src/duckdb/extension/json/json_functions/json_structure.cpp +++ b/src/duckdb/extension/json/json_functions/json_structure.cpp @@ -22,10 +22,10 @@ static inline LogicalTypeId MaxNumericType(LogicalTypeId &a, LogicalTypeId &b) { JSONStructureNode::JSONStructureNode() : initialized(false), count(0) { } -JSONStructureNode::JSONStructureNode(yyjson_val *key_p, yyjson_val *val_p) +JSONStructureNode::JSONStructureNode(yyjson_val *key_p, yyjson_val *val_p, const bool ignore_errors) : key(make_uniq(unsafe_yyjson_get_str(key_p), unsafe_yyjson_get_len(key_p))), initialized(false), count(0) { D_ASSERT(yyjson_is_str(key_p)); - JSONStructure::ExtractStructure(val_p, *this); + JSONStructure::ExtractStructure(val_p, *this, ignore_errors); } JSONStructureNode::JSONStructureNode(JSONStructureNode &&other) noexcept { @@ -351,7 +351,8 @@ JSONStructureNode &JSONStructureDescription::GetOrCreateChild() { return children.back(); } -JSONStructureNode &JSONStructureDescription::GetOrCreateChild(yyjson_val *key, yyjson_val *val) { +JSONStructureNode &JSONStructureDescription::GetOrCreateChild(yyjson_val *key, yyjson_val *val, + const bool ignore_errors) { D_ASSERT(yyjson_is_str(key)); // Check if there is already a child with the same key idx_t child_idx; @@ -359,18 +360,18 @@ JSONStructureNode &JSONStructureDescription::GetOrCreateChild(yyjson_val *key, y auto it = key_map.find(temp_key); if (it == key_map.end()) { // Didn't find, create a new child child_idx = children.size(); - children.emplace_back(key, val); + children.emplace_back(key, val, ignore_errors); const auto &persistent_key_string = children.back().key; JSONKey new_key {persistent_key_string->c_str(), persistent_key_string->length()}; key_map.emplace(new_key, child_idx); } else { // Found it child_idx = it->second; - JSONStructure::ExtractStructure(val, children[child_idx]); + JSONStructure::ExtractStructure(val, children[child_idx], ignore_errors); } return children[child_idx]; } -static inline void ExtractStructureArray(yyjson_val *arr, JSONStructureNode &node) { +static inline void ExtractStructureArray(yyjson_val *arr, JSONStructureNode &node, const bool ignore_errors) { D_ASSERT(yyjson_is_arr(arr)); auto &description = node.GetOrCreateDescription(LogicalTypeId::LIST); auto &child = description.GetOrCreateChild(); @@ -378,50 +379,50 @@ static inline void ExtractStructureArray(yyjson_val *arr, JSONStructureNode &nod size_t idx, max; yyjson_val *val; yyjson_arr_foreach(arr, idx, max, val) { - JSONStructure::ExtractStructure(val, child); + JSONStructure::ExtractStructure(val, child, ignore_errors); } } -static inline void ExtractStructureObject(yyjson_val *obj, JSONStructureNode &node) { +static inline void ExtractStructureObject(yyjson_val *obj, JSONStructureNode &node, const bool ignore_errors) { D_ASSERT(yyjson_is_obj(obj)); auto &description = node.GetOrCreateDescription(LogicalTypeId::STRUCT); // Keep track of keys so we can detect duplicates - json_key_set_t obj_keys; + case_insensitive_set_t obj_keys; size_t idx, max; yyjson_val *key, *val; yyjson_obj_foreach(obj, idx, max, key, val) { auto key_ptr = unsafe_yyjson_get_str(key); auto key_len = unsafe_yyjson_get_len(key); - auto insert_result = obj_keys.insert({key_ptr, key_len}); - if (!insert_result.second) { + auto insert_result = obj_keys.insert(string(key_ptr, key_len)); + if (!ignore_errors && !insert_result.second) { JSONCommon::ThrowValFormatError("Duplicate key \"" + string(key_ptr, key_len) + "\" in object %s", obj); } - description.GetOrCreateChild(key, val); + description.GetOrCreateChild(key, val, ignore_errors); } } -static inline void ExtractStructureVal(yyjson_val *val, JSONStructureNode &node) { +static inline void ExtractStructureVal(yyjson_val *val, JSONStructureNode &node, const bool ignore_errors) { D_ASSERT(!yyjson_is_arr(val) && !yyjson_is_obj(val)); node.GetOrCreateDescription(JSONCommon::ValTypeToLogicalTypeId(val)); } -void JSONStructure::ExtractStructure(yyjson_val *val, JSONStructureNode &node) { +void JSONStructure::ExtractStructure(yyjson_val *val, JSONStructureNode &node, const bool ignore_errors) { node.count++; switch (yyjson_get_tag(val)) { case YYJSON_TYPE_ARR | YYJSON_SUBTYPE_NONE: - return ExtractStructureArray(val, node); + return ExtractStructureArray(val, node, ignore_errors); case YYJSON_TYPE_OBJ | YYJSON_SUBTYPE_NONE: - return ExtractStructureObject(val, node); + return ExtractStructureObject(val, node, ignore_errors); default: - return ExtractStructureVal(val, node); + return ExtractStructureVal(val, node, ignore_errors); } } -JSONStructureNode ExtractStructureInternal(yyjson_val *val) { +JSONStructureNode ExtractStructureInternal(yyjson_val *val, const bool ignore_errors) { JSONStructureNode node; - JSONStructure::ExtractStructure(val, node); + JSONStructure::ExtractStructure(val, node, ignore_errors); return node; } @@ -476,7 +477,7 @@ static inline yyjson_mut_val *ConvertStructure(const JSONStructureNode &node, yy static inline string_t JSONStructureFunction(yyjson_val *val, yyjson_alc *alc, Vector &result) { return JSONCommon::WriteVal( - ConvertStructure(ExtractStructureInternal(val), yyjson_mut_doc_new(alc)), alc); + ConvertStructure(ExtractStructureInternal(val, false), yyjson_mut_doc_new(alc)), alc); } static void StructureFunction(DataChunk &args, ExpressionState &state, Vector &result) { diff --git a/src/duckdb/extension/json/json_functions/read_json.cpp b/src/duckdb/extension/json/json_functions/read_json.cpp index 8b331c8a..3640e0a7 100644 --- a/src/duckdb/extension/json/json_functions/read_json.cpp +++ b/src/duckdb/extension/json/json_functions/read_json.cpp @@ -6,6 +6,35 @@ namespace duckdb { +static inline LogicalType RemoveDuplicateStructKeys(const LogicalType &type, const bool ignore_errors) { + switch (type.id()) { + case LogicalTypeId::STRUCT: { + case_insensitive_set_t child_names; + child_list_t child_types; + for (auto &child_type : StructType::GetChildTypes(type)) { + auto insert_success = child_names.insert(child_type.first).second; + if (!insert_success) { + if (ignore_errors) { + continue; + } + throw NotImplementedException( + "Duplicate name \"%s\" in struct auto-detected in JSON, try ignore_errors=true", child_type.first); + } else { + child_types.emplace_back(child_type.first, RemoveDuplicateStructKeys(child_type.second, ignore_errors)); + } + } + return LogicalType::STRUCT(child_types); + } + case LogicalTypeId::MAP: + return LogicalType::MAP(RemoveDuplicateStructKeys(MapType::KeyType(type), ignore_errors), + RemoveDuplicateStructKeys(MapType::ValueType(type), ignore_errors)); + case LogicalTypeId::LIST: + return LogicalType::LIST(RemoveDuplicateStructKeys(ListType::GetChildType(type), ignore_errors)); + default: + return type; + } +} + void JSONScan::AutoDetect(ClientContext &context, JSONScanData &bind_data, vector &return_types, vector &names) { // Change scan type during detection @@ -40,7 +69,7 @@ void JSONScan::AutoDetect(ClientContext &context, JSONScanData &bind_data, vecto for (idx_t i = 0; i < next; i++) { const auto &val = lstate.values[i]; if (val) { - JSONStructure::ExtractStructure(val, node); + JSONStructure::ExtractStructure(val, node, true); } } if (!node.ContainsVarchar()) { // Can't refine non-VARCHAR types @@ -94,7 +123,7 @@ void JSONScan::AutoDetect(ClientContext &context, JSONScanData &bind_data, vecto return_types.reserve(child_types.size()); names.reserve(child_types.size()); for (auto &child_type : child_types) { - return_types.emplace_back(child_type.second); + return_types.emplace_back(RemoveDuplicateStructKeys(child_type.second, bind_data.ignore_errors)); names.emplace_back(child_type.first); } } else { @@ -103,7 +132,7 @@ void JSONScan::AutoDetect(ClientContext &context, JSONScanData &bind_data, vecto } } else { D_ASSERT(bind_data.options.record_type == JSONRecordType::VALUES); - return_types.emplace_back(type); + return_types.emplace_back(RemoveDuplicateStructKeys(type, bind_data.ignore_errors)); names.emplace_back("json"); } } @@ -216,6 +245,11 @@ unique_ptr ReadJSONBind(ClientContext &context, TableFunctionBindI } } + if (bind_data->options.record_type == JSONRecordType::AUTO_DETECT && return_types.size() > 1) { + // More than one specified column implies records + bind_data->options.record_type = JSONRecordType::RECORDS; + } + // Specifying column names overrides auto-detect if (!return_types.empty()) { bind_data->auto_detect = false; diff --git a/src/duckdb/extension/json/json_scan.cpp b/src/duckdb/extension/json/json_scan.cpp index 618b1946..b6989b6b 100644 --- a/src/duckdb/extension/json/json_scan.cpp +++ b/src/duckdb/extension/json/json_scan.cpp @@ -148,9 +148,6 @@ JSONScanLocalState::JSONScanLocalState(ClientContext &context, JSONScanGlobalSta : scan_count(0), batch_index(DConstants::INVALID_INDEX), total_read_size(0), total_tuple_count(0), bind_data(gstate.bind_data), allocator(BufferAllocator::Get(context)), is_last(false), fs(FileSystem::GetFileSystem(context)), buffer_size(0), buffer_offset(0), prev_buffer_remainder(0) { - - // Buffer to reconstruct JSON values when they cross a buffer boundary - reconstruct_buffer = gstate.allocator.Allocate(gstate.buffer_capacity); } JSONGlobalTableFunctionState::JSONGlobalTableFunctionState(ClientContext &context, TableFunctionInitInput &input) @@ -276,13 +273,13 @@ idx_t JSONScanLocalState::ReadNext(JSONScanGlobalState &gstate) { } if (current_buffer_handle->buffer_index != 0 && current_reader->GetFormat() == JSONFormat::NEWLINE_DELIMITED) { - if (ReconstructFirstObject()) { + if (ReconstructFirstObject(gstate)) { scan_count++; } } } - ParseNextChunk(); + ParseNextChunk(gstate); } return scan_count; @@ -540,16 +537,12 @@ bool JSONScanLocalState::ReadNextBuffer(JSONScanGlobalState &gstate) { } } - // If we cannot re-use a buffer we create a new one - if (!buffer.IsSet()) { - buffer = gstate.allocator.Allocate(gstate.buffer_capacity); - } - - buffer_ptr = char_ptr_cast(buffer.get()); - // Copy last bit of previous buffer if (current_reader && current_reader->GetFormat() != JSONFormat::NEWLINE_DELIMITED && !is_last) { - memcpy(buffer_ptr, reconstruct_buffer.get(), prev_buffer_remainder); + if (!buffer.IsSet()) { + buffer = AllocateBuffer(gstate); + } + memcpy(buffer_ptr, GetReconstructBuffer(gstate), prev_buffer_remainder); } optional_idx buffer_index; @@ -558,7 +551,7 @@ bool JSONScanLocalState::ReadNextBuffer(JSONScanGlobalState &gstate) { if (current_reader) { // Try to read (if we were not the last read in the previous iteration) bool file_done = false; - bool read_success = ReadNextBufferInternal(gstate, buffer_index, file_done); + bool read_success = ReadNextBufferInternal(gstate, buffer, buffer_index, file_done); if (!is_last && read_success) { // We read something if (buffer_index.GetIndex() == 0 && current_reader->GetFormat() == JSONFormat::ARRAY) { @@ -603,7 +596,7 @@ bool JSONScanLocalState::ReadNextBuffer(JSONScanGlobalState &gstate) { // Open the file if it is not yet open if (!current_reader->IsOpen()) { current_reader->OpenJSONFile(); - if (current_reader->GetFileHandle().FileSize() == 0) { + if (current_reader->GetFileHandle().FileSize() == 0 && !current_reader->GetFileHandle().IsPipe()) { current_reader->GetFileHandle().Close(); // Skip over empty files if (gstate.enable_parallel_scans) { @@ -616,7 +609,7 @@ bool JSONScanLocalState::ReadNextBuffer(JSONScanGlobalState &gstate) { // Auto-detect if we haven't yet done this during the bind if (gstate.bind_data.options.record_type == JSONRecordType::AUTO_DETECT || current_reader->GetFormat() == JSONFormat::AUTO_DETECT) { - ReadAndAutoDetect(gstate, buffer_index); + ReadAndAutoDetect(gstate, buffer, buffer_index); } if (gstate.enable_parallel_scans) { @@ -655,10 +648,11 @@ bool JSONScanLocalState::ReadNextBuffer(JSONScanGlobalState &gstate) { return true; } -void JSONScanLocalState::ReadAndAutoDetect(JSONScanGlobalState &gstate, optional_idx &buffer_index) { +void JSONScanLocalState::ReadAndAutoDetect(JSONScanGlobalState &gstate, AllocatedData &buffer, + optional_idx &buffer_index) { // We have to detect the JSON format - hold the gstate lock while we do this bool file_done = false; - if (!ReadNextBufferInternal(gstate, buffer_index, file_done)) { + if (!ReadNextBufferInternal(gstate, buffer, buffer_index, file_done)) { return; } if (buffer_size == 0) { @@ -676,21 +670,21 @@ void JSONScanLocalState::ReadAndAutoDetect(JSONScanGlobalState &gstate, optional SkipOverArrayStart(); } - if (bind_data.options.record_type == JSONRecordType::RECORDS && + if (!bind_data.ignore_errors && bind_data.options.record_type == JSONRecordType::RECORDS && current_reader->GetRecordType() != JSONRecordType::RECORDS) { throw InvalidInputException("Expected file \"%s\" to contain records, detected non-record JSON instead.", current_reader->GetFileName()); } } -bool JSONScanLocalState::ReadNextBufferInternal(JSONScanGlobalState &gstate, optional_idx &buffer_index, - bool &file_done) { +bool JSONScanLocalState::ReadNextBufferInternal(JSONScanGlobalState &gstate, AllocatedData &buffer, + optional_idx &buffer_index, bool &file_done) { if (current_reader->GetFileHandle().CanSeek()) { - if (!ReadNextBufferSeek(gstate, buffer_index, file_done)) { + if (!ReadNextBufferSeek(gstate, buffer, buffer_index, file_done)) { return false; } } else { - if (!ReadNextBufferNoSeek(gstate, buffer_index, file_done)) { + if (!ReadNextBufferNoSeek(gstate, buffer, buffer_index, file_done)) { return false; } } @@ -700,7 +694,8 @@ bool JSONScanLocalState::ReadNextBufferInternal(JSONScanGlobalState &gstate, opt return true; } -bool JSONScanLocalState::ReadNextBufferSeek(JSONScanGlobalState &gstate, optional_idx &buffer_index, bool &file_done) { +bool JSONScanLocalState::ReadNextBufferSeek(JSONScanGlobalState &gstate, AllocatedData &buffer, + optional_idx &buffer_index, bool &file_done) { auto &file_handle = current_reader->GetFileHandle(); idx_t request_size = gstate.buffer_capacity - prev_buffer_remainder - YYJSON_PADDING_SIZE; @@ -709,6 +704,12 @@ bool JSONScanLocalState::ReadNextBufferSeek(JSONScanGlobalState &gstate, optiona { lock_guard reader_guard(current_reader->lock); + if (file_handle.LastReadRequested()) { + return false; + } + if (!buffer.IsSet()) { + buffer = AllocateBuffer(gstate); + } if (!file_handle.GetPositionAndSize(read_position, read_size, request_size)) { return false; // We weren't able to read } @@ -742,16 +743,25 @@ bool JSONScanLocalState::ReadNextBufferSeek(JSONScanGlobalState &gstate, optiona return true; } -bool JSONScanLocalState::ReadNextBufferNoSeek(JSONScanGlobalState &gstate, optional_idx &buffer_index, - bool &file_done) { +bool JSONScanLocalState::ReadNextBufferNoSeek(JSONScanGlobalState &gstate, AllocatedData &buffer, + optional_idx &buffer_index, bool &file_done) { idx_t request_size = gstate.buffer_capacity - prev_buffer_remainder - YYJSON_PADDING_SIZE; idx_t read_size; { lock_guard reader_guard(current_reader->lock); - if (!current_reader->HasFileHandle() || !current_reader->IsOpen() || - !current_reader->GetFileHandle().Read(buffer_ptr + prev_buffer_remainder, read_size, request_size, - file_done, gstate.bind_data.type == JSONScanType::SAMPLE)) { + if (!current_reader->HasFileHandle() || !current_reader->IsOpen()) { + return false; // Couldn't read anything + } + auto &file_handle = current_reader->GetFileHandle(); + if (file_handle.LastReadRequested()) { + return false; + } + if (!buffer.IsSet()) { + buffer = AllocateBuffer(gstate); + } + if (!file_handle.Read(buffer_ptr + prev_buffer_remainder, read_size, request_size, file_done, + gstate.bind_data.type == JSONScanType::SAMPLE)) { return false; // Couldn't read anything } buffer_index = current_reader->GetBufferIndex(); @@ -766,6 +776,19 @@ bool JSONScanLocalState::ReadNextBufferNoSeek(JSONScanGlobalState &gstate, optio return true; } +AllocatedData JSONScanLocalState::AllocateBuffer(JSONScanGlobalState &gstate) { + auto buffer = gstate.allocator.Allocate(gstate.buffer_capacity); + buffer_ptr = char_ptr_cast(buffer.get()); + return buffer; +} + +data_ptr_t JSONScanLocalState::GetReconstructBuffer(JSONScanGlobalState &gstate) { + if (!reconstruct_buffer.IsSet()) { + reconstruct_buffer = gstate.allocator.Allocate(gstate.buffer_capacity); + } + return reconstruct_buffer.get(); +} + void JSONScanLocalState::SkipOverArrayStart() { // First read of this buffer, check if it's actually an array and skip over the bytes SkipWhitespace(buffer_ptr, buffer_offset, buffer_size); @@ -795,7 +818,7 @@ void JSONScanLocalState::SkipOverArrayStart() { } } -bool JSONScanLocalState::ReconstructFirstObject() { +bool JSONScanLocalState::ReconstructFirstObject(JSONScanGlobalState &gstate) { D_ASSERT(current_buffer_handle->buffer_index != 0); D_ASSERT(current_reader->GetFormat() == JSONFormat::NEWLINE_DELIMITED); @@ -811,7 +834,7 @@ bool JSONScanLocalState::ReconstructFirstObject() { auto part1_size = prev_buffer_ptr - part1_ptr; // Now copy the data to our reconstruct buffer - const auto reconstruct_ptr = reconstruct_buffer.get(); + const auto reconstruct_ptr = GetReconstructBuffer(gstate); memcpy(reconstruct_ptr, part1_ptr, part1_size); // We copied the object, so we are no longer reading the previous buffer @@ -851,7 +874,7 @@ bool JSONScanLocalState::ReconstructFirstObject() { return true; } -void JSONScanLocalState::ParseNextChunk() { +void JSONScanLocalState::ParseNextChunk(JSONScanGlobalState &gstate) { auto buffer_offset_before = buffer_offset; const auto format = current_reader->GetFormat(); @@ -862,6 +885,7 @@ void JSONScanLocalState::ParseNextChunk() { if (remaining == 0) { break; } + D_ASSERT(format != JSONFormat::AUTO_DETECT); const char *json_end = format == JSONFormat::NEWLINE_DELIMITED ? NextNewline(json_start, remaining) : NextJSON(json_start, remaining); if (json_end == nullptr) { @@ -872,7 +896,7 @@ void JSONScanLocalState::ParseNextChunk() { if (remaining > bind_data.maximum_object_size) { ThrowObjectSizeError(remaining); } - memcpy(reconstruct_buffer.get(), json_start, remaining); + memcpy(GetReconstructBuffer(gstate), json_start, remaining); prev_buffer_remainder = remaining; } buffer_offset = buffer_size; diff --git a/src/duckdb/extension/parquet/column_reader.cpp b/src/duckdb/extension/parquet/column_reader.cpp index a59ceeb4..b21d85fd 100644 --- a/src/duckdb/extension/parquet/column_reader.cpp +++ b/src/duckdb/extension/parquet/column_reader.cpp @@ -16,6 +16,7 @@ #include "templated_column_reader.hpp" #include "utf8proc_wrapper.hpp" #include "zstd.h" +#include "lz4.hpp" #ifndef DUCKDB_AMALGAMATION #include "duckdb/common/types/bit.hpp" @@ -339,6 +340,13 @@ void ColumnReader::DecompressInternal(CompressionCodec::type codec, const_data_p s.Decompress(const_char_ptr_cast(src), src_size, char_ptr_cast(dst), dst_size); break; } + case CompressionCodec::LZ4_RAW: { + auto res = duckdb_lz4::LZ4_decompress_safe(const_char_ptr_cast(src), char_ptr_cast(dst), src_size, dst_size); + if (res != NumericCast(dst_size)) { + throw std::runtime_error("LZ4 decompression failure"); + } + break; + } case CompressionCodec::SNAPPY: { { size_t uncompressed_size = 0; @@ -346,7 +354,7 @@ void ColumnReader::DecompressInternal(CompressionCodec::type codec, const_data_p if (!res) { throw std::runtime_error("Snappy decompression failure"); } - if (uncompressed_size != (size_t)dst_size) { + if (uncompressed_size != dst_size) { throw std::runtime_error("Snappy decompression failure: Uncompressed data size mismatch"); } } @@ -358,16 +366,17 @@ void ColumnReader::DecompressInternal(CompressionCodec::type codec, const_data_p } case CompressionCodec::ZSTD: { auto res = duckdb_zstd::ZSTD_decompress(dst, dst_size, src, src_size); - if (duckdb_zstd::ZSTD_isError(res) || res != (size_t)dst_size) { + if (duckdb_zstd::ZSTD_isError(res) || res != dst_size) { throw std::runtime_error("ZSTD Decompression failure"); } break; } + default: { std::stringstream codec_name; codec_name << codec; throw std::runtime_error("Unsupported compression codec \"" + codec_name.str() + - "\". Supported options are uncompressed, gzip, snappy or zstd"); + "\". Supported options are uncompressed, gzip, lz4_raw, snappy or zstd"); } } } diff --git a/src/duckdb/extension/parquet/column_writer.cpp b/src/duckdb/extension/parquet/column_writer.cpp index 916d7ab3..89755048 100644 --- a/src/duckdb/extension/parquet/column_writer.cpp +++ b/src/duckdb/extension/parquet/column_writer.cpp @@ -15,12 +15,13 @@ #include "duckdb/common/string_map_set.hpp" #include "duckdb/common/types/date.hpp" #include "duckdb/common/types/hugeint.hpp" -#include "duckdb/common/types/uhugeint.hpp" #include "duckdb/common/types/string_heap.hpp" #include "duckdb/common/types/time.hpp" #include "duckdb/common/types/timestamp.hpp" +#include "duckdb/common/types/uhugeint.hpp" #endif +#include "lz4.hpp" #include "miniz_wrapper.hpp" #include "snappy.h" #include "zstd.h" @@ -191,6 +192,7 @@ void ColumnWriter::CompressPage(MemoryStream &temp_writer, size_t &compressed_si compressed_size = temp_writer.GetPosition(); compressed_data = temp_writer.GetData(); break; + case CompressionCodec::SNAPPY: { compressed_size = duckdb_snappy::MaxCompressedLength(temp_writer.GetPosition()); compressed_buf = unique_ptr(new data_t[compressed_size]); @@ -200,6 +202,15 @@ void ColumnWriter::CompressPage(MemoryStream &temp_writer, size_t &compressed_si D_ASSERT(compressed_size <= duckdb_snappy::MaxCompressedLength(temp_writer.GetPosition())); break; } + case CompressionCodec::LZ4_RAW: { + compressed_size = duckdb_lz4::LZ4_compressBound(temp_writer.GetPosition()); + compressed_buf = unique_ptr(new data_t[compressed_size]); + compressed_size = duckdb_lz4::LZ4_compress_default(const_char_ptr_cast(temp_writer.GetData()), + char_ptr_cast(compressed_buf.get()), + temp_writer.GetPosition(), compressed_size); + compressed_data = compressed_buf.get(); + break; + } case CompressionCodec::GZIP: { MiniZStream s; compressed_size = s.MaxCompressedLength(temp_writer.GetPosition()); @@ -344,15 +355,18 @@ class BasicColumnWriter : public ColumnWriter { ~BasicColumnWriter() override = default; //! We limit the uncompressed page size to 100MB - // The max size in Parquet is 2GB, but we choose a more conservative limit + //! The max size in Parquet is 2GB, but we choose a more conservative limit static constexpr const idx_t MAX_UNCOMPRESSED_PAGE_SIZE = 100000000; //! Dictionary pages must be below 2GB. Unlike data pages, there's only one dictionary page. - // For this reason we go with a much higher, but still a conservative upper bound of 1GB; + //! For this reason we go with a much higher, but still a conservative upper bound of 1GB; static constexpr const idx_t MAX_UNCOMPRESSED_DICT_PAGE_SIZE = 1e9; + //! If the dictionary has this many entries, but the compression ratio is still below 1, + //! we stop creating the dictionary + static constexpr const idx_t DICTIONARY_ANALYZE_THRESHOLD = 1e4; - // the maximum size a key entry in an RLE page takes + //! The maximum size a key entry in an RLE page takes static constexpr const idx_t MAX_DICTIONARY_KEY_SIZE = sizeof(uint32_t); - // the size of encoding the string length + //! The size of encoding the string length static constexpr const idx_t STRING_LENGTH_SIZE = sizeof(uint32_t); public: @@ -1282,6 +1296,12 @@ class StringColumnWriter : public BasicColumnWriter { void Analyze(ColumnWriterState &state_p, ColumnWriterState *parent, Vector &vector, idx_t count) override { auto &state = state_p.Cast(); + if (writer.DictionaryCompressionRatioThreshold() == NumericLimits::Maximum() || + (state.dictionary.size() > DICTIONARY_ANALYZE_THRESHOLD && WontUseDictionary(state))) { + // Early out: compression ratio is less than the specified parameter + // after seeing more entries than the threshold + return; + } idx_t vcount = parent ? parent->definition_levels.size() - state.definition_levels.size() : count; idx_t parent_index = state.definition_levels.size(); @@ -1308,6 +1328,7 @@ class StringColumnWriter : public BasicColumnWriter { new_value_index++; state.estimated_dict_page_size += value.GetSize() + MAX_DICTIONARY_KEY_SIZE; } + // if the value changed, we will encode it in the page if (last_value_index != found.first->second) { // we will add the value index size later, when we know the total number of keys @@ -1329,8 +1350,7 @@ class StringColumnWriter : public BasicColumnWriter { // check if a dictionary will require more space than a plain write, or if the dictionary page is going to // be too large - if (state.estimated_dict_page_size > MAX_UNCOMPRESSED_DICT_PAGE_SIZE || - state.estimated_rle_pages_size + state.estimated_dict_page_size > state.estimated_plain_size) { + if (WontUseDictionary(state)) { // clearing the dictionary signals a plain write state.dictionary.clear(); state.key_bit_width = 0; @@ -1446,6 +1466,23 @@ class StringColumnWriter : public BasicColumnWriter { return strings[index].GetSize(); } } + +private: + bool WontUseDictionary(StringColumnWriterState &state) const { + return state.estimated_dict_page_size > MAX_UNCOMPRESSED_DICT_PAGE_SIZE || + DictionaryCompressionRatio(state) < writer.DictionaryCompressionRatioThreshold(); + } + + static double DictionaryCompressionRatio(StringColumnWriterState &state) { + // If any are 0, we just return a compression ratio of 1 + if (state.estimated_plain_size == 0 || state.estimated_rle_pages_size == 0 || + state.estimated_dict_page_size == 0) { + return 1; + } + // Otherwise, plain size divided by compressed size + return double(state.estimated_plain_size) / + double(state.estimated_rle_pages_size + state.estimated_dict_page_size); + } }; //===--------------------------------------------------------------------===// diff --git a/src/duckdb/extension/parquet/include/parquet_writer.hpp b/src/duckdb/extension/parquet/include/parquet_writer.hpp index 6b71b819..dda602eb 100644 --- a/src/duckdb/extension/parquet/include/parquet_writer.hpp +++ b/src/duckdb/extension/parquet/include/parquet_writer.hpp @@ -64,7 +64,7 @@ class ParquetWriter { ParquetWriter(FileSystem &fs, string file_name, vector types, vector names, duckdb_parquet::format::CompressionCodec::type codec, ChildFieldIDs field_ids, const vector> &kv_metadata, - shared_ptr encryption_config); + shared_ptr encryption_config, double dictionary_compression_ratio_threshold); public: void PrepareRowGroup(ColumnDataCollection &buffer, PreparedRowGroup &result); @@ -91,6 +91,9 @@ class ParquetWriter { lock_guard glock(lock); return writer->total_written; } + double DictionaryCompressionRatioThreshold() const { + return dictionary_compression_ratio_threshold; + } static CopyTypeSupport TypeIsSupported(const LogicalType &type); @@ -106,6 +109,7 @@ class ParquetWriter { duckdb_parquet::format::CompressionCodec::type codec; ChildFieldIDs field_ids; shared_ptr encryption_config; + double dictionary_compression_ratio_threshold; unique_ptr writer; shared_ptr protocol; diff --git a/src/duckdb/extension/parquet/parquet_extension.cpp b/src/duckdb/extension/parquet/parquet_extension.cpp index 94afcb94..0882f6da 100644 --- a/src/duckdb/extension/parquet/parquet_extension.cpp +++ b/src/duckdb/extension/parquet/parquet_extension.cpp @@ -130,6 +130,9 @@ struct ParquetWriteBindData : public TableFunctionData { //! How/Whether to encrypt the data shared_ptr encryption_config; + //! Dictionary compression is applied only if the compression ratio exceeds this threshold + double dictionary_compression_ratio_threshold = 1.0; + ChildFieldIDs field_ids; }; @@ -947,6 +950,10 @@ unique_ptr ParquetWriteBind(ClientContext &context, CopyFunctionBi bind_data->codec = duckdb_parquet::format::CompressionCodec::GZIP; } else if (roption == "zstd") { bind_data->codec = duckdb_parquet::format::CompressionCodec::ZSTD; + } else if (roption == "lz4" || roption == "lz4_raw") { + /* LZ4 is technically another compression scheme, but deprecated and arrow also uses them + * interchangeably */ + bind_data->codec = duckdb_parquet::format::CompressionCodec::LZ4_RAW; } else { throw BinderException("Expected %s argument to be either [uncompressed, snappy, gzip or zstd]", loption); @@ -988,6 +995,15 @@ unique_ptr ParquetWriteBind(ClientContext &context, CopyFunctionBi } } else if (loption == "encryption_config") { bind_data->encryption_config = ParquetEncryptionConfig::Create(context, option.second[0]); + } else if (loption == "dictionary_compression_ratio_threshold") { + auto val = option.second[0].GetValue(); + if (val == -1) { + val = NumericLimits::Maximum(); + } else if (val < 0) { + throw BinderException("dictionary_compression_ratio_threshold must be greater than 0, or -1 to disable " + "dictionary compression"); + } + bind_data->dictionary_compression_ratio_threshold = val; } else { throw NotImplementedException("Unrecognized option for PARQUET: %s", option.first.c_str()); } @@ -1013,9 +1029,10 @@ unique_ptr ParquetWriteInitializeGlobal(ClientContext &conte auto &parquet_bind = bind_data.Cast(); auto &fs = FileSystem::GetFileSystem(context); - global_state->writer = make_uniq(fs, file_path, parquet_bind.sql_types, parquet_bind.column_names, - parquet_bind.codec, parquet_bind.field_ids.Copy(), - parquet_bind.kv_metadata, parquet_bind.encryption_config); + global_state->writer = + make_uniq(fs, file_path, parquet_bind.sql_types, parquet_bind.column_names, parquet_bind.codec, + parquet_bind.field_ids.Copy(), parquet_bind.kv_metadata, + parquet_bind.encryption_config, parquet_bind.dictionary_compression_ratio_threshold); return std::move(global_state); } @@ -1081,6 +1098,9 @@ const char *EnumUtil::ToChars( case CompressionCodec::LZ4: return "LZ4"; break; + case CompressionCodec::LZ4_RAW: + return "LZ4_RAW"; + break; case CompressionCodec::ZSTD: return "ZSTD"; break; @@ -1110,6 +1130,9 @@ EnumUtil::FromString(const char if (StringUtil::Equals(value, "LZ4")) { return CompressionCodec::LZ4; } + if (StringUtil::Equals(value, "LZ4_RAW")) { + return CompressionCodec::LZ4_RAW; + } if (StringUtil::Equals(value, "ZSTD")) { return CompressionCodec::ZSTD; } @@ -1128,6 +1151,8 @@ static void ParquetCopySerialize(Serializer &serializer, const FunctionData &bin serializer.WriteProperty(106, "field_ids", bind_data.field_ids); serializer.WritePropertyWithDefault>(107, "encryption_config", bind_data.encryption_config, nullptr); + serializer.WriteProperty(108, "dictionary_compression_ratio_threshold", + bind_data.dictionary_compression_ratio_threshold); } static unique_ptr ParquetCopyDeserialize(Deserializer &deserializer, CopyFunction &function) { @@ -1141,6 +1166,8 @@ static unique_ptr ParquetCopyDeserialize(Deserializer &deserialize data->field_ids = deserializer.ReadProperty(106, "field_ids"); deserializer.ReadPropertyWithDefault>(107, "encryption_config", data->encryption_config, nullptr); + deserializer.ReadPropertyWithDefault(108, "dictionary_compression_ratio_threshold", + data->dictionary_compression_ratio_threshold, 1.0); return std::move(data); } // LCOV_EXCL_STOP diff --git a/src/duckdb/extension/parquet/parquet_metadata.cpp b/src/duckdb/extension/parquet/parquet_metadata.cpp index 618d57e5..811b31aa 100644 --- a/src/duckdb/extension/parquet/parquet_metadata.cpp +++ b/src/duckdb/extension/parquet/parquet_metadata.cpp @@ -24,7 +24,7 @@ struct ParquetMetaDataBindData : public TableFunctionData { } }; -enum class ParquetMetadataOperatorType { META_DATA, SCHEMA, KEY_VALUE_META_DATA, FILE_META_DATA }; +enum class ParquetMetadataOperatorType : uint8_t { META_DATA, SCHEMA, KEY_VALUE_META_DATA, FILE_META_DATA }; struct ParquetMetaDataOperatorData : public GlobalTableFunctionState { explicit ParquetMetaDataOperatorData(ClientContext &context, const vector &types) diff --git a/src/duckdb/extension/parquet/parquet_writer.cpp b/src/duckdb/extension/parquet/parquet_writer.cpp index 7c299fa7..815d7676 100644 --- a/src/duckdb/extension/parquet/parquet_writer.cpp +++ b/src/duckdb/extension/parquet/parquet_writer.cpp @@ -350,9 +350,11 @@ void VerifyUniqueNames(const vector &names) { ParquetWriter::ParquetWriter(FileSystem &fs, string file_name_p, vector types_p, vector names_p, CompressionCodec::type codec, ChildFieldIDs field_ids_p, const vector> &kv_metadata, - shared_ptr encryption_config_p) + shared_ptr encryption_config_p, + double dictionary_compression_ratio_threshold_p) : file_name(std::move(file_name_p)), sql_types(std::move(types_p)), column_names(std::move(names_p)), codec(codec), - field_ids(std::move(field_ids_p)), encryption_config(std::move(encryption_config_p)) { + field_ids(std::move(field_ids_p)), encryption_config(std::move(encryption_config_p)), + dictionary_compression_ratio_threshold(dictionary_compression_ratio_threshold_p) { // initialize the file writer writer = make_uniq(fs, file_name.c_str(), FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE_NEW); diff --git a/src/duckdb/extension/parquet/zstd_file_system.cpp b/src/duckdb/extension/parquet/zstd_file_system.cpp index 08a477cf..42b602d5 100644 --- a/src/duckdb/extension/parquet/zstd_file_system.cpp +++ b/src/duckdb/extension/parquet/zstd_file_system.cpp @@ -27,7 +27,7 @@ ZstdStreamWrapper::~ZstdStreamWrapper() { } try { Close(); - } catch (...) { + } catch (...) { // NOLINT: swallow exceptions in destructor } } diff --git a/src/duckdb/src/catalog/catalog.cpp b/src/duckdb/src/catalog/catalog.cpp index 91d5ef12..775af179 100644 --- a/src/duckdb/src/catalog/catalog.cpp +++ b/src/duckdb/src/catalog/catalog.cpp @@ -55,7 +55,11 @@ AttachedDatabase &Catalog::GetAttached() { return db; } -const string &Catalog::GetName() { +const AttachedDatabase &Catalog::GetAttached() const { + return db; +} + +const string &Catalog::GetName() const { return GetAttached().GetName(); } diff --git a/src/duckdb/src/catalog/catalog_entry.cpp b/src/duckdb/src/catalog/catalog_entry.cpp index 9cc3d771..a7ca7265 100644 --- a/src/duckdb/src/catalog/catalog_entry.cpp +++ b/src/duckdb/src/catalog/catalog_entry.cpp @@ -74,9 +74,17 @@ Catalog &CatalogEntry::ParentCatalog() { throw InternalException("CatalogEntry::ParentCatalog called on catalog entry without catalog"); } +const Catalog &CatalogEntry::ParentCatalog() const { + throw InternalException("CatalogEntry::ParentCatalog called on catalog entry without catalog"); +} + SchemaCatalogEntry &CatalogEntry::ParentSchema() { throw InternalException("CatalogEntry::ParentSchema called on catalog entry without schema"); } + +const SchemaCatalogEntry &CatalogEntry::ParentSchema() const { + throw InternalException("CatalogEntry::ParentSchema called on catalog entry without schema"); +} // LCOV_EXCL_STOP void CatalogEntry::Serialize(Serializer &serializer) const { diff --git a/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp b/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp index 4a2751ea..cbd78d37 100644 --- a/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +++ b/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp @@ -36,8 +36,8 @@ namespace duckdb { -void FindForeignKeyInformation(CatalogEntry &entry, AlterForeignKeyType alter_fk_type, - vector> &fk_arrays) { +static void FindForeignKeyInformation(CatalogEntry &entry, AlterForeignKeyType alter_fk_type, + vector> &fk_arrays) { if (entry.type != CatalogType::TABLE_ENTRY) { return; } @@ -63,6 +63,19 @@ void FindForeignKeyInformation(CatalogEntry &entry, AlterForeignKeyType alter_fk } } +static void LazyLoadIndexes(ClientContext &context, CatalogEntry &entry) { + if (entry.type == CatalogType::TABLE_ENTRY) { + auto &table_entry = entry.Cast(); + table_entry.GetStorage().info->InitializeIndexes(context); + } else if (entry.type == CatalogType::INDEX_ENTRY) { + auto &index_entry = entry.Cast(); + auto &table_entry = Catalog::GetEntry(context, CatalogType::TABLE_ENTRY, index_entry.catalog.GetName(), + index_entry.GetSchemaName(), index_entry.GetTableName()) + .Cast(); + table_entry.GetStorage().info->InitializeIndexes(context); + } +} + DuckSchemaEntry::DuckSchemaEntry(Catalog &catalog, CreateSchemaInfo &info) : SchemaCatalogEntry(catalog, info), tables(catalog, make_uniq(catalog, *this)), indexes(catalog), table_functions(catalog), copy_functions(catalog), pragma_functions(catalog), @@ -82,7 +95,7 @@ unique_ptr DuckSchemaEntry::Copy(ClientContext &context) const { optional_ptr DuckSchemaEntry::AddEntryInternal(CatalogTransaction transaction, unique_ptr entry, OnCreateConflict on_conflict, - DependencyList dependencies) { + LogicalDependencyList dependencies) { auto entry_name = entry->name; auto entry_type = entry->type; auto result = entry.get(); @@ -184,7 +197,7 @@ optional_ptr DuckSchemaEntry::CreateFunction(CatalogTransaction tr optional_ptr DuckSchemaEntry::AddEntry(CatalogTransaction transaction, unique_ptr entry, OnCreateConflict on_conflict) { - DependencyList dependencies; + LogicalDependencyList dependencies; return AddEntryInternal(transaction, std::move(entry), on_conflict, dependencies); } @@ -205,7 +218,7 @@ optional_ptr DuckSchemaEntry::CreateView(CatalogTransaction transa optional_ptr DuckSchemaEntry::CreateIndex(ClientContext &context, CreateIndexInfo &info, TableCatalogEntry &table) { - DependencyList dependencies; + LogicalDependencyList dependencies; dependencies.AddDependency(table); // currently, we can not alter PK/FK/UNIQUE constraints @@ -287,6 +300,9 @@ void DuckSchemaEntry::DropEntry(ClientContext &context, DropInfo &info) { CatalogTypeToString(existing_entry->type), CatalogTypeToString(info.type)); } + // if this is a index or table with indexes, initialize any unknown index instances + LazyLoadIndexes(context, *existing_entry); + // if there is a foreign key constraint, get that information vector> fk_arrays; FindForeignKeyInformation(*existing_entry, AlterForeignKeyType::AFT_DELETE, fk_arrays); diff --git a/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp b/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp index 7c93ece4..eb7be8d7 100644 --- a/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +++ b/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp @@ -279,9 +279,9 @@ unique_ptr DuckTableEntry::RenameColumn(ClientContext &context, Re case ConstraintType::UNIQUE: { // UNIQUE constraint: possibly need to rename columns auto &unique = copy->Cast(); - for (idx_t i = 0; i < unique.columns.size(); i++) { - if (unique.columns[i] == info.old_name) { - unique.columns[i] = info.new_name; + for (auto &column_name : unique.GetColumnNamesMutable()) { + if (column_name == info.old_name) { + column_name = info.new_name; } } break; @@ -399,13 +399,13 @@ void DuckTableEntry::UpdateConstraintsOnColumnDrop(const LogicalIndex &removed_i case ConstraintType::UNIQUE: { auto copy = constraint->Copy(); auto &unique = copy->Cast(); - if (unique.index.index != DConstants::INVALID_INDEX) { - if (unique.index == removed_index) { + if (unique.HasIndex()) { + if (unique.GetIndex() == removed_index) { throw CatalogException( "Cannot drop column \"%s\" because there is a UNIQUE constraint that depends on it", info.removed_column); } - unique.index = adjusted_indices[unique.index.index]; + unique.SetIndex(adjusted_indices[unique.GetIndex().index]); } create_info.constraints.push_back(std::move(copy)); break; @@ -763,7 +763,7 @@ void DuckTableEntry::SetAsRoot() { void DuckTableEntry::CommitAlter(string &column_name) { D_ASSERT(!column_name.empty()); - idx_t removed_index = DConstants::INVALID_INDEX; + optional_idx removed_index; for (auto &col : columns.Logical()) { if (col.Name() == column_name) { // No need to alter storage, removed column is generated column @@ -774,8 +774,7 @@ void DuckTableEntry::CommitAlter(string &column_name) { break; } } - D_ASSERT(removed_index != DConstants::INVALID_INDEX); - storage->CommitDropColumn(columns.LogicalToPhysical(LogicalIndex(removed_index)).index); + storage->CommitDropColumn(columns.LogicalToPhysical(LogicalIndex(removed_index.GetIndex())).index); } void DuckTableEntry::CommitDrop() { diff --git a/src/duckdb/src/catalog/catalog_entry/index_catalog_entry.cpp b/src/duckdb/src/catalog/catalog_entry/index_catalog_entry.cpp index b6da579b..90909222 100644 --- a/src/duckdb/src/catalog/catalog_entry/index_catalog_entry.cpp +++ b/src/duckdb/src/catalog/catalog_entry/index_catalog_entry.cpp @@ -35,13 +35,9 @@ unique_ptr IndexCatalogEntry::GetInfo() const { } string IndexCatalogEntry::ToSQL() const { - if (sql.empty()) { - return sql; - } - if (sql.back() != ';') { - return sql + ";"; - } - return sql; + auto info = GetInfo(); + auto result = info->ToString(); + return result + ";\n"; } bool IndexCatalogEntry::IsUnique() { diff --git a/src/duckdb/src/catalog/catalog_entry/sequence_catalog_entry.cpp b/src/duckdb/src/catalog/catalog_entry/sequence_catalog_entry.cpp index 936fae03..5606ddc8 100644 --- a/src/duckdb/src/catalog/catalog_entry/sequence_catalog_entry.cpp +++ b/src/duckdb/src/catalog/catalog_entry/sequence_catalog_entry.cpp @@ -14,7 +14,7 @@ namespace duckdb { SequenceData::SequenceData(CreateSequenceInfo &info) - : usage_count(info.usage_count), counter(info.start_value), increment(info.increment), + : usage_count(info.usage_count), counter(info.start_value), last_value(info.start_value), increment(info.increment), start_value(info.start_value), min_value(info.min_value), max_value(info.max_value), cycle(info.cycle) { } diff --git a/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp b/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp index c4332497..f89d214f 100644 --- a/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +++ b/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp @@ -85,19 +85,18 @@ string TableCatalogEntry::ColumnsToSQL(const ColumnList &columns, const vectortype == ConstraintType::UNIQUE) { auto &pk = constraint->Cast(); - vector constraint_columns = pk.columns; - if (pk.index.index != DConstants::INVALID_INDEX) { + if (pk.HasIndex()) { // no columns specified: single column constraint - if (pk.is_primary_key) { - pk_columns.insert(pk.index); + if (pk.IsPrimaryKey()) { + pk_columns.insert(pk.GetIndex()); } else { - unique_columns.insert(pk.index); + unique_columns.insert(pk.GetIndex()); } } else { // multi-column constraint, this constraint needs to go at the end after all columns - if (pk.is_primary_key) { + if (pk.IsPrimaryKey()) { // multi key pk column: insert set of columns into multi_key_pks - for (auto &col : pk.columns) { + for (auto &col : pk.GetColumnNames()) { multi_key_pks.insert(col); } } diff --git a/src/duckdb/src/catalog/catalog_search_path.cpp b/src/duckdb/src/catalog/catalog_search_path.cpp index 6be5f491..9368e300 100644 --- a/src/duckdb/src/catalog/catalog_search_path.cpp +++ b/src/duckdb/src/catalog/catalog_search_path.cpp @@ -67,6 +67,11 @@ CatalogSearchEntry CatalogSearchEntry::ParseInternal(const string &input, idx_t if (input[idx] == '"') { //! unquote idx++; + if (idx < input.size() && input[idx] == '"') { + // escaped quote + entry += input[idx]; + continue; + } goto normal; } entry += input[idx]; diff --git a/src/duckdb/src/catalog/catalog_set.cpp b/src/duckdb/src/catalog/catalog_set.cpp index 672ed0b3..d167fd90 100644 --- a/src/duckdb/src/catalog/catalog_set.cpp +++ b/src/duckdb/src/catalog/catalog_set.cpp @@ -192,7 +192,7 @@ bool CatalogSet::CreateEntryInternal(CatalogTransaction transaction, const strin } bool CatalogSet::CreateEntry(CatalogTransaction transaction, const string &name, unique_ptr value, - const DependencyList &dependencies) { + const LogicalDependencyList &dependencies) { CheckCatalogEntryInvariants(*value, name); // Set the timestamp to the timestamp of the current transaction @@ -210,7 +210,7 @@ bool CatalogSet::CreateEntry(CatalogTransaction transaction, const string &name, } bool CatalogSet::CreateEntry(ClientContext &context, const string &name, unique_ptr value, - const DependencyList &dependencies) { + const LogicalDependencyList &dependencies) { return CreateEntry(catalog.GetCatalogTransaction(context), name, std::move(value), dependencies); } diff --git a/src/duckdb/src/catalog/default/default_functions.cpp b/src/duckdb/src/catalog/default/default_functions.cpp index 63c049b2..ee8ba09b 100644 --- a/src/duckdb/src/catalog/default/default_functions.cpp +++ b/src/duckdb/src/catalog/default/default_functions.cpp @@ -9,7 +9,7 @@ namespace duckdb { -static DefaultMacro internal_macros[] = { +static const DefaultMacro internal_macros[] = { {DEFAULT_SCHEMA, "current_role", {nullptr}, "'duckdb'"}, // user name of current execution context {DEFAULT_SCHEMA, "current_user", {nullptr}, "'duckdb'"}, // user name of current execution context {DEFAULT_SCHEMA, "current_catalog", {nullptr}, "current_database()"}, // name of current database (called "catalog" in the SQL standard) @@ -60,8 +60,8 @@ static DefaultMacro internal_macros[] = { {"pg_catalog", "pg_get_viewdef", {"oid", nullptr}, "(select sql from duckdb_views() v where v.view_oid=oid)"}, {"pg_catalog", "pg_get_constraintdef", {"constraint_oid", "pretty_bool", nullptr}, "(select constraint_text from duckdb_constraints() d_constraint where d_constraint.table_oid=constraint_oid//1000000 and d_constraint.constraint_index=constraint_oid%1000000)"}, {"pg_catalog", "pg_get_expr", {"pg_node_tree", "relation_oid", nullptr}, "pg_node_tree"}, - {"pg_catalog", "format_pg_type", {"type_name", nullptr}, "case when logical_type='FLOAT' then 'real' when logical_type='DOUBLE' then 'double precision' when logical_type='DECIMAL' then 'numeric' when logical_type='ENUM' then lower(type_name) when logical_type='VARCHAR' then 'character varying' when logical_type='BLOB' then 'bytea' when logical_type='TIMESTAMP' then 'timestamp without time zone' when logical_type='TIME' then 'time without time zone' else lower(logical_type) end"}, - {"pg_catalog", "format_type", {"type_oid", "typemod", nullptr}, "(select format_pg_type(type_name) from duckdb_types() t where t.type_oid=type_oid) || case when typemod>0 then concat('(', typemod//1000, ',', typemod%1000, ')') else '' end"}, + {"pg_catalog", "format_pg_type", {"logical_type", "type_name", nullptr}, "case when logical_type='FLOAT' then 'real' when logical_type='DOUBLE' then 'double precision' when logical_type='DECIMAL' then 'numeric' when logical_type='ENUM' then lower(type_name) when logical_type='VARCHAR' then 'character varying' when logical_type='BLOB' then 'bytea' when logical_type='TIMESTAMP' then 'timestamp without time zone' when logical_type='TIME' then 'time without time zone' else lower(logical_type) end"}, + {"pg_catalog", "format_type", {"type_oid", "typemod", nullptr}, "(select format_pg_type(logical_type, type_name) from duckdb_types() t where t.type_oid=type_oid) || case when typemod>0 then concat('(', typemod//1000, ',', typemod%1000, ')') else '' end"}, {"pg_catalog", "pg_has_role", {"user", "role", "privilege", nullptr}, "true"}, //boolean //does user have privilege for role {"pg_catalog", "pg_has_role", {"role", "privilege", nullptr}, "true"}, //boolean //does current user have privilege for role @@ -171,7 +171,7 @@ static DefaultMacro internal_macros[] = { {nullptr, nullptr, {nullptr}, nullptr} }; -unique_ptr DefaultFunctionGenerator::CreateInternalTableMacroInfo(DefaultMacro &default_macro, unique_ptr function) { +unique_ptr DefaultFunctionGenerator::CreateInternalTableMacroInfo(const DefaultMacro &default_macro, unique_ptr function) { for (idx_t param_idx = 0; default_macro.parameters[param_idx] != nullptr; param_idx++) { function->parameters.push_back( make_uniq(default_macro.parameters[param_idx])); @@ -188,7 +188,7 @@ unique_ptr DefaultFunctionGenerator::CreateInternalTableMacroIn } -unique_ptr DefaultFunctionGenerator::CreateInternalMacroInfo(DefaultMacro &default_macro) { +unique_ptr DefaultFunctionGenerator::CreateInternalMacroInfo(const DefaultMacro &default_macro) { // parse the expression auto expressions = Parser::ParseExpressionList(default_macro.macro); D_ASSERT(expressions.size() == 1); @@ -197,7 +197,7 @@ unique_ptr DefaultFunctionGenerator::CreateInternalMacroInfo(De return CreateInternalTableMacroInfo(default_macro, std::move(result)); } -unique_ptr DefaultFunctionGenerator::CreateInternalTableMacroInfo(DefaultMacro &default_macro) { +unique_ptr DefaultFunctionGenerator::CreateInternalTableMacroInfo(const DefaultMacro &default_macro) { Parser parser; parser.ParseQuery(default_macro.macro); D_ASSERT(parser.statements.size() == 1); diff --git a/src/duckdb/src/catalog/default/default_schemas.cpp b/src/duckdb/src/catalog/default/default_schemas.cpp index bda6f6ab..72a95da7 100644 --- a/src/duckdb/src/catalog/default/default_schemas.cpp +++ b/src/duckdb/src/catalog/default/default_schemas.cpp @@ -9,7 +9,7 @@ struct DefaultSchema { const char *name; }; -static DefaultSchema internal_schemas[] = {{"information_schema"}, {"pg_catalog"}, {nullptr}}; +static const DefaultSchema internal_schemas[] = {{"information_schema"}, {"pg_catalog"}, {nullptr}}; static bool GetDefaultSchema(const string &input_schema) { auto schema = StringUtil::Lower(input_schema); diff --git a/src/duckdb/src/catalog/default/default_views.cpp b/src/duckdb/src/catalog/default/default_views.cpp index 57c913c0..967d1d57 100644 --- a/src/duckdb/src/catalog/default/default_views.cpp +++ b/src/duckdb/src/catalog/default/default_views.cpp @@ -12,7 +12,7 @@ struct DefaultView { const char *sql; }; -static DefaultView internal_views[] = { +static const DefaultView internal_views[] = { {DEFAULT_SCHEMA, "pragma_database_list", "SELECT database_oid AS seq, database_name AS name, path AS file FROM duckdb_databases() WHERE NOT internal ORDER BY 1"}, {DEFAULT_SCHEMA, "sqlite_master", "select 'table' \"type\", table_name \"name\", table_name \"tbl_name\", 0 rootpage, sql from duckdb_tables union all select 'view' \"type\", view_name \"name\", view_name \"tbl_name\", 0 rootpage, sql from duckdb_views union all select 'index' \"type\", index_name \"name\", table_name \"tbl_name\", 0 rootpage, sql from duckdb_indexes;"}, {DEFAULT_SCHEMA, "sqlite_schema", "SELECT * FROM sqlite_master"}, @@ -44,13 +44,13 @@ static DefaultView internal_views[] = { {"pg_catalog", "pg_settings", "SELECT name, value setting, description short_desc, CASE WHEN input_type = 'VARCHAR' THEN 'string' WHEN input_type = 'BOOLEAN' THEN 'bool' WHEN input_type IN ('BIGINT', 'UBIGINT') THEN 'integer' ELSE input_type END vartype FROM duckdb_settings()"}, {"pg_catalog", "pg_tables", "SELECT schema_name schemaname, table_name tablename, 'duckdb' tableowner, NULL \"tablespace\", index_count > 0 hasindexes, false hasrules, false hastriggers FROM duckdb_tables()"}, {"pg_catalog", "pg_tablespace", "SELECT 0 oid, 'pg_default' spcname, 0 spcowner, NULL spcacl, NULL spcoptions"}, - {"pg_catalog", "pg_type", "SELECT type_oid oid, format_pg_type(type_name) typname, schema_oid typnamespace, 0 typowner, type_size typlen, false typbyval, CASE WHEN logical_type='ENUM' THEN 'e' else 'b' end typtype, CASE WHEN type_category='NUMERIC' THEN 'N' WHEN type_category='STRING' THEN 'S' WHEN type_category='DATETIME' THEN 'D' WHEN type_category='BOOLEAN' THEN 'B' WHEN type_category='COMPOSITE' THEN 'C' WHEN type_category='USER' THEN 'U' ELSE 'X' END typcategory, false typispreferred, true typisdefined, NULL typdelim, NULL typrelid, NULL typsubscript, NULL typelem, NULL typarray, NULL typinput, NULL typoutput, NULL typreceive, NULL typsend, NULL typmodin, NULL typmodout, NULL typanalyze, 'd' typalign, 'p' typstorage, NULL typnotnull, NULL typbasetype, NULL typtypmod, NULL typndims, NULL typcollation, NULL typdefaultbin, NULL typdefault, NULL typacl FROM duckdb_types() WHERE type_size IS NOT NULL;"}, + {"pg_catalog", "pg_type", "SELECT type_oid oid, format_pg_type(logical_type, type_name) typname, schema_oid typnamespace, 0 typowner, type_size typlen, false typbyval, CASE WHEN logical_type='ENUM' THEN 'e' else 'b' end typtype, CASE WHEN type_category='NUMERIC' THEN 'N' WHEN type_category='STRING' THEN 'S' WHEN type_category='DATETIME' THEN 'D' WHEN type_category='BOOLEAN' THEN 'B' WHEN type_category='COMPOSITE' THEN 'C' WHEN type_category='USER' THEN 'U' ELSE 'X' END typcategory, false typispreferred, true typisdefined, NULL typdelim, NULL typrelid, NULL typsubscript, NULL typelem, NULL typarray, NULL typinput, NULL typoutput, NULL typreceive, NULL typsend, NULL typmodin, NULL typmodout, NULL typanalyze, 'd' typalign, 'p' typstorage, NULL typnotnull, NULL typbasetype, NULL typtypmod, NULL typndims, NULL typcollation, NULL typdefaultbin, NULL typdefault, NULL typacl FROM duckdb_types() WHERE type_size IS NOT NULL;"}, {"pg_catalog", "pg_views", "SELECT schema_name schemaname, view_name viewname, 'duckdb' viewowner, sql definition FROM duckdb_views()"}, - {"information_schema", "columns", "SELECT database_name table_catalog, schema_name table_schema, table_name, column_name, column_index ordinal_position, column_default, CASE WHEN is_nullable THEN 'YES' ELSE 'NO' END is_nullable, data_type, character_maximum_length, NULL character_octet_length, numeric_precision, numeric_precision_radix, numeric_scale, NULL datetime_precision, NULL interval_type, NULL interval_precision, NULL character_set_catalog, NULL character_set_schema, NULL character_set_name, NULL collation_catalog, NULL collation_schema, NULL collation_name, NULL domain_catalog, NULL domain_schema, NULL domain_name, NULL udt_catalog, NULL udt_schema, NULL udt_name, NULL scope_catalog, NULL scope_schema, NULL scope_name, NULL maximum_cardinality, NULL dtd_identifier, NULL is_self_referencing, NULL is_identity, NULL identity_generation, NULL identity_start, NULL identity_increment, NULL identity_maximum, NULL identity_minimum, NULL identity_cycle, NULL is_generated, NULL generation_expression, NULL is_updatable, comment AS COLUMN_COMMENT FROM duckdb_columns;"}, - {"information_schema", "schemata", "SELECT database_name catalog_name, schema_name, 'duckdb' schema_owner, NULL default_character_set_catalog, NULL default_character_set_schema, NULL default_character_set_name, sql sql_path FROM duckdb_schemas()"}, - {"information_schema", "tables", "SELECT database_name table_catalog, schema_name table_schema, table_name, CASE WHEN temporary THEN 'LOCAL TEMPORARY' ELSE 'BASE TABLE' END table_type, NULL self_referencing_column_name, NULL reference_generation, NULL user_defined_type_catalog, NULL user_defined_type_schema, NULL user_defined_type_name, 'YES' is_insertable_into, 'NO' is_typed, CASE WHEN temporary THEN 'PRESERVE' ELSE NULL END commit_action, comment AS TABLE_COMMENT FROM duckdb_tables() UNION ALL SELECT database_name table_catalog, schema_name table_schema, view_name table_name, 'VIEW' table_type, NULL self_referencing_column_name, NULL reference_generation, NULL user_defined_type_catalog, NULL user_defined_type_schema, NULL user_defined_type_name, 'NO' is_insertable_into, 'NO' is_typed, NULL commit_action, comment AS TABLE_COMMENT FROM duckdb_views;"}, - {"information_schema", "character_sets", "SELECT NULL character_set_catalog, NULL character_set_schema, 'UTF8' character_set_name, 'UCS' character_repertoire, 'UTF8' form_of_use, current_database() default_collate_catalog, 'pg_catalog' default_collate_schema, 'ucs_basic' default_collate_name;"}, - {"information_schema", "referential_constraints", "SELECT f.database_name constraint_catalog, f.schema_name constraint_schema, concat(f.source, '_', f.target, '_', f.target_column, '_fkey') constraint_name, current_database() unique_constraint_catalog, c.schema_name unique_constraint_schema, concat(c.table_name, '_', f.target_column, '_', CASE WHEN c.constraint_type == 'UNIQUE' THEN 'key' ELSE 'pkey' END) unique_constraint_name, 'NONE' match_option, 'NO ACTION' update_rule, 'NO ACTION' delete_rule FROM duckdb_constraints() c JOIN (SELECT *, name_extract['source'] as source, name_extract['target'] as target, name_extract['target_column'] as target_column FROM (SELECT *, regexp_extract(constraint_text, 'FOREIGN KEY \\(([a-zA-Z_0-9]+)\\) REFERENCES ([a-zA-Z_0-9]+)\\(([a-zA-Z_0-9]+)\\)', ['source', 'target', 'target_column']) name_extract FROM duckdb_constraints() WHERE constraint_type = 'FOREIGN KEY')) f ON name_extract['target'] = c.table_name AND (c.constraint_type = 'UNIQUE' OR c.constraint_type = 'PRIMARY KEY')"}, + {"information_schema", "columns", "SELECT database_name table_catalog, schema_name table_schema, table_name, column_name, column_index ordinal_position, column_default, CASE WHEN is_nullable THEN 'YES' ELSE 'NO' END is_nullable, data_type, character_maximum_length, NULL::INT character_octet_length, numeric_precision, numeric_precision_radix, numeric_scale, NULL::INT datetime_precision, NULL::VARCHAR interval_type, NULL::INT interval_precision, NULL::VARCHAR character_set_catalog, NULL::VARCHAR character_set_schema, NULL::VARCHAR character_set_name, NULL::VARCHAR collation_catalog, NULL::VARCHAR collation_schema, NULL::VARCHAR collation_name, NULL::VARCHAR domain_catalog, NULL::VARCHAR domain_schema, NULL::VARCHAR domain_name, NULL::VARCHAR udt_catalog, NULL::VARCHAR udt_schema, NULL::VARCHAR udt_name, NULL::VARCHAR scope_catalog, NULL::VARCHAR scope_schema, NULL::VARCHAR scope_name, NULL::BIGINT maximum_cardinality, NULL::VARCHAR dtd_identifier, NULL::BOOL is_self_referencing, NULL::BOOL is_identity, NULL::VARCHAR identity_generation, NULL::VARCHAR identity_start, NULL::VARCHAR identity_increment, NULL::VARCHAR identity_maximum, NULL::VARCHAR identity_minimum, NULL::BOOL identity_cycle, NULL::VARCHAR is_generated, NULL::VARCHAR generation_expression, NULL::BOOL is_updatable, comment AS COLUMN_COMMENT FROM duckdb_columns;"}, + {"information_schema", "schemata", "SELECT database_name catalog_name, schema_name, 'duckdb' schema_owner, NULL::VARCHAR default_character_set_catalog, NULL::VARCHAR default_character_set_schema, NULL::VARCHAR default_character_set_name, sql sql_path FROM duckdb_schemas()"}, + {"information_schema", "tables", "SELECT database_name table_catalog, schema_name table_schema, table_name, CASE WHEN temporary THEN 'LOCAL TEMPORARY' ELSE 'BASE TABLE' END table_type, NULL::VARCHAR self_referencing_column_name, NULL::VARCHAR reference_generation, NULL::VARCHAR user_defined_type_catalog, NULL::VARCHAR user_defined_type_schema, NULL::VARCHAR user_defined_type_name, 'YES' is_insertable_into, 'NO' is_typed, CASE WHEN temporary THEN 'PRESERVE' ELSE NULL END commit_action, comment AS TABLE_COMMENT FROM duckdb_tables() UNION ALL SELECT database_name table_catalog, schema_name table_schema, view_name table_name, 'VIEW' table_type, NULL self_referencing_column_name, NULL reference_generation, NULL user_defined_type_catalog, NULL user_defined_type_schema, NULL user_defined_type_name, 'NO' is_insertable_into, 'NO' is_typed, NULL commit_action, comment AS TABLE_COMMENT FROM duckdb_views;"}, + {"information_schema", "character_sets", "SELECT NULL::VARCHAR character_set_catalog, NULL::VARCHAR character_set_schema, 'UTF8' character_set_name, 'UCS' character_repertoire, 'UTF8' form_of_use, current_database() default_collate_catalog, 'pg_catalog' default_collate_schema, 'ucs_basic' default_collate_name;"}, + {"information_schema", "referential_constraints", "SELECT f.database_name constraint_catalog, f.schema_name constraint_schema, concat(f.table_name, '_', f.source, '_fkey') constraint_name, current_database() unique_constraint_catalog, c.schema_name unique_constraint_schema, concat(c.table_name, '_', f.target_column, '_', CASE WHEN c.constraint_type == 'UNIQUE' THEN 'key' ELSE 'pkey' END) unique_constraint_name, 'NONE' match_option, 'NO ACTION' update_rule, 'NO ACTION' delete_rule FROM duckdb_constraints() c JOIN (SELECT *, name_extract['source'] as source, name_extract['target'] as target, name_extract['target_column'] as target_column FROM (SELECT *, regexp_extract(constraint_text, 'FOREIGN KEY \\(([a-zA-Z_0-9]+)\\) REFERENCES ([a-zA-Z_0-9]+)\\(([a-zA-Z_0-9]+)\\)', ['source', 'target', 'target_column']) name_extract FROM duckdb_constraints() WHERE constraint_type = 'FOREIGN KEY')) f ON name_extract['target'] = c.table_name AND (c.constraint_type = 'UNIQUE' OR c.constraint_type = 'PRIMARY KEY')"}, {"information_schema", "key_column_usage", "SELECT current_database() constraint_catalog, schema_name constraint_schema, concat(table_name, '_', constraint_column_names[1], CASE constraint_type WHEN 'FOREIGN KEY' THEN '_fkey' WHEN 'PRIMARY KEY' THEN '_pkey' ELSE '_key' END) constraint_name, current_database() table_catalog, schema_name table_schema, table_name, constraint_column_names[1] column_name, 1 ordinal_position, CASE constraint_type WHEN 'FOREIGN KEY' THEN 1 ELSE NULL END position_in_unique_constraint FROM duckdb_constraints() WHERE constraint_type = 'FOREIGN KEY' OR constraint_type = 'PRIMARY KEY' OR constraint_type = 'UNIQUE';"}, {"information_schema", "table_constraints", "SELECT current_database() constraint_catalog, schema_name constraint_schema, concat(table_name, '_', CASE WHEN length(constraint_column_names) > 1 THEN NULL ELSE constraint_column_names[1] || '_' END, CASE constraint_type WHEN 'FOREIGN KEY' THEN 'fkey' WHEN 'PRIMARY KEY' THEN 'pkey' WHEN 'UNIQUE' THEN 'key' WHEN 'CHECK' THEN 'check' WHEN 'NOT NULL' THEN 'not_null' END) constraint_name, current_database() table_catalog, schema_name table_schema, table_name, CASE constraint_type WHEN 'NOT NULL' THEN 'CHECK' ELSE constraint_type END constraint_type, 'NO' is_deferrable, 'NO' initially_deferred, 'YES' enforced, 'YES' nulls_distinct FROM duckdb_constraints() WHERE constraint_type = 'PRIMARY KEY' OR constraint_type = 'FOREIGN KEY' OR constraint_type = 'UNIQUE' OR constraint_type = 'CHECK' OR constraint_type = 'NOT NULL';"}, {nullptr, nullptr, nullptr}}; diff --git a/src/duckdb/src/catalog/dependency_catalog_set.cpp b/src/duckdb/src/catalog/dependency_catalog_set.cpp index dacf7cf5..bfb3862a 100644 --- a/src/duckdb/src/catalog/dependency_catalog_set.cpp +++ b/src/duckdb/src/catalog/dependency_catalog_set.cpp @@ -11,7 +11,8 @@ MangledDependencyName DependencyCatalogSet::ApplyPrefix(const MangledEntryName & bool DependencyCatalogSet::CreateEntry(CatalogTransaction transaction, const MangledEntryName &name, unique_ptr value) { auto new_name = ApplyPrefix(name); - return set.CreateEntry(transaction, new_name.name, std::move(value), DependencyList()); + const LogicalDependencyList EMPTY_DEPENDENCIES; + return set.CreateEntry(transaction, new_name.name, std::move(value), EMPTY_DEPENDENCIES); } CatalogSet::EntryLookup DependencyCatalogSet::GetEntryDetailed(CatalogTransaction transaction, diff --git a/src/duckdb/src/catalog/dependency_list.cpp b/src/duckdb/src/catalog/dependency_list.cpp index 76ae806b..1ef3be15 100644 --- a/src/duckdb/src/catalog/dependency_list.cpp +++ b/src/duckdb/src/catalog/dependency_list.cpp @@ -1,26 +1,110 @@ #include "duckdb/catalog/dependency_list.hpp" #include "duckdb/catalog/catalog_entry.hpp" +#include "duckdb/common/serializer/deserializer.hpp" +#include "duckdb/common/serializer/serializer.hpp" +#include "duckdb/catalog/catalog_entry/schema_catalog_entry.hpp" +#include "duckdb/catalog/catalog_entry/dependency/dependency_entry.hpp" #include "duckdb/catalog/catalog.hpp" namespace duckdb { -void DependencyList::AddDependency(CatalogEntry &entry) { - if (entry.internal) { - return; +uint64_t LogicalDependencyHashFunction::operator()(const LogicalDependency &a) const { + auto &name = a.entry.name; + auto &schema = a.entry.schema; + auto &type = a.entry.type; + auto &catalog = a.catalog; + + hash_t hash = duckdb::Hash(name.c_str()); + hash = CombineHash(hash, duckdb::Hash(schema.c_str())); + hash = CombineHash(hash, duckdb::Hash(catalog.c_str())); + hash = CombineHash(hash, duckdb::Hash(static_cast(type))); + return hash; +} + +bool LogicalDependencyEquality::operator()(const LogicalDependency &a, const LogicalDependency &b) const { + if (a.entry.type != b.entry.type) { + return false; + } + if (a.entry.name != b.entry.name) { + return false; + } + if (a.entry.schema != b.entry.schema) { + return false; + } + if (a.catalog != b.catalog) { + return false; + } + return true; +} + +LogicalDependency::LogicalDependency() : entry(), catalog() { +} + +static string GetSchema(CatalogEntry &entry) { + if (entry.type == CatalogType::SCHEMA_ENTRY) { + return entry.name; + } + return entry.ParentSchema().name; +} + +LogicalDependency::LogicalDependency(CatalogEntry &entry) { + catalog = INVALID_CATALOG; + if (entry.type == CatalogType::DEPENDENCY_ENTRY) { + auto &dependency_entry = entry.Cast(); + + this->entry = dependency_entry.EntryInfo(); + } else { + this->entry.schema = GetSchema(entry); + this->entry.name = entry.name; + this->entry.type = entry.type; + catalog = entry.ParentCatalog().GetName(); } +} + +bool LogicalDependency::operator==(const LogicalDependency &other) const { + return other.entry.name == entry.name && other.entry.schema == entry.schema && other.entry.type == entry.type; +} + +void LogicalDependencyList::AddDependency(CatalogEntry &entry) { + LogicalDependency dependency(entry); + set.insert(dependency); +} + +void LogicalDependencyList::AddDependency(const LogicalDependency &entry) { set.insert(entry); } -void DependencyList::VerifyDependencies(Catalog &catalog, const string &name) { - for (auto &dep_entry : set) { - auto &dep = dep_entry.get(); - if (&dep.ParentCatalog() != &catalog) { +bool LogicalDependencyList::Contains(CatalogEntry &entry_p) { + LogicalDependency logical_entry(entry_p); + return set.count(logical_entry); +} + +void LogicalDependencyList::VerifyDependencies(Catalog &catalog, const string &name) { + for (auto &dep : set) { + if (dep.catalog != catalog.GetName()) { throw DependencyException( "Error adding dependency for object \"%s\" - dependency \"%s\" is in catalog " "\"%s\", which does not match the catalog \"%s\".\nCross catalog dependencies are not supported.", - name, dep.name, dep.ParentCatalog().GetName(), catalog.GetName()); + name, dep.entry.name, dep.catalog, catalog.GetName()); + } + } +} + +const LogicalDependencyList::create_info_set_t &LogicalDependencyList::Set() const { + return set; +} + +bool LogicalDependencyList::operator==(const LogicalDependencyList &other) const { + if (set.size() != other.set.size()) { + return false; + } + + for (auto &entry : set) { + if (!other.set.count(entry)) { + return false; } } + return true; } } // namespace duckdb diff --git a/src/duckdb/src/catalog/dependency_manager.cpp b/src/duckdb/src/catalog/dependency_manager.cpp index 918bd3b2..86b1fb25 100644 --- a/src/duckdb/src/catalog/dependency_manager.cpp +++ b/src/duckdb/src/catalog/dependency_manager.cpp @@ -2,7 +2,6 @@ #include "duckdb/catalog/catalog_entry/type_catalog_entry.hpp" #include "duckdb/catalog/duck_catalog.hpp" #include "duckdb/catalog/catalog_entry.hpp" -#include "duckdb/catalog/catalog_entry/table_catalog_entry.hpp" #include "duckdb/main/client_context.hpp" #include "duckdb/main/database.hpp" #include "duckdb/parser/expression/constant_expression.hpp" @@ -12,6 +11,9 @@ #include "duckdb/catalog/catalog_entry/dependency/dependency_subject_entry.hpp" #include "duckdb/catalog/catalog_entry/dependency/dependency_dependent_entry.hpp" #include "duckdb/catalog/catalog_entry/duck_schema_entry.hpp" +#include "duckdb/common/queue.hpp" +#include "duckdb/catalog/catalog_entry/table_catalog_entry.hpp" +#include "duckdb/parser/constraints/foreign_key_constraint.hpp" #include "duckdb/catalog/dependency_catalog_set.hpp" namespace duckdb { @@ -43,7 +45,7 @@ MangledDependencyName::MangledDependencyName(const MangledEntryName &from, const DependencyManager::DependencyManager(DuckCatalog &catalog) : catalog(catalog), subjects(catalog), dependents(catalog) { } -string DependencyManager::GetSchema(CatalogEntry &entry) { +string DependencyManager::GetSchema(const CatalogEntry &entry) { if (entry.type == CatalogType::SCHEMA_ENTRY) { return entry.name; } @@ -54,7 +56,7 @@ MangledEntryName DependencyManager::MangleName(const CatalogEntryInfo &info) { return MangledEntryName(info); } -MangledEntryName DependencyManager::MangleName(CatalogEntry &entry) { +MangledEntryName DependencyManager::MangleName(const CatalogEntry &entry) { if (entry.type == CatalogType::DEPENDENCY_ENTRY) { auto &dependency_entry = entry.Cast(); return dependency_entry.EntryMangledName(); @@ -252,47 +254,42 @@ void DependencyManager::CreateDependency(CatalogTransaction transaction, Depende CreateSubject(transaction, info); } -void DependencyManager::AddObject(CatalogTransaction transaction, CatalogEntry &object, - const DependencyList &dependencies) { - if (IsSystemEntry(object)) { - // Don't do anything for this - return; +void DependencyManager::CreateDependencies(CatalogTransaction transaction, const CatalogEntry &object, + const LogicalDependencyList &dependencies) { + DependencyDependentFlags dependency_flags; + if (object.type != CatalogType::INDEX_ENTRY) { + // indexes do not require CASCADE to be dropped, they are simply always dropped along with the table + dependency_flags.SetBlocking(); } + const auto object_info = GetLookupProperties(object); // check for each object in the sources if they were not deleted yet - for (auto &dep : dependencies.set) { - auto &dependency = dep.get(); - if (&dependency.ParentCatalog() != &object.ParentCatalog()) { + for (auto &dependency : dependencies.Set()) { + if (dependency.catalog != object.ParentCatalog().GetName()) { throw DependencyException( "Error adding dependency for object \"%s\" - dependency \"%s\" is in catalog " "\"%s\", which does not match the catalog \"%s\".\nCross catalog dependencies are not supported.", - object.name, dependency.name, dependency.ParentCatalog().GetName(), object.ParentCatalog().GetName()); - } - if (!dependency.set) { - throw InternalException("Dependency has no set"); + object.name, dependency.entry.name, dependency.catalog, object.ParentCatalog().GetName()); } - auto catalog_entry = dependency.set->GetEntry(transaction, dependency.name); - if (!catalog_entry) { - throw InternalException("Dependency has already been deleted?"); - } - } - - // indexes do not require CASCADE to be dropped, they are simply always dropped along with the table - DependencyDependentFlags dependency_flags; - if (object.type != CatalogType::INDEX_ENTRY) { - // indexes do not require CASCADE to be dropped, they are simply always dropped along with the table - dependency_flags.SetBlocking(); } // add the object to the dependents_map of each object that it depends on - for (auto &dependency : dependencies.set) { - DependencyInfo info { - /*dependent = */ DependencyDependent {GetLookupProperties(object), dependency_flags}, - /*subject = */ DependencySubject {GetLookupProperties(dependency), DependencySubjectFlags()}}; + for (auto &dependency : dependencies.Set()) { + DependencyInfo info {/*dependent = */ DependencyDependent {GetLookupProperties(object), dependency_flags}, + /*subject = */ DependencySubject {dependency.entry, DependencySubjectFlags()}}; CreateDependency(transaction, info); } } +void DependencyManager::AddObject(CatalogTransaction transaction, CatalogEntry &object, + const LogicalDependencyList &dependencies) { + if (IsSystemEntry(object)) { + // Don't do anything for this + return; + } + CreateDependencies(transaction, object, dependencies); +} + static bool CascadeDrop(bool cascade, const DependencyDependentFlags &flags) { if (cascade) { return true; @@ -304,7 +301,7 @@ static bool CascadeDrop(bool cascade, const DependencyDependentFlags &flags) { return !flags.IsBlocking(); } -CatalogEntryInfo DependencyManager::GetLookupProperties(CatalogEntry &entry) { +CatalogEntryInfo DependencyManager::GetLookupProperties(const CatalogEntry &entry) { if (entry.type == CatalogType::DEPENDENCY_ENTRY) { auto &dependency_entry = entry.Cast(); return dependency_entry.EntryInfo(); @@ -317,6 +314,9 @@ CatalogEntryInfo DependencyManager::GetLookupProperties(CatalogEntry &entry) { } optional_ptr DependencyManager::LookupEntry(CatalogTransaction transaction, CatalogEntry &dependency) { + if (dependency.type != CatalogType::DEPENDENCY_ENTRY) { + return &dependency; + } auto info = GetLookupProperties(dependency); auto &type = info.type; @@ -399,63 +399,48 @@ void DependencyManager::AlterObject(CatalogTransaction transaction, CatalogEntry return; } - auto info = GetLookupProperties(old_obj); - dependency_set_t owned_objects; - ScanDependents(transaction, info, [&](DependencyEntry &dep) { + const auto old_info = GetLookupProperties(old_obj); + const auto new_info = GetLookupProperties(new_obj); + + vector dependencies; + // Other entries that depend on us + ScanDependents(transaction, old_info, [&](DependencyEntry &dep) { // It makes no sense to have a schema depend on anything D_ASSERT(dep.EntryInfo().type != CatalogType::SCHEMA_ENTRY); - auto entry = LookupEntry(transaction, dep); - if (!entry) { - return; - } - // conflict: attempting to alter this object but the dependent object still exists - // no cascade and there are objects that depend on this object: throw error throw DependencyException("Cannot alter entry \"%s\" because there are entries that " "depend on it.", old_obj.name); + + auto dep_info = DependencyInfo::FromDependent(dep); + dep_info.subject.entry = new_info; + dependencies.emplace_back(dep_info); }); // Keep old dependencies dependency_set_t dependents; - ScanSubjects(transaction, info, [&](DependencyEntry &dep) { + ScanSubjects(transaction, old_info, [&](DependencyEntry &dep) { auto entry = LookupEntry(transaction, dep); if (!entry) { return; } - if (dep.Subject().flags.IsOwnership()) { - owned_objects.insert(Dependency(*entry, dep.Dependent().flags)); - return; - } - dependents.insert(Dependency(*entry, dep.Dependent().flags)); + + auto dep_info = DependencyInfo::FromSubject(dep); + dep_info.dependent.entry = new_info; + dependencies.emplace_back(dep_info); }); // FIXME: we should update dependencies in the future // some alters could cause dependencies to change (imagine types of table columns) // or DEFAULT depending on a sequence - if (StringUtil::CIEquals(old_obj.name, new_obj.name)) { - // The name was not changed, we do not need to recreate the dependency links - return; + if (!StringUtil::CIEquals(old_obj.name, new_obj.name)) { + // The name has been changed, we need to recreate the dependency links + CleanupDependencies(transaction, old_obj); } - CleanupDependencies(transaction, old_obj); - for (auto &dep : dependents) { - auto &other = dep.entry.get(); - DependencyInfo info {/*dependent = */ DependencyDependent {GetLookupProperties(new_obj), dep.flags}, - /*subject = */ DependencySubject {GetLookupProperties(other), DependencySubjectFlags()}}; - CreateDependency(transaction, info); - } - - // For all the objects we own, re establish the dependency of the owner on the object - for (auto &object : owned_objects) { - auto &entry = object.entry.get(); - { - DependencyInfo info { - /*dependent = */ DependencyDependent {GetLookupProperties(new_obj), - DependencyDependentFlags().SetOwnedBy()}, - /*subject = */ DependencySubject {GetLookupProperties(entry), DependencySubjectFlags().SetOwnership()}}; - CreateDependency(transaction, info); - } + // Reinstate the old dependencies + for (auto &dep : dependencies) { + CreateDependency(transaction, dep); } } @@ -493,7 +478,7 @@ void DependencyManager::AddOwnership(CatalogTransaction transaction, CatalogEntr } // If the owner is already owned by something else, throw an error - auto owner_info = GetLookupProperties(owner); + const auto owner_info = GetLookupProperties(owner); ScanDependents(transaction, owner_info, [&](DependencyEntry &dep) { if (dep.Dependent().flags.IsOwnedBy()) { throw DependencyException("%s can not become the owner, it is already owned by %s", owner.name, diff --git a/src/duckdb/src/catalog/duck_catalog.cpp b/src/duckdb/src/catalog/duck_catalog.cpp index 8f712b84..ebf1bb53 100644 --- a/src/duckdb/src/catalog/duck_catalog.cpp +++ b/src/duckdb/src/catalog/duck_catalog.cpp @@ -54,7 +54,7 @@ bool DuckCatalog::IsDuckCatalog() { // Schema //===--------------------------------------------------------------------===// optional_ptr DuckCatalog::CreateSchemaInternal(CatalogTransaction transaction, CreateSchemaInfo &info) { - DependencyList dependencies; + LogicalDependencyList dependencies; auto entry = make_uniq(*this, info); auto result = entry.get(); if (!schemas->CreateEntry(transaction, info.schema, std::move(entry), dependencies)) { diff --git a/src/duckdb/src/common/adbc/adbc.cpp b/src/duckdb/src/common/adbc/adbc.cpp index 47d2ff88..65a147b0 100644 --- a/src/duckdb/src/common/adbc/adbc.cpp +++ b/src/duckdb/src/common/adbc/adbc.cpp @@ -67,6 +67,8 @@ struct DuckDBAdbcStatementWrapper { char *ingestion_table_name; ArrowArrayStream ingestion_stream; IngestionMode ingestion_mode = IngestionMode::CREATE; + uint8_t *substrait_plan; + uint64_t plan_length; }; static AdbcStatusCode QueryInternal(struct AdbcConnection *connection, struct ArrowArrayStream *out, const char *query, @@ -168,11 +170,10 @@ AdbcStatusCode StatementSetSubstraitPlan(struct AdbcStatement *statement, const return ADBC_STATUS_INVALID_ARGUMENT; } auto wrapper = reinterpret_cast(statement->private_data); - auto plan_str = std::string(reinterpret_cast(plan), length); - auto query = "CALL from_substrait('" + plan_str + "'::BLOB)"; - auto res = duckdb_prepare(wrapper->connection, query.c_str(), &wrapper->statement); - auto error_msg = duckdb_prepare_error(wrapper->statement); - return CheckResult(res, error, error_msg); + wrapper->substrait_plan = (uint8_t *)malloc(sizeof(uint8_t) * (length)); + wrapper->plan_length = length; + memcpy(wrapper->substrait_plan, plan, length); + return ADBC_STATUS_OK; } AdbcStatusCode DatabaseSetOption(struct AdbcDatabase *database, const char *key, const char *value, @@ -234,16 +235,11 @@ AdbcStatusCode ConnectionGetTableSchema(struct AdbcConnection *connection, const SetError(error, "Connection is not set"); return ADBC_STATUS_INVALID_ARGUMENT; } - if (db_schema == nullptr) { + if (db_schema == nullptr || strlen(db_schema) == 0) { // if schema is not set, we use the default schema db_schema = "main"; } - if (catalog != nullptr && strlen(catalog) > 0) { - // In DuckDB this is the name of the database, not sure what's the expected functionality here, so for now, - // scream. - SetError(error, "Catalog Name is not used in DuckDB. It must be set to nullptr or an empty string"); - return ADBC_STATUS_NOT_IMPLEMENTED; - } else if (table_name == nullptr) { + if (table_name == nullptr) { SetError(error, "AdbcConnectionGetTableSchema: must provide table_name"); return ADBC_STATUS_INVALID_ARGUMENT; } else if (strlen(table_name) == 0) { @@ -253,9 +249,10 @@ AdbcStatusCode ConnectionGetTableSchema(struct AdbcConnection *connection, const ArrowArrayStream arrow_stream; std::string query = "SELECT * FROM "; - if (strlen(db_schema) > 0) { - query += std::string(db_schema) + "."; + if (catalog != nullptr && strlen(catalog) > 0) { + query += std::string(catalog) + "."; } + query += std::string(db_schema) + "."; query += std::string(table_name) + " LIMIT 0;"; auto success = QueryInternal(connection, &arrow_stream, query.c_str(), error); @@ -643,6 +640,8 @@ AdbcStatusCode StatementNew(struct AdbcConnection *connection, struct AdbcStatem statement_wrapper->result = nullptr; statement_wrapper->ingestion_stream.release = nullptr; statement_wrapper->ingestion_table_name = nullptr; + statement_wrapper->substrait_plan = nullptr; + statement_wrapper->ingestion_mode = IngestionMode::CREATE; return ADBC_STATUS_OK; } @@ -668,6 +667,10 @@ AdbcStatusCode StatementRelease(struct AdbcStatement *statement, struct AdbcErro free(wrapper->ingestion_table_name); wrapper->ingestion_table_name = nullptr; } + if (wrapper->substrait_plan) { + free(wrapper->substrait_plan); + wrapper->substrait_plan = nullptr; + } free(statement->private_data); statement->private_data = nullptr; return ADBC_STATUS_OK; @@ -758,8 +761,24 @@ AdbcStatusCode StatementExecuteQuery(struct AdbcStatement *statement, struct Arr if (has_stream && to_table) { return IngestToTableFromBoundStream(wrapper, error); } - - if (has_stream) { + if (wrapper->substrait_plan != nullptr) { + auto plan_str = std::string(reinterpret_cast(wrapper->substrait_plan), wrapper->plan_length); + duckdb::vector params; + params.emplace_back(duckdb::Value::BLOB_RAW(plan_str)); + duckdb::unique_ptr query_result; + try { + query_result = + ((duckdb::Connection *)wrapper->connection)->TableFunction("from_substrait", params)->Execute(); + } catch (duckdb::Exception &e) { + std::string error_msg = "It was not possible to execute substrait query. " + std::string(e.what()); + SetError(error, error_msg); + return ADBC_STATUS_INVALID_ARGUMENT; + } + auto arrow_wrapper = new duckdb::ArrowResultWrapper(); + arrow_wrapper->result = + duckdb::unique_ptr_cast(std::move(query_result)); + wrapper->result = reinterpret_cast(arrow_wrapper); + } else if (has_stream) { // A stream was bound to the statement, use that to bind parameters duckdb::unique_ptr result; ArrowArrayStream stream = wrapper->ingestion_stream; @@ -960,57 +979,280 @@ AdbcStatusCode StatementSetOption(struct AdbcStatement *statement, const char *k AdbcStatusCode ConnectionGetObjects(struct AdbcConnection *connection, int depth, const char *catalog, const char *db_schema, const char *table_name, const char **table_type, const char *column_name, struct ArrowArrayStream *out, struct AdbcError *error) { - if (catalog != nullptr) { - if (strcmp(catalog, "duckdb") == 0) { - SetError(error, "catalog must be NULL or 'duckdb'"); - return ADBC_STATUS_INVALID_ARGUMENT; - } - } - if (table_type != nullptr) { SetError(error, "Table types parameter not yet supported"); return ADBC_STATUS_NOT_IMPLEMENTED; } + + std::string catalog_filter = catalog ? catalog : "%"; + std::string db_schema_filter = db_schema ? db_schema : "%"; + std::string table_name_filter = table_name ? table_name : "%"; + std::string column_name_filter = column_name ? column_name : "%"; + std::string query; switch (depth) { case ADBC_OBJECT_DEPTH_CATALOGS: - SetError(error, "ADBC_OBJECT_DEPTH_CATALOGS not yet supported"); - return ADBC_STATUS_NOT_IMPLEMENTED; + // Return metadata on catalogs. + query = duckdb::StringUtil::Format(R"( + SELECT + catalog_name, + []::STRUCT( + db_schema_name VARCHAR, + db_schema_tables STRUCT( + table_name VARCHAR, + table_type VARCHAR, + table_columns STRUCT( + column_name VARCHAR, + ordinal_position INTEGER, + remarks VARCHAR, + xdbc_data_type SMALLINT, + xdbc_type_name VARCHAR, + xdbc_column_size INTEGER, + xdbc_decimal_digits SMALLINT, + xdbc_num_prec_radix SMALLINT, + xdbc_nullable SMALLINT, + xdbc_column_def VARCHAR, + xdbc_sql_data_type SMALLINT, + xdbc_datetime_sub SMALLINT, + xdbc_char_octet_length INTEGER, + xdbc_is_nullable VARCHAR, + xdbc_scope_catalog VARCHAR, + xdbc_scope_schema VARCHAR, + xdbc_scope_table VARCHAR, + xdbc_is_autoincrement BOOLEAN, + xdbc_is_generatedcolumn BOOLEAN + )[], + table_constraints STRUCT( + constraint_name VARCHAR, + constraint_type VARCHAR, + constraint_column_names VARCHAR[], + constraint_column_usage STRUCT(fk_catalog VARCHAR, fk_db_schema VARCHAR, fk_table VARCHAR, fk_column_name VARCHAR)[] + )[] + )[] + )[] catalog_db_schemas + FROM + information_schema.schemata + WHERE catalog_name LIKE '%s' + GROUP BY catalog_name + )", + catalog_filter); + break; case ADBC_OBJECT_DEPTH_DB_SCHEMAS: // Return metadata on catalogs and schemas. query = duckdb::StringUtil::Format(R"( - SELECT table_schema db_schema_name - FROM information_schema.columns - WHERE table_schema LIKE '%s' AND table_name LIKE '%s' AND column_name LIKE '%s' ; + WITH db_schemas AS ( + SELECT + catalog_name, + schema_name, + FROM information_schema.schemata + WHERE schema_name LIKE '%s' + ) + + SELECT + catalog_name, + LIST({ + db_schema_name: schema_name, + db_schema_tables: []::STRUCT( + table_name VARCHAR, + table_type VARCHAR, + table_columns STRUCT( + column_name VARCHAR, + ordinal_position INTEGER, + remarks VARCHAR, + xdbc_data_type SMALLINT, + xdbc_type_name VARCHAR, + xdbc_column_size INTEGER, + xdbc_decimal_digits SMALLINT, + xdbc_num_prec_radix SMALLINT, + xdbc_nullable SMALLINT, + xdbc_column_def VARCHAR, + xdbc_sql_data_type SMALLINT, + xdbc_datetime_sub SMALLINT, + xdbc_char_octet_length INTEGER, + xdbc_is_nullable VARCHAR, + xdbc_scope_catalog VARCHAR, + xdbc_scope_schema VARCHAR, + xdbc_scope_table VARCHAR, + xdbc_is_autoincrement BOOLEAN, + xdbc_is_generatedcolumn BOOLEAN + )[], + table_constraints STRUCT( + constraint_name VARCHAR, + constraint_type VARCHAR, + constraint_column_names VARCHAR[], + constraint_column_usage STRUCT(fk_catalog VARCHAR, fk_db_schema VARCHAR, fk_table VARCHAR, fk_column_name VARCHAR)[] + )[] + )[], + }) FILTER (dbs.schema_name is not null) catalog_db_schemas + FROM + information_schema.schemata + LEFT JOIN db_schemas dbs + USING (catalog_name, schema_name) + WHERE catalog_name LIKE '%s' + GROUP BY catalog_name )", - db_schema ? db_schema : "%", table_name ? table_name : "%", - column_name ? column_name : "%"); + db_schema_filter, catalog_filter); break; case ADBC_OBJECT_DEPTH_TABLES: // Return metadata on catalogs, schemas, and tables. query = duckdb::StringUtil::Format(R"( - SELECT table_schema db_schema_name, LIST(table_schema_list) db_schema_tables - FROM ( - SELECT table_schema, { table_name : table_name} table_schema_list - FROM information_schema.columns - WHERE table_schema LIKE '%s' AND table_name LIKE '%s' AND column_name LIKE '%s' GROUP BY table_schema, table_name - ) GROUP BY table_schema; + WITH tables AS ( + SELECT + table_catalog catalog_name, + table_schema schema_name, + LIST({ + table_name: table_name, + table_type: table_type, + table_columns: []::STRUCT( + column_name VARCHAR, + ordinal_position INTEGER, + remarks VARCHAR, + xdbc_data_type SMALLINT, + xdbc_type_name VARCHAR, + xdbc_column_size INTEGER, + xdbc_decimal_digits SMALLINT, + xdbc_num_prec_radix SMALLINT, + xdbc_nullable SMALLINT, + xdbc_column_def VARCHAR, + xdbc_sql_data_type SMALLINT, + xdbc_datetime_sub SMALLINT, + xdbc_char_octet_length INTEGER, + xdbc_is_nullable VARCHAR, + xdbc_scope_catalog VARCHAR, + xdbc_scope_schema VARCHAR, + xdbc_scope_table VARCHAR, + xdbc_is_autoincrement BOOLEAN, + xdbc_is_generatedcolumn BOOLEAN + )[], + table_constraints: []::STRUCT( + constraint_name VARCHAR, + constraint_type VARCHAR, + constraint_column_names VARCHAR[], + constraint_column_usage STRUCT(fk_catalog VARCHAR, fk_db_schema VARCHAR, fk_table VARCHAR, fk_column_name VARCHAR)[] + )[], + }) db_schema_tables + FROM information_schema.tables + WHERE table_name LIKE '%s' + GROUP BY table_catalog, table_schema + ), + db_schemas AS ( + SELECT + catalog_name, + schema_name, + db_schema_tables, + FROM information_schema.schemata + LEFT JOIN tables + USING (catalog_name, schema_name) + WHERE schema_name LIKE '%s' + ) + + SELECT + catalog_name, + LIST({ + db_schema_name: schema_name, + db_schema_tables: db_schema_tables, + }) FILTER (dbs.schema_name is not null) catalog_db_schemas + FROM + information_schema.schemata + LEFT JOIN db_schemas dbs + USING (catalog_name, schema_name) + WHERE catalog_name LIKE '%s' + GROUP BY catalog_name )", - db_schema ? db_schema : "%", table_name ? table_name : "%", - column_name ? column_name : "%"); + table_name_filter, db_schema_filter, catalog_filter); break; case ADBC_OBJECT_DEPTH_COLUMNS: // Return metadata on catalogs, schemas, tables, and columns. query = duckdb::StringUtil::Format(R"( - SELECT table_schema db_schema_name, LIST(table_schema_list) db_schema_tables - FROM ( - SELECT table_schema, { table_name : table_name, table_columns : LIST({column_name : column_name, ordinal_position : ordinal_position + 1, remarks : ''})} table_schema_list + WITH columns AS ( + SELECT + table_catalog, + table_schema, + table_name, + LIST({ + column_name: column_name, + ordinal_position: ordinal_position, + remarks : '', + xdbc_data_type: NULL::SMALLINT, + xdbc_type_name: NULL::VARCHAR, + xdbc_column_size: NULL::INTEGER, + xdbc_decimal_digits: NULL::SMALLINT, + xdbc_num_prec_radix: NULL::SMALLINT, + xdbc_nullable: NULL::SMALLINT, + xdbc_column_def: NULL::VARCHAR, + xdbc_sql_data_type: NULL::SMALLINT, + xdbc_datetime_sub: NULL::SMALLINT, + xdbc_char_octet_length: NULL::INTEGER, + xdbc_is_nullable: NULL::VARCHAR, + xdbc_scope_catalog: NULL::VARCHAR, + xdbc_scope_schema: NULL::VARCHAR, + xdbc_scope_table: NULL::VARCHAR, + xdbc_is_autoincrement: NULL::BOOLEAN, + xdbc_is_generatedcolumn: NULL::BOOLEAN, + }) table_columns FROM information_schema.columns - WHERE table_schema LIKE '%s' AND table_name LIKE '%s' AND column_name LIKE '%s' GROUP BY table_schema, table_name - ) GROUP BY table_schema; + WHERE column_name LIKE '%s' + GROUP BY table_catalog, table_schema, table_name + ), + constraints AS ( + SELECT + table_catalog, + table_schema, + table_name, + LIST( + { + constraint_name: constraint_name, + constraint_type: constraint_type, + constraint_column_names: []::VARCHAR[], + constraint_column_usage: []::STRUCT(fk_catalog VARCHAR, fk_db_schema VARCHAR, fk_table VARCHAR, fk_column_name VARCHAR)[], + } + ) table_constraints + FROM information_schema.table_constraints + GROUP BY table_catalog, table_schema, table_name + ), + tables AS ( + SELECT + table_catalog catalog_name, + table_schema schema_name, + LIST({ + table_name: table_name, + table_type: table_type, + table_columns: table_columns, + table_constraints: table_constraints, + }) db_schema_tables + FROM information_schema.tables + LEFT JOIN columns + USING (table_catalog, table_schema, table_name) + LEFT JOIN constraints + USING (table_catalog, table_schema, table_name) + WHERE table_name LIKE '%s' + GROUP BY table_catalog, table_schema + ), + db_schemas AS ( + SELECT + catalog_name, + schema_name, + db_schema_tables, + FROM information_schema.schemata + LEFT JOIN tables + USING (catalog_name, schema_name) + WHERE schema_name LIKE '%s' + ) + + SELECT + catalog_name, + LIST({ + db_schema_name: schema_name, + db_schema_tables: db_schema_tables, + }) FILTER (dbs.schema_name is not null) catalog_db_schemas + FROM + information_schema.schemata + LEFT JOIN db_schemas dbs + USING (catalog_name, schema_name) + WHERE catalog_name LIKE '%s' + GROUP BY catalog_name )", - db_schema ? db_schema : "%", table_name ? table_name : "%", - column_name ? column_name : "%"); + column_name_filter, table_name_filter, db_schema_filter, catalog_filter); break; default: SetError(error, "Invalid value of Depth"); diff --git a/src/duckdb/src/common/arrow/appender/union_data.cpp b/src/duckdb/src/common/arrow/appender/union_data.cpp index d65997ba..9797aa9f 100644 --- a/src/duckdb/src/common/arrow/appender/union_data.cpp +++ b/src/duckdb/src/common/arrow/appender/union_data.cpp @@ -55,8 +55,8 @@ void ArrowUnionData::Append(ArrowAppendData &append_data, Vector &input, idx_t f } void ArrowUnionData::Finalize(ArrowAppendData &append_data, const LogicalType &type, ArrowArray *result) { - result->n_buffers = 2; - result->buffers[1] = append_data.main_buffer.data(); + result->n_buffers = 1; + result->buffers[0] = append_data.main_buffer.data(); auto &child_types = UnionType::CopyMemberTypes(type); ArrowAppender::AddChildren(append_data, child_types.size()); diff --git a/src/duckdb/src/common/box_renderer.cpp b/src/duckdb/src/common/box_renderer.cpp index 0a64af13..fc309150 100644 --- a/src/duckdb/src/common/box_renderer.cpp +++ b/src/duckdb/src/common/box_renderer.cpp @@ -446,7 +446,7 @@ void BoxRenderer::RenderHeader(const vector &names, const vector &names, const vector &names, const vector &names, const vector &collections, const vector &column_map, @@ -534,7 +534,7 @@ void BoxRenderer::RenderValues(const list &collections, co RenderValue(ss, str, widths[c], alignment); } ss << config.VERTICAL; - ss << std::endl; + ss << '\n'; } if (bottom_rows > 0) { @@ -590,7 +590,7 @@ void BoxRenderer::RenderValues(const list &collections, co RenderValue(ss, str, widths[c], alignment); } ss << config.VERTICAL; - ss << std::endl; + ss << '\n'; } // note that the bottom rows are in reverse order for (idx_t r = 0; r < bottom_rows; r++) { @@ -605,7 +605,7 @@ void BoxRenderer::RenderValues(const list &collections, co RenderValue(ss, str, widths[c], alignments[c]); } ss << config.VERTICAL; - ss << std::endl; + ss << '\n'; } } } @@ -644,7 +644,7 @@ void BoxRenderer::RenderRowCount(string row_count_str, string shown_str, const s } } ss << (render_anything ? config.RMIDDLE : config.RDCORNER); - ss << std::endl; + ss << '\n'; } if (!render_anything) { return; @@ -658,16 +658,16 @@ void BoxRenderer::RenderRowCount(string row_count_str, string shown_str, const s ss << column_count_str; ss << " "; ss << config.VERTICAL; - ss << std::endl; + ss << '\n'; } else if (render_rows) { RenderValue(ss, row_count_str, total_length - 4); ss << config.VERTICAL; - ss << std::endl; + ss << '\n'; if (display_shown_separately) { RenderValue(ss, shown_str, total_length - 4); ss << config.VERTICAL; - ss << std::endl; + ss << '\n'; } } // render the bottom line @@ -676,7 +676,7 @@ void BoxRenderer::RenderRowCount(string row_count_str, string shown_str, const s ss << config.HORIZONTAL; } ss << config.RDCORNER; - ss << std::endl; + ss << '\n'; } void BoxRenderer::Render(ClientContext &context, const vector &names, const ColumnDataCollection &result, diff --git a/src/duckdb/src/common/crypto/md5.cpp b/src/duckdb/src/common/crypto/md5.cpp index 228fa8e2..d0d679c3 100644 --- a/src/duckdb/src/common/crypto/md5.cpp +++ b/src/duckdb/src/common/crypto/md5.cpp @@ -156,7 +156,8 @@ void MD5Context::MD5Update(const_data_ptr_t input, idx_t len) { /* Update bitcount */ t = bits[0]; - if ((bits[0] = t + ((uint32_t)len << 3)) < t) { + bits[0] = t + ((uint32_t)len << 3); + if (bits[0] < t) { bits[1]++; /* Carry from low to high */ } bits[1] += len >> 29; diff --git a/src/duckdb/src/common/enum_util.cpp b/src/duckdb/src/common/enum_util.cpp index fab315c2..b2db02f4 100644 --- a/src/duckdb/src/common/enum_util.cpp +++ b/src/duckdb/src/common/enum_util.cpp @@ -53,10 +53,11 @@ #include "duckdb/common/enums/vector_type.hpp" #include "duckdb/common/enums/wal_type.hpp" #include "duckdb/common/enums/window_aggregation_mode.hpp" +#include "duckdb/common/exception.hpp" #include "duckdb/common/exception_format_value.hpp" #include "duckdb/common/extra_type_info.hpp" #include "duckdb/common/file_buffer.hpp" -#include "duckdb/common/file_system.hpp" +#include "duckdb/common/file_open_flags.hpp" #include "duckdb/common/printer.hpp" #include "duckdb/common/sort/partition_state.hpp" #include "duckdb/common/types.hpp" @@ -81,11 +82,14 @@ #include "duckdb/function/scalar/compressed_materialization_functions.hpp" #include "duckdb/function/scalar/strftime_format.hpp" #include "duckdb/function/table/arrow/arrow_duck_schema.hpp" +#include "duckdb/function/table_function.hpp" #include "duckdb/main/appender.hpp" #include "duckdb/main/capi/capi_internal.hpp" +#include "duckdb/main/client_properties.hpp" #include "duckdb/main/config.hpp" #include "duckdb/main/error_manager.hpp" #include "duckdb/main/extension_helper.hpp" +#include "duckdb/main/external_dependencies.hpp" #include "duckdb/main/query_result.hpp" #include "duckdb/main/secret/secret.hpp" #include "duckdb/main/settings.hpp" @@ -544,6 +548,29 @@ ArrowDateTimeType EnumUtil::FromString(const char *value) { throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); } +template<> +const char* EnumUtil::ToChars(ArrowOffsetSize value) { + switch(value) { + case ArrowOffsetSize::REGULAR: + return "REGULAR"; + case ArrowOffsetSize::LARGE: + return "LARGE"; + default: + throw NotImplementedException(StringUtil::Format("Enum value: '%d' not implemented", value)); + } +} + +template<> +ArrowOffsetSize EnumUtil::FromString(const char *value) { + if (StringUtil::Equals(value, "REGULAR")) { + return ArrowOffsetSize::REGULAR; + } + if (StringUtil::Equals(value, "LARGE")) { + return ArrowOffsetSize::LARGE; + } + throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); +} + template<> const char* EnumUtil::ToChars(ArrowVariableSizeType value) { switch(value) { @@ -1630,6 +1657,229 @@ ExceptionFormatValueType EnumUtil::FromString(const ch throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); } +template<> +const char* EnumUtil::ToChars(ExceptionType value) { + switch(value) { + case ExceptionType::INVALID: + return "INVALID"; + case ExceptionType::OUT_OF_RANGE: + return "OUT_OF_RANGE"; + case ExceptionType::CONVERSION: + return "CONVERSION"; + case ExceptionType::UNKNOWN_TYPE: + return "UNKNOWN_TYPE"; + case ExceptionType::DECIMAL: + return "DECIMAL"; + case ExceptionType::MISMATCH_TYPE: + return "MISMATCH_TYPE"; + case ExceptionType::DIVIDE_BY_ZERO: + return "DIVIDE_BY_ZERO"; + case ExceptionType::OBJECT_SIZE: + return "OBJECT_SIZE"; + case ExceptionType::INVALID_TYPE: + return "INVALID_TYPE"; + case ExceptionType::SERIALIZATION: + return "SERIALIZATION"; + case ExceptionType::TRANSACTION: + return "TRANSACTION"; + case ExceptionType::NOT_IMPLEMENTED: + return "NOT_IMPLEMENTED"; + case ExceptionType::EXPRESSION: + return "EXPRESSION"; + case ExceptionType::CATALOG: + return "CATALOG"; + case ExceptionType::PARSER: + return "PARSER"; + case ExceptionType::PLANNER: + return "PLANNER"; + case ExceptionType::SCHEDULER: + return "SCHEDULER"; + case ExceptionType::EXECUTOR: + return "EXECUTOR"; + case ExceptionType::CONSTRAINT: + return "CONSTRAINT"; + case ExceptionType::INDEX: + return "INDEX"; + case ExceptionType::STAT: + return "STAT"; + case ExceptionType::CONNECTION: + return "CONNECTION"; + case ExceptionType::SYNTAX: + return "SYNTAX"; + case ExceptionType::SETTINGS: + return "SETTINGS"; + case ExceptionType::BINDER: + return "BINDER"; + case ExceptionType::NETWORK: + return "NETWORK"; + case ExceptionType::OPTIMIZER: + return "OPTIMIZER"; + case ExceptionType::NULL_POINTER: + return "NULL_POINTER"; + case ExceptionType::IO: + return "IO"; + case ExceptionType::INTERRUPT: + return "INTERRUPT"; + case ExceptionType::FATAL: + return "FATAL"; + case ExceptionType::INTERNAL: + return "INTERNAL"; + case ExceptionType::INVALID_INPUT: + return "INVALID_INPUT"; + case ExceptionType::OUT_OF_MEMORY: + return "OUT_OF_MEMORY"; + case ExceptionType::PERMISSION: + return "PERMISSION"; + case ExceptionType::PARAMETER_NOT_RESOLVED: + return "PARAMETER_NOT_RESOLVED"; + case ExceptionType::PARAMETER_NOT_ALLOWED: + return "PARAMETER_NOT_ALLOWED"; + case ExceptionType::DEPENDENCY: + return "DEPENDENCY"; + case ExceptionType::HTTP: + return "HTTP"; + case ExceptionType::MISSING_EXTENSION: + return "MISSING_EXTENSION"; + case ExceptionType::AUTOLOAD: + return "AUTOLOAD"; + case ExceptionType::SEQUENCE: + return "SEQUENCE"; + default: + throw NotImplementedException(StringUtil::Format("Enum value: '%d' not implemented", value)); + } +} + +template<> +ExceptionType EnumUtil::FromString(const char *value) { + if (StringUtil::Equals(value, "INVALID")) { + return ExceptionType::INVALID; + } + if (StringUtil::Equals(value, "OUT_OF_RANGE")) { + return ExceptionType::OUT_OF_RANGE; + } + if (StringUtil::Equals(value, "CONVERSION")) { + return ExceptionType::CONVERSION; + } + if (StringUtil::Equals(value, "UNKNOWN_TYPE")) { + return ExceptionType::UNKNOWN_TYPE; + } + if (StringUtil::Equals(value, "DECIMAL")) { + return ExceptionType::DECIMAL; + } + if (StringUtil::Equals(value, "MISMATCH_TYPE")) { + return ExceptionType::MISMATCH_TYPE; + } + if (StringUtil::Equals(value, "DIVIDE_BY_ZERO")) { + return ExceptionType::DIVIDE_BY_ZERO; + } + if (StringUtil::Equals(value, "OBJECT_SIZE")) { + return ExceptionType::OBJECT_SIZE; + } + if (StringUtil::Equals(value, "INVALID_TYPE")) { + return ExceptionType::INVALID_TYPE; + } + if (StringUtil::Equals(value, "SERIALIZATION")) { + return ExceptionType::SERIALIZATION; + } + if (StringUtil::Equals(value, "TRANSACTION")) { + return ExceptionType::TRANSACTION; + } + if (StringUtil::Equals(value, "NOT_IMPLEMENTED")) { + return ExceptionType::NOT_IMPLEMENTED; + } + if (StringUtil::Equals(value, "EXPRESSION")) { + return ExceptionType::EXPRESSION; + } + if (StringUtil::Equals(value, "CATALOG")) { + return ExceptionType::CATALOG; + } + if (StringUtil::Equals(value, "PARSER")) { + return ExceptionType::PARSER; + } + if (StringUtil::Equals(value, "PLANNER")) { + return ExceptionType::PLANNER; + } + if (StringUtil::Equals(value, "SCHEDULER")) { + return ExceptionType::SCHEDULER; + } + if (StringUtil::Equals(value, "EXECUTOR")) { + return ExceptionType::EXECUTOR; + } + if (StringUtil::Equals(value, "CONSTRAINT")) { + return ExceptionType::CONSTRAINT; + } + if (StringUtil::Equals(value, "INDEX")) { + return ExceptionType::INDEX; + } + if (StringUtil::Equals(value, "STAT")) { + return ExceptionType::STAT; + } + if (StringUtil::Equals(value, "CONNECTION")) { + return ExceptionType::CONNECTION; + } + if (StringUtil::Equals(value, "SYNTAX")) { + return ExceptionType::SYNTAX; + } + if (StringUtil::Equals(value, "SETTINGS")) { + return ExceptionType::SETTINGS; + } + if (StringUtil::Equals(value, "BINDER")) { + return ExceptionType::BINDER; + } + if (StringUtil::Equals(value, "NETWORK")) { + return ExceptionType::NETWORK; + } + if (StringUtil::Equals(value, "OPTIMIZER")) { + return ExceptionType::OPTIMIZER; + } + if (StringUtil::Equals(value, "NULL_POINTER")) { + return ExceptionType::NULL_POINTER; + } + if (StringUtil::Equals(value, "IO")) { + return ExceptionType::IO; + } + if (StringUtil::Equals(value, "INTERRUPT")) { + return ExceptionType::INTERRUPT; + } + if (StringUtil::Equals(value, "FATAL")) { + return ExceptionType::FATAL; + } + if (StringUtil::Equals(value, "INTERNAL")) { + return ExceptionType::INTERNAL; + } + if (StringUtil::Equals(value, "INVALID_INPUT")) { + return ExceptionType::INVALID_INPUT; + } + if (StringUtil::Equals(value, "OUT_OF_MEMORY")) { + return ExceptionType::OUT_OF_MEMORY; + } + if (StringUtil::Equals(value, "PERMISSION")) { + return ExceptionType::PERMISSION; + } + if (StringUtil::Equals(value, "PARAMETER_NOT_RESOLVED")) { + return ExceptionType::PARAMETER_NOT_RESOLVED; + } + if (StringUtil::Equals(value, "PARAMETER_NOT_ALLOWED")) { + return ExceptionType::PARAMETER_NOT_ALLOWED; + } + if (StringUtil::Equals(value, "DEPENDENCY")) { + return ExceptionType::DEPENDENCY; + } + if (StringUtil::Equals(value, "HTTP")) { + return ExceptionType::HTTP; + } + if (StringUtil::Equals(value, "MISSING_EXTENSION")) { + return ExceptionType::MISSING_EXTENSION; + } + if (StringUtil::Equals(value, "AUTOLOAD")) { + return ExceptionType::AUTOLOAD; + } + if (StringUtil::Equals(value, "SEQUENCE")) { + return ExceptionType::SEQUENCE; + } + throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); +} + template<> const char* EnumUtil::ToChars(ExplainOutputType value) { switch(value) { @@ -1762,6 +2012,8 @@ const char* EnumUtil::ToChars(ExpressionClass value) { return "BOUND_LAMBDA_REF"; case ExpressionClass::BOUND_EXPRESSION: return "BOUND_EXPRESSION"; + case ExpressionClass::BOUND_EXPANDED: + return "BOUND_EXPANDED"; default: throw NotImplementedException(StringUtil::Format("Enum value: '%d' not implemented", value)); } @@ -1886,6 +2138,9 @@ ExpressionClass EnumUtil::FromString(const char *value) { if (StringUtil::Equals(value, "BOUND_EXPRESSION")) { return ExpressionClass::BOUND_EXPRESSION; } + if (StringUtil::Equals(value, "BOUND_EXPANDED")) { + return ExpressionClass::BOUND_EXPANDED; + } throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); } @@ -2028,6 +2283,8 @@ const char* EnumUtil::ToChars(ExpressionType value) { return "POSITIONAL_REFERENCE"; case ExpressionType::BOUND_LAMBDA_REF: return "BOUND_LAMBDA_REF"; + case ExpressionType::BOUND_EXPANDED: + return "BOUND_EXPANDED"; default: throw NotImplementedException(StringUtil::Format("Enum value: '%d' not implemented", value)); } @@ -2239,6 +2496,9 @@ ExpressionType EnumUtil::FromString(const char *value) { if (StringUtil::Equals(value, "BOUND_LAMBDA_REF")) { return ExpressionType::BOUND_LAMBDA_REF; } + if (StringUtil::Equals(value, "BOUND_EXPANDED")) { + return ExpressionType::BOUND_EXPANDED; + } throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); } @@ -2270,6 +2530,24 @@ ExtensionLoadResult EnumUtil::FromString(const char *value) throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); } +template<> +const char* EnumUtil::ToChars(ExternalDependenciesType value) { + switch(value) { + case ExternalDependenciesType::PYTHON_DEPENDENCY: + return "PYTHON_DEPENDENCY"; + default: + throw NotImplementedException(StringUtil::Format("Enum value: '%d' not implemented", value)); + } +} + +template<> +ExternalDependenciesType EnumUtil::FromString(const char *value) { + if (StringUtil::Equals(value, "PYTHON_DEPENDENCY")) { + return ExternalDependenciesType::PYTHON_DEPENDENCY; + } + throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); +} + template<> const char* EnumUtil::ToChars(ExtraDropInfoType value) { switch(value) { @@ -4119,6 +4397,8 @@ const char* EnumUtil::ToChars(ParseInfoType value) { return "COMMENT_ON_INFO"; case ParseInfoType::COMMENT_ON_COLUMN_INFO: return "COMMENT_ON_COLUMN_INFO"; + case ParseInfoType::COPY_DATABASE_INFO: + return "COPY_DATABASE_INFO"; default: throw NotImplementedException(StringUtil::Format("Enum value: '%d' not implemented", value)); } @@ -4171,6 +4451,9 @@ ParseInfoType EnumUtil::FromString(const char *value) { if (StringUtil::Equals(value, "COMMENT_ON_COLUMN_INFO")) { return ParseInfoType::COMMENT_ON_COLUMN_INFO; } + if (StringUtil::Equals(value, "COPY_DATABASE_INFO")) { + return ParseInfoType::COPY_DATABASE_INFO; + } throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); } @@ -5301,6 +5584,29 @@ SampleMethod EnumUtil::FromString(const char *value) { throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); } +template<> +const char* EnumUtil::ToChars(ScanType value) { + switch(value) { + case ScanType::TABLE: + return "TABLE"; + case ScanType::PARQUET: + return "PARQUET"; + default: + throw NotImplementedException(StringUtil::Format("Enum value: '%d' not implemented", value)); + } +} + +template<> +ScanType EnumUtil::FromString(const char *value) { + if (StringUtil::Equals(value, "TABLE")) { + return ScanType::TABLE; + } + if (StringUtil::Equals(value, "PARQUET")) { + return ScanType::PARQUET; + } + throw NotImplementedException(StringUtil::Format("Enum value: '%s' not implemented", value)); +} + template<> const char* EnumUtil::ToChars(SecretDisplayType value) { switch(value) { diff --git a/src/duckdb/src/common/enums/expression_type.cpp b/src/duckdb/src/common/enums/expression_type.cpp index c017b505..105f4dfa 100644 --- a/src/duckdb/src/common/enums/expression_type.cpp +++ b/src/duckdb/src/common/enums/expression_type.cpp @@ -141,6 +141,8 @@ string ExpressionTypeToString(ExpressionType type) { return "LAMBDA"; case ExpressionType::ARROW: return "ARROW"; + case ExpressionType::BOUND_EXPANDED: + return "BOUND_EXPANDED"; case ExpressionType::INVALID: break; } @@ -224,6 +226,8 @@ string ExpressionClassToString(ExpressionClass type) { return "BOUND_LAMBDA"; case ExpressionClass::BOUND_EXPRESSION: return "BOUND_EXPRESSION"; + case ExpressionClass::BOUND_EXPANDED: + return "BOUND_EXPANDED"; default: return "ExpressionClass::!!UNIMPLEMENTED_CASE!!"; } diff --git a/src/duckdb/src/common/enums/optimizer_type.cpp b/src/duckdb/src/common/enums/optimizer_type.cpp index 828d7eac..d3f13108 100644 --- a/src/duckdb/src/common/enums/optimizer_type.cpp +++ b/src/duckdb/src/common/enums/optimizer_type.cpp @@ -10,7 +10,7 @@ struct DefaultOptimizerType { OptimizerType type; }; -static DefaultOptimizerType internal_optimizer_types[] = { +static const DefaultOptimizerType internal_optimizer_types[] = { {"expression_rewriter", OptimizerType::EXPRESSION_REWRITER}, {"filter_pullup", OptimizerType::FILTER_PULLUP}, {"filter_pushdown", OptimizerType::FILTER_PUSHDOWN}, diff --git a/src/duckdb/src/common/file_system.cpp b/src/duckdb/src/common/file_system.cpp index f2124165..d2288b42 100644 --- a/src/duckdb/src/common/file_system.cpp +++ b/src/duckdb/src/common/file_system.cpp @@ -45,6 +45,41 @@ extern "C" WINBASEAPI BOOL WINAPI GetPhysicallyInstalledSystemMemory(PULONGLONG) namespace duckdb { +constexpr FileOpenFlags FileFlags::FILE_FLAGS_READ; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_WRITE; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_DIRECT_IO; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_FILE_CREATE; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_FILE_CREATE_NEW; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_APPEND; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_PRIVATE; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_NULL_IF_NOT_EXISTS; +constexpr FileOpenFlags FileFlags::FILE_FLAGS_PARALLEL_ACCESS; + +void FileOpenFlags::Verify() { +#ifdef DEBUG + bool is_read = flags & FileOpenFlags::FILE_FLAGS_READ; + bool is_write = flags & FileOpenFlags::FILE_FLAGS_WRITE; + bool is_create = + (flags & FileOpenFlags::FILE_FLAGS_FILE_CREATE) || (flags & FileOpenFlags::FILE_FLAGS_FILE_CREATE_NEW); + bool is_private = (flags & FileOpenFlags::FILE_FLAGS_PRIVATE); + bool null_if_not_exists = flags & FileOpenFlags::FILE_FLAGS_NULL_IF_NOT_EXISTS; + + // require either READ or WRITE (or both) + D_ASSERT(is_read || is_write); + // CREATE/Append flags require writing + D_ASSERT(is_write || !(flags & FileOpenFlags::FILE_FLAGS_APPEND)); + D_ASSERT(is_write || !(flags & FileOpenFlags::FILE_FLAGS_FILE_CREATE)); + D_ASSERT(is_write || !(flags & FileOpenFlags::FILE_FLAGS_FILE_CREATE_NEW)); + // cannot combine CREATE and CREATE_NEW flags + D_ASSERT(!(flags & FileOpenFlags::FILE_FLAGS_FILE_CREATE && flags & FileOpenFlags::FILE_FLAGS_FILE_CREATE_NEW)); + + // For is_private can only be set along with a create flag + D_ASSERT(!is_private || is_create); + // FILE_FLAGS_NULL_IF_NOT_EXISTS cannot be combined with CREATE/CREATE_NEW + D_ASSERT(!(null_if_not_exists && is_create)); +#endif +} + FileSystem::~FileSystem() { } @@ -82,7 +117,7 @@ void FileSystem::SetWorkingDirectory(const string &path) { } } -idx_t FileSystem::GetAvailableMemory() { +optional_idx FileSystem::GetAvailableMemory() { errno = 0; #ifdef __MVS__ @@ -93,7 +128,7 @@ idx_t FileSystem::GetAvailableMemory() { idx_t max_memory = MinValue((idx_t)sysconf(_SC_PHYS_PAGES) * (idx_t)sysconf(_SC_PAGESIZE), UINTPTR_MAX); #endif if (errno != 0) { - return DConstants::INVALID_INDEX; + return optional_idx(); } return max_memory; } @@ -183,7 +218,7 @@ void FileSystem::SetWorkingDirectory(const string &path) { } } -idx_t FileSystem::GetAvailableMemory() { +optional_idx FileSystem::GetAvailableMemory() { ULONGLONG available_memory_kb; if (GetPhysicallyInstalledSystemMemory(&available_memory_kb)) { return MinValue(available_memory_kb * 1000, UINTPTR_MAX); @@ -195,7 +230,7 @@ idx_t FileSystem::GetAvailableMemory() { if (GlobalMemoryStatusEx(&mem_state)) { return MinValue(mem_state.ullTotalPhys, UINTPTR_MAX); } - return DConstants::INVALID_INDEX; + return optional_idx(); } string FileSystem::GetWorkingDirectory() { @@ -286,8 +321,7 @@ string FileSystem::ExpandPath(const string &path) { } // LCOV_EXCL_START -unique_ptr FileSystem::OpenFile(const string &path, uint8_t flags, FileLockType lock, - FileCompressionType compression, FileOpener *opener) { +unique_ptr FileSystem::OpenFile(const string &path, FileOpenFlags flags, optional_ptr opener) { throw NotImplementedException("%s: OpenFile is not implemented!", GetName()); } @@ -295,6 +329,11 @@ void FileSystem::Read(FileHandle &handle, void *buffer, int64_t nr_bytes, idx_t throw NotImplementedException("%s: Read (with location) is not implemented!", GetName()); } +bool FileSystem::Trim(FileHandle &handle, idx_t offset_bytes, idx_t length_bytes) { + // This is not a required method. Derived FileSystems may optionally override/implement. + return false; +} + void FileSystem::Write(FileHandle &handle, void *buffer, int64_t nr_bytes, idx_t location) { throw NotImplementedException("%s: Write (with location) is not implemented!", GetName()); } @@ -323,15 +362,15 @@ void FileSystem::Truncate(FileHandle &handle, int64_t new_size) { throw NotImplementedException("%s: Truncate is not implemented!", GetName()); } -bool FileSystem::DirectoryExists(const string &directory) { +bool FileSystem::DirectoryExists(const string &directory, optional_ptr opener) { throw NotImplementedException("%s: DirectoryExists is not implemented!", GetName()); } -void FileSystem::CreateDirectory(const string &directory) { +void FileSystem::CreateDirectory(const string &directory, optional_ptr opener) { throw NotImplementedException("%s: CreateDirectory is not implemented!", GetName()); } -void FileSystem::RemoveDirectory(const string &directory) { +void FileSystem::RemoveDirectory(const string &directory, optional_ptr opener) { throw NotImplementedException("%s: RemoveDirectory is not implemented!", GetName()); } @@ -340,19 +379,19 @@ bool FileSystem::ListFiles(const string &directory, const std::function opener) { throw NotImplementedException("%s: MoveFile is not implemented!", GetName()); } -bool FileSystem::FileExists(const string &filename) { +bool FileSystem::FileExists(const string &filename, optional_ptr opener) { throw NotImplementedException("%s: FileExists is not implemented!", GetName()); } -bool FileSystem::IsPipe(const string &filename) { +bool FileSystem::IsPipe(const string &filename, optional_ptr opener) { return false; } -void FileSystem::RemoveFile(const string &filename) { +void FileSystem::RemoveFile(const string &filename, optional_ptr opener) { throw NotImplementedException("%s: RemoveFile is not implemented!", GetName()); } @@ -458,6 +497,10 @@ bool FileSystem::CanSeek() { throw NotImplementedException("%s: CanSeek is not implemented!", GetName()); } +bool FileSystem::IsManuallySet() { + return false; +} + unique_ptr FileSystem::OpenCompressedFile(unique_ptr handle, bool write) { throw NotImplementedException("%s: OpenCompressedFile is not implemented!", GetName()); } @@ -477,6 +520,10 @@ int64_t FileHandle::Read(void *buffer, idx_t nr_bytes) { return file_system.Read(*this, buffer, nr_bytes); } +bool FileHandle::Trim(idx_t offset_bytes, idx_t length_bytes) { + return file_system.Trim(*this, offset_bytes, length_bytes); +} + int64_t FileHandle::Write(void *buffer, idx_t nr_bytes) { return file_system.Write(*this, buffer, nr_bytes); } diff --git a/src/duckdb/src/common/filename_pattern.cpp b/src/duckdb/src/common/filename_pattern.cpp index e52b9a61..89cc6c63 100644 --- a/src/duckdb/src/common/filename_pattern.cpp +++ b/src/duckdb/src/common/filename_pattern.cpp @@ -7,34 +7,34 @@ void FilenamePattern::SetFilenamePattern(const string &pattern) { const string id_format {"{i}"}; const string uuid_format {"{uuid}"}; - _base = pattern; + base = pattern; - _pos = _base.find(id_format); - if (_pos != string::npos) { - _base = StringUtil::Replace(_base, id_format, ""); - _uuid = false; + pos = base.find(id_format); + if (pos != string::npos) { + base = StringUtil::Replace(base, id_format, ""); + uuid = false; } - _pos = _base.find(uuid_format); - if (_pos != string::npos) { - _base = StringUtil::Replace(_base, uuid_format, ""); - _uuid = true; + pos = base.find(uuid_format); + if (pos != string::npos) { + base = StringUtil::Replace(base, uuid_format, ""); + uuid = true; } - _pos = std::min(_pos, (idx_t)_base.length()); + pos = std::min(pos, (idx_t)base.length()); } string FilenamePattern::CreateFilename(FileSystem &fs, const string &path, const string &extension, idx_t offset) const { - string result(_base); + string result(base); string replacement; - if (_uuid) { + if (uuid) { replacement = UUID::ToString(UUID::GenerateRandomUUID()); } else { replacement = std::to_string(offset); } - result.insert(_pos, replacement); + result.insert(pos, replacement); return fs.JoinPath(path, result + "." + extension); } diff --git a/src/duckdb/src/common/gzip_file_system.cpp b/src/duckdb/src/common/gzip_file_system.cpp index a5497bfe..d24d5e57 100644 --- a/src/duckdb/src/common/gzip_file_system.cpp +++ b/src/duckdb/src/common/gzip_file_system.cpp @@ -92,7 +92,7 @@ MiniZStreamWrapper::~MiniZStreamWrapper() { } try { MiniZStreamWrapper::Close(); - } catch (...) { + } catch (...) { // NOLINT - cannot throw in exception } } diff --git a/src/duckdb/src/common/http_state.cpp b/src/duckdb/src/common/http_state.cpp index 0c692086..b07c0d4b 100644 --- a/src/duckdb/src/common/http_state.cpp +++ b/src/duckdb/src/common/http_state.cpp @@ -74,7 +74,7 @@ shared_ptr HTTPState::TryGetState(ClientContext &context, bool create return http_state; } -shared_ptr HTTPState::TryGetState(FileOpener *opener, bool create_on_missing) { +shared_ptr HTTPState::TryGetState(optional_ptr opener, bool create_on_missing) { auto client_context = FileOpener::TryGetClientContext(opener); if (client_context) { return TryGetState(*client_context, create_on_missing); diff --git a/src/duckdb/src/common/local_file_system.cpp b/src/duckdb/src/common/local_file_system.cpp index 51d91043..9345ed4d 100644 --- a/src/duckdb/src/common/local_file_system.cpp +++ b/src/duckdb/src/common/local_file_system.cpp @@ -40,43 +40,23 @@ extern "C" WINBASEAPI BOOL WINAPI GetPhysicallyInstalledSystemMemory(PULONGLONG) #endif #if defined(__linux__) +#include #include // See e.g.: // https://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/TargetConditionals.h.auto.html #elif defined(__APPLE__) -#include // NOLINT -#if not(defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1) // NOLINT -#include // NOLINT -#endif // NOLINT +#include +#if not(defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1) +#include +#endif #elif defined(_WIN32) #include #endif namespace duckdb { -static void AssertValidFileFlags(uint8_t flags) { -#ifdef DEBUG - bool is_read = flags & FileFlags::FILE_FLAGS_READ; - bool is_write = flags & FileFlags::FILE_FLAGS_WRITE; - bool is_create = (flags & FileFlags::FILE_FLAGS_FILE_CREATE) || (flags & FileFlags::FILE_FLAGS_FILE_CREATE_NEW); - bool is_private = (flags & FileFlags::FILE_FLAGS_PRIVATE); - - // require either READ or WRITE (or both) - D_ASSERT(is_read || is_write); - // CREATE/Append flags require writing - D_ASSERT(is_write || !(flags & FileFlags::FILE_FLAGS_APPEND)); - D_ASSERT(is_write || !(flags & FileFlags::FILE_FLAGS_FILE_CREATE)); - D_ASSERT(is_write || !(flags & FileFlags::FILE_FLAGS_FILE_CREATE_NEW)); - // cannot combine CREATE and CREATE_NEW flags - D_ASSERT(!(flags & FileFlags::FILE_FLAGS_FILE_CREATE && flags & FileFlags::FILE_FLAGS_FILE_CREATE_NEW)); - - // For is_private can only be set along with a create flag - D_ASSERT(!is_private || is_create); -#endif -} - #ifndef _WIN32 -bool LocalFileSystem::FileExists(const string &filename) { +bool LocalFileSystem::FileExists(const string &filename, optional_ptr opener) { if (!filename.empty()) { if (access(filename.c_str(), 0) == 0) { struct stat status; @@ -90,7 +70,7 @@ bool LocalFileSystem::FileExists(const string &filename) { return false; } -bool LocalFileSystem::IsPipe(const string &filename) { +bool LocalFileSystem::IsPipe(const string &filename, optional_ptr opener) { if (!filename.empty()) { if (access(filename.c_str(), 0) == 0) { struct stat status; @@ -105,7 +85,7 @@ bool LocalFileSystem::IsPipe(const string &filename) { } #else -bool LocalFileSystem::FileExists(const string &filename) { +bool LocalFileSystem::FileExists(const string &filename, optional_ptr opener) { auto unicode_path = WindowsUtil::UTF8ToUnicode(filename.c_str()); const wchar_t *wpath = unicode_path.c_str(); if (_waccess(wpath, 0) == 0) { @@ -117,7 +97,7 @@ bool LocalFileSystem::FileExists(const string &filename) { } return false; } -bool LocalFileSystem::IsPipe(const string &filename) { +bool LocalFileSystem::IsPipe(const string &filename, optional_ptr opener) { auto unicode_path = WindowsUtil::UTF8ToUnicode(filename.c_str()); const wchar_t *wpath = unicode_path.c_str(); if (_waccess(wpath, 0) == 0) { @@ -233,7 +213,7 @@ static string AdditionalProcessInfo(FileSystem &fs, pid_t pid) { try { auto cmdline_file = fs.OpenFile(StringUtil::Format("/proc/%d/cmdline", pid), FileFlags::FILE_FLAGS_READ); auto cmdline = cmdline_file->ReadLine(); - process_name = basename(const_cast(cmdline.c_str())); + process_name = basename(const_cast(cmdline.c_str())); // NOLINT: old C API does not take const } catch (std::exception &) { // ignore } @@ -292,19 +272,19 @@ bool LocalFileSystem::IsPrivateFile(const string &path_p, FileOpener *opener) { return true; } -unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t flags, FileLockType lock_type, - FileCompressionType compression, FileOpener *opener) { +unique_ptr LocalFileSystem::OpenFile(const string &path_p, FileOpenFlags flags, + optional_ptr opener) { auto path = FileSystem::ExpandPath(path_p, opener); - if (compression != FileCompressionType::UNCOMPRESSED) { + if (flags.Compression() != FileCompressionType::UNCOMPRESSED) { throw NotImplementedException("Unsupported compression type for default file system"); } - AssertValidFileFlags(flags); + flags.Verify(); int open_flags = 0; int rc; - bool open_read = flags & FileFlags::FILE_FLAGS_READ; - bool open_write = flags & FileFlags::FILE_FLAGS_WRITE; + bool open_read = flags.OpenForReading(); + bool open_write = flags.OpenForWriting(); if (open_read && open_write) { open_flags = O_RDWR; } else if (open_read) { @@ -316,18 +296,18 @@ unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t f } if (open_write) { // need Read or Write - D_ASSERT(flags & FileFlags::FILE_FLAGS_WRITE); + D_ASSERT(flags.OpenForWriting()); open_flags |= O_CLOEXEC; - if (flags & FileFlags::FILE_FLAGS_FILE_CREATE) { + if (flags.CreateFileIfNotExists()) { open_flags |= O_CREAT; - } else if (flags & FileFlags::FILE_FLAGS_FILE_CREATE_NEW) { + } else if (flags.OverwriteExistingFile()) { open_flags |= O_CREAT | O_TRUNC; } - if (flags & FileFlags::FILE_FLAGS_APPEND) { + if (flags.OpenForAppending()) { open_flags |= O_APPEND; } } - if (flags & FileFlags::FILE_FLAGS_DIRECT_IO) { + if (flags.DirectIO()) { #if defined(__sun) && defined(__SVR4) throw InvalidInputException("DIRECT_IO not supported on Solaris"); #endif @@ -341,7 +321,7 @@ unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t f // Determine permissions mode_t filesec; - if (flags & FileFlags::FILE_FLAGS_PRIVATE) { + if (flags.CreatePrivateFile()) { open_flags |= O_EXCL; // Ensure we error on existing files or the permissions may not set filesec = 0600; } else { @@ -352,6 +332,9 @@ unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t f int fd = open(path.c_str(), open_flags, filesec); if (fd == -1) { + if (flags.ReturnNullIfNotExists() && errno == ENOENT) { + return nullptr; + } throw IOException("Cannot open file \"%s\": %s", {{"errno", std::to_string(errno)}}, path, strerror(errno)); } // #if defined(__DARWIN__) || defined(__APPLE__) @@ -363,14 +346,14 @@ unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t f // } // } // #endif - if (lock_type != FileLockType::NO_LOCK) { + if (flags.Lock() != FileLockType::NO_LOCK) { // set lock on file // but only if it is not an input/output stream auto file_type = GetFileTypeInternal(fd); if (file_type != FileType::FILE_TYPE_FIFO && file_type != FileType::FILE_TYPE_SOCKET) { struct flock fl; memset(&fl, 0, sizeof fl); - fl.l_type = lock_type == FileLockType::READ_LOCK ? F_RDLCK : F_WRLCK; + fl.l_type = flags.Lock() == FileLockType::READ_LOCK ? F_RDLCK : F_WRLCK; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; @@ -387,7 +370,7 @@ unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t f message = AdditionalProcessInfo(*this, fl.l_pid); } - if (lock_type == FileLockType::WRITE_LOCK) { + if (flags.Lock() == FileLockType::WRITE_LOCK) { // maybe we can get a read lock instead and tell this to the user. fl.l_type = F_RDLCK; rc = fcntl(fd, F_SETLK, &fl); @@ -490,6 +473,16 @@ int64_t LocalFileSystem::Write(FileHandle &handle, void *buffer, int64_t nr_byte return bytes_written; } +bool LocalFileSystem::Trim(FileHandle &handle, idx_t offset_bytes, idx_t length_bytes) { +#if defined(__linux__) + int fd = handle.Cast().fd; + int res = fallocate(fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, offset_bytes, length_bytes); + return res == 0; +#else + return false; +#endif +} + int64_t LocalFileSystem::GetFileSize(FileHandle &handle) { int fd = handle.Cast().fd; struct stat s; @@ -521,7 +514,7 @@ void LocalFileSystem::Truncate(FileHandle &handle, int64_t new_size) { } } -bool LocalFileSystem::DirectoryExists(const string &directory) { +bool LocalFileSystem::DirectoryExists(const string &directory, optional_ptr opener) { if (!directory.empty()) { if (access(directory.c_str(), 0) == 0) { struct stat status; @@ -535,7 +528,7 @@ bool LocalFileSystem::DirectoryExists(const string &directory) { return false; } -void LocalFileSystem::CreateDirectory(const string &directory) { +void LocalFileSystem::CreateDirectory(const string &directory, optional_ptr opener) { struct stat st; if (stat(directory.c_str(), &st) != 0) { @@ -589,11 +582,11 @@ int RemoveDirectoryRecursive(const char *path) { return r; } -void LocalFileSystem::RemoveDirectory(const string &directory) { +void LocalFileSystem::RemoveDirectory(const string &directory, optional_ptr opener) { RemoveDirectoryRecursive(directory.c_str()); } -void LocalFileSystem::RemoveFile(const string &filename) { +void LocalFileSystem::RemoveFile(const string &filename, optional_ptr opener) { if (std::remove(filename.c_str()) != 0) { throw IOException("Could not remove file \"%s\": %s", {{"errno", std::to_string(errno)}}, filename, strerror(errno)); @@ -602,7 +595,7 @@ void LocalFileSystem::RemoveFile(const string &filename) { bool LocalFileSystem::ListFiles(const string &directory, const std::function &callback, FileOpener *opener) { - if (!DirectoryExists(directory)) { + if (!DirectoryExists(directory, opener)) { return false; } DIR *dir = opendir(directory.c_str()); @@ -642,7 +635,7 @@ void LocalFileSystem::FileSync(FileHandle &handle) { } } -void LocalFileSystem::MoveFile(const string &source, const string &target) { +void LocalFileSystem::MoveFile(const string &source, const string &target, optional_ptr opener) { //! FIXME: rename does not guarantee atomicity or overwriting target file if it exists if (rename(source.c_str(), target.c_str()) != 0) { throw IOException("Could not rename file!", {{"errno", std::to_string(errno)}}); @@ -766,20 +759,20 @@ bool LocalFileSystem::IsPrivateFile(const string &path_p, FileOpener *opener) { return true; } -unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t flags, FileLockType lock_type, - FileCompressionType compression, FileOpener *opener) { +unique_ptr LocalFileSystem::OpenFile(const string &path_p, FileOpenFlags flags, + optional_ptr opener) { auto path = FileSystem::ExpandPath(path_p, opener); - if (compression != FileCompressionType::UNCOMPRESSED) { + if (flags.Compression() != FileCompressionType::UNCOMPRESSED) { throw NotImplementedException("Unsupported compression type for default file system"); } - AssertValidFileFlags(flags); + flags.Verify(); DWORD desired_access; DWORD share_mode; DWORD creation_disposition = OPEN_EXISTING; DWORD flags_and_attributes = FILE_ATTRIBUTE_NORMAL; - bool open_read = flags & FileFlags::FILE_FLAGS_READ; - bool open_write = flags & FileFlags::FILE_FLAGS_WRITE; + bool open_read = flags.OpenForReading(); + bool open_write = flags.OpenForWriting(); if (open_read && open_write) { desired_access = GENERIC_READ | GENERIC_WRITE; share_mode = 0; @@ -793,30 +786,33 @@ unique_ptr LocalFileSystem::OpenFile(const string &path_p, uint8_t f throw InternalException("READ, WRITE or both should be specified when opening a file"); } if (open_write) { - if (flags & FileFlags::FILE_FLAGS_FILE_CREATE) { + if (flags.CreateFileIfNotExists()) { creation_disposition = OPEN_ALWAYS; - } else if (flags & FileFlags::FILE_FLAGS_FILE_CREATE_NEW) { + } else if (flags.OverwriteExistingFile()) { creation_disposition = CREATE_ALWAYS; } } - if (flags & FileFlags::FILE_FLAGS_DIRECT_IO) { + if (flags.DirectIO()) { flags_and_attributes |= FILE_FLAG_NO_BUFFERING; } auto unicode_path = WindowsUtil::UTF8ToUnicode(path.c_str()); HANDLE hFile = CreateFileW(unicode_path.c_str(), desired_access, share_mode, NULL, creation_disposition, flags_and_attributes, NULL); if (hFile == INVALID_HANDLE_VALUE) { + if (flags.ReturnNullIfNotExists() && GetLastError() == ERROR_FILE_NOT_FOUND) { + return nullptr; + } auto error = LocalFileSystem::GetLastErrorAsString(); auto better_error = AdditionalLockInfo(unicode_path); if (!better_error.empty()) { throw IOException(better_error); + } else { + throw IOException("Cannot open file \"%s\": %s", path.c_str(), error); } - - throw IOException("Cannot open file \"%s\": %s", path.c_str(), error); } auto handle = make_uniq(*this, path.c_str(), hFile); - if (flags & FileFlags::FILE_FLAGS_APPEND) { + if (flags.OpenForAppending()) { auto file_size = GetFileSize(*handle); SetFilePointer(*handle, file_size); } @@ -920,6 +916,11 @@ int64_t LocalFileSystem::Write(FileHandle &handle, void *buffer, int64_t nr_byte return bytes_written; } +bool LocalFileSystem::Trim(FileHandle &handle, idx_t offset_bytes, idx_t length_bytes) { + // TODO: Not yet implemented on windows. + return false; +} + int64_t LocalFileSystem::GetFileSize(FileHandle &handle) { HANDLE hFile = handle.Cast().fd; LARGE_INTEGER result; @@ -971,12 +972,12 @@ static DWORD WindowsGetFileAttributes(const string &filename) { return GetFileAttributesW(unicode_path.c_str()); } -bool LocalFileSystem::DirectoryExists(const string &directory) { +bool LocalFileSystem::DirectoryExists(const string &directory, optional_ptr opener) { DWORD attrs = WindowsGetFileAttributes(directory); return (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY)); } -void LocalFileSystem::CreateDirectory(const string &directory) { +void LocalFileSystem::CreateDirectory(const string &directory, optional_ptr opener) { if (DirectoryExists(directory)) { return; } @@ -1001,7 +1002,7 @@ static void DeleteDirectoryRecursive(FileSystem &fs, string directory) { } } -void LocalFileSystem::RemoveDirectory(const string &directory) { +void LocalFileSystem::RemoveDirectory(const string &directory, optional_ptr opener) { if (FileExists(directory)) { throw IOException("Attempting to delete directory \"%s\", but it is a file and not a directory!", directory); } @@ -1011,7 +1012,7 @@ void LocalFileSystem::RemoveDirectory(const string &directory) { DeleteDirectoryRecursive(*this, directory.c_str()); } -void LocalFileSystem::RemoveFile(const string &filename) { +void LocalFileSystem::RemoveFile(const string &filename, optional_ptr opener) { auto unicode_path = WindowsUtil::UTF8ToUnicode(filename.c_str()); if (!DeleteFileW(unicode_path.c_str())) { auto error = LocalFileSystem::GetLastErrorAsString(); @@ -1055,7 +1056,7 @@ void LocalFileSystem::FileSync(FileHandle &handle) { } } -void LocalFileSystem::MoveFile(const string &source, const string &target) { +void LocalFileSystem::MoveFile(const string &source, const string &target, optional_ptr opener) { auto source_unicode = WindowsUtil::UTF8ToUnicode(source.c_str()); auto target_unicode = WindowsUtil::UTF8ToUnicode(target.c_str()); if (!MoveFileW(source_unicode.c_str(), target_unicode.c_str())) { @@ -1162,7 +1163,7 @@ static void GlobFilesInternal(FileSystem &fs, const string &path, const string & vector LocalFileSystem::FetchFileWithoutGlob(const string &path, FileOpener *opener, bool absolute_path) { vector result; - if (FileExists(path) || IsPipe(path)) { + if (FileExists(path, opener) || IsPipe(path, opener)) { result.push_back(path); } else if (!absolute_path) { Value value; @@ -1171,7 +1172,7 @@ vector LocalFileSystem::FetchFileWithoutGlob(const string &path, FileOpe vector search_paths = StringUtil::Split(search_paths_str, ','); for (const auto &search_path : search_paths) { auto joined_path = JoinPath(search_path, path); - if (FileExists(joined_path) || IsPipe(joined_path)) { + if (FileExists(joined_path, opener) || IsPipe(joined_path, opener)) { result.push_back(joined_path); } } @@ -1262,7 +1263,7 @@ vector LocalFileSystem::Glob(const string &path, FileOpener *opener) { if (is_last_chunk) { for (auto &prev_directory : previous_directories) { const string filename = JoinPath(prev_directory, splits[i]); - if (FileExists(filename) || DirectoryExists(filename)) { + if (FileExists(filename, opener) || DirectoryExists(filename, opener)) { result.push_back(filename); } } diff --git a/src/duckdb/src/common/multi_file_reader.cpp b/src/duckdb/src/common/multi_file_reader.cpp index bbb59705..2aa6521f 100644 --- a/src/duckdb/src/common/multi_file_reader.cpp +++ b/src/duckdb/src/common/multi_file_reader.cpp @@ -172,7 +172,7 @@ MultiFileReaderBindData MultiFileReader::BindOptions(MultiFileReaderOptions &opt } for (auto &part : partitions) { - idx_t hive_partitioning_index = DConstants::INVALID_INDEX; + idx_t hive_partitioning_index; auto lookup = std::find(names.begin(), names.end(), part.first); if (lookup != names.end()) { // hive partitioning column also exists in file - override @@ -421,39 +421,59 @@ bool MultiFileReaderOptions::AutoDetectHivePartitioningInternal(const vector &files, ClientContext &context) { + const LogicalType candidates[] = {LogicalType::DATE, LogicalType::TIMESTAMP, LogicalType::BIGINT}; + auto &fs = FileSystem::GetFileSystem(context); - std::map partitions; - auto splits = StringUtil::Split(file, fs.PathSeparator(file)); - if (splits.size() < 2) { - return; - } - for (auto it = splits.begin(); it != std::prev(splits.end()); it++) { - auto part = StringUtil::Split(*it, "="); - if (part.size() == 2) { - partitions[part.front()] = part.back(); + unordered_map detected_types; + for (auto &file : files) { + unordered_map partitions; + auto splits = StringUtil::Split(file, fs.PathSeparator(file)); + if (splits.size() < 2) { + return; } - } - if (partitions.empty()) { - return; - } - - const LogicalType candidates[] = {LogicalType::DATE, LogicalType::TIMESTAMP, LogicalType::BIGINT}; - for (auto &part : partitions) { - const string &name = part.first; - if (hive_types_schema.find(name) != hive_types_schema.end()) { - continue; + for (auto it = splits.begin(); it != std::prev(splits.end()); it++) { + auto part = StringUtil::Split(*it, "="); + if (part.size() == 2) { + partitions[part.front()] = part.back(); + } } - Value value(part.second); - for (auto &candidate : candidates) { - const bool success = value.TryCastAs(context, candidate, true); - if (success) { - hive_types_schema[name] = candidate; - break; + if (partitions.empty()) { + return; + } + + for (auto &part : partitions) { + const string &name = part.first; + if (hive_types_schema.find(name) != hive_types_schema.end()) { + // type was explicitly provided by the user + continue; + } + LogicalType detected_type = LogicalType::VARCHAR; + Value value(part.second); + for (auto &candidate : candidates) { + const bool success = value.TryCastAs(context, candidate, true); + if (success) { + detected_type = candidate; + break; + } + } + auto entry = detected_types.find(name); + if (entry == detected_types.end()) { + // type was not yet detected - insert it + detected_types.insert(make_pair(name, std::move(detected_type))); + } else { + // type was already detected - check if the type matches + // if not promote to VARCHAR + if (entry->second != detected_type) { + entry->second = LogicalType::VARCHAR; + } } } } + for (auto &entry : detected_types) { + hive_types_schema.insert(make_pair(entry.first, std::move(entry.second))); + } } void MultiFileReaderOptions::AutoDetectHivePartitioning(const vector &files, ClientContext &context) { D_ASSERT(!files.empty()); @@ -471,7 +491,7 @@ void MultiFileReaderOptions::AutoDetectHivePartitioning(const vector &fi hive_partitioning = AutoDetectHivePartitioningInternal(files, context); } if (hive_partitioning && hive_types_autocast) { - AutoDetectHiveTypesInternal(files.front(), context); + AutoDetectHiveTypesInternal(files, context); } } void MultiFileReaderOptions::VerifyHiveTypesArePartitions(const std::map &partitions) const { diff --git a/src/duckdb/src/common/row_operations/row_matcher.cpp b/src/duckdb/src/common/row_operations/row_matcher.cpp index 8b13ef1a..23b16946 100644 --- a/src/duckdb/src/common/row_operations/row_matcher.cpp +++ b/src/duckdb/src/common/row_operations/row_matcher.cpp @@ -120,13 +120,13 @@ static idx_t SelectComparison(Vector &, Vector &, const SelectionVector &, idx_t template <> idx_t SelectComparison(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, SelectionVector *true_sel, SelectionVector *false_sel) { - return VectorOperations::NestedEquals(left, right, sel, count, true_sel, false_sel); + return VectorOperations::NestedEquals(left, right, &sel, count, true_sel, false_sel); } template <> idx_t SelectComparison(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, SelectionVector *true_sel, SelectionVector *false_sel) { - return VectorOperations::NestedNotEquals(left, right, sel, count, true_sel, false_sel); + return VectorOperations::NestedNotEquals(left, right, &sel, count, true_sel, false_sel); } template <> diff --git a/src/duckdb/src/common/serializer/buffered_file_reader.cpp b/src/duckdb/src/common/serializer/buffered_file_reader.cpp index ce76c354..762e1ca8 100644 --- a/src/duckdb/src/common/serializer/buffered_file_reader.cpp +++ b/src/duckdb/src/common/serializer/buffered_file_reader.cpp @@ -10,7 +10,13 @@ namespace duckdb { BufferedFileReader::BufferedFileReader(FileSystem &fs, const char *path, FileLockType lock_type, optional_ptr opener) : fs(fs), data(make_unsafe_uniq_array(FILE_BUFFER_SIZE)), offset(0), read_data(0), total_read(0) { - handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_READ, lock_type, FileSystem::DEFAULT_COMPRESSION, opener.get()); + handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_READ | lock_type, opener.get()); + file_size = fs.GetFileSize(*handle); +} + +BufferedFileReader::BufferedFileReader(FileSystem &fs, unique_ptr handle_p) + : fs(fs), data(make_unsafe_uniq_array(FILE_BUFFER_SIZE)), offset(0), read_data(0), + handle(std::move(handle_p)), total_read(0) { file_size = fs.GetFileSize(*handle); } @@ -51,6 +57,12 @@ void BufferedFileReader::Seek(uint64_t location) { read_data = offset = 0; } +void BufferedFileReader::Reset() { + handle->Reset(); + total_read = 0; + read_data = offset = 0; +} + uint64_t BufferedFileReader::CurrentOffset() { return total_read + offset; } diff --git a/src/duckdb/src/common/serializer/buffered_file_writer.cpp b/src/duckdb/src/common/serializer/buffered_file_writer.cpp index bf358161..dcbe7d4f 100644 --- a/src/duckdb/src/common/serializer/buffered_file_writer.cpp +++ b/src/duckdb/src/common/serializer/buffered_file_writer.cpp @@ -1,16 +1,17 @@ #include "duckdb/common/serializer/buffered_file_writer.hpp" #include "duckdb/common/exception.hpp" #include "duckdb/common/algorithm.hpp" +#include "duckdb/common/typedefs.hpp" #include namespace duckdb { // Remove this when we switch C++17: https://stackoverflow.com/a/53350948 -constexpr uint8_t BufferedFileWriter::DEFAULT_OPEN_FLAGS; +constexpr FileOpenFlags BufferedFileWriter::DEFAULT_OPEN_FLAGS; -BufferedFileWriter::BufferedFileWriter(FileSystem &fs, const string &path_p, uint8_t open_flags) +BufferedFileWriter::BufferedFileWriter(FileSystem &fs, const string &path_p, FileOpenFlags open_flags) : fs(fs), path(path_p), data(make_unsafe_uniq_array(FILE_BUFFER_SIZE)), offset(0), total_written(0) { - handle = fs.OpenFile(path, open_flags, FileLockType::WRITE_LOCK); + handle = fs.OpenFile(path, open_flags | FileLockType::WRITE_LOCK); } int64_t BufferedFileWriter::GetFileSize() { @@ -22,16 +23,34 @@ idx_t BufferedFileWriter::GetTotalWritten() { } void BufferedFileWriter::WriteData(const_data_ptr_t buffer, idx_t write_size) { - // first copy anything we can from the buffer - const_data_ptr_t end_ptr = buffer + write_size; - while (buffer < end_ptr) { - idx_t to_write = MinValue((end_ptr - buffer), FILE_BUFFER_SIZE - offset); - D_ASSERT(to_write > 0); - memcpy(data.get() + offset, buffer, to_write); - offset += to_write; - buffer += to_write; - if (offset == FILE_BUFFER_SIZE) { - Flush(); + if (write_size >= (2ULL * FILE_BUFFER_SIZE - offset)) { + idx_t to_copy = 0; + // Check before performing direct IO if there is some data in the current internal buffer. + // If so, then fill the buffer (to avoid to small write operation), flush it and then write + // all the remain data directly. + // This is to avoid to split a large buffer into N*FILE_BUFFER_SIZE buffers + if (offset != 0) { + // Some data are still present in the buffer let write them before + to_copy = FILE_BUFFER_SIZE - offset; + memcpy(data.get() + offset, buffer, to_copy); + offset += to_copy; + Flush(); // Flush buffer before writing every things else + } + idx_t remaining_to_write = write_size - to_copy; + fs.Write(*handle, const_cast(buffer + to_copy), remaining_to_write); // NOLINT: wrong API in Write + total_written += remaining_to_write; + } else { + // first copy anything we can from the buffer + const_data_ptr_t end_ptr = buffer + write_size; + while (buffer < end_ptr) { + idx_t to_write = MinValue((end_ptr - buffer), FILE_BUFFER_SIZE - offset); + D_ASSERT(to_write > 0); + memcpy(data.get() + offset, buffer, to_write); + offset += to_write; + buffer += to_write; + if (offset == FILE_BUFFER_SIZE) { + Flush(); + } } } } diff --git a/src/duckdb/src/common/string_util.cpp b/src/duckdb/src/common/string_util.cpp index 20931aa8..7898a343 100644 --- a/src/duckdb/src/common/string_util.cpp +++ b/src/duckdb/src/common/string_util.cpp @@ -173,7 +173,6 @@ string StringUtil::Join(const set &input, const string &separator) { string StringUtil::BytesToHumanReadableString(idx_t bytes, idx_t multiplier) { D_ASSERT(multiplier == 1000 || multiplier == 1024); - string db_size; idx_t array[6] = {}; const char *unit[2][6] = {{"bytes", "KiB", "MiB", "GiB", "TiB", "PiB"}, {"bytes", "kB", "MB", "GB", "TB", "PB"}}; @@ -230,7 +229,7 @@ bool StringUtil::CIEquals(const string &l1, const string &l2) { if (l1.size() != l2.size()) { return false; } - const auto charmap = LowerFun::ascii_to_lower_map; + const auto charmap = LowerFun::ASCII_TO_LOWER_MAP; for (idx_t c = 0; c < l1.size(); c++) { if (charmap[(uint8_t)l1[c]] != charmap[(uint8_t)l2[c]]) { return false; @@ -240,7 +239,7 @@ bool StringUtil::CIEquals(const string &l1, const string &l2) { } bool StringUtil::CILessThan(const string &s1, const string &s2) { - const auto charmap = UpperFun::ascii_to_upper_map; + const auto charmap = UpperFun::ASCII_TO_UPPER_MAP; unsigned char u1, u2; diff --git a/src/duckdb/src/common/tree_renderer.cpp b/src/duckdb/src/common/tree_renderer.cpp index c3cd1980..aa295364 100644 --- a/src/duckdb/src/common/tree_renderer.cpp +++ b/src/duckdb/src/common/tree_renderer.cpp @@ -42,12 +42,12 @@ void RenderTree::SetNode(idx_t x, idx_t y, unique_ptr node) { void TreeRenderer::RenderTopLayer(RenderTree &root, std::ostream &ss, idx_t y) { for (idx_t x = 0; x < root.width; x++) { - if (x * config.NODE_RENDER_WIDTH >= config.MAXIMUM_RENDER_WIDTH) { + if (x * config.node_render_width >= config.maximum_render_width) { break; } if (root.HasNode(x, y)) { ss << config.LTCORNER; - ss << StringUtil::Repeat(config.HORIZONTAL, config.NODE_RENDER_WIDTH / 2 - 1); + ss << StringUtil::Repeat(config.HORIZONTAL, config.node_render_width / 2 - 1); if (y == 0) { // top level node: no node above this one ss << config.HORIZONTAL; @@ -55,23 +55,23 @@ void TreeRenderer::RenderTopLayer(RenderTree &root, std::ostream &ss, idx_t y) { // render connection to node above this one ss << config.DMIDDLE; } - ss << StringUtil::Repeat(config.HORIZONTAL, config.NODE_RENDER_WIDTH / 2 - 1); + ss << StringUtil::Repeat(config.HORIZONTAL, config.node_render_width / 2 - 1); ss << config.RTCORNER; } else { - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH); + ss << StringUtil::Repeat(" ", config.node_render_width); } } - ss << std::endl; + ss << '\n'; } void TreeRenderer::RenderBottomLayer(RenderTree &root, std::ostream &ss, idx_t y) { for (idx_t x = 0; x <= root.width; x++) { - if (x * config.NODE_RENDER_WIDTH >= config.MAXIMUM_RENDER_WIDTH) { + if (x * config.node_render_width >= config.maximum_render_width) { break; } if (root.HasNode(x, y)) { ss << config.LDCORNER; - ss << StringUtil::Repeat(config.HORIZONTAL, config.NODE_RENDER_WIDTH / 2 - 1); + ss << StringUtil::Repeat(config.HORIZONTAL, config.node_render_width / 2 - 1); if (root.HasNode(x, y + 1)) { // node below this one: connect to that one ss << config.TMIDDLE; @@ -79,17 +79,17 @@ void TreeRenderer::RenderBottomLayer(RenderTree &root, std::ostream &ss, idx_t y // no node below this one: end the box ss << config.HORIZONTAL; } - ss << StringUtil::Repeat(config.HORIZONTAL, config.NODE_RENDER_WIDTH / 2 - 1); + ss << StringUtil::Repeat(config.HORIZONTAL, config.node_render_width / 2 - 1); ss << config.RDCORNER; } else if (root.HasNode(x, y + 1)) { - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH / 2); + ss << StringUtil::Repeat(" ", config.node_render_width / 2); ss << config.VERTICAL; - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH / 2); + ss << StringUtil::Repeat(" ", config.node_render_width / 2); } else { - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH); + ss << StringUtil::Repeat(" ", config.node_render_width); } } - ss << std::endl; + ss << '\n'; } string AdjustTextForRendering(string source, idx_t max_render_width) { @@ -145,12 +145,12 @@ void TreeRenderer::RenderBoxContent(RenderTree &root, std::ostream &ss, idx_t y) } } } - extra_height = MinValue(extra_height, config.MAX_EXTRA_LINES); + extra_height = MinValue(extra_height, config.max_extra_lines); idx_t halfway_point = (extra_height + 1) / 2; // now we render the actual node for (idx_t render_y = 0; render_y <= extra_height; render_y++) { for (idx_t x = 0; x < root.width; x++) { - if (x * config.NODE_RENDER_WIDTH >= config.MAXIMUM_RENDER_WIDTH) { + if (x * config.node_render_width >= config.maximum_render_width) { break; } auto node = root.GetNode(x, y); @@ -159,35 +159,35 @@ void TreeRenderer::RenderBoxContent(RenderTree &root, std::ostream &ss, idx_t y) bool has_child_to_the_right = NodeHasMultipleChildren(root, x, y); if (root.HasNode(x, y + 1)) { // node right below this one - ss << StringUtil::Repeat(config.HORIZONTAL, config.NODE_RENDER_WIDTH / 2); + ss << StringUtil::Repeat(config.HORIZONTAL, config.node_render_width / 2); ss << config.RTCORNER; if (has_child_to_the_right) { // but we have another child to the right! keep rendering the line - ss << StringUtil::Repeat(config.HORIZONTAL, config.NODE_RENDER_WIDTH / 2); + ss << StringUtil::Repeat(config.HORIZONTAL, config.node_render_width / 2); } else { // only a child below this one: fill the rest with spaces - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH / 2); + ss << StringUtil::Repeat(" ", config.node_render_width / 2); } } else if (has_child_to_the_right) { // child to the right, but no child right below this one: render a full line - ss << StringUtil::Repeat(config.HORIZONTAL, config.NODE_RENDER_WIDTH); + ss << StringUtil::Repeat(config.HORIZONTAL, config.node_render_width); } else { // empty spot: render spaces - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH); + ss << StringUtil::Repeat(" ", config.node_render_width); } } else if (render_y >= halfway_point) { if (root.HasNode(x, y + 1)) { // we have a node below this empty spot: render a vertical line - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH / 2); + ss << StringUtil::Repeat(" ", config.node_render_width / 2); ss << config.VERTICAL; - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH / 2); + ss << StringUtil::Repeat(" ", config.node_render_width / 2); } else { // empty spot: render spaces - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH); + ss << StringUtil::Repeat(" ", config.node_render_width); } } else { // empty spot: render spaces - ss << StringUtil::Repeat(" ", config.NODE_RENDER_WIDTH); + ss << StringUtil::Repeat(" ", config.node_render_width); } } else { ss << config.VERTICAL; @@ -200,7 +200,7 @@ void TreeRenderer::RenderBoxContent(RenderTree &root, std::ostream &ss, idx_t y) render_text = extra_info[x][render_y - 1]; } } - render_text = AdjustTextForRendering(render_text, config.NODE_RENDER_WIDTH - 2); + render_text = AdjustTextForRendering(render_text, config.node_render_width - 2); ss << render_text; if (render_y == halfway_point && NodeHasMultipleChildren(root, x, y)) { @@ -210,7 +210,7 @@ void TreeRenderer::RenderBoxContent(RenderTree &root, std::ostream &ss, idx_t y) } } } - ss << std::endl; + ss << '\n'; } } @@ -259,11 +259,11 @@ void TreeRenderer::Render(const Pipeline &op, std::ostream &ss) { } void TreeRenderer::ToStream(RenderTree &root, std::ostream &ss) { - while (root.width * config.NODE_RENDER_WIDTH > config.MAXIMUM_RENDER_WIDTH) { - if (config.NODE_RENDER_WIDTH - 2 < config.MINIMUM_RENDER_WIDTH) { + while (root.width * config.node_render_width > config.maximum_render_width) { + if (config.node_render_width - 2 < config.minimum_render_width) { break; } - config.NODE_RENDER_WIDTH -= 2; + config.node_render_width -= 2; } for (idx_t y = 0; y < root.height; y++) { @@ -297,7 +297,7 @@ string TreeRenderer::RemovePadding(string l) { void TreeRenderer::SplitStringBuffer(const string &source, vector &result) { D_ASSERT(Utf8Proc::IsValid(source.c_str(), source.size())); - idx_t max_line_render_size = config.NODE_RENDER_WIDTH - 2; + idx_t max_line_render_size = config.node_render_width - 2; // utf8 in prompt, get render width idx_t cpos = 0; idx_t start_pos = 0; @@ -352,7 +352,7 @@ void TreeRenderer::SplitUpExtraInfo(const string &extra_info, vector &re } string TreeRenderer::ExtraInfoSeparator() { - return StringUtil::Repeat(string(config.HORIZONTAL) + " ", (config.NODE_RENDER_WIDTH - 7) / 2); + return StringUtil::Repeat(string(config.HORIZONTAL) + " ", (config.node_render_width - 7) / 2); } unique_ptr TreeRenderer::CreateRenderNode(string name, string extra_info) { @@ -483,47 +483,12 @@ unique_ptr TreeRenderer::CreateNode(const PipelineRenderNode &op return CreateNode(op.op); } -string TreeRenderer::ExtractExpressionsRecursive(ExpressionInfo &state) { - string result = "\n[INFOSEPARATOR]"; - result += "\n" + state.function_name; - result += "\n" + StringUtil::Format("%.9f", double(state.function_time)); - if (state.children.empty()) { - return result; - } - // render the children of this node - for (auto &child : state.children) { - result += ExtractExpressionsRecursive(*child); - } - return result; -} - unique_ptr TreeRenderer::CreateNode(const QueryProfiler::TreeNode &op) { auto result = TreeRenderer::CreateRenderNode(op.name, op.extra_info); result->extra_text += "\n[INFOSEPARATOR]"; result->extra_text += "\n" + to_string(op.info.elements); string timing = StringUtil::Format("%.2f", op.info.time); result->extra_text += "\n(" + timing + "s)"; - if (config.detailed) { - for (auto &info : op.info.executors_info) { - if (!info) { - continue; - } - for (auto &executor_info : info->roots) { - string sample_count = to_string(executor_info->sample_count); - result->extra_text += "\n[INFOSEPARATOR]"; - result->extra_text += "\nsample_count: " + sample_count; - string sample_tuples_count = to_string(executor_info->sample_tuples_count); - result->extra_text += "\n[INFOSEPARATOR]"; - result->extra_text += "\nsample_tuples_count: " + sample_tuples_count; - string total_count = to_string(executor_info->total_count); - result->extra_text += "\n[INFOSEPARATOR]"; - result->extra_text += "\ntotal_count: " + total_count; - for (auto &state : executor_info->root->children) { - result->extra_text += ExtractExpressionsRecursive(*state); - } - } - } - } return result; } @@ -539,8 +504,8 @@ unique_ptr TreeRenderer::CreateTree(const QueryProfiler::TreeNode &o return CreateRenderTree(op); } -unique_ptr TreeRenderer::CreateTree(const Pipeline &op) { - auto operators = op.GetOperators(); +unique_ptr TreeRenderer::CreateTree(const Pipeline &pipeline) { + auto operators = pipeline.GetOperators(); D_ASSERT(!operators.empty()); unique_ptr node; for (auto &op : operators) { diff --git a/src/duckdb/src/common/types.cpp b/src/duckdb/src/common/types.cpp index dc5c2d6d..862f86e5 100644 --- a/src/duckdb/src/common/types.cpp +++ b/src/duckdb/src/common/types.cpp @@ -868,6 +868,8 @@ static bool CombineEqualTypes(const LogicalType &left, const LogicalType &right, // struct: perform recursively on each child auto &left_child_types = StructType::GetChildTypes(left); auto &right_child_types = StructType::GetChildTypes(right); + bool left_unnamed = StructType::IsUnnamed(left); + auto any_unnamed = left_unnamed || StructType::IsUnnamed(right); if (left_child_types.size() != right_child_types.size()) { // child types are not of equal size, we can't cast // return false @@ -876,10 +878,15 @@ static bool CombineEqualTypes(const LogicalType &left, const LogicalType &right, child_list_t child_types; for (idx_t i = 0; i < left_child_types.size(); i++) { LogicalType child_type; + // Child names must be in the same order OR either one of the structs must be unnamed + if (!any_unnamed && !StringUtil::CIEquals(left_child_types[i].first, right_child_types[i].first)) { + return false; + } if (!OP::Operation(left_child_types[i].second, right_child_types[i].second, child_type)) { return false; } - child_types.emplace_back(left_child_types[i].first, std::move(child_type)); + auto &child_name = left_unnamed ? right_child_types[i].first : left_child_types[i].first; + child_types.emplace_back(child_name, std::move(child_type)); } result = LogicalType::STRUCT(child_types); return true; diff --git a/src/duckdb/src/common/types/bit.cpp b/src/duckdb/src/common/types/bit.cpp index 97db4774..6f2bd8a0 100644 --- a/src/duckdb/src/common/types/bit.cpp +++ b/src/duckdb/src/common/types/bit.cpp @@ -51,6 +51,7 @@ void Bit::Finalize(string_t &str) { for (idx_t i = 0; i < idx_t(padding); i++) { Bit::SetBitInternal(str, i, 1); } + str.Finalize(); Bit::Verify(str); } @@ -145,7 +146,6 @@ void Bit::ToBit(string_t str, string_t &output_str) { *(output++) = byte; } Bit::Finalize(output_str); - Bit::Verify(output_str); } string Bit::ToBit(string_t str) { @@ -287,6 +287,7 @@ idx_t Bit::GetBitInternal(string_t bit_string, idx_t n) { void Bit::SetBit(string_t &bit_string, idx_t n, idx_t new_value) { SetBitInternal(bit_string, n + GetBitPadding(bit_string), new_value); + Bit::Finalize(bit_string); } void Bit::SetBitInternal(string_t &bit_string, idx_t n, idx_t new_value) { @@ -332,7 +333,6 @@ void Bit::LeftShift(const string_t &bit_string, const idx_t &shift, string_t &re } } Bit::Finalize(result); - Bit::Verify(result); } void Bit::BitwiseAnd(const string_t &rhs, const string_t &lhs, string_t &result) { @@ -348,8 +348,7 @@ void Bit::BitwiseAnd(const string_t &rhs, const string_t &lhs, string_t &result) for (idx_t i = 1; i < lhs.GetSize(); i++) { buf[i] = l_buf[i] & r_buf[i]; } - // and should preserve padding bits - Bit::Verify(result); + Bit::Finalize(result); } void Bit::BitwiseOr(const string_t &rhs, const string_t &lhs, string_t &result) { @@ -365,8 +364,7 @@ void Bit::BitwiseOr(const string_t &rhs, const string_t &lhs, string_t &result) for (idx_t i = 1; i < lhs.GetSize(); i++) { buf[i] = l_buf[i] | r_buf[i]; } - // or should preserve padding bits - Bit::Verify(result); + Bit::Finalize(result); } void Bit::BitwiseXor(const string_t &rhs, const string_t &lhs, string_t &result) { @@ -403,6 +401,8 @@ void Bit::Verify(const string_t &input) { for (idx_t i = 0; i < padding; i++) { D_ASSERT(Bit::GetBitInternal(input, i)); } + // verify bit respects the "normal" string_t rules (i.e. null padding for inlined strings, prefix matches) + input.VerifyCharacters(); #endif } diff --git a/src/duckdb/src/common/types/data_chunk.cpp b/src/duckdb/src/common/types/data_chunk.cpp index 6e1b5ed8..114beb1f 100644 --- a/src/duckdb/src/common/types/data_chunk.cpp +++ b/src/duckdb/src/common/types/data_chunk.cpp @@ -218,7 +218,7 @@ void DataChunk::Flatten() { } } -vector DataChunk::GetTypes() { +vector DataChunk::GetTypes() const { vector types; for (idx_t i = 0; i < ColumnCount(); i++) { types.push_back(data[i].GetType()); @@ -290,7 +290,7 @@ void DataChunk::Slice(const SelectionVector &sel_vector, idx_t count_p) { } } -void DataChunk::Slice(DataChunk &other, const SelectionVector &sel, idx_t count_p, idx_t col_offset) { +void DataChunk::Slice(const DataChunk &other, const SelectionVector &sel, idx_t count_p, idx_t col_offset) { D_ASSERT(other.ColumnCount() <= col_offset + ColumnCount()); this->count = count_p; SelCache merge_cache; diff --git a/src/duckdb/src/common/types/hash.cpp b/src/duckdb/src/common/types/hash.cpp index c3136a52..cdc9ba30 100644 --- a/src/duckdb/src/common/types/hash.cpp +++ b/src/duckdb/src/common/types/hash.cpp @@ -12,22 +12,22 @@ namespace duckdb { template <> hash_t Hash(uint64_t val) { - return murmurhash64(val); + return MurmurHash64(val); } template <> hash_t Hash(int64_t val) { - return murmurhash64((uint64_t)val); + return MurmurHash64((uint64_t)val); } template <> hash_t Hash(hugeint_t val) { - return murmurhash64(val.lower) ^ murmurhash64(val.upper); + return MurmurHash64(val.lower) ^ MurmurHash64(val.upper); } template <> hash_t Hash(uhugeint_t val) { - return murmurhash64(val.lower) ^ murmurhash64(val.upper); + return MurmurHash64(val.lower) ^ MurmurHash64(val.upper); } template @@ -47,7 +47,7 @@ hash_t Hash(float val) { static_assert(sizeof(float) == sizeof(uint32_t), ""); FloatingPointEqualityTransform::OP(val); uint32_t uval = Load(const_data_ptr_cast(&val)); - return murmurhash64(uval); + return MurmurHash64(uval); } template <> @@ -55,7 +55,7 @@ hash_t Hash(double val) { static_assert(sizeof(double) == sizeof(uint64_t), ""); FloatingPointEqualityTransform::OP(val); uint64_t uval = Load(const_data_ptr_cast(&val)); - return murmurhash64(uval); + return MurmurHash64(uval); } template <> diff --git a/src/duckdb/src/common/types/hyperloglog.cpp b/src/duckdb/src/common/types/hyperloglog.cpp index 0b568ce0..e662738d 100644 --- a/src/duckdb/src/common/types/hyperloglog.cpp +++ b/src/duckdb/src/common/types/hyperloglog.cpp @@ -171,6 +171,8 @@ inline uint64_t HashOtherSize(const_data_ptr_t &data, const idx_t &len) { CreateIntegerRecursive<1>(data, x); break; case 0: + default: + D_ASSERT((len & 7) == 0); break; } return TemplatedHash(x); diff --git a/src/duckdb/src/common/types/row/tuple_data_allocator.cpp b/src/duckdb/src/common/types/row/tuple_data_allocator.cpp index 5702aac5..ee3d93ee 100644 --- a/src/duckdb/src/common/types/row/tuple_data_allocator.cpp +++ b/src/duckdb/src/common/types/row/tuple_data_allocator.cpp @@ -3,6 +3,7 @@ #include "duckdb/common/types/row/tuple_data_segment.hpp" #include "duckdb/common/types/row/tuple_data_states.hpp" #include "duckdb/storage/buffer_manager.hpp" +#include "duckdb/common/fast_mem.hpp" namespace duckdb { @@ -82,6 +83,18 @@ void TupleDataAllocator::Build(TupleDataSegment &segment, TupleDataPinState &pin segment.data_size += chunk_part.total_heap_size; } + if (layout.HasDestructor()) { + const auto base_row_ptr = GetRowPointer(pin_state, chunk_part); + for (auto &aggr_idx : layout.GetAggregateDestructorIndices()) { + const auto aggr_offset = layout.GetOffsets()[layout.ColumnCount() + aggr_idx]; + auto &aggr_fun = layout.GetAggregates()[aggr_idx]; + for (idx_t i = 0; i < next; i++) { + duckdb::FastMemset(base_row_ptr + i * layout.GetRowWidth() + aggr_offset, '\0', + aggr_fun.payload_size); + } + } + } + offset += next; chunk_part_indices.emplace_back(chunks.size() - 1, chunk.parts.size() - 1); } diff --git a/src/duckdb/src/common/types/row/tuple_data_layout.cpp b/src/duckdb/src/common/types/row/tuple_data_layout.cpp index 3caa365b..5dec78e0 100644 --- a/src/duckdb/src/common/types/row/tuple_data_layout.cpp +++ b/src/duckdb/src/common/types/row/tuple_data_layout.cpp @@ -5,8 +5,7 @@ namespace duckdb { TupleDataLayout::TupleDataLayout() - : flag_width(0), data_width(0), aggr_width(0), row_width(0), all_constant(true), heap_size_offset(0), - has_destructor(false) { + : flag_width(0), data_width(0), aggr_width(0), row_width(0), all_constant(true), heap_size_offset(0) { } TupleDataLayout TupleDataLayout::Copy() const { @@ -26,7 +25,7 @@ TupleDataLayout TupleDataLayout::Copy() const { result.offsets = this->offsets; result.all_constant = this->all_constant; result.heap_size_offset = this->heap_size_offset; - result.has_destructor = this->has_destructor; + result.aggr_destructor_idxs = this->aggr_destructor_idxs; return result; } @@ -109,11 +108,10 @@ void TupleDataLayout::Initialize(vector types_p, Aggregates aggrega } #endif - has_destructor = false; - for (auto &aggr : GetAggregates()) { + for (idx_t aggr_idx = 0; aggr_idx < aggregates.size(); aggr_idx++) { + const auto &aggr = aggregates[aggr_idx]; if (aggr.function.destructor) { - has_destructor = true; - break; + aggr_destructor_idxs.push_back(aggr_idx); } } } diff --git a/src/duckdb/src/common/types/uuid.cpp b/src/duckdb/src/common/types/uuid.cpp index d6fe6dff..818d9e8d 100644 --- a/src/duckdb/src/common/types/uuid.cpp +++ b/src/duckdb/src/common/types/uuid.cpp @@ -3,7 +3,7 @@ namespace duckdb { -bool UUID::FromString(string str, hugeint_t &result) { +bool UUID::FromString(const string &str, hugeint_t &result) { auto hex2char = [](char ch) -> unsigned char { if (ch >= '0' && ch <= '9') { return ch - '0'; diff --git a/src/duckdb/src/common/types/vector.cpp b/src/duckdb/src/common/types/vector.cpp index a3039f77..b1779112 100644 --- a/src/duckdb/src/common/types/vector.cpp +++ b/src/duckdb/src/common/types/vector.cpp @@ -78,11 +78,11 @@ Vector::Vector(Vector &other) : type(other.type) { Reference(other); } -Vector::Vector(Vector &other, const SelectionVector &sel, idx_t count) : type(other.type) { +Vector::Vector(const Vector &other, const SelectionVector &sel, idx_t count) : type(other.type) { Slice(other, sel, count); } -Vector::Vector(Vector &other, idx_t offset, idx_t end) : type(other.type) { +Vector::Vector(const Vector &other, idx_t offset, idx_t end) : type(other.type) { Slice(other, offset, end); } @@ -574,8 +574,8 @@ Value Vector::GetValueInternal(const Vector &v_p, idx_t index_p) { throw InternalException("FSST Vector with non-string datatype found!"); } auto str_compressed = reinterpret_cast(data)[index]; - Value result = FSSTPrimitives::DecompressValue(FSSTVector::GetDecoder(const_cast(*vector)), - str_compressed.GetData(), str_compressed.GetSize()); + Value result = FSSTPrimitives::DecompressValue(FSSTVector::GetDecoder(*vector), str_compressed.GetData(), + str_compressed.GetSize()); return result; } @@ -776,8 +776,8 @@ string Vector::ToString(idx_t count) const { case VectorType::FSST_VECTOR: { for (idx_t i = 0; i < count; i++) { string_t compressed_string = reinterpret_cast(data)[i]; - Value val = FSSTPrimitives::DecompressValue(FSSTVector::GetDecoder(const_cast(*this)), - compressed_string.GetData(), compressed_string.GetSize()); + Value val = FSSTPrimitives::DecompressValue(FSSTVector::GetDecoder(*this), compressed_string.GetData(), + compressed_string.GetSize()); retval += GetValue(i).ToString() + (i == count - 1 ? "" : ", "); } } break; @@ -2127,7 +2127,8 @@ const vector> &StructVector::GetEntries(const Vector &vector) //===--------------------------------------------------------------------===// // ListVector //===--------------------------------------------------------------------===// -const Vector &ListVector::GetEntry(const Vector &vector) { +template +T &ListVector::GetEntryInternal(T &vector) { D_ASSERT(vector.GetType().id() == LogicalTypeId::LIST || vector.GetType().id() == LogicalTypeId::MAP); if (vector.GetVectorType() == VectorType::DICTIONARY_VECTOR) { auto &child = DictionaryVector::Child(vector); @@ -2137,12 +2138,15 @@ const Vector &ListVector::GetEntry(const Vector &vector) { vector.GetVectorType() == VectorType::CONSTANT_VECTOR); D_ASSERT(vector.auxiliary); D_ASSERT(vector.auxiliary->GetBufferType() == VectorBufferType::LIST_BUFFER); - return vector.auxiliary->Cast().GetChild(); + return vector.auxiliary->template Cast().GetChild(); +} + +const Vector &ListVector::GetEntry(const Vector &vector) { + return GetEntryInternal(vector); } Vector &ListVector::GetEntry(Vector &vector) { - const Vector &cvector = vector; - return const_cast(ListVector::GetEntry(cvector)); + return GetEntryInternal(vector); } void ListVector::Reserve(Vector &vector, idx_t required_capacity) { @@ -2496,7 +2500,8 @@ UnionInvalidReason UnionVector::CheckUnionValidity(Vector &vector_p, idx_t count //===--------------------------------------------------------------------===// // ArrayVector //===--------------------------------------------------------------------===// -const Vector &ArrayVector::GetEntry(const Vector &vector) { +template +T &ArrayVector::GetEntryInternal(T &vector) { D_ASSERT(vector.GetType().id() == LogicalTypeId::ARRAY); if (vector.GetVectorType() == VectorType::DICTIONARY_VECTOR) { auto &child = DictionaryVector::Child(vector); @@ -2506,12 +2511,15 @@ const Vector &ArrayVector::GetEntry(const Vector &vector) { vector.GetVectorType() == VectorType::CONSTANT_VECTOR); D_ASSERT(vector.auxiliary); D_ASSERT(vector.auxiliary->GetBufferType() == VectorBufferType::ARRAY_BUFFER); - return vector.auxiliary->Cast().GetChild(); + return vector.auxiliary->template Cast().GetChild(); +} + +const Vector &ArrayVector::GetEntry(const Vector &vector) { + return GetEntryInternal(vector); } Vector &ArrayVector::GetEntry(Vector &vector) { - const Vector &cvector = vector; - return const_cast(ArrayVector::GetEntry(cvector)); + return GetEntryInternal(vector); } idx_t ArrayVector::GetTotalSize(const Vector &vector) { diff --git a/src/duckdb/src/common/vector_operations/comparison_operators.cpp b/src/duckdb/src/common/vector_operations/comparison_operators.cpp index d73ed852..c66288d8 100644 --- a/src/duckdb/src/common/vector_operations/comparison_operators.cpp +++ b/src/duckdb/src/common/vector_operations/comparison_operators.cpp @@ -90,7 +90,7 @@ bool GreaterThanEquals::Operation(const double &left, const double &right) { struct ComparisonSelector { template static idx_t Select(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { + SelectionVector *false_sel, ValidityMask &null_mask) { throw NotImplementedException("Unknown comparison operation!"); } }; @@ -98,44 +98,44 @@ struct ComparisonSelector { template <> inline idx_t ComparisonSelector::Select(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::Equals(left, right, sel, count, true_sel, false_sel); + SelectionVector *false_sel, ValidityMask &null_mask) { + return VectorOperations::Equals(left, right, sel, count, true_sel, false_sel, &null_mask); } template <> inline idx_t ComparisonSelector::Select(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::NotEquals(left, right, sel, count, true_sel, false_sel); + SelectionVector *false_sel, ValidityMask &null_mask) { + return VectorOperations::NotEquals(left, right, sel, count, true_sel, false_sel, &null_mask); } template <> inline idx_t ComparisonSelector::Select(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::GreaterThan(left, right, sel, count, true_sel, false_sel); + SelectionVector *false_sel, ValidityMask &null_mask) { + return VectorOperations::GreaterThan(left, right, sel, count, true_sel, false_sel, &null_mask); } template <> -inline idx_t ComparisonSelector::Select(Vector &left, Vector &right, - const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::GreaterThanEquals(left, right, sel, count, true_sel, false_sel); +inline idx_t +ComparisonSelector::Select(Vector &left, Vector &right, const SelectionVector *sel, + idx_t count, SelectionVector *true_sel, + SelectionVector *false_sel, ValidityMask &null_mask) { + return VectorOperations::GreaterThanEquals(left, right, sel, count, true_sel, false_sel, &null_mask); } template <> inline idx_t ComparisonSelector::Select(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::GreaterThan(right, left, sel, count, true_sel, false_sel); + SelectionVector *false_sel, ValidityMask &null_mask) { + return VectorOperations::GreaterThan(right, left, sel, count, true_sel, false_sel, &null_mask); } template <> inline idx_t ComparisonSelector::Select(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::GreaterThanEquals(right, left, sel, count, true_sel, false_sel); + SelectionVector *false_sel, ValidityMask &null_mask) { + return VectorOperations::GreaterThanEquals(right, left, sel, count, true_sel, false_sel, &null_mask); } static void ComparesNotNull(UnifiedVectorFormat &ldata, UnifiedVectorFormat &rdata, ValidityMask &vresult, @@ -164,8 +164,9 @@ static void NestedComparisonExecutor(Vector &left, Vector &right, Vector &result if (left_constant && right_constant) { // both sides are constant, and neither is NULL so just compare one element. result.SetVectorType(VectorType::CONSTANT_VECTOR); + auto &result_validity = ConstantVector::Validity(result); SelectionVector true_sel(1); - auto match_count = ComparisonSelector::Select(left, right, nullptr, 1, &true_sel, nullptr); + auto match_count = ComparisonSelector::Select(left, right, nullptr, 1, &true_sel, nullptr, result_validity); auto result_data = ConstantVector::GetData(result); result_data[0] = match_count > 0; return; @@ -183,7 +184,8 @@ static void NestedComparisonExecutor(Vector &left, Vector &right, Vector &result } SelectionVector true_sel(count); SelectionVector false_sel(count); - idx_t match_count = ComparisonSelector::Select(left, right, nullptr, count, &true_sel, &false_sel); + idx_t match_count = + ComparisonSelector::Select(left, right, nullptr, count, &true_sel, &false_sel, result_validity); for (idx_t i = 0; i < match_count; ++i) { const auto idx = true_sel.get_index(i); diff --git a/src/duckdb/src/common/vector_operations/generators.cpp b/src/duckdb/src/common/vector_operations/generators.cpp index 18c5886d..a5faba93 100644 --- a/src/duckdb/src/common/vector_operations/generators.cpp +++ b/src/duckdb/src/common/vector_operations/generators.cpp @@ -66,7 +66,7 @@ void TemplatedGenerateSequence(Vector &result, idx_t count, const SelectionVecto auto result_data = FlatVector::GetData(result); auto value = (T)start; for (idx_t i = 0; i < count; i++) { - auto idx = sel.get_index(i); + auto idx = UnsafeNumericCast(sel.get_index(i)); result_data[idx] = UnsafeNumericCast(value + increment * idx); } } diff --git a/src/duckdb/src/common/vector_operations/is_distinct_from.cpp b/src/duckdb/src/common/vector_operations/is_distinct_from.cpp index fc5d98a8..82ef3166 100644 --- a/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +++ b/src/duckdb/src/common/vector_operations/is_distinct_from.cpp @@ -254,12 +254,37 @@ static idx_t DistinctSelectConstant(Vector &left, Vector &right, const Selection } } +static void UpdateNullMask(Vector &vec, const SelectionVector &sel, idx_t count, ValidityMask &null_mask) { + UnifiedVectorFormat vdata; + vec.ToUnifiedFormat(count, vdata); + + if (vdata.validity.AllValid()) { + return; + } + + for (idx_t i = 0; i < count; ++i) { + const auto ridx = sel.get_index(i); + const auto vidx = vdata.sel->get_index(i); + if (!vdata.validity.RowIsValid(vidx)) { + null_mask.SetInvalid(ridx); + } + } +} + template static idx_t DistinctSelect(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { + SelectionVector *true_sel, SelectionVector *false_sel, + optional_ptr null_mask) { if (!sel) { sel = FlatVector::IncrementalSelectionVector(); } + + // TODO: Push this down? + if (null_mask) { + UpdateNullMask(left, *sel, count, *null_mask); + UpdateNullMask(right, *sel, count, *null_mask); + } + if (left.GetVectorType() == VectorType::CONSTANT_VECTOR && right.GetVectorType() == VectorType::CONSTANT_VECTOR) { return DistinctSelectConstant(left, right, sel, count, true_sel, false_sel); } else if (left.GetVectorType() == VectorType::CONSTANT_VECTOR && @@ -279,7 +304,7 @@ static idx_t DistinctSelect(Vector &left, Vector &right, const SelectionVector * template static idx_t DistinctSelectNotNull(Vector &left, Vector &right, const idx_t count, idx_t &true_count, const SelectionVector &sel, SelectionVector &maybe_vec, OptionalSelection &true_opt, - OptionalSelection &false_opt) { + OptionalSelection &false_opt, optional_ptr null_mask) { UnifiedVectorFormat lvdata, rvdata; left.ToUnifiedFormat(count, lvdata); right.ToUnifiedFormat(count, rvdata); @@ -309,6 +334,9 @@ static idx_t DistinctSelectNotNull(Vector &left, Vector &right, const idx_t coun const auto rnull = !rmask.RowIsValid(ridx); if (lnull || rnull) { // If either is NULL then we can major distinguish them + if (null_mask) { + null_mask->SetInvalid(result_idx); + } if (!OP::Operation(false, false, lnull, rnull)) { false_opt.Append(false_count, result_idx); } else { @@ -337,23 +365,26 @@ struct PositionComparator { // Default to the same as the final row template static idx_t Definite(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector &false_sel) { - return Final(left, right, sel, count, true_sel, &false_sel); + optional_ptr true_sel, SelectionVector &false_sel, + optional_ptr null_mask) { + return Final(left, right, sel, count, true_sel, &false_sel, null_mask); } // Select the possible rows that need further testing. // Usually this means Is Not Distinct, as those are the semantics used by Postges template static idx_t Possible(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector &true_sel, SelectionVector *false_sel) { - return VectorOperations::NestedEquals(left, right, sel, count, &true_sel, false_sel); + SelectionVector &true_sel, optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::NestedEquals(left, right, &sel, count, &true_sel, false_sel, null_mask); } // Select the matching rows for the final position. // This needs to be specialised. template - static idx_t Final(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { + static idx_t Final(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { return 0; } @@ -369,78 +400,88 @@ struct PositionComparator { // NotDistinctFrom must always check every column template <> idx_t PositionComparator::Definite(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector &false_sel) { + idx_t count, optional_ptr true_sel, + SelectionVector &false_sel, + optional_ptr null_mask) { return 0; } template <> idx_t PositionComparator::Final(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::NestedEquals(left, right, sel, count, true_sel, false_sel); + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::NestedEquals(left, right, &sel, count, true_sel, false_sel, null_mask); } // DistinctFrom must check everything that matched template <> idx_t PositionComparator::Possible(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, SelectionVector &true_sel, - SelectionVector *false_sel) { + optional_ptr false_sel, + optional_ptr null_mask) { return count; } template <> idx_t PositionComparator::Final(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::NestedNotEquals(left, right, sel, count, true_sel, false_sel); + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::NestedNotEquals(left, right, &sel, count, true_sel, false_sel, null_mask); } // Non-strict inequalities must use strict comparisons for Definite template <> idx_t PositionComparator::Definite(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, - SelectionVector &false_sel) { - return VectorOperations::DistinctGreaterThan(right, left, &sel, count, true_sel, &false_sel); + optional_ptr true_sel, + SelectionVector &false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThan(right, left, &sel, count, true_sel, &false_sel, null_mask); } template <> idx_t PositionComparator::Final(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::DistinctGreaterThanEquals(right, left, &sel, count, true_sel, false_sel); + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThanEquals(right, left, &sel, count, true_sel, false_sel, null_mask); } template <> idx_t PositionComparator::Definite(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, - SelectionVector &false_sel) { - return VectorOperations::DistinctGreaterThan(left, right, &sel, count, true_sel, &false_sel); + optional_ptr true_sel, + SelectionVector &false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThan(left, right, &sel, count, true_sel, &false_sel, null_mask); } template <> idx_t PositionComparator::Final(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::DistinctGreaterThanEquals(left, right, &sel, count, true_sel, false_sel); + optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThanEquals(left, right, &sel, count, true_sel, false_sel, null_mask); } // Strict inequalities just use strict for both Definite and Final template <> idx_t PositionComparator::Final(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::DistinctGreaterThan(right, left, &sel, count, true_sel, false_sel); + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThan(right, left, &sel, count, true_sel, false_sel, null_mask); } template <> idx_t PositionComparator::Final(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::DistinctGreaterThan(left, right, &sel, count, true_sel, false_sel); + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThan(left, right, &sel, count, true_sel, false_sel, null_mask); } using StructEntries = vector>; @@ -456,6 +497,24 @@ static void ExtractNestedSelection(const SelectionVector &slice_sel, const idx_t opt.Advance(count); } +static void ExtractNestedMask(const SelectionVector &slice_sel, const idx_t count, const SelectionVector &sel, + ValidityMask *child_mask, optional_ptr null_mask) { + + if (!child_mask) { + return; + } + + for (idx_t i = 0; i < count; ++i) { + const auto slice_idx = slice_sel.get_index(i); + const auto result_idx = sel.get_index(slice_idx); + if (child_mask && !child_mask->RowIsValid(slice_idx)) { + null_mask->SetInvalid(result_idx); + } + } + + child_mask->Reset(null_mask->TargetCount()); +} + static void DensifyNestedSelection(const SelectionVector &dense_sel, const idx_t count, SelectionVector &slice_sel) { for (idx_t i = 0; i < count; ++i) { slice_sel.set_index(i, dense_sel.get_index(i)); @@ -464,7 +523,8 @@ static void DensifyNestedSelection(const SelectionVector &dense_sel, const idx_t template static idx_t DistinctSelectStruct(Vector &left, Vector &right, idx_t count, const SelectionVector &sel, - OptionalSelection &true_opt, OptionalSelection &false_opt) { + OptionalSelection &true_opt, OptionalSelection &false_opt, + optional_ptr null_mask) { if (count == 0) { return 0; } @@ -486,6 +546,13 @@ static idx_t DistinctSelectStruct(Vector &left, Vector &right, idx_t count, cons SelectionVector true_sel(count); SelectionVector false_sel(count); + ValidityMask child_validity; + ValidityMask *child_mask = nullptr; + if (null_mask) { + child_mask = &child_validity; + child_mask->Reset(null_mask->TargetCount()); + } + idx_t match_count = 0; for (idx_t col_no = 0; col_no < lchildren.size(); ++col_no) { // Slice the children to maintain density @@ -498,7 +565,10 @@ static idx_t DistinctSelectStruct(Vector &left, Vector &right, idx_t count, cons rchild.Slice(slice_sel, count); // Find everything that definitely matches - auto true_count = PositionComparator::Definite(lchild, rchild, slice_sel, count, &true_sel, false_sel); + auto true_count = + PositionComparator::Definite(lchild, rchild, slice_sel, count, &true_sel, false_sel, child_mask); + // Extract any NULLs we found + ExtractNestedMask(slice_sel, count, sel, child_mask, null_mask); if (true_count > 0) { auto false_count = count - true_count; @@ -514,9 +584,13 @@ static idx_t DistinctSelectStruct(Vector &left, Vector &right, idx_t count, cons if (col_no != lchildren.size() - 1) { // Find what might match on the next position - true_count = PositionComparator::Possible(lchild, rchild, slice_sel, count, true_sel, &false_sel); + true_count = + PositionComparator::Possible(lchild, rchild, slice_sel, count, true_sel, &false_sel, child_mask); auto false_count = count - true_count; + // Extract any NULLs we found + ExtractNestedMask(slice_sel, count, sel, child_mask, null_mask); + // Extract the definite failures into the false result ExtractNestedSelection(true_count ? false_sel : slice_sel, false_count, sel, false_opt); @@ -527,9 +601,13 @@ static idx_t DistinctSelectStruct(Vector &left, Vector &right, idx_t count, cons count = true_count; } else { - true_count = PositionComparator::Final(lchild, rchild, slice_sel, count, &true_sel, &false_sel); + true_count = + PositionComparator::Final(lchild, rchild, slice_sel, count, &true_sel, &false_sel, child_mask); auto false_count = count - true_count; + // Extract any NULLs we found + ExtractNestedMask(slice_sel, count, sel, child_mask, null_mask); + // Extract the definite matches into the true result ExtractNestedSelection(false_count ? true_sel : slice_sel, true_count, sel, true_opt); @@ -556,7 +634,8 @@ static void PositionListCursor(SelectionVector &cursor, UnifiedVectorFormat &vda template static idx_t DistinctSelectList(Vector &left, Vector &right, idx_t count, const SelectionVector &sel, - OptionalSelection &true_opt, OptionalSelection &false_opt) { + OptionalSelection &true_opt, OptionalSelection &false_opt, + optional_ptr null_mask) { if (count == 0) { return count; } @@ -605,6 +684,13 @@ static idx_t DistinctSelectList(Vector &left, Vector &right, idx_t count, const SelectionVector true_sel(count); SelectionVector false_sel(count); + ValidityMask child_validity; + ValidityMask *child_mask = nullptr; + if (null_mask) { + child_mask = &child_validity; + child_mask->Reset(null_mask->TargetCount()); + } + idx_t match_count = 0; for (idx_t pos = 0; count > 0; ++pos) { // Set up the cursors for the current position @@ -645,9 +731,14 @@ static idx_t DistinctSelectList(Vector &left, Vector &right, idx_t count, const } // Find everything that definitely matches - true_count = PositionComparator::Definite(lchild, rchild, slice_sel, count, &true_sel, false_sel); + true_count = + PositionComparator::Definite(lchild, rchild, slice_sel, count, &true_sel, false_sel, child_mask); + // Extract any NULLs we found + ExtractNestedMask(slice_sel, count, sel, child_mask, null_mask); if (true_count) { false_count = count - true_count; + + // Extract the definite matches into the true result ExtractNestedSelection(false_count ? true_sel : slice_sel, true_count, sel, true_opt); match_count += true_count; @@ -659,8 +750,14 @@ static idx_t DistinctSelectList(Vector &left, Vector &right, idx_t count, const } // Find what might match on the next position - true_count = PositionComparator::Possible(lchild, rchild, slice_sel, count, true_sel, &false_sel); + true_count = + PositionComparator::Possible(lchild, rchild, slice_sel, count, true_sel, &false_sel, child_mask); false_count = count - true_count; + + // Extract any NULLs we found + ExtractNestedMask(slice_sel, count, sel, child_mask, null_mask); + + // Extract the definite failures into the false result ExtractNestedSelection(true_count ? false_sel : slice_sel, false_count, sel, false_opt); if (false_count) { @@ -684,7 +781,8 @@ static void PositionArrayCursor(SelectionVector &cursor, UnifiedVectorFormat &vd template static idx_t DistinctSelectArray(Vector &left, Vector &right, idx_t count, const SelectionVector &sel, - OptionalSelection &true_opt, OptionalSelection &false_opt) { + OptionalSelection &true_opt, OptionalSelection &false_opt, + optional_ptr null_mask) { if (count == 0) { return count; } @@ -722,6 +820,13 @@ static idx_t DistinctSelectArray(Vector &left, Vector &right, idx_t count, const SelectionVector true_sel(count); SelectionVector false_sel(count); + ValidityMask child_validity; + ValidityMask *child_mask = nullptr; + if (null_mask) { + child_mask = &child_validity; + child_mask->Reset(null_mask->TargetCount()); + } + idx_t match_count = 0; for (idx_t pos = 0; count > 0; ++pos) { // Set up the cursors for the current position @@ -758,9 +863,14 @@ static idx_t DistinctSelectArray(Vector &left, Vector &right, idx_t count, const } // Find everything that definitely matches - true_count = PositionComparator::Definite(lchild, rchild, slice_sel, count, &true_sel, false_sel); + true_count = + PositionComparator::Definite(lchild, rchild, slice_sel, count, &true_sel, false_sel, child_mask); + // Extract any NULLs we found + ExtractNestedMask(slice_sel, count, sel, child_mask, null_mask); if (true_count) { false_count = count - true_count; + + // Extract the definite matches into the true result ExtractNestedSelection(false_count ? true_sel : slice_sel, true_count, sel, true_opt); match_count += true_count; @@ -772,8 +882,14 @@ static idx_t DistinctSelectArray(Vector &left, Vector &right, idx_t count, const } // Find what might match on the next position - true_count = PositionComparator::Possible(lchild, rchild, slice_sel, count, true_sel, &false_sel); + true_count = + PositionComparator::Possible(lchild, rchild, slice_sel, count, true_sel, &false_sel, null_mask); false_count = count - true_count; + + // Extract any NULLs we found + ExtractNestedMask(slice_sel, count, sel, child_mask, null_mask); + + // Extract the definite failures into the false result ExtractNestedSelection(true_count ? false_sel : slice_sel, false_count, sel, false_opt); if (false_count) { @@ -785,9 +901,10 @@ static idx_t DistinctSelectArray(Vector &left, Vector &right, idx_t count, const return match_count; } -template -static idx_t DistinctSelectNested(Vector &left, Vector &right, const SelectionVector *sel, const idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { +template +static idx_t DistinctSelectNested(Vector &left, Vector &right, optional_ptr sel, + const idx_t count, optional_ptr true_sel, + optional_ptr false_sel, optional_ptr null_mask) { // The Select operations all use a dense pair of input vectors to partition // a selection vector in a single pass. But to implement progressive comparisons, // we have to make multiple passes, so we need to keep track of the original input positions @@ -811,18 +928,21 @@ static idx_t DistinctSelectNested(Vector &left, Vector &right, const SelectionVe Vector r_not_null(right); idx_t match_count = 0; - auto unknown = - DistinctSelectNotNull(l_not_null, r_not_null, count, match_count, *sel, maybe_vec, true_opt, false_opt); + auto unknown = DistinctSelectNotNull(l_not_null, r_not_null, count, match_count, *sel, maybe_vec, true_opt, + false_opt, null_mask); switch (left.GetType().InternalType()) { case PhysicalType::LIST: - match_count += DistinctSelectList(l_not_null, r_not_null, unknown, maybe_vec, true_opt, false_opt); + match_count += + DistinctSelectList(l_not_null, r_not_null, unknown, maybe_vec, true_opt, false_opt, null_mask); break; case PhysicalType::STRUCT: - match_count += DistinctSelectStruct(l_not_null, r_not_null, unknown, maybe_vec, true_opt, false_opt); + match_count += + DistinctSelectStruct(l_not_null, r_not_null, unknown, maybe_vec, true_opt, false_opt, null_mask); break; case PhysicalType::ARRAY: - match_count += DistinctSelectArray(l_not_null, r_not_null, unknown, maybe_vec, true_opt, false_opt); + match_count += + DistinctSelectArray(l_not_null, r_not_null, unknown, maybe_vec, true_opt, false_opt, null_mask); break; default: throw NotImplementedException("Unimplemented type for DISTINCT"); @@ -905,44 +1025,60 @@ static void ExecuteDistinct(Vector &left, Vector &right, Vector &result, idx_t c } } -template -static idx_t TemplatedDistinctSelectOperation(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - // the inplace loops take the result as the last parameter +template +static idx_t TemplatedDistinctSelectOperation(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + switch (left.GetType().InternalType()) { case PhysicalType::BOOL: case PhysicalType::INT8: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::INT16: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::INT32: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::INT64: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::UINT8: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::UINT16: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::UINT32: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::UINT64: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::INT128: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::UINT128: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), + false_sel.get(), null_mask); case PhysicalType::FLOAT: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::DOUBLE: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::INTERVAL: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), + false_sel.get(), null_mask); case PhysicalType::VARCHAR: - return DistinctSelect(left, right, sel, count, true_sel, false_sel); + return DistinctSelect(left, right, sel.get(), count, true_sel.get(), false_sel.get(), + null_mask); case PhysicalType::STRUCT: case PhysicalType::LIST: case PhysicalType::ARRAY: - return DistinctSelectNested(left, right, sel, count, true_sel, false_sel); + return DistinctSelectNested(left, right, sel, count, true_sel, false_sel, null_mask); default: throw InternalException("Invalid type for distinct selection"); } @@ -958,7 +1094,7 @@ static void NestedDistinctExecute(Vector &left, Vector &right, Vector &result, i result.SetVectorType(VectorType::CONSTANT_VECTOR); auto result_data = ConstantVector::GetData(result); SelectionVector true_sel(1); - auto match_count = TemplatedDistinctSelectOperation(left, right, nullptr, 1, &true_sel, nullptr); + auto match_count = TemplatedDistinctSelectOperation(left, right, nullptr, 1, &true_sel, nullptr, nullptr); result_data[0] = match_count > 0; return; } @@ -967,7 +1103,8 @@ static void NestedDistinctExecute(Vector &left, Vector &right, Vector &result, i SelectionVector false_sel(count); // DISTINCT is either true or false - idx_t match_count = TemplatedDistinctSelectOperation(left, right, nullptr, count, &true_sel, &false_sel); + idx_t match_count = + TemplatedDistinctSelectOperation(left, right, nullptr, count, &true_sel, &false_sel, nullptr); result.SetVectorType(VectorType::FLAT_VECTOR); auto result_data = FlatVector::GetData(result); @@ -993,65 +1130,85 @@ void VectorOperations::NotDistinctFrom(Vector &left, Vector &right, Vector &resu } // true := A != B with nulls being equal -idx_t VectorOperations::DistinctFrom(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedDistinctSelectOperation(left, right, sel, count, true_sel, false_sel); +idx_t VectorOperations::DistinctFrom(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel) { + return TemplatedDistinctSelectOperation(left, right, sel, count, true_sel, false_sel, + nullptr); } // true := A == B with nulls being equal -idx_t VectorOperations::NotDistinctFrom(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return count - TemplatedDistinctSelectOperation(left, right, sel, count, false_sel, true_sel); +idx_t VectorOperations::NotDistinctFrom(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel) { + return count - TemplatedDistinctSelectOperation(left, right, sel, count, false_sel, true_sel, + nullptr); } // true := A > B with nulls being maximal -idx_t VectorOperations::DistinctGreaterThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedDistinctSelectOperation(left, right, sel, count, true_sel, false_sel); +idx_t VectorOperations::DistinctGreaterThan(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedDistinctSelectOperation(left, right, sel, count, true_sel, false_sel, + null_mask); } // true := A > B with nulls being minimal -idx_t VectorOperations::DistinctGreaterThanNullsFirst(Vector &left, Vector &right, const SelectionVector *sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return TemplatedDistinctSelectOperation( - left, right, sel, count, true_sel, false_sel); +idx_t VectorOperations::DistinctGreaterThanNullsFirst(Vector &left, Vector &right, + optional_ptr sel, idx_t count, + optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedDistinctSelectOperation(left, right, sel, count, true_sel, + false_sel, null_mask); } // true := A >= B with nulls being maximal -idx_t VectorOperations::DistinctGreaterThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return count - - TemplatedDistinctSelectOperation(right, left, sel, count, false_sel, true_sel); +idx_t VectorOperations::DistinctGreaterThanEquals(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return count - TemplatedDistinctSelectOperation(right, left, sel, count, false_sel, + true_sel, null_mask); } // true := A < B with nulls being maximal -idx_t VectorOperations::DistinctLessThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedDistinctSelectOperation(right, left, sel, count, true_sel, false_sel); +idx_t VectorOperations::DistinctLessThan(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedDistinctSelectOperation(right, left, sel, count, true_sel, false_sel, + null_mask); } // true := A < B with nulls being minimal -idx_t VectorOperations::DistinctLessThanNullsFirst(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedDistinctSelectOperation( - right, left, sel, count, true_sel, false_sel); +idx_t VectorOperations::DistinctLessThanNullsFirst(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedDistinctSelectOperation(right, left, sel, count, true_sel, + false_sel, nullptr); } // true := A <= B with nulls being maximal -idx_t VectorOperations::DistinctLessThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return count - - TemplatedDistinctSelectOperation(left, right, sel, count, false_sel, true_sel); +idx_t VectorOperations::DistinctLessThanEquals(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return count - TemplatedDistinctSelectOperation(left, right, sel, count, false_sel, + true_sel, null_mask); } // true := A != B with nulls being equal, inputs selected -idx_t VectorOperations::NestedNotEquals(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedDistinctSelectOperation(left, right, &sel, count, true_sel, false_sel); +idx_t VectorOperations::NestedNotEquals(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, optional_ptr null_mask) { + return TemplatedDistinctSelectOperation(left, right, sel, count, true_sel, false_sel, + null_mask); } // true := A == B with nulls being equal, inputs selected -idx_t VectorOperations::NestedEquals(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return count - - TemplatedDistinctSelectOperation(left, right, &sel, count, false_sel, true_sel); +idx_t VectorOperations::NestedEquals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { + return count - TemplatedDistinctSelectOperation(left, right, sel, count, false_sel, true_sel, + null_mask); } } // namespace duckdb diff --git a/src/duckdb/src/common/vector_operations/vector_hash.cpp b/src/duckdb/src/common/vector_operations/vector_hash.cpp index 46a9bcda..590642a4 100644 --- a/src/duckdb/src/common/vector_operations/vector_hash.cpp +++ b/src/duckdb/src/common/vector_operations/vector_hash.cpp @@ -3,12 +3,11 @@ // Description: This file contains the vectorized hash implementations //===--------------------------------------------------------------------===// -#include "duckdb/common/uhugeint.hpp" -#include "duckdb/common/vector_operations/vector_operations.hpp" - #include "duckdb/common/types/hash.hpp" #include "duckdb/common/types/null_value.hpp" +#include "duckdb/common/uhugeint.hpp" #include "duckdb/common/value_operations/value_operations.hpp" +#include "duckdb/common/vector_operations/vector_operations.hpp" namespace duckdb { @@ -91,6 +90,8 @@ static inline void StructLoopHash(Vector &input, Vector &hashes, const Selection template static inline void ListLoopHash(Vector &input, Vector &hashes, const SelectionVector *rsel, idx_t count) { + // FIXME: if we want to be more efficient we shouldn't flatten, but the logic here currently requires it + hashes.Flatten(count); auto hdata = FlatVector::GetData(hashes); UnifiedVectorFormat idata; @@ -180,40 +181,68 @@ static inline void ListLoopHash(Vector &input, Vector &hashes, const SelectionVe template static inline void ArrayLoopHash(Vector &input, Vector &hashes, const SelectionVector *rsel, idx_t count) { + hashes.Flatten(count); auto hdata = FlatVector::GetData(hashes); - if (input.GetVectorType() != VectorType::CONSTANT_VECTOR || input.GetVectorType() != VectorType::FLAT_VECTOR) { - input.Flatten(count); - } - UnifiedVectorFormat idata; input.ToUnifiedFormat(count, idata); // Hash the children into a temporary auto &child = ArrayVector::GetEntry(input); auto array_size = ArrayType::GetSize(input.GetType()); + + auto is_flat = input.GetVectorType() == VectorType::FLAT_VECTOR; auto is_constant = input.GetVectorType() == VectorType::CONSTANT_VECTOR; - auto child_count = array_size * (is_constant ? 1 : count); - Vector child_hashes(LogicalType::HASH, child_count); - if (child_count > 0) { - child_hashes.Flatten(child_count); + if (!HAS_RSEL && (is_flat || is_constant)) { + // Fast path for contiguous vectors with no selection vector + auto child_count = array_size * (is_constant ? 1 : count); + + Vector child_hashes(LogicalType::HASH, child_count); VectorOperations::Hash(child, child_hashes, child_count); - } - auto chdata = FlatVector::GetData(child_hashes); + child_hashes.Flatten(child_count); + auto chdata = FlatVector::GetData(child_hashes); - for (idx_t i = 0; i < count; ++i) { - const auto ridx = HAS_RSEL ? rsel->get_index(i) : i; - const auto lidx = idata.sel->get_index(ridx); - const auto offset = lidx * array_size; - if (idata.validity.RowIsValid(lidx)) { - for (idx_t j = 0; j < array_size; j++) { - hdata[ridx] = CombineHashScalar(hdata[ridx], chdata[offset + j]); + for (idx_t i = 0; i < count; i++) { + auto lidx = idata.sel->get_index(i); + if (idata.validity.RowIsValid(lidx)) { + for (idx_t j = 0; j < array_size; j++) { + auto offset = lidx * array_size + j; + hdata[i] = CombineHashScalar(hdata[i], chdata[offset]); + } + } else if (FIRST_HASH) { + hdata[i] = HashOp::NULL_HASH; + } + } + } else { + // Hash the arrays one-by-one + SelectionVector array_sel(array_size); + Vector array_hashes(LogicalType::HASH, array_size); + for (idx_t i = 0; i < count; i++) { + const auto ridx = HAS_RSEL ? rsel->get_index(i) : i; + const auto lidx = idata.sel->get_index(ridx); + + if (idata.validity.RowIsValid(lidx)) { + // Create a selection vector for the array + for (idx_t j = 0; j < array_size; j++) { + array_sel.set_index(j, lidx * array_size + j); + } + + // Hash the array slice + Vector dict_vec(child, array_sel, array_size); + VectorOperations::Hash(dict_vec, array_hashes, array_size); + auto ahdata = FlatVector::GetData(array_hashes); + + // Combine the hashes of the array + for (idx_t j = 0; j < array_size; j++) { + hdata[ridx] = CombineHashScalar(hdata[ridx], ahdata[j]); + // Clear the hash for the next iteration + ahdata[j] = 0; + } + } else if (FIRST_HASH) { + hdata[ridx] = HashOp::NULL_HASH; } - } else if (FIRST_HASH) { - hdata[ridx] = HashOp::NULL_HASH; } - // Empty or NULL non-first elements have no effect. } } diff --git a/src/duckdb/src/common/virtual_file_system.cpp b/src/duckdb/src/common/virtual_file_system.cpp index 3337623e..3bc099a2 100644 --- a/src/duckdb/src/common/virtual_file_system.cpp +++ b/src/duckdb/src/common/virtual_file_system.cpp @@ -9,8 +9,9 @@ VirtualFileSystem::VirtualFileSystem() : default_fs(FileSystem::CreateLocal()) { VirtualFileSystem::RegisterSubSystem(FileCompressionType::GZIP, make_uniq()); } -unique_ptr VirtualFileSystem::OpenFile(const string &path, uint8_t flags, FileLockType lock, - FileCompressionType compression, FileOpener *opener) { +unique_ptr VirtualFileSystem::OpenFile(const string &path, FileOpenFlags flags, + optional_ptr opener) { + auto compression = flags.Compression(); if (compression == FileCompressionType::AUTO_DETECT) { // auto detect compression settings based on file name auto lower_path = StringUtil::Lower(path); @@ -26,8 +27,12 @@ unique_ptr VirtualFileSystem::OpenFile(const string &path, uint8_t f compression = FileCompressionType::UNCOMPRESSED; } } - // open the base file handle - auto file_handle = FindFileSystem(path).OpenFile(path, flags, lock, FileCompressionType::UNCOMPRESSED, opener); + // open the base file handle in UNCOMPRESSED mode + flags.SetCompression(FileCompressionType::UNCOMPRESSED); + auto file_handle = FindFileSystem(path).OpenFile(path, flags, opener); + if (!file_handle) { + return nullptr; + } if (file_handle->GetType() == FileType::FILE_TYPE_FIFO) { file_handle = PipeFileSystem::OpenPipe(std::move(file_handle)); } else if (compression != FileCompressionType::UNCOMPRESSED) { @@ -36,7 +41,7 @@ unique_ptr VirtualFileSystem::OpenFile(const string &path, uint8_t f throw NotImplementedException( "Attempting to open a compressed file, but the compression type is not supported"); } - file_handle = entry->second->OpenCompressedFile(std::move(file_handle), flags & FileFlags::FILE_FLAGS_WRITE); + file_handle = entry->second->OpenCompressedFile(std::move(file_handle), flags.OpenForWriting()); } return file_handle; } @@ -76,15 +81,15 @@ void VirtualFileSystem::FileSync(FileHandle &handle) { } // need to look up correct fs for this -bool VirtualFileSystem::DirectoryExists(const string &directory) { - return FindFileSystem(directory).DirectoryExists(directory); +bool VirtualFileSystem::DirectoryExists(const string &directory, optional_ptr opener) { + return FindFileSystem(directory).DirectoryExists(directory, opener); } -void VirtualFileSystem::CreateDirectory(const string &directory) { - FindFileSystem(directory).CreateDirectory(directory); +void VirtualFileSystem::CreateDirectory(const string &directory, optional_ptr opener) { + FindFileSystem(directory).CreateDirectory(directory, opener); } -void VirtualFileSystem::RemoveDirectory(const string &directory) { - FindFileSystem(directory).RemoveDirectory(directory); +void VirtualFileSystem::RemoveDirectory(const string &directory, optional_ptr opener) { + FindFileSystem(directory).RemoveDirectory(directory, opener); } bool VirtualFileSystem::ListFiles(const string &directory, const std::function &callback, @@ -92,19 +97,20 @@ bool VirtualFileSystem::ListFiles(const string &directory, const std::function opener) { + FindFileSystem(source).MoveFile(source, target, opener); } -bool VirtualFileSystem::FileExists(const string &filename) { - return FindFileSystem(filename).FileExists(filename); +bool VirtualFileSystem::FileExists(const string &filename, optional_ptr opener) { + return FindFileSystem(filename).FileExists(filename, opener); } -bool VirtualFileSystem::IsPipe(const string &filename) { - return FindFileSystem(filename).IsPipe(filename); +bool VirtualFileSystem::IsPipe(const string &filename, optional_ptr opener) { + return FindFileSystem(filename).IsPipe(filename, opener); } -void VirtualFileSystem::RemoveFile(const string &filename) { - FindFileSystem(filename).RemoveFile(filename); + +void VirtualFileSystem::RemoveFile(const string &filename, optional_ptr opener) { + FindFileSystem(filename).RemoveFile(filename, opener); } string VirtualFileSystem::PathSeparator(const string &path) { @@ -174,11 +180,18 @@ FileSystem &VirtualFileSystem::FindFileSystem(const string &path) { } FileSystem &VirtualFileSystem::FindFileSystemInternal(const string &path) { + FileSystem *fs = nullptr; for (auto &sub_system : sub_systems) { if (sub_system->CanHandleFile(path)) { - return *sub_system; + if (sub_system->IsManuallySet()) { + return *sub_system; + } + fs = sub_system.get(); } } + if (fs) { + return *fs; + } return *default_fs; } diff --git a/src/duckdb/src/core_functions/aggregate/algebraic/avg.cpp b/src/duckdb/src/core_functions/aggregate/algebraic/avg.cpp index 9cebfc4a..d00e743f 100644 --- a/src/duckdb/src/core_functions/aggregate/algebraic/avg.cpp +++ b/src/duckdb/src/core_functions/aggregate/algebraic/avg.cpp @@ -93,7 +93,7 @@ struct IntegerAverageOperation : public BaseSumOperation { +struct IntegerAverageOperationHugeint : public BaseSumOperation { template static void Finalize(STATE &state, T &target, AggregateFinalizeData &finalize_data) { if (state.count == 0) { @@ -105,7 +105,7 @@ struct IntegerAverageOperationHugeint : public BaseSumOperation { +struct HugeintAverageOperation : public BaseSumOperation { template static void Finalize(STATE &state, T &target, AggregateFinalizeData &finalize_data) { if (state.count == 0) { diff --git a/src/duckdb/src/core_functions/aggregate/distributive/minmax.cpp b/src/duckdb/src/core_functions/aggregate/distributive/minmax.cpp index aa324b23..d3a5dd49 100644 --- a/src/duckdb/src/core_functions/aggregate/distributive/minmax.cpp +++ b/src/duckdb/src/core_functions/aggregate/distributive/minmax.cpp @@ -607,12 +607,12 @@ unique_ptr BindMinMax(ClientContext &context, AggregateFunction &f FunctionBinder function_binder(context); vector types {arguments[0]->return_type, arguments[0]->return_type}; ErrorData error; - idx_t best_function = function_binder.BindFunction(func_entry.name, func_entry.functions, types, error); - if (best_function == DConstants::INVALID_INDEX) { + auto best_function = function_binder.BindFunction(func_entry.name, func_entry.functions, types, error); + if (!best_function.IsValid()) { throw BinderException(string("Fail to find corresponding function for collation min/max: ") + error.Message()); } - function = func_entry.functions.GetFunctionByOffset(best_function); + function = func_entry.functions.GetFunctionByOffset(best_function.GetIndex()); // Create a copied child and PushCollation for it. arguments.push_back(arguments[0]->Copy()); diff --git a/src/duckdb/src/core_functions/aggregate/distributive/sum.cpp b/src/duckdb/src/core_functions/aggregate/distributive/sum.cpp index 9f243869..9162f72b 100644 --- a/src/duckdb/src/core_functions/aggregate/distributive/sum.cpp +++ b/src/duckdb/src/core_functions/aggregate/distributive/sum.cpp @@ -32,7 +32,7 @@ struct IntegerSumOperation : public BaseSumOperation { +struct SumToHugeintOperation : public BaseSumOperation { template static void Finalize(STATE &state, T &target, AggregateFinalizeData &finalize_data) { if (!state.isset) { @@ -58,7 +58,7 @@ struct DoubleSumOperation : public BaseSumOperation; using KahanSumOperation = DoubleSumOperation; -struct HugeintSumOperation : public BaseSumOperation { +struct HugeintSumOperation : public BaseSumOperation { template static void Finalize(STATE &state, T &target, AggregateFinalizeData &finalize_data) { if (!state.isset) { @@ -69,6 +69,20 @@ struct HugeintSumOperation : public BaseSumOperation SumNoOverflowBind(ClientContext &context, AggregateFunction &function, + vector> &arguments) { + throw BinderException("sum_no_overflow is for internal use only!"); +} + +void SumNoOverflowSerialize(Serializer &serializer, const optional_ptr bind_data, + const AggregateFunction &function) { + return; +} + +unique_ptr SumNoOverflowDeserialize(Deserializer &deserializer, AggregateFunction &function) { + return nullptr; +} + AggregateFunction GetSumAggregateNoOverflow(PhysicalType type) { switch (type) { case PhysicalType::INT32: { @@ -76,6 +90,9 @@ AggregateFunction GetSumAggregateNoOverflow(PhysicalType type) { LogicalType::INTEGER, LogicalType::HUGEINT); function.name = "sum_no_overflow"; function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT; + function.bind = SumNoOverflowBind; + function.serialize = SumNoOverflowSerialize; + function.deserialize = SumNoOverflowDeserialize; return function; } case PhysicalType::INT64: { @@ -83,6 +100,9 @@ AggregateFunction GetSumAggregateNoOverflow(PhysicalType type) { LogicalType::BIGINT, LogicalType::HUGEINT); function.name = "sum_no_overflow"; function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT; + function.bind = SumNoOverflowBind; + function.serialize = SumNoOverflowSerialize; + function.deserialize = SumNoOverflowDeserialize; return function; } default: @@ -90,6 +110,14 @@ AggregateFunction GetSumAggregateNoOverflow(PhysicalType type) { } } +AggregateFunction GetSumAggregateNoOverflowDecimal() { + AggregateFunction aggr({LogicalTypeId::DECIMAL}, LogicalTypeId::DECIMAL, nullptr, nullptr, nullptr, nullptr, + nullptr, FunctionNullHandling::DEFAULT_NULL_HANDLING, nullptr, SumNoOverflowBind); + aggr.serialize = SumNoOverflowSerialize; + aggr.deserialize = SumNoOverflowDeserialize; + return aggr; +} + unique_ptr SumPropagateStats(ClientContext &context, BoundAggregateExpression &expr, AggregateStatisticsInput &input) { if (input.node_stats && input.node_stats->has_max_cardinality) { @@ -173,17 +201,6 @@ unique_ptr BindDecimalSum(ClientContext &context, AggregateFunctio return nullptr; } -unique_ptr BindDecimalSumNoOverflow(ClientContext &context, AggregateFunction &function, - vector> &arguments) { - auto decimal_type = arguments[0]->return_type; - function = GetSumAggregateNoOverflow(decimal_type.InternalType()); - function.name = "sum_no_overflow"; - function.arguments[0] = decimal_type; - function.return_type = LogicalType::DECIMAL(Decimal::MAX_WIDTH_DECIMAL, DecimalType::GetScale(decimal_type)); - function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT; - return nullptr; -} - AggregateFunctionSet SumFun::GetFunctions() { AggregateFunctionSet sum; // decimal @@ -203,9 +220,7 @@ AggregateFunctionSet SumNoOverflowFun::GetFunctions() { AggregateFunctionSet sum_no_overflow; sum_no_overflow.AddFunction(GetSumAggregateNoOverflow(PhysicalType::INT32)); sum_no_overflow.AddFunction(GetSumAggregateNoOverflow(PhysicalType::INT64)); - sum_no_overflow.AddFunction( - AggregateFunction({LogicalTypeId::DECIMAL}, LogicalTypeId::DECIMAL, nullptr, nullptr, nullptr, nullptr, nullptr, - FunctionNullHandling::DEFAULT_NULL_HANDLING, nullptr, BindDecimalSumNoOverflow)); + sum_no_overflow.AddFunction(GetSumAggregateNoOverflowDecimal()); return sum_no_overflow; } diff --git a/src/duckdb/src/core_functions/aggregate/holistic/quantile.cpp b/src/duckdb/src/core_functions/aggregate/holistic/quantile.cpp index 7a7693a6..c82f7dff 100644 --- a/src/duckdb/src/core_functions/aggregate/holistic/quantile.cpp +++ b/src/duckdb/src/core_functions/aggregate/holistic/quantile.cpp @@ -1502,6 +1502,9 @@ unique_ptr BindQuantile(ClientContext &context, AggregateFunction throw BinderException("QUANTILE can only take constant parameters"); } Value quantile_val = ExpressionExecutor::EvaluateScalar(context, *arguments[1]); + if (quantile_val.IsNull()) { + throw BinderException("QUANTILE argument must not be NULL"); + } vector quantiles; if (quantile_val.type().id() != LogicalTypeId::LIST) { quantiles.push_back(CheckQuantile(quantile_val)); diff --git a/src/duckdb/src/core_functions/aggregate/nested/list.cpp b/src/duckdb/src/core_functions/aggregate/nested/list.cpp index 1895cd27..3ac86573 100644 --- a/src/duckdb/src/core_functions/aggregate/nested/list.cpp +++ b/src/duckdb/src/core_functions/aggregate/nested/list.cpp @@ -63,6 +63,7 @@ static void ListUpdateFunction(Vector inputs[], AggregateInputData &aggr_input_d for (idx_t i = 0; i < count; i++) { auto &state = *states[states_data.sel->get_index(i)]; + aggr_input_data.allocator.AlignNext(); list_bind_data.functions.AppendRow(aggr_input_data.allocator, state.linked_list, input_data, i); } } @@ -178,6 +179,7 @@ static void ListCombineFunction(Vector &states_vector, Vector &combined, Aggrega Vector::RecursiveToUnifiedFormat(input, entry_count, input_data); for (idx_t entry_idx = 0; entry_idx < entry_count; ++entry_idx) { + aggr_input_data.allocator.AlignNext(); list_bind_data.functions.AppendRow(aggr_input_data.allocator, target.linked_list, input_data, entry_idx); } } diff --git a/src/duckdb/src/core_functions/core_functions.cpp b/src/duckdb/src/core_functions/core_functions.cpp index 25a57f59..ef1687dc 100644 --- a/src/duckdb/src/core_functions/core_functions.cpp +++ b/src/duckdb/src/core_functions/core_functions.cpp @@ -6,7 +6,7 @@ namespace duckdb { template -void FillExtraInfo(StaticFunctionDefinition &function, T &info) { +void FillExtraInfo(const StaticFunctionDefinition &function, T &info) { info.internal = true; info.description = function.description; info.parameter_names = StringUtil::Split(function.parameters, ","); diff --git a/src/duckdb/src/core_functions/function_list.cpp b/src/duckdb/src/core_functions/function_list.cpp index 0652abbe..540752a4 100644 --- a/src/duckdb/src/core_functions/function_list.cpp +++ b/src/duckdb/src/core_functions/function_list.cpp @@ -47,7 +47,7 @@ namespace duckdb { { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr } // this list is generated by scripts/generate_functions.py -static StaticFunctionDefinition internal_functions[] = { +static const StaticFunctionDefinition internal_functions[] = { DUCKDB_SCALAR_FUNCTION(FactorialOperatorFun), DUCKDB_SCALAR_FUNCTION_SET(BitwiseAndFun), DUCKDB_SCALAR_FUNCTION(PowOperatorFun), @@ -394,7 +394,7 @@ static StaticFunctionDefinition internal_functions[] = { FINAL_FUNCTION }; -StaticFunctionDefinition *StaticFunctionDefinition::GetFunctionList() { +const StaticFunctionDefinition *StaticFunctionDefinition::GetFunctionList() { return internal_functions; } diff --git a/src/duckdb/src/core_functions/scalar/date/time_bucket.cpp b/src/duckdb/src/core_functions/scalar/date/time_bucket.cpp index d317ea60..31ae5f53 100644 --- a/src/duckdb/src/core_functions/scalar/date/time_bucket.cpp +++ b/src/duckdb/src/core_functions/scalar/date/time_bucket.cpp @@ -22,7 +22,7 @@ struct TimeBucket { // There are 360 months between 1970-01-01 and 2000-01-01 constexpr static const int32_t DEFAULT_ORIGIN_MONTHS = 360; - enum struct BucketWidthType { CONVERTIBLE_TO_MICROS, CONVERTIBLE_TO_MONTHS, UNCLASSIFIED }; + enum struct BucketWidthType : uint8_t { CONVERTIBLE_TO_MICROS, CONVERTIBLE_TO_MONTHS, UNCLASSIFIED }; static inline BucketWidthType ClassifyBucketWidth(const interval_t bucket_width) { if (bucket_width.months == 0 && Interval::GetMicro(bucket_width) > 0) { diff --git a/src/duckdb/src/core_functions/scalar/generic/system_functions.cpp b/src/duckdb/src/core_functions/scalar/generic/system_functions.cpp index 2abb4059..6ef537ba 100644 --- a/src/duckdb/src/core_functions/scalar/generic/system_functions.cpp +++ b/src/duckdb/src/core_functions/scalar/generic/system_functions.cpp @@ -7,6 +7,7 @@ #include "duckdb/catalog/catalog_entry/aggregate_function_catalog_entry.hpp" #include "duckdb/transaction/duck_transaction.hpp" #include "duckdb/main/database_manager.hpp" +#include "duckdb/execution/expression_executor.hpp" namespace duckdb { @@ -28,25 +29,52 @@ static void CurrentDatabaseFunction(DataChunk &input, ExpressionState &state, Ve result.Reference(val); } -// current_schemas -static void CurrentSchemasFunction(DataChunk &input, ExpressionState &state, Vector &result) { - if (!input.AllConstant()) { +struct CurrentSchemasBindData : public FunctionData { + explicit CurrentSchemasBindData(Value result_value) : result(std::move(result_value)) { + } + + Value result; + +public: + unique_ptr Copy() const override { + return make_uniq(result); + } + bool Equals(const FunctionData &other_p) const override { + auto &other = other_p.Cast(); + return Value::NotDistinctFrom(result, other.result); + } +}; + +static unique_ptr CurrentSchemasBind(ClientContext &context, ScalarFunction &bound_function, + vector> &arguments) { + if (arguments[0]->return_type.id() != LogicalTypeId::BOOLEAN) { + throw BinderException("current_schemas requires a boolean input"); + } + if (!arguments[0]->IsFoldable()) { throw NotImplementedException("current_schemas requires a constant input"); } - if (ConstantVector::IsNull(input.data[0])) { - result.SetVectorType(VectorType::CONSTANT_VECTOR); - ConstantVector::SetNull(result, true); - return; + Value schema_value = ExpressionExecutor::EvaluateScalar(context, *arguments[0]); + Value result_val; + if (schema_value.IsNull()) { + // null + result_val = Value(LogicalType::LIST(LogicalType::VARCHAR)); + } else { + auto implicit_schemas = BooleanValue::Get(schema_value); + vector schema_list; + auto &catalog_search_path = ClientData::Get(context).catalog_search_path; + auto &search_path = implicit_schemas ? catalog_search_path->Get() : catalog_search_path->GetSetPaths(); + std::transform(search_path.begin(), search_path.end(), std::back_inserter(schema_list), + [](const CatalogSearchEntry &s) -> Value { return Value(s.schema); }); + result_val = Value::LIST(LogicalType::VARCHAR, schema_list); } - auto implicit_schemas = *ConstantVector::GetData(input.data[0]); - vector schema_list; - auto &catalog_search_path = ClientData::Get(state.GetContext()).catalog_search_path; - auto &search_path = implicit_schemas ? catalog_search_path->Get() : catalog_search_path->GetSetPaths(); - std::transform(search_path.begin(), search_path.end(), std::back_inserter(schema_list), - [](const CatalogSearchEntry &s) -> Value { return Value(s.schema); }); - - auto val = Value::LIST(LogicalType::VARCHAR, schema_list); - result.Reference(val); + return make_uniq(std::move(result_val)); +} + +// current_schemas +static void CurrentSchemasFunction(DataChunk &input, ExpressionState &state, Vector &result) { + auto &func_expr = state.expr.Cast(); + auto &info = func_expr.bind_info->Cast(); + result.Reference(info.result); } // in_search_path @@ -94,7 +122,8 @@ ScalarFunction CurrentDatabaseFun::GetFunction() { ScalarFunction CurrentSchemasFun::GetFunction() { auto varchar_list_type = LogicalType::LIST(LogicalType::VARCHAR); - ScalarFunction current_schemas({LogicalType::BOOLEAN}, varchar_list_type, CurrentSchemasFunction); + ScalarFunction current_schemas({LogicalType::BOOLEAN}, varchar_list_type, CurrentSchemasFunction, + CurrentSchemasBind); current_schemas.stability = FunctionStability::CONSISTENT_WITHIN_QUERY; return current_schemas; } diff --git a/src/duckdb/src/core_functions/scalar/list/array_slice.cpp b/src/duckdb/src/core_functions/scalar/list/array_slice.cpp index 7651f410..83415d96 100644 --- a/src/duckdb/src/core_functions/scalar/list/array_slice.cpp +++ b/src/duckdb/src/core_functions/scalar/list/array_slice.cpp @@ -97,7 +97,7 @@ static bool ClampSlice(const INPUT_TYPE &value, INDEX_TYPE &begin, INDEX_TYPE &e } const auto length = ValueLength(value); - if (begin < 0 && -begin > length && end < 0 && -end > length) { + if (begin < 0 && -begin > length && end < 0 && end < -length) { begin = 0; end = 0; return true; diff --git a/src/duckdb/src/core_functions/scalar/list/flatten.cpp b/src/duckdb/src/core_functions/scalar/list/flatten.cpp index 34cd5515..4833dc7a 100644 --- a/src/duckdb/src/core_functions/scalar/list/flatten.cpp +++ b/src/duckdb/src/core_functions/scalar/list/flatten.cpp @@ -3,6 +3,7 @@ #include "duckdb/planner/expression/bound_function_expression.hpp" #include "duckdb/storage/statistics/list_stats.hpp" #include "duckdb/function/scalar/nested_functions.hpp" +#include "duckdb/planner/expression/bound_cast_expression.hpp" namespace duckdb { @@ -17,24 +18,33 @@ void ListFlattenFunction(DataChunk &args, ExpressionState &state, Vector &result idx_t count = args.size(); - UnifiedVectorFormat list_data; - input.ToUnifiedFormat(count, list_data); - auto list_entries = UnifiedVectorFormat::GetData(list_data); - auto &child_vector = ListVector::GetEntry(input); - + // Prepare the result vector result.SetVectorType(VectorType::FLAT_VECTOR); + // This holds the new offsets and lengths auto result_entries = FlatVector::GetData(result); auto &result_validity = FlatVector::Validity(result); - if (child_vector.GetType().id() == LogicalTypeId::SQLNULL) { - for (idx_t i = 0; i < count; i++) { - auto list_index = list_data.sel->get_index(i); - if (!list_data.validity.RowIsValid(list_index)) { - result_validity.SetInvalid(i); + // The outermost list in each row + UnifiedVectorFormat row_data; + input.ToUnifiedFormat(count, row_data); + auto row_entries = UnifiedVectorFormat::GetData(row_data); + + // The list elements in each row: [HERE, ...] + auto &row_lists = ListVector::GetEntry(input); + UnifiedVectorFormat row_lists_data; + idx_t total_row_lists = ListVector::GetListSize(input); + row_lists.ToUnifiedFormat(total_row_lists, row_lists_data); + auto row_lists_entries = UnifiedVectorFormat::GetData(row_lists_data); + + if (row_lists.GetType().id() == LogicalTypeId::SQLNULL) { + for (idx_t row_cnt = 0; row_cnt < count; row_cnt++) { + auto row_idx = row_data.sel->get_index(row_cnt); + if (!row_data.validity.RowIsValid(row_idx)) { + result_validity.SetInvalid(row_cnt); continue; } - result_entries[i].offset = 0; - result_entries[i].length = 0; + result_entries[row_cnt].offset = 0; + result_entries[row_cnt].length = 0; } if (args.AllConstant()) { result.SetVectorType(VectorType::CONSTANT_VECTOR); @@ -42,48 +52,59 @@ void ListFlattenFunction(DataChunk &args, ExpressionState &state, Vector &result return; } - auto child_size = ListVector::GetListSize(input); - UnifiedVectorFormat child_data; - child_vector.ToUnifiedFormat(child_size, child_data); - auto child_entries = UnifiedVectorFormat::GetData(child_data); - auto &data_vector = ListVector::GetEntry(child_vector); - - idx_t offset = 0; - for (idx_t i = 0; i < count; i++) { - auto list_index = list_data.sel->get_index(i); - if (!list_data.validity.RowIsValid(list_index)) { - result_validity.SetInvalid(i); + // The actual elements inside each row list: [[HERE, ...], []] + // This one becomes the child vector of the result. + auto &elem_vector = ListVector::GetEntry(row_lists); + + // We'll use this selection vector to slice the elem_vector. + idx_t child_elem_cnt = ListVector::GetListSize(row_lists); + SelectionVector sel(child_elem_cnt); + idx_t sel_idx = 0; + + // HERE, [[]], ... + for (idx_t row_cnt = 0; row_cnt < count; row_cnt++) { + auto row_idx = row_data.sel->get_index(row_cnt); + + if (!row_data.validity.RowIsValid(row_idx)) { + result_validity.SetInvalid(row_cnt); continue; } - auto list_entry = list_entries[list_index]; - - idx_t source_offset = 0; - // Find first valid child list entry to get offset - for (idx_t j = 0; j < list_entry.length; j++) { - auto child_list_index = child_data.sel->get_index(list_entry.offset + j); - if (child_data.validity.RowIsValid(child_list_index)) { - source_offset = child_entries[child_list_index].offset; - break; + + idx_t list_offset = sel_idx; + idx_t list_length = 0; + + // [HERE, [...], ...] + auto row_entry = row_entries[row_idx]; + for (idx_t row_lists_cnt = 0; row_lists_cnt < row_entry.length; row_lists_cnt++) { + auto row_lists_idx = row_lists_data.sel->get_index(row_entry.offset + row_lists_cnt); + + // Skip invalid lists + if (!row_lists_data.validity.RowIsValid(row_lists_idx)) { + continue; } - } - idx_t length = 0; - // Find last valid child list entry to get length - for (idx_t j = list_entry.length - 1; j != (idx_t)-1; j--) { - auto child_list_index = child_data.sel->get_index(list_entry.offset + j); - if (child_data.validity.RowIsValid(child_list_index)) { - auto child_entry = child_entries[child_list_index]; - length = child_entry.offset + child_entry.length - source_offset; - break; + // [[HERE, ...], [.., ...]] + auto list_entry = row_lists_entries[row_lists_idx]; + list_length += list_entry.length; + + for (idx_t elem_cnt = 0; elem_cnt < list_entry.length; elem_cnt++) { + // offset of the element in the elem_vector. + idx_t offset = list_entry.offset + elem_cnt; + sel.set_index(sel_idx, offset); + sel_idx++; } } - ListVector::Append(result, data_vector, source_offset + length, source_offset); - result_entries[i].offset = offset; - result_entries[i].length = length; - offset += length; + result_entries[row_cnt].offset = list_offset; + result_entries[row_cnt].length = list_length; } + ListVector::SetListSize(result, sel_idx); + + auto &result_child_vector = ListVector::GetEntry(result); + result_child_vector.Slice(elem_vector, sel, sel_idx); + result_child_vector.Flatten(sel_idx); + if (args.AllConstant()) { result.SetVectorType(VectorType::CONSTANT_VECTOR); } @@ -93,6 +114,22 @@ static unique_ptr ListFlattenBind(ClientContext &context, ScalarFu vector> &arguments) { D_ASSERT(bound_function.arguments.size() == 1); + if (arguments[0]->return_type.id() == LogicalTypeId::ARRAY) { + auto child_type = ArrayType::GetChildType(arguments[0]->return_type); + if (child_type.id() == LogicalTypeId::ARRAY) { + child_type = LogicalType::LIST(ArrayType::GetChildType(child_type)); + } + arguments[0] = + BoundCastExpression::AddCastToType(context, std::move(arguments[0]), LogicalType::LIST(child_type)); + } else if (arguments[0]->return_type.id() == LogicalTypeId::LIST) { + auto child_type = ListType::GetChildType(arguments[0]->return_type); + if (child_type.id() == LogicalTypeId::ARRAY) { + child_type = LogicalType::LIST(ArrayType::GetChildType(child_type)); + arguments[0] = + BoundCastExpression::AddCastToType(context, std::move(arguments[0]), LogicalType::LIST(child_type)); + } + } + auto &input_type = arguments[0]->return_type; bound_function.arguments[0] = input_type; if (input_type.id() == LogicalTypeId::UNKNOWN) { diff --git a/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp b/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp index 7dabeb86..fe7a95fc 100644 --- a/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +++ b/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp @@ -474,12 +474,12 @@ static unique_ptr ListAggregatesBind(ClientContext &context, Scala FunctionBinder function_binder(context); auto best_function_idx = function_binder.BindFunction(func.name, func.functions, types, error); - if (best_function_idx == DConstants::INVALID_INDEX) { + if (!best_function_idx.IsValid()) { throw BinderException("No matching aggregate function\n%s", error.Message()); } // found a matching function, bind it as an aggregate - auto best_function = func.functions.GetFunctionByOffset(best_function_idx); + auto best_function = func.functions.GetFunctionByOffset(best_function_idx.GetIndex()); if (IS_AGGR) { return ListAggregatesBindFunction(context, bound_function, child_type, best_function, arguments); } diff --git a/src/duckdb/src/core_functions/scalar/list/list_sort.cpp b/src/duckdb/src/core_functions/scalar/list/list_sort.cpp index 1226430c..9e52f4ea 100644 --- a/src/duckdb/src/core_functions/scalar/list/list_sort.cpp +++ b/src/duckdb/src/core_functions/scalar/list/list_sort.cpp @@ -239,6 +239,9 @@ static void ListSortFunction(DataChunk &args, ExpressionState &state, Vector &re auto &result_entry = ListVector::GetEntry(result); auto result_data = ListVector::GetData(result); for (idx_t i = 0; i < count; i++) { + if (!result_validity.RowIsValid(i)) { + continue; + } for (idx_t j = result_data[i].offset; j < result_data[i].offset + result_data[i].length; j++) { auto b = sel_sorted.get_index(j) - result_data[i].offset; result_entry.SetValue(j, Value::BIGINT(b + 1)); diff --git a/src/duckdb/src/core_functions/scalar/math/numeric.cpp b/src/duckdb/src/core_functions/scalar/math/numeric.cpp index d47887f9..711f9260 100644 --- a/src/duckdb/src/core_functions/scalar/math/numeric.cpp +++ b/src/duckdb/src/core_functions/scalar/math/numeric.cpp @@ -167,7 +167,8 @@ ScalarFunctionSet AbsOperatorFun::GetFunctions() { case LogicalTypeId::TINYINT: case LogicalTypeId::SMALLINT: case LogicalTypeId::INTEGER: - case LogicalTypeId::BIGINT: { + case LogicalTypeId::BIGINT: + case LogicalTypeId::HUGEINT: { ScalarFunction func({type}, type, ScalarFunction::GetScalarUnaryFunction(type)); func.statistics = PropagateAbsStats; abs.AddFunction(func); @@ -575,7 +576,7 @@ static void DecimalRoundNegativePrecisionFunction(DataChunk &input, ExpressionSt auto &info = func_expr.bind_info->Cast(); auto source_scale = DecimalType::GetScale(func_expr.children[0]->return_type); auto width = DecimalType::GetWidth(func_expr.children[0]->return_type); - if (info.target_scale <= -int32_t(width)) { + if (info.target_scale <= -int32_t(width - source_scale)) { // scale too big for width result.SetVectorType(VectorType::CONSTANT_VECTOR); result.SetValue(0, Value::INTEGER(0)); diff --git a/src/duckdb/src/core_functions/scalar/string/hex.cpp b/src/duckdb/src/core_functions/scalar/string/hex.cpp index 27548289..dffbae70 100644 --- a/src/duckdb/src/core_functions/scalar/string/hex.cpp +++ b/src/duckdb/src/core_functions/scalar/string/hex.cpp @@ -392,16 +392,14 @@ ScalarFunctionSet HexFun::GetFunctions() { ScalarFunctionSet to_hex; to_hex.AddFunction( ScalarFunction({LogicalType::VARCHAR}, LogicalType::VARCHAR, ToHexFunction)); - + to_hex.AddFunction( + ScalarFunction({LogicalType::BLOB}, LogicalType::VARCHAR, ToHexFunction)); to_hex.AddFunction( ScalarFunction({LogicalType::BIGINT}, LogicalType::VARCHAR, ToHexFunction)); - to_hex.AddFunction( ScalarFunction({LogicalType::UBIGINT}, LogicalType::VARCHAR, ToHexFunction)); - to_hex.AddFunction( ScalarFunction({LogicalType::HUGEINT}, LogicalType::VARCHAR, ToHexFunction)); - to_hex.AddFunction( ScalarFunction({LogicalType::UHUGEINT}, LogicalType::VARCHAR, ToHexFunction)); return to_hex; diff --git a/src/duckdb/src/core_functions/scalar/string/repeat.cpp b/src/duckdb/src/core_functions/scalar/string/repeat.cpp index 551095ea..afe3269f 100644 --- a/src/duckdb/src/core_functions/scalar/string/repeat.cpp +++ b/src/duckdb/src/core_functions/scalar/string/repeat.cpp @@ -1,34 +1,25 @@ -#include "duckdb/common/exception.hpp" #include "duckdb/common/vector_operations/binary_executor.hpp" #include "duckdb/core_functions/scalar/string_functions.hpp" -#include -#include - namespace duckdb { -static string_t RepeatScalarFunction(const string_t &str, const int64_t cnt, vector &result) { - // Get information about the repeated string - auto input_str = str.GetData(); - auto size_str = str.GetSize(); - - // Reuse the buffer - result.clear(); - for (auto remaining = cnt; remaining-- > 0;) { - result.insert(result.end(), input_str, input_str + size_str); - } - - return string_t(result.data(), UnsafeNumericCast(result.size())); -} - -static void RepeatFunction(DataChunk &args, ExpressionState &state, Vector &result) { +static void RepeatFunction(DataChunk &args, ExpressionState &, Vector &result) { auto &str_vector = args.data[0]; auto &cnt_vector = args.data[1]; - vector buffer; BinaryExecutor::Execute( str_vector, cnt_vector, result, args.size(), [&](string_t str, int64_t cnt) { - return StringVector::AddString(result, RepeatScalarFunction(str, cnt, buffer)); + auto input_str = str.GetData(); + auto size_str = str.GetSize(); + + idx_t copy_count = cnt <= 0 || size_str == 0 ? 0 : idx_t(cnt); + auto result_str = StringVector::EmptyString(result, size_str * copy_count); + auto result_data = result_str.GetDataWriteable(); + for (idx_t i = 0; i < copy_count; i++) { + memcpy(result_data + i * size_str, input_str, size_str); + } + result_str.Finalize(); + return result_str; }); } diff --git a/src/duckdb/src/execution/column_binding_resolver.cpp b/src/duckdb/src/execution/column_binding_resolver.cpp index 16266285..56838150 100644 --- a/src/duckdb/src/execution/column_binding_resolver.cpp +++ b/src/duckdb/src/execution/column_binding_resolver.cpp @@ -162,17 +162,9 @@ unique_ptr ColumnBindingResolver::VisitReplace(BoundColumnRefExpress // LCOV_EXCL_START // could not bind the column reference, this should never happen and indicates a bug in the code // generate an error message - string bound_columns = "["; - for (idx_t i = 0; i < bindings.size(); i++) { - if (i != 0) { - bound_columns += " "; - } - bound_columns += to_string(bindings[i].table_index) + "." + to_string(bindings[i].column_index); - } - bound_columns += "]"; - throw InternalException("Failed to bind column reference \"%s\" [%d.%d] (bindings: %s)", expr.alias, - expr.binding.table_index, expr.binding.column_index, bound_columns); + expr.binding.table_index, expr.binding.column_index, + LogicalOperator::ColumnBindingsToString(bindings)); // LCOV_EXCL_STOP } diff --git a/src/duckdb/src/execution/expression_executor.cpp b/src/duckdb/src/execution/expression_executor.cpp index 9f7c1194..8c70ca22 100644 --- a/src/duckdb/src/execution/expression_executor.cpp +++ b/src/duckdb/src/execution/expression_executor.cpp @@ -87,9 +87,7 @@ void ExpressionExecutor::ExecuteExpression(DataChunk &input, Vector &result) { idx_t ExpressionExecutor::SelectExpression(DataChunk &input, SelectionVector &sel) { D_ASSERT(expressions.size() == 1); SetChunk(&input); - states[0]->profiler.BeginSample(); idx_t selected_tuples = Select(*expressions[0], states[0]->root_state.get(), nullptr, input.size(), &sel, nullptr); - states[0]->profiler.EndSample(NumericCast(chunk ? chunk->size() : 0)); return selected_tuples; } @@ -101,9 +99,7 @@ void ExpressionExecutor::ExecuteExpression(Vector &result) { void ExpressionExecutor::ExecuteExpression(idx_t expr_idx, Vector &result) { D_ASSERT(expr_idx < expressions.size()); D_ASSERT(result.GetType().id() == expressions[expr_idx]->return_type.id()); - states[expr_idx]->profiler.BeginSample(); Execute(*expressions[expr_idx], states[expr_idx]->root_state.get(), nullptr, chunk ? chunk->size() : 1, result); - states[expr_idx]->profiler.EndSample(NumericCast(chunk ? chunk->size() : 0)); } Value ExpressionExecutor::EvaluateScalar(ClientContext &context, const Expression &expr, bool allow_unfoldable) { diff --git a/src/duckdb/src/execution/expression_executor/execute_comparison.cpp b/src/duckdb/src/execution/expression_executor/execute_comparison.cpp index 1467d6c4..58a4e480 100644 --- a/src/duckdb/src/execution/expression_executor/execute_comparison.cpp +++ b/src/duckdb/src/execution/expression_executor/execute_comparison.cpp @@ -58,48 +58,87 @@ void ExpressionExecutor::Execute(const BoundComparisonExpression &expr, Expressi } } +static void UpdateNullMask(Vector &vec, optional_ptr sel, idx_t count, ValidityMask &null_mask) { + UnifiedVectorFormat vdata; + vec.ToUnifiedFormat(count, vdata); + + if (vdata.validity.AllValid()) { + return; + } + + if (!sel) { + sel = FlatVector::IncrementalSelectionVector(); + } + + for (idx_t i = 0; i < count; ++i) { + const auto ridx = sel->get_index(i); + const auto vidx = vdata.sel->get_index(i); + if (!vdata.validity.RowIsValid(vidx)) { + null_mask.SetInvalid(ridx); + } + } +} + template -static idx_t NestedSelectOperation(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); +static idx_t NestedSelectOperation(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask); template -static idx_t TemplatedSelectOperation(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - // the inplace loops take the result as the last parameter +static idx_t TemplatedSelectOperation(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { + if (null_mask) { + UpdateNullMask(left, sel, count, *null_mask); + UpdateNullMask(right, sel, count, *null_mask); + } switch (left.GetType().InternalType()) { case PhysicalType::BOOL: case PhysicalType::INT8: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::INT16: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::INT32: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::INT64: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::UINT8: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::UINT16: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::UINT32: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::UINT64: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::INT128: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::UINT128: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::FLOAT: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), false_sel.get()); case PhysicalType::DOUBLE: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::INTERVAL: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::VARCHAR: - return BinaryExecutor::Select(left, right, sel, count, true_sel, false_sel); + return BinaryExecutor::Select(left, right, sel.get(), count, true_sel.get(), + false_sel.get()); case PhysicalType::LIST: case PhysicalType::STRUCT: case PhysicalType::ARRAY: - return NestedSelectOperation(left, right, sel, count, true_sel, false_sel); + return NestedSelectOperation(left, right, sel, count, true_sel, false_sel, null_mask); default: throw InternalException("Invalid type for comparison"); } @@ -109,52 +148,66 @@ struct NestedSelector { // Select the matching rows for the values of a nested type that are not both NULL. // Those semantics are the same as the corresponding non-distinct comparator template - static idx_t Select(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { + static idx_t Select(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { throw InvalidTypeException(left.GetType(), "Invalid operation for nested SELECT"); } }; template <> -idx_t NestedSelector::Select(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return VectorOperations::NestedEquals(left, right, sel, count, true_sel, false_sel); +idx_t NestedSelector::Select(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::NestedEquals(left, right, sel, count, true_sel, false_sel, null_mask); } template <> -idx_t NestedSelector::Select(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return VectorOperations::NestedNotEquals(left, right, sel, count, true_sel, false_sel); +idx_t NestedSelector::Select(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::NestedNotEquals(left, right, sel, count, true_sel, false_sel, null_mask); } template <> -idx_t NestedSelector::Select(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return VectorOperations::DistinctLessThan(left, right, &sel, count, true_sel, false_sel); +idx_t NestedSelector::Select(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctLessThan(left, right, sel, count, true_sel, false_sel, null_mask); } template <> -idx_t NestedSelector::Select(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::DistinctLessThanEquals(left, right, &sel, count, true_sel, false_sel); +idx_t NestedSelector::Select(Vector &left, Vector &right, + optional_ptr sel, idx_t count, + optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctLessThanEquals(left, right, sel, count, true_sel, false_sel, null_mask); } template <> -idx_t NestedSelector::Select(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return VectorOperations::DistinctGreaterThan(left, right, &sel, count, true_sel, false_sel); +idx_t NestedSelector::Select(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThan(left, right, sel, count, true_sel, false_sel, null_mask); } template <> -idx_t NestedSelector::Select(Vector &left, Vector &right, const SelectionVector &sel, - idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel) { - return VectorOperations::DistinctGreaterThanEquals(left, right, &sel, count, true_sel, false_sel); +idx_t NestedSelector::Select(Vector &left, Vector &right, + optional_ptr sel, idx_t count, + optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return VectorOperations::DistinctGreaterThanEquals(left, right, sel, count, true_sel, false_sel, null_mask); } static inline idx_t SelectNotNull(Vector &left, Vector &right, const idx_t count, const SelectionVector &sel, - SelectionVector &maybe_vec, OptionalSelection &false_opt) { + SelectionVector &maybe_vec, OptionalSelection &false_opt, + optional_ptr null_mask) { UnifiedVectorFormat lvdata, rvdata; left.ToUnifiedFormat(count, lvdata); @@ -183,6 +236,9 @@ static inline idx_t SelectNotNull(Vector &left, Vector &right, const idx_t count const auto lidx = lvdata.sel->get_index(i); const auto ridx = rvdata.sel->get_index(i); if (!lmask.RowIsValid(lidx) || !rmask.RowIsValid(ridx)) { + if (null_mask) { + null_mask->SetInvalid(result_idx); + } false_opt.Append(false_count, result_idx); } else { // Neither is NULL, distinguish values. @@ -200,7 +256,8 @@ static inline idx_t SelectNotNull(Vector &left, Vector &right, const idx_t count return remaining; } -static void ScatterSelection(SelectionVector *target, const idx_t count, const SelectionVector &dense_vec) { +static void ScatterSelection(optional_ptr target, const idx_t count, + const SelectionVector &dense_vec) { if (target) { for (idx_t i = 0; i < count; ++i) { target->set_index(i, dense_vec.get_index(i)); @@ -209,8 +266,9 @@ static void ScatterSelection(SelectionVector *target, const idx_t count, const S } template -static idx_t NestedSelectOperation(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { +static idx_t NestedSelectOperation(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { // The Select operations all use a dense pair of input vectors to partition // a selection vector in a single pass. But to implement progressive comparisons, // we have to make multiple passes, so we need to keep track of the original input positions @@ -233,12 +291,14 @@ static idx_t NestedSelectOperation(Vector &left, Vector &right, const SelectionV Vector l_not_null(left); Vector r_not_null(right); - auto match_count = SelectNotNull(l_not_null, r_not_null, count, *sel, maybe_vec, false_opt); + auto match_count = SelectNotNull(l_not_null, r_not_null, count, *sel, maybe_vec, false_opt, null_mask); auto no_match_count = count - match_count; count = match_count; // Now that we have handled the NULLs, we can use the recursive nested comparator for the rest. - match_count = NestedSelector::Select(l_not_null, r_not_null, maybe_vec, count, true_opt, false_opt); + match_count = + NestedSelector::Select(l_not_null, r_not_null, &maybe_vec, count, optional_ptr(true_opt), + optional_ptr(false_opt), null_mask); no_match_count += (count - match_count); // Copy the buffered selections to the output selections @@ -248,34 +308,41 @@ static idx_t NestedSelectOperation(Vector &left, Vector &right, const SelectionV return match_count; } -idx_t VectorOperations::Equals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel); +idx_t VectorOperations::Equals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel, null_mask); } -idx_t VectorOperations::NotEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel); +idx_t VectorOperations::NotEquals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel, null_mask); } -idx_t VectorOperations::GreaterThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel); +idx_t VectorOperations::GreaterThan(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel, null_mask); } -idx_t VectorOperations::GreaterThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel); +idx_t VectorOperations::GreaterThanEquals(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedSelectOperation(left, right, sel, count, true_sel, false_sel, null_mask); } -idx_t VectorOperations::LessThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedSelectOperation(right, left, sel, count, true_sel, false_sel); +idx_t VectorOperations::LessThan(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask) { + return TemplatedSelectOperation(right, left, sel, count, true_sel, false_sel, null_mask); } -idx_t VectorOperations::LessThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel) { - return TemplatedSelectOperation(right, left, sel, count, true_sel, false_sel); +idx_t VectorOperations::LessThanEquals(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, optional_ptr null_mask) { + return TemplatedSelectOperation(right, left, sel, count, true_sel, false_sel, null_mask); } idx_t ExpressionExecutor::Select(const BoundComparisonExpression &expr, ExpressionState *state, diff --git a/src/duckdb/src/execution/expression_executor/execute_function.cpp b/src/duckdb/src/execution/expression_executor/execute_function.cpp index c079dbb8..0a7d3261 100644 --- a/src/duckdb/src/execution/expression_executor/execute_function.cpp +++ b/src/duckdb/src/execution/expression_executor/execute_function.cpp @@ -74,10 +74,8 @@ void ExpressionExecutor::Execute(const BoundFunctionExpression &expr, Expression arguments.SetCardinality(count); arguments.Verify(); - state->profiler.BeginSample(); D_ASSERT(expr.function.function); expr.function.function(arguments, *state, result); - state->profiler.EndSample(NumericCast(count)); VerifyNullHandling(expr, arguments, result); D_ASSERT(result.GetType() == expr.return_type); diff --git a/src/duckdb/src/execution/expression_executor_state.cpp b/src/duckdb/src/execution/expression_executor_state.cpp index da5acfa6..44161f94 100644 --- a/src/duckdb/src/execution/expression_executor_state.cpp +++ b/src/duckdb/src/execution/expression_executor_state.cpp @@ -40,7 +40,7 @@ ClientContext &ExpressionState::GetContext() { ExpressionState::ExpressionState(const Expression &expr, ExpressionExecutorState &root) : expr(expr), root(root) { } -ExpressionExecutorState::ExpressionExecutorState() : profiler() { +ExpressionExecutorState::ExpressionExecutorState() { } void ExpressionState::Verify(ExpressionExecutorState &root_executor) { diff --git a/src/duckdb/src/execution/index/art/art.cpp b/src/duckdb/src/execution/index/art/art.cpp index 17fa8230..9fa44dea 100644 --- a/src/duckdb/src/execution/index/art/art.cpp +++ b/src/duckdb/src/execution/index/art/art.cpp @@ -133,13 +133,13 @@ unique_ptr ART::TryInitializeScan(const Transaction &transaction // match on a comparison type matcher.expr_type = make_uniq(); // match on a constant comparison with the indexed expression - matcher.matchers.push_back(make_uniq(const_cast(index_expr))); + matcher.matchers.push_back(make_uniq(index_expr)); matcher.matchers.push_back(make_uniq()); matcher.policy = SetMatcher::Policy::UNORDERED; vector> bindings; - if (matcher.Match(const_cast(filter_expr), bindings)) { + if (matcher.Match(const_cast(filter_expr), bindings)) { // NOLINT: Match does not alter the expr // range or equality comparison with constant value // we can use our index here // bindings[0] = the expression diff --git a/src/duckdb/src/execution/index/unknown_index.cpp b/src/duckdb/src/execution/index/unknown_index.cpp index 09b14581..e2b6a0cb 100644 --- a/src/duckdb/src/execution/index/unknown_index.cpp +++ b/src/duckdb/src/execution/index/unknown_index.cpp @@ -22,44 +22,44 @@ string UnknownIndex::GenerateErrorMessage() const { } ErrorData UnknownIndex::Append(IndexLock &, DataChunk &, Vector &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } void UnknownIndex::VerifyAppend(DataChunk &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } void UnknownIndex::VerifyAppend(DataChunk &, ConflictManager &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } void UnknownIndex::CommitDrop(IndexLock &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } void UnknownIndex::Delete(IndexLock &, DataChunk &, Vector &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } ErrorData UnknownIndex::Insert(IndexLock &, DataChunk &, Vector &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } IndexStorageInfo UnknownIndex::GetStorageInfo(bool) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } bool UnknownIndex::MergeIndexes(IndexLock &, Index &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } void UnknownIndex::Vacuum(IndexLock &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } idx_t UnknownIndex::GetInMemorySize(IndexLock &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } void UnknownIndex::CheckConstraintsForChunk(DataChunk &, ConflictManager &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } string UnknownIndex::VerifyAndToString(IndexLock &, bool) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } string UnknownIndex::GetConstraintViolationMessage(VerifyExistenceType, idx_t, DataChunk &) { - throw NotImplementedException(GenerateErrorMessage()); + throw MissingExtensionException(GenerateErrorMessage()); } } // namespace duckdb diff --git a/src/duckdb/src/execution/join_hashtable.cpp b/src/duckdb/src/execution/join_hashtable.cpp index 2b74b5bd..53adf3a8 100644 --- a/src/duckdb/src/execution/join_hashtable.cpp +++ b/src/duckdb/src/execution/join_hashtable.cpp @@ -513,7 +513,7 @@ void ScanStructure::NextInnerJoin(DataChunk &keys, DataChunk &left, DataChunk &r Store(true, ptrs[idx] + ht.tuple_size); } } - // for right semi join, just mark the entry as found and move on. Propogation happens later + // for right semi join, just mark the entry as found and move on. Propagation happens later if (ht.join_type != JoinType::RIGHT_SEMI && ht.join_type != JoinType::RIGHT_ANTI) { // matches were found // construct the result diff --git a/src/duckdb/src/execution/nested_loop_join/nested_loop_join_mark.cpp b/src/duckdb/src/execution/nested_loop_join/nested_loop_join_mark.cpp index 15977ac1..4bb1c5f2 100644 --- a/src/duckdb/src/execution/nested_loop_join/nested_loop_join_mark.cpp +++ b/src/duckdb/src/execution/nested_loop_join/nested_loop_join_mark.cpp @@ -41,7 +41,6 @@ static void TemplatedMarkJoin(Vector &left, Vector &right, idx_t lcount, idx_t r static void MarkJoinNested(Vector &left, Vector &right, idx_t lcount, idx_t rcount, bool found_match[], ExpressionType comparison_type) { Vector left_reference(left.GetType()); - SelectionVector true_sel(rcount); for (idx_t i = 0; i < lcount; i++) { if (found_match[i]) { continue; diff --git a/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer.cpp b/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer.cpp index 8c29ae79..726b994c 100644 --- a/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer.cpp +++ b/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer.cpp @@ -5,7 +5,8 @@ namespace duckdb { CSVBuffer::CSVBuffer(ClientContext &context, idx_t buffer_size_p, CSVFileHandle &file_handle, idx_t &global_csv_current_position, idx_t file_number_p) - : context(context), file_number(file_number_p), can_seek(file_handle.CanSeek()) { + : context(context), requested_size(buffer_size_p), file_number(file_number_p), can_seek(file_handle.CanSeek()), + is_pipe(file_handle.IsPipe()) { AllocateBuffer(buffer_size_p); auto buffer = Ptr(); actual_buffer_size = file_handle.Read(buffer, buffer_size_p); @@ -19,8 +20,9 @@ CSVBuffer::CSVBuffer(ClientContext &context, idx_t buffer_size_p, CSVFileHandle CSVBuffer::CSVBuffer(CSVFileHandle &file_handle, ClientContext &context, idx_t buffer_size, idx_t global_csv_current_position, idx_t file_number_p, idx_t buffer_idx_p) - : context(context), global_csv_start(global_csv_current_position), file_number(file_number_p), - can_seek(file_handle.CanSeek()), buffer_idx(buffer_idx_p) { + : context(context), requested_size(buffer_size), global_csv_start(global_csv_current_position), + file_number(file_number_p), can_seek(file_handle.CanSeek()), is_pipe(file_handle.IsPipe()), + buffer_idx(buffer_idx_p) { AllocateBuffer(buffer_size); auto buffer = handle.Ptr(); actual_buffer_size = file_handle.Read(handle.Ptr(), buffer_size); @@ -50,7 +52,7 @@ shared_ptr CSVBuffer::Next(CSVFileHandle &file_handle, idx_t buffer_s void CSVBuffer::AllocateBuffer(idx_t buffer_size) { auto &buffer_manager = BufferManager::GetBufferManager(context); - bool can_destroy = can_seek; + bool can_destroy = !is_pipe; handle = buffer_manager.Allocate(MemoryTag::CSV_READER, MaxValue(Storage::BLOCK_SIZE, buffer_size), can_destroy, &block); } @@ -61,20 +63,21 @@ idx_t CSVBuffer::GetBufferSize() { void CSVBuffer::Reload(CSVFileHandle &file_handle) { AllocateBuffer(actual_buffer_size); + // If we can seek, we seek and return the correct pointers file_handle.Seek(global_csv_start); file_handle.Read(handle.Ptr(), actual_buffer_size); } shared_ptr CSVBuffer::Pin(CSVFileHandle &file_handle, bool &has_seeked) { auto &buffer_manager = BufferManager::GetBufferManager(context); - if (can_seek && block->IsUnloaded()) { + if (!is_pipe && block->IsUnloaded()) { // We have to reload it from disk block = nullptr; Reload(file_handle); has_seeked = true; } - return make_shared(buffer_manager.Pin(block), actual_buffer_size, last_buffer, file_number, - buffer_idx); + return make_shared(buffer_manager.Pin(block), actual_buffer_size, requested_size, last_buffer, + file_number, buffer_idx); } void CSVBuffer::Unpin() { diff --git a/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer_manager.cpp b/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer_manager.cpp index 2a13158b..6a7226ec 100644 --- a/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer_manager.cpp +++ b/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer_manager.cpp @@ -8,6 +8,7 @@ CSVBufferManager::CSVBufferManager(ClientContext &context_p, const CSVReaderOpti : context(context_p), file_idx(file_idx_p), file_path(file_path_p), buffer_size(CSVBuffer::CSV_BUFFER_SIZE) { D_ASSERT(!file_path.empty()); file_handle = ReadCSV::OpenCSV(file_path, options.compression, context); + is_pipe = file_handle->IsPipe(); skip_rows = options.dialect_options.skip_rows.GetValue(); auto file_size = file_handle->FileSize(); if (file_size > 0 && file_size < buffer_size) { @@ -63,6 +64,15 @@ bool CSVBufferManager::ReadNextAndCacheIt() { shared_ptr CSVBufferManager::GetBuffer(const idx_t pos) { lock_guard parallel_lock(main_mutex); + if (pos == 0 && done && cached_buffers.empty()) { + if (is_pipe) { + throw InvalidInputException("Recursive CTEs are not allowed when using piped csv files"); + } + // This is a recursive CTE, we have to reset out whole buffer + done = false; + file_handle->Reset(); + Initialize(); + } while (pos >= cached_buffers.size()) { if (done) { return nullptr; @@ -71,7 +81,9 @@ shared_ptr CSVBufferManager::GetBuffer(const idx_t pos) { done = true; } } - if (pos != 0) { + if (pos != 0 && (sniffing || file_handle->CanSeek())) { + // We don't need to unpin the buffers here if we are not sniffing since we + // control it per-thread on the scan if (cached_buffers[pos - 1]) { cached_buffers[pos - 1]->Unpin(); } @@ -98,6 +110,12 @@ void CSVBufferManager::ResetBuffer(const idx_t buffer_idx) { } // We only reset if previous one was also already reset if (buffer_idx > 0 && !cached_buffers[buffer_idx - 1]) { + if (cached_buffers[buffer_idx]->last_buffer) { + // We clear the whole shebang + cached_buffers.clear(); + reset_when_possible.clear(); + return; + } cached_buffers[buffer_idx].reset(); idx_t cur_buffer = buffer_idx + 1; while (reset_when_possible.find(cur_buffer) != reset_when_possible.end()) { @@ -122,6 +140,19 @@ bool CSVBufferManager::Done() { return done; } +void CSVBufferManager::ResetBufferManager() { + if (!file_handle->IsPipe()) { + // If this is not a pipe we reset the buffer manager and restart it when doing the actual scan + cached_buffers.clear(); + reset_when_possible.clear(); + file_handle->Reset(); + last_buffer = nullptr; + done = false; + global_csv_pos = 0; + Initialize(); + } +} + string CSVBufferManager::GetFilePath() { return file_path; } diff --git a/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_file_handle.cpp b/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_file_handle.cpp index cbb1c1cd..d37e38be 100644 --- a/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_file_handle.cpp +++ b/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_file_handle.cpp @@ -9,12 +9,13 @@ CSVFileHandle::CSVFileHandle(FileSystem &fs, Allocator &allocator, unique_ptrCanSeek(); on_disk_file = file_handle->OnDiskFile(); file_size = file_handle->GetFileSize(); + is_pipe = file_handle->IsPipe(); uncompressed = compression == FileCompressionType::UNCOMPRESSED; } unique_ptr CSVFileHandle::OpenFileHandle(FileSystem &fs, Allocator &allocator, const string &path, FileCompressionType compression) { - auto file_handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_READ, FileLockType::NO_LOCK, compression); + auto file_handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_READ | compression); if (file_handle->CanSeek()) { file_handle->Reset(); } @@ -33,7 +34,10 @@ bool CSVFileHandle::CanSeek() { void CSVFileHandle::Seek(idx_t position) { if (!can_seek) { - throw InternalException("Cannot seek in this file"); + if (is_pipe) { + throw InternalException("Trying to seek a piped CSV File."); + } + throw InternalException("Trying to seek a compressed CSV File."); } file_handle->Seek(position); } @@ -42,6 +46,16 @@ bool CSVFileHandle::OnDiskFile() { return on_disk_file; } +void CSVFileHandle::Reset() { + file_handle->Reset(); + finished = false; + requested_bytes = 0; +} + +bool CSVFileHandle::IsPipe() { + return is_pipe; +} + idx_t CSVFileHandle::FileSize() { return file_size; } diff --git a/src/duckdb/src/execution/operator/csv_scanner/scanner/scanner_boundary.cpp b/src/duckdb/src/execution/operator/csv_scanner/scanner/scanner_boundary.cpp index eab7125a..aa2c3aea 100644 --- a/src/duckdb/src/execution/operator/csv_scanner/scanner/scanner_boundary.cpp +++ b/src/duckdb/src/execution/operator/csv_scanner/scanner/scanner_boundary.cpp @@ -31,19 +31,19 @@ CSVIterator::CSVIterator() : is_set(false) { void CSVBoundary::Print() { #ifndef DUCKDB_DISABLE_PRINT - std::cout << "---Boundary: " << boundary_idx << " ---" << std::endl; - std::cout << "File Index:: " << file_idx << std::endl; - std::cout << "Buffer Index: " << buffer_idx << std::endl; - std::cout << "Buffer Pos: " << buffer_pos << std::endl; - std::cout << "End Pos: " << end_pos << std::endl; - std::cout << "------------" << end_pos << std::endl; + std::cout << "---Boundary: " << boundary_idx << " ---" << '\n'; + std::cout << "File Index:: " << file_idx << '\n'; + std::cout << "Buffer Index: " << buffer_idx << '\n'; + std::cout << "Buffer Pos: " << buffer_pos << '\n'; + std::cout << "End Pos: " << end_pos << '\n'; + std::cout << "------------" << end_pos << '\n'; #endif } void CSVIterator::Print() { #ifndef DUCKDB_DISABLE_PRINT boundary.Print(); - std::cout << "Is set: " << is_set << std::endl; + std::cout << "Is set: " << is_set << '\n'; #endif } diff --git a/src/duckdb/src/execution/operator/csv_scanner/scanner/string_value_scanner.cpp b/src/duckdb/src/execution/operator/csv_scanner/scanner/string_value_scanner.cpp index 9582e1c1..9e6271c8 100644 --- a/src/duckdb/src/execution/operator/csv_scanner/scanner/string_value_scanner.cpp +++ b/src/duckdb/src/execution/operator/csv_scanner/scanner/string_value_scanner.cpp @@ -17,22 +17,22 @@ StringValueResult::StringValueResult(CSVStates &states, CSVStateMachine &state_m shared_ptr csv_file_scan_p, idx_t &lines_read_p, bool sniffing_p) : ScannerResult(states, state_machine), number_of_columns(NumericCast(state_machine.dialect_options.num_cols)), - null_padding(state_machine.options.null_padding), ignore_errors(state_machine.options.ignore_errors), - null_str_ptr(state_machine.options.null_str.c_str()), null_str_size(state_machine.options.null_str.size()), + null_padding(state_machine.options.null_padding), ignore_errors(state_machine.options.ignore_errors.GetValue()), result_size(result_size_p), error_handler(error_hander_p), iterator(iterator_p), store_line_size(store_line_size_p), csv_file_scan(std::move(csv_file_scan_p)), lines_read(lines_read_p), sniffing(sniffing_p) { // Vector information D_ASSERT(number_of_columns > 0); - buffer_handles.push_back(buffer_handle); + buffer_handles[buffer_handle->buffer_idx] = buffer_handle; // Buffer Information buffer_ptr = buffer_handle->Ptr(); buffer_size = buffer_handle->actual_size; - last_position = buffer_position; + last_position = {buffer_handle->buffer_idx, buffer_position, buffer_size}; + requested_size = buffer_handle->requested_size; // Current Result information - previous_line_start = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, buffer_handle->actual_size}; - pre_previous_line_start = previous_line_start; + current_line_position.begin = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, buffer_handle->actual_size}; + current_line_position.end = current_line_position.begin; // Fill out Parse Types vector logical_types; parse_types = make_unsafe_uniq_array>(number_of_columns); @@ -88,6 +88,15 @@ StringValueResult::StringValueResult(CSVStates &states, CSVStateMachine &state_m vector_ptr.push_back(FlatVector::GetData(col)); validity_mask.push_back(&FlatVector::Validity(col)); } + + // Setup the NullStr information + null_str_count = state_machine.options.null_str.size(); + null_str_ptr = make_unsafe_uniq_array(null_str_count); + null_str_size = make_unsafe_uniq_array(null_str_count); + for (idx_t i = 0; i < null_str_count; i++) { + null_str_ptr[i] = state_machine.options.null_str[i].c_str(); + null_str_size[i] = state_machine.options.null_str[i].size(); + } } StringValueResult::~StringValueResult() { @@ -114,44 +123,51 @@ void StringValueResult::AddValueToVector(const char *value_ptr, const idx_t size bool error = true; if (cur_col_id == number_of_columns && ((quoted && state_machine.options.allow_quoted_nulls) || !quoted)) { // we make an exception if the first over-value is null - error = !IsValueNull(null_str_ptr, value_ptr, size); + bool is_value_null = false; + for (idx_t i = 0; i < null_str_count; i++) { + is_value_null = is_value_null || IsValueNull(null_str_ptr[i], value_ptr, size); + } + error = !is_value_null; } if (error) { - HandleOverLimitRows(); + // We error pointing to the current value error. + current_errors.push_back({CSVErrorType::TOO_MANY_COLUMNS, cur_col_id, last_position}); + cur_col_id++; } - } - if (ignore_current_row) { return; } + if (projecting_columns) { if (!projected_columns[cur_col_id]) { cur_col_id++; return; } } - if (size == null_str_size) { - if (((quoted && state_machine.options.allow_quoted_nulls) || !quoted)) { - if (IsValueNull(null_str_ptr, value_ptr, size)) { - bool empty = false; - if (chunk_col_id < state_machine.options.force_not_null.size()) { - empty = state_machine.options.force_not_null[chunk_col_id]; - } - if (empty) { - if (parse_types[chunk_col_id].first != LogicalTypeId::VARCHAR) { - // If it is not a varchar, empty values are not accepted, we must error. - cast_errors[chunk_col_id] = std::string(""); + for (idx_t i = 0; i < null_str_count; i++) { + if (size == null_str_size[i]) { + if (((quoted && state_machine.options.allow_quoted_nulls) || !quoted)) { + if (IsValueNull(null_str_ptr[i], value_ptr, size)) { + bool empty = false; + if (chunk_col_id < state_machine.options.force_not_null.size()) { + empty = state_machine.options.force_not_null[chunk_col_id]; } - static_cast(vector_ptr[chunk_col_id])[number_of_rows] = string_t(); - } else { - if (chunk_col_id == number_of_columns) { - // We check for a weird case, where we ignore an extra value, if it is a null value - return; + if (empty) { + if (parse_types[chunk_col_id].first != LogicalTypeId::VARCHAR) { + // If it is not a varchar, empty values are not accepted, we must error. + current_errors.push_back({CSVErrorType::CAST_ERROR, cur_col_id, last_position}); + } + static_cast(vector_ptr[chunk_col_id])[number_of_rows] = string_t(); + } else { + if (chunk_col_id == number_of_columns) { + // We check for a weird case, where we ignore an extra value, if it is a null value + return; + } + validity_mask[chunk_col_id]->SetInvalid(number_of_rows); } - validity_mask[chunk_col_id]->SetInvalid(number_of_rows); + cur_col_id++; + chunk_col_id++; + return; } - cur_col_id++; - chunk_col_id++; - return; } } } @@ -212,16 +228,16 @@ void StringValueResult::AddValueToVector(const char *value_ptr, const idx_t size break; } default: { - // By default we add a string + // By default, we add a string // We only evaluate if a string is utf8 valid, if it's actually a varchar if (parse_types[chunk_col_id].second && !Utf8Proc::IsValid(value_ptr, UnsafeNumericCast(size))) { - bool force_error = !state_machine.options.ignore_errors && sniffing; + bool force_error = !state_machine.options.ignore_errors.GetValue() && sniffing; // Invalid unicode, we must error - LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read); - auto csv_error = CSVError::InvalidUTF8(state_machine.options, lines_per_batch); - error_handler.Error(csv_error, force_error); + if (force_error) { + HandleUnicodeError(cur_col_id, last_position); + } // If we got here, we are ingoring errors, hence we must ignore this line. - ignore_current_row = true; + current_errors.push_back({CSVErrorType::INVALID_UNICODE, cur_col_id, last_position}); break; } if (allocate) { @@ -237,7 +253,12 @@ void StringValueResult::AddValueToVector(const char *value_ptr, const idx_t size } if (!success) { // We had a casting error, we push it here because we can only error when finishing the line read. - cast_errors[cur_col_id] = std::string(value_ptr, size); + std::ostringstream error; + // Casting Error Message + error << "Could not convert string \"" << std::string(value_ptr, size) << "\" to \'" + << LogicalTypeIdToString(parse_types[cur_col_id].first) << "\'"; + current_errors.push_back({CSVErrorType::CAST_ERROR, cur_col_id, last_position}); + current_errors.back().error_message = error.str(); } cur_col_id++; chunk_col_id++; @@ -269,8 +290,16 @@ void StringValueResult::Reset() { for (auto &v : validity_mask) { v->SetAllValid(result_size); } + // We keep a reference to the buffer from our current iteration if it already exists + shared_ptr cur_buffer; + if (buffer_handles.find(iterator.GetBufferIdx()) != buffer_handles.end()) { + cur_buffer = buffer_handles[iterator.GetBufferIdx()]; + } buffer_handles.clear(); - ignore_current_row = false; + if (cur_buffer) { + buffer_handles[cur_buffer->buffer_idx] = cur_buffer; + } + current_errors.clear(); } void StringValueResult::AddQuotedValue(StringValueResult &result, const idx_t buffer_pos) { @@ -290,7 +319,7 @@ void StringValueResult::AddQuotedValue(StringValueResult &result, const idx_t bu result.parse_chunk.data[result.chunk_col_id]); result.AddValueToVector(value.GetData(), value.GetSize()); } else { - if (buffer_pos < result.last_position + 2) { + if (buffer_pos < result.last_position.buffer_pos + 2) { // empty value auto value = string_t(); result.AddValueToVector(value.GetData(), value.GetSize()); @@ -304,26 +333,119 @@ void StringValueResult::AddQuotedValue(StringValueResult &result, const idx_t bu } void StringValueResult::AddValue(StringValueResult &result, const idx_t buffer_pos) { - if (result.last_position > buffer_pos) { + if (result.last_position.buffer_pos > buffer_pos) { return; } if (result.quoted) { StringValueResult::AddQuotedValue(result, buffer_pos); } else { - result.AddValueToVector(result.buffer_ptr + result.last_position, buffer_pos - result.last_position); + result.AddValueToVector(result.buffer_ptr + result.last_position.buffer_pos, + buffer_pos - result.last_position.buffer_pos); } - result.last_position = buffer_pos + 1; + result.last_position.buffer_pos = buffer_pos + 1; } -void StringValueResult::HandleOverLimitRows() { - LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), number_of_rows + 1); - auto csv_error = CSVError::IncorrectColumnAmountError(state_machine.options, nullptr, number_of_columns, - cur_col_id + 1, lines_per_batch); - error_handler.Error(csv_error); - // If we get here we need to remove the last line - cur_col_id = 0; - chunk_col_id = 0; - ignore_current_row = true; +void StringValueResult::HandleUnicodeError(idx_t col_idx, LinePosition &error_position) { + bool first_nl; + auto borked_line = current_line_position.ReconstructCurrentLine(first_nl, buffer_handles); + LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read); + if (current_line_position.begin == error_position) { + auto csv_error = CSVError::InvalidUTF8(state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + error_position.GetGlobalPosition(requested_size, first_nl)); + error_handler.Error(csv_error, true); + } else { + auto csv_error = CSVError::InvalidUTF8(state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + error_position.GetGlobalPosition(requested_size)); + error_handler.Error(csv_error, true); + } +} + +bool StringValueResult::HandleError() { + // Reconstruct CSV Line + for (auto &cur_error : current_errors) { + LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read); + bool first_nl; + auto borked_line = current_line_position.ReconstructCurrentLine(first_nl, buffer_handles); + CSVError csv_error; + auto col_idx = cur_error.col_idx; + auto &line_pos = cur_error.error_position; + + switch (cur_error.type) { + case CSVErrorType::TOO_MANY_COLUMNS: + case CSVErrorType::TOO_FEW_COLUMNS: + if (current_line_position.begin == line_pos) { + csv_error = CSVError::IncorrectColumnAmountError( + state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size, first_nl)); + } else { + csv_error = CSVError::IncorrectColumnAmountError( + state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size)); + } + break; + case CSVErrorType::INVALID_UNICODE: { + if (current_line_position.begin == line_pos) { + csv_error = + CSVError::InvalidUTF8(state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size, first_nl)); + } else { + csv_error = + CSVError::InvalidUTF8(state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size)); + } + break; + } + case CSVErrorType::UNTERMINATED_QUOTES: + if (current_line_position.begin == line_pos) { + csv_error = CSVError::UnterminatedQuotesError( + state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size, first_nl)); + } else { + csv_error = CSVError::UnterminatedQuotesError( + state_machine.options, col_idx, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size)); + } + break; + case CSVErrorType::CAST_ERROR: + if (current_line_position.begin == line_pos) { + csv_error = CSVError::CastError( + state_machine.options, names[cur_error.col_idx], cur_error.error_message, cur_error.col_idx, + borked_line, lines_per_batch, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size, first_nl), parse_types[cur_error.col_idx].first); + } else { + csv_error = CSVError::CastError( + state_machine.options, names[cur_error.col_idx], cur_error.error_message, cur_error.col_idx, + borked_line, lines_per_batch, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + line_pos.GetGlobalPosition(requested_size), parse_types[cur_error.col_idx].first); + } + break; + case CSVErrorType::MAXIMUM_LINE_SIZE: + csv_error = CSVError::LineSizeError( + state_machine.options, cur_error.current_line_size, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl)); + break; + default: + throw InvalidInputException("CSV Error not allowed when inserting row"); + } + error_handler.Error(csv_error); + } + if (!current_errors.empty()) { + current_errors.clear(); + cur_col_id = 0; + chunk_col_id = 0; + return true; + } + return false; } void StringValueResult::QuotedNewLine(StringValueResult &result) { @@ -332,55 +454,72 @@ void StringValueResult::QuotedNewLine(StringValueResult &result) { void StringValueResult::NullPaddingQuotedNewlineCheck() { // We do some checks for null_padding correctness - if (state_machine.options.null_padding && iterator.IsBoundarySet() && quoted_new_line && iterator.done) { - // If we have null_padding set, we found a quoted new line, we are scanning the file in parallel and it's the - // last row of this thread. - LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), number_of_rows + 1); + if (state_machine.options.null_padding && iterator.IsBoundarySet() && quoted_new_line) { + // If we have null_padding set, we found a quoted new line, we are scanning the file in parallel; We error. + LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read); auto csv_error = CSVError::NullPaddingFail(state_machine.options, lines_per_batch); error_handler.Error(csv_error); } } +//! Reconstructs the current line to be used in error messages +string FullLinePosition::ReconstructCurrentLine(bool &first_char_nl, + unordered_map> &buffer_handles) { + string result; + if (end.buffer_idx == begin.buffer_idx) { + if (buffer_handles.find(end.buffer_idx) == buffer_handles.end()) { + throw InternalException("CSV Buffer is not available to reconstruct CSV Line, please open an issue with " + "your query and dataset."); + } + auto buffer = buffer_handles[begin.buffer_idx]->Ptr(); + first_char_nl = buffer[begin.buffer_pos] == '\n' || buffer[begin.buffer_pos] == '\r'; + for (idx_t i = begin.buffer_pos + first_char_nl; i < end.buffer_pos; i++) { + result += buffer[i]; + } + } else { + if (buffer_handles.find(begin.buffer_idx) == buffer_handles.end() || + buffer_handles.find(end.buffer_idx) == buffer_handles.end()) { + throw InternalException("CSV Buffer is not available to reconstruct CSV Line, please open an issue with " + "your query and dataset."); + } + auto first_buffer = buffer_handles[begin.buffer_idx]->Ptr(); + auto first_buffer_size = buffer_handles[begin.buffer_idx]->actual_size; + auto second_buffer = buffer_handles[end.buffer_idx]->Ptr(); + first_char_nl = first_buffer[begin.buffer_pos] == '\n' || first_buffer[begin.buffer_pos] == '\r'; + for (idx_t i = begin.buffer_pos + first_char_nl; i < first_buffer_size; i++) { + result += first_buffer[i]; + } + for (idx_t i = 0; i < end.buffer_pos; i++) { + result += second_buffer[i]; + } + } + // sanitize borked line + std::vector char_array(result.begin(), result.end()); + char_array.push_back('\0'); // Null-terminate the character array + Utf8Proc::MakeValid(&char_array[0], char_array.size()); + result = {char_array.begin(), char_array.end() - 1}; + return result; +} + bool StringValueResult::AddRowInternal() { - if (ignore_current_row) { - cur_col_id = 0; - chunk_col_id = 0; - // An error occurred on this row, we are ignoring it and resetting our control flag - ignore_current_row = false; - return false; + LinePosition current_line_start = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, buffer_size}; + idx_t current_line_size = current_line_start - current_line_position.end; + if (store_line_size) { + error_handler.NewMaxLineSize(current_line_size); } - if (!cast_errors.empty()) { - // A wild casting error appears - // Recreate row for rejects-table - vector row; - if (!state_machine.options.rejects_table_name.empty()) { - for (idx_t col = 0; col < parse_chunk.ColumnCount(); col++) { - if (cast_errors.find(col) != cast_errors.end()) { - row.push_back(cast_errors[col]); - } else { - row.push_back(parse_chunk.data[col].GetValue(number_of_rows)); - } - } + current_line_position.begin = current_line_position.end; + current_line_position.end = current_line_start; + if (current_line_size > state_machine.options.maximum_line_size) { + current_errors.push_back({CSVErrorType::MAXIMUM_LINE_SIZE, 1, last_position}); + current_errors.back().current_line_size = current_line_size; + } + if (!current_errors.empty()) { + // We need to add a few columns error + for (idx_t col_idx = cur_col_id; col_idx < number_of_columns; col_idx++) { + current_errors.push_back({CSVErrorType::TOO_FEW_COLUMNS, col_idx - 1, last_position}); } - for (auto &cast_error : cast_errors) { - std::ostringstream error; - // Casting Error Message - error << "Could not convert string \"" << cast_error.second << "\" to \'" - << LogicalTypeIdToString(parse_types[cast_error.first].first) << "\'"; - auto error_string = error.str(); - LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read); - - auto csv_error = - CSVError::CastError(state_machine.options, names[cast_error.first], error_string, cast_error.first, row, - lines_per_batch, parse_types[cast_error.first].first); - error_handler.Error(csv_error); - } - // If we got here it means we are ignoring errors, hence we need to signify to our result scanner to ignore this - // row - // Cleanup this line and continue - cast_errors.clear(); - cur_col_id = 0; - chunk_col_id = 0; + } + if (HandleError()) { return false; } NullPaddingQuotedNewlineCheck(); @@ -411,14 +550,27 @@ bool StringValueResult::AddRowInternal() { } } else { // If we are not null-padding this is an error - LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), number_of_rows + 1); - auto csv_error = CSVError::IncorrectColumnAmountError(state_machine.options, nullptr, number_of_columns, - cur_col_id, lines_per_batch); - error_handler.Error(csv_error); + bool first_nl; + auto borked_line = current_line_position.ReconstructCurrentLine(first_nl, buffer_handles); + LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read); + if (current_line_position.begin == last_position) { + auto csv_error = CSVError::IncorrectColumnAmountError( + state_machine.options, cur_col_id - 1, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + last_position.GetGlobalPosition(requested_size, first_nl)); + error_handler.Error(csv_error); + } else { + auto csv_error = CSVError::IncorrectColumnAmountError( + state_machine.options, cur_col_id - 1, lines_per_batch, borked_line, + current_line_position.begin.GetGlobalPosition(requested_size, first_nl), + last_position.GetGlobalPosition(requested_size)); + error_handler.Error(csv_error); + } // If we are here we ignore_errors, so we delete this line number_of_rows--; } } + line_positions_per_row[number_of_rows] = current_line_position; cur_col_id = 0; chunk_col_id = 0; number_of_rows++; @@ -430,35 +582,23 @@ bool StringValueResult::AddRowInternal() { } bool StringValueResult::AddRow(StringValueResult &result, const idx_t buffer_pos) { - if (result.last_position <= buffer_pos) { - LinePosition current_line_start = {result.iterator.pos.buffer_idx, result.iterator.pos.buffer_pos, - result.buffer_size}; - idx_t current_line_size = current_line_start - result.previous_line_start; - if (result.store_line_size) { - result.error_handler.NewMaxLineSize(current_line_size); - } - if (current_line_size > result.state_machine.options.maximum_line_size) { - LinesPerBoundary lines_per_batch(result.iterator.GetBoundaryIdx(), result.number_of_rows); - auto csv_error = CSVError::LineSizeError(result.state_machine.options, current_line_size, lines_per_batch); - result.error_handler.Error(csv_error); - } - result.pre_previous_line_start = result.previous_line_start; - result.previous_line_start = current_line_start; + if (result.last_position.buffer_pos <= buffer_pos) { // We add the value if (result.quoted) { StringValueResult::AddQuotedValue(result, buffer_pos); } else { - result.AddValueToVector(result.buffer_ptr + result.last_position, buffer_pos - result.last_position); + result.AddValueToVector(result.buffer_ptr + result.last_position.buffer_pos, + buffer_pos - result.last_position.buffer_pos); } if (result.state_machine.dialect_options.state_machine_options.new_line == NewLineIdentifier::CARRY_ON) { if (result.states.states[1] == CSVState::RECORD_SEPARATOR) { // Even though this is marked as a carry on, this is a hippie mixie - result.last_position = buffer_pos + 1; + result.last_position.buffer_pos = buffer_pos + 1; } else { - result.last_position = buffer_pos + 2; + result.last_position.buffer_pos = buffer_pos + 2; } } else { - result.last_position = buffer_pos + 1; + result.last_position.buffer_pos = buffer_pos + 1; } } @@ -467,33 +607,35 @@ bool StringValueResult::AddRow(StringValueResult &result, const idx_t buffer_pos } void StringValueResult::InvalidState(StringValueResult &result) { - // FIXME: How do we recover from an invalid state? Can we restart the state machine and jump to the next row? - LinesPerBoundary lines_per_batch(result.iterator.GetBoundaryIdx(), result.number_of_rows); - auto csv_error = CSVError::UnterminatedQuotesError(result.state_machine.options, - static_cast(result.vector_ptr[result.chunk_col_id]), - result.number_of_rows, result.cur_col_id, lines_per_batch); - result.error_handler.Error(csv_error); + bool force_error = !result.state_machine.options.ignore_errors.GetValue() && result.sniffing; + // Invalid unicode, we must error + if (force_error) { + result.HandleUnicodeError(result.cur_col_id, result.last_position); + } + result.current_errors.push_back({CSVErrorType::UNTERMINATED_QUOTES, result.cur_col_id, result.last_position}); } bool StringValueResult::EmptyLine(StringValueResult &result, const idx_t buffer_pos) { // We care about empty lines if this is a single column csv file - result.last_position = buffer_pos + 1; + result.last_position = {result.iterator.pos.buffer_idx, result.iterator.pos.buffer_pos + 1, result.buffer_size}; if (result.states.IsCarriageReturn() && result.state_machine.dialect_options.state_machine_options.new_line == NewLineIdentifier::CARRY_ON) { - result.last_position++; + result.last_position.buffer_pos++; } if (result.number_of_columns == 1) { - if (result.null_str_size == 0) { - bool empty = false; - if (!result.state_machine.options.force_not_null.empty()) { - empty = result.state_machine.options.force_not_null[0]; - } - if (empty) { - static_cast(result.vector_ptr[0])[result.number_of_rows] = string_t(); - } else { - result.validity_mask[0]->SetInvalid(result.number_of_rows); + for (idx_t i = 0; i < result.null_str_count; i++) { + if (result.null_str_size[i] == 0) { + bool empty = false; + if (!result.state_machine.options.force_not_null.empty()) { + empty = result.state_machine.options.force_not_null[0]; + } + if (empty) { + static_cast(result.vector_ptr[0])[result.number_of_rows] = string_t(); + } else { + result.validity_mask[0]->SetInvalid(result.number_of_rows); + } + result.number_of_rows++; } - result.number_of_rows++; } if (result.number_of_rows >= result.result_size) { // We have a full chunk @@ -637,7 +779,7 @@ void StringValueScanner::Flush(DataChunk &insert_chunk) { { vector row; - if (state_machine->options.ignore_errors) { + if (state_machine->options.ignore_errors.GetValue()) { for (idx_t col = 0; col < parse_chunk.ColumnCount(); col++) { row.push_back(parse_chunk.GetValue(col, line_error)); } @@ -645,13 +787,19 @@ void StringValueScanner::Flush(DataChunk &insert_chunk) { LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read - parse_chunk.size() + line_error); - auto csv_error = - CSVError::CastError(state_machine->options, csv_file_scan->names[col_idx], error_message, col_idx, - row, lines_per_batch, result_vector.GetType().id()); + bool first_nl; + auto borked_line = + result.line_positions_per_row[line_error].ReconstructCurrentLine(first_nl, result.buffer_handles); + auto csv_error = CSVError::CastError( + state_machine->options, csv_file_scan->names[col_idx], error_message, col_idx, borked_line, + lines_per_batch, + result.line_positions_per_row[line_error].begin.GetGlobalPosition(result.result_size, first_nl), -1, + result_vector.GetType().id()); + error_handler->Error(csv_error); } borked_lines.insert(line_error++); - D_ASSERT(state_machine->options.ignore_errors); + D_ASSERT(state_machine->options.ignore_errors.GetValue()); // We are ignoring errors. We must continue but ignoring borked rows for (; line_error < parse_chunk.size(); line_error++) { if (!inserted_column_data.validity.RowIsValid(line_error) && @@ -663,10 +811,14 @@ void StringValueScanner::Flush(DataChunk &insert_chunk) { } LinesPerBoundary lines_per_batch(iterator.GetBoundaryIdx(), lines_read - parse_chunk.size() + line_error); - auto csv_error = - CSVError::CastError(state_machine->options, csv_file_scan->names[col_idx], error_message, - col_idx, row, lines_per_batch, result_vector.GetType().id()); - + bool first_nl; + auto borked_line = result.line_positions_per_row[line_error].ReconstructCurrentLine( + first_nl, result.buffer_handles); + auto csv_error = CSVError::CastError( + state_machine->options, csv_file_scan->names[col_idx], error_message, col_idx, borked_line, + lines_per_batch, + result.line_positions_per_row[line_error].begin.GetGlobalPosition(result.result_size, first_nl), + -1, result_vector.GetType().id()); error_handler->Error(csv_error); } } @@ -693,10 +845,10 @@ void StringValueScanner::Initialize() { !state_machine->options.dialect_options.skip_rows.IsSetByUser())) { SetStart(); } - result.last_position = iterator.pos.buffer_pos; - result.previous_line_start = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, cur_buffer_handle->actual_size}; + result.last_position = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, cur_buffer_handle->actual_size}; + result.current_line_position.begin = result.last_position; - result.pre_previous_line_start = result.previous_line_start; + result.current_line_position.end = result.current_line_position.begin; } void StringValueScanner::ProcessExtraRow() { @@ -711,14 +863,14 @@ void StringValueScanner::ProcessExtraRow() { return; case CSVState::RECORD_SEPARATOR: if (states.states[0] == CSVState::RECORD_SEPARATOR) { - lines_read++; result.EmptyLine(result, iterator.pos.buffer_pos); iterator.pos.buffer_pos++; + lines_read++; return; } else if (states.states[0] != CSVState::CARRIAGE_RETURN) { - lines_read++; result.AddRow(result, iterator.pos.buffer_pos); iterator.pos.buffer_pos++; + lines_read++; return; } lines_read++; @@ -812,12 +964,12 @@ void StringValueScanner::ProcessOverbufferValue() { states.Initialize(); string overbuffer_string; auto previous_buffer = previous_buffer_handle->Ptr(); - if (result.last_position == previous_buffer_handle->actual_size) { - state_machine->Transition(states, previous_buffer[result.last_position - 1]); + if (result.last_position.buffer_pos == previous_buffer_handle->actual_size) { + state_machine->Transition(states, previous_buffer[result.last_position.buffer_pos - 1]); } idx_t j = 0; result.quoted = false; - for (idx_t i = result.last_position; i < previous_buffer_handle->actual_size; i++) { + for (idx_t i = result.last_position.buffer_pos; i < previous_buffer_handle->actual_size; i++) { state_machine->Transition(states, previous_buffer[i]); if (states.EmptyLine() || states.IsCurrentNewRow()) { continue; @@ -833,6 +985,9 @@ void StringValueScanner::ProcessOverbufferValue() { if (states.IsEscaped()) { result.escaped = true; } + if (states.IsInvalid()) { + result.InvalidState(result); + } j++; } if (overbuffer_string.empty() && @@ -862,6 +1017,9 @@ void StringValueScanner::ProcessOverbufferValue() { if (states.IsEscaped()) { result.escaped = true; } + if (states.IsInvalid()) { + result.InvalidState(result); + } j++; } bool skip_value = false; @@ -907,9 +1065,9 @@ void StringValueScanner::ProcessOverbufferValue() { } if (states.IsCarriageReturn() && state_machine->dialect_options.state_machine_options.new_line == NewLineIdentifier::CARRY_ON) { - result.last_position = ++iterator.pos.buffer_pos + 1; + result.last_position = {iterator.pos.buffer_idx, ++iterator.pos.buffer_pos + 1, result.buffer_size}; } else { - result.last_position = ++iterator.pos.buffer_pos; + result.last_position = {iterator.pos.buffer_idx, ++iterator.pos.buffer_pos, result.buffer_size}; } // Be sure to reset the quoted and escaped variables result.quoted = false; @@ -920,7 +1078,6 @@ bool StringValueScanner::MoveToNextBuffer() { if (iterator.pos.buffer_pos >= cur_buffer_handle->actual_size) { previous_buffer_handle = cur_buffer_handle; cur_buffer_handle = buffer_manager->GetBuffer(++iterator.pos.buffer_idx); - result.buffer_handles.push_back(cur_buffer_handle); if (!cur_buffer_handle) { iterator.pos.buffer_idx--; buffer_handle_ptr = nullptr; @@ -943,6 +1100,10 @@ bool StringValueScanner::MoveToNextBuffer() { lines_read++; } else if (states.IsQuotedCurrent()) { // Unterminated quote + LinePosition current_line_start = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, + result.buffer_size}; + result.current_line_position.begin = result.current_line_position.end; + result.current_line_position.end = current_line_start; result.InvalidState(result); } else { result.AddRow(result, previous_buffer_handle->actual_size); @@ -950,6 +1111,8 @@ bool StringValueScanner::MoveToNextBuffer() { } return false; } + result.buffer_handles[cur_buffer_handle->buffer_idx] = cur_buffer_handle; + iterator.pos.buffer_pos = 0; buffer_handle_ptr = cur_buffer_handle->Ptr(); // Handle overbuffer value @@ -1087,24 +1250,43 @@ void StringValueScanner::SetStart() { scan_finder->previous_buffer_handle->is_last_buffer) { iterator.pos.buffer_idx = scan_finder->iterator.pos.buffer_idx; iterator.pos.buffer_pos = scan_finder->iterator.pos.buffer_pos; - result.last_position = iterator.pos.buffer_pos; + result.last_position = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, result.buffer_size}; iterator.done = scan_finder->iterator.done; return; } } - if (iterator.pos.buffer_pos == cur_buffer_handle->actual_size) { + if (iterator.pos.buffer_pos == cur_buffer_handle->actual_size || + scan_finder->iterator.GetBufferIdx() >= iterator.GetBufferIdx()) { + // Propagate any errors + if (!scan_finder->error_handler->errors.empty() && state_machine->options.ignore_errors.GetValue()) { + for (auto &error_vector : scan_finder->error_handler->errors) { + for (auto &error : error_vector.second) { + error_handler->Error(error); + } + } + result.lines_read++; + } // If things go terribly wrong, we never loop indefinetly. iterator.pos.buffer_idx = scan_finder->iterator.pos.buffer_idx; iterator.pos.buffer_pos = scan_finder->iterator.pos.buffer_pos; - result.last_position = iterator.pos.buffer_pos; + result.last_position = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, result.buffer_size}; iterator.done = scan_finder->iterator.done; return; } } } while (!line_found); - iterator.pos.buffer_idx = scan_finder->result.pre_previous_line_start.buffer_idx; - iterator.pos.buffer_pos = scan_finder->result.pre_previous_line_start.buffer_pos; - result.last_position = iterator.pos.buffer_pos; + // Propagate any errors + if (!scan_finder->error_handler->errors.empty() && state_machine->options.ignore_errors.GetValue()) { + for (auto &error_vector : scan_finder->error_handler->errors) { + for (auto &error : error_vector.second) { + error_handler->Error(error); + } + } + result.lines_read++; + } + iterator.pos.buffer_idx = scan_finder->result.current_line_position.begin.buffer_idx; + iterator.pos.buffer_pos = scan_finder->result.current_line_position.begin.buffer_pos; + result.last_position = {iterator.pos.buffer_idx, iterator.pos.buffer_pos, result.buffer_size}; } void StringValueScanner::FinalizeChunkProcess() { @@ -1121,7 +1303,12 @@ void StringValueScanner::FinalizeChunkProcess() { // If we are not done we have two options. // 1) If a boundary is set. if (iterator.IsBoundarySet()) { - iterator.done = true; + for (auto &cur_error : result.current_errors) { + if (!(cur_error == CSVErrorType::UNTERMINATED_QUOTES)) { + iterator.done = true; + } + } + // We read until the next line or until we have nothing else to read. // Move to next buffer if (!cur_buffer_handle) { @@ -1137,6 +1324,14 @@ void StringValueScanner::FinalizeChunkProcess() { if (cur_buffer_handle->is_last_buffer && iterator.pos.buffer_pos >= cur_buffer_handle->actual_size) { MoveToNextBuffer(); } + } else { + result.HandleError(); + } + if (!iterator.done) { + if (iterator.pos.buffer_pos >= iterator.GetEndPos() || iterator.pos.buffer_idx > iterator.GetBufferIdx() || + FinishedFile()) { + iterator.done = true; + } } } else { // 2) If a boundary is not set diff --git a/src/duckdb/src/execution/operator/csv_scanner/sniffer/csv_sniffer.cpp b/src/duckdb/src/execution/operator/csv_scanner/sniffer/csv_sniffer.cpp index 3b60f247..95308c3e 100644 --- a/src/duckdb/src/execution/operator/csv_scanner/sniffer/csv_sniffer.cpp +++ b/src/duckdb/src/execution/operator/csv_scanner/sniffer/csv_sniffer.cpp @@ -13,7 +13,7 @@ CSVSniffer::CSVSniffer(CSVReaderOptions &options_p, shared_ptr } // Initialize max columns found to either 0 or however many were set max_columns_found = set_columns.Size(); - error_handler = make_shared(options.ignore_errors); + error_handler = make_shared(options.ignore_errors.GetValue()); detection_error_handler = make_shared(true); } @@ -83,6 +83,7 @@ void CSVSniffer::SetResultOptions() { } SnifferResult CSVSniffer::SniffCSV(bool force_match) { + buffer_manager->sniffing = true; // 1. Dialect Detection DetectDialect(); // 2. Type Detection @@ -93,7 +94,15 @@ SnifferResult CSVSniffer::SniffCSV(bool force_match) { DetectHeader(); // 5. Type Replacement ReplaceTypes(); - if (!best_candidate->error_handler->errors.empty() && !options.ignore_errors) { + + // We reset the buffer for compressed files + // This is done because we can't easily seek on compressed files, if a buffer goes out of scope we must read from + // the start + if (!buffer_manager->file_handle->uncompressed) { + buffer_manager->ResetBufferManager(); + } + buffer_manager->sniffing = false; + if (!best_candidate->error_handler->errors.empty() && !options.ignore_errors.GetValue()) { for (auto &error_vector : best_candidate->error_handler->errors) { for (auto &error : error_vector.second) { if (error.type == CSVErrorType::MAXIMUM_LINE_SIZE) { diff --git a/src/duckdb/src/execution/operator/csv_scanner/sniffer/dialect_detection.cpp b/src/duckdb/src/execution/operator/csv_scanner/sniffer/dialect_detection.cpp index 7e23a6d1..e6ffae7e 100644 --- a/src/duckdb/src/execution/operator/csv_scanner/sniffer/dialect_detection.cpp +++ b/src/duckdb/src/execution/operator/csv_scanner/sniffer/dialect_detection.cpp @@ -101,18 +101,19 @@ void CSVSniffer::AnalyzeDialectCandidate(unique_ptr scanner, if (sniffed_column_counts.result_position > rows_read) { rows_read = sniffed_column_counts.result_position; } - if (set_columns.IsCandidateUnacceptable(num_cols, options.null_padding, options.ignore_errors, + if (set_columns.IsCandidateUnacceptable(num_cols, options.null_padding, options.ignore_errors.GetValue(), sniffed_column_counts.last_value_always_empty)) { // Not acceptable return; } for (idx_t row = start_row; row < sniffed_column_counts.result_position; row++) { - if (set_columns.IsCandidateUnacceptable(sniffed_column_counts[row], options.null_padding, options.ignore_errors, + if (set_columns.IsCandidateUnacceptable(sniffed_column_counts[row], options.null_padding, + options.ignore_errors.GetValue(), sniffed_column_counts.last_value_always_empty)) { // Not acceptable return; } - if (sniffed_column_counts[row] == num_cols || options.ignore_errors) { + if (sniffed_column_counts[row] == num_cols || (options.ignore_errors.GetValue() && !options.null_padding)) { consistent_rows++; } else if (num_cols < sniffed_column_counts[row] && !options.dialect_options.skip_rows.IsSetByUser() && (!set_columns.IsSet() || options.null_padding)) { @@ -176,10 +177,19 @@ void CSVSniffer::AnalyzeDialectCandidate(unique_ptr scanner, } auto &sniffing_state_machine = scanner->GetStateMachine(); + if (!candidates.empty() && candidates.front()->ever_quoted && !scanner->ever_quoted) { + // Give preference to quoted boys. + return; + } + best_consistent_rows = consistent_rows; max_columns_found = num_cols; prev_padding_count = padding_count; - sniffing_state_machine.dialect_options.skip_rows = start_row; + if (!options.null_padding && !options.ignore_errors.GetValue()) { + sniffing_state_machine.dialect_options.skip_rows = start_row; + } else { + sniffing_state_machine.dialect_options.skip_rows = options.dialect_options.skip_rows.GetValue(); + } candidates.clear(); sniffing_state_machine.dialect_options.num_cols = num_cols; candidates.emplace_back(std::move(scanner)); @@ -200,7 +210,11 @@ void CSVSniffer::AnalyzeDialectCandidate(unique_ptr scanner, } } if (!same_quote_is_candidate) { - sniffing_state_machine.dialect_options.skip_rows = start_row; + if (!options.null_padding && !options.ignore_errors.GetValue()) { + sniffing_state_machine.dialect_options.skip_rows = start_row; + } else { + sniffing_state_machine.dialect_options.skip_rows = options.dialect_options.skip_rows.GetValue(); + } sniffing_state_machine.dialect_options.num_cols = num_cols; candidates.emplace_back(std::move(scanner)); } @@ -212,10 +226,11 @@ bool CSVSniffer::RefineCandidateNextChunk(ColumnCountScanner &candidate) { for (idx_t i = 0; i < sniffed_column_counts.result_position; i++) { if (set_columns.IsSet()) { return !set_columns.IsCandidateUnacceptable(sniffed_column_counts[i], options.null_padding, - options.ignore_errors, + options.ignore_errors.GetValue(), sniffed_column_counts.last_value_always_empty); } else { - if (max_columns_found != sniffed_column_counts[i] && (!options.null_padding && !options.ignore_errors)) { + if (max_columns_found != sniffed_column_counts[i] && + (!options.null_padding && !options.ignore_errors.GetValue())) { return false; } } diff --git a/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_detection.cpp b/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_detection.cpp index da9f7ed6..0572bb62 100644 --- a/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_detection.cpp +++ b/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_detection.cpp @@ -278,7 +278,7 @@ void CSVSniffer::DetectTypes() { // it's good if the dialect creates more non-varchar columns, but only if we sacrifice < 30% of // best_num_cols. if (varchar_cols < min_varchar_cols && info_sql_types_candidates.size() > (max_columns_found * 0.7) && - (!options.ignore_errors || candidate->error_handler->errors.size() < min_errors)) { + (!options.ignore_errors.GetValue() || candidate->error_handler->errors.size() < min_errors)) { min_errors = candidate->error_handler->errors.size(); best_header_row.clear(); // we have a new best_options candidate diff --git a/src/duckdb/src/execution/operator/csv_scanner/state_machine/csv_state_machine_cache.cpp b/src/duckdb/src/execution/operator/csv_scanner/state_machine/csv_state_machine_cache.cpp index 1f976882..fbe07523 100644 --- a/src/duckdb/src/execution/operator/csv_scanner/state_machine/csv_state_machine_cache.cpp +++ b/src/duckdb/src/execution/operator/csv_scanner/state_machine/csv_state_machine_cache.cpp @@ -21,7 +21,6 @@ void CSVStateMachineCache::Insert(const CSVStateMachineOptions &state_machine_op InitializeTransitionArray(transition_array, cur_state, CSVState::QUOTED); break; case CSVState::UNQUOTED: - case CSVState::INVALID: case CSVState::ESCAPE: InitializeTransitionArray(transition_array, cur_state, CSVState::INVALID); break; @@ -38,15 +37,16 @@ void CSVStateMachineCache::Insert(const CSVStateMachineOptions &state_machine_op auto new_line_id = state_machine_options.new_line.GetValue(); // Now set values depending on configuration - // 1) Standard State - transition_array[delimiter][static_cast(static_cast(CSVState::STANDARD))] = CSVState::DELIMITER; - transition_array[static_cast('\n')][static_cast(CSVState::STANDARD)] = CSVState::RECORD_SEPARATOR; - if (new_line_id == NewLineIdentifier::CARRY_ON) { - transition_array[static_cast('\r')][static_cast(CSVState::STANDARD)] = - CSVState::CARRIAGE_RETURN; - } else { - transition_array[static_cast('\r')][static_cast(CSVState::STANDARD)] = - CSVState::RECORD_SEPARATOR; + // 1) Standard/Invalid State + vector std_inv {static_cast(CSVState::STANDARD), static_cast(CSVState::INVALID)}; + for (auto &state : std_inv) { + transition_array[delimiter][state] = CSVState::DELIMITER; + transition_array[static_cast('\n')][state] = CSVState::RECORD_SEPARATOR; + if (new_line_id == NewLineIdentifier::CARRY_ON) { + transition_array[static_cast('\r')][state] = CSVState::CARRIAGE_RETURN; + } else { + transition_array[static_cast('\r')][state] = CSVState::RECORD_SEPARATOR; + } } // 2) Field Separator State transition_array[delimiter][static_cast(CSVState::DELIMITER)] = CSVState::DELIMITER; diff --git a/src/duckdb/src/execution/operator/csv_scanner/table_function/csv_file_scanner.cpp b/src/duckdb/src/execution/operator/csv_scanner/table_function/csv_file_scanner.cpp index 0532fc67..1af53304 100644 --- a/src/duckdb/src/execution/operator/csv_scanner/table_function/csv_file_scanner.cpp +++ b/src/duckdb/src/execution/operator/csv_scanner/table_function/csv_file_scanner.cpp @@ -10,7 +10,7 @@ CSVFileScan::CSVFileScan(ClientContext &context, shared_ptr bu vector &file_schema) : file_path(options_p.file_path), file_idx(0), buffer_manager(std::move(buffer_manager_p)), state_machine(std::move(state_machine_p)), file_size(buffer_manager->file_handle->FileSize()), - error_handler(make_shared(options_p.ignore_errors)), + error_handler(make_shared(options_p.ignore_errors.GetValue())), on_disk_file(buffer_manager->file_handle->OnDiskFile()), options(options_p) { if (bind_data.initial_reader.get()) { auto &union_reader = *bind_data.initial_reader; @@ -43,7 +43,7 @@ CSVFileScan::CSVFileScan(ClientContext &context, const string &file_path_p, cons const idx_t file_idx_p, const ReadCSVData &bind_data, const vector &column_ids, const vector &file_schema) : file_path(file_path_p), file_idx(file_idx_p), - error_handler(make_shared(options_p.ignore_errors)), options(options_p) { + error_handler(make_shared(options_p.ignore_errors.GetValue())), options(options_p) { if (file_idx < bind_data.union_readers.size()) { // we are doing UNION BY NAME - fetch the options from the union reader for this file optional_ptr union_reader_ptr; @@ -129,8 +129,8 @@ CSVFileScan::CSVFileScan(ClientContext &context, const string &file_path_p, cons } CSVFileScan::CSVFileScan(ClientContext &context, const string &file_name, CSVReaderOptions &options_p) - : file_path(file_name), file_idx(0), error_handler(make_shared(options_p.ignore_errors)), - options(options_p) { + : file_path(file_name), file_idx(0), + error_handler(make_shared(options_p.ignore_errors.GetValue())), options(options_p) { buffer_manager = make_shared(context, options, file_path, file_idx); // Initialize On Disk and Size of file on_disk_file = buffer_manager->file_handle->OnDiskFile(); @@ -172,20 +172,6 @@ void CSVFileScan::InitializeFileNamesTypes() { projection_ids.emplace_back(result_idx, i); } - if (!projected_columns.empty()) { - // We might have to add recovery rejects column ids - for (idx_t i = 0; i < options.rejects_recovery_column_ids.size(); i++) { - idx_t col_id = options.rejects_recovery_column_ids[i]; - if (projected_columns.find(col_id) == projected_columns.end()) { - // We have to insert this column in our projection - projected_columns.insert(col_id); - file_types.emplace_back(LogicalType::VARCHAR); - projected_columns.insert(col_id); - projection_ids.emplace_back(col_id, col_id); - } - } - } - if (reader_data.column_ids.empty()) { file_types = types; } @@ -222,4 +208,9 @@ void CSVFileScan::InitializeProjection() { reader_data.column_mapping.push_back(i); } } + +void CSVFileScan::Finish() { + buffer_manager.reset(); +} + } // namespace duckdb diff --git a/src/duckdb/src/execution/operator/csv_scanner/table_function/global_csv_state.cpp b/src/duckdb/src/execution/operator/csv_scanner/table_function/global_csv_state.cpp index 863b937f..dd01d097 100644 --- a/src/duckdb/src/execution/operator/csv_scanner/table_function/global_csv_state.cpp +++ b/src/duckdb/src/execution/operator/csv_scanner/table_function/global_csv_state.cpp @@ -24,7 +24,7 @@ CSVGlobalState::CSVGlobalState(ClientContext &context_p, const shared_ptr(context, files[0], options, 0, bind_data, column_ids, file_schema)); }; - //! There are situations where we only support single threaded scanning + // There are situations where we only support single threaded scanning bool many_csv_files = files.size() > 1 && files.size() > system_threads * 2; single_threaded = many_csv_files || !options.parallel; last_file_idx = 0; @@ -43,20 +43,20 @@ double CSVGlobalState::GetProgress(const ReadCSVData &bind_data_p) const { lock_guard parallel_lock(main_mutex); idx_t total_files = bind_data.files.size(); // get the progress WITHIN the current file - double progress; + double percentage = 0; if (file_scans.back()->file_size == 0) { - progress = 1.0; + percentage = 1.0; } else { // for compressed files, readed bytes may greater than files size. - progress = std::min(1.0, double(file_scans.back()->bytes_read) / double(file_scans.back()->file_size)); + for (auto &file : file_scans) { + percentage += + (double(1) / double(total_files)) * std::min(1.0, double(file->bytes_read) / double(file->file_size)); + } } - // now get the total percentage of files read - double percentage = double(current_boundary.GetFileIdx()) / total_files; - percentage += (double(1) / double(total_files)) * progress; return percentage * 100; } -unique_ptr CSVGlobalState::Next() { +unique_ptr CSVGlobalState::Next(optional_ptr previous_scanner) { if (single_threaded) { idx_t cur_idx = last_file_idx++; if (cur_idx >= bind_data.files.size()) { @@ -66,8 +66,16 @@ unique_ptr CSVGlobalState::Next() { if (cur_idx == 0) { current_file = file_scans.back(); } else { - current_file = make_shared(context, bind_data.files[cur_idx], bind_data.options, cur_idx, - bind_data, column_ids, file_schema); + lock_guard parallel_lock(main_mutex); + file_scans.emplace_back(make_shared(context, bind_data.files[cur_idx], bind_data.options, + cur_idx, bind_data, column_ids, file_schema)); + current_file = file_scans.back(); + } + if (previous_scanner) { + lock_guard parallel_lock(main_mutex); + previous_scanner->buffer_tracker.reset(); + current_buffer_in_use.reset(); + previous_scanner->csv_file_scan->Finish(); } auto csv_scanner = make_uniq(scanner_idx++, current_file->buffer_manager, current_file->state_machine, @@ -87,7 +95,14 @@ unique_ptr CSVGlobalState::Next() { auto csv_scanner = make_uniq(scanner_idx++, current_file.buffer_manager, current_file.state_machine, current_file.error_handler, file_scans.back(), false, current_boundary); - + threads_per_file[csv_scanner->csv_file_scan->file_idx]++; + if (previous_scanner) { + threads_per_file[previous_scanner->csv_file_scan->file_idx]--; + if (threads_per_file[previous_scanner->csv_file_scan->file_idx] == 0) { + previous_scanner->buffer_tracker.reset(); + previous_scanner->csv_file_scan->Finish(); + } + } csv_scanner->buffer_tracker = current_buffer_in_use; // We then produce the next boundary @@ -130,6 +145,9 @@ void CSVGlobalState::DecrementThread() { D_ASSERT(running_threads > 0); running_threads--; if (running_threads == 0) { + for (auto &file : file_scans) { + file->error_handler->ErrorIfNeeded(); + } FillRejectsTable(); if (context.client_data->debug_set_max_line_length) { context.client_data->debug_max_line_length = file_scans[0]->error_handler->GetMaxLineLength(); @@ -137,24 +155,119 @@ void CSVGlobalState::DecrementThread() { } } +bool IsCSVErrorAcceptedReject(CSVErrorType type) { + switch (type) { + case CSVErrorType::CAST_ERROR: + case CSVErrorType::TOO_MANY_COLUMNS: + case CSVErrorType::TOO_FEW_COLUMNS: + case CSVErrorType::MAXIMUM_LINE_SIZE: + case CSVErrorType::UNTERMINATED_QUOTES: + case CSVErrorType::INVALID_UNICODE: + return true; + default: + return false; + } +} + +string CSVErrorTypeToEnum(CSVErrorType type) { + switch (type) { + case CSVErrorType::CAST_ERROR: + return "CAST"; + case CSVErrorType::TOO_FEW_COLUMNS: + return "MISSING COLUMNS"; + case CSVErrorType::TOO_MANY_COLUMNS: + return "TOO MANY COLUMNS"; + case CSVErrorType::MAXIMUM_LINE_SIZE: + return "LINE SIZE OVER MAXIMUM"; + case CSVErrorType::UNTERMINATED_QUOTES: + return "UNQUOTED VALUE"; + case CSVErrorType::INVALID_UNICODE: + return "INVALID UNICODE"; + default: + throw InternalException("CSV Error is not valid to be stored in a Rejects Table"); + } +} + +void FillScanErrorTable(InternalAppender &scan_appender, idx_t scan_idx, idx_t file_idx, CSVFileScan &file) { + CSVReaderOptions &options = file.options; + // Add the row to the rejects table + scan_appender.BeginRow(); + // 1. Scan Idx + scan_appender.Append(scan_idx); + // 2. File Idx + scan_appender.Append(file_idx); + // 3. File Path + scan_appender.Append(string_t(file.file_path)); + // 4. Delimiter + scan_appender.Append(string_t(options.dialect_options.state_machine_options.delimiter.FormatValue())); + // 5. Quote + scan_appender.Append(string_t(options.dialect_options.state_machine_options.quote.FormatValue())); + // 6. Escape + scan_appender.Append(string_t(options.dialect_options.state_machine_options.escape.FormatValue())); + // 7. NewLine Delimiter + scan_appender.Append(string_t(options.NewLineIdentifierToString())); + // 8. Skip Rows + scan_appender.Append(Value::UINTEGER(NumericCast(options.dialect_options.skip_rows.GetValue()))); + // 9. Has Header + scan_appender.Append(Value::BOOLEAN(options.dialect_options.header.GetValue())); + // 10. List> {'col1': 'INTEGER', 'col2': 'VARCHAR'} + std::ostringstream columns; + columns << "{"; + for (idx_t i = 0; i < file.types.size(); i++) { + columns << "'" << file.names[i] << "': '" << file.types[i].ToString() << "'"; + if (i != file.types.size() - 1) { + columns << ","; + } + } + columns << "}"; + scan_appender.Append(string_t(columns.str())); + // 11. Date Format + auto date_format = options.dialect_options.date_format[LogicalType::DATE].GetValue(); + if (!date_format.Empty()) { + scan_appender.Append(string_t(date_format.format_specifier)); + } else { + scan_appender.Append(Value()); + } + + // 12. Timestamp Format + auto timestamp_format = options.dialect_options.date_format[LogicalType::TIMESTAMP].GetValue(); + if (!timestamp_format.Empty()) { + scan_appender.Append(string_t(timestamp_format.format_specifier)); + } else { + scan_appender.Append(Value()); + } + + // 13. The Extra User Arguments + if (options.user_defined_parameters.empty()) { + scan_appender.Append(Value()); + } else { + scan_appender.Append(string_t(options.user_defined_parameters)); + } + // Finish the row to the rejects table + scan_appender.EndRow(); +} + void CSVGlobalState::FillRejectsTable() { auto &options = bind_data.options; - if (!options.rejects_table_name.empty()) { + if (options.store_rejects.GetValue()) { auto limit = options.rejects_limit; - - auto rejects = CSVRejectsTable::GetOrCreate(context, options.rejects_table_name); + auto rejects = CSVRejectsTable::GetOrCreate(context, options.rejects_scan_name.GetValue(), + options.rejects_table_name.GetValue()); lock_guard lock(rejects->write_lock); - auto &table = rejects->GetTable(context); - InternalAppender appender(context, table); - + auto &errors_table = rejects->GetErrorsTable(context); + auto &scans_table = rejects->GetScansTable(context); + InternalAppender errors_appender(context, errors_table); + InternalAppender scans_appender(context, scans_table); + idx_t scan_idx = context.transaction.GetActiveQuery(); for (auto &file : file_scans) { + idx_t file_idx = rejects->GetCurrentFileIndex(scan_idx); auto file_name = file->file_path; auto &errors = file->error_handler->errors; + // We first insert the file into the file scans table for (auto &error_vector : errors) { for (auto &error : error_vector.second) { - if (error.type != CSVErrorType::CAST_ERROR) { - // For now we only will use it for casting errors + if (!IsCSVErrorAcceptedReject(error.type)) { continue; } // short circuit if we already have too many rejects @@ -165,40 +278,60 @@ void CSVGlobalState::FillRejectsTable() { rejects->count++; auto row_line = file->error_handler->GetLine(error.error_info); auto col_idx = error.column_idx; - auto col_name = bind_data.return_names[col_idx]; // Add the row to the rejects table - appender.BeginRow(); - appender.Append(string_t(file_name)); - appender.Append(row_line); - appender.Append(col_idx); - appender.Append(string_t("\"" + col_name + "\"")); - appender.Append(error.row[col_idx]); - - if (!options.rejects_recovery_columns.empty()) { - child_list_t recovery_key; - for (auto &key_idx : options.rejects_recovery_column_ids) { - // Figure out if the recovery key is valid. - // If not, error out for real. - auto &value = error.row[key_idx]; - if (value.IsNull()) { - throw InvalidInputException("%s at line %llu in column %s. Parser options:\n%s ", - "Could not parse recovery column", row_line, col_name, - options.ToString()); - } - recovery_key.emplace_back(bind_data.return_names[key_idx], value); - } - appender.Append(Value::STRUCT(recovery_key)); + errors_appender.BeginRow(); + // 1. Scan Id + errors_appender.Append(scan_idx); + // 2. File Id + errors_appender.Append(file_idx); + // 3. Row Line + errors_appender.Append(row_line); + // 4. Byte Position of the row error + errors_appender.Append(error.row_byte_position + 1); + // 5. Byte Position where error occurred + if (error.byte_position == -1) { + // This means this error comes from a flush, and we don't support this yet, so we give it + // a null + errors_appender.Append(Value()); + } else { + errors_appender.Append(error.byte_position + 1); + } + // 6. Column Index + if (error.type == CSVErrorType::MAXIMUM_LINE_SIZE) { + errors_appender.Append(Value()); + } else { + errors_appender.Append(col_idx + 1); } - auto row_error_msg = - StringUtil::Format("Could not convert string '%s' to '%s'", error.row[col_idx].ToString(), - file->types[col_idx].ToString()); - appender.Append(string_t(row_error_msg)); - appender.EndRow(); + // 7. Column Name (If Applicable) + switch (error.type) { + case CSVErrorType::TOO_MANY_COLUMNS: + case CSVErrorType::MAXIMUM_LINE_SIZE: + errors_appender.Append(Value()); + break; + case CSVErrorType::TOO_FEW_COLUMNS: + D_ASSERT(bind_data.return_names.size() > col_idx + 1); + errors_appender.Append(string_t(bind_data.return_names[col_idx + 1])); + break; + default: + errors_appender.Append(string_t(bind_data.return_names[col_idx])); + } + // 8. Error Type + errors_appender.Append(string_t(CSVErrorTypeToEnum(error.type))); + // 9. Original CSV Line + errors_appender.Append(string_t(error.csv_row)); + // 10. Full Error Message + errors_appender.Append(string_t(error.error_message)); + errors_appender.EndRow(); } - appender.Close(); } } + if (rejects->count != 0) { + rejects->count = 0; + FillScanErrorTable(scans_appender, scan_idx, file_idx, *file); + } } + errors_appender.Close(); + scans_appender.Close(); } } diff --git a/src/duckdb/src/execution/operator/csv_scanner/util/csv_error.cpp b/src/duckdb/src/execution/operator/csv_scanner/util/csv_error.cpp index 152d0dc9..d22738f2 100644 --- a/src/duckdb/src/execution/operator/csv_scanner/util/csv_error.cpp +++ b/src/duckdb/src/execution/operator/csv_scanner/util/csv_error.cpp @@ -1,5 +1,7 @@ #include "duckdb/execution/operator/csv_scanner/csv_error.hpp" #include "duckdb/common/exception/conversion_exception.hpp" +#include "duckdb/common/string_util.hpp" + #include namespace duckdb { @@ -16,9 +18,17 @@ CSVErrorHandler::CSVErrorHandler(bool ignore_errors_p) : ignore_errors(ignore_er void CSVErrorHandler::ThrowError(CSVError csv_error) { std::ostringstream error; if (PrintLineNumber(csv_error)) { - error << "CSV Error on Line: " << GetLine(csv_error.error_info) << std::endl; + error << "CSV Error on Line: " << GetLine(csv_error.error_info) << '\n'; + if (!csv_error.csv_row.empty()) { + error << "Original Line: " << csv_error.csv_row << '\n'; + } + } + if (csv_error.full_error_message.empty()) { + error << csv_error.error_message; + } else { + error << csv_error.full_error_message; } - error << csv_error.error_message; + switch (csv_error.type) { case CSVErrorType::CAST_ERROR: throw ConversionException(error.str()); @@ -76,10 +86,21 @@ CSVError::CSVError(string error_message_p, CSVErrorType type_p, LinesPerBoundary : error_message(std::move(error_message_p)), type(type_p), error_info(error_info_p) { } -CSVError::CSVError(string error_message_p, CSVErrorType type_p, idx_t column_idx_p, vector row_p, - LinesPerBoundary error_info_p) - : error_message(std::move(error_message_p)), type(type_p), column_idx(column_idx_p), row(std::move(row_p)), - error_info(error_info_p) { +CSVError::CSVError(string error_message_p, CSVErrorType type_p, idx_t column_idx_p, string csv_row_p, + LinesPerBoundary error_info_p, idx_t row_byte_position, int64_t byte_position_p, + const CSVReaderOptions &reader_options, const string &fixes) + : error_message(std::move(error_message_p)), type(type_p), column_idx(column_idx_p), csv_row(std::move(csv_row_p)), + error_info(error_info_p), row_byte_position(row_byte_position), byte_position(byte_position_p) { + // What were the options + std::ostringstream error; + if (reader_options.ignore_errors.GetValue()) { + RemoveNewLine(error_message); + } + error << error_message << '\n'; + error << fixes << '\n'; + error << reader_options.ToString(); + error << '\n'; + full_error_message = error.str(); } CSVError CSVError::ColumnTypesError(case_insensitive_map_t sql_types_per_column, const vector &names) { @@ -102,47 +123,60 @@ CSVError CSVError::ColumnTypesError(case_insensitive_map_t sql_types_per_ return CSVError(exception, CSVErrorType::COLUMN_NAME_TYPE_MISMATCH, {}); } +void CSVError::RemoveNewLine(string &error) { + error = StringUtil::Split(error, "\n")[0]; +} + CSVError CSVError::CastError(const CSVReaderOptions &options, string &column_name, string &cast_error, idx_t column_idx, - vector &row, LinesPerBoundary error_info, LogicalTypeId type) { + string &csv_row, LinesPerBoundary error_info, idx_t row_byte_position, + int64_t byte_position, LogicalTypeId type) { std::ostringstream error; // Which column - error << "Error when converting column \"" << column_name << "\"." << std::endl; + error << "Error when converting column \"" << column_name << "\". "; // What was the cast error - error << cast_error << std::endl; - - error << "Column " << column_name << " is being converted as type " << LogicalTypeIdToString(type) << std::endl; + error << cast_error << '\n'; + std::ostringstream how_to_fix_it; + how_to_fix_it << "Column " << column_name << " is being converted as type " << LogicalTypeIdToString(type) << '\n'; if (!options.WasTypeManuallySet(column_idx)) { - error << "This type was auto-detected from the CSV file." << std::endl; - error << "Possible solutions:" << std::endl; - error << "* Override the type for this column manually by setting the type explicitly, e.g. types={'" - << column_name << "': 'VARCHAR'}" << std::endl; - error << "* Set the sample size to a larger value to enable the auto-detection to scan more values, e.g. " - "sample_size=-1" - << std::endl; - error << "* Use a COPY statement to automatically derive types from an existing table." << std::endl; + how_to_fix_it << "This type was auto-detected from the CSV file." << '\n'; + how_to_fix_it << "Possible solutions:" << '\n'; + how_to_fix_it << "* Override the type for this column manually by setting the type explicitly, e.g. types={'" + << column_name << "': 'VARCHAR'}" << '\n'; + how_to_fix_it + << "* Set the sample size to a larger value to enable the auto-detection to scan more values, e.g. " + "sample_size=-1" + << '\n'; + how_to_fix_it << "* Use a COPY statement to automatically derive types from an existing table." << '\n'; } else { - error << "This type was either manually set or derived from an existing table. Select a different type to " - "correctly parse this column." - << std::endl; + how_to_fix_it + << "This type was either manually set or derived from an existing table. Select a different type to " + "correctly parse this column." + << '\n'; } - error << options.ToString(); - return CSVError(error.str(), CSVErrorType::CAST_ERROR, column_idx, row, error_info); + return CSVError(error.str(), CSVErrorType::CAST_ERROR, column_idx, csv_row, error_info, row_byte_position, + byte_position, options, how_to_fix_it.str()); } -CSVError CSVError::LineSizeError(const CSVReaderOptions &options, idx_t actual_size, LinesPerBoundary error_info) { +CSVError CSVError::LineSizeError(const CSVReaderOptions &options, idx_t actual_size, LinesPerBoundary error_info, + string &csv_row, idx_t byte_position) { std::ostringstream error; error << "Maximum line size of " << options.maximum_line_size << " bytes exceeded. "; - error << "Actual Size:" << actual_size << " bytes." << std::endl; - error << options.ToString(); - return CSVError(error.str(), CSVErrorType::MAXIMUM_LINE_SIZE, error_info); + error << "Actual Size:" << actual_size << " bytes." << '\n'; + + std::ostringstream how_to_fix_it; + how_to_fix_it << "Possible Solution: Change the maximum length size, e.g., max_line_size=" << actual_size + 1 + << "\n"; + + return CSVError(error.str(), CSVErrorType::MAXIMUM_LINE_SIZE, 0, csv_row, error_info, byte_position, byte_position, + options, how_to_fix_it.str()); } CSVError CSVError::SniffingError(string &file_path) { std::ostringstream error; // Which column - error << "Error when sniffing file \"" << file_path << "\"." << std::endl; - error << "CSV options could not be auto-detected. Consider setting parser options manually." << std::endl; + error << "Error when sniffing file \"" << file_path << "\"." << '\n'; + error << "CSV options could not be auto-detected. Consider setting parser options manually." << '\n'; return CSVError(error.str(), CSVErrorType::SNIFFING, {}); } @@ -150,49 +184,56 @@ CSVError CSVError::NullPaddingFail(const CSVReaderOptions &options, LinesPerBoun std::ostringstream error; error << " The parallel scanner does not support null_padding in conjunction with quoted new lines. Please " "disable the parallel csv reader with parallel=false" - << std::endl; + << '\n'; // What were the options error << options.ToString(); return CSVError(error.str(), CSVErrorType::NULLPADDED_QUOTED_NEW_VALUE, error_info); } -CSVError CSVError::UnterminatedQuotesError(const CSVReaderOptions &options, string_t *vector_ptr, - idx_t vector_line_start, idx_t current_column, LinesPerBoundary error_info) { +CSVError CSVError::UnterminatedQuotesError(const CSVReaderOptions &options, idx_t current_column, + LinesPerBoundary error_info, string &csv_row, idx_t row_byte_position, + int64_t byte_position) { std::ostringstream error; - error << "Value with unterminated quote found." << std::endl; - error << std::endl; - // What were the options - error << options.ToString(); - return CSVError(error.str(), CSVErrorType::UNTERMINATED_QUOTES, error_info); + error << "Value with unterminated quote found." << '\n'; + std::ostringstream how_to_fix_it; + how_to_fix_it << "Possible Solution: Enable ignore errors (ignore_errors=true) to skip this row" << '\n'; + return CSVError(error.str(), CSVErrorType::UNTERMINATED_QUOTES, current_column, csv_row, error_info, + row_byte_position, byte_position, options, how_to_fix_it.str()); } -CSVError CSVError::IncorrectColumnAmountError(const CSVReaderOptions &options, string_t *vector_ptr, - idx_t vector_line_start, idx_t actual_columns, - LinesPerBoundary error_info) { +CSVError CSVError::IncorrectColumnAmountError(const CSVReaderOptions &options, idx_t actual_columns, + LinesPerBoundary error_info, string &csv_row, idx_t row_byte_position, + int64_t byte_position) { std::ostringstream error; - // How many columns were expected and how many were found - error << "Expected Number of Columns: " << options.dialect_options.num_cols << " Found: " << actual_columns - << std::endl; - error << std::endl << "Possible fixes:" << std::endl; + // We don't have a fix for this + std::ostringstream how_to_fix_it; + how_to_fix_it << "Possible fixes:" << '\n'; if (!options.null_padding) { - error << "* Enable null padding (null_padding=true) to replace missing values with NULL" << std::endl; + how_to_fix_it << "* Enable null padding (null_padding=true) to replace missing values with NULL" << '\n'; } - if (!options.ignore_errors) { - error << "* Enable ignore errors (ignore_errors=true) to skip this row" << std::endl; + if (!options.ignore_errors.GetValue()) { + how_to_fix_it << "* Enable ignore errors (ignore_errors=true) to skip this row" << '\n'; + } + // How many columns were expected and how many were found + error << "Expected Number of Columns: " << options.dialect_options.num_cols << " Found: " << actual_columns + 1; + if (actual_columns >= options.dialect_options.num_cols) { + return CSVError(error.str(), CSVErrorType::TOO_MANY_COLUMNS, actual_columns, csv_row, error_info, + row_byte_position, byte_position - 1, options, how_to_fix_it.str()); + } else { + return CSVError(error.str(), CSVErrorType::TOO_FEW_COLUMNS, actual_columns, csv_row, error_info, + row_byte_position, byte_position - 1, options, how_to_fix_it.str()); } - error << std::endl; - // What were the options - error << options.ToString(); - return CSVError(error.str(), CSVErrorType::INCORRECT_COLUMN_AMOUNT, error_info); } -CSVError CSVError::InvalidUTF8(const CSVReaderOptions &options, LinesPerBoundary error_info) { +CSVError CSVError::InvalidUTF8(const CSVReaderOptions &options, idx_t current_column, LinesPerBoundary error_info, + string &csv_row, idx_t row_byte_position, int64_t byte_position) { std::ostringstream error; // How many columns were expected and how many were found - error << "Invalid unicode (byte sequence mismatch) detected." << std::endl; - // What were the options - error << options.ToString(); - return CSVError(error.str(), CSVErrorType::INVALID_UNICODE, error_info); + error << "Invalid unicode (byte sequence mismatch) detected." << '\n'; + std::ostringstream how_to_fix_it; + how_to_fix_it << "Possible Solution: Enable ignore errors (ignore_errors=true) to skip this row" << '\n'; + return CSVError(error.str(), CSVErrorType::INVALID_UNICODE, current_column, csv_row, error_info, row_byte_position, + byte_position, options, how_to_fix_it.str()); } bool CSVErrorHandler::PrintLineNumber(CSVError &error) { @@ -202,7 +243,8 @@ bool CSVErrorHandler::PrintLineNumber(CSVError &error) { switch (error.type) { case CSVErrorType::CAST_ERROR: case CSVErrorType::UNTERMINATED_QUOTES: - case CSVErrorType::INCORRECT_COLUMN_AMOUNT: + case CSVErrorType::TOO_FEW_COLUMNS: + case CSVErrorType::TOO_MANY_COLUMNS: case CSVErrorType::MAXIMUM_LINE_SIZE: case CSVErrorType::NULLPADDED_QUOTED_NEW_VALUE: case CSVErrorType::INVALID_UNICODE: diff --git a/src/duckdb/src/execution/operator/csv_scanner/util/csv_reader_options.cpp b/src/duckdb/src/execution/operator/csv_scanner/util/csv_reader_options.cpp index 0590ca3e..82a740b2 100644 --- a/src/duckdb/src/execution/operator/csv_scanner/util/csv_reader_options.cpp +++ b/src/duckdb/src/execution/operator/csv_scanner/util/csv_reader_options.cpp @@ -180,8 +180,6 @@ void CSVReaderOptions::SetReadOption(const string &loption, const Value &value, SetSkipRows(ParseInteger(value, loption)); } else if (loption == "max_line_size" || loption == "maximum_line_size") { maximum_line_size = ParseInteger(value, loption); - } else if (loption == "force_not_null") { - force_not_null = ParseColumnList(value, expected_names, loption); } else if (loption == "date_format" || loption == "dateformat") { string format = ParseString(value, loption); SetDateFormat(LogicalTypeId::DATE, format, true); @@ -189,7 +187,7 @@ void CSVReaderOptions::SetReadOption(const string &loption, const Value &value, string format = ParseString(value, loption); SetDateFormat(LogicalTypeId::TIMESTAMP, format, true); } else if (loption == "ignore_errors") { - ignore_errors = ParseBoolean(value, loption); + ignore_errors.Set(ParseBoolean(value, loption)); } else if (loption == "buffer_size") { buffer_size = ParseInteger(value, loption); if (buffer_size == 0) { @@ -206,20 +204,34 @@ void CSVReaderOptions::SetReadOption(const string &loption, const Value &value, parallel = ParseBoolean(value, loption); } else if (loption == "allow_quoted_nulls") { allow_quoted_nulls = ParseBoolean(value, loption); + } else if (loption == "store_rejects") { + store_rejects.Set(ParseBoolean(value, loption)); + } else if (loption == "force_not_null") { + if (!expected_names.empty()) { + force_not_null = ParseColumnList(value, expected_names, loption); + } else { + // Get the list of columns to use as a recovery key + auto &children = ListValue::GetChildren(value); + for (auto &child : children) { + auto col_name = child.GetValue(); + force_not_null_names.insert(col_name); + } + } + } else if (loption == "rejects_table") { // skip, handled in SetRejectsOptions auto table_name = ParseString(value, loption); if (table_name.empty()) { throw BinderException("REJECTS_TABLE option cannot be empty"); } - rejects_table_name = table_name; - } else if (loption == "rejects_recovery_columns") { - // Get the list of columns to use as a recovery key - auto &children = ListValue::GetChildren(value); - for (auto &child : children) { - auto col_name = child.GetValue(); - rejects_recovery_columns.push_back(col_name); + rejects_table_name.Set(table_name); + } else if (loption == "rejects_scan") { + // skip, handled in SetRejectsOptions + auto table_name = ParseString(value, loption); + if (table_name.empty()) { + throw BinderException("rejects_scan option cannot be empty"); } + rejects_scan_name.Set(table_name); } else if (loption == "rejects_limit") { int64_t limit = ParseInteger(value, loption); if (limit < 0) { @@ -238,7 +250,7 @@ void CSVReaderOptions::SetWriteOption(const string &loption, const Value &value) return; } - if (SetBaseOption(loption, value)) { + if (SetBaseOption(loption, value, true)) { return; } @@ -263,7 +275,7 @@ void CSVReaderOptions::SetWriteOption(const string &loption, const Value &value) } } -bool CSVReaderOptions::SetBaseOption(const string &loption, const Value &value) { +bool CSVReaderOptions::SetBaseOption(const string &loption, const Value &value, bool write_option) { // Make sure this function was only called after the option was turned into lowercase D_ASSERT(!std::any_of(loption.begin(), loption.end(), ::isupper)); @@ -277,8 +289,50 @@ bool CSVReaderOptions::SetBaseOption(const string &loption, const Value &value) SetEscape(ParseString(value, loption)); } else if (loption == "header") { SetHeader(ParseBoolean(value, loption)); - } else if (loption == "null" || loption == "nullstr") { - null_str = ParseString(value, loption); + } else if (loption == "nullstr" || loption == "null") { + auto &child_type = value.type(); + null_str.clear(); + if (child_type.id() != LogicalTypeId::LIST && child_type.id() != LogicalTypeId::VARCHAR) { + throw BinderException("CSV Reader function option %s requires a string or a list as input", loption); + } + if (!null_str.empty()) { + throw BinderException("CSV Reader function option nullstr can only be supplied once"); + } + if (child_type.id() == LogicalTypeId::LIST) { + auto &list_child = ListType::GetChildType(child_type); + const vector *children = nullptr; + if (list_child.id() == LogicalTypeId::LIST) { + // This can happen if it comes from a copy FROM/TO + auto &list_grandchild = ListType::GetChildType(list_child); + auto &children_ref = ListValue::GetChildren(value); + if (list_grandchild.id() != LogicalTypeId::VARCHAR || children_ref.size() != 1) { + throw BinderException("CSV Reader function option %s requires a non-empty list of possible null " + "strings (varchar) as input", + loption); + } + children = &ListValue::GetChildren(children_ref.back()); + } else if (list_child.id() != LogicalTypeId::VARCHAR) { + throw BinderException("CSV Reader function option %s requires a non-empty list of possible null " + "strings (varchar) as input", + loption); + } + if (!children) { + children = &ListValue::GetChildren(value); + } + for (auto &child : *children) { + if (child.IsNull()) { + throw BinderException( + "CSV Reader function option %s does not accept NULL values as a valid nullstr option", loption); + } + null_str.push_back(StringValue::Get(child)); + } + } else { + null_str.push_back(StringValue::Get(ParseString(value, loption))); + } + if (null_str.size() > 1 && write_option) { + throw BinderException("CSV Writer function option %s only accepts one nullstr value.", loption); + } + } else if (loption == "encoding") { auto encoding = StringUtil::Lower(ParseString(value, loption)); if (encoding != "utf8" && encoding != "utf-8") { @@ -337,7 +391,7 @@ string CSVReaderOptions::ToString() const { // sample_size error += "sample_size=" + std::to_string(sample_size_chunks * STANDARD_VECTOR_SIZE) + "\n "; // ignore_errors - error += "ignore_errors=" + std::to_string(ignore_errors) + "\n "; + error += "ignore_errors=" + ignore_errors.FormatValue() + "\n "; // all_varchar error += "all_varchar=" + std::to_string(all_varchar) + "\n"; @@ -361,9 +415,10 @@ static uint8_t GetCandidateSpecificity(const LogicalType &candidate_type) { {(uint8_t)LogicalTypeId::VARCHAR, 0}, {(uint8_t)LogicalTypeId::TIMESTAMP, 1}, {(uint8_t)LogicalTypeId::DATE, 2}, {(uint8_t)LogicalTypeId::TIME, 3}, {(uint8_t)LogicalTypeId::DOUBLE, 4}, {(uint8_t)LogicalTypeId::FLOAT, 5}, - {(uint8_t)LogicalTypeId::BIGINT, 6}, {(uint8_t)LogicalTypeId::INTEGER, 7}, - {(uint8_t)LogicalTypeId::SMALLINT, 8}, {(uint8_t)LogicalTypeId::TINYINT, 9}, - {(uint8_t)LogicalTypeId::BOOLEAN, 10}, {(uint8_t)LogicalTypeId::SQLNULL, 11}}; + {(uint8_t)LogicalTypeId::DECIMAL, 6}, {(uint8_t)LogicalTypeId::BIGINT, 7}, + {(uint8_t)LogicalTypeId::INTEGER, 8}, {(uint8_t)LogicalTypeId::SMALLINT, 9}, + {(uint8_t)LogicalTypeId::TINYINT, 10}, {(uint8_t)LogicalTypeId::BOOLEAN, 11}, + {(uint8_t)LogicalTypeId::SQLNULL, 12}}; auto id = (uint8_t)candidate_type.id(); auto it = auto_type_candidates_specificity.find(id); @@ -373,17 +428,26 @@ static uint8_t GetCandidateSpecificity(const LogicalType &candidate_type) { } return it->second; } - +bool StoreUserDefinedParameter(string &option) { + if (option == "column_types" || option == "types" || option == "dtypes" || option == "auto_detect" || + option == "auto_type_candidates" || option == "columns" || option == "names") { + // We don't store options related to types, names and auto-detection since these are either irrelevant to our + // prompt or are covered by the columns option. + return false; + } + return true; +} void CSVReaderOptions::FromNamedParameters(named_parameter_map_t &in, ClientContext &context, vector &return_types, vector &names) { + map ordered_user_defined_parameters; for (auto &kv : in) { if (MultiFileReader::ParseOption(kv.first, kv.second, file_options, context)) { continue; } auto loption = StringUtil::Lower(kv.first); // skip variables that are specific to auto detection - if (loption != "auto_detect" && loption != "auto_type_candidates") { - user_defined_parameters += loption + "=" + kv.second.ToSQLString() + ", "; + if (StoreUserDefinedParameter(loption)) { + ordered_user_defined_parameters[loption] = kv.second.ToSQLString(); } if (loption == "columns") { auto &child_type = kv.second.type(); @@ -489,6 +553,9 @@ void CSVReaderOptions::FromNamedParameters(named_parameter_map_t &in, ClientCont SetReadOption(loption, kv.second, names); } } + for (auto &udf_parameter : ordered_user_defined_parameters) { + user_defined_parameters += udf_parameter.first + "=" + udf_parameter.second + ", "; + } if (user_defined_parameters.size() >= 2) { user_defined_parameters.erase(user_defined_parameters.size() - 2); } diff --git a/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp b/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp index 10fd4779..186c1541 100644 --- a/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +++ b/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp @@ -7,16 +7,17 @@ namespace duckdb { -PhysicalVacuum::PhysicalVacuum(unique_ptr info_p, idx_t estimated_cardinality) +PhysicalVacuum::PhysicalVacuum(unique_ptr info_p, optional_ptr table, + unordered_map column_id_map, idx_t estimated_cardinality) : PhysicalOperator(PhysicalOperatorType::VACUUM, {LogicalType::BOOLEAN}, estimated_cardinality), - info(std::move(info_p)) { + info(std::move(info_p)), table(table), column_id_map(std::move(column_id_map)) { } class VacuumLocalSinkState : public LocalSinkState { public: - explicit VacuumLocalSinkState(VacuumInfo &info) { + explicit VacuumLocalSinkState(VacuumInfo &info, optional_ptr table) { for (const auto &column_name : info.columns) { - auto &column = info.table->GetColumn(column_name); + auto &column = table->GetColumn(column_name); if (DistinctStatistics::TypeIsSupported(column.GetType())) { column_distinct_stats.push_back(make_uniq()); } else { @@ -29,15 +30,14 @@ class VacuumLocalSinkState : public LocalSinkState { }; unique_ptr PhysicalVacuum::GetLocalSinkState(ExecutionContext &context) const { - return make_uniq(*info); + return make_uniq(*info, table); } class VacuumGlobalSinkState : public GlobalSinkState { public: - explicit VacuumGlobalSinkState(VacuumInfo &info) { - + explicit VacuumGlobalSinkState(VacuumInfo &info, optional_ptr table) { for (const auto &column_name : info.columns) { - auto &column = info.table->GetColumn(column_name); + auto &column = table->GetColumn(column_name); if (DistinctStatistics::TypeIsSupported(column.GetType())) { column_distinct_stats.push_back(make_uniq()); } else { @@ -51,12 +51,12 @@ class VacuumGlobalSinkState : public GlobalSinkState { }; unique_ptr PhysicalVacuum::GetGlobalSinkState(ClientContext &context) const { - return make_uniq(*info); + return make_uniq(*info, table); } SinkResultType PhysicalVacuum::Sink(ExecutionContext &context, DataChunk &chunk, OperatorSinkInput &input) const { auto &lstate = input.local_state.Cast(); - D_ASSERT(lstate.column_distinct_stats.size() == info->column_id_map.size()); + D_ASSERT(lstate.column_distinct_stats.size() == column_id_map.size()); for (idx_t col_idx = 0; col_idx < chunk.data.size(); col_idx++) { if (!DistinctStatistics::TypeIsSupported(chunk.data[col_idx].GetType())) { @@ -89,10 +89,9 @@ SinkFinalizeType PhysicalVacuum::Finalize(Pipeline &pipeline, Event &event, Clie OperatorSinkFinalizeInput &input) const { auto &sink = input.global_state.Cast(); - auto table = info->table; + auto tbl = table; for (idx_t col_idx = 0; col_idx < sink.column_distinct_stats.size(); col_idx++) { - table->GetStorage().SetDistinct(info->column_id_map.at(col_idx), - std::move(sink.column_distinct_stats[col_idx])); + tbl->GetStorage().SetDistinct(column_id_map.at(col_idx), std::move(sink.column_distinct_stats[col_idx])); } return SinkFinalizeType::READY; diff --git a/src/duckdb/src/execution/operator/join/physical_iejoin.cpp b/src/duckdb/src/execution/operator/join/physical_iejoin.cpp index df7fc232..6e21b860 100644 --- a/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +++ b/src/duckdb/src/execution/operator/join/physical_iejoin.cpp @@ -220,6 +220,7 @@ struct IEJoinUnion { DataChunk payload; payload.Initialize(Allocator::DefaultAllocator(), gstate.payload_layout.GetTypes()); for (;;) { + payload.Reset(); scanner.Scan(payload); const auto count = payload.size(); if (!count) { @@ -301,6 +302,7 @@ idx_t IEJoinUnion::AppendKey(SortedTable &table, ExpressionExecutor &executor, S idx_t inserted = 0; for (auto rid = base; table_idx < valid;) { + scanned.Reset(); scanner.Scan(scanned); // NULLs are at the end, so stop when we reach them diff --git a/src/duckdb/src/execution/operator/persistent/csv_rejects_table.cpp b/src/duckdb/src/execution/operator/persistent/csv_rejects_table.cpp index a96bb225..11e8c1b0 100644 --- a/src/duckdb/src/execution/operator/persistent/csv_rejects_table.cpp +++ b/src/duckdb/src/execution/operator/persistent/csv_rejects_table.cpp @@ -3,44 +3,139 @@ #include "duckdb/function/table/read_csv.hpp" #include "duckdb/execution/operator/persistent/csv_rejects_table.hpp" #include "duckdb/catalog/catalog_entry/table_catalog_entry.hpp" +#include "duckdb/parser/parsed_data/create_type_info.hpp" namespace duckdb { -TableCatalogEntry &CSVRejectsTable::GetTable(ClientContext &context) { +TableCatalogEntry &CSVRejectsTable::GetErrorsTable(ClientContext &context) { auto &temp_catalog = Catalog::GetCatalog(context, TEMP_CATALOG); - auto &table_entry = temp_catalog.GetEntry(context, TEMP_CATALOG, DEFAULT_SCHEMA, name); + auto &table_entry = temp_catalog.GetEntry(context, TEMP_CATALOG, DEFAULT_SCHEMA, errors_table); return table_entry; } -shared_ptr CSVRejectsTable::GetOrCreate(ClientContext &context, const string &name) { - auto key = "CSV_REJECTS_TABLE_CACHE_ENTRY_" + StringUtil::Upper(name); +TableCatalogEntry &CSVRejectsTable::GetScansTable(ClientContext &context) { + auto &temp_catalog = Catalog::GetCatalog(context, TEMP_CATALOG); + auto &table_entry = temp_catalog.GetEntry(context, TEMP_CATALOG, DEFAULT_SCHEMA, scan_table); + return table_entry; +} + +idx_t CSVRejectsTable::GetCurrentFileIndex(idx_t query_id) { + if (current_query_id != query_id) { + current_query_id = query_id; + current_file_idx = 0; + } + return current_file_idx++; +} + +shared_ptr CSVRejectsTable::GetOrCreate(ClientContext &context, const string &rejects_scan, + const string &rejects_error) { + // Check that these names can't be the same + if (rejects_scan == rejects_error) { + throw BinderException("The names of the rejects scan and rejects error tables can't be the same. Use different " + "names for these tables."); + } + auto key = + "CSV_REJECTS_TABLE_CACHE_ENTRY_" + StringUtil::Upper(rejects_scan) + "_" + StringUtil::Upper(rejects_error); auto &cache = ObjectCache::GetObjectCache(context); - return cache.GetOrCreate(key, name); + auto &catalog = Catalog::GetCatalog(context, TEMP_CATALOG); + auto rejects_scan_exist = catalog.GetEntry(context, CatalogType::TABLE_ENTRY, DEFAULT_SCHEMA, rejects_scan, + OnEntryNotFound::RETURN_NULL) != nullptr; + auto rejects_error_exist = catalog.GetEntry(context, CatalogType::TABLE_ENTRY, DEFAULT_SCHEMA, rejects_error, + OnEntryNotFound::RETURN_NULL) != nullptr; + if ((rejects_scan_exist || rejects_error_exist) && !cache.Get(key)) { + std::ostringstream error; + if (rejects_scan_exist) { + error << "Reject Scan Table name \"" << rejects_scan << "\" is already in use. "; + } + if (rejects_error_exist) { + error << "Reject Error Table name \"" << rejects_error << "\" is already in use. "; + } + error << "Either drop the used name(s), or give other name options in the CSV Reader function.\n"; + throw BinderException(error.str()); + } + + return cache.GetOrCreate(key, rejects_scan, rejects_error); } void CSVRejectsTable::InitializeTable(ClientContext &context, const ReadCSVData &data) { // (Re)Create the temporary rejects table auto &catalog = Catalog::GetCatalog(context, TEMP_CATALOG); - auto info = make_uniq(TEMP_CATALOG, DEFAULT_SCHEMA, name); - info->temporary = true; - info->on_conflict = OnCreateConflict::ERROR_ON_CONFLICT; - info->columns.AddColumn(ColumnDefinition("file", LogicalType::VARCHAR)); - info->columns.AddColumn(ColumnDefinition("line", LogicalType::BIGINT)); - info->columns.AddColumn(ColumnDefinition("column", LogicalType::BIGINT)); - info->columns.AddColumn(ColumnDefinition("column_name", LogicalType::VARCHAR)); - info->columns.AddColumn(ColumnDefinition("parsed_value", LogicalType::VARCHAR)); - - if (!data.options.rejects_recovery_columns.empty()) { - child_list_t recovery_key_components; - for (auto &col_name : data.options.rejects_recovery_columns) { - recovery_key_components.emplace_back(col_name, LogicalType::VARCHAR); - } - info->columns.AddColumn(ColumnDefinition("recovery_columns", LogicalType::STRUCT(recovery_key_components))); - } - info->columns.AddColumn(ColumnDefinition("error", LogicalType::VARCHAR)); + // Create CSV_ERROR_TYPE ENUM + string enum_name = "CSV_ERROR_TYPE"; + Vector order_errors(LogicalType::VARCHAR, 6); + order_errors.SetValue(0, "CAST"); + order_errors.SetValue(1, "MISSING COLUMNS"); + order_errors.SetValue(2, "TOO MANY COLUMNS"); + order_errors.SetValue(3, "UNQUOTED VALUE"); + order_errors.SetValue(4, "LINE SIZE OVER MAXIMUM"); + order_errors.SetValue(5, "INVALID UNICODE"); + LogicalType enum_type = LogicalType::ENUM(enum_name, order_errors, 6); + auto type_info = make_uniq(enum_name, enum_type); + type_info->temporary = true; + type_info->on_conflict = OnCreateConflict::IGNORE_ON_CONFLICT; + catalog.CreateType(context, *type_info); - catalog.CreateTable(context, std::move(info)); + // Create Rejects Scans Table + { + auto info = make_uniq(TEMP_CATALOG, DEFAULT_SCHEMA, scan_table); + info->temporary = true; + info->on_conflict = OnCreateConflict::IGNORE_ON_CONFLICT; + // 0. Scan ID + info->columns.AddColumn(ColumnDefinition("scan_id", LogicalType::UBIGINT)); + // 1. File ID (within the scan) + info->columns.AddColumn(ColumnDefinition("file_id", LogicalType::UBIGINT)); + // 2. File Path + info->columns.AddColumn(ColumnDefinition("file_path", LogicalType::VARCHAR)); + // 3. Delimiter + info->columns.AddColumn(ColumnDefinition("delimiter", LogicalType::VARCHAR)); + // 4. Quote + info->columns.AddColumn(ColumnDefinition("quote", LogicalType::VARCHAR)); + // 5. Escape + info->columns.AddColumn(ColumnDefinition("escape", LogicalType::VARCHAR)); + // 6. NewLine Delimiter + info->columns.AddColumn(ColumnDefinition("newline_delimiter", LogicalType::VARCHAR)); + // 7. Skip Rows + info->columns.AddColumn(ColumnDefinition("skip_rows", LogicalType::UINTEGER)); + // 8. Has Header + info->columns.AddColumn(ColumnDefinition("has_header", LogicalType::BOOLEAN)); + // 9. List> + info->columns.AddColumn(ColumnDefinition("columns", LogicalType::VARCHAR)); + // 10. Date Format + info->columns.AddColumn(ColumnDefinition("date_format", LogicalType::VARCHAR)); + // 11. Timestamp Format + info->columns.AddColumn(ColumnDefinition("timestamp_format", LogicalType::VARCHAR)); + // 12. CSV read function with all the options used + info->columns.AddColumn(ColumnDefinition("user_arguments", LogicalType::VARCHAR)); + catalog.CreateTable(context, std::move(info)); + } + { + // Create Rejects Error Table + auto info = make_uniq(TEMP_CATALOG, DEFAULT_SCHEMA, errors_table); + info->temporary = true; + info->on_conflict = OnCreateConflict::IGNORE_ON_CONFLICT; + // 0. Scan ID + info->columns.AddColumn(ColumnDefinition("scan_id", LogicalType::UBIGINT)); + // 1. File ID (within the scan) + info->columns.AddColumn(ColumnDefinition("file_id", LogicalType::UBIGINT)); + // 2. Row Line + info->columns.AddColumn(ColumnDefinition("line", LogicalType::UBIGINT)); + // 3. Byte Position of the start of the line + info->columns.AddColumn(ColumnDefinition("line_byte_position", LogicalType::UBIGINT)); + // 4. Byte Position where error occurred + info->columns.AddColumn(ColumnDefinition("byte_position", LogicalType::UBIGINT)); + // 5. Column Index (If Applicable) + info->columns.AddColumn(ColumnDefinition("column_idx", LogicalType::UBIGINT)); + // 6. Column Name (If Applicable) + info->columns.AddColumn(ColumnDefinition("column_name", LogicalType::VARCHAR)); + // 7. Error Type + info->columns.AddColumn(ColumnDefinition("error_type", enum_type)); + // 8. Original CSV Line + info->columns.AddColumn(ColumnDefinition("csv_line", LogicalType::VARCHAR)); + // 9. Full Error Message + info->columns.AddColumn(ColumnDefinition("error_message", LogicalType::VARCHAR)); + catalog.CreateTable(context, std::move(info)); + } count = 0; } diff --git a/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp b/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp index 307dbccc..5447f433 100644 --- a/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp +++ b/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp @@ -62,7 +62,7 @@ struct FixedPreparedBatchData { class FixedBatchCopyGlobalState : public GlobalSinkState { public: // heuristic - we need at least 4MB of cache space per column per thread we launch - static constexpr const idx_t MINIMUM_MEMORY_PER_COLUMN_PER_THREAD = 4 * 1024 * 1024; + static constexpr const idx_t MINIMUM_MEMORY_PER_COLUMN_PER_THREAD = 4ULL * 1024ULL * 1024ULL; public: explicit FixedBatchCopyGlobalState(ClientContext &context_p, unique_ptr global_state, @@ -117,7 +117,7 @@ class FixedBatchCopyGlobalState : public GlobalSinkState { } }; -enum class FixedBatchCopyState { SINKING_DATA = 1, PROCESSING_TASKS = 2 }; +enum class FixedBatchCopyState : uint8_t { SINKING_DATA = 1, PROCESSING_TASKS = 2 }; class FixedBatchCopyLocalState : public LocalSinkState { public: diff --git a/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp b/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp index d2b1450a..7ddd838f 100644 --- a/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +++ b/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp @@ -125,8 +125,9 @@ class BatchInsertTask { class BatchInsertGlobalState : public GlobalSinkState { public: - explicit BatchInsertGlobalState(ClientContext &context, DuckTableEntry &table, idx_t initial_memory) - : memory_manager(context, initial_memory), table(table), insert_count(0), optimistically_written(false) { + explicit BatchInsertGlobalState(ClientContext &context, DuckTableEntry &table, idx_t minimum_memory_per_thread) + : memory_manager(context, minimum_memory_per_thread), table(table), insert_count(0), + optimistically_written(false), minimum_memory_per_thread(minimum_memory_per_thread) { } BatchMemoryManager memory_manager; @@ -137,6 +138,7 @@ class BatchInsertGlobalState : public GlobalSinkState { vector collections; idx_t next_start = 0; atomic optimistically_written; + idx_t minimum_memory_per_thread; static bool ReadyToMerge(idx_t count); void ScheduleMergeTasks(idx_t min_batch_index); @@ -146,6 +148,13 @@ class BatchInsertGlobalState : public GlobalSinkState { void AddCollection(ClientContext &context, idx_t batch_index, idx_t min_batch_index, unique_ptr current_collection, optional_ptr writer = nullptr); + + idx_t MaxThreads(idx_t source_max_threads) override { + // try to request 4MB per column per thread + memory_manager.SetMemorySize(source_max_threads * minimum_memory_per_thread); + // cap the concurrent threads working on this task based on the amount of available memory + return MinValue(source_max_threads, memory_manager.AvailableMemory() / minimum_memory_per_thread + 1); + } }; class BatchInsertLocalState : public LocalSinkState { @@ -376,9 +385,9 @@ unique_ptr PhysicalBatchInsert::GetGlobalSinkState(ClientContex table = insert_table.get_mutable(); } // heuristic - we start off by allocating 4MB of cache space per column - static constexpr const idx_t MINIMUM_MEMORY_PER_COLUMN = 4 * 1024 * 1024; - auto initial_memory = table->GetColumns().PhysicalColumnCount() * MINIMUM_MEMORY_PER_COLUMN; - auto result = make_uniq(context, table->Cast(), initial_memory); + static constexpr const idx_t MINIMUM_MEMORY_PER_COLUMN = 4ULL * 1024ULL * 1024ULL; + auto minimum_memory_per_thread = table->GetColumns().PhysicalColumnCount() * MINIMUM_MEMORY_PER_COLUMN; + auto result = make_uniq(context, table->Cast(), minimum_memory_per_thread); return std::move(result); } diff --git a/src/duckdb/src/execution/operator/persistent/physical_copy_database.cpp b/src/duckdb/src/execution/operator/persistent/physical_copy_database.cpp index bee893c1..d0d83130 100644 --- a/src/duckdb/src/execution/operator/persistent/physical_copy_database.cpp +++ b/src/duckdb/src/execution/operator/persistent/physical_copy_database.cpp @@ -25,7 +25,7 @@ PhysicalCopyDatabase::~PhysicalCopyDatabase() { //===--------------------------------------------------------------------===// SourceResultType PhysicalCopyDatabase::GetData(ExecutionContext &context, DataChunk &chunk, OperatorSourceInput &input) const { - auto &catalog = info->to_database; + auto &catalog = Catalog::GetCatalog(context.client, info->target_database); for (auto &create_info : info->entries) { switch (create_info->type) { case CatalogType::SCHEMA_ENTRY: diff --git a/src/duckdb/src/execution/operator/persistent/physical_export.cpp b/src/duckdb/src/execution/operator/persistent/physical_export.cpp index 8209e518..3979a88e 100644 --- a/src/duckdb/src/execution/operator/persistent/physical_export.cpp +++ b/src/duckdb/src/execution/operator/persistent/physical_export.cpp @@ -22,15 +22,15 @@ static void WriteCatalogEntries(stringstream &ss, vector if (entry.get().internal) { continue; } - ss << entry.get().ToSQL() << std::endl; + ss << entry.get().ToSQL() << '\n'; } - ss << std::endl; + ss << '\n'; } static void WriteStringStreamToFile(FileSystem &fs, stringstream &ss, const string &path) { auto ss_string = ss.str(); - auto handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE_NEW, - FileLockType::WRITE_LOCK); + auto handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE_NEW | + FileLockType::WRITE_LOCK); fs.Write(*handle, (void *)ss_string.c_str(), ss_string.size()); handle.reset(); } @@ -77,7 +77,7 @@ static void WriteCopyStatement(FileSystem &fs, stringstream &ss, CopyInfo &info, throw NotImplementedException("FIXME: serialize list of options"); } } - ss << ");" << std::endl; + ss << ");" << '\n'; } //===--------------------------------------------------------------------===// diff --git a/src/duckdb/src/execution/operator/schema/physical_attach.cpp b/src/duckdb/src/execution/operator/schema/physical_attach.cpp index 2c2b76a0..c60e9b75 100644 --- a/src/duckdb/src/execution/operator/schema/physical_attach.cpp +++ b/src/duckdb/src/execution/operator/schema/physical_attach.cpp @@ -99,7 +99,7 @@ SourceResultType PhysicalAttach::GetData(ExecutionContext &context, DataChunk &c // get the database type and attach the database db_manager.GetDatabaseType(context.client, db_type, *info, config, unrecognized_option); auto attached_db = db_manager.AttachDatabase(context.client, *info, db_type, access_mode); - attached_db->Initialize(); + attached_db->Initialize(&context.client); return SourceResultType::FINISHED; } diff --git a/src/duckdb/src/execution/physical_plan/plan_simple.cpp b/src/duckdb/src/execution/physical_plan/plan_simple.cpp index a32aef16..3a7c2f96 100644 --- a/src/duckdb/src/execution/physical_plan/plan_simple.cpp +++ b/src/duckdb/src/execution/physical_plan/plan_simple.cpp @@ -25,15 +25,6 @@ unique_ptr PhysicalPlanGenerator::CreatePlan(LogicalSimple &op case LogicalOperatorType::LOGICAL_TRANSACTION: return make_uniq(unique_ptr_cast(std::move(op.info)), op.estimated_cardinality); - case LogicalOperatorType::LOGICAL_VACUUM: { - auto result = make_uniq(unique_ptr_cast(std::move(op.info)), - op.estimated_cardinality); - if (!op.children.empty()) { - auto child = CreatePlan(*op.children[0]); - result->children.push_back(std::move(child)); - } - return std::move(result); - } case LogicalOperatorType::LOGICAL_LOAD: return make_uniq(unique_ptr_cast(std::move(op.info)), op.estimated_cardinality); diff --git a/src/duckdb/src/execution/physical_plan/plan_vacuum.cpp b/src/duckdb/src/execution/physical_plan/plan_vacuum.cpp new file mode 100644 index 00000000..3f1f88b3 --- /dev/null +++ b/src/duckdb/src/execution/physical_plan/plan_vacuum.cpp @@ -0,0 +1,18 @@ +#include "duckdb/execution/operator/helper/physical_vacuum.hpp" +#include "duckdb/execution/physical_plan_generator.hpp" +#include "duckdb/planner/logical_operator.hpp" +#include "duckdb/planner/operator/logical_vacuum.hpp" + +namespace duckdb { + +unique_ptr PhysicalPlanGenerator::CreatePlan(LogicalVacuum &op) { + auto result = make_uniq(unique_ptr_cast(std::move(op.info)), op.table, + std::move(op.column_id_map), op.estimated_cardinality); + if (!op.children.empty()) { + auto child = CreatePlan(*op.children[0]); + result->children.push_back(std::move(child)); + } + return std::move(result); +} + +} // namespace duckdb diff --git a/src/duckdb/src/execution/physical_plan_generator.cpp b/src/duckdb/src/execution/physical_plan_generator.cpp index b94a63e7..4f88c00c 100644 --- a/src/duckdb/src/execution/physical_plan_generator.cpp +++ b/src/duckdb/src/execution/physical_plan_generator.cpp @@ -15,7 +15,7 @@ namespace duckdb { class DependencyExtractor : public LogicalOperatorVisitor { public: - explicit DependencyExtractor(DependencyList &dependencies) : dependencies(dependencies) { + explicit DependencyExtractor(LogicalDependencyList &dependencies) : dependencies(dependencies) { } protected: @@ -28,7 +28,7 @@ class DependencyExtractor : public LogicalOperatorVisitor { } private: - DependencyList &dependencies; + LogicalDependencyList &dependencies; }; PhysicalPlanGenerator::PhysicalPlanGenerator(ClientContext &context) : context(context) { @@ -176,10 +176,12 @@ unique_ptr PhysicalPlanGenerator::CreatePlan(LogicalOperator & case LogicalOperatorType::LOGICAL_PRAGMA: plan = CreatePlan(op.Cast()); break; + case LogicalOperatorType::LOGICAL_VACUUM: + plan = CreatePlan(op.Cast()); + break; case LogicalOperatorType::LOGICAL_TRANSACTION: case LogicalOperatorType::LOGICAL_ALTER: case LogicalOperatorType::LOGICAL_DROP: - case LogicalOperatorType::LOGICAL_VACUUM: case LogicalOperatorType::LOGICAL_LOAD: case LogicalOperatorType::LOGICAL_ATTACH: case LogicalOperatorType::LOGICAL_DETACH: diff --git a/src/duckdb/src/execution/radix_partitioned_hashtable.cpp b/src/duckdb/src/execution/radix_partitioned_hashtable.cpp index fe8575cb..acad77d0 100644 --- a/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +++ b/src/duckdb/src/execution/radix_partitioned_hashtable.cpp @@ -69,13 +69,27 @@ unique_ptr RadixPartitionedHashTable::CreateHT(Client //===--------------------------------------------------------------------===// // Sink //===--------------------------------------------------------------------===// +enum class AggregatePartitionState : uint8_t { + //! Can be finalized + READY_TO_FINALIZE = 0, + //! Finalize is in progress + FINALIZE_IN_PROGRESS = 1, + //! Finalized, ready to scan + READY_TO_SCAN = 2 +}; + struct AggregatePartition { explicit AggregatePartition(unique_ptr data_p) - : data(std::move(data_p)), progress(0), finalized(false) { + : state(AggregatePartitionState::READY_TO_FINALIZE), data(std::move(data_p)), progress(0) { } + + mutex lock; + AggregatePartitionState state; + unique_ptr data; atomic progress; - atomic finalized; + + vector blocked_tasks; }; class RadixHTGlobalSinkState; @@ -165,9 +179,7 @@ class RadixHTGlobalSinkState : public GlobalSinkState { //! Partitions that are finalized during GetData vector> partitions; - - //! For synchronizing finalize tasks - atomic finalize_idx; + //! For keeping track of progress atomic finalize_done; //! Pin properties when scanning @@ -176,16 +188,13 @@ class RadixHTGlobalSinkState : public GlobalSinkState { idx_t count_before_combining; //! Maximum partition size if all unique idx_t max_partition_size; - - vector blocked_tasks; }; RadixHTGlobalSinkState::RadixHTGlobalSinkState(ClientContext &context_p, const RadixPartitionedHashTable &radix_ht_p) : context(context_p), temporary_memory_state(TemporaryMemoryManager::Get(context).Register(context)), radix_ht(radix_ht_p), config(context, *this), finalized(false), external(false), active_threads(0), - any_combined(false), finalize_idx(0), finalize_done(0), - scan_pin_properties(TupleDataPinProperties::DESTROY_AFTER_DONE), count_before_combining(0), - max_partition_size(0) { + any_combined(false), finalize_done(0), scan_pin_properties(TupleDataPinProperties::DESTROY_AFTER_DONE), + count_before_combining(0), max_partition_size(0) { auto tuples_per_block = Storage::BLOCK_ALLOC_SIZE / radix_ht.GetLayout().GetRowWidth(); idx_t ht_count = config.sink_capacity / GroupedAggregateHashTable::LOAD_FACTOR; @@ -516,8 +525,9 @@ void RadixPartitionedHashTable::Finalize(ClientContext &context, GlobalSinkState gstate.partitions.emplace_back(make_uniq(std::move(partition))); if (single_ht) { - gstate.finalize_idx++; - gstate.partitions.back()->finalized = true; + gstate.finalize_done++; + gstate.partitions.back()->progress = 1; + gstate.partitions.back()->state = AggregatePartitionState::READY_TO_SCAN; } } } else { @@ -566,7 +576,8 @@ class RadixHTGlobalSourceState : public GlobalSourceState { RadixHTGlobalSourceState(ClientContext &context, const RadixPartitionedHashTable &radix_ht); //! Assigns a task to a local source state - bool AssignTask(RadixHTGlobalSinkState &sink, RadixHTLocalSourceState &lstate); + SourceResultType AssignTask(RadixHTGlobalSinkState &sink, RadixHTLocalSourceState &lstate, + InterruptState &interrupt_state); public: //! The client context @@ -577,10 +588,10 @@ class RadixHTGlobalSourceState : public GlobalSourceState { //! Column ids for scanning vector column_ids; - //! For synchronizing scan tasks + //! For synchronizing tasks mutex lock; - idx_t scan_idx; - atomic scan_done; + idx_t task_idx; + atomic task_done; }; enum class RadixHTScanStatus : uint8_t { INIT, IN_PROGRESS, DONE }; @@ -629,61 +640,44 @@ unique_ptr RadixPartitionedHashTable::GetLocalSourceState(Exec } RadixHTGlobalSourceState::RadixHTGlobalSourceState(ClientContext &context_p, const RadixPartitionedHashTable &radix_ht) - : context(context_p), finished(false), scan_idx(0), scan_done(0) { + : context(context_p), finished(false), task_idx(0), task_done(0) { for (column_t column_id = 0; column_id < radix_ht.group_types.size(); column_id++) { column_ids.push_back(column_id); } } -bool RadixHTGlobalSourceState::AssignTask(RadixHTGlobalSinkState &sink, RadixHTLocalSourceState &lstate) { - D_ASSERT(lstate.scan_status != RadixHTScanStatus::IN_PROGRESS); - - const auto n_partitions = sink.partitions.size(); +SourceResultType RadixHTGlobalSourceState::AssignTask(RadixHTGlobalSinkState &sink, RadixHTLocalSourceState &lstate, + InterruptState &interrupt_state) { + // First, try to get a partition index + lock_guard gstate_guard(lock); if (finished) { - return false; + return SourceResultType::FINISHED; } - - // We first try to assign a Scan task, then a Finalize task if that didn't work - bool scan_assigned = false; - if (scan_idx < n_partitions && sink.partitions[scan_idx]->finalized) { - lstate.task_idx = scan_idx++; - scan_assigned = true; - if (scan_idx == n_partitions) { - // We will never be able to assign another task, unblock blocked tasks - lock_guard sink_guard(sink.lock); - if (!sink.blocked_tasks.empty()) { - for (auto &state : sink.blocked_tasks) { - state.Callback(); - } - sink.blocked_tasks.clear(); - } - } + if (task_idx == sink.partitions.size()) { + return SourceResultType::FINISHED; } + lstate.task_idx = task_idx++; - if (scan_assigned) { - // We successfully assigned a Scan task - D_ASSERT(lstate.task_idx < n_partitions && sink.partitions[lstate.task_idx]->finalized); + // We got a partition index + auto &partition = *sink.partitions[lstate.task_idx]; + auto partition_lock = unique_lock(partition.lock); + switch (partition.state) { + case AggregatePartitionState::READY_TO_FINALIZE: + partition.state = AggregatePartitionState::FINALIZE_IN_PROGRESS; + lstate.task = RadixHTSourceTaskType::FINALIZE; + return SourceResultType::HAVE_MORE_OUTPUT; + case AggregatePartitionState::FINALIZE_IN_PROGRESS: lstate.task = RadixHTSourceTaskType::SCAN; lstate.scan_status = RadixHTScanStatus::INIT; - return true; - } - - // We didn't assign a Scan task - if (sink.finalize_idx >= n_partitions) { - lstate.ht.reset(); - return false; // No finalize tasks left - } - - // We can just increment the atomic here, much simpler than assigning the scan task - lstate.task_idx = sink.finalize_idx++; - if (lstate.task_idx < n_partitions) { - // We successfully assigned a Finalize task - lstate.task = RadixHTSourceTaskType::FINALIZE; - return true; + partition.blocked_tasks.push_back(interrupt_state); + return SourceResultType::BLOCKED; + case AggregatePartitionState::READY_TO_SCAN: + lstate.task = RadixHTSourceTaskType::SCAN; + lstate.scan_status = RadixHTScanStatus::INIT; + return SourceResultType::HAVE_MORE_OUTPUT; + default: + throw InternalException("Unexpected AggregatePartitionState in RadixHTLocalSourceState::Finalize!"); } - - // We didn't manage to assign a Finalize task because there are none left - return false; } RadixHTLocalSourceState::RadixHTLocalSourceState(ExecutionContext &context, const RadixPartitionedHashTable &radix_ht) @@ -699,6 +693,7 @@ RadixHTLocalSourceState::RadixHTLocalSourceState(ExecutionContext &context, cons void RadixHTLocalSourceState::ExecuteTask(RadixHTGlobalSinkState &sink, RadixHTGlobalSourceState &gstate, DataChunk &chunk) { + D_ASSERT(task != RadixHTSourceTaskType::NO_TASK); switch (task) { case RadixHTSourceTaskType::FINALIZE: Finalize(sink, gstate); @@ -714,12 +709,7 @@ void RadixHTLocalSourceState::ExecuteTask(RadixHTGlobalSinkState &sink, RadixHTG void RadixHTLocalSourceState::Finalize(RadixHTGlobalSinkState &sink, RadixHTGlobalSourceState &gstate) { D_ASSERT(task == RadixHTSourceTaskType::FINALIZE); D_ASSERT(scan_status != RadixHTScanStatus::IN_PROGRESS); - auto &partition = *sink.partitions[task_idx]; - if (partition.data->Count() == 0) { - partition.finalized = true; - return; - } if (!ht) { // This capacity would always be sufficient for all data @@ -730,7 +720,7 @@ void RadixHTLocalSourceState::Finalize(RadixHTGlobalSinkState &sink, RadixHTGlob const idx_t memory_limit = BufferManager::GetBufferManager(gstate.context).GetMaxMemory(); const idx_t thread_limit = 0.6 * memory_limit / n_threads; - const idx_t size_per_entry = partition.data->SizeInBytes() / partition.data->Count() + + const idx_t size_per_entry = partition.data->SizeInBytes() / MaxValue(partition.data->Count(), 1) + idx_t(GroupedAggregateHashTable::LOAD_FACTOR * sizeof(aggr_ht_entry_t)); const auto capacity_limit = NextPowerOfTwo(thread_limit / size_per_entry); @@ -745,32 +735,34 @@ void RadixHTLocalSourceState::Finalize(RadixHTGlobalSinkState &sink, RadixHTGlob // Now combine the uncombined data using this thread's HT ht->Combine(*partition.data, &partition.progress); ht->UnpinData(); + partition.progress = 1; // Move the combined data back to the partition partition.data = make_uniq(BufferManager::GetBufferManager(gstate.context), sink.radix_ht.GetLayout()); partition.data->Combine(*ht->GetPartitionedData()->GetPartitions()[0]); - // Mark partition as ready to scan - lock_guard glock(gstate.lock); - partition.finalized = true; - - if (++sink.finalize_done == sink.partitions.size()) { + // Update thread-global state + lock_guard global_guard(gstate.lock); + sink.stored_allocators.emplace_back(ht->GetAggregateAllocator()); + const auto finalizes_done = ++sink.finalize_done; + D_ASSERT(finalizes_done <= sink.partitions.size()); + if (finalizes_done == sink.partitions.size()) { // All finalizes are done, set remaining size to 0 sink.temporary_memory_state->SetRemainingSize(sink.context, 0); } - // Unblock blocked tasks so they can scan this partition - lock_guard sink_guard(sink.lock); - if (!sink.blocked_tasks.empty()) { - for (auto &state : sink.blocked_tasks) { - state.Callback(); - } - sink.blocked_tasks.clear(); + // Update partition state + lock_guard partition_guard(partition.lock); + partition.state = AggregatePartitionState::READY_TO_SCAN; + for (auto &blocked_task : partition.blocked_tasks) { + blocked_task.Callback(); } + partition.blocked_tasks.clear(); - // Make sure this thread's aggregate allocator does not get lost - sink.stored_allocators.emplace_back(ht->GetAggregateAllocator()); + // This thread will scan the partition + task = RadixHTSourceTaskType::SCAN; + scan_status = RadixHTScanStatus::INIT; } void RadixHTLocalSourceState::Scan(RadixHTGlobalSinkState &sink, RadixHTGlobalSourceState &gstate, DataChunk &chunk) { @@ -778,36 +770,24 @@ void RadixHTLocalSourceState::Scan(RadixHTGlobalSinkState &sink, RadixHTGlobalSo D_ASSERT(scan_status != RadixHTScanStatus::DONE); auto &partition = *sink.partitions[task_idx]; - D_ASSERT(partition.finalized); + D_ASSERT(partition.state == AggregatePartitionState::READY_TO_SCAN); auto &data_collection = *partition.data; - if (data_collection.Count() == 0) { - scan_status = RadixHTScanStatus::DONE; - lock_guard gstate_guard(gstate.lock); - if (++gstate.scan_done == sink.partitions.size()) { - gstate.finished = true; - } - return; - } - if (scan_status == RadixHTScanStatus::INIT) { data_collection.InitializeScan(scan_state, gstate.column_ids, sink.scan_pin_properties); scan_status = RadixHTScanStatus::IN_PROGRESS; } if (!data_collection.Scan(scan_state, scan_chunk)) { - scan_status = RadixHTScanStatus::DONE; if (sink.scan_pin_properties == TupleDataPinProperties::DESTROY_AFTER_DONE) { data_collection.Reset(); } - return; - } - - if (data_collection.ScanComplete(scan_state)) { + scan_status = RadixHTScanStatus::DONE; lock_guard gstate_guard(gstate.lock); - if (++gstate.scan_done == sink.partitions.size()) { + if (++gstate.task_done == sink.partitions.size()) { gstate.finished = true; } + return; } RowOperationsState row_state(aggregate_allocator); @@ -902,15 +882,10 @@ SourceResultType RadixPartitionedHashTable::GetData(ExecutionContext &context, D while (!gstate.finished && chunk.size() == 0) { if (lstate.TaskFinished()) { - lock_guard gstate_guard(gstate.lock); - if (!gstate.AssignTask(sink, lstate)) { - if (gstate.scan_idx < sink.partitions.size()) { - lock_guard sink_guard(sink.lock); - sink.blocked_tasks.push_back(input.interrupt_state); - return SourceResultType::BLOCKED; - } else { - return SourceResultType::FINISHED; - } + const auto res = gstate.AssignTask(sink, lstate, input.interrupt_state); + if (res != SourceResultType::HAVE_MORE_OUTPUT) { + D_ASSERT(res == SourceResultType::FINISHED || res == SourceResultType::BLOCKED); + return res; } } lstate.ExecuteTask(sink, gstate, chunk); @@ -931,11 +906,11 @@ double RadixPartitionedHashTable::GetProgress(ClientContext &, GlobalSinkState & // Get partition combine progress, weigh it 2x double total_progress = 0; for (auto &partition : sink.partitions) { - total_progress += partition->progress * 2.0; + total_progress += 2.0 * partition->progress; } // Get scan progress, weigh it 1x - total_progress += gstate.scan_done; + total_progress += 1.0 * gstate.task_done; // Divide by 3x for the weights, and the number of partitions to get a value between 0 and 1 again total_progress /= 3.0 * sink.partitions.size(); diff --git a/src/duckdb/src/execution/reservoir_sample.cpp b/src/duckdb/src/execution/reservoir_sample.cpp index 8344a730..0aba8bf7 100644 --- a/src/duckdb/src/execution/reservoir_sample.cpp +++ b/src/duckdb/src/execution/reservoir_sample.cpp @@ -305,7 +305,7 @@ void BaseReservoirSampling::ReplaceElement(double with_weight) { r2 = with_weight; } //! now we insert the new weight into the reservoir - reservoir_weights.push(std::make_pair(-r2, min_weighted_entry_index)); + reservoir_weights.emplace(-r2, min_weighted_entry_index); //! we update the min entry with the new min entry in the reservoir SetNextEntry(); } diff --git a/src/duckdb/src/execution/window_executor.cpp b/src/duckdb/src/execution/window_executor.cpp index 7fe58109..627e8df6 100644 --- a/src/duckdb/src/execution/window_executor.cpp +++ b/src/duckdb/src/execution/window_executor.cpp @@ -199,17 +199,34 @@ struct OperationCompare : public std::function { template static idx_t FindTypedRangeBound(const WindowInputColumn &over, const idx_t order_begin, const idx_t order_end, - WindowInputExpression &boundary, const idx_t chunk_idx, const FrameBounds &prev) { + const WindowBoundary range, WindowInputExpression &boundary, const idx_t chunk_idx, + const FrameBounds &prev) { D_ASSERT(!boundary.CellIsNull(chunk_idx)); const auto val = boundary.GetCell(chunk_idx); OperationCompare comp; - WindowColumnIterator begin(over, order_begin); - WindowColumnIterator end(over, order_end); + + // Check that the value we are searching for is in range. + if (range == WindowBoundary::EXPR_PRECEDING_RANGE) { + // Preceding but value past the end + const auto cur_val = over.GetCell(order_end); + if (comp(cur_val, val)) { + throw OutOfRangeException("Invalid RANGE PRECEDING value"); + } + } else { + // Following but value before beginning + D_ASSERT(range == WindowBoundary::EXPR_FOLLOWING_RANGE); + const auto cur_val = over.GetCell(order_begin); + if (comp(val, cur_val)) { + throw OutOfRangeException("Invalid RANGE FOLLOWING value"); + } + } // Try to reuse the previous bounds to restrict the search. // This is only valid if the previous bounds were non-empty // Only inject the comparisons if the previous bounds are a strict subset. + WindowColumnIterator begin(over, order_begin); + WindowColumnIterator end(over, order_end); if (prev.start < prev.end) { if (order_begin < prev.start && prev.start < order_end) { const auto first = over.GetCell(prev.start); @@ -237,37 +254,40 @@ static idx_t FindTypedRangeBound(const WindowInputColumn &over, const idx_t orde template static idx_t FindRangeBound(const WindowInputColumn &over, const idx_t order_begin, const idx_t order_end, - WindowInputExpression &boundary, const idx_t chunk_idx, const FrameBounds &prev) { + const WindowBoundary range, WindowInputExpression &boundary, const idx_t chunk_idx, + const FrameBounds &prev) { D_ASSERT(boundary.chunk.ColumnCount() == 1); D_ASSERT(boundary.chunk.data[0].GetType().InternalType() == over.input_expr.ptype); switch (over.input_expr.ptype) { case PhysicalType::INT8: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::INT16: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::INT32: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::INT64: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::UINT8: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::UINT16: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::UINT32: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::UINT64: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::INT128: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::UINT128: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, + prev); case PhysicalType::FLOAT: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::DOUBLE: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case PhysicalType::INTERVAL: - return FindTypedRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindTypedRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, + prev); default: throw InternalException("Unsupported column type for RANGE"); } @@ -275,13 +295,13 @@ static idx_t FindRangeBound(const WindowInputColumn &over, const idx_t order_beg template static idx_t FindOrderedRangeBound(const WindowInputColumn &over, const OrderType range_sense, const idx_t order_begin, - const idx_t order_end, WindowInputExpression &boundary, const idx_t chunk_idx, - const FrameBounds &prev) { + const idx_t order_end, const WindowBoundary range, WindowInputExpression &boundary, + const idx_t chunk_idx, const FrameBounds &prev) { switch (range_sense) { case OrderType::ASCENDING: - return FindRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); case OrderType::DESCENDING: - return FindRangeBound(over, order_begin, order_end, boundary, chunk_idx, prev); + return FindRangeBound(over, order_begin, order_end, range, boundary, chunk_idx, prev); default: throw InternalException("Unsupported ORDER BY sense for RANGE"); } @@ -458,7 +478,7 @@ void WindowBoundariesState::Update(const idx_t row_idx, const WindowInputColumn window_start = peer_start; } else { prev.start = FindOrderedRangeBound(range_collection, range_sense, valid_start, row_idx, - boundary_start, chunk_idx, prev); + start_boundary, boundary_start, chunk_idx, prev); window_start = prev.start; } break; @@ -467,8 +487,8 @@ void WindowBoundariesState::Update(const idx_t row_idx, const WindowInputColumn if (boundary_start.CellIsNull(chunk_idx)) { window_start = peer_start; } else { - prev.start = FindOrderedRangeBound(range_collection, range_sense, row_idx, valid_end, boundary_start, - chunk_idx, prev); + prev.start = FindOrderedRangeBound(range_collection, range_sense, row_idx, valid_end, start_boundary, + boundary_start, chunk_idx, prev); window_start = prev.start; } break; @@ -502,8 +522,8 @@ void WindowBoundariesState::Update(const idx_t row_idx, const WindowInputColumn if (boundary_end.CellIsNull(chunk_idx)) { window_end = peer_end; } else { - prev.end = FindOrderedRangeBound(range_collection, range_sense, valid_start, row_idx, boundary_end, - chunk_idx, prev); + prev.end = FindOrderedRangeBound(range_collection, range_sense, valid_start, row_idx, end_boundary, + boundary_end, chunk_idx, prev); window_end = prev.end; } break; @@ -512,8 +532,8 @@ void WindowBoundariesState::Update(const idx_t row_idx, const WindowInputColumn if (boundary_end.CellIsNull(chunk_idx)) { window_end = peer_end; } else { - prev.end = FindOrderedRangeBound(range_collection, range_sense, row_idx, valid_end, boundary_end, - chunk_idx, prev); + prev.end = FindOrderedRangeBound(range_collection, range_sense, row_idx, valid_end, end_boundary, + boundary_end, chunk_idx, prev); window_end = prev.end; } break; diff --git a/src/duckdb/src/execution/window_segment_tree.cpp b/src/duckdb/src/execution/window_segment_tree.cpp index e41ffae5..5ea8429a 100644 --- a/src/duckdb/src/execution/window_segment_tree.cpp +++ b/src/duckdb/src/execution/window_segment_tree.cpp @@ -18,9 +18,9 @@ namespace duckdb { WindowAggregatorState::WindowAggregatorState() : allocator(Allocator::DefaultAllocator()) { } -WindowAggregator::WindowAggregator(AggregateObject aggr, const LogicalType &result_type_p, +WindowAggregator::WindowAggregator(AggregateObject aggr_p, const LogicalType &result_type_p, const WindowExcludeMode exclude_mode_p, idx_t partition_count_p) - : aggr(std::move(aggr)), result_type(result_type_p), partition_count(partition_count_p), + : aggr(std::move(aggr_p)), result_type(result_type_p), partition_count(partition_count_p), state_size(aggr.function.state_size()), filter_pos(0), exclude_mode(exclude_mode_p) { } @@ -470,7 +470,7 @@ WindowNaiveState::WindowNaiveState(const WindowNaiveAggregator &gstate) row_set(STANDARD_VECTOR_SIZE, hash_row, equal_row) { InitSubFrames(frames, gstate.exclude_mode); - auto &inputs = const_cast(gstate.GetInputs()); + auto &inputs = gstate.GetInputs(); if (inputs.ColumnCount() > 0) { leaves.Initialize(Allocator::DefaultAllocator(), inputs.GetTypes()); } @@ -494,9 +494,8 @@ void WindowNaiveState::FlushStates() { return; } - auto &inputs = const_cast(gstate.GetInputs()); - leaves.Reference(inputs); - leaves.Slice(update_sel, flush_count); + auto &inputs = gstate.GetInputs(); + leaves.Slice(inputs, update_sel, flush_count); auto &aggr = gstate.aggr; AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator); @@ -506,19 +505,18 @@ void WindowNaiveState::FlushStates() { } size_t WindowNaiveState::Hash(idx_t rid) { - auto &inputs = const_cast(gstate.GetInputs()); - leaves.Reference(inputs); + auto &inputs = gstate.GetInputs(); auto s = UnsafeNumericCast(rid); SelectionVector sel(&s); - leaves.Slice(sel, 1); + leaves.Slice(inputs, sel, 1); leaves.Hash(hashes); return *FlatVector::GetData(hashes); } bool WindowNaiveState::KeyEqual(const idx_t &lhs, const idx_t &rhs) { - auto &inputs = const_cast(gstate.GetInputs()); + auto &inputs = gstate.GetInputs(); auto l = UnsafeNumericCast(lhs); SelectionVector lsel(&l); @@ -644,7 +642,7 @@ class WindowSegmentTreePart { enum FramePart : uint8_t { FULL = 0, LEFT = 1, RIGHT = 2 }; - WindowSegmentTreePart(ArenaAllocator &allocator, const AggregateObject &aggr, DataChunk &inputs, + WindowSegmentTreePart(ArenaAllocator &allocator, const AggregateObject &aggr, const DataChunk &inputs, const ValidityMask &filter_mask); ~WindowSegmentTreePart(); @@ -681,7 +679,7 @@ class WindowSegmentTreePart { //! Order insensitive aggregate (we can optimise internal combines) const bool order_insensitive; //! The partition arguments - DataChunk &inputs; + const DataChunk &inputs; //! The filtered rows in inputs const ValidityMask &filter_mask; //! The size of a single aggregate state @@ -706,14 +704,14 @@ class WindowSegmentTreePart { class WindowSegmentTreeState : public WindowAggregatorState { public: - WindowSegmentTreeState(const AggregateObject &aggr, DataChunk &inputs, const ValidityMask &filter_mask) + WindowSegmentTreeState(const AggregateObject &aggr, const DataChunk &inputs, const ValidityMask &filter_mask) : aggr(aggr), inputs(inputs), filter_mask(filter_mask), part(allocator, aggr, inputs, filter_mask) { } //! The aggregate function const AggregateObject &aggr; //! The aggregate function - DataChunk &inputs; + const DataChunk &inputs; //! The filtered rows in inputs const ValidityMask &filter_mask; //! The left (default) segment tree part @@ -722,8 +720,8 @@ class WindowSegmentTreeState : public WindowAggregatorState { unique_ptr right_part; }; -WindowSegmentTreePart::WindowSegmentTreePart(ArenaAllocator &allocator, const AggregateObject &aggr, DataChunk &inputs, - const ValidityMask &filter_mask) +WindowSegmentTreePart::WindowSegmentTreePart(ArenaAllocator &allocator, const AggregateObject &aggr, + const DataChunk &inputs, const ValidityMask &filter_mask) : allocator(allocator), aggr(aggr), order_insensitive(aggr.function.order_dependent == AggregateOrderDependent::NOT_ORDER_DEPENDENT), inputs(inputs), filter_mask(filter_mask), state_size(aggr.function.state_size()), state(state_size * STANDARD_VECTOR_SIZE), @@ -749,7 +747,7 @@ WindowSegmentTreePart::~WindowSegmentTreePart() { } unique_ptr WindowSegmentTree::GetLocalState() const { - return make_uniq(aggr, const_cast(inputs), filter_mask); + return make_uniq(aggr, inputs, filter_mask); } void WindowSegmentTreePart::FlushStates(bool combining) { @@ -762,8 +760,7 @@ void WindowSegmentTreePart::FlushStates(bool combining) { statel.Verify(flush_count); aggr.function.combine(statel, statep, aggr_input_data, flush_count); } else { - leaves.Reference(inputs); - leaves.Slice(filter_sel, flush_count); + leaves.Slice(inputs, filter_sel, flush_count); aggr.function.update(&leaves.data[0], aggr_input_data, leaves.ColumnCount(), statep, flush_count); } @@ -1382,7 +1379,7 @@ WindowDistinctAggregator::DistinctSortTree::DistinctSortTree(ZippedElements &&pr class WindowDistinctState : public WindowAggregatorState { public: - WindowDistinctState(const AggregateObject &aggr, DataChunk &inputs, const WindowDistinctAggregator &tree); + WindowDistinctState(const AggregateObject &aggr, const DataChunk &inputs, const WindowDistinctAggregator &tree); void Evaluate(const DataChunk &bounds, Vector &result, idx_t count, idx_t row_idx); @@ -1393,7 +1390,7 @@ class WindowDistinctState : public WindowAggregatorState { //! The aggregate function const AggregateObject &aggr; //! The aggregate function - DataChunk &inputs; + const DataChunk &inputs; //! The merge sort tree data const WindowDistinctAggregator &tree; //! The size of a single aggregate state @@ -1412,7 +1409,7 @@ class WindowDistinctState : public WindowAggregatorState { SubFrames frames; }; -WindowDistinctState::WindowDistinctState(const AggregateObject &aggr, DataChunk &inputs, +WindowDistinctState::WindowDistinctState(const AggregateObject &aggr, const DataChunk &inputs, const WindowDistinctAggregator &tree) : aggr(aggr), inputs(inputs), tree(tree), state_size(aggr.function.state_size()), state((state_size * STANDARD_VECTOR_SIZE)), statef(LogicalType::POINTER), statep(LogicalType::POINTER), @@ -1488,7 +1485,7 @@ void WindowDistinctState::Evaluate(const DataChunk &bounds, Vector &result, idx_ } unique_ptr WindowDistinctAggregator::GetLocalState() const { - return make_uniq(aggr, const_cast(inputs), *this); + return make_uniq(aggr, inputs, *this); } void WindowDistinctAggregator::Evaluate(WindowAggregatorState &lstate, const DataChunk &bounds, Vector &result, diff --git a/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp b/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp index 9011b4cf..78964dca 100644 --- a/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +++ b/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp @@ -538,7 +538,7 @@ struct SortedAggregateFunction { template static void Combine(const STATE &source, STATE &target, AggregateInputData &aggr_input_data) { auto &order_bind = aggr_input_data.bind_data->Cast(); - auto &other = const_cast(source); + auto &other = const_cast(source); // NOLINT: absorb explicitly allows destruction target.Absorb(order_bind, other); } diff --git a/src/duckdb/src/function/cast/enum_casts.cpp b/src/duckdb/src/function/cast/enum_casts.cpp index fdc0c636..7e22cb93 100644 --- a/src/duckdb/src/function/cast/enum_casts.cpp +++ b/src/duckdb/src/function/cast/enum_casts.cpp @@ -7,43 +7,26 @@ namespace duckdb { template bool EnumEnumCast(Vector &source, Vector &result, idx_t count, CastParameters ¶meters) { - result.SetVectorType(VectorType::FLAT_VECTOR); - - auto &str_vec = EnumType::GetValuesInsertOrder(source.GetType()); - auto str_vec_ptr = FlatVector::GetData(str_vec); - + auto &enum_dictionary = EnumType::GetValuesInsertOrder(source.GetType()); + auto dictionary_data = FlatVector::GetData(enum_dictionary); auto res_enum_type = result.GetType(); - UnifiedVectorFormat vdata; - source.ToUnifiedFormat(count, vdata); - - auto source_data = UnifiedVectorFormat::GetData(vdata); - auto source_sel = vdata.sel; - auto source_mask = vdata.validity; - - auto result_data = FlatVector::GetData(result); - auto &result_mask = FlatVector::Validity(result); - VectorTryCastData vector_cast_data(result, parameters); - for (idx_t i = 0; i < count; i++) { - auto src_idx = source_sel->get_index(i); - if (!source_mask.RowIsValid(src_idx)) { - result_mask.SetInvalid(i); - continue; - } - auto key = EnumType::GetPos(res_enum_type, str_vec_ptr[source_data[src_idx]]); - if (key == -1) { - // key doesn't exist on result enum - if (!parameters.error_message) { - result_data[i] = HandleVectorCastError::Operation( - CastExceptionText(source_data[src_idx]), result_mask, i, vector_cast_data); - } else { - result_mask.SetInvalid(i); - } - continue; - } - result_data[i] = UnsafeNumericCast(key); - } + UnaryExecutor::ExecuteWithNulls( + source, result, count, [&](SRC_TYPE value, ValidityMask &mask, idx_t row_idx) { + auto key = EnumType::GetPos(res_enum_type, dictionary_data[value]); + if (key == -1) { + if (!parameters.error_message) { + return HandleVectorCastError::Operation(CastExceptionText(value), + mask, row_idx, vector_cast_data); + } else { + mask.SetInvalid(row_idx); + } + return RES_TYPE(); + } else { + return UnsafeNumericCast(key); + } + }); return vector_cast_data.all_converted; } @@ -65,27 +48,9 @@ template static bool EnumToVarcharCast(Vector &source, Vector &result, idx_t count, CastParameters ¶meters) { auto &enum_dictionary = EnumType::GetValuesInsertOrder(source.GetType()); auto dictionary_data = FlatVector::GetData(enum_dictionary); - auto result_data = FlatVector::GetData(result); - auto &result_mask = FlatVector::Validity(result); - - UnifiedVectorFormat vdata; - source.ToUnifiedFormat(count, vdata); - - auto source_data = UnifiedVectorFormat::GetData(vdata); - for (idx_t i = 0; i < count; i++) { - auto source_idx = vdata.sel->get_index(i); - if (!vdata.validity.RowIsValid(source_idx)) { - result_mask.SetInvalid(i); - continue; - } - auto enum_idx = source_data[source_idx]; - result_data[i] = dictionary_data[enum_idx]; - } - if (source.GetVectorType() == VectorType::CONSTANT_VECTOR) { - result.SetVectorType(VectorType::CONSTANT_VECTOR); - } else { - result.SetVectorType(VectorType::FLAT_VECTOR); - } + + UnaryExecutor::Execute(source, result, count, + [&](SRC enum_idx) { return dictionary_data[enum_idx]; }); return true; } diff --git a/src/duckdb/src/function/cast/vector_cast_helpers.cpp b/src/duckdb/src/function/cast/vector_cast_helpers.cpp index 34b0e34d..a064b4ac 100644 --- a/src/duckdb/src/function/cast/vector_cast_helpers.cpp +++ b/src/duckdb/src/function/cast/vector_cast_helpers.cpp @@ -39,25 +39,26 @@ static bool SkipToCloseQuotes(idx_t &pos, const char *buf, idx_t &len) { static bool SkipToClose(idx_t &idx, const char *buf, idx_t &len, idx_t &lvl, char close_bracket) { idx++; + vector brackets; + brackets.push_back(close_bracket); while (idx < len) { if (buf[idx] == '"' || buf[idx] == '\'') { if (!SkipToCloseQuotes(idx, buf, len)) { return false; } } else if (buf[idx] == '{') { - if (!SkipToClose(idx, buf, len, lvl, '}')) { - return false; - } + brackets.push_back('}'); } else if (buf[idx] == '[') { - if (!SkipToClose(idx, buf, len, lvl, ']')) { - return false; - } + brackets.push_back(']'); lvl++; - } else if (buf[idx] == close_bracket) { - if (close_bracket == ']') { + } else if (buf[idx] == brackets.back()) { + if (buf[idx] == ']') { lvl--; } - return true; + brackets.pop_back(); + if (brackets.empty()) { + return true; + } } idx++; } diff --git a/src/duckdb/src/function/cast_rules.cpp b/src/duckdb/src/function/cast_rules.cpp index 028d6d0d..98ca78b8 100644 --- a/src/duckdb/src/function/cast_rules.cpp +++ b/src/duckdb/src/function/cast_rules.cpp @@ -24,6 +24,8 @@ static int64_t TargetTypeCost(const LogicalType &type) { return 121; case LogicalTypeId::TIMESTAMP_SEC: return 122; + case LogicalTypeId::TIMESTAMP_TZ: + return 123; case LogicalTypeId::VARCHAR: return 149; case LogicalTypeId::STRUCT: @@ -259,6 +261,8 @@ static int64_t ImplicitCastTimestamp(const LogicalType &to) { switch (to.id()) { case LogicalTypeId::TIMESTAMP_NS: return TargetTypeCost(to); + case LogicalTypeId::TIMESTAMP_TZ: + return TargetTypeCost(to); default: return -1; } @@ -382,8 +386,12 @@ int64_t CastRules::ImplicitCast(const LogicalType &from, const LogicalType &to) } if (from.id() == LogicalTypeId::ARRAY && to.id() == LogicalTypeId::LIST) { // Arrays can be cast to lists for the cost of casting the child type + auto child_cost = ImplicitCast(ArrayType::GetChildType(from), ListType::GetChildType(to)); + if (child_cost < 0) { + return -1; + } // add 1 because we prefer ARRAY->ARRAY casts over ARRAY->LIST casts - return ImplicitCast(ArrayType::GetChildType(from), ListType::GetChildType(to)) + 1; + return child_cost + 1; } if (from.id() == LogicalTypeId::LIST && (to.id() == LogicalTypeId::ARRAY && !ArrayType::IsAnySize(to))) { // Lists can be cast to arrays for the cost of casting the child type, if the target size is known diff --git a/src/duckdb/src/function/compression_config.cpp b/src/duckdb/src/function/compression_config.cpp index 177a2d86..62ba1ce6 100644 --- a/src/duckdb/src/function/compression_config.cpp +++ b/src/duckdb/src/function/compression_config.cpp @@ -14,7 +14,7 @@ struct DefaultCompressionMethod { compression_supports_type_t supports_type; }; -static DefaultCompressionMethod internal_compression_methods[] = { +static const DefaultCompressionMethod internal_compression_methods[] = { {CompressionType::COMPRESSION_CONSTANT, ConstantFun::GetFunction, ConstantFun::TypeIsSupported}, {CompressionType::COMPRESSION_UNCOMPRESSED, UncompressedFun::GetFunction, UncompressedFun::TypeIsSupported}, {CompressionType::COMPRESSION_RLE, RLEFun::GetFunction, RLEFun::TypeIsSupported}, diff --git a/src/duckdb/src/function/function_binder.cpp b/src/duckdb/src/function/function_binder.cpp index e6109d72..267f589d 100644 --- a/src/duckdb/src/function/function_binder.cpp +++ b/src/duckdb/src/function/function_binder.cpp @@ -18,12 +18,12 @@ namespace duckdb { FunctionBinder::FunctionBinder(ClientContext &context) : context(context) { } -int64_t FunctionBinder::BindVarArgsFunctionCost(const SimpleFunction &func, const vector &arguments) { +optional_idx FunctionBinder::BindVarArgsFunctionCost(const SimpleFunction &func, const vector &arguments) { if (arguments.size() < func.arguments.size()) { // not enough arguments to fulfill the non-vararg part of the function - return -1; + return optional_idx(); } - int64_t cost = 0; + idx_t cost = 0; for (idx_t i = 0; i < arguments.size(); i++) { LogicalType arg_type = i < func.arguments.size() ? func.arguments[i] : func.varargs; if (arguments[i] == arg_type) { @@ -33,25 +33,25 @@ int64_t FunctionBinder::BindVarArgsFunctionCost(const SimpleFunction &func, cons int64_t cast_cost = CastFunctionSet::Get(context).ImplicitCastCost(arguments[i], arg_type); if (cast_cost >= 0) { // we can implicitly cast, add the cost to the total cost - cost += cast_cost; + cost += idx_t(cast_cost); } else { // we can't implicitly cast: throw an error - return -1; + return optional_idx(); } } return cost; } -int64_t FunctionBinder::BindFunctionCost(const SimpleFunction &func, const vector &arguments) { +optional_idx FunctionBinder::BindFunctionCost(const SimpleFunction &func, const vector &arguments) { if (func.HasVarArgs()) { // special case varargs function return BindVarArgsFunctionCost(func, arguments); } if (func.arguments.size() != arguments.size()) { // invalid argument count: check the next function - return -1; + return optional_idx(); } - int64_t cost = 0; + idx_t cost = 0; bool has_parameter = false; for (idx_t i = 0; i < arguments.size(); i++) { if (arguments[i].id() == LogicalTypeId::UNKNOWN) { @@ -61,10 +61,10 @@ int64_t FunctionBinder::BindFunctionCost(const SimpleFunction &func, const vecto int64_t cast_cost = CastFunctionSet::Get(context).ImplicitCastCost(arguments[i], func.arguments[i]); if (cast_cost >= 0) { // we can implicitly cast, add the cost to the total cost - cost += cast_cost; + cost += idx_t(cast_cost); } else { // we can't implicitly cast: throw an error - return -1; + return optional_idx(); } } if (has_parameter) { @@ -77,17 +77,18 @@ int64_t FunctionBinder::BindFunctionCost(const SimpleFunction &func, const vecto template vector FunctionBinder::BindFunctionsFromArguments(const string &name, FunctionSet &functions, const vector &arguments, ErrorData &error) { - idx_t best_function = DConstants::INVALID_INDEX; - int64_t lowest_cost = NumericLimits::Maximum(); + optional_idx best_function; + idx_t lowest_cost = NumericLimits::Maximum(); vector candidate_functions; for (idx_t f_idx = 0; f_idx < functions.functions.size(); f_idx++) { auto &func = functions.functions[f_idx]; // check the arguments of the function - int64_t cost = BindFunctionCost(func, arguments); - if (cost < 0) { + auto bind_cost = BindFunctionCost(func, arguments); + if (!bind_cost.IsValid()) { // auto casting was not possible continue; } + auto cost = bind_cost.GetIndex(); if (cost == lowest_cost) { candidate_functions.push_back(f_idx); continue; @@ -99,7 +100,7 @@ vector FunctionBinder::BindFunctionsFromArguments(const string &name, Fun lowest_cost = cost; best_function = f_idx; } - if (best_function == DConstants::INVALID_INDEX) { + if (!best_function.IsValid()) { // no matching function was found, throw an error vector candidates; for (auto &f : functions.functions) { @@ -108,14 +109,14 @@ vector FunctionBinder::BindFunctionsFromArguments(const string &name, Fun error = ErrorData(BinderException::NoMatchingFunction(name, arguments, candidates)); return candidate_functions; } - candidate_functions.push_back(best_function); + candidate_functions.push_back(best_function.GetIndex()); return candidate_functions; } template -idx_t FunctionBinder::MultipleCandidateException(const string &name, FunctionSet &functions, - vector &candidate_functions, - const vector &arguments, ErrorData &error) { +optional_idx FunctionBinder::MultipleCandidateException(const string &name, FunctionSet &functions, + vector &candidate_functions, + const vector &arguments, ErrorData &error) { D_ASSERT(functions.functions.size() > 1); // there are multiple possible function definitions // throw an exception explaining which overloads are there @@ -130,16 +131,16 @@ idx_t FunctionBinder::MultipleCandidateException(const string &name, FunctionSet StringUtil::Format("Could not choose a best candidate function for the function call \"%s\". In order to " "select one, please add explicit type casts.\n\tCandidate functions:\n%s", call_str, candidate_str)); - return DConstants::INVALID_INDEX; + return optional_idx(); } template -idx_t FunctionBinder::BindFunctionFromArguments(const string &name, FunctionSet &functions, - const vector &arguments, ErrorData &error) { +optional_idx FunctionBinder::BindFunctionFromArguments(const string &name, FunctionSet &functions, + const vector &arguments, ErrorData &error) { auto candidate_functions = BindFunctionsFromArguments(name, functions, arguments, error); if (candidate_functions.empty()) { // no candidates - return DConstants::INVALID_INDEX; + return optional_idx(); } if (candidate_functions.size() > 1) { // multiple candidates, check if there are any unknown arguments @@ -157,32 +158,32 @@ idx_t FunctionBinder::BindFunctionFromArguments(const string &name, FunctionSet< return candidate_functions[0]; } -idx_t FunctionBinder::BindFunction(const string &name, ScalarFunctionSet &functions, - const vector &arguments, ErrorData &error) { +optional_idx FunctionBinder::BindFunction(const string &name, ScalarFunctionSet &functions, + const vector &arguments, ErrorData &error) { return BindFunctionFromArguments(name, functions, arguments, error); } -idx_t FunctionBinder::BindFunction(const string &name, AggregateFunctionSet &functions, - const vector &arguments, ErrorData &error) { +optional_idx FunctionBinder::BindFunction(const string &name, AggregateFunctionSet &functions, + const vector &arguments, ErrorData &error) { return BindFunctionFromArguments(name, functions, arguments, error); } -idx_t FunctionBinder::BindFunction(const string &name, TableFunctionSet &functions, - const vector &arguments, ErrorData &error) { +optional_idx FunctionBinder::BindFunction(const string &name, TableFunctionSet &functions, + const vector &arguments, ErrorData &error) { return BindFunctionFromArguments(name, functions, arguments, error); } -idx_t FunctionBinder::BindFunction(const string &name, PragmaFunctionSet &functions, vector ¶meters, - ErrorData &error) { +optional_idx FunctionBinder::BindFunction(const string &name, PragmaFunctionSet &functions, vector ¶meters, + ErrorData &error) { vector types; for (auto &value : parameters) { types.push_back(value.type()); } - idx_t entry = BindFunctionFromArguments(name, functions, types, error); - if (entry == DConstants::INVALID_INDEX) { + auto entry = BindFunctionFromArguments(name, functions, types, error); + if (!entry.IsValid()) { error.Throw(); } - auto candidate_function = functions.GetFunctionByOffset(entry); + auto candidate_function = functions.GetFunctionByOffset(entry.GetIndex()); // cast the input parameters for (idx_t i = 0; i < parameters.size(); i++) { auto target_type = @@ -201,25 +202,25 @@ vector FunctionBinder::GetLogicalTypesFromExpressions(vector> &arguments, ErrorData &error) { +optional_idx FunctionBinder::BindFunction(const string &name, ScalarFunctionSet &functions, + vector> &arguments, ErrorData &error) { auto types = GetLogicalTypesFromExpressions(arguments); return BindFunction(name, functions, types, error); } -idx_t FunctionBinder::BindFunction(const string &name, AggregateFunctionSet &functions, - vector> &arguments, ErrorData &error) { +optional_idx FunctionBinder::BindFunction(const string &name, AggregateFunctionSet &functions, + vector> &arguments, ErrorData &error) { auto types = GetLogicalTypesFromExpressions(arguments); return BindFunction(name, functions, types, error); } -idx_t FunctionBinder::BindFunction(const string &name, TableFunctionSet &functions, - vector> &arguments, ErrorData &error) { +optional_idx FunctionBinder::BindFunction(const string &name, TableFunctionSet &functions, + vector> &arguments, ErrorData &error) { auto types = GetLogicalTypesFromExpressions(arguments); return BindFunction(name, functions, types, error); } -enum class LogicalTypeComparisonResult { IDENTICAL_TYPE, TARGET_IS_ANY, DIFFERENT_TYPES }; +enum class LogicalTypeComparisonResult : uint8_t { IDENTICAL_TYPE, TARGET_IS_ANY, DIFFERENT_TYPES }; LogicalTypeComparisonResult RequiresCast(const LogicalType &source_type, const LogicalType &target_type) { if (target_type.id() == LogicalTypeId::ANY) { @@ -291,13 +292,13 @@ unique_ptr FunctionBinder::BindScalarFunction(ScalarFunctionCatalogE vector> children, ErrorData &error, bool is_operator, Binder *binder) { // bind the function - idx_t best_function = BindFunction(func.name, func.functions, children, error); - if (best_function == DConstants::INVALID_INDEX) { + auto best_function = BindFunction(func.name, func.functions, children, error); + if (!best_function.IsValid()) { return nullptr; } // found a matching function! - auto bound_function = func.functions.GetFunctionByOffset(best_function); + auto bound_function = func.functions.GetFunctionByOffset(best_function.GetIndex()); // If any of the parameters are NULL, the function will just be replaced with a NULL constant // But this NULL constant needs to have to correct type, because we use LogicalType::SQLNULL for binding macro's diff --git a/src/duckdb/src/function/function_set.cpp b/src/duckdb/src/function/function_set.cpp index fd4cf3e7..cf48c14e 100644 --- a/src/duckdb/src/function/function_set.cpp +++ b/src/duckdb/src/function/function_set.cpp @@ -16,12 +16,12 @@ ScalarFunctionSet::ScalarFunctionSet(ScalarFunction fun) : FunctionSet(std::move ScalarFunction ScalarFunctionSet::GetFunctionByArguments(ClientContext &context, const vector &arguments) { ErrorData error; FunctionBinder binder(context); - idx_t index = binder.BindFunction(name, *this, arguments, error); - if (index == DConstants::INVALID_INDEX) { + auto index = binder.BindFunction(name, *this, arguments, error); + if (!index.IsValid()) { throw InternalException("Failed to find function %s(%s)\n%s", name, StringUtil::ToString(arguments, ","), error.Message()); } - return GetFunctionByOffset(index); + return GetFunctionByOffset(index.GetIndex()); } AggregateFunctionSet::AggregateFunctionSet() : FunctionSet("") { @@ -38,8 +38,8 @@ AggregateFunction AggregateFunctionSet::GetFunctionByArguments(ClientContext &co const vector &arguments) { ErrorData error; FunctionBinder binder(context); - idx_t index = binder.BindFunction(name, *this, arguments, error); - if (index == DConstants::INVALID_INDEX) { + auto index = binder.BindFunction(name, *this, arguments, error); + if (!index.IsValid()) { // check if the arguments are a prefix of any of the arguments // this is used for functions such as quantile or string_agg that delete part of their arguments during bind // FIXME: we should come up with a better solution here @@ -61,7 +61,7 @@ AggregateFunction AggregateFunctionSet::GetFunctionByArguments(ClientContext &co throw InternalException("Failed to find function %s(%s)\n%s", name, StringUtil::ToString(arguments, ","), error.Message()); } - return GetFunctionByOffset(index); + return GetFunctionByOffset(index.GetIndex()); } TableFunctionSet::TableFunctionSet(string name) : FunctionSet(std::move(name)) { @@ -74,12 +74,12 @@ TableFunctionSet::TableFunctionSet(TableFunction fun) : FunctionSet(std::move(fu TableFunction TableFunctionSet::GetFunctionByArguments(ClientContext &context, const vector &arguments) { ErrorData error; FunctionBinder binder(context); - idx_t index = binder.BindFunction(name, *this, arguments, error); - if (index == DConstants::INVALID_INDEX) { + auto index = binder.BindFunction(name, *this, arguments, error); + if (!index.IsValid()) { throw InternalException("Failed to find function %s(%s)\n%s", name, StringUtil::ToString(arguments, ","), error.Message()); } - return GetFunctionByOffset(index); + return GetFunctionByOffset(index.GetIndex()); } PragmaFunctionSet::PragmaFunctionSet(string name) : FunctionSet(std::move(name)) { diff --git a/src/duckdb/src/function/pragma/pragma_queries.cpp b/src/duckdb/src/function/pragma/pragma_queries.cpp index 6b1b180c..a69d735b 100644 --- a/src/duckdb/src/function/pragma/pragma_queries.cpp +++ b/src/duckdb/src/function/pragma/pragma_queries.cpp @@ -139,8 +139,7 @@ string PragmaImportDatabase(ClientContext &context, const FunctionParameters &pa vector files = {"schema.sql", "load.sql"}; for (auto &file : files) { auto file_path = fs.JoinPath(parameters.values[0].ToString(), file); - auto handle = fs.OpenFile(file_path, FileFlags::FILE_FLAGS_READ, FileSystem::DEFAULT_LOCK, - FileSystem::DEFAULT_COMPRESSION); + auto handle = fs.OpenFile(file_path, FileFlags::FILE_FLAGS_READ); auto fsize = fs.GetFileSize(*handle); auto buffer = make_unsafe_uniq_array(fsize); fs.Read(*handle, buffer.get(), fsize); diff --git a/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp b/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp index 7805cd03..e431ae40 100644 --- a/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp +++ b/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp @@ -1,6 +1,6 @@ #include "duckdb/common/numeric_utils.hpp" -#include "duckdb/common/serializer/serializer.hpp" #include "duckdb/common/serializer/deserializer.hpp" +#include "duckdb/common/serializer/serializer.hpp" #include "duckdb/function/function_set.hpp" #include "duckdb/function/scalar/compressed_materialization_functions.hpp" @@ -97,9 +97,25 @@ static string IntegralDecompressFunctionName(const LogicalType &result_type) { } template -static inline RESULT_TYPE TemplatedIntegralDecompress(const INPUT_TYPE &input, const RESULT_TYPE &min_val) { - return UnsafeNumericCast(min_val + input); -} +struct TemplatedIntegralDecompress { + static inline RESULT_TYPE Operation(const INPUT_TYPE &input, const RESULT_TYPE &min_val) { + return min_val + UnsafeNumericCast(input); + } +}; + +template +struct TemplatedIntegralDecompress { + static inline hugeint_t Operation(const INPUT_TYPE &input, const hugeint_t &min_val) { + return min_val + hugeint_t(0, input); + } +}; + +template +struct TemplatedIntegralDecompress { + static inline uhugeint_t Operation(const INPUT_TYPE &input, const uhugeint_t &min_val) { + return min_val + uhugeint_t(0, input); + } +}; template static void IntegralDecompressFunction(DataChunk &args, ExpressionState &state, Vector &result) { @@ -108,7 +124,7 @@ static void IntegralDecompressFunction(DataChunk &args, ExpressionState &state, D_ASSERT(args.data[1].GetType() == result.GetType()); const auto min_val = ConstantVector::GetData(args.data[1])[0]; UnaryExecutor::Execute(args.data[0], result, args.size(), [&](const INPUT_TYPE &input) { - return TemplatedIntegralDecompress(input, min_val); + return TemplatedIntegralDecompress::Operation(input, min_val); }); } diff --git a/src/duckdb/src/function/scalar/compressed_materialization/compress_string.cpp b/src/duckdb/src/function/scalar/compressed_materialization/compress_string.cpp index 5cdf4412..1125322f 100644 --- a/src/duckdb/src/function/scalar/compressed_materialization/compress_string.cpp +++ b/src/duckdb/src/function/scalar/compressed_materialization/compress_string.cpp @@ -11,13 +11,13 @@ static string StringCompressFunctionName(const LogicalType &result_type) { } template -static inline void TemplatedReverseMemCpy(const data_ptr_t __restrict &dest, const const_data_ptr_t __restrict &src) { +static inline void TemplatedReverseMemCpy(const data_ptr_t &__restrict dest, const const_data_ptr_t &__restrict src) { for (idx_t i = 0; i < LENGTH; i++) { dest[i] = src[LENGTH - 1 - i]; } } -static inline void ReverseMemCpy(const data_ptr_t __restrict &dest, const const_data_ptr_t __restrict &src, +static inline void ReverseMemCpy(const data_ptr_t &__restrict dest, const const_data_ptr_t &__restrict src, const idx_t &length) { for (idx_t i = 0; i < length; i++) { dest[i] = src[length - 1 - i]; diff --git a/src/duckdb/src/function/scalar/list/list_select.cpp b/src/duckdb/src/function/scalar/list/list_select.cpp index 1da6e30f..0301e090 100644 --- a/src/duckdb/src/function/scalar/list/list_select.cpp +++ b/src/duckdb/src/function/scalar/list/list_select.cpp @@ -3,6 +3,7 @@ #include "duckdb/planner/expression_binder.hpp" #include "duckdb/planner/expression/bound_function_expression.hpp" #include "duckdb/planner/expression/bound_parameter_expression.hpp" +#include "duckdb/planner/expression/bound_cast_expression.hpp" namespace duckdb { @@ -140,6 +141,10 @@ static void ListSelectFunction(DataChunk &args, ExpressionState &state, Vector & static unique_ptr ListSelectBind(ClientContext &context, ScalarFunction &bound_function, vector> &arguments) { D_ASSERT(bound_function.arguments.size() == 2); + + // If the first argument is an array, cast it to a list + arguments[0] = BoundCastExpression::AddArrayCastToList(context, std::move(arguments[0])); + LogicalType child_type; if (arguments[0]->return_type == LogicalTypeId::UNKNOWN || arguments[1]->return_type == LogicalTypeId::UNKNOWN) { bound_function.arguments[0] = LogicalTypeId::UNKNOWN; @@ -149,8 +154,6 @@ static unique_ptr ListSelectBind(ClientContext &context, ScalarFun D_ASSERT(LogicalTypeId::LIST == arguments[0]->return_type.id() || LogicalTypeId::SQLNULL == arguments[0]->return_type.id()); - D_ASSERT(LogicalTypeId::LIST == arguments[1]->return_type.id() || - LogicalTypeId::SQLNULL == arguments[1]->return_type.id()); bound_function.return_type = arguments[0]->return_type; return make_uniq(bound_function.return_type); diff --git a/src/duckdb/src/function/scalar/list/list_zip.cpp b/src/duckdb/src/function/scalar/list/list_zip.cpp index 87e76fd4..6069fab5 100644 --- a/src/duckdb/src/function/scalar/list/list_zip.cpp +++ b/src/duckdb/src/function/scalar/list/list_zip.cpp @@ -31,13 +31,14 @@ static void ListZipFunction(DataChunk &args, ExpressionState &state, Vector &res idx_t result_size = 0; vector lengths; for (idx_t j = 0; j < count; j++) { - // Is flag for current row set bool truncate_to_shortest = false; if (truncate_flags_set) { - idx_t flag_idx = input_lists.back().sel->get_index(j); - auto flag_data = UnifiedVectorFormat::GetData(input_lists.back()); - truncate_to_shortest = flag_data[flag_idx]; + auto &flag_vec = input_lists.back(); + idx_t flag_idx = flag_vec.sel->get_index(j); + if (flag_vec.validity.RowIsValid(flag_idx)) { + truncate_to_shortest = UnifiedVectorFormat::GetData(flag_vec)[flag_idx]; + } } // Calculation of the outgoing list size diff --git a/src/duckdb/src/function/scalar/operators/arithmetic.cpp b/src/duckdb/src/function/scalar/operators/arithmetic.cpp index 64e9d57b..828395ff 100644 --- a/src/duckdb/src/function/scalar/operators/arithmetic.cpp +++ b/src/duckdb/src/function/scalar/operators/arithmetic.cpp @@ -115,7 +115,7 @@ struct SubtractPropagateStatistics { }; struct DecimalArithmeticBindData : public FunctionData { - DecimalArithmeticBindData() : check_overflow(true) { + DecimalArithmeticBindData() : check_overflow(false) { } unique_ptr Copy() const override { @@ -182,10 +182,9 @@ static unique_ptr PropagateNumericStats(ClientContext &context, return result.ToUnique(); } -template -unique_ptr BindDecimalAddSubtract(ClientContext &context, ScalarFunction &bound_function, - vector> &arguments) { - +template +unique_ptr BindDecimalArithmetic(ClientContext &context, ScalarFunction &bound_function, + vector> &arguments) { auto bind_data = make_uniq(); // get the max width and scale of the input arguments @@ -204,12 +203,15 @@ unique_ptr BindDecimalAddSubtract(ClientContext &context, ScalarFu max_width_over_scale = MaxValue(width - scale, max_width_over_scale); } D_ASSERT(max_width > 0); - // for addition/subtraction, we add 1 to the width to ensure we don't overflow - auto required_width = NumericCast(MaxValue(max_scale + max_width_over_scale, max_width) + 1); - if (required_width > Decimal::MAX_WIDTH_INT64 && max_width <= Decimal::MAX_WIDTH_INT64) { - // we don't automatically promote past the hugeint boundary to avoid the large hugeint performance penalty - bind_data->check_overflow = true; - required_width = Decimal::MAX_WIDTH_INT64; + uint8_t required_width = MaxValue(max_scale + max_width_over_scale, max_width); + if (!IS_MODULO) { + // for addition/subtraction, we add 1 to the width to ensure we don't overflow + required_width = NumericCast(required_width + 1); + if (required_width > Decimal::MAX_WIDTH_INT64 && max_width <= Decimal::MAX_WIDTH_INT64) { + // we don't automatically promote past the hugeint boundary to avoid the large hugeint performance penalty + bind_data->check_overflow = true; + required_width = Decimal::MAX_WIDTH_INT64; + } } if (required_width > Decimal::MAX_WIDTH_DECIMAL) { // target width does not fit in decimal at all: truncate the scale and perform overflow detection @@ -232,7 +234,16 @@ unique_ptr BindDecimalAddSubtract(ClientContext &context, ScalarFu } } bound_function.return_type = result_type; + return bind_data; +} + +template +unique_ptr BindDecimalAddSubtract(ClientContext &context, ScalarFunction &bound_function, + vector> &arguments) { + auto bind_data = BindDecimalArithmetic(context, bound_function, arguments); + // now select the physical function to execute + auto &result_type = bound_function.return_type; if (bind_data->check_overflow) { bound_function.function = GetScalarBinaryFunction(result_type.InternalType()); } else { @@ -435,8 +446,8 @@ void AddFun::RegisterFunction(BuiltinFunctions &set) { struct NegateOperator { template static bool CanNegate(T input) { - using Limits = std::numeric_limits; - return !(Limits::is_integer && Limits::is_signed && Limits::lowest() == input); + using Limits = NumericLimits; + return !(Limits::IsSigned() && Limits::Minimum() == input); } template @@ -910,31 +921,31 @@ static void BinaryScalarFunctionIgnoreZero(DataChunk &input, ExpressionState &st } template -static scalar_function_t GetBinaryFunctionIgnoreZero(const LogicalType &type) { - switch (type.id()) { - case LogicalTypeId::TINYINT: +static scalar_function_t GetBinaryFunctionIgnoreZero(PhysicalType type) { + switch (type) { + case PhysicalType::INT8: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::SMALLINT: + case PhysicalType::INT16: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::INTEGER: + case PhysicalType::INT32: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::BIGINT: + case PhysicalType::INT64: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::UTINYINT: + case PhysicalType::UINT8: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::USMALLINT: + case PhysicalType::UINT16: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::UINTEGER: + case PhysicalType::UINT32: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::UBIGINT: + case PhysicalType::UINT64: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::HUGEINT: + case PhysicalType::INT128: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::UHUGEINT: + case PhysicalType::UINT128: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::FLOAT: + case PhysicalType::FLOAT: return BinaryScalarFunctionIgnoreZero; - case LogicalTypeId::DOUBLE: + case PhysicalType::DOUBLE: return BinaryScalarFunctionIgnoreZero; default: throw NotImplementedException("Unimplemented type for GetScalarUnaryFunction"); @@ -944,9 +955,9 @@ static scalar_function_t GetBinaryFunctionIgnoreZero(const LogicalType &type) { void DivideFun::RegisterFunction(BuiltinFunctions &set) { ScalarFunctionSet fp_divide("/"); fp_divide.AddFunction(ScalarFunction({LogicalType::FLOAT, LogicalType::FLOAT}, LogicalType::FLOAT, - GetBinaryFunctionIgnoreZero(LogicalType::FLOAT))); + GetBinaryFunctionIgnoreZero(PhysicalType::FLOAT))); fp_divide.AddFunction(ScalarFunction({LogicalType::DOUBLE, LogicalType::DOUBLE}, LogicalType::DOUBLE, - GetBinaryFunctionIgnoreZero(LogicalType::DOUBLE))); + GetBinaryFunctionIgnoreZero(PhysicalType::DOUBLE))); fp_divide.AddFunction( ScalarFunction({LogicalType::INTERVAL, LogicalType::BIGINT}, LogicalType::INTERVAL, BinaryScalarFunctionIgnoreZero)); @@ -958,7 +969,7 @@ void DivideFun::RegisterFunction(BuiltinFunctions &set) { continue; } else { full_divide.AddFunction( - ScalarFunction({type, type}, type, GetBinaryFunctionIgnoreZero(type))); + ScalarFunction({type, type}, type, GetBinaryFunctionIgnoreZero(type.InternalType()))); } } set.AddFunction(full_divide); @@ -970,6 +981,23 @@ void DivideFun::RegisterFunction(BuiltinFunctions &set) { //===--------------------------------------------------------------------===// // % [modulo] //===--------------------------------------------------------------------===// +template +unique_ptr BindDecimalModulo(ClientContext &context, ScalarFunction &bound_function, + vector> &arguments) { + auto bind_data = BindDecimalArithmetic(context, bound_function, arguments); + // now select the physical function to execute + if (bind_data->check_overflow) { + // fallback to DOUBLE if the decimal type is not guaranteed to fit within the max decimal width + for (auto &arg : bound_function.arguments) { + arg = LogicalType::DOUBLE; + } + bound_function.return_type = LogicalType::DOUBLE; + } + auto &result_type = bound_function.return_type; + bound_function.function = GetBinaryFunctionIgnoreZero(result_type.InternalType()); + return std::move(bind_data); +} + template <> float ModuloOperator::Operation(float left, float right) { D_ASSERT(right != 0); @@ -996,10 +1024,10 @@ void ModFun::RegisterFunction(BuiltinFunctions &set) { ScalarFunctionSet functions("%"); for (auto &type : LogicalType::Numeric()) { if (type.id() == LogicalTypeId::DECIMAL) { - continue; + functions.AddFunction(ScalarFunction({type, type}, type, nullptr, BindDecimalModulo)); } else { functions.AddFunction( - ScalarFunction({type, type}, type, GetBinaryFunctionIgnoreZero(type))); + ScalarFunction({type, type}, type, GetBinaryFunctionIgnoreZero(type.InternalType()))); } } set.AddFunction(functions); diff --git a/src/duckdb/src/function/scalar/sequence/nextval.cpp b/src/duckdb/src/function/scalar/sequence/nextval.cpp index 8fba1465..2167e8e4 100644 --- a/src/duckdb/src/function/scalar/sequence/nextval.cpp +++ b/src/duckdb/src/function/scalar/sequence/nextval.cpp @@ -78,7 +78,7 @@ static unique_ptr NextValBind(ClientContext &context, ScalarFuncti return make_uniq(sequence); } -static void NextValDependency(BoundFunctionExpression &expr, DependencyList &dependencies) { +static void NextValDependency(BoundFunctionExpression &expr, LogicalDependencyList &dependencies) { auto &info = expr.bind_info->Cast(); if (info.sequence) { dependencies.AddDependency(*info.sequence); diff --git a/src/duckdb/src/function/scalar/strftime_format.cpp b/src/duckdb/src/function/scalar/strftime_format.cpp index 5c8b18ff..f0ec2492 100644 --- a/src/duckdb/src/function/scalar/strftime_format.cpp +++ b/src/duckdb/src/function/scalar/strftime_format.cpp @@ -5,6 +5,7 @@ #include "duckdb/common/types/date.hpp" #include "duckdb/common/types/time.hpp" #include "duckdb/common/types/timestamp.hpp" +#include namespace duckdb { @@ -598,7 +599,9 @@ string StrTimeFormat::ParseFormatSpecifier(const string &format_string, StrTimeF // parse the subformat in a separate format specifier StrfTimeFormat locale_format; string error = StrTimeFormat::ParseFormatSpecifier(subformat, locale_format); - D_ASSERT(error.empty()); + if (!error.empty()) { + throw InternalException("Failed to bind sub-format specifier \"%s\": %s", subformat, error); + } // add the previous literal to the first literal of the subformat locale_format.literals[0] = std::move(current_literal) + locale_format.literals[0]; current_literal = ""; @@ -1339,11 +1342,11 @@ bool StrTimeFormat::Empty() const { return format_specifier.empty(); } -string StrpTimeFormat::FormatStrpTimeError(const string &input, idx_t position) { - if (position == DConstants::INVALID_INDEX) { +string StrpTimeFormat::FormatStrpTimeError(const string &input, optional_idx position) { + if (!position.IsValid()) { return string(); } - return input + "\n" + string(position, ' ') + "^"; + return input + "\n" + string(position.GetIndex(), ' ') + "^"; } date_t StrpTimeFormat::ParseResult::ToDate() { @@ -1357,6 +1360,20 @@ bool StrpTimeFormat::ParseResult::TryToDate(date_t &result) { return Date::TryFromDate(data[0], data[1], data[2], result); } +dtime_t StrpTimeFormat::ParseResult::ToTime() { + const auto hour_offset = data[7] / Interval::MINS_PER_HOUR; + const auto mins_offset = data[7] % Interval::MINS_PER_HOUR; + return Time::FromTime(data[3] - hour_offset, data[4] - mins_offset, data[5], data[6]); +} + +bool StrpTimeFormat::ParseResult::TryToTime(dtime_t &result) { + if (data[7]) { + return false; + } + result = Time::FromTime(data[3], data[4], data[5], data[6]); + return true; +} + timestamp_t StrpTimeFormat::ParseResult::ToTimestamp() { if (is_special) { if (special == date_t::infinity()) { @@ -1368,9 +1385,7 @@ timestamp_t StrpTimeFormat::ParseResult::ToTimestamp() { } date_t date = Date::FromDate(data[0], data[1], data[2]); - const auto hour_offset = data[7] / Interval::MINS_PER_HOUR; - const auto mins_offset = data[7] % Interval::MINS_PER_HOUR; - dtime_t time = Time::FromTime(data[3] - hour_offset, data[4] - mins_offset, data[5], data[6]); + dtime_t time = ToTime(); return Timestamp::FromDatetime(date, time); } @@ -1379,9 +1394,7 @@ bool StrpTimeFormat::ParseResult::TryToTimestamp(timestamp_t &result) { if (!TryToDate(date)) { return false; } - const auto hour_offset = data[7] / Interval::MINS_PER_HOUR; - const auto mins_offset = data[7] % Interval::MINS_PER_HOUR; - dtime_t time = Time::FromTime(data[3] - hour_offset, data[4] - mins_offset, data[5], data[6]); + dtime_t time = ToTime(); return Timestamp::TryFromDatetime(date, time, result); } @@ -1400,29 +1413,22 @@ bool StrpTimeFormat::TryParseDate(string_t input, date_t &result, string &error_ return parse_result.TryToDate(result); } -bool StrpTimeFormat::TryParseTimestamp(string_t input, timestamp_t &result, string &error_message) const { +bool StrpTimeFormat::TryParseTime(string_t input, dtime_t &result, string &error_message) const { ParseResult parse_result; if (!Parse(input, parse_result)) { error_message = parse_result.FormatError(input, format_specifier); return false; } - return parse_result.TryToTimestamp(result); -} - -date_t StrpTimeFormat::ParseDate(string_t input) { - ParseResult result; - if (!Parse(input, result)) { - throw InvalidInputException(result.FormatError(input, format_specifier)); - } - return result.ToDate(); + return parse_result.TryToTime(result); } -timestamp_t StrpTimeFormat::ParseTimestamp(string_t input) { - ParseResult result; - if (!Parse(input, result)) { - throw InvalidInputException(result.FormatError(input, format_specifier)); +bool StrpTimeFormat::TryParseTimestamp(string_t input, timestamp_t &result, string &error_message) const { + ParseResult parse_result; + if (!Parse(input, parse_result)) { + error_message = parse_result.FormatError(input, format_specifier); + return false; } - return result.ToTimestamp(); + return parse_result.TryToTimestamp(result); } } // namespace duckdb diff --git a/src/duckdb/src/function/scalar/string/caseconvert.cpp b/src/duckdb/src/function/scalar/string/caseconvert.cpp index 4193ee60..100ed976 100644 --- a/src/duckdb/src/function/scalar/string/caseconvert.cpp +++ b/src/duckdb/src/function/scalar/string/caseconvert.cpp @@ -11,7 +11,7 @@ namespace duckdb { -uint8_t UpperFun::ascii_to_upper_map[] = { +const uint8_t UpperFun::ASCII_TO_UPPER_MAP[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, @@ -24,7 +24,7 @@ uint8_t UpperFun::ascii_to_upper_map[] = { 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}; -uint8_t LowerFun::ascii_to_lower_map[] = { +const uint8_t LowerFun::ASCII_TO_LOWER_MAP[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, @@ -44,8 +44,8 @@ static string_t ASCIICaseConvert(Vector &result, const char *input_data, idx_t i auto result_str = StringVector::EmptyString(result, output_length); auto result_data = result_str.GetDataWriteable(); for (idx_t i = 0; i < input_length; i++) { - result_data[i] = IS_UPPER ? UpperFun::ascii_to_upper_map[uint8_t(input_data[i])] - : LowerFun::ascii_to_lower_map[uint8_t(input_data[i])]; + result_data[i] = IS_UPPER ? UpperFun::ASCII_TO_UPPER_MAP[uint8_t(input_data[i])] + : LowerFun::ASCII_TO_LOWER_MAP[uint8_t(input_data[i])]; } result_str.Finalize(); return result_str; @@ -88,8 +88,8 @@ static void CaseConvert(const char *input_data, idx_t input_length, char *result i += sz; } else { // ascii - *result_data = IS_UPPER ? UpperFun::ascii_to_upper_map[uint8_t(input_data[i])] - : LowerFun::ascii_to_lower_map[uint8_t(input_data[i])]; + *result_data = IS_UPPER ? UpperFun::ASCII_TO_UPPER_MAP[uint8_t(input_data[i])] + : LowerFun::ASCII_TO_LOWER_MAP[uint8_t(input_data[i])]; result_data++; i++; } diff --git a/src/duckdb/src/function/scalar/string/length.cpp b/src/duckdb/src/function/scalar/string/length.cpp index 218e4e84..dd88fd8d 100644 --- a/src/duckdb/src/function/scalar/string/length.cpp +++ b/src/duckdb/src/function/scalar/string/length.cpp @@ -70,7 +70,6 @@ static unique_ptr LengthPropagateStats(ClientContext &context, F //------------------------------------------------------------------ // ARRAY / LIST LENGTH //------------------------------------------------------------------ - static void ListLengthFunction(DataChunk &args, ExpressionState &state, Vector &result) { auto &input = args.data[0]; D_ASSERT(input.GetType().id() == LogicalTypeId::LIST); @@ -83,9 +82,31 @@ static void ListLengthFunction(DataChunk &args, ExpressionState &state, Vector & static void ArrayLengthFunction(DataChunk &args, ExpressionState &state, Vector &result) { auto &input = args.data[0]; - // If the input is an array, the length is constant + + UnifiedVectorFormat format; + args.data[0].ToUnifiedFormat(args.size(), format); + + // for arrays the length is constant result.SetVectorType(VectorType::CONSTANT_VECTOR); ConstantVector::GetData(result)[0] = static_cast(ArrayType::GetSize(input.GetType())); + + // but we do need to take null values into account + if (format.validity.AllValid()) { + // if there are no null values we can just return the constant + return; + } + // otherwise we flatten and inherit the null values of the parent + result.Flatten(args.size()); + auto &result_validity = FlatVector::Validity(result); + for (idx_t r = 0; r < args.size(); r++) { + auto idx = format.sel->get_index(r); + if (!format.validity.RowIsValid(idx)) { + result_validity.SetInvalid(r); + } + } + if (args.AllConstant()) { + result.SetVectorType(VectorType::CONSTANT_VECTOR); + } } static unique_ptr ArrayOrListLengthBind(ClientContext &context, ScalarFunction &bound_function, diff --git a/src/duckdb/src/function/scalar/string/like.cpp b/src/duckdb/src/function/scalar/string/like.cpp index 2a45e7d9..edca8d8a 100644 --- a/src/duckdb/src/function/scalar/string/like.cpp +++ b/src/duckdb/src/function/scalar/string/like.cpp @@ -26,7 +26,7 @@ struct ASCIILCaseReader { } static char Operation(const char *data, idx_t pos) { - return (char)LowerFun::ascii_to_lower_map[(uint8_t)data[pos]]; + return (char)LowerFun::ASCII_TO_LOWER_MAP[(uint8_t)data[pos]]; } }; diff --git a/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp b/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp index 1b5bd06b..f8a5736b 100644 --- a/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +++ b/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp @@ -27,7 +27,7 @@ bool ExtractAll(duckdb_re2::StringPiece &input, duckdb_re2::RE2 &pattern, idx_t D_ASSERT(pattern.ok()); D_ASSERT(pattern.NumberOfCapturingGroups() == ngroups); - if (!pattern.Match(input, *startpos, input.size(), pattern.Anchored(), groups, ngroups + 1)) { + if (!pattern.Match(input, *startpos, input.size(), pattern.UNANCHORED, groups, ngroups + 1)) { return false; } idx_t consumed = static_cast(groups[0].end() - (input.begin() + *startpos)); diff --git a/src/duckdb/src/function/scalar/system/aggregate_export.cpp b/src/duckdb/src/function/scalar/system/aggregate_export.cpp index e1e068b2..035a1e33 100644 --- a/src/duckdb/src/function/scalar/system/aggregate_export.cpp +++ b/src/duckdb/src/function/scalar/system/aggregate_export.cpp @@ -216,13 +216,13 @@ static unique_ptr BindAggregateState(ClientContext &context, Scala ErrorData error; FunctionBinder function_binder(context); - idx_t best_function = + auto best_function = function_binder.BindFunction(aggr.name, aggr.functions, state_type.bound_argument_types, error); - if (best_function == DConstants::INVALID_INDEX) { + if (!best_function.IsValid()) { throw InternalException("Could not re-bind exported aggregate %s: %s", state_type.function_name, error.Message()); } - auto bound_aggr = aggr.functions.GetFunctionByOffset(best_function); + auto bound_aggr = aggr.functions.GetFunctionByOffset(best_function.GetIndex()); if (bound_aggr.bind) { // FIXME: this is really hacky // but the aggregate state export needs a rework around how it handles more complex aggregates anyway diff --git a/src/duckdb/src/function/table/arrow.cpp b/src/duckdb/src/function/table/arrow.cpp index 53088247..dd742b78 100644 --- a/src/duckdb/src/function/table/arrow.cpp +++ b/src/duckdb/src/function/table/arrow.cpp @@ -125,6 +125,10 @@ static unique_ptr GetArrowLogicalTypeNoDictionary(ArrowSchema &schema } else if (format == "+s") { child_list_t child_types; vector> children; + if (schema.n_children == 0) { + throw InvalidInputException( + "Attempted to convert a STRUCT with no fields to DuckDB which is not supported"); + } for (idx_t type_idx = 0; type_idx < (idx_t)schema.n_children; type_idx++) { children.emplace_back(ArrowTableFunction::GetArrowLogicalType(*schema.children[type_idx])); child_types.emplace_back(schema.children[type_idx]->name, children.back()->GetDuckType()); @@ -144,6 +148,9 @@ static unique_ptr GetArrowLogicalTypeNoDictionary(ArrowSchema &schema child_list_t members; vector> children; + if (schema.n_children == 0) { + throw InvalidInputException("Attempted to convert a UNION with no fields to DuckDB which is not supported"); + } for (idx_t type_idx = 0; type_idx < (idx_t)schema.n_children; type_idx++) { auto type = schema.children[type_idx]; @@ -237,7 +244,6 @@ void ArrowTableFunction::PopulateArrowTableType(ArrowTableType &arrow_table, Arr auto arrow_type = GetArrowLogicalType(schema); return_types.emplace_back(arrow_type->GetDuckType(true)); arrow_table.AddColumn(col_idx, std::move(arrow_type)); - auto format = string(schema.format); auto name = string(schema.name); if (name.empty()) { name = string("v") + to_string(col_idx); diff --git a/src/duckdb/src/function/table/arrow/arrow_array_scan_state.cpp b/src/duckdb/src/function/table/arrow/arrow_array_scan_state.cpp index 0e60b470..749ebc29 100644 --- a/src/duckdb/src/function/table/arrow/arrow_array_scan_state.cpp +++ b/src/duckdb/src/function/table/arrow/arrow_array_scan_state.cpp @@ -14,7 +14,7 @@ ArrowArrayScanState &ArrowArrayScanState::GetChild(idx_t child_idx) { auto child_p = make_uniq(state); auto &child = *child_p; child.owned_data = owned_data; - children.emplace(std::make_pair(child_idx, std::move(child_p))); + children.emplace(child_idx, std::move(child_p)); return child; } if (!it->second->owned_data) { diff --git a/src/duckdb/src/function/table/copy_csv.cpp b/src/duckdb/src/function/table/copy_csv.cpp index e2f9a240..8d1d50b3 100644 --- a/src/duckdb/src/function/table/copy_csv.cpp +++ b/src/duckdb/src/function/table/copy_csv.cpp @@ -61,17 +61,20 @@ void BaseCSVData::Finalize() { AreOptionsEqual(options.dialect_options.state_machine_options.quote.GetValue(), options.dialect_options.state_machine_options.escape.GetValue(), "QUOTE", "ESCAPE"); } - if (!options.null_str.empty()) { - // null string and delimiter must not be substrings of each other - SubstringDetection(options.dialect_options.state_machine_options.delimiter.GetValue(), options.null_str, - "DELIMITER", "NULL"); - // quote/escape and nullstr must not be substrings of each other - SubstringDetection(options.dialect_options.state_machine_options.quote.GetValue(), options.null_str, "QUOTE", - "NULL"); + // null string and delimiter must not be substrings of each other + for (auto &null_str : options.null_str) { + if (!null_str.empty()) { + SubstringDetection(options.dialect_options.state_machine_options.delimiter.GetValue(), null_str, + "DELIMITER", "NULL"); - SubstringDetection(options.dialect_options.state_machine_options.escape.GetValue(), options.null_str, "ESCAPE", - "NULL"); + // quote/escape and nullstr must not be substrings of each other + SubstringDetection(options.dialect_options.state_machine_options.quote.GetValue(), null_str, "QUOTE", + "NULL"); + + SubstringDetection(options.dialect_options.state_machine_options.escape.GetValue(), null_str, "ESCAPE", + "NULL"); + } } if (!options.prefix.empty() || !options.suffix.empty()) { @@ -194,7 +197,7 @@ static string AddEscapes(char to_be_escaped, const char escape, const string &va static bool RequiresQuotes(WriteCSVData &csv_data, const char *str, idx_t len) { auto &options = csv_data.options; // check if the string is equal to the null string - if (len == options.null_str.size() && memcmp(str, options.null_str.c_str(), len) == 0) { + if (len == options.null_str[0].size() && memcmp(str, options.null_str[0].c_str(), len) == 0) { return true; } auto str_data = reinterpret_cast(str); @@ -270,8 +273,8 @@ struct LocalWriteCSVData : public LocalFunctionData { struct GlobalWriteCSVData : public GlobalFunctionData { GlobalWriteCSVData(FileSystem &fs, const string &file_path, FileCompressionType compression) : fs(fs), written_anything(false) { - handle = fs.OpenFile(file_path, FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE_NEW, - FileLockType::WRITE_LOCK, compression); + handle = fs.OpenFile(file_path, FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE_NEW | + FileLockType::WRITE_LOCK | compression); } //! Write generic data, e.g., CSV header @@ -393,13 +396,14 @@ static void WriteCSVChunkInternal(ClientContext &context, FunctionData &bind_dat writer.WriteData(const_data_ptr_cast(csv_data.newline.c_str()), csv_data.newline.size()); } // write values + D_ASSERT(options.null_str.size() == 1); for (idx_t col_idx = 0; col_idx < cast_chunk.ColumnCount(); col_idx++) { if (col_idx != 0) { WriteQuoteOrEscape(writer, options.dialect_options.state_machine_options.delimiter.GetValue()); } if (FlatVector::IsNull(cast_chunk.data[col_idx], row_idx)) { // write null value - writer.WriteData(const_data_ptr_cast(options.null_str.c_str()), options.null_str.size()); + writer.WriteData(const_data_ptr_cast(options.null_str[0].c_str()), options.null_str[0].size()); continue; } diff --git a/src/duckdb/src/function/table/read_csv.cpp b/src/duckdb/src/function/table/read_csv.cpp index 8d2e1be0..4434d7cd 100644 --- a/src/duckdb/src/function/table/read_csv.cpp +++ b/src/duckdb/src/function/table/read_csv.cpp @@ -41,22 +41,6 @@ ReadCSVData::ReadCSVData() { void ReadCSVData::FinalizeRead(ClientContext &context) { BaseCSVData::Finalize(); - if (!options.rejects_recovery_columns.empty()) { - for (auto &recovery_col : options.rejects_recovery_columns) { - bool found = false; - for (idx_t col_idx = 0; col_idx < return_names.size(); col_idx++) { - if (StringUtil::CIEquals(return_names[col_idx], recovery_col)) { - options.rejects_recovery_column_ids.push_back(col_idx); - found = true; - break; - } - } - if (!found) { - throw BinderException("Unsupported parameter for REJECTS_RECOVERY_COLUMNS: column \"%s\" not found", - recovery_col); - } - } - } } static unique_ptr ReadCSVBind(ClientContext &context, TableFunctionBindInput &input, @@ -67,26 +51,32 @@ static unique_ptr ReadCSVBind(ClientContext &context, TableFunctio result->files = MultiFileReader::GetFileList(context, input.inputs[0], "CSV"); options.FromNamedParameters(input.named_parameters, context, return_types, names); - + if (options.rejects_table_name.IsSetByUser() && !options.store_rejects.GetValue() && + options.store_rejects.IsSetByUser()) { + throw BinderException("REJECTS_TABLE option is only supported when store_rejects is not manually set to false"); + } + if (options.rejects_scan_name.IsSetByUser() && !options.store_rejects.GetValue() && + options.store_rejects.IsSetByUser()) { + throw BinderException("REJECTS_SCAN option is only supported when store_rejects is not manually set to false"); + } + if (options.rejects_scan_name.IsSetByUser() || options.rejects_table_name.IsSetByUser()) { + // Ensure we set store_rejects to true automagically + options.store_rejects.Set(true, false); + } // Validate rejects_table options - if (!options.rejects_table_name.empty()) { - if (!options.ignore_errors) { - throw BinderException("REJECTS_TABLE option is only supported when IGNORE_ERRORS is set to true"); + if (options.store_rejects.GetValue()) { + if (!options.ignore_errors.GetValue() && options.ignore_errors.IsSetByUser()) { + throw BinderException( + "STORE_REJECTS option is only supported when IGNORE_ERRORS is not manually set to false"); } + // Ensure we set ignore errors to true automagically + options.ignore_errors.Set(true, false); if (options.file_options.union_by_name) { throw BinderException("REJECTS_TABLE option is not supported when UNION_BY_NAME is set to true"); } } - - if (options.rejects_limit != 0) { - if (options.rejects_table_name.empty()) { - throw BinderException("REJECTS_LIMIT option is only supported when REJECTS_TABLE is set to a table name"); - } - } - - if (!options.rejects_recovery_columns.empty() && options.rejects_table_name.empty()) { - throw BinderException( - "REJECTS_RECOVERY_COLUMNS option is only supported when REJECTS_TABLE is set to a table name"); + if (options.rejects_limit != 0 && !options.store_rejects.GetValue()) { + throw BinderException("REJECTS_LIMIT option is only supported when REJECTS_TABLE is set to a table name"); } options.file_options.AutoDetectHivePartitioning(result->files, context); @@ -142,8 +132,28 @@ static unique_ptr ReadCSVBind(ClientContext &context, TableFunctio } result->return_types = return_types; result->return_names = names; - - result->FinalizeRead(context); + if (!options.force_not_null_names.empty()) { + // Lets first check all column names match + duckdb::unordered_set column_names; + for (auto &name : names) { + column_names.insert(name); + } + for (auto &force_name : options.force_not_null_names) { + if (column_names.find(force_name) == column_names.end()) { + throw BinderException("\"force_not_null\" expected to find %s, but it was not found in the table", + force_name); + } + } + D_ASSERT(options.force_not_null.empty()); + for (idx_t i = 0; i < names.size(); i++) { + if (options.force_not_null_names.find(names[i]) != options.force_not_null_names.end()) { + options.force_not_null.push_back(true); + } else { + options.force_not_null.push_back(false); + } + } + } + result->Finalize(); return std::move(result); } @@ -167,9 +177,10 @@ static unique_ptr ReadCSVInitGlobal(ClientContext &con auto &bind_data = input.bind_data->Cast(); // Create the temporary rejects table - auto rejects_table = bind_data.options.rejects_table_name; - if (!rejects_table.empty()) { - CSVRejectsTable::GetOrCreate(context, rejects_table)->InitializeTable(context, bind_data); + if (bind_data.options.store_rejects.GetValue()) { + CSVRejectsTable::GetOrCreate(context, bind_data.options.rejects_scan_name.GetValue(), + bind_data.options.rejects_table_name.GetValue()) + ->InitializeTable(context, bind_data); } if (bind_data.files.empty()) { // This can happen when a filename based filter pushdown has eliminated all possible files for this scan. @@ -185,7 +196,7 @@ unique_ptr ReadCSVInitLocal(ExecutionContext &context, return nullptr; } auto &global_state = global_state_p->Cast(); - auto csv_scanner = global_state.Next(); + auto csv_scanner = global_state.Next(nullptr); if (!csv_scanner) { global_state.DecrementThread(); } @@ -211,7 +222,7 @@ static void ReadCSVFunction(ClientContext &context, TableFunctionInput &data_p, break; } if (csv_local_state.csv_reader->FinishedIterator()) { - csv_local_state.csv_reader = csv_global_state.Next(); + csv_local_state.csv_reader = csv_global_state.Next(csv_local_state.csv_reader.get()); if (!csv_local_state.csv_reader) { csv_global_state.DecrementThread(); break; @@ -234,7 +245,7 @@ void ReadCSVTableFunction::ReadCSVAddNamedParameters(TableFunction &table_functi table_function.named_parameters["quote"] = LogicalType::VARCHAR; table_function.named_parameters["new_line"] = LogicalType::VARCHAR; table_function.named_parameters["escape"] = LogicalType::VARCHAR; - table_function.named_parameters["nullstr"] = LogicalType::VARCHAR; + table_function.named_parameters["nullstr"] = LogicalType::ANY; table_function.named_parameters["columns"] = LogicalType::ANY; table_function.named_parameters["auto_type_candidates"] = LogicalType::ANY; table_function.named_parameters["header"] = LogicalType::BOOLEAN; @@ -249,9 +260,11 @@ void ReadCSVTableFunction::ReadCSVAddNamedParameters(TableFunction &table_functi table_function.named_parameters["max_line_size"] = LogicalType::VARCHAR; table_function.named_parameters["maximum_line_size"] = LogicalType::VARCHAR; table_function.named_parameters["ignore_errors"] = LogicalType::BOOLEAN; + table_function.named_parameters["store_rejects"] = LogicalType::BOOLEAN; table_function.named_parameters["rejects_table"] = LogicalType::VARCHAR; + table_function.named_parameters["rejects_scan"] = LogicalType::VARCHAR; table_function.named_parameters["rejects_limit"] = LogicalType::BIGINT; - table_function.named_parameters["rejects_recovery_columns"] = LogicalType::LIST(LogicalType::VARCHAR); + table_function.named_parameters["force_not_null"] = LogicalType::LIST(LogicalType::VARCHAR); table_function.named_parameters["buffer_size"] = LogicalType::UBIGINT; table_function.named_parameters["decimal_separator"] = LogicalType::VARCHAR; table_function.named_parameters["parallel"] = LogicalType::BOOLEAN; diff --git a/src/duckdb/src/function/table/sniff_csv.cpp b/src/duckdb/src/function/table/sniff_csv.cpp index f135b15c..536c5849 100644 --- a/src/duckdb/src/function/table/sniff_csv.cpp +++ b/src/duckdb/src/function/table/sniff_csv.cpp @@ -83,17 +83,6 @@ static unique_ptr CSVSniffBind(ClientContext &context, TableFuncti return std::move(result); } -string NewLineIdentifierToString(NewLineIdentifier identifier) { - switch (identifier) { - case NewLineIdentifier::SINGLE: - return "\\n"; - case NewLineIdentifier::CARRY_ON: - return "\\r\\n"; - default: - return ""; - } -} - string FormatOptions(char opt) { if (opt == '\'') { return "''"; @@ -121,6 +110,12 @@ static void CSVSniffFunction(ClientContext &context, TableFunctionInput &data_p, sniffer_options.file_path = data.path; auto buffer_manager = make_shared(context, sniffer_options, sniffer_options.file_path, 0); + if (sniffer_options.name_list.empty()) { + sniffer_options.name_list = data.names_csv; + } + if (sniffer_options.sql_type_list.empty()) { + sniffer_options.sql_type_list = data.return_types_csv; + } CSVSniffer sniffer(sniffer_options, buffer_manager, CSVStateMachineCache::Get(context)); auto sniffer_result = sniffer.SniffCSV(true); string str_opt; @@ -138,8 +133,7 @@ static void CSVSniffFunction(ClientContext &context, TableFunctionInput &data_p, str_opt = sniffer_options.dialect_options.state_machine_options.escape.GetValue(); output.SetValue(2, 0, str_opt); // 4. NewLine Delimiter - auto new_line_identifier = - NewLineIdentifierToString(sniffer_options.dialect_options.state_machine_options.new_line.GetValue()); + auto new_line_identifier = sniffer_options.NewLineIdentifierToString(); output.SetValue(3, 0, new_line_identifier); // 5. Skip Rows output.SetValue(4, 0, Value::UINTEGER(NumericCast(sniffer_options.dialect_options.skip_rows.GetValue()))); diff --git a/src/duckdb/src/function/table/system/duckdb_constraints.cpp b/src/duckdb/src/function/table/system/duckdb_constraints.cpp index 560c6b3a..64aff394 100644 --- a/src/duckdb/src/function/table/system/duckdb_constraints.cpp +++ b/src/duckdb/src/function/table/system/duckdb_constraints.cpp @@ -153,7 +153,7 @@ void DuckDBConstraintsFunction(ClientContext &context, TableFunctionInput &data_ break; case ConstraintType::UNIQUE: { auto &unique = constraint->Cast(); - constraint_type = unique.is_primary_key ? "PRIMARY KEY" : "UNIQUE"; + constraint_type = unique.IsPrimaryKey() ? "PRIMARY KEY" : "UNIQUE"; break; } case ConstraintType::NOT_NULL: diff --git a/src/duckdb/src/function/table/system/duckdb_databases.cpp b/src/duckdb/src/function/table/system/duckdb_databases.cpp index 79a8e432..f0a1fc99 100644 --- a/src/duckdb/src/function/table/system/duckdb_databases.cpp +++ b/src/duckdb/src/function/table/system/duckdb_databases.cpp @@ -32,6 +32,9 @@ static unique_ptr DuckDBDatabasesBind(ClientContext &context, Tabl names.emplace_back("type"); return_types.emplace_back(LogicalType::VARCHAR); + names.emplace_back("readonly"); + return_types.emplace_back(LogicalType::BOOLEAN); + return nullptr; } @@ -64,8 +67,9 @@ void DuckDBDatabasesFunction(ClientContext &context, TableFunctionInput &data_p, output.SetValue(col++, count, attached.GetName()); // database_oid, BIGINT output.SetValue(col++, count, Value::BIGINT(attached.oid)); - // path, VARCHAR bool is_internal = attached.IsSystem() || attached.IsTemporary(); + bool is_readonly = attached.IsReadOnly(); + // path, VARCHAR Value db_path; if (!is_internal) { bool in_memory = attached.GetCatalog().InMemory(); @@ -80,6 +84,8 @@ void DuckDBDatabasesFunction(ClientContext &context, TableFunctionInput &data_p, output.SetValue(col++, count, Value::BOOLEAN(is_internal)); // type, VARCHAR output.SetValue(col++, count, Value(attached.GetCatalog().GetCatalogType())); + // readonly, BOOLEAN + output.SetValue(col++, count, Value::BOOLEAN(is_readonly)); count++; } diff --git a/src/duckdb/src/function/table/system/duckdb_extensions.cpp b/src/duckdb/src/function/table/system/duckdb_extensions.cpp index 75cfc537..7a2f4510 100644 --- a/src/duckdb/src/function/table/system/duckdb_extensions.cpp +++ b/src/duckdb/src/function/table/system/duckdb_extensions.cpp @@ -17,6 +17,7 @@ struct ExtensionInformation { string file_path; string description; vector aliases; + string extension_version; }; struct DuckDBExtensionsData : public GlobalTableFunctionState { @@ -47,6 +48,9 @@ static unique_ptr DuckDBExtensionsBind(ClientContext &context, Tab names.emplace_back("aliases"); return_types.emplace_back(LogicalType::LIST(LogicalType::VARCHAR)); + names.emplace_back("extension_version"); + return_types.emplace_back(LogicalType::VARCHAR); + return nullptr; } @@ -98,16 +102,20 @@ unique_ptr DuckDBExtensionsInit(ClientContext &context }); #endif // now check the list of currently loaded extensions - auto &loaded_extensions = db.LoadedExtensions(); - for (auto &ext_name : loaded_extensions) { + auto &loaded_extensions = db.LoadedExtensionsData(); + for (auto &e : loaded_extensions) { + auto &ext_name = e.first; + auto &ext_info = e.second; auto entry = installed_extensions.find(ext_name); if (entry == installed_extensions.end()) { ExtensionInformation info; info.name = ext_name; info.loaded = true; + info.extension_version = ext_info.extension_version; installed_extensions[ext_name] = std::move(info); } else { entry->second.loaded = true; + entry->second.extension_version = ext_info.extension_version; } } @@ -143,6 +151,8 @@ void DuckDBExtensionsFunction(ClientContext &context, TableFunctionInput &data_p output.SetValue(4, count, Value(entry.description)); // aliases LogicalType::LIST(LogicalType::VARCHAR) output.SetValue(5, count, Value::LIST(LogicalType::VARCHAR, entry.aliases)); + // extension version LogicalType::LIST(LogicalType::VARCHAR) + output.SetValue(6, count, Value(entry.extension_version)); data.offset++; count++; diff --git a/src/duckdb/src/function/table/system/duckdb_sequences.cpp b/src/duckdb/src/function/table/system/duckdb_sequences.cpp index 7a38e1c6..484129be 100644 --- a/src/duckdb/src/function/table/system/duckdb_sequences.cpp +++ b/src/duckdb/src/function/table/system/duckdb_sequences.cpp @@ -122,8 +122,7 @@ void DuckDBSequencesFunction(ClientContext &context, TableFunctionInput &data_p, // cycle, BOOLEAN output.SetValue(col++, count, Value::BOOLEAN(seq_data.cycle)); // last_value, BIGINT - output.SetValue(col++, count, - seq_data.usage_count == 0 ? Value() : Value::BOOLEAN(NumericCast(seq_data.last_value))); + output.SetValue(col++, count, seq_data.usage_count == 0 ? Value() : Value::BIGINT(seq_data.last_value)); // sql, LogicalType::VARCHAR output.SetValue(col++, count, Value(seq.ToSQL())); diff --git a/src/duckdb/src/function/table/system/duckdb_tables.cpp b/src/duckdb/src/function/table/system/duckdb_tables.cpp index 256badef..e96c8c50 100644 --- a/src/duckdb/src/function/table/system/duckdb_tables.cpp +++ b/src/duckdb/src/function/table/system/duckdb_tables.cpp @@ -87,7 +87,7 @@ static bool TableHasPrimaryKey(TableCatalogEntry &table) { for (auto &constraint : table.GetConstraints()) { if (constraint->type == ConstraintType::UNIQUE) { auto &unique = constraint->Cast(); - if (unique.is_primary_key) { + if (unique.IsPrimaryKey()) { return true; } } @@ -146,7 +146,7 @@ void DuckDBTablesFunction(ClientContext &context, TableFunctionInput &data_p, Da output.SetValue(col++, count, Value::BOOLEAN(TableHasPrimaryKey(table))); // estimated_size, LogicalType::BIGINT Value card_val = - storage_info.cardinality == DConstants::INVALID_INDEX ? Value() : Value::BIGINT(storage_info.cardinality); + !storage_info.cardinality.IsValid() ? Value() : Value::BIGINT(storage_info.cardinality.GetIndex()); output.SetValue(col++, count, card_val); // column_count, LogicalType::BIGINT output.SetValue(col++, count, Value::BIGINT(table.GetColumns().LogicalColumnCount())); diff --git a/src/duckdb/src/function/table/system/pragma_metadata_info.cpp b/src/duckdb/src/function/table/system/pragma_metadata_info.cpp index 92c18030..d6717a9d 100644 --- a/src/duckdb/src/function/table/system/pragma_metadata_info.cpp +++ b/src/duckdb/src/function/table/system/pragma_metadata_info.cpp @@ -34,8 +34,15 @@ static unique_ptr PragmaMetadataInfoBind(ClientContext &context, T names.emplace_back("free_list"); return_types.emplace_back(LogicalType::LIST(LogicalType::BIGINT)); - string db_name = - input.inputs.empty() ? DatabaseManager::GetDefaultDatabase(context) : StringValue::Get(input.inputs[0]); + string db_name; + if (input.inputs.empty()) { + db_name = DatabaseManager::GetDefaultDatabase(context); + } else { + if (input.inputs[0].IsNull()) { + throw BinderException("Database argument for pragma_metadata_info cannot be NULL"); + } + db_name = StringValue::Get(input.inputs[0]); + } auto &catalog = Catalog::GetCatalog(context, db_name); auto result = make_uniq(); result->metadata_info = catalog.GetMetadataInfo(context); diff --git a/src/duckdb/src/function/table/system/pragma_table_info.cpp b/src/duckdb/src/function/table/system/pragma_table_info.cpp index 64ff4694..3e47ff39 100644 --- a/src/duckdb/src/function/table/system/pragma_table_info.cpp +++ b/src/duckdb/src/function/table/system/pragma_table_info.cpp @@ -195,12 +195,16 @@ static ColumnConstraintInfo CheckConstraints(TableCatalogEntry &table, const Col } case ConstraintType::UNIQUE: { auto &unique = constraint->Cast(); - bool &constraint_info = unique.is_primary_key ? result.pk : result.unique; - if (unique.index == column.Logical()) { - constraint_info = true; - } - if (std::find(unique.columns.begin(), unique.columns.end(), column.GetName()) != unique.columns.end()) { - constraint_info = true; + bool &constraint_info = unique.IsPrimaryKey() ? result.pk : result.unique; + if (unique.HasIndex()) { + if (unique.GetIndex() == column.Logical()) { + constraint_info = true; + } + } else { + auto &columns = unique.GetColumnNames(); + if (std::find(columns.begin(), columns.end(), column.GetName()) != columns.end()) { + constraint_info = true; + } } break; } diff --git a/src/duckdb/src/function/table/table_scan.cpp b/src/duckdb/src/function/table/table_scan.cpp index 17bf55f7..26a98437 100644 --- a/src/duckdb/src/function/table/table_scan.cpp +++ b/src/duckdb/src/function/table/table_scan.cpp @@ -193,7 +193,7 @@ BindInfo TableScanGetBindInfo(const optional_ptr bind_data_p) { return BindInfo(bind_data.table); } -void TableScanDependency(DependencyList &entries, const FunctionData *bind_data_p) { +void TableScanDependency(LogicalDependencyList &entries, const FunctionData *bind_data_p) { auto &bind_data = bind_data_p->Cast(); entries.AddDependency(bind_data.table); } @@ -306,9 +306,6 @@ void TableScanPushdownComplexFilter(ClientContext &context, LogicalGet &get, Fun return; } - // Lazily initialize any unknown indexes that might have been loaded by an extension - storage.info->InitializeIndexes(context); - // behold storage.info->indexes.Scan([&](Index &index) { // first rewrite the index expression so the ColumnBindings align with the column bindings of the current table diff --git a/src/duckdb/src/function/table/version/pragma_version.cpp b/src/duckdb/src/function/table/version/pragma_version.cpp index e8cdb239..3f50f4b3 100644 --- a/src/duckdb/src/function/table/version/pragma_version.cpp +++ b/src/duckdb/src/function/table/version/pragma_version.cpp @@ -1,5 +1,5 @@ #ifndef DUCKDB_PATCH_VERSION -#define DUCKDB_PATCH_VERSION "1" +#define DUCKDB_PATCH_VERSION "2" #endif #ifndef DUCKDB_MINOR_VERSION #define DUCKDB_MINOR_VERSION 10 @@ -8,10 +8,10 @@ #define DUCKDB_MAJOR_VERSION 0 #endif #ifndef DUCKDB_VERSION -#define DUCKDB_VERSION "v0.10.1" +#define DUCKDB_VERSION "v0.10.2" #endif #ifndef DUCKDB_SOURCE_ID -#define DUCKDB_SOURCE_ID "4a89d97db8" +#define DUCKDB_SOURCE_ID "1601d94f94" #endif #include "duckdb/function/table/system_functions.hpp" #include "duckdb/main/database.hpp" diff --git a/src/duckdb/src/include/duckdb/catalog/catalog.hpp b/src/duckdb/src/include/duckdb/catalog/catalog.hpp index f8a26463..31098ba1 100644 --- a/src/duckdb/src/include/duckdb/catalog/catalog.hpp +++ b/src/duckdb/src/include/duckdb/catalog/catalog.hpp @@ -16,6 +16,7 @@ #include "duckdb/common/atomic.hpp" #include "duckdb/common/optional_ptr.hpp" #include "duckdb/common/enums/on_entry_not_found.hpp" +#include "duckdb/common/error_data.hpp" #include "duckdb/common/exception/catalog_exception.hpp" #include "duckdb/common/enums/catalog_lookup_behavior.hpp" #include @@ -90,6 +91,7 @@ class Catalog { DUCKDB_API static Catalog &GetCatalog(AttachedDatabase &db); DUCKDB_API AttachedDatabase &GetAttached(); + DUCKDB_API const AttachedDatabase &GetAttached() const; DUCKDB_API DatabaseInstance &GetDatabase(); virtual bool IsDuckCatalog() { @@ -106,7 +108,7 @@ class Catalog { DUCKDB_API idx_t ModifyCatalog(); //! Returns the catalog name - based on how the catalog was attached - DUCKDB_API const string &GetName(); + DUCKDB_API const string &GetName() const; DUCKDB_API idx_t GetOid(); DUCKDB_API virtual string GetCatalogType() = 0; @@ -210,6 +212,7 @@ class Catalog { QueryErrorContext error_context = QueryErrorContext()); //! Scans all the schemas in the system one-by-one, invoking the callback for each entry DUCKDB_API virtual void ScanSchemas(ClientContext &context, std::function callback) = 0; + //! Gets the "schema.name" entry of the specified type, if entry does not exist behavior depends on OnEntryNotFound DUCKDB_API optional_ptr GetEntry(ClientContext &context, CatalogType type, const string &schema, const string &name, OnEntryNotFound if_not_found, @@ -324,6 +327,7 @@ class Catalog { //! Reference to the database AttachedDatabase &db; +public: private: //! Lookup an entry in the schema, returning a lookup with the entry and schema if they exist CatalogEntryLookup TryLookupEntryInternal(CatalogTransaction transaction, CatalogType type, const string &schema, @@ -364,7 +368,7 @@ class Catalog { template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; diff --git a/src/duckdb/src/include/duckdb/catalog/catalog_entry.hpp b/src/duckdb/src/include/duckdb/catalog/catalog_entry.hpp index 0ff1d6cf..29c46fa1 100644 --- a/src/duckdb/src/include/duckdb/catalog/catalog_entry.hpp +++ b/src/duckdb/src/include/duckdb/catalog/catalog_entry.hpp @@ -77,7 +77,9 @@ class CatalogEntry { virtual string ToSQL() const; virtual Catalog &ParentCatalog(); + virtual const Catalog &ParentCatalog() const; virtual SchemaCatalogEntry &ParentSchema(); + virtual const SchemaCatalogEntry &ParentSchema() const; virtual void Verify(Catalog &catalog); @@ -100,7 +102,7 @@ class CatalogEntry { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -117,6 +119,9 @@ class InCatalogEntry : public CatalogEntry { Catalog &ParentCatalog() override { return catalog; } + const Catalog &ParentCatalog() const override { + return catalog; + } void Verify(Catalog &catalog) override; }; diff --git a/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_index_entry.hpp b/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_index_entry.hpp index 44923729..3245d0a7 100644 --- a/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_index_entry.hpp +++ b/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_index_entry.hpp @@ -29,7 +29,7 @@ class DuckIndexEntry : public IndexCatalogEntry { //! Create a DuckIndexEntry DuckIndexEntry(Catalog &catalog, SchemaCatalogEntry &schema, CreateIndexInfo &info); - virtual unique_ptr Copy(ClientContext &context) const override; + unique_ptr Copy(ClientContext &context) const override; //! The indexed table information shared_ptr info; diff --git a/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_schema_entry.hpp b/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_schema_entry.hpp index 01ef6fcf..33bbd010 100644 --- a/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_schema_entry.hpp +++ b/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_schema_entry.hpp @@ -41,7 +41,7 @@ class DuckSchemaEntry : public SchemaCatalogEntry { optional_ptr AddEntry(CatalogTransaction transaction, unique_ptr entry, OnCreateConflict on_conflict); optional_ptr AddEntryInternal(CatalogTransaction transaction, unique_ptr entry, - OnCreateConflict on_conflict, DependencyList dependencies); + OnCreateConflict on_conflict, LogicalDependencyList dependencies); optional_ptr CreateTable(CatalogTransaction transaction, BoundCreateTableInfo &info) override; optional_ptr CreateFunction(CatalogTransaction transaction, CreateFunctionInfo &info) override; diff --git a/src/duckdb/src/include/duckdb/catalog/catalog_entry/sequence_catalog_entry.hpp b/src/duckdb/src/include/duckdb/catalog/catalog_entry/sequence_catalog_entry.hpp index f96e6b9e..ca2b4c47 100644 --- a/src/duckdb/src/include/duckdb/catalog/catalog_entry/sequence_catalog_entry.hpp +++ b/src/duckdb/src/include/duckdb/catalog/catalog_entry/sequence_catalog_entry.hpp @@ -58,7 +58,7 @@ class SequenceCatalogEntry : public StandardEntry { SequenceCatalogEntry(Catalog &catalog, SchemaCatalogEntry &schema, CreateSequenceInfo &info); public: - virtual unique_ptr Copy(ClientContext &context) const override; + unique_ptr Copy(ClientContext &context) const override; unique_ptr GetInfo() const override; SequenceData GetData() const; diff --git a/src/duckdb/src/include/duckdb/catalog/catalog_set.hpp b/src/duckdb/src/include/duckdb/catalog/catalog_set.hpp index b1c8de4b..aaef6af9 100644 --- a/src/duckdb/src/include/duckdb/catalog/catalog_set.hpp +++ b/src/duckdb/src/include/duckdb/catalog/catalog_set.hpp @@ -26,7 +26,7 @@ namespace duckdb { struct AlterInfo; class ClientContext; -class DependencyList; +class LogicalDependencyList; class DuckCatalog; class TableCatalogEntry; @@ -65,9 +65,9 @@ class CatalogSet { //! Create an entry in the catalog set. Returns whether or not it was //! successful. DUCKDB_API bool CreateEntry(CatalogTransaction transaction, const string &name, unique_ptr value, - const DependencyList &dependencies); + const LogicalDependencyList &dependencies); DUCKDB_API bool CreateEntry(ClientContext &context, const string &name, unique_ptr value, - const DependencyList &dependencies); + const LogicalDependencyList &dependencies); DUCKDB_API bool AlterEntry(CatalogTransaction transaction, const string &name, AlterInfo &alter_info); diff --git a/src/duckdb/src/include/duckdb/catalog/default/default_functions.hpp b/src/duckdb/src/include/duckdb/catalog/default/default_functions.hpp index c35d438f..bc05d206 100644 --- a/src/duckdb/src/include/duckdb/catalog/default/default_functions.hpp +++ b/src/duckdb/src/include/duckdb/catalog/default/default_functions.hpp @@ -27,15 +27,15 @@ class DefaultFunctionGenerator : public DefaultGenerator { SchemaCatalogEntry &schema; - DUCKDB_API static unique_ptr CreateInternalMacroInfo(DefaultMacro &default_macro); - DUCKDB_API static unique_ptr CreateInternalTableMacroInfo(DefaultMacro &default_macro); + DUCKDB_API static unique_ptr CreateInternalMacroInfo(const DefaultMacro &default_macro); + DUCKDB_API static unique_ptr CreateInternalTableMacroInfo(const DefaultMacro &default_macro); public: unique_ptr CreateDefaultEntry(ClientContext &context, const string &entry_name) override; vector GetDefaultEntries() override; private: - static unique_ptr CreateInternalTableMacroInfo(DefaultMacro &default_macro, + static unique_ptr CreateInternalTableMacroInfo(const DefaultMacro &default_macro, unique_ptr function); }; diff --git a/src/duckdb/src/include/duckdb/catalog/dependency.hpp b/src/duckdb/src/include/duckdb/catalog/dependency.hpp index 301789e2..120b5fd7 100644 --- a/src/duckdb/src/include/duckdb/catalog/dependency.hpp +++ b/src/duckdb/src/include/duckdb/catalog/dependency.hpp @@ -10,17 +10,18 @@ #include "duckdb/common/common.hpp" #include "duckdb/common/unordered_set.hpp" +#include "duckdb/common/string_util.hpp" namespace duckdb { class CatalogEntry; struct DependencyFlags { -private: public: DependencyFlags() : value(0) { } DependencyFlags(const DependencyFlags &other) : value(other.value) { } + virtual ~DependencyFlags() = default; DependencyFlags &operator=(const DependencyFlags &other) { value = other.value; return *this; @@ -133,10 +134,31 @@ struct DependencyDependentFlags : public DependencyFlags { } }; +struct CatalogEntryInfo { +public: + CatalogType type; + string schema; + string name; + +public: + bool operator==(const CatalogEntryInfo &other) const { + if (other.type != type) { + return false; + } + if (!StringUtil::CIEquals(other.schema, schema)) { + return false; + } + if (!StringUtil::CIEquals(other.name, name)) { + return false; + } + return true; + } +}; + struct Dependency { - Dependency(CatalogEntry &entry, DependencyDependentFlags flags = DependencyDependentFlags().SetBlocking()) - : // NOLINT: Allow implicit conversion from `CatalogEntry` - entry(entry), flags(flags) { + Dependency(CatalogEntry &entry, // NOLINT: Allow implicit conversion from `CatalogEntry` + DependencyDependentFlags flags = DependencyDependentFlags().SetBlocking()) + : entry(entry), flags(std::move(flags)) { } //! The catalog entry this depends on diff --git a/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp b/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp index da90b009..ed08f01a 100644 --- a/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +++ b/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp @@ -9,23 +9,56 @@ #pragma once #include "duckdb/catalog/catalog_entry_map.hpp" +#include "duckdb/common/types/hash.hpp" +#include "duckdb/common/enums/catalog_type.hpp" +#include "duckdb/catalog/dependency.hpp" namespace duckdb { class Catalog; class CatalogEntry; -class DependencySetCatalogEntry; +struct CreateInfo; +class SchemaCatalogEntry; +struct CatalogTransaction; +class LogicalDependencyList; -//! The DependencyList -class DependencyList { - friend class DependencyManager; - friend class DependencySetCatalogEntry; +//! A minimal representation of a CreateInfo / CatalogEntry +//! enough to look up the entry inside SchemaCatalogEntry::GetEntry +struct LogicalDependency { +public: + CatalogEntryInfo entry; + string catalog; + +public: + explicit LogicalDependency(CatalogEntry &entry); + LogicalDependency(); + bool operator==(const LogicalDependency &other) const; +}; + +struct LogicalDependencyHashFunction { + uint64_t operator()(const LogicalDependency &a) const; +}; + +struct LogicalDependencyEquality { + bool operator()(const LogicalDependency &a, const LogicalDependency &b) const; +}; + +//! The DependencyList containing LogicalDependency objects, not looked up in the catalog yet +class LogicalDependencyList { + using create_info_set_t = + unordered_set; public: DUCKDB_API void AddDependency(CatalogEntry &entry); + DUCKDB_API void AddDependency(const LogicalDependency &entry); + DUCKDB_API bool Contains(CatalogEntry &entry); +public: DUCKDB_API void VerifyDependencies(Catalog &catalog, const string &name); + bool operator==(const LogicalDependencyList &other) const; + const create_info_set_t &Set() const; private: - catalog_entry_set_t set; + create_info_set_t set; }; + } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/catalog/dependency_manager.hpp b/src/duckdb/src/include/duckdb/catalog/dependency_manager.hpp index f7454f18..e580bfcc 100644 --- a/src/duckdb/src/include/duckdb/catalog/dependency_manager.hpp +++ b/src/duckdb/src/include/duckdb/catalog/dependency_manager.hpp @@ -13,21 +13,16 @@ #include "duckdb/catalog/dependency.hpp" #include "duckdb/catalog/catalog_entry_map.hpp" #include "duckdb/catalog/catalog_transaction.hpp" +#include "duckdb/common/stack.hpp" +#include "duckdb/common/string_util.hpp" #include namespace duckdb { class DuckCatalog; class ClientContext; -class DependencyList; class DependencyEntry; -class DependencySetCatalogEntry; - -struct CatalogEntryInfo { - CatalogType type; - string schema; - string name; -}; +class LogicalDependencyList; // The subject of this dependency struct DependencySubject { @@ -57,12 +52,20 @@ struct DependencyInfo { struct MangledEntryName { public: - MangledEntryName(const CatalogEntryInfo &info); + explicit MangledEntryName(const CatalogEntryInfo &info); MangledEntryName() = delete; public: //! Format: Type\0Schema\0Name string name; + +public: + bool operator==(const MangledEntryName &other) const { + return StringUtil::CIEquals(other.name, name); + } + bool operator!=(const MangledEntryName &other) const { + return !(*this == other); + } }; struct MangledDependencyName { @@ -78,7 +81,6 @@ struct MangledDependencyName { //! The DependencyManager is in charge of managing dependencies between catalog entries class DependencyManager { friend class CatalogSet; - friend class DependencySetCatalogEntry; public: explicit DependencyManager(DuckCatalog &catalog); @@ -96,24 +98,27 @@ class DependencyManager { private: bool IsSystemEntry(CatalogEntry &entry) const; + optional_ptr LookupEntry(CatalogTransaction transaction, const LogicalDependency &dependency); optional_ptr LookupEntry(CatalogTransaction transaction, CatalogEntry &dependency); void CleanupDependencies(CatalogTransaction transaction, CatalogEntry &entry); public: - static string GetSchema(CatalogEntry &entry); + static string GetSchema(const CatalogEntry &entry); static MangledEntryName MangleName(const CatalogEntryInfo &info); - static MangledEntryName MangleName(CatalogEntry &entry); - static CatalogEntryInfo GetLookupProperties(CatalogEntry &entry); + static MangledEntryName MangleName(const CatalogEntry &entry); + static CatalogEntryInfo GetLookupProperties(const CatalogEntry &entry); private: - void AddObject(CatalogTransaction transaction, CatalogEntry &object, const DependencyList &dependencies); + void AddObject(CatalogTransaction transaction, CatalogEntry &object, const LogicalDependencyList &dependencies); void DropObject(CatalogTransaction transaction, CatalogEntry &object, bool cascade); void AlterObject(CatalogTransaction transaction, CatalogEntry &old_obj, CatalogEntry &new_obj); private: void RemoveDependency(CatalogTransaction transaction, const DependencyInfo &info); void CreateDependency(CatalogTransaction transaction, DependencyInfo &info); + void CreateDependencies(CatalogTransaction transaction, const CatalogEntry &object, + const LogicalDependencyList &dependencies); using dependency_entry_func_t = const std::function( Catalog &catalog, const DependencyDependent &dependent, const DependencySubject &dependency)>; diff --git a/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp b/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp index 26cf9b86..3685f7ae 100644 --- a/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +++ b/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp @@ -16,7 +16,7 @@ namespace duckdb { class DuckCatalog : public Catalog { public: explicit DuckCatalog(AttachedDatabase &db); - ~DuckCatalog(); + ~DuckCatalog() override; public: bool IsDuckCatalog() override; diff --git a/src/duckdb/src/include/duckdb/catalog/standard_entry.hpp b/src/duckdb/src/include/duckdb/catalog/standard_entry.hpp index 42107967..cab74168 100644 --- a/src/duckdb/src/include/duckdb/catalog/standard_entry.hpp +++ b/src/duckdb/src/include/duckdb/catalog/standard_entry.hpp @@ -9,6 +9,7 @@ #pragma once #include "duckdb/catalog/catalog_entry.hpp" +#include "duckdb/catalog/dependency_list.hpp" namespace duckdb { class SchemaCatalogEntry; @@ -29,6 +30,9 @@ class StandardEntry : public InCatalogEntry { SchemaCatalogEntry &ParentSchema() override { return schema; } + const SchemaCatalogEntry &ParentSchema() const override { + return schema; + } }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/allocator.hpp b/src/duckdb/src/include/duckdb/common/allocator.hpp index ada13212..ac27d267 100644 --- a/src/duckdb/src/include/duckdb/common/allocator.hpp +++ b/src/duckdb/src/include/duckdb/common/allocator.hpp @@ -36,7 +36,7 @@ struct PrivateAllocatorData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -58,10 +58,10 @@ class AllocatedData { DUCKDB_API AllocatedData(AllocatedData &&other) noexcept; DUCKDB_API AllocatedData &operator=(AllocatedData &&) noexcept; - data_ptr_t get() { + data_ptr_t get() { // NOLINT: matching std style return pointer; } - const_data_ptr_t get() const { + const_data_ptr_t get() const { // NOLINT: matching std style return pointer; } idx_t GetSize() const { diff --git a/src/duckdb/src/include/duckdb/common/arrow/arrow_wrapper.hpp b/src/duckdb/src/include/duckdb/common/arrow/arrow_wrapper.hpp index 8b651156..71bc8d6f 100644 --- a/src/duckdb/src/include/duckdb/common/arrow/arrow_wrapper.hpp +++ b/src/duckdb/src/include/duckdb/common/arrow/arrow_wrapper.hpp @@ -35,7 +35,7 @@ class ArrowArrayWrapper { arrow_array.length = 0; arrow_array.release = nullptr; } - ArrowArrayWrapper(ArrowArrayWrapper &&other) : arrow_array(other.arrow_array) { + ArrowArrayWrapper(ArrowArrayWrapper &&other) noexcept : arrow_array(other.arrow_array) { other.arrow_array.release = nullptr; } ~ArrowArrayWrapper(); diff --git a/src/duckdb/src/include/duckdb/common/bit_utils.hpp b/src/duckdb/src/include/duckdb/common/bit_utils.hpp index 28bc4a97..3c4f4a6b 100644 --- a/src/duckdb/src/include/duckdb/common/bit_utils.hpp +++ b/src/duckdb/src/include/duckdb/common/bit_utils.hpp @@ -11,7 +11,7 @@ #include "duckdb/common/hugeint.hpp" #include "duckdb/common/uhugeint.hpp" -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) #define __restrict__ #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ #define __ORDER_LITTLE_ENDIAN__ 2 diff --git a/src/duckdb/src/include/duckdb/common/box_renderer.hpp b/src/duckdb/src/include/duckdb/common/box_renderer.hpp index df6c24c9..fa9493ef 100644 --- a/src/duckdb/src/include/duckdb/common/box_renderer.hpp +++ b/src/duckdb/src/include/duckdb/common/box_renderer.hpp @@ -37,22 +37,22 @@ struct BoxRendererConfig { RenderMode render_mode = RenderMode::ROWS; #ifndef DUCKDB_ASCII_TREE_RENDERER - const char *LTCORNER = "\342\224\214"; // "┌"; - const char *RTCORNER = "\342\224\220"; // "┐"; - const char *LDCORNER = "\342\224\224"; // "└"; - const char *RDCORNER = "\342\224\230"; // "┘"; - - const char *MIDDLE = "\342\224\274"; // "┼"; - const char *TMIDDLE = "\342\224\254"; // "┬"; - const char *LMIDDLE = "\342\224\234"; // "├"; - const char *RMIDDLE = "\342\224\244"; // "┤"; - const char *DMIDDLE = "\342\224\264"; // "┴"; - - const char *VERTICAL = "\342\224\202"; // "│"; - const char *HORIZONTAL = "\342\224\200"; // "─"; - - const char *DOTDOTDOT = "\xE2\x80\xA6"; // "…"; - const char *DOT = "\xC2\xB7"; // "·"; + const char *LTCORNER = "\342\224\214"; // NOLINT: "┌"; + const char *RTCORNER = "\342\224\220"; // NOLINT: "┐"; + const char *LDCORNER = "\342\224\224"; // NOLINT: "└"; + const char *RDCORNER = "\342\224\230"; // NOLINT: "┘"; + + const char *MIDDLE = "\342\224\274"; // NOLINT: "┼"; + const char *TMIDDLE = "\342\224\254"; // NOLINT: "┬"; + const char *LMIDDLE = "\342\224\234"; // NOLINT: "├"; + const char *RMIDDLE = "\342\224\244"; // NOLINT: "┤"; + const char *DMIDDLE = "\342\224\264"; // NOLINT: "┴"; + + const char *VERTICAL = "\342\224\202"; // NOLINT: "│"; + const char *HORIZONTAL = "\342\224\200"; // NOLINT: "─"; + + const char *DOTDOTDOT = "\xE2\x80\xA6"; // NOLINT: "…"; + const char *DOT = "\xC2\xB7"; // NOLINT: "·"; const idx_t DOTDOTDOT_LENGTH = 1; #else diff --git a/src/duckdb/src/include/duckdb/common/crypto/md5.hpp b/src/duckdb/src/include/duckdb/common/crypto/md5.hpp index 856015c3..ab3134ff 100644 --- a/src/duckdb/src/include/duckdb/common/crypto/md5.hpp +++ b/src/duckdb/src/include/duckdb/common/crypto/md5.hpp @@ -41,7 +41,6 @@ class MD5Context { private: void MD5Update(const_data_ptr_t data, idx_t len); - static void DigestToBase16(const_data_ptr_t digest, char *zBuf); uint32_t buf[4]; uint32_t bits[2]; diff --git a/src/duckdb/src/include/duckdb/common/enum_util.hpp b/src/duckdb/src/include/duckdb/common/enum_util.hpp index 858a250b..81b670cd 100644 --- a/src/duckdb/src/include/duckdb/common/enum_util.hpp +++ b/src/duckdb/src/include/duckdb/common/enum_util.hpp @@ -58,6 +58,8 @@ enum class AppenderType : uint8_t; enum class ArrowDateTimeType : uint8_t; +enum class ArrowOffsetSize : uint8_t; + enum class ArrowVariableSizeType : uint8_t; enum class BindingMode : uint8_t; @@ -112,6 +114,8 @@ enum class ErrorType : uint16_t; enum class ExceptionFormatValueType : uint8_t; +enum class ExceptionType : uint8_t; + enum class ExplainOutputType : uint8_t; enum class ExplainType : uint8_t; @@ -122,6 +126,8 @@ enum class ExpressionType : uint8_t; enum class ExtensionLoadResult : uint8_t; +enum class ExternalDependenciesType : uint8_t; + enum class ExtraDropInfoType : uint8_t; enum class ExtraTypeInfoType : uint8_t; @@ -236,6 +242,8 @@ enum class ResultModifierType : uint8_t; enum class SampleMethod : uint8_t; +enum class ScanType : uint8_t; + enum class SecretDisplayType : uint8_t; enum class SecretPersistType : uint8_t; @@ -356,6 +364,9 @@ const char* EnumUtil::ToChars(AppenderType value); template<> const char* EnumUtil::ToChars(ArrowDateTimeType value); +template<> +const char* EnumUtil::ToChars(ArrowOffsetSize value); + template<> const char* EnumUtil::ToChars(ArrowVariableSizeType value); @@ -437,6 +448,9 @@ const char* EnumUtil::ToChars(ErrorType value); template<> const char* EnumUtil::ToChars(ExceptionFormatValueType value); +template<> +const char* EnumUtil::ToChars(ExceptionType value); + template<> const char* EnumUtil::ToChars(ExplainOutputType value); @@ -452,6 +466,9 @@ const char* EnumUtil::ToChars(ExpressionType value); template<> const char* EnumUtil::ToChars(ExtensionLoadResult value); +template<> +const char* EnumUtil::ToChars(ExternalDependenciesType value); + template<> const char* EnumUtil::ToChars(ExtraDropInfoType value); @@ -623,6 +640,9 @@ const char* EnumUtil::ToChars(ResultModifierType value); template<> const char* EnumUtil::ToChars(SampleMethod value); +template<> +const char* EnumUtil::ToChars(ScanType value); + template<> const char* EnumUtil::ToChars(SecretDisplayType value); @@ -783,6 +803,9 @@ AppenderType EnumUtil::FromString(const char *value); template<> ArrowDateTimeType EnumUtil::FromString(const char *value); +template<> +ArrowOffsetSize EnumUtil::FromString(const char *value); + template<> ArrowVariableSizeType EnumUtil::FromString(const char *value); @@ -864,6 +887,9 @@ ErrorType EnumUtil::FromString(const char *value); template<> ExceptionFormatValueType EnumUtil::FromString(const char *value); +template<> +ExceptionType EnumUtil::FromString(const char *value); + template<> ExplainOutputType EnumUtil::FromString(const char *value); @@ -879,6 +905,9 @@ ExpressionType EnumUtil::FromString(const char *value); template<> ExtensionLoadResult EnumUtil::FromString(const char *value); +template<> +ExternalDependenciesType EnumUtil::FromString(const char *value); + template<> ExtraDropInfoType EnumUtil::FromString(const char *value); @@ -1050,6 +1079,9 @@ ResultModifierType EnumUtil::FromString(const char *value); template<> SampleMethod EnumUtil::FromString(const char *value); +template<> +ScanType EnumUtil::FromString(const char *value); + template<> SecretDisplayType EnumUtil::FromString(const char *value); diff --git a/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp b/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp index 0b6516de..858781aa 100644 --- a/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +++ b/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp @@ -145,7 +145,8 @@ enum class ExpressionType : uint8_t { COLLATE = 230, LAMBDA = 231, POSITIONAL_REFERENCE = 232, - BOUND_LAMBDA_REF = 233 + BOUND_LAMBDA_REF = 233, + BOUND_EXPANDED = 234 }; //===--------------------------------------------------------------------===// @@ -199,7 +200,8 @@ enum class ExpressionClass : uint8_t { //===--------------------------------------------------------------------===// // Miscellaneous //===--------------------------------------------------------------------===// - BOUND_EXPRESSION = 50 + BOUND_EXPRESSION = 50, + BOUND_EXPANDED = 51 }; DUCKDB_API string ExpressionTypeToString(ExpressionType type); diff --git a/src/duckdb/src/include/duckdb/common/exception.hpp b/src/duckdb/src/include/duckdb/common/exception.hpp index 2e45cb92..3765c6ba 100644 --- a/src/duckdb/src/include/duckdb/common/exception.hpp +++ b/src/duckdb/src/include/duckdb/common/exception.hpp @@ -25,10 +25,10 @@ class ParsedExpression; class QueryErrorContext; class TableRef; struct hugeint_t; -class optional_idx; +class optional_idx; // NOLINT: matching std style -inline void assert_restrict_function(const void *left_start, const void *left_end, const void *right_start, - const void *right_end, const char *fname, int linenr) { +inline void AssertRestrictFunction(const void *left_start, const void *left_end, const void *right_start, + const void *right_end, const char *fname, int linenr) { // assert that the two pointers do not overlap #ifdef DEBUG if (!(left_end <= right_start || right_end <= left_start)) { @@ -39,13 +39,13 @@ inline void assert_restrict_function(const void *left_start, const void *left_en } #define ASSERT_RESTRICT(left_start, left_end, right_start, right_end) \ - assert_restrict_function(left_start, left_end, right_start, right_end, __FILE__, __LINE__) + AssertRestrictFunction(left_start, left_end, right_start, right_end, __FILE__, __LINE__) //===--------------------------------------------------------------------===// // Exception Types //===--------------------------------------------------------------------===// -enum class ExceptionType { +enum class ExceptionType : uint8_t { INVALID = 0, // invalid type OUT_OF_RANGE = 1, // value out of range error CONVERSION = 2, // conversion/casting error @@ -100,11 +100,12 @@ class Exception : public std::runtime_error { DUCKDB_API static string ExceptionTypeToString(ExceptionType type); DUCKDB_API static ExceptionType StringToExceptionType(const string &type); - template - static string ConstructMessage(const string &msg, Args... params) { - const std::size_t num_args = sizeof...(Args); - if (num_args == 0) + template + static string ConstructMessage(const string &msg, ARGS... params) { + const std::size_t num_args = sizeof...(ARGS); + if (num_args == 0) { return msg; + } std::vector values; return ConstructMessageRecursive(msg, values, params...); } @@ -126,9 +127,9 @@ class Exception : public std::runtime_error { DUCKDB_API static string ConstructMessageRecursive(const string &msg, std::vector &values); - template + template static string ConstructMessageRecursive(const string &msg, std::vector &values, T param, - Args... params) { + ARGS... params) { values.push_back(ExceptionFormatValue::CreateFormatValue(param)); return ConstructMessageRecursive(msg, values, params...); } @@ -136,7 +137,7 @@ class Exception : public std::runtime_error { DUCKDB_API static bool UncaughtException(); DUCKDB_API static string GetStackTrace(int max_depth = 120); - static string FormatStackTrace(string message = "") { + static string FormatStackTrace(const string &message = "") { return (message + "\n" + GetStackTrace()); } @@ -150,8 +151,8 @@ class ConnectionException : public Exception { public: DUCKDB_API explicit ConnectionException(const string &msg); - template - explicit ConnectionException(const string &msg, Args... params) + template + explicit ConnectionException(const string &msg, ARGS... params) : ConnectionException(ConstructMessage(msg, params...)) { } }; @@ -160,8 +161,8 @@ class PermissionException : public Exception { public: DUCKDB_API explicit PermissionException(const string &msg); - template - explicit PermissionException(const string &msg, Args... params) + template + explicit PermissionException(const string &msg, ARGS... params) : PermissionException(ConstructMessage(msg, params...)) { } }; @@ -170,22 +171,22 @@ class OutOfRangeException : public Exception { public: DUCKDB_API explicit OutOfRangeException(const string &msg); - template - explicit OutOfRangeException(const string &msg, Args... params) + template + explicit OutOfRangeException(const string &msg, ARGS... params) : OutOfRangeException(ConstructMessage(msg, params...)) { } - DUCKDB_API OutOfRangeException(const int64_t value, const PhysicalType origType, const PhysicalType newType); - DUCKDB_API OutOfRangeException(const hugeint_t value, const PhysicalType origType, const PhysicalType newType); - DUCKDB_API OutOfRangeException(const double value, const PhysicalType origType, const PhysicalType newType); - DUCKDB_API OutOfRangeException(const PhysicalType varType, const idx_t length); + DUCKDB_API OutOfRangeException(const int64_t value, const PhysicalType orig_type, const PhysicalType new_type); + DUCKDB_API OutOfRangeException(const hugeint_t value, const PhysicalType orig_type, const PhysicalType new_type); + DUCKDB_API OutOfRangeException(const double value, const PhysicalType orig_type, const PhysicalType new_type); + DUCKDB_API OutOfRangeException(const PhysicalType var_type, const idx_t length); }; class OutOfMemoryException : public Exception { public: DUCKDB_API explicit OutOfMemoryException(const string &msg); - template - explicit OutOfMemoryException(const string &msg, Args... params) + template + explicit OutOfMemoryException(const string &msg, ARGS... params) : OutOfMemoryException(ConstructMessage(msg, params...)) { } }; @@ -194,8 +195,8 @@ class SyntaxException : public Exception { public: DUCKDB_API explicit SyntaxException(const string &msg); - template - explicit SyntaxException(const string &msg, Args... params) : SyntaxException(ConstructMessage(msg, params...)) { + template + explicit SyntaxException(const string &msg, ARGS... params) : SyntaxException(ConstructMessage(msg, params...)) { } }; @@ -203,8 +204,8 @@ class ConstraintException : public Exception { public: DUCKDB_API explicit ConstraintException(const string &msg); - template - explicit ConstraintException(const string &msg, Args... params) + template + explicit ConstraintException(const string &msg, ARGS... params) : ConstraintException(ConstructMessage(msg, params...)) { } }; @@ -213,8 +214,8 @@ class DependencyException : public Exception { public: DUCKDB_API explicit DependencyException(const string &msg); - template - explicit DependencyException(const string &msg, Args... params) + template + explicit DependencyException(const string &msg, ARGS... params) : DependencyException(ConstructMessage(msg, params...)) { } }; @@ -226,12 +227,12 @@ class IOException : public Exception { explicit IOException(ExceptionType exception_type, const string &msg) : Exception(exception_type, msg) { } - template - explicit IOException(const string &msg, Args... params) : IOException(ConstructMessage(msg, params...)) { + template + explicit IOException(const string &msg, ARGS... params) : IOException(ConstructMessage(msg, params...)) { } - template - explicit IOException(const string &msg, const unordered_map &extra_info, Args... params) + template + explicit IOException(const string &msg, const unordered_map &extra_info, ARGS... params) : IOException(ConstructMessage(msg, params...), extra_info) { } }; @@ -240,8 +241,8 @@ class MissingExtensionException : public Exception { public: DUCKDB_API explicit MissingExtensionException(const string &msg); - template - explicit MissingExtensionException(const string &msg, Args... params) + template + explicit MissingExtensionException(const string &msg, ARGS... params) : MissingExtensionException(ConstructMessage(msg, params...)) { } }; @@ -250,8 +251,8 @@ class NotImplementedException : public Exception { public: DUCKDB_API explicit NotImplementedException(const string &msg); - template - explicit NotImplementedException(const string &msg, Args... params) + template + explicit NotImplementedException(const string &msg, ARGS... params) : NotImplementedException(ConstructMessage(msg, params...)) { } }; @@ -265,8 +266,8 @@ class SerializationException : public Exception { public: DUCKDB_API explicit SerializationException(const string &msg); - template - explicit SerializationException(const string &msg, Args... params) + template + explicit SerializationException(const string &msg, ARGS... params) : SerializationException(ConstructMessage(msg, params...)) { } }; @@ -275,8 +276,8 @@ class SequenceException : public Exception { public: DUCKDB_API explicit SequenceException(const string &msg); - template - explicit SequenceException(const string &msg, Args... params) + template + explicit SequenceException(const string &msg, ARGS... params) : SequenceException(ConstructMessage(msg, params...)) { } }; @@ -290,14 +291,14 @@ class FatalException : public Exception { public: explicit FatalException(const string &msg) : FatalException(ExceptionType::FATAL, msg) { } - template - explicit FatalException(const string &msg, Args... params) : FatalException(ConstructMessage(msg, params...)) { + template + explicit FatalException(const string &msg, ARGS... params) : FatalException(ConstructMessage(msg, params...)) { } protected: DUCKDB_API explicit FatalException(ExceptionType type, const string &msg); - template - explicit FatalException(ExceptionType type, const string &msg, Args... params) + template + explicit FatalException(ExceptionType type, const string &msg, ARGS... params) : FatalException(type, ConstructMessage(msg, params...)) { } }; @@ -306,8 +307,8 @@ class InternalException : public Exception { public: DUCKDB_API explicit InternalException(const string &msg); - template - explicit InternalException(const string &msg, Args... params) + template + explicit InternalException(const string &msg, ARGS... params) : InternalException(ConstructMessage(msg, params...)) { } }; @@ -317,12 +318,12 @@ class InvalidInputException : public Exception { DUCKDB_API explicit InvalidInputException(const string &msg); DUCKDB_API explicit InvalidInputException(const string &msg, const unordered_map &extra_info); - template - explicit InvalidInputException(const string &msg, Args... params) + template + explicit InvalidInputException(const string &msg, ARGS... params) : InvalidInputException(ConstructMessage(msg, params...)) { } - template - explicit InvalidInputException(Expression &expr, const string &msg, Args... params) + template + explicit InvalidInputException(Expression &expr, const string &msg, ARGS... params) : InvalidInputException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(expr)) { } }; @@ -331,8 +332,7 @@ class InvalidTypeException : public Exception { public: DUCKDB_API InvalidTypeException(PhysicalType type, const string &msg); DUCKDB_API InvalidTypeException(const LogicalType &type, const string &msg); - DUCKDB_API - InvalidTypeException(const string &msg); //! Needed to be able to recreate the exception after it's been serialized + DUCKDB_API explicit InvalidTypeException(const string &msg); }; class TypeMismatchException : public Exception { @@ -341,16 +341,15 @@ class TypeMismatchException : public Exception { DUCKDB_API TypeMismatchException(const LogicalType &type_1, const LogicalType &type_2, const string &msg); DUCKDB_API TypeMismatchException(optional_idx error_location, const LogicalType &type_1, const LogicalType &type_2, const string &msg); - DUCKDB_API - TypeMismatchException(const string &msg); //! Needed to be able to recreate the exception after it's been serialized + DUCKDB_API explicit TypeMismatchException(const string &msg); }; class ParameterNotAllowedException : public Exception { public: DUCKDB_API explicit ParameterNotAllowedException(const string &msg); - template - explicit ParameterNotAllowedException(const string &msg, Args... params) + template + explicit ParameterNotAllowedException(const string &msg, ARGS... params) : ParameterNotAllowedException(ConstructMessage(msg, params...)) { } }; diff --git a/src/duckdb/src/include/duckdb/common/exception/binder_exception.hpp b/src/duckdb/src/include/duckdb/common/exception/binder_exception.hpp index 493e3e2f..cd5bfe9f 100644 --- a/src/duckdb/src/include/duckdb/common/exception/binder_exception.hpp +++ b/src/duckdb/src/include/duckdb/common/exception/binder_exception.hpp @@ -18,23 +18,27 @@ class BinderException : public Exception { DUCKDB_API explicit BinderException(const string &msg, const unordered_map &extra_info); DUCKDB_API explicit BinderException(const string &msg); - template - explicit BinderException(const string &msg, Args... params) : BinderException(ConstructMessage(msg, params...)) { + template + explicit BinderException(const string &msg, ARGS... params) : BinderException(ConstructMessage(msg, params...)) { } - template - explicit BinderException(const TableRef &ref, const string &msg, Args... params) + template + explicit BinderException(const TableRef &ref, const string &msg, ARGS... params) : BinderException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(ref)) { } - template - explicit BinderException(const ParsedExpression &expr, const string &msg, Args... params) + template + explicit BinderException(const ParsedExpression &expr, const string &msg, ARGS... params) : BinderException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(expr)) { } - template - explicit BinderException(QueryErrorContext error_context, const string &msg, Args... params) + template + explicit BinderException(const Expression &expr, const string &msg, ARGS... params) + : BinderException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(expr)) { + } + template + explicit BinderException(QueryErrorContext error_context, const string &msg, ARGS... params) : BinderException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(error_context)) { } - template - explicit BinderException(optional_idx error_location, const string &msg, Args... params) + template + explicit BinderException(optional_idx error_location, const string &msg, ARGS... params) : BinderException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(error_location)) { } diff --git a/src/duckdb/src/include/duckdb/common/exception/catalog_exception.hpp b/src/duckdb/src/include/duckdb/common/exception/catalog_exception.hpp index 1c993205..8b510d98 100644 --- a/src/duckdb/src/include/duckdb/common/exception/catalog_exception.hpp +++ b/src/duckdb/src/include/duckdb/common/exception/catalog_exception.hpp @@ -20,11 +20,11 @@ class CatalogException : public Exception { DUCKDB_API explicit CatalogException(const string &msg); DUCKDB_API explicit CatalogException(const string &msg, const unordered_map &extra_info); - template - explicit CatalogException(const string &msg, Args... params) : CatalogException(ConstructMessage(msg, params...)) { + template + explicit CatalogException(const string &msg, ARGS... params) : CatalogException(ConstructMessage(msg, params...)) { } - template - explicit CatalogException(QueryErrorContext error_context, const string &msg, Args... params) + template + explicit CatalogException(QueryErrorContext error_context, const string &msg, ARGS... params) : CatalogException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(error_context)) { } diff --git a/src/duckdb/src/include/duckdb/common/exception/conversion_exception.hpp b/src/duckdb/src/include/duckdb/common/exception/conversion_exception.hpp index 8feaec75..5330f46e 100644 --- a/src/duckdb/src/include/duckdb/common/exception/conversion_exception.hpp +++ b/src/duckdb/src/include/duckdb/common/exception/conversion_exception.hpp @@ -17,15 +17,15 @@ class ConversionException : public Exception { public: DUCKDB_API explicit ConversionException(const string &msg); DUCKDB_API explicit ConversionException(optional_idx error_location, const string &msg); - DUCKDB_API ConversionException(const PhysicalType origType, const PhysicalType newType); - DUCKDB_API ConversionException(const LogicalType &origType, const LogicalType &newType); + DUCKDB_API ConversionException(const PhysicalType orig_type, const PhysicalType new_type); + DUCKDB_API ConversionException(const LogicalType &orig_type, const LogicalType &new_type); - template - explicit ConversionException(const string &msg, Args... params) + template + explicit ConversionException(const string &msg, ARGS... params) : ConversionException(ConstructMessage(msg, params...)) { } - template - explicit ConversionException(optional_idx error_location, const string &msg, Args... params) + template + explicit ConversionException(optional_idx error_location, const string &msg, ARGS... params) : ConversionException(error_location, ConstructMessage(msg, params...)) { } }; diff --git a/src/duckdb/src/include/duckdb/common/exception/http_exception.hpp b/src/duckdb/src/include/duckdb/common/exception/http_exception.hpp index c953ee3b..87d11d13 100644 --- a/src/duckdb/src/include/duckdb/common/exception/http_exception.hpp +++ b/src/duckdb/src/include/duckdb/common/exception/http_exception.hpp @@ -17,10 +17,10 @@ class HTTPException : public Exception { public: template struct ResponseShape { - typedef int status; + typedef int status; // NOLINT }; - explicit HTTPException(string message) : Exception(ExceptionType::HTTP, std::move(message)) { + explicit HTTPException(const string &message) : Exception(ExceptionType::HTTP, message) { } template ::status = 0, typename... ARGS> @@ -30,7 +30,7 @@ class HTTPException : public Exception { template struct ResponseWrapperShape { - typedef int code; + typedef int code; // NOLINT }; template ::code = 0, typename... ARGS> diff --git a/src/duckdb/src/include/duckdb/common/exception/parser_exception.hpp b/src/duckdb/src/include/duckdb/common/exception/parser_exception.hpp index da0972e0..5ae6a5e8 100644 --- a/src/duckdb/src/include/duckdb/common/exception/parser_exception.hpp +++ b/src/duckdb/src/include/duckdb/common/exception/parser_exception.hpp @@ -19,11 +19,11 @@ class ParserException : public Exception { DUCKDB_API explicit ParserException(const string &msg); DUCKDB_API explicit ParserException(const string &msg, const unordered_map &extra_info); - template - explicit ParserException(const string &msg, Args... params) : ParserException(ConstructMessage(msg, params...)) { + template + explicit ParserException(const string &msg, ARGS... params) : ParserException(ConstructMessage(msg, params...)) { } - template - explicit ParserException(optional_idx error_location, const string &msg, Args... params) + template + explicit ParserException(optional_idx error_location, const string &msg, ARGS... params) : ParserException(ConstructMessage(msg, params...), Exception::InitializeExtraInfo(error_location)) { } diff --git a/src/duckdb/src/include/duckdb/common/exception/transaction_exception.hpp b/src/duckdb/src/include/duckdb/common/exception/transaction_exception.hpp index 2dadb8d0..f0164df6 100644 --- a/src/duckdb/src/include/duckdb/common/exception/transaction_exception.hpp +++ b/src/duckdb/src/include/duckdb/common/exception/transaction_exception.hpp @@ -16,8 +16,8 @@ class TransactionException : public Exception { public: DUCKDB_API explicit TransactionException(const string &msg); - template - explicit TransactionException(const string &msg, Args... params) + template + explicit TransactionException(const string &msg, ARGS... params) : TransactionException(ConstructMessage(msg, params...)) { } }; diff --git a/src/duckdb/src/include/duckdb/common/exception_format_value.hpp b/src/duckdb/src/include/duckdb/common/exception_format_value.hpp index 286a2b28..34be78c0 100644 --- a/src/duckdb/src/include/duckdb/common/exception_format_value.hpp +++ b/src/duckdb/src/include/duckdb/common/exception_format_value.hpp @@ -19,7 +19,7 @@ namespace duckdb { // Escaping " and quoting the value with " class SQLIdentifier { public: - SQLIdentifier(const string &raw_string) : raw_string(raw_string) { + explicit SQLIdentifier(const string &raw_string) : raw_string(raw_string) { } public: @@ -30,7 +30,7 @@ class SQLIdentifier { // Escaping ' and quoting the value with ' class SQLString { public: - SQLString(const string &raw_string) : raw_string(raw_string) { + explicit SQLString(const string &raw_string) : raw_string(raw_string) { } public: diff --git a/src/duckdb/src/include/duckdb/common/extra_type_info.hpp b/src/duckdb/src/include/duckdb/common/extra_type_info.hpp index 5ba5c9f6..8c8f8c0a 100644 --- a/src/duckdb/src/include/duckdb/common/extra_type_info.hpp +++ b/src/duckdb/src/include/duckdb/common/extra_type_info.hpp @@ -50,7 +50,7 @@ struct ExtraTypeInfo { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } @@ -219,7 +219,7 @@ struct AnyTypeInfo : public ExtraTypeInfo { }; struct IntegerLiteralTypeInfo : public ExtraTypeInfo { - IntegerLiteralTypeInfo(Value constant_value); + explicit IntegerLiteralTypeInfo(Value constant_value); Value constant_value; diff --git a/src/duckdb/src/include/duckdb/common/file_open_flags.hpp b/src/duckdb/src/include/duckdb/common/file_open_flags.hpp new file mode 100644 index 00000000..d0509a21 --- /dev/null +++ b/src/duckdb/src/include/duckdb/common/file_open_flags.hpp @@ -0,0 +1,134 @@ +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/common/file_open_flags.hpp +// +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include "duckdb/common/common.hpp" +#include "duckdb/common/enums/file_compression_type.hpp" + +namespace duckdb { + +enum class FileLockType : uint8_t { NO_LOCK = 0, READ_LOCK = 1, WRITE_LOCK = 2 }; + +class FileOpenFlags { +public: + static constexpr idx_t FILE_FLAGS_READ = idx_t(1 << 0); + static constexpr idx_t FILE_FLAGS_WRITE = idx_t(1 << 1); + static constexpr idx_t FILE_FLAGS_DIRECT_IO = idx_t(1 << 2); + static constexpr idx_t FILE_FLAGS_FILE_CREATE = idx_t(1 << 3); + static constexpr idx_t FILE_FLAGS_FILE_CREATE_NEW = idx_t(1 << 4); + static constexpr idx_t FILE_FLAGS_APPEND = idx_t(1 << 5); + static constexpr idx_t FILE_FLAGS_PRIVATE = idx_t(1 << 6); + static constexpr idx_t FILE_FLAGS_NULL_IF_NOT_EXISTS = idx_t(1 << 7); + static constexpr idx_t FILE_FLAGS_PARALLEL_ACCESS = idx_t(1 << 8); + +public: + FileOpenFlags() = default; + constexpr FileOpenFlags(idx_t flags) : flags(flags) { // NOLINT: allow implicit conversion + } + constexpr FileOpenFlags(FileLockType lock) : lock(lock) { // NOLINT: allow implicit conversion + } + constexpr FileOpenFlags(FileCompressionType compression) // NOLINT: allow implicit conversion + : compression(compression) { + } + constexpr FileOpenFlags(idx_t flags, FileLockType lock, FileCompressionType compression) + : flags(flags), lock(lock), compression(compression) { + } + + static constexpr FileLockType MergeLock(FileLockType a, FileLockType b) { + return a == FileLockType::NO_LOCK ? b : a; + } + + static constexpr FileCompressionType MergeCompression(FileCompressionType a, FileCompressionType b) { + return a == FileCompressionType::UNCOMPRESSED ? b : a; + } + + inline constexpr FileOpenFlags operator|(FileOpenFlags b) const { + return FileOpenFlags(flags | b.flags, MergeLock(lock, b.lock), MergeCompression(compression, b.compression)); + } + inline FileOpenFlags &operator|=(FileOpenFlags b) { + flags |= b.flags; + lock = MergeLock(lock, b.lock); + compression = MergeCompression(compression, b.compression); + return *this; + } + + FileLockType Lock() { + return lock; + } + + FileCompressionType Compression() { + return compression; + } + + void SetCompression(FileCompressionType new_compression) { + compression = new_compression; + } + + void Verify(); + + inline bool OpenForReading() const { + return flags & FILE_FLAGS_READ; + } + inline bool OpenForWriting() const { + return flags & FILE_FLAGS_WRITE; + } + inline bool DirectIO() const { + return flags & FILE_FLAGS_DIRECT_IO; + } + inline bool CreateFileIfNotExists() const { + return flags & FILE_FLAGS_FILE_CREATE; + } + inline bool OverwriteExistingFile() const { + return flags & FILE_FLAGS_FILE_CREATE_NEW; + } + inline bool OpenForAppending() const { + return flags & FILE_FLAGS_APPEND; + } + inline bool CreatePrivateFile() const { + return flags & FILE_FLAGS_PRIVATE; + } + inline bool ReturnNullIfNotExists() const { + return flags & FILE_FLAGS_NULL_IF_NOT_EXISTS; + } + inline bool RequireParallelAccess() const { + return flags & FILE_FLAGS_PARALLEL_ACCESS; + } + +private: + idx_t flags = 0; + FileLockType lock = FileLockType::NO_LOCK; + FileCompressionType compression = FileCompressionType::UNCOMPRESSED; +}; + +class FileFlags { +public: + //! Open file with read access + static constexpr FileOpenFlags FILE_FLAGS_READ = FileOpenFlags(FileOpenFlags::FILE_FLAGS_READ); + //! Open file with write access + static constexpr FileOpenFlags FILE_FLAGS_WRITE = FileOpenFlags(FileOpenFlags::FILE_FLAGS_WRITE); + //! Use direct IO when reading/writing to the file + static constexpr FileOpenFlags FILE_FLAGS_DIRECT_IO = FileOpenFlags(FileOpenFlags::FILE_FLAGS_DIRECT_IO); + //! Create file if not exists, can only be used together with WRITE + static constexpr FileOpenFlags FILE_FLAGS_FILE_CREATE = FileOpenFlags(FileOpenFlags::FILE_FLAGS_FILE_CREATE); + //! Always create a new file. If a file exists, the file is truncated. Cannot be used together with CREATE. + static constexpr FileOpenFlags FILE_FLAGS_FILE_CREATE_NEW = + FileOpenFlags(FileOpenFlags::FILE_FLAGS_FILE_CREATE_NEW); + //! Open file in append mode + static constexpr FileOpenFlags FILE_FLAGS_APPEND = FileOpenFlags(FileOpenFlags::FILE_FLAGS_APPEND); + //! Open file with restrictive permissions (600 on linux/mac) can only be used when creating, throws if file exists + static constexpr FileOpenFlags FILE_FLAGS_PRIVATE = FileOpenFlags(FileOpenFlags::FILE_FLAGS_PRIVATE); + //! Return NULL if the file does not exist instead of throwing an error + static constexpr FileOpenFlags FILE_FLAGS_NULL_IF_NOT_EXISTS = + FileOpenFlags(FileOpenFlags::FILE_FLAGS_NULL_IF_NOT_EXISTS); + //! Multiple threads may perform reads and writes in parallel + static constexpr FileOpenFlags FILE_FLAGS_PARALLEL_ACCESS = + FileOpenFlags(FileOpenFlags::FILE_FLAGS_PARALLEL_ACCESS); +}; + +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/file_opener.hpp b/src/duckdb/src/include/duckdb/common/file_opener.hpp index 502ea926..2c4dbc39 100644 --- a/src/duckdb/src/include/duckdb/common/file_opener.hpp +++ b/src/duckdb/src/include/duckdb/common/file_opener.hpp @@ -30,12 +30,15 @@ class FileOpener { virtual SettingLookupResult TryGetCurrentSetting(const string &key, Value &result, FileOpenerInfo &info); virtual SettingLookupResult TryGetCurrentSetting(const string &key, Value &result) = 0; - virtual ClientContext *TryGetClientContext() = 0; - - DUCKDB_API static ClientContext *TryGetClientContext(FileOpener *opener); - DUCKDB_API static SettingLookupResult TryGetCurrentSetting(FileOpener *opener, const string &key, Value &result); - DUCKDB_API static SettingLookupResult TryGetCurrentSetting(FileOpener *opener, const string &key, Value &result, - FileOpenerInfo &info); + virtual optional_ptr TryGetClientContext() = 0; + virtual optional_ptr TryGetDatabase() = 0; + + DUCKDB_API static optional_ptr TryGetClientContext(optional_ptr opener); + DUCKDB_API static optional_ptr TryGetDatabase(optional_ptr opener); + DUCKDB_API static SettingLookupResult TryGetCurrentSetting(optional_ptr opener, const string &key, + Value &result); + DUCKDB_API static SettingLookupResult TryGetCurrentSetting(optional_ptr opener, const string &key, + Value &result, FileOpenerInfo &info); }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/file_system.hpp b/src/duckdb/src/include/duckdb/common/file_system.hpp index 8e8dec06..0c994909 100644 --- a/src/duckdb/src/include/duckdb/common/file_system.hpp +++ b/src/duckdb/src/include/duckdb/common/file_system.hpp @@ -16,6 +16,8 @@ #include "duckdb/common/vector.hpp" #include "duckdb/common/enums/file_glob_options.hpp" #include "duckdb/common/optional_ptr.hpp" +#include "duckdb/common/error_data.hpp" +#include "duckdb/common/file_open_flags.hpp" #include #undef CreateDirectory @@ -64,6 +66,7 @@ struct FileHandle { DUCKDB_API void Sync(); DUCKDB_API void Truncate(int64_t new_size); DUCKDB_API string ReadLine(); + DUCKDB_API bool Trim(idx_t offset_bytes, idx_t length_bytes); DUCKDB_API bool CanSeek(); DUCKDB_API bool IsPipe(); @@ -85,7 +88,7 @@ struct FileHandle { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } @@ -94,41 +97,17 @@ struct FileHandle { string path; }; -enum class FileLockType : uint8_t { NO_LOCK = 0, READ_LOCK = 1, WRITE_LOCK = 2 }; - -class FileFlags { -public: - //! Open file with read access - static constexpr uint8_t FILE_FLAGS_READ = 1 << 0; - //! Open file with write access - static constexpr uint8_t FILE_FLAGS_WRITE = 1 << 1; - //! Use direct IO when reading/writing to the file - static constexpr uint8_t FILE_FLAGS_DIRECT_IO = 1 << 2; - //! Create file if not exists, can only be used together with WRITE - static constexpr uint8_t FILE_FLAGS_FILE_CREATE = 1 << 3; - //! Always create a new file. If a file exists, the file is truncated. Cannot be used together with CREATE. - static constexpr uint8_t FILE_FLAGS_FILE_CREATE_NEW = 1 << 4; - //! Open file in append mode - static constexpr uint8_t FILE_FLAGS_APPEND = 1 << 5; - //! Open file with restrictive permissions (600 on linux/mac) can only be used when creating, throws if file exists - static constexpr uint8_t FILE_FLAGS_PRIVATE = 1 << 6; -}; - class FileSystem { public: DUCKDB_API virtual ~FileSystem(); public: - DUCKDB_API static constexpr FileLockType DEFAULT_LOCK = FileLockType::NO_LOCK; - DUCKDB_API static constexpr FileCompressionType DEFAULT_COMPRESSION = FileCompressionType::UNCOMPRESSED; DUCKDB_API static FileSystem &GetFileSystem(ClientContext &context); DUCKDB_API static FileSystem &GetFileSystem(DatabaseInstance &db); DUCKDB_API static FileSystem &Get(AttachedDatabase &db); - DUCKDB_API virtual unique_ptr OpenFile(const string &path, uint8_t flags, - FileLockType lock = DEFAULT_LOCK, - FileCompressionType compression = DEFAULT_COMPRESSION, - FileOpener *opener = nullptr); + DUCKDB_API virtual unique_ptr OpenFile(const string &path, FileOpenFlags flags, + optional_ptr opener = nullptr); //! Read exactly nr_bytes from the specified location in the file. Fails if nr_bytes could not be read. This is //! equivalent to calling SetFilePointer(location) followed by calling Read(). @@ -141,23 +120,27 @@ class FileSystem { DUCKDB_API virtual int64_t Read(FileHandle &handle, void *buffer, int64_t nr_bytes); //! Write nr_bytes from the buffer into the file, moving the file pointer forward by nr_bytes. DUCKDB_API virtual int64_t Write(FileHandle &handle, void *buffer, int64_t nr_bytes); + //! Excise a range of the file. The OS can drop pages from the page-cache, and the file-system is free to deallocate + //! this range (sparse file support). Reads to the range will succeed but will return undefined data. + DUCKDB_API virtual bool Trim(FileHandle &handle, idx_t offset_bytes, idx_t length_bytes); //! Returns the file size of a file handle, returns -1 on error DUCKDB_API virtual int64_t GetFileSize(FileHandle &handle); //! Returns the file last modified time of a file handle, returns timespec with zero on all attributes on error DUCKDB_API virtual time_t GetLastModifiedTime(FileHandle &handle); - //! Returns the file last modified time of a file handle, returns timespec with zero on all attributes on error + //! Returns the file type of the attached handle DUCKDB_API virtual FileType GetFileType(FileHandle &handle); //! Truncate a file to a maximum size of new_size, new_size should be smaller than or equal to the current size of //! the file DUCKDB_API virtual void Truncate(FileHandle &handle, int64_t new_size); //! Check if a directory exists - DUCKDB_API virtual bool DirectoryExists(const string &directory); + DUCKDB_API virtual bool DirectoryExists(const string &directory, optional_ptr opener = nullptr); //! Create a directory if it does not exist - DUCKDB_API virtual void CreateDirectory(const string &directory); + DUCKDB_API virtual void CreateDirectory(const string &directory, optional_ptr opener = nullptr); //! Recursively remove a directory and all files in it - DUCKDB_API virtual void RemoveDirectory(const string &directory); + DUCKDB_API virtual void RemoveDirectory(const string &directory, optional_ptr opener = nullptr); + //! List files in a directory, invoking the callback method for each one with (filename, is_dir) DUCKDB_API virtual bool ListFiles(const string &directory, const std::function &callback, @@ -165,13 +148,14 @@ class FileSystem { //! Move a file from source path to the target, StorageManager relies on this being an atomic action for ACID //! properties - DUCKDB_API virtual void MoveFile(const string &source, const string &target); + DUCKDB_API virtual void MoveFile(const string &source, const string &target, + optional_ptr opener = nullptr); //! Check if a file exists - DUCKDB_API virtual bool FileExists(const string &filename); + DUCKDB_API virtual bool FileExists(const string &filename, optional_ptr opener = nullptr); //! Check if path is pipe - DUCKDB_API virtual bool IsPipe(const string &filename); + DUCKDB_API virtual bool IsPipe(const string &filename, optional_ptr opener = nullptr); //! Remove a file from disk - DUCKDB_API virtual void RemoveFile(const string &filename); + DUCKDB_API virtual void RemoveFile(const string &filename, optional_ptr opener = nullptr); //! Sync a file handle to disk DUCKDB_API virtual void FileSync(FileHandle &handle); //! Sets the working directory @@ -187,7 +171,7 @@ class FileSystem { //! Expands a given path, including e.g. expanding the home directory of the user DUCKDB_API virtual string ExpandPath(const string &path); //! Returns the system-available memory in bytes. Returns DConstants::INVALID_INDEX if the system function fails. - DUCKDB_API static idx_t GetAvailableMemory(); + DUCKDB_API static optional_idx GetAvailableMemory(); //! Path separator for path DUCKDB_API virtual string PathSeparator(const string &path); //! Checks if path is starts with separator (i.e., '/' on UNIX '\\' on Windows) @@ -233,6 +217,8 @@ class FileSystem { DUCKDB_API virtual void Reset(FileHandle &handle); DUCKDB_API virtual idx_t SeekPosition(FileHandle &handle); + //! If FS was manually set by the user + DUCKDB_API virtual bool IsManuallySet(); //! Whether or not we can seek into the file DUCKDB_API virtual bool CanSeek(); //! Whether or not the FS handles plain files on disk. This is relevant for certain optimizations, as random reads @@ -251,6 +237,19 @@ class FileSystem { DUCKDB_API static bool IsRemoteFile(const string &path); DUCKDB_API virtual void SetDisabledFileSystems(const vector &names); + +public: + template + TARGET &Cast() { + DynamicCastCheck(this); + return reinterpret_cast(*this); + } + + template + const TARGET &Cast() const { + DynamicCastCheck(this); + return reinterpret_cast(*this); + } }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/filename_pattern.hpp b/src/duckdb/src/include/duckdb/common/filename_pattern.hpp index 98899fcd..311fa602 100644 --- a/src/duckdb/src/include/duckdb/common/filename_pattern.hpp +++ b/src/duckdb/src/include/duckdb/common/filename_pattern.hpp @@ -20,9 +20,7 @@ class FilenamePattern { friend Deserializer; public: - FilenamePattern() : _base("data_"), _pos(_base.length()), _uuid(false) { - } - ~FilenamePattern() { + FilenamePattern() : base("data_"), pos(base.length()), uuid(false) { } public: @@ -33,9 +31,9 @@ class FilenamePattern { static FilenamePattern Deserialize(Deserializer &deserializer); private: - string _base; - idx_t _pos; - bool _uuid; + string base; + idx_t pos; + bool uuid; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/fixed_size_map.hpp b/src/duckdb/src/include/duckdb/common/fixed_size_map.hpp index 02950e09..586d5dd7 100644 --- a/src/duckdb/src/include/duckdb/common/fixed_size_map.hpp +++ b/src/duckdb/src/include/duckdb/common/fixed_size_map.hpp @@ -15,13 +15,13 @@ namespace duckdb { template -struct fixed_size_map_iterator_t; +struct fixed_size_map_iterator_t; // NOLINT: match stl case template -struct const_fixed_size_map_iterator_t; +struct const_fixed_size_map_iterator_t; // NOLINT: match stl case template -class fixed_size_map_t { +class fixed_size_map_t { // NOLINT: match stl case friend struct fixed_size_map_iterator_t; friend struct const_fixed_size_map_iterator_t; @@ -34,18 +34,18 @@ class fixed_size_map_t { resize(capacity); } - idx_t size() const { + idx_t size() const { // NOLINT: match stl case return count; } - void resize(idx_t capacity_p) { + void resize(idx_t capacity_p) { // NOLINT: match stl case capacity = capacity_p; occupied = ValidityMask(capacity); values = make_unsafe_uniq_array(capacity + 1); clear(); } - void clear() { + void clear() { // NOLINT: match stl case count = 0; occupied.SetAllInvalid(capacity); } @@ -62,23 +62,23 @@ class fixed_size_map_t { return values[key]; } - fixed_size_map_iterator_t begin() { + fixed_size_map_iterator_t begin() { // NOLINT: match stl case return fixed_size_map_iterator_t(begin_internal(), *this); } - const_fixed_size_map_iterator_t begin() const { + const_fixed_size_map_iterator_t begin() const { // NOLINT: match stl case return const_fixed_size_map_iterator_t(begin_internal(), *this); } - fixed_size_map_iterator_t end() { + fixed_size_map_iterator_t end() { // NOLINT: match stl case return fixed_size_map_iterator_t(capacity, *this); } - const_fixed_size_map_iterator_t end() const { + const_fixed_size_map_iterator_t end() const { // NOLINT: match stl case return const_fixed_size_map_iterator_t(capacity, *this); } - fixed_size_map_iterator_t find(const idx_t &index) { + fixed_size_map_iterator_t find(const idx_t &index) { // NOLINT: match stl case if (occupied.RowIsValid(index)) { return fixed_size_map_iterator_t(index, *this); } else { @@ -86,7 +86,7 @@ class fixed_size_map_t { } } - const_fixed_size_map_iterator_t find(const idx_t &index) const { + const_fixed_size_map_iterator_t find(const idx_t &index) const { // NOLINT: match stl case if (occupied.RowIsValid(index)) { return const_fixed_size_map_iterator_t(index, *this); } else { @@ -95,7 +95,7 @@ class fixed_size_map_t { } private: - idx_t begin_internal() const { + idx_t begin_internal() const { // NOLINT: match stl case idx_t index; for (index = 0; index < capacity; index++) { if (occupied.RowIsValid(index)) { diff --git a/src/duckdb/src/include/duckdb/common/helper.hpp b/src/duckdb/src/include/duckdb/common/helper.hpp index f0aa2828..c989983b 100644 --- a/src/duckdb/src/include/duckdb/common/helper.hpp +++ b/src/duckdb/src/include/duckdb/common/helper.hpp @@ -39,68 +39,62 @@ namespace duckdb { template struct AlwaysFalse { - static constexpr bool value = false; + static constexpr bool VALUE = false; }; template using reference = std::reference_wrapper; -template -struct __unique_if +template +struct TemplatedUniqueIf { - typedef unique_ptr<_Tp, std::default_delete<_Tp>, SAFE> __unique_single; + typedef unique_ptr, SAFE> templated_unique_single_t; }; -template -struct __unique_if<_Tp[]> +template +struct TemplatedUniqueIf { - typedef unique_ptr<_Tp[]> __unique_array_unknown_bound; + typedef void TemplatedUniqueArrayKnownBound; // NOLINT: mimic std style }; -template -struct __unique_if<_Tp[_Np]> -{ - typedef void __unique_array_known_bound; -}; - -template +template inline -typename __unique_if<_Tp, true>::__unique_single -make_uniq(_Args&&... __args) +typename TemplatedUniqueIf::templated_unique_single_t +make_uniq(ARGS&&... args) // NOLINT: mimic std style { - return unique_ptr<_Tp, std::default_delete<_Tp>, true>(new _Tp(std::forward<_Args>(__args)...)); + return unique_ptr, true>(new DATA_TYPE(std::forward(args)...)); } -template +template inline -typename __unique_if<_Tp, false>::__unique_single -make_unsafe_uniq(_Args&&... __args) +typename TemplatedUniqueIf::templated_unique_single_t +make_unsafe_uniq(ARGS&&... args) // NOLINT: mimic std style { - return unique_ptr<_Tp, std::default_delete<_Tp>, false>(new _Tp(std::forward<_Args>(__args)...)); + return unique_ptr, false>(new DATA_TYPE(std::forward(args)...)); } -template -inline unique_ptr<_Tp[], std::default_delete<_Tp>, true> -make_uniq_array(size_t __n) +template +inline unique_ptr, true> +make_uniq_array(size_t n) // NOLINT: mimic std style { - return unique_ptr<_Tp[], std::default_delete<_Tp>, true>(new _Tp[__n]()); + return unique_ptr, true>(new DATA_TYPE[n]()); } -template -inline unique_ptr<_Tp[], std::default_delete<_Tp>, false> -make_unsafe_uniq_array(size_t __n) +template +inline unique_ptr, false> +make_unsafe_uniq_array(size_t n) // NOLINT: mimic std style { - return unique_ptr<_Tp[], std::default_delete<_Tp>, false>(new _Tp[__n]()); + return unique_ptr, false>(new DATA_TYPE[n]()); } -template - typename __unique_if<_Tp>::__unique_array_known_bound - make_uniq(_Args&&...) = delete; +template + typename TemplatedUniqueIf::TemplatedUniqueArrayKnownBound + make_uniq(ARGS&&...) = delete; // NOLINT: mimic std style -template -unique_ptr make_uniq_base(Args &&... args) { - return unique_ptr(new T(std::forward(args)...)); +template +unique_ptr make_uniq_base(ARGS &&... args) { // NOLINT: mimic std style + return unique_ptr(new T(std::forward(args)...)); } #ifdef DUCKDB_ENABLE_DEPRECATED_API @@ -111,7 +105,7 @@ unique_ptr make_unique_base(Args &&... args) { #endif // DUCKDB_ENABLE_DEPRECATED_API template -unique_ptr unique_ptr_cast(unique_ptr src) { +unique_ptr unique_ptr_cast(unique_ptr src) { // NOLINT: mimic std style return unique_ptr(static_cast(src.release())); } @@ -137,12 +131,12 @@ typename std::remove_reference::type&& move(T&& t) noexcept { } #endif -template -static duckdb::unique_ptr make_unique(_Args&&... __args) { +template +static duckdb::unique_ptr make_unique(ARGS&&... __args) { // NOLINT: mimic std style #ifndef DUCKDB_ENABLE_DEPRECATED_API static_assert(sizeof(T) == 0, "Use make_uniq instead of make_unique!"); #endif // DUCKDB_ENABLE_DEPRECATED_API - return unique_ptr(new T(std::forward<_Args>(__args)...)); + return unique_ptr(new T(std::forward(__args)...)); } template @@ -184,13 +178,13 @@ T SignValue(T a) { template const T Load(const_data_ptr_t ptr) { T ret; - memcpy(&ret, ptr, sizeof(ret)); + memcpy(&ret, ptr, sizeof(ret)); // NOLINT return ret; } template void Store(const T &val, data_ptr_t ptr) { - memcpy(ptr, (void *)&val, sizeof(val)); + memcpy(ptr, (void *)&val, sizeof(val)); // NOLINT } //! This assigns a shared pointer, but ONLY assigns if "target" is not equal to "source" @@ -211,19 +205,20 @@ using const_reference = std::reference_wrapper; //! Returns whether or not two reference wrappers refer to the same object template -bool RefersToSameObject(const reference &A, const reference &B) { - return &A.get() == &B.get(); +bool RefersToSameObject(const reference &a, const reference &b) { + return &a.get() == &b.get(); } template -bool RefersToSameObject(const T &A, const T &B) { - return &A == &B; +bool RefersToSameObject(const T &a, const T &b) { + return &a == &b; } template -void DynamicCastCheck(SRC *source) { +void DynamicCastCheck(const SRC *source) { #ifndef __APPLE__ - D_ASSERT(dynamic_cast(source)); + // Actual check is on the fact that dynamic_cast and reinterpret_cast are equivalent + D_ASSERT(reinterpret_cast(source) == dynamic_cast(source)); #endif } diff --git a/src/duckdb/src/include/duckdb/common/http_state.hpp b/src/duckdb/src/include/duckdb/common/http_state.hpp index 72162869..1341b921 100644 --- a/src/duckdb/src/include/duckdb/common/http_state.hpp +++ b/src/duckdb/src/include/duckdb/common/http_state.hpp @@ -84,7 +84,7 @@ class HTTPState : public ClientContextState { shared_ptr &GetCachedFile(const string &path); //! Helper functions to get the HTTP state static shared_ptr TryGetState(ClientContext &context, bool create_on_missing = true); - static shared_ptr TryGetState(FileOpener *opener, bool create_on_missing = true); + static shared_ptr TryGetState(optional_ptr opener, bool create_on_missing = true); bool IsEmpty() { return head_count == 0 && get_count == 0 && put_count == 0 && post_count == 0 && total_bytes_received == 0 && diff --git a/src/duckdb/src/include/duckdb/common/hugeint.hpp b/src/duckdb/src/include/duckdb/common/hugeint.hpp index fd58a8cc..0abc91e6 100644 --- a/src/duckdb/src/include/duckdb/common/hugeint.hpp +++ b/src/duckdb/src/include/duckdb/common/hugeint.hpp @@ -8,9 +8,9 @@ namespace duckdb { // Forward declaration to allow conversion between hugeint and uhugeint -struct uhugeint_t; +struct uhugeint_t; // NOLINT: use numeric casing -struct hugeint_t { +struct hugeint_t { // NOLINT: use numeric casing public: uint64_t lower; int64_t upper; diff --git a/src/duckdb/src/include/duckdb/common/index_vector.hpp b/src/duckdb/src/include/duckdb/common/index_vector.hpp index 3f35b676..d63bf2ca 100644 --- a/src/duckdb/src/include/duckdb/common/index_vector.hpp +++ b/src/duckdb/src/include/duckdb/common/index_vector.hpp @@ -18,7 +18,7 @@ namespace duckdb { template class IndexVector { public: - void push_back(T element) { + void push_back(T element) { // NOLINT: match stl API internal_vector.push_back(std::move(element)); } @@ -30,34 +30,34 @@ class IndexVector { return internal_vector[idx.index]; } - idx_t size() const { + idx_t size() const { // NOLINT: match stl API return internal_vector.size(); } - bool empty() const { + bool empty() const { // NOLINT: match stl API return internal_vector.empty(); } - void reserve(idx_t size) { + void reserve(idx_t size) { // NOLINT: match stl API internal_vector.reserve(size); } - typename vector::iterator begin() { + typename vector::iterator begin() { // NOLINT: match stl API return internal_vector.begin(); } - typename vector::iterator end() { + typename vector::iterator end() { // NOLINT: match stl API return internal_vector.end(); } - typename vector::const_iterator cbegin() { + typename vector::const_iterator cbegin() { // NOLINT: match stl API return internal_vector.cbegin(); } - typename vector::const_iterator cend() { + typename vector::const_iterator cend() { // NOLINT: match stl API return internal_vector.cend(); } - typename vector::const_iterator begin() const { + typename vector::const_iterator begin() const { // NOLINT: match stl API return internal_vector.begin(); } - typename vector::const_iterator end() const { + typename vector::const_iterator end() const { // NOLINT: match stl API return internal_vector.end(); } diff --git a/src/duckdb/src/include/duckdb/common/local_file_system.hpp b/src/duckdb/src/include/duckdb/common/local_file_system.hpp index 8a10e96c..fe4e02ad 100644 --- a/src/duckdb/src/include/duckdb/common/local_file_system.hpp +++ b/src/duckdb/src/include/duckdb/common/local_file_system.hpp @@ -15,9 +15,8 @@ namespace duckdb { class LocalFileSystem : public FileSystem { public: - unique_ptr OpenFile(const string &path, uint8_t flags, FileLockType lock = FileLockType::NO_LOCK, - FileCompressionType compression = FileCompressionType::UNCOMPRESSED, - FileOpener *opener = nullptr) override; + unique_ptr OpenFile(const string &path, FileOpenFlags flags, + optional_ptr opener = nullptr) override; //! Read exactly nr_bytes from the specified location in the file. Fails if nr_bytes could not be read. This is //! equivalent to calling SetFilePointer(location) followed by calling Read(). @@ -30,6 +29,10 @@ class LocalFileSystem : public FileSystem { int64_t Read(FileHandle &handle, void *buffer, int64_t nr_bytes) override; //! Write nr_bytes from the buffer into the file, moving the file pointer forward by nr_bytes. int64_t Write(FileHandle &handle, void *buffer, int64_t nr_bytes) override; + //! Excise a range of the file. The file-system is free to deallocate this + //! range (sparse file support). Reads to the range will succeed but will return + //! undefined data. + bool Trim(FileHandle &handle, idx_t offset_bytes, idx_t length_bytes) override; //! Returns the file size of a file handle, returns -1 on error int64_t GetFileSize(FileHandle &handle) override; @@ -42,24 +45,24 @@ class LocalFileSystem : public FileSystem { void Truncate(FileHandle &handle, int64_t new_size) override; //! Check if a directory exists - bool DirectoryExists(const string &directory) override; + bool DirectoryExists(const string &directory, optional_ptr opener = nullptr) override; //! Create a directory if it does not exist - void CreateDirectory(const string &directory) override; + void CreateDirectory(const string &directory, optional_ptr opener = nullptr) override; //! Recursively remove a directory and all files in it - void RemoveDirectory(const string &directory) override; + void RemoveDirectory(const string &directory, optional_ptr opener = nullptr) override; //! List files in a directory, invoking the callback method for each one with (filename, is_dir) bool ListFiles(const string &directory, const std::function &callback, FileOpener *opener = nullptr) override; //! Move a file from source path to the target, StorageManager relies on this being an atomic action for ACID //! properties - void MoveFile(const string &source, const string &target) override; + void MoveFile(const string &source, const string &target, optional_ptr opener = nullptr) override; //! Check if a file exists - bool FileExists(const string &filename) override; + bool FileExists(const string &filename, optional_ptr opener = nullptr) override; //! Check if path is a pipe - bool IsPipe(const string &filename) override; + bool IsPipe(const string &filename, optional_ptr opener = nullptr) override; //! Remove a file from disk - void RemoveFile(const string &filename) override; + void RemoveFile(const string &filename, optional_ptr opener = nullptr) override; //! Sync a file handle to disk void FileSync(FileHandle &handle) override; diff --git a/src/duckdb/src/include/duckdb/common/memory_safety.hpp b/src/duckdb/src/include/duckdb/common/memory_safety.hpp index 7d4d5eab..8974dd56 100644 --- a/src/duckdb/src/include/duckdb/common/memory_safety.hpp +++ b/src/duckdb/src/include/duckdb/common/memory_safety.hpp @@ -2,13 +2,13 @@ namespace duckdb { -template +template struct MemorySafety { #ifdef DEBUG // In DEBUG mode safety is always on - static constexpr bool enabled = true; + static constexpr bool ENABLED = true; #else - static constexpr bool enabled = ENABLED; + static constexpr bool ENABLED = IS_ENABLED; #endif }; diff --git a/src/duckdb/src/include/duckdb/common/multi_file_reader_options.hpp b/src/duckdb/src/include/duckdb/common/multi_file_reader_options.hpp index 74a737f3..5b8bd906 100644 --- a/src/duckdb/src/include/duckdb/common/multi_file_reader_options.hpp +++ b/src/duckdb/src/include/duckdb/common/multi_file_reader_options.hpp @@ -29,7 +29,7 @@ struct MultiFileReaderOptions { DUCKDB_API void AddBatchInfo(BindInfo &bind_info) const; DUCKDB_API void AutoDetectHivePartitioning(const vector &files, ClientContext &context); DUCKDB_API static bool AutoDetectHivePartitioningInternal(const vector &files, ClientContext &context); - DUCKDB_API void AutoDetectHiveTypesInternal(const string &file, ClientContext &context); + DUCKDB_API void AutoDetectHiveTypesInternal(const vector &file, ClientContext &context); DUCKDB_API void VerifyHiveTypesArePartitions(const std::map &partitions) const; DUCKDB_API LogicalType GetHiveLogicalType(const string &hive_partition_column) const; DUCKDB_API Value GetHivePartitionValue(const string &base, const string &entry, ClientContext &context) const; diff --git a/src/duckdb/src/include/duckdb/common/opener_file_system.hpp b/src/duckdb/src/include/duckdb/common/opener_file_system.hpp index 28b35245..2d35512b 100644 --- a/src/duckdb/src/include/duckdb/common/opener_file_system.hpp +++ b/src/duckdb/src/include/duckdb/common/opener_file_system.hpp @@ -18,13 +18,16 @@ class OpenerFileSystem : public FileSystem { virtual FileSystem &GetFileSystem() const = 0; virtual optional_ptr GetOpener() const = 0; - unique_ptr OpenFile(const string &path, uint8_t flags, FileLockType lock = FileLockType::NO_LOCK, - FileCompressionType compression = FileCompressionType::UNCOMPRESSED, - FileOpener *opener = nullptr) override { + void VerifyNoOpener(optional_ptr opener) { if (opener) { throw InternalException("OpenerFileSystem cannot take an opener - the opener is pushed automatically"); } - return GetFileSystem().OpenFile(path, flags, lock, compression, GetOpener().get()); + } + + unique_ptr OpenFile(const string &path, FileOpenFlags flags, + optional_ptr opener = nullptr) override { + VerifyNoOpener(opener); + return GetFileSystem().OpenFile(path, flags, GetOpener()); } void Read(FileHandle &handle, void *buffer, int64_t nr_bytes, idx_t location) override { @@ -61,27 +64,29 @@ class OpenerFileSystem : public FileSystem { GetFileSystem().FileSync(handle); } - bool DirectoryExists(const string &directory) override { - return GetFileSystem().DirectoryExists(directory); + bool DirectoryExists(const string &directory, optional_ptr opener) override { + VerifyNoOpener(opener); + return GetFileSystem().DirectoryExists(directory, GetOpener()); } - void CreateDirectory(const string &directory) override { - return GetFileSystem().CreateDirectory(directory); + void CreateDirectory(const string &directory, optional_ptr opener) override { + VerifyNoOpener(opener); + return GetFileSystem().CreateDirectory(directory, GetOpener()); } - void RemoveDirectory(const string &directory) override { - return GetFileSystem().RemoveDirectory(directory); + void RemoveDirectory(const string &directory, optional_ptr opener) override { + VerifyNoOpener(opener); + return GetFileSystem().RemoveDirectory(directory, GetOpener()); } bool ListFiles(const string &directory, const std::function &callback, FileOpener *opener = nullptr) override { - if (opener) { - throw InternalException("OpenerFileSystem cannot take an opener - the opener is pushed automatically"); - } + VerifyNoOpener(opener); return GetFileSystem().ListFiles(directory, callback, GetOpener().get()); } - void MoveFile(const string &source, const string &target) override { - GetFileSystem().MoveFile(source, target); + void MoveFile(const string &source, const string &target, optional_ptr opener) override { + VerifyNoOpener(opener); + GetFileSystem().MoveFile(source, target, GetOpener()); } string GetHomeDirectory() override { @@ -92,15 +97,18 @@ class OpenerFileSystem : public FileSystem { return FileSystem::ExpandPath(path, GetOpener()); } - bool FileExists(const string &filename) override { - return GetFileSystem().FileExists(filename); + bool FileExists(const string &filename, optional_ptr opener) override { + VerifyNoOpener(opener); + return GetFileSystem().FileExists(filename, GetOpener()); } - bool IsPipe(const string &filename) override { - return GetFileSystem().IsPipe(filename); + bool IsPipe(const string &filename, optional_ptr opener) override { + VerifyNoOpener(opener); + return GetFileSystem().IsPipe(filename, GetOpener()); } - void RemoveFile(const string &filename) override { - GetFileSystem().RemoveFile(filename); + void RemoveFile(const string &filename, optional_ptr opener) override { + VerifyNoOpener(opener); + GetFileSystem().RemoveFile(filename, GetOpener()); } string PathSeparator(const string &path) override { @@ -108,15 +116,33 @@ class OpenerFileSystem : public FileSystem { } vector Glob(const string &path, FileOpener *opener = nullptr) override { - if (opener) { - throw InternalException("OpenerFileSystem cannot take an opener - the opener is pushed automatically"); - } + VerifyNoOpener(opener); return GetFileSystem().Glob(path, GetOpener().get()); } std::string GetName() const override { return "OpenerFileSystem - " + GetFileSystem().GetName(); } + + void RegisterSubSystem(unique_ptr sub_fs) override { + GetFileSystem().RegisterSubSystem(std::move(sub_fs)); + } + + void RegisterSubSystem(FileCompressionType compression_type, unique_ptr fs) override { + GetFileSystem().RegisterSubSystem(compression_type, std::move(fs)); + } + + void UnregisterSubSystem(const string &name) override { + GetFileSystem().UnregisterSubSystem(name); + } + + void SetDisabledFileSystems(const vector &names) override { + GetFileSystem().SetDisabledFileSystems(names); + } + + vector ListSubSystems() override { + return GetFileSystem().ListSubSystems(); + } }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/operator/abs.hpp b/src/duckdb/src/include/duckdb/common/operator/abs.hpp index 26f48726..15a12313 100644 --- a/src/duckdb/src/include/duckdb/common/operator/abs.hpp +++ b/src/duckdb/src/include/duckdb/common/operator/abs.hpp @@ -39,7 +39,7 @@ inline int8_t TryAbsOperator::Operation(int8_t input) { if (input == NumericLimits::Minimum()) { throw OutOfRangeException("Overflow on abs(%d)", input); } - return input < 0 ? -input : input; + return AbsOperator::Operation(input); } template <> @@ -47,7 +47,7 @@ inline int16_t TryAbsOperator::Operation(int16_t input) { if (input == NumericLimits::Minimum()) { throw OutOfRangeException("Overflow on abs(%d)", input); } - return input < 0 ? -input : input; + return AbsOperator::Operation(input); } template <> @@ -55,7 +55,7 @@ inline int32_t TryAbsOperator::Operation(int32_t input) { if (input == NumericLimits::Minimum()) { throw OutOfRangeException("Overflow on abs(%d)", input); } - return input < 0 ? -input : input; + return AbsOperator::Operation(input); } template <> @@ -63,7 +63,15 @@ inline int64_t TryAbsOperator::Operation(int64_t input) { if (input == NumericLimits::Minimum()) { throw OutOfRangeException("Overflow on abs(%d)", input); } - return input < 0 ? -input : input; + return AbsOperator::Operation(input); +} + +template <> +inline hugeint_t TryAbsOperator::Operation(hugeint_t input) { + if (input == NumericLimits::Minimum()) { + throw OutOfRangeException("Overflow on abs(%s)", input.ToString()); + } + return AbsOperator::Operation(input); } template <> diff --git a/src/duckdb/src/include/duckdb/common/optional_ptr.hpp b/src/duckdb/src/include/duckdb/common/optional_ptr.hpp index 82b845a8..8e357e77 100644 --- a/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +++ b/src/duckdb/src/include/duckdb/common/optional_ptr.hpp @@ -14,7 +14,7 @@ namespace duckdb { template -class optional_ptr { +class optional_ptr { // NOLINT: mimic std casing public: optional_ptr() : ptr(nullptr) { } @@ -29,7 +29,7 @@ class optional_ptr { } } - operator bool() const { + operator bool() const { // NOLINT: allow implicit conversion to bool return ptr; } T &operator*() { @@ -48,16 +48,16 @@ class optional_ptr { CheckValid(); return ptr; } - T *get() { + T *get() { // NOLINT: mimic std casing // CheckValid(); return ptr; } - const T *get() const { + const T *get() const { // NOLINT: mimic std casing // CheckValid(); return ptr; } // this looks dirty - but this is the default behavior of raw pointers - T *get_mutable() const { + T *get_mutable() const { // NOLINT: mimic std casing // CheckValid(); return ptr; } diff --git a/src/duckdb/src/include/duckdb/common/pipe_file_system.hpp b/src/duckdb/src/include/duckdb/common/pipe_file_system.hpp index 7806ce02..a84433d2 100644 --- a/src/duckdb/src/include/duckdb/common/pipe_file_system.hpp +++ b/src/duckdb/src/include/duckdb/common/pipe_file_system.hpp @@ -28,7 +28,7 @@ class PipeFileSystem : public FileSystem { bool CanSeek() override { return false; } - bool IsPipe(const string &filename) override { + bool IsPipe(const string &filename, optional_ptr opener) override { return true; } void FileSync(FileHandle &handle) override; diff --git a/src/duckdb/src/include/duckdb/common/platform.h b/src/duckdb/src/include/duckdb/common/platform.h index c7d2455a..32babf9c 100644 --- a/src/duckdb/src/include/duckdb/common/platform.h +++ b/src/duckdb/src/include/duckdb/common/platform.h @@ -3,7 +3,7 @@ namespace duckdb { -std::string DuckDBPlatform() { +std::string DuckDBPlatform() { // NOLINT: allow definition in header #if defined(DUCKDB_CUSTOM_PLATFORM) return DUCKDB_QUOTE_DEFINE(DUCKDB_CUSTOM_PLATFORM); #endif diff --git a/src/duckdb/src/include/duckdb/common/printer.hpp b/src/duckdb/src/include/duckdb/common/printer.hpp index 8ecc9f58..eba11c33 100644 --- a/src/duckdb/src/include/duckdb/common/printer.hpp +++ b/src/duckdb/src/include/duckdb/common/printer.hpp @@ -23,14 +23,14 @@ class Printer { //! Print the object to stderr DUCKDB_API static void Print(const string &str); //! Print the formatted object to the stream - template - static void PrintF(OutputStream stream, const string &str, Args... params) { + template + static void PrintF(OutputStream stream, const string &str, ARGS... params) { Printer::Print(stream, StringUtil::Format(str, params...)); } //! Print the formatted object to stderr - template - static void PrintF(const string &str, Args... params) { - Printer::PrintF(OutputStream::STREAM_STDERR, str, std::forward(params)...); + template + static void PrintF(const string &str, ARGS... params) { + Printer::PrintF(OutputStream::STREAM_STDERR, str, std::forward(params)...); } //! Directly prints the string to stdout without a newline DUCKDB_API static void RawPrint(OutputStream stream, const string &str); diff --git a/src/duckdb/src/include/duckdb/common/profiler.hpp b/src/duckdb/src/include/duckdb/common/profiler.hpp index aeb704bf..397efad8 100644 --- a/src/duckdb/src/include/duckdb/common/profiler.hpp +++ b/src/duckdb/src/include/duckdb/common/profiler.hpp @@ -32,8 +32,8 @@ class BaseProfiler { //! the total elapsed time. Otherwise returns how far along the timer is //! right now. double Elapsed() const { - auto _end = finished ? end : Tick(); - return std::chrono::duration_cast>(_end - start).count(); + auto measured_end = finished ? end : Tick(); + return std::chrono::duration_cast>(measured_end - start).count(); } private: diff --git a/src/duckdb/src/include/duckdb/common/progress_bar/display/terminal_progress_bar_display.hpp b/src/duckdb/src/include/duckdb/common/progress_bar/display/terminal_progress_bar_display.hpp index 98f6852c..8c0c01ac 100644 --- a/src/duckdb/src/include/duckdb/common/progress_bar/display/terminal_progress_bar_display.hpp +++ b/src/duckdb/src/include/duckdb/common/progress_bar/display/terminal_progress_bar_display.hpp @@ -27,11 +27,11 @@ class TerminalProgressBarDisplay : public ProgressBarDisplay { int32_t rendered_percentage = -1; static constexpr const idx_t PARTIAL_BLOCK_COUNT = UnicodeBar::PartialBlocksCount(); #ifndef DUCKDB_ASCII_TREE_RENDERER - const char *PROGRESS_EMPTY = " "; - const char *const *PROGRESS_PARTIAL = UnicodeBar::PartialBlocks(); - const char *PROGRESS_BLOCK = UnicodeBar::FullBlock(); - const char *PROGRESS_START = "\xE2\x96\x95"; - const char *PROGRESS_END = "\xE2\x96\x8F"; + const char *PROGRESS_EMPTY = " "; // NOLINT + const char *const *PROGRESS_PARTIAL = UnicodeBar::PartialBlocks(); // NOLINT + const char *PROGRESS_BLOCK = UnicodeBar::FullBlock(); // NOLINT + const char *PROGRESS_START = "\xE2\x96\x95"; // NOLINT + const char *PROGRESS_END = "\xE2\x96\x8F"; // NOLINT #else const char *PROGRESS_EMPTY = " "; const char *const PROGRESS_PARTIAL[PARTIAL_BLOCK_COUNT] = {" ", " ", " ", " ", " ", " ", " ", " "}; diff --git a/src/duckdb/src/include/duckdb/common/random_engine.hpp b/src/duckdb/src/include/duckdb/common/random_engine.hpp index 1185dbcb..d46a1552 100644 --- a/src/duckdb/src/include/duckdb/common/random_engine.hpp +++ b/src/duckdb/src/include/duckdb/common/random_engine.hpp @@ -19,7 +19,7 @@ class ClientContext; struct RandomState; struct RandomEngine { - RandomEngine(int64_t seed = -1); + explicit RandomEngine(int64_t seed = -1); ~RandomEngine(); public: diff --git a/src/duckdb/src/include/duckdb/common/re2_regex.hpp b/src/duckdb/src/include/duckdb/common/re2_regex.hpp index 3c13179a..de4b3313 100644 --- a/src/duckdb/src/include/duckdb/common/re2_regex.hpp +++ b/src/duckdb/src/include/duckdb/common/re2_regex.hpp @@ -14,8 +14,8 @@ enum class RegexOptions : uint8_t { NONE, CASE_INSENSITIVE }; class Regex { public: - DUCKDB_API Regex(const std::string &pattern, RegexOptions options = RegexOptions::NONE); - Regex(const char *pattern, RegexOptions options = RegexOptions::NONE) : Regex(std::string(pattern)) { + DUCKDB_API explicit Regex(const std::string &pattern, RegexOptions options = RegexOptions::NONE); + explicit Regex(const char *pattern, RegexOptions options = RegexOptions::NONE) : Regex(std::string(pattern)) { } const duckdb_re2::RE2 &GetRegex() const { return *regex; @@ -29,10 +29,10 @@ struct GroupMatch { std::string text; uint32_t position; - const std::string &str() const { + const std::string &str() const { // NOLINT return text; } - operator std::string() const { + operator std::string() const { // NOLINT: allow implicit cast return text; } }; @@ -47,15 +47,15 @@ struct Match { return groups[index]; } - std::string str(uint64_t index) { + std::string str(uint64_t index) { // NOLINT return GetGroup(index).text; } - uint64_t position(uint64_t index) { + uint64_t position(uint64_t index) { // NOLINT return GetGroup(index).position; } - uint64_t length(uint64_t index) { + uint64_t length(uint64_t index) { // NOLINT return GetGroup(index).text.size(); } diff --git a/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp b/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp index 34d78e16..f39062fe 100644 --- a/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +++ b/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp @@ -17,6 +17,7 @@ class BufferedFileReader : public ReadStream { public: BufferedFileReader(FileSystem &fs, const char *path, FileLockType lock_type = FileLockType::READ_LOCK, optional_ptr opener = nullptr); + BufferedFileReader(FileSystem &fs, unique_ptr handle); FileSystem &fs; unsafe_unique_array data; @@ -33,6 +34,8 @@ class BufferedFileReader : public ReadStream { return file_size; } + //! Resets reading - beginning at position 0 + void Reset(); void Seek(uint64_t location); uint64_t CurrentOffset(); diff --git a/src/duckdb/src/include/duckdb/common/serializer/buffered_file_writer.hpp b/src/duckdb/src/include/duckdb/common/serializer/buffered_file_writer.hpp index 8ad0ffda..26f0460c 100644 --- a/src/duckdb/src/include/duckdb/common/serializer/buffered_file_writer.hpp +++ b/src/duckdb/src/include/duckdb/common/serializer/buffered_file_writer.hpp @@ -17,11 +17,11 @@ namespace duckdb { class BufferedFileWriter : public WriteStream { public: - static constexpr uint8_t DEFAULT_OPEN_FLAGS = FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE; + static constexpr FileOpenFlags DEFAULT_OPEN_FLAGS = FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE; //! Serializes to a buffer allocated by the serializer, will expand when //! writing past the initial threshold - DUCKDB_API BufferedFileWriter(FileSystem &fs, const string &path, uint8_t open_flags = DEFAULT_OPEN_FLAGS); + DUCKDB_API BufferedFileWriter(FileSystem &fs, const string &path, FileOpenFlags open_flags = DEFAULT_OPEN_FLAGS); FileSystem &fs; string path; diff --git a/src/duckdb/src/include/duckdb/common/serializer/deserialization_data.hpp b/src/duckdb/src/include/duckdb/common/serializer/deserialization_data.hpp index c936644e..d092229b 100644 --- a/src/duckdb/src/include/duckdb/common/serializer/deserialization_data.hpp +++ b/src/duckdb/src/include/duckdb/common/serializer/deserialization_data.hpp @@ -23,7 +23,7 @@ struct DeserializationData { stack> databases; stack enums; stack> parameter_data; - stack> types; + stack> types; template void Set(T entry) = delete; @@ -112,7 +112,7 @@ inline void DeserializationData::Unset() { template <> inline void DeserializationData::Set(ClientContext &context) { - contexts.push(context); + contexts.emplace(context); } template <> @@ -129,7 +129,7 @@ inline void DeserializationData::Unset() { template <> inline void DeserializationData::Set(DatabaseInstance &db) { - databases.push(db); + databases.emplace(db); } template <> @@ -146,7 +146,7 @@ inline void DeserializationData::Unset() { template <> inline void DeserializationData::Set(bound_parameter_map_t &context) { - parameter_data.push(context); + parameter_data.emplace(context); } template <> @@ -167,13 +167,24 @@ inline void DeserializationData::Set(LogicalType &type) { } template <> -inline LogicalType &DeserializationData::Get() { +inline void DeserializationData::Unset() { + AssertNotEmpty(types); + types.pop(); +} + +template <> +inline void DeserializationData::Set(const LogicalType &type) { + types.emplace(type); +} + +template <> +inline const LogicalType &DeserializationData::Get() { AssertNotEmpty(types); return types.top(); } template <> -inline void DeserializationData::Unset() { +inline void DeserializationData::Unset() { AssertNotEmpty(types); types.pop(); } diff --git a/src/duckdb/src/include/duckdb/common/serializer/deserializer.hpp b/src/duckdb/src/include/duckdb/common/serializer/deserializer.hpp index 000104c4..e4096878 100644 --- a/src/duckdb/src/include/duckdb/common/serializer/deserializer.hpp +++ b/src/duckdb/src/include/duckdb/common/serializer/deserializer.hpp @@ -114,6 +114,18 @@ class Deserializer { OnOptionalPropertyEnd(true); } + template + inline void ReadPropertyWithDefault(const field_id_t field_id, const char *tag, CSVOption &ret, + T &&default_value) { + if (!OnOptionalPropertyBegin(field_id, tag)) { + ret = std::forward(default_value); + OnOptionalPropertyEnd(false); + return; + } + ret = Read(); + OnOptionalPropertyEnd(true); + } + // Special case: // Read into an existing data_ptr_t inline void ReadProperty(const field_id_t field_id, const char *tag, data_ptr_t ret, idx_t count) { diff --git a/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp b/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp index 0f60deec..616d90f2 100644 --- a/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +++ b/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp @@ -11,6 +11,7 @@ #include "duckdb/common/shared_ptr.hpp" #include "duckdb/common/unique_ptr.hpp" #include "duckdb/common/optional_ptr.hpp" +#include "duckdb/common/optional_idx.hpp" namespace duckdb { @@ -24,6 +25,7 @@ const field_id_t MESSAGE_TERMINATOR_FIELD_ID = 0xFFFF; template using void_t = void; +// NOLINTBEGIN: match STL case // Check for anything implementing a `void Serialize(Serializer &Serializer)` method template struct has_serialize : std::false_type {}; @@ -145,6 +147,8 @@ struct is_atomic> : std::true_type { typedef T TYPE; }; +// NOLINTEND + struct SerializationDefaultValue { template @@ -258,6 +262,16 @@ struct SerializationDefaultValue { static inline bool IsDefault(const typename std::enable_if::value, T>::type &value) { return value.empty(); } + + template + static inline typename std::enable_if::value, T>::type GetDefault() { + return optional_idx(); + } + + template + static inline bool IsDefault(const typename std::enable_if::value, T>::type &value) { + return !value.IsValid(); + } }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/serializer/serializer.hpp b/src/duckdb/src/include/duckdb/common/serializer/serializer.hpp index 10b926d0..f791b4a8 100644 --- a/src/duckdb/src/include/duckdb/common/serializer/serializer.hpp +++ b/src/duckdb/src/include/duckdb/common/serializer/serializer.hpp @@ -17,6 +17,7 @@ #include "duckdb/common/unordered_set.hpp" #include "duckdb/common/optional_idx.hpp" #include "duckdb/common/value_operations/value_operations.hpp" +#include "duckdb/execution/operator/csv_scanner/csv_option.hpp" namespace duckdb { @@ -86,6 +87,21 @@ class Serializer { OnOptionalPropertyEnd(true); } + // Specialization for Value (default Value comparison throws when comparing nulls) + template + void WritePropertyWithDefault(const field_id_t field_id, const char *tag, const CSVOption &value, + const T &&default_value) { + // If current value is default, don't write it + if (!serialize_default_values && (value == default_value)) { + OnOptionalPropertyBegin(field_id, tag, false); + OnOptionalPropertyEnd(false); + return; + } + OnOptionalPropertyBegin(field_id, tag, true); + WriteValue(value.GetValue()); + OnOptionalPropertyEnd(true); + } + // Special case: data_ptr_T void WriteProperty(const field_id_t field_id, const char *tag, const_data_ptr_t ptr, idx_t count) { OnPropertyBegin(field_id, tag); diff --git a/src/duckdb/src/include/duckdb/common/sort/duckdb_pdqsort.hpp b/src/duckdb/src/include/duckdb/common/sort/duckdb_pdqsort.hpp index 78d40b91..7b239a15 100644 --- a/src/duckdb/src/include/duckdb/common/sort/duckdb_pdqsort.hpp +++ b/src/duckdb/src/include/duckdb/common/sort/duckdb_pdqsort.hpp @@ -46,6 +46,8 @@ using duckdb::make_unsafe_uniq_array; using duckdb::FastMemcpy; using duckdb::FastMemcmp; +// NOLINTBEGIN + enum { // Partitions below this size are sorted using insertion sort. insertion_sort_threshold = 24, @@ -704,5 +706,6 @@ inline void pdqsort_branchless(const PDQIterator &begin, const PDQIterator &end, } pdqsort_loop(begin, end, constants, log2(end - begin)); } +// NOLINTEND } // namespace duckdb_pdqsort diff --git a/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp b/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp index e4e9edcb..ef12c69e 100644 --- a/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp +++ b/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp @@ -209,6 +209,8 @@ class PartitionLocalMergeState { class PartitionGlobalMergeStates { public: struct Callback { + virtual ~Callback() = default; + virtual bool HasError() const { return false; } diff --git a/src/duckdb/src/include/duckdb/common/string_util.hpp b/src/duckdb/src/include/duckdb/common/string_util.hpp index e5eb9cd6..ecbc480c 100644 --- a/src/duckdb/src/include/duckdb/common/string_util.hpp +++ b/src/duckdb/src/include/duckdb/common/string_util.hpp @@ -148,8 +148,8 @@ class StringUtil { //! Join multiple items of container with given size, transformed to string //! using function, into one string using the given separator - template - static string Join(const C &input, S count, const string &separator, Func f) { + template + static string Join(const C &input, S count, const string &separator, FUNC f) { // The result std::string result; @@ -188,8 +188,8 @@ class StringUtil { DUCKDB_API static bool CILessThan(const string &l1, const string &l2); //! Format a string using printf semantics - template - static string Format(const string fmt_str, Args... params) { + template + static string Format(const string fmt_str, ARGS... params) { return Exception::ConstructMessage(fmt_str, params...); } diff --git a/src/duckdb/src/include/duckdb/common/tree_renderer.hpp b/src/duckdb/src/include/duckdb/common/tree_renderer.hpp index 1f2f9ea7..81601b81 100644 --- a/src/duckdb/src/include/duckdb/common/tree_renderer.hpp +++ b/src/duckdb/src/include/duckdb/common/tree_renderer.hpp @@ -39,36 +39,36 @@ struct RenderTree { }; struct TreeRendererConfig { - void enable_detailed() { - MAX_EXTRA_LINES = 1000; + void EnableDetailed() { + max_extra_lines = 1000; detailed = true; } - void enable_standard() { - MAX_EXTRA_LINES = 30; + void EnableStandard() { + max_extra_lines = 30; detailed = false; } - idx_t MAXIMUM_RENDER_WIDTH = 240; - idx_t NODE_RENDER_WIDTH = 29; - idx_t MINIMUM_RENDER_WIDTH = 15; - idx_t MAX_EXTRA_LINES = 30; + idx_t maximum_render_width = 240; + idx_t node_render_width = 29; + idx_t minimum_render_width = 15; + idx_t max_extra_lines = 30; bool detailed = false; #ifndef DUCKDB_ASCII_TREE_RENDERER - const char *LTCORNER = "\342\224\214"; // "┌"; - const char *RTCORNER = "\342\224\220"; // "┐"; - const char *LDCORNER = "\342\224\224"; // "└"; - const char *RDCORNER = "\342\224\230"; // "┘"; - - const char *MIDDLE = "\342\224\274"; // "┼"; - const char *TMIDDLE = "\342\224\254"; // "┬"; - const char *LMIDDLE = "\342\224\234"; // "├"; - const char *RMIDDLE = "\342\224\244"; // "┤"; - const char *DMIDDLE = "\342\224\264"; // "┴"; - - const char *VERTICAL = "\342\224\202"; // "│"; - const char *HORIZONTAL = "\342\224\200"; // "─"; + const char *LTCORNER = "\342\224\214"; // NOLINT "┌"; + const char *RTCORNER = "\342\224\220"; // NOLINT "┐"; + const char *LDCORNER = "\342\224\224"; // NOLINT "└"; + const char *RDCORNER = "\342\224\230"; // NOLINT "┘"; + + const char *MIDDLE = "\342\224\274"; // NOLINT "┼"; + const char *TMIDDLE = "\342\224\254"; // NOLINT "┬"; + const char *LMIDDLE = "\342\224\234"; // NOLINT "├"; + const char *RMIDDLE = "\342\224\244"; // NOLINT "┤"; + const char *DMIDDLE = "\342\224\264"; // NOLINT "┴"; + + const char *VERTICAL = "\342\224\202"; // NOLINT "│"; + const char *HORIZONTAL = "\342\224\200"; // NOLINT "─"; #else // ASCII version const char *LTCORNER = "<"; @@ -89,7 +89,7 @@ struct TreeRendererConfig { class TreeRenderer { public: - explicit TreeRenderer(TreeRendererConfig config_p = TreeRendererConfig()) : config(std::move(config_p)) { + explicit TreeRenderer(TreeRendererConfig config_p = TreeRendererConfig()) : config(config_p) { } string ToString(const LogicalOperator &op); @@ -105,10 +105,10 @@ class TreeRenderer { void ToStream(RenderTree &root, std::ostream &ss); void EnableDetailed() { - config.enable_detailed(); + config.EnableDetailed(); } void EnableStandard() { - config.enable_standard(); + config.EnableStandard(); } private: @@ -144,7 +144,6 @@ class TreeRenderer { template unique_ptr CreateRenderTree(const T &op); - string ExtractExpressionsRecursive(ExpressionInfo &states); }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/typedefs.hpp b/src/duckdb/src/include/duckdb/common/typedefs.hpp index 1d24002d..918f696f 100644 --- a/src/duckdb/src/include/duckdb/common/typedefs.hpp +++ b/src/duckdb/src/include/duckdb/common/typedefs.hpp @@ -37,27 +37,27 @@ typedef idx_t column_t; typedef idx_t storage_t; template -data_ptr_t data_ptr_cast(SRC *src) { +data_ptr_t data_ptr_cast(SRC *src) { // NOLINT: naming return reinterpret_cast(src); } template -const_data_ptr_t const_data_ptr_cast(const SRC *src) { +const_data_ptr_t const_data_ptr_cast(const SRC *src) { // NOLINT: naming return reinterpret_cast(src); } template -char *char_ptr_cast(SRC *src) { +char *char_ptr_cast(SRC *src) { // NOLINT: naming return reinterpret_cast(src); } template -const char *const_char_ptr_cast(const SRC *src) { +const char *const_char_ptr_cast(const SRC *src) { // NOLINT: naming return reinterpret_cast(src); } template -const unsigned char *const_uchar_ptr_cast(const SRC *src) { +const unsigned char *const_uchar_ptr_cast(const SRC *src) { // NOLINT: naming return reinterpret_cast(src); } diff --git a/src/duckdb/src/include/duckdb/common/types.hpp b/src/duckdb/src/include/duckdb/common/types.hpp index 46bd1136..bd5778ec 100644 --- a/src/duckdb/src/include/duckdb/common/types.hpp +++ b/src/duckdb/src/include/duckdb/common/types.hpp @@ -24,7 +24,7 @@ class TypeCatalogEntry; class Vector; class ClientContext; -struct string_t; +struct string_t; // NOLINT: mimic std casing template using child_list_t = vector>; @@ -32,12 +32,12 @@ using child_list_t = vector>; template using buffer_ptr = shared_ptr; -template -buffer_ptr make_buffer(Args &&...args) { - return make_shared(std::forward(args)...); +template +buffer_ptr make_buffer(ARGS &&...args) { // NOLINT: mimic std casing + return make_shared(std::forward(args)...); } -struct list_entry_t { +struct list_entry_t { // NOLINT: mimic std casing list_entry_t() = default; list_entry_t(uint64_t offset, uint64_t length) : offset(offset), length(length) { } @@ -234,7 +234,7 @@ enum class LogicalTypeId : uint8_t { struct ExtraTypeInfo; -struct aggregate_state_t; +struct aggregate_state_t; // NOLINT: mimic std casing struct LogicalType { DUCKDB_API LogicalType(); @@ -245,7 +245,7 @@ struct LogicalType { DUCKDB_API ~LogicalType(); - inline LogicalTypeId id() const { + inline LogicalTypeId id() const { // NOLINT: mimic std casing return id_; } inline PhysicalType InternalType() const { @@ -279,6 +279,9 @@ struct LogicalType { // copy assignment inline LogicalType &operator=(const LogicalType &other) { + if (this == &other) { + return *this; + } id_ = other.id_; physical_type_ = other.physical_type_; type_info_ = other.type_info_; @@ -337,9 +340,9 @@ struct LogicalType { bool Contains(LogicalTypeId type_id) const; private: - LogicalTypeId id_; - PhysicalType physical_type_; - shared_ptr type_info_; + LogicalTypeId id_; // NOLINT: allow this naming for legacy reasons + PhysicalType physical_type_; // NOLINT: allow this naming for legacy reasons + shared_ptr type_info_; // NOLINT: allow this naming for legacy reasons private: PhysicalType GetInternalType(); @@ -520,6 +523,7 @@ bool ApproxEqual(double l, double r); struct aggregate_state_t { aggregate_state_t() { } + // NOLINTNEXTLINE: work around bug in clang-tidy aggregate_state_t(string function_name_p, LogicalType return_type_p, vector bound_argument_types_p) : function_name(std::move(function_name_p)), return_type(std::move(return_type_p)), bound_argument_types(std::move(bound_argument_types_p)) { diff --git a/src/duckdb/src/include/duckdb/common/types/cast_helpers.hpp b/src/duckdb/src/include/duckdb/common/types/cast_helpers.hpp index cac8803f..2171702c 100644 --- a/src/duckdb/src/include/duckdb/common/types/cast_helpers.hpp +++ b/src/duckdb/src/include/duckdb/common/types/cast_helpers.hpp @@ -356,8 +356,7 @@ struct UhugeintToStringCast { string_t result = StringVector::EmptyString(vector, str.length()); auto data = result.GetDataWriteable(); - // null-termination not required - memcpy(data, str.data(), str.length()); + memcpy(data, str.data(), str.length()); // NOLINT: null-termination not required result.Finalize(); return result; } diff --git a/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp b/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp index 5e427ca6..1a747323 100644 --- a/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp +++ b/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp @@ -28,7 +28,7 @@ class ColumnDataCollection { //! Constructs an in-memory column data collection from an allocator DUCKDB_API ColumnDataCollection(Allocator &allocator, vector types); //! Constructs an empty (but valid) in-memory column data collection from an allocator - DUCKDB_API ColumnDataCollection(Allocator &allocator); + DUCKDB_API explicit ColumnDataCollection(Allocator &allocator); //! Constructs a buffer-managed column data collection DUCKDB_API ColumnDataCollection(BufferManager &buffer_manager, vector types); //! Constructs either an in-memory or a buffer-managed column data collection @@ -183,39 +183,39 @@ class ColumnDataCollection { //! The ColumnDataRowCollection represents a set of materialized rows, as obtained from the ColumnDataCollection class ColumnDataRowCollection { public: - DUCKDB_API ColumnDataRowCollection(const ColumnDataCollection &collection); + DUCKDB_API explicit ColumnDataRowCollection(const ColumnDataCollection &collection); public: DUCKDB_API Value GetValue(idx_t column, idx_t index) const; public: // container API - bool empty() const { + bool empty() const { // NOLINT: match stl API return rows.empty(); } - idx_t size() const { + idx_t size() const { // NOLINT: match stl API return rows.size(); } DUCKDB_API ColumnDataRow &operator[](idx_t i); DUCKDB_API const ColumnDataRow &operator[](idx_t i) const; - vector::iterator begin() { + vector::iterator begin() { // NOLINT: match stl API return rows.begin(); } - vector::iterator end() { + vector::iterator end() { // NOLINT: match stl API return rows.end(); } - vector::const_iterator cbegin() const { + vector::const_iterator cbegin() const { // NOLINT: match stl API return rows.cbegin(); } - vector::const_iterator cend() const { + vector::const_iterator cend() const { // NOLINT: match stl API return rows.cend(); } - vector::const_iterator begin() const { + vector::const_iterator begin() const { // NOLINT: match stl API return rows.begin(); } - vector::const_iterator end() const { + vector::const_iterator end() const { // NOLINT: match stl API return rows.end(); } diff --git a/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_iterators.hpp b/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_iterators.hpp index 3ceb700b..b84b81d4 100644 --- a/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_iterators.hpp +++ b/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_iterators.hpp @@ -43,17 +43,17 @@ class ColumnDataChunkIterationHelper { }; public: - ColumnDataChunkIterator begin() { + ColumnDataChunkIterator begin() { // NOLINT: match stl API return ColumnDataChunkIterator(&collection, column_ids); } - ColumnDataChunkIterator end() { + ColumnDataChunkIterator end() { // NOLINT: match stl API return ColumnDataChunkIterator(nullptr, vector()); } }; class ColumnDataRowIterationHelper { public: - DUCKDB_API ColumnDataRowIterationHelper(const ColumnDataCollection &collection); + DUCKDB_API explicit ColumnDataRowIterationHelper(const ColumnDataCollection &collection); private: const ColumnDataCollection &collection; @@ -79,8 +79,8 @@ class ColumnDataRowIterationHelper { }; public: - DUCKDB_API ColumnDataRowIterator begin(); - DUCKDB_API ColumnDataRowIterator end(); + DUCKDB_API ColumnDataRowIterator begin(); // NOLINT: match stl API + DUCKDB_API ColumnDataRowIterator end(); // NOLINT: match stl API }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/types/column/partitioned_column_data.hpp b/src/duckdb/src/include/duckdb/common/types/column/partitioned_column_data.hpp index 70caddba..058151cd 100644 --- a/src/duckdb/src/include/duckdb/common/types/column/partitioned_column_data.hpp +++ b/src/duckdb/src/include/duckdb/common/types/column/partitioned_column_data.hpp @@ -117,7 +117,7 @@ class PartitionedColumnData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; diff --git a/src/duckdb/src/include/duckdb/common/types/constraint_conflict_info.hpp b/src/duckdb/src/include/duckdb/common/types/constraint_conflict_info.hpp index a00bd3ee..6ead1a0f 100644 --- a/src/duckdb/src/include/duckdb/common/types/constraint_conflict_info.hpp +++ b/src/duckdb/src/include/duckdb/common/types/constraint_conflict_info.hpp @@ -11,14 +11,13 @@ class Index; class ConflictInfo { public: - ConflictInfo(const unordered_set &column_ids, bool only_check_unique = true) + explicit ConflictInfo(const unordered_set &column_ids, bool only_check_unique = true) : column_ids(column_ids), only_check_unique(only_check_unique) { } const unordered_set &column_ids; public: bool ConflictTargetMatches(Index &index) const; - void VerifyAllConflictsMeetCondition() const; public: bool only_check_unique = true; diff --git a/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp b/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp index 141dee91..353fdf58 100644 --- a/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp +++ b/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp @@ -131,7 +131,7 @@ class DataChunk { //! Slice all Vectors from other.data[i] to data[i + 'col_offset'] //! Turning all Vectors into Dictionary Vectors, using 'sel' - DUCKDB_API void Slice(DataChunk &other, const SelectionVector &sel, idx_t count, idx_t col_offset = 0); + DUCKDB_API void Slice(const DataChunk &other, const SelectionVector &sel, idx_t count, idx_t col_offset = 0); //! Slice a DataChunk from "offset" to "offset + count" DUCKDB_API void Slice(idx_t offset, idx_t count); @@ -150,7 +150,7 @@ class DataChunk { DUCKDB_API void Hash(vector &column_ids, Vector &result); //! Returns a list of types of the vectors of this data chunk - DUCKDB_API vector GetTypes(); + DUCKDB_API vector GetTypes() const; //! Converts this DataChunk to a printable string representation DUCKDB_API string ToString() const; diff --git a/src/duckdb/src/include/duckdb/common/types/date.hpp b/src/duckdb/src/include/duckdb/common/types/date.hpp index 548db1bc..f7061cab 100644 --- a/src/duckdb/src/include/duckdb/common/types/date.hpp +++ b/src/duckdb/src/include/duckdb/common/types/date.hpp @@ -18,7 +18,7 @@ namespace duckdb { -struct timestamp_t; +struct timestamp_t; // NOLINT: primitive case //! Type used to represent dates (days since 1970-01-01) struct date_t { // NOLINT diff --git a/src/duckdb/src/include/duckdb/common/types/hash.hpp b/src/duckdb/src/include/duckdb/common/types/hash.hpp index eeb84985..11ec5f71 100644 --- a/src/duckdb/src/include/duckdb/common/types/hash.hpp +++ b/src/duckdb/src/include/duckdb/common/types/hash.hpp @@ -14,13 +14,13 @@ namespace duckdb { struct string_t; -struct interval_t; +struct interval_t; // NOLINT // efficient hash function that maximizes the avalanche effect and minimizes // bias // see: https://nullprogram.com/blog/2018/07/31/ -inline hash_t murmurhash64(uint64_t x) { +inline hash_t MurmurHash64(uint64_t x) { x ^= x >> 32; x *= 0xd6e8feb86659fd93U; x ^= x >> 32; @@ -29,13 +29,13 @@ inline hash_t murmurhash64(uint64_t x) { return x; } -inline hash_t murmurhash32(uint32_t x) { - return murmurhash64(x); +inline hash_t MurmurHash32(uint32_t x) { + return MurmurHash64(x); } template hash_t Hash(T value) { - return murmurhash32(value); + return MurmurHash32(value); } //! Combine two hashes by XORing them diff --git a/src/duckdb/src/include/duckdb/common/types/hyperloglog.hpp b/src/duckdb/src/include/duckdb/common/types/hyperloglog.hpp index c46ce72a..76588a21 100644 --- a/src/duckdb/src/include/duckdb/common/types/hyperloglog.hpp +++ b/src/duckdb/src/include/duckdb/common/types/hyperloglog.hpp @@ -13,7 +13,7 @@ #include "hyperloglog.hpp" namespace duckdb_hll { -struct robj; +struct robj; // NOLINT } namespace duckdb { diff --git a/src/duckdb/src/include/duckdb/common/types/interval.hpp b/src/duckdb/src/include/duckdb/common/types/interval.hpp index a53f1ce7..e0fa6900 100644 --- a/src/duckdb/src/include/duckdb/common/types/interval.hpp +++ b/src/duckdb/src/include/duckdb/common/types/interval.hpp @@ -12,10 +12,10 @@ namespace duckdb { -struct dtime_t; -struct date_t; -struct dtime_tz_t; -struct timestamp_t; +struct dtime_t; // NOLINT: literal casing +struct date_t; // NOLINT: literal casing +struct dtime_tz_t; // NOLINT: literal casing +struct timestamp_t; // NOLINT: literal casing class Serializer; class Deserializer; diff --git a/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp b/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp index 3a4c7f56..6ca89aa7 100644 --- a/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +++ b/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp @@ -181,7 +181,7 @@ class PartitionedTupleData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; diff --git a/src/duckdb/src/include/duckdb/common/types/row/tuple_data_layout.hpp b/src/duckdb/src/include/duckdb/common/types/row/tuple_data_layout.hpp index f0d90e47..4bb64c88 100644 --- a/src/duckdb/src/include/duckdb/common/types/row/tuple_data_layout.hpp +++ b/src/duckdb/src/include/duckdb/common/types/row/tuple_data_layout.hpp @@ -50,6 +50,9 @@ class TupleDataLayout { inline Aggregates &GetAggregates() { return aggregates; } + const inline Aggregates &GetAggregates() const { + return aggregates; + } //! Returns a map from column id to the struct TupleDataLayout const inline TupleDataLayout &GetStructLayout(idx_t col_idx) const { D_ASSERT(struct_layouts->find(col_idx) != struct_layouts->end()); @@ -89,7 +92,11 @@ class TupleDataLayout { } //! Returns whether any of the aggregates have a destructor inline bool HasDestructor() const { - return has_destructor; + return !aggr_destructor_idxs.empty(); + } + //! Returns the indices of the aggregates that have destructors + inline const vector &GetAggregateDestructorIndices() const { + return aggr_destructor_idxs; } private: @@ -113,8 +120,8 @@ class TupleDataLayout { bool all_constant; //! Offset to the heap size of every row idx_t heap_size_offset; - //! Whether any of the aggregates have a destructor - bool has_destructor; + //! Indices of aggregate functions that have a destructor + vector aggr_destructor_idxs; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/types/row/tuple_data_segment.hpp b/src/duckdb/src/include/duckdb/common/types/row/tuple_data_segment.hpp index 7b8489f2..85496e4d 100644 --- a/src/duckdb/src/include/duckdb/common/types/row/tuple_data_segment.hpp +++ b/src/duckdb/src/include/duckdb/common/types/row/tuple_data_segment.hpp @@ -22,7 +22,7 @@ class TupleDataLayout; struct TupleDataChunkPart { public: - TupleDataChunkPart(mutex &lock); + explicit TupleDataChunkPart(mutex &lock); //! Disable copy constructors TupleDataChunkPart(const TupleDataChunkPart &other) = delete; diff --git a/src/duckdb/src/include/duckdb/common/types/selection_vector.hpp b/src/duckdb/src/include/duckdb/common/types/selection_vector.hpp index 976a72f4..db6d6e9b 100644 --- a/src/duckdb/src/include/duckdb/common/types/selection_vector.hpp +++ b/src/duckdb/src/include/duckdb/common/types/selection_vector.hpp @@ -43,7 +43,7 @@ struct SelectionVector { explicit SelectionVector(buffer_ptr data) { Initialize(std::move(data)); } - SelectionVector &operator=(SelectionVector &&other) { + SelectionVector &operator=(SelectionVector &&other) noexcept { sel_vector = other.sel_vector; other.sel_vector = nullptr; selection_data = std::move(other.selection_data); @@ -83,24 +83,24 @@ struct SelectionVector { sel_vector = other.sel_vector; } - inline void set_index(idx_t idx, idx_t loc) { + inline void set_index(idx_t idx, idx_t loc) { // NOLINT: allow casing for legacy reasons sel_vector[idx] = UnsafeNumericCast(loc); } - inline void swap(idx_t i, idx_t j) { + inline void swap(idx_t i, idx_t j) { // NOLINT: allow casing for legacy reasons sel_t tmp = sel_vector[i]; sel_vector[i] = sel_vector[j]; sel_vector[j] = tmp; } - inline idx_t get_index(idx_t idx) const { + inline idx_t get_index(idx_t idx) const { // NOLINT: allow casing for legacy reasons return sel_vector ? sel_vector[idx] : idx; } - sel_t *data() { + sel_t *data() { // NOLINT: allow casing for legacy reasons return sel_vector; } - const sel_t *data() const { + const sel_t *data() const { // NOLINT: allow casing for legacy reasons return sel_vector; } - buffer_ptr sel_data() { + buffer_ptr sel_data() { // NOLINT: allow casing for legacy reasons return selection_data; } buffer_ptr Slice(const SelectionVector &sel, idx_t count) const; @@ -119,7 +119,7 @@ struct SelectionVector { class OptionalSelection { public: - explicit inline OptionalSelection(SelectionVector *sel_p) { + explicit OptionalSelection(SelectionVector *sel_p) { Initialize(sel_p); } void Initialize(SelectionVector *sel_p) { @@ -130,7 +130,7 @@ class OptionalSelection { } } - inline operator SelectionVector *() { + inline operator SelectionVector *() { // NOLINT: allow implicit conversion to SelectionVector return sel; } @@ -169,10 +169,10 @@ class ManagedSelection { bool Initialized() const { return initialized; } - void Initialize(idx_t size) { + void Initialize(idx_t new_size) { D_ASSERT(!initialized); - this->size = size; - sel_vec.Initialize(size); + this->size = new_size; + sel_vec.Initialize(new_size); internal_opt_selvec.Initialize(&sel_vec); initialized = true; } diff --git a/src/duckdb/src/include/duckdb/common/types/string_heap.hpp b/src/duckdb/src/include/duckdb/common/types/string_heap.hpp index 788a6248..2dac802f 100644 --- a/src/duckdb/src/include/duckdb/common/types/string_heap.hpp +++ b/src/duckdb/src/include/duckdb/common/types/string_heap.hpp @@ -18,7 +18,7 @@ namespace duckdb { //! returned pointer will remain valid until the StringHeap is destroyed class StringHeap { public: - DUCKDB_API StringHeap(Allocator &allocator = Allocator::DefaultAllocator()); + DUCKDB_API explicit StringHeap(Allocator &allocator = Allocator::DefaultAllocator()); DUCKDB_API void Destroy(); DUCKDB_API void Move(StringHeap &other); diff --git a/src/duckdb/src/include/duckdb/common/types/string_type.hpp b/src/duckdb/src/include/duckdb/common/types/string_type.hpp index e0cb261b..1ec8bdc8 100644 --- a/src/duckdb/src/include/duckdb/common/types/string_type.hpp +++ b/src/duckdb/src/include/duckdb/common/types/string_type.hpp @@ -14,6 +14,7 @@ #include "duckdb/common/numeric_utils.hpp" #include +#include namespace duckdb { @@ -60,13 +61,11 @@ struct string_t { } } - string_t(const char *data) - : string_t(data, - UnsafeNumericCast(strlen(data))) { // NOLINT: Allow implicit conversion from `const char*` + string_t(const char *data) // NOLINT: Allow implicit conversion from `const char*` + : string_t(data, UnsafeNumericCast(strlen(data))) { } - string_t(const string &value) - : string_t(value.c_str(), - UnsafeNumericCast(value.size())) { // NOLINT: Allow implicit conversion from `const char*` + string_t(const string &value) // NOLINT: Allow implicit conversion from `const char*` + : string_t(value.c_str(), UnsafeNumericCast(value.size())) { } bool IsInlined() const { @@ -88,8 +87,8 @@ struct string_t { return value.inlined.inlined; } - char *GetPrefixWriteable() const { - return (char *)value.inlined.inlined; + char *GetPrefixWriteable() { + return value.inlined.inlined; } idx_t GetSize() const { @@ -142,20 +141,21 @@ struct string_t { struct StringComparisonOperators { static inline bool Equals(const string_t &a, const string_t &b) { #ifdef DUCKDB_DEBUG_NO_INLINE - if (a.GetSize() != b.GetSize()) + if (a.GetSize() != b.GetSize()) { return false; + } return (memcmp(a.GetData(), b.GetData(), a.GetSize()) == 0); #endif - uint64_t A = Load(const_data_ptr_cast(&a)); - uint64_t B = Load(const_data_ptr_cast(&b)); - if (A != B) { + uint64_t a_bulk_comp = Load(const_data_ptr_cast(&a)); + uint64_t b_bulk_comp = Load(const_data_ptr_cast(&b)); + if (a_bulk_comp != b_bulk_comp) { // Either length or prefix are different -> not equal return false; } // they have the same length and same prefix! - A = Load(const_data_ptr_cast(&a) + 8u); - B = Load(const_data_ptr_cast(&b) + 8u); - if (A == B) { + a_bulk_comp = Load(const_data_ptr_cast(&a) + 8u); + b_bulk_comp = Load(const_data_ptr_cast(&b) + 8u); + if (a_bulk_comp == b_bulk_comp) { // either they are both inlined (so compare equal) or point to the same string (so compare equal) return true; } @@ -177,11 +177,11 @@ struct string_t { const uint32_t min_length = std::min(left_length, right_length); #ifndef DUCKDB_DEBUG_NO_INLINE - uint32_t A = Load(const_data_ptr_cast(left.GetPrefix())); - uint32_t B = Load(const_data_ptr_cast(right.GetPrefix())); + uint32_t a_prefix = Load(const_data_ptr_cast(left.GetPrefix())); + uint32_t b_prefix = Load(const_data_ptr_cast(right.GetPrefix())); // Utility to move 0xa1b2c3d4 into 0xd4c3b2a1, basically inverting the order byte-a-byte - auto bswap = [](uint32_t v) -> uint32_t { + auto byte_swap = [](uint32_t v) -> uint32_t { uint32_t t1 = (v >> 16u) | (v << 16u); uint32_t t2 = t1 & 0x00ff00ff; uint32_t t3 = t1 & 0xff00ff00; @@ -194,8 +194,9 @@ struct string_t { // if the prefix is smaller(after bswap), it will stay smaller regardless of the extra bytes // if the prefix is equal, the extra bytes are guaranteed to be /0 for the shorter one - if (A != B) - return bswap(A) > bswap(B); + if (a_prefix != b_prefix) { + return byte_swap(a_prefix) > byte_swap(b_prefix); + } #endif auto memcmp_res = memcmp(left.GetData(), right.GetData(), min_length); return memcmp_res > 0 || (memcmp_res == 0 && left_length > right_length); diff --git a/src/duckdb/src/include/duckdb/common/types/time.hpp b/src/duckdb/src/include/duckdb/common/types/time.hpp index 20b76060..2611de10 100644 --- a/src/duckdb/src/include/duckdb/common/types/time.hpp +++ b/src/duckdb/src/include/duckdb/common/types/time.hpp @@ -14,8 +14,8 @@ namespace duckdb { -struct dtime_t; -struct dtime_tz_t; +struct dtime_t; // NOLINT +struct dtime_tz_t; // NOLINT //! The Time class is a static class that holds helper functions for the Time //! type. diff --git a/src/duckdb/src/include/duckdb/common/types/timestamp.hpp b/src/duckdb/src/include/duckdb/common/types/timestamp.hpp index cf7dce95..526b5a44 100644 --- a/src/duckdb/src/include/duckdb/common/types/timestamp.hpp +++ b/src/duckdb/src/include/duckdb/common/types/timestamp.hpp @@ -18,9 +18,9 @@ namespace duckdb { -struct date_t; -struct dtime_t; -struct dtime_tz_t; +struct date_t; // NOLINT +struct dtime_t; // NOLINT +struct dtime_tz_t; // NOLINT //! Type used to represent timestamps (seconds,microseconds,milliseconds or nanoseconds since 1970-01-01) struct timestamp_t { // NOLINT diff --git a/src/duckdb/src/include/duckdb/common/types/uuid.hpp b/src/duckdb/src/include/duckdb/common/types/uuid.hpp index 30cdc878..ae0d8a99 100644 --- a/src/duckdb/src/include/duckdb/common/types/uuid.hpp +++ b/src/duckdb/src/include/duckdb/common/types/uuid.hpp @@ -20,7 +20,7 @@ class UUID { public: constexpr static const uint8_t STRING_SIZE = 36; //! Convert a uuid string to a hugeint object - static bool FromString(string str, hugeint_t &result); + static bool FromString(const string &str, hugeint_t &result); //! Convert a uuid string to a hugeint object static bool FromCString(const char *str, idx_t len, hugeint_t &result) { return FromString(string(str, 0, len), result); @@ -42,7 +42,7 @@ class UUID { return string(buff, STRING_SIZE); } - static hugeint_t FromString(string str) { + static hugeint_t FromString(const string &str) { hugeint_t result; FromString(str, result); return result; diff --git a/src/duckdb/src/include/duckdb/common/types/value.hpp b/src/duckdb/src/include/duckdb/common/types/value.hpp index 43eac874..0328ee6f 100644 --- a/src/duckdb/src/include/duckdb/common/types/value.hpp +++ b/src/duckdb/src/include/duckdb/common/types/value.hpp @@ -191,13 +191,13 @@ class Value { DUCKDB_API static Value BIT(const string &data); //! Creates an aggregate state - DUCKDB_API static Value AGGREGATE_STATE(const LogicalType &type, const_data_ptr_t data, idx_t len); + DUCKDB_API static Value AGGREGATE_STATE(const LogicalType &type, const_data_ptr_t data, idx_t len); // NOLINT template T GetValue() const; template static Value CreateValue(T value) { - static_assert(AlwaysFalse::value, "No specialization exists for this type"); + static_assert(AlwaysFalse::VALUE, "No specialization exists for this type"); return Value(nullptr); } // Returns the internal value. Unlike GetValue(), this method does not perform casting, and assumes T matches the diff --git a/src/duckdb/src/include/duckdb/common/types/vector.hpp b/src/duckdb/src/include/duckdb/common/types/vector.hpp index a52b2bcc..b0786597 100644 --- a/src/duckdb/src/include/duckdb/common/types/vector.hpp +++ b/src/duckdb/src/include/duckdb/common/types/vector.hpp @@ -83,9 +83,9 @@ class Vector { //! Create a vector that references the other vector DUCKDB_API Vector(Vector &other); //! Create a vector that slices another vector - DUCKDB_API explicit Vector(Vector &other, const SelectionVector &sel, idx_t count); + DUCKDB_API explicit Vector(const Vector &other, const SelectionVector &sel, idx_t count); //! Create a vector that slices another vector between a pair of offsets - DUCKDB_API explicit Vector(Vector &other, idx_t offset, idx_t end); + DUCKDB_API explicit Vector(const Vector &other, idx_t offset, idx_t end); //! Create a vector of size one holding the passed on value DUCKDB_API explicit Vector(const Value &value); //! Create a vector of size tuple_count (non-standard) @@ -291,19 +291,19 @@ struct ConstantVector { struct DictionaryVector { static inline const SelectionVector &SelVector(const Vector &vector) { D_ASSERT(vector.GetVectorType() == VectorType::DICTIONARY_VECTOR); - return ((const DictionaryBuffer &)*vector.buffer).GetSelVector(); + return vector.buffer->Cast().GetSelVector(); } static inline SelectionVector &SelVector(Vector &vector) { D_ASSERT(vector.GetVectorType() == VectorType::DICTIONARY_VECTOR); - return ((DictionaryBuffer &)*vector.buffer).GetSelVector(); + return vector.buffer->Cast().GetSelVector(); } static inline const Vector &Child(const Vector &vector) { D_ASSERT(vector.GetVectorType() == VectorType::DICTIONARY_VECTOR); - return ((const VectorChildBuffer &)*vector.auxiliary).data; + return vector.auxiliary->Cast().data; } static inline Vector &Child(Vector &vector) { D_ASSERT(vector.GetVectorType() == VectorType::DICTIONARY_VECTOR); - return ((VectorChildBuffer &)*vector.auxiliary).data; + return vector.auxiliary->Cast().data; } }; @@ -390,6 +390,10 @@ struct ListVector { DUCKDB_API static void GetConsecutiveChildSelVector(Vector &list, SelectionVector &sel, idx_t offset, idx_t count); //! Share the entry of the other list vector DUCKDB_API static void ReferenceEntry(Vector &vector, Vector &other); + +private: + template + static T &GetEntryInternal(T &vector); }; struct StringVector { @@ -493,6 +497,10 @@ struct ArrayVector { DUCKDB_API static Vector &GetEntry(Vector &vector); //! Gets the total size of the underlying child-vector of an array DUCKDB_API static idx_t GetTotalSize(const Vector &vector); + +private: + template + static T &GetEntryInternal(T &vector); }; enum class UnionInvalidReason : uint8_t { @@ -552,7 +560,7 @@ struct UnionVector { struct SequenceVector { static void GetSequence(const Vector &vector, int64_t &start, int64_t &increment, int64_t &sequence_count) { D_ASSERT(vector.GetVectorType() == VectorType::SEQUENCE_VECTOR); - auto data = (int64_t *)vector.buffer->GetData(); + auto data = reinterpret_cast(vector.buffer->GetData()); start = data[0]; increment = data[1]; sequence_count = data[2]; diff --git a/src/duckdb/src/include/duckdb/common/types/vector_buffer.hpp b/src/duckdb/src/include/duckdb/common/types/vector_buffer.hpp index e1d49aac..7108b8db 100644 --- a/src/duckdb/src/include/duckdb/common/types/vector_buffer.hpp +++ b/src/duckdb/src/include/duckdb/common/types/vector_buffer.hpp @@ -131,7 +131,7 @@ class VectorBuffer { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; diff --git a/src/duckdb/src/include/duckdb/common/uhugeint.hpp b/src/duckdb/src/include/duckdb/common/uhugeint.hpp index fdb1e931..ba98df46 100644 --- a/src/duckdb/src/include/duckdb/common/uhugeint.hpp +++ b/src/duckdb/src/include/duckdb/common/uhugeint.hpp @@ -7,9 +7,9 @@ namespace duckdb { // Forward declaration to allow conversion between hugeint and uhugeint -struct hugeint_t; +struct hugeint_t; // NOLINT -struct uhugeint_t { +struct uhugeint_t { // NOLINT public: uint64_t lower; uint64_t upper; diff --git a/src/duckdb/src/include/duckdb/common/union_by_name.hpp b/src/duckdb/src/include/duckdb/common/union_by_name.hpp index d92ed71a..deef853e 100644 --- a/src/duckdb/src/include/duckdb/common/union_by_name.hpp +++ b/src/duckdb/src/include/duckdb/common/union_by_name.hpp @@ -29,7 +29,7 @@ class UnionByName { vector> union_readers; case_insensitive_map_t union_names_map; for (idx_t file_idx = 0; file_idx < files.size(); ++file_idx) { - const auto file_name = files[file_idx]; + const auto &file_name = files[file_idx]; auto reader = make_uniq(context, file_name, options); auto &col_names = reader->GetNames(); diff --git a/src/duckdb/src/include/duckdb/common/unique_ptr.hpp b/src/duckdb/src/include/duckdb/common/unique_ptr.hpp index f81270fb..d9f0b835 100644 --- a/src/duckdb/src/include/duckdb/common/unique_ptr.hpp +++ b/src/duckdb/src/include/duckdb/common/unique_ptr.hpp @@ -9,11 +9,11 @@ namespace duckdb { -template , bool SAFE = true> -class unique_ptr : public std::unique_ptr<_Tp, _Dp> { +template , bool SAFE = true> +class unique_ptr : public std::unique_ptr { // NOLINT: naming public: - using original = std::unique_ptr<_Tp, _Dp>; - using original::original; + using original = std::unique_ptr; + using original::original; // NOLINT private: static inline void AssertNotNull(const bool null) { @@ -27,17 +27,17 @@ class unique_ptr : public std::unique_ptr<_Tp, _Dp> { } public: - typename std::add_lvalue_reference<_Tp>::type operator*() const { + typename std::add_lvalue_reference::type operator*() const { // NOLINT: hiding on purpose const auto ptr = original::get(); - if (MemorySafety::enabled) { + if (MemorySafety::ENABLED) { AssertNotNull(!ptr); } return *ptr; } - typename original::pointer operator->() const { + typename original::pointer operator->() const { // NOLINT: hiding on purpose const auto ptr = original::get(); - if (MemorySafety::enabled) { + if (MemorySafety::ENABLED) { AssertNotNull(!ptr); } return ptr; @@ -48,15 +48,16 @@ class unique_ptr : public std::unique_ptr<_Tp, _Dp> { [[clang::reinitializes]] #endif inline void - reset(typename original::pointer ptr = typename original::pointer()) noexcept { + reset(typename original::pointer ptr = typename original::pointer()) noexcept { // NOLINT: hiding on purpose original::reset(ptr); } }; -template -class unique_ptr<_Tp[], _Dp, SAFE> : public std::unique_ptr<_Tp[], std::default_delete<_Tp[]>> { +template +class unique_ptr + : public std::unique_ptr> { public: - using original = std::unique_ptr<_Tp[], std::default_delete<_Tp[]>>; + using original = std::unique_ptr>; using original::original; private: @@ -71,9 +72,9 @@ class unique_ptr<_Tp[], _Dp, SAFE> : public std::unique_ptr<_Tp[], std::default_ } public: - typename std::add_lvalue_reference<_Tp>::type operator[](size_t __i) const { + typename std::add_lvalue_reference::type operator[](size_t __i) const { // NOLINT: hiding on purpose const auto ptr = original::get(); - if (MemorySafety::enabled) { + if (MemorySafety::ENABLED) { AssertNotNull(!ptr); } return ptr[__i]; diff --git a/src/duckdb/src/include/duckdb/common/vector.hpp b/src/duckdb/src/include/duckdb/common/vector.hpp index 66a6bc73..4d64675e 100644 --- a/src/duckdb/src/include/duckdb/common/vector.hpp +++ b/src/duckdb/src/include/duckdb/common/vector.hpp @@ -17,10 +17,10 @@ namespace duckdb { -template -class vector : public std::vector<_Tp, std::allocator<_Tp>> { +template +class vector : public std::vector> { // NOLINT: matching name of std public: - using original = std::vector<_Tp, std::allocator<_Tp>>; + using original = std::vector>; using original::original; using size_type = typename original::size_type; using const_reference = typename original::const_reference; @@ -43,59 +43,59 @@ class vector : public std::vector<_Tp, std::allocator<_Tp>> { [[clang::reinitializes]] #endif inline void - clear() noexcept { + clear() noexcept { // NOLINT: hiding on purpose original::clear(); } // Because we create the other constructor, the implicitly created constructor // gets deleted, so we have to be explicit vector() = default; - vector(original &&other) : original(std::move(other)) { + vector(original &&other) : original(std::move(other)) { // NOLINT: allow implicit conversion } - template - vector(vector<_Tp, _SAFE> &&other) : original(std::move(other)) { + template + vector(vector &&other) : original(std::move(other)) { // NOLINT: allow implicit conversion } - template - inline typename original::reference get(typename original::size_type __n) { - if (MemorySafety<_SAFE>::enabled) { + template + inline typename original::reference get(typename original::size_type __n) { // NOLINT: hiding on purpose + if (MemorySafety::ENABLED) { AssertIndexInBounds(__n, original::size()); } return original::operator[](__n); } - template - inline typename original::const_reference get(typename original::size_type __n) const { - if (MemorySafety<_SAFE>::enabled) { + template + inline typename original::const_reference get(typename original::size_type __n) const { // NOLINT: hiding on purpose + if (MemorySafety::ENABLED) { AssertIndexInBounds(__n, original::size()); } return original::operator[](__n); } - typename original::reference operator[](typename original::size_type __n) { + typename original::reference operator[](typename original::size_type __n) { // NOLINT: hiding on purpose return get(__n); } - typename original::const_reference operator[](typename original::size_type __n) const { + typename original::const_reference operator[](typename original::size_type __n) const { // NOLINT: hiding on purpose return get(__n); } - typename original::reference front() { + typename original::reference front() { // NOLINT: hiding on purpose return get(0); } - typename original::const_reference front() const { + typename original::const_reference front() const { // NOLINT: hiding on purpose return get(0); } - typename original::reference back() { - if (MemorySafety::enabled && original::empty()) { + typename original::reference back() { // NOLINT: hiding on purpose + if (MemorySafety::ENABLED && original::empty()) { throw InternalException("'back' called on an empty vector!"); } return get(original::size() - 1); } - typename original::const_reference back() const { - if (MemorySafety::enabled && original::empty()) { + typename original::const_reference back() const { // NOLINT: hiding on purpose + if (MemorySafety::ENABLED && original::empty()) { throw InternalException("'back' called on an empty vector!"); } return get(original::size() - 1); diff --git a/src/duckdb/src/include/duckdb/common/vector_operations/aggregate_executor.hpp b/src/duckdb/src/include/duckdb/common/vector_operations/aggregate_executor.hpp index 312dd065..87895f7b 100644 --- a/src/duckdb/src/include/duckdb/common/vector_operations/aggregate_executor.hpp +++ b/src/duckdb/src/include/duckdb/common/vector_operations/aggregate_executor.hpp @@ -444,6 +444,8 @@ class AggregateExecutor { op.Right(i, limit); break; case 0x03: + default: + D_ASSERT(overlap == 0x03); // i ∈ F ∩ P limit = MinValue(right->end, left->end); op.Both(i, limit); diff --git a/src/duckdb/src/include/duckdb/common/vector_operations/general_cast.hpp b/src/duckdb/src/include/duckdb/common/vector_operations/general_cast.hpp index 9dbde834..ced18223 100644 --- a/src/duckdb/src/include/duckdb/common/vector_operations/general_cast.hpp +++ b/src/duckdb/src/include/duckdb/common/vector_operations/general_cast.hpp @@ -24,7 +24,8 @@ struct VectorTryCastData { struct HandleVectorCastError { template - static RESULT_TYPE Operation(string error_message, ValidityMask &mask, idx_t idx, VectorTryCastData &cast_data) { + static RESULT_TYPE Operation(const string &error_message, ValidityMask &mask, idx_t idx, + VectorTryCastData &cast_data) { HandleCastError::AssignError(error_message, cast_data.parameters); cast_data.all_converted = false; mask.SetInvalid(idx); diff --git a/src/duckdb/src/include/duckdb/common/vector_operations/generic_executor.hpp b/src/duckdb/src/include/duckdb/common/vector_operations/generic_executor.hpp index 9eb20b33..aeb99c29 100644 --- a/src/duckdb/src/include/duckdb/common/vector_operations/generic_executor.hpp +++ b/src/duckdb/src/include/duckdb/common/vector_operations/generic_executor.hpp @@ -26,10 +26,9 @@ struct PrimitiveTypeState { template struct PrimitiveType { - PrimitiveType() { + PrimitiveType() = default; + PrimitiveType(INPUT_TYPE val) : val(val) { // NOLINT: allow implicit cast } - PrimitiveType(INPUT_TYPE val) : val(val) { - } // NOLINT: allow implicit cast INPUT_TYPE val; diff --git a/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp b/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp index d7f16f78..569b99ab 100644 --- a/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +++ b/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp @@ -50,7 +50,7 @@ template struct UnaryStringOperator { template static RESULT_TYPE Operation(INPUT_TYPE input, ValidityMask &mask, idx_t idx, void *dataptr) { - auto vector = (Vector *)dataptr; + auto vector = reinterpret_cast(dataptr); return OP::template Operation(input, *vector); } }; @@ -192,7 +192,8 @@ struct UnaryExecutor { template > static void Execute(Vector &input, Vector &result, idx_t count, FUNC fun) { - ExecuteStandard(input, result, count, (void *)&fun, false); + ExecuteStandard(input, result, count, + reinterpret_cast(&fun), false); } template diff --git a/src/duckdb/src/include/duckdb/common/vector_operations/vector_operations.hpp b/src/duckdb/src/include/duckdb/common/vector_operations/vector_operations.hpp index cd0ffbe0..514c703c 100644 --- a/src/duckdb/src/include/duckdb/common/vector_operations/vector_operations.hpp +++ b/src/duckdb/src/include/duckdb/common/vector_operations/vector_operations.hpp @@ -86,54 +86,72 @@ struct VectorOperations { //===--------------------------------------------------------------------===// // Select Comparisons //===--------------------------------------------------------------------===// - static idx_t Equals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, SelectionVector *true_sel, - SelectionVector *false_sel); - static idx_t NotEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); - static idx_t GreaterThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); - static idx_t GreaterThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); - static idx_t LessThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); - static idx_t LessThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t Equals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); + static idx_t NotEquals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); + static idx_t GreaterThan(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); + static idx_t GreaterThanEquals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); + static idx_t LessThan(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); + static idx_t LessThanEquals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); // true := A != B with nulls being equal - static idx_t DistinctFrom(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t DistinctFrom(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel); // true := A == B with nulls being equal - static idx_t NotDistinctFrom(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t NotDistinctFrom(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel); // true := A > B with nulls being maximal - static idx_t DistinctGreaterThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t DistinctGreaterThan(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); // true := A >= B with nulls being maximal - static idx_t DistinctGreaterThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t DistinctGreaterThanEquals(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask = nullptr); // true := A < B with nulls being maximal - static idx_t DistinctLessThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t DistinctLessThan(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); // true := A <= B with nulls being maximal - static idx_t DistinctLessThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t DistinctLessThanEquals(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask = nullptr); // true := A > B with nulls being minimal - static idx_t DistinctGreaterThanNullsFirst(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t DistinctGreaterThanNullsFirst(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask = nullptr); // true := A < B with nulls being minimal - static idx_t DistinctLessThanNullsFirst(Vector &left, Vector &right, const SelectionVector *sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t DistinctLessThanNullsFirst(Vector &left, Vector &right, optional_ptr sel, + idx_t count, optional_ptr true_sel, + optional_ptr false_sel, + optional_ptr null_mask = nullptr); //===--------------------------------------------------------------------===// // Nested Comparisons //===--------------------------------------------------------------------===// // true := A != B with nulls being equal - static idx_t NestedNotEquals(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t NestedNotEquals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); // true := A == B with nulls being equal - static idx_t NestedEquals(Vector &left, Vector &right, const SelectionVector &sel, idx_t count, - SelectionVector *true_sel, SelectionVector *false_sel); + static idx_t NestedEquals(Vector &left, Vector &right, optional_ptr sel, idx_t count, + optional_ptr true_sel, optional_ptr false_sel, + optional_ptr null_mask = nullptr); //===--------------------------------------------------------------------===// // Hash functions diff --git a/src/duckdb/src/include/duckdb/common/virtual_file_system.hpp b/src/duckdb/src/include/duckdb/common/virtual_file_system.hpp index 69990bcb..110ad048 100644 --- a/src/duckdb/src/include/duckdb/common/virtual_file_system.hpp +++ b/src/duckdb/src/include/duckdb/common/virtual_file_system.hpp @@ -19,9 +19,8 @@ class VirtualFileSystem : public FileSystem { public: VirtualFileSystem(); - unique_ptr OpenFile(const string &path, uint8_t flags, FileLockType lock = FileLockType::NO_LOCK, - FileCompressionType compression = FileCompressionType::UNCOMPRESSED, - FileOpener *opener = nullptr) override; + unique_ptr OpenFile(const string &path, FileOpenFlags flags, + optional_ptr opener = nullptr) override; void Read(FileHandle &handle, void *buffer, int64_t nr_bytes, idx_t location) override; void Write(FileHandle &handle, void *buffer, int64_t nr_bytes, idx_t location) override; @@ -39,22 +38,22 @@ class VirtualFileSystem : public FileSystem { void FileSync(FileHandle &handle) override; // need to look up correct fs for this - bool DirectoryExists(const string &directory) override; - void CreateDirectory(const string &directory) override; + bool DirectoryExists(const string &directory, optional_ptr opener) override; + void CreateDirectory(const string &directory, optional_ptr opener) override; - void RemoveDirectory(const string &directory) override; + void RemoveDirectory(const string &directory, optional_ptr opener) override; bool ListFiles(const string &directory, const std::function &callback, FileOpener *opener = nullptr) override; - void MoveFile(const string &source, const string &target) override; + void MoveFile(const string &source, const string &target, optional_ptr opener) override; - bool FileExists(const string &filename) override; + bool FileExists(const string &filename, optional_ptr opener) override; - bool IsPipe(const string &filename) override; - virtual void RemoveFile(const string &filename) override; + bool IsPipe(const string &filename, optional_ptr opener) override; + void RemoveFile(const string &filename, optional_ptr opener) override; - virtual vector Glob(const string &path, FileOpener *opener = nullptr) override; + vector Glob(const string &path, FileOpener *opener = nullptr) override; void RegisterSubSystem(unique_ptr fs) override; diff --git a/src/duckdb/src/include/duckdb/core_functions/aggregate/distributive_functions.hpp b/src/duckdb/src/include/duckdb/core_functions/aggregate/distributive_functions.hpp index 0510f76a..3f65ca26 100644 --- a/src/duckdb/src/include/duckdb/core_functions/aggregate/distributive_functions.hpp +++ b/src/duckdb/src/include/duckdb/core_functions/aggregate/distributive_functions.hpp @@ -255,7 +255,7 @@ struct SumFun { struct SumNoOverflowFun { static constexpr const char *Name = "sum_no_overflow"; static constexpr const char *Parameters = "arg"; - static constexpr const char *Description = "Calculates the sum value for all tuples in arg without overflow checks."; + static constexpr const char *Description = "Internal only. Calculates the sum value for all tuples in arg without overflow checks."; static constexpr const char *Example = "sum_no_overflow(A)"; static AggregateFunctionSet GetFunctions(); diff --git a/src/duckdb/src/include/duckdb/core_functions/aggregate/sum_helpers.hpp b/src/duckdb/src/include/duckdb/core_functions/aggregate/sum_helpers.hpp index 45f533a7..355701bd 100644 --- a/src/duckdb/src/include/duckdb/core_functions/aggregate/sum_helpers.hpp +++ b/src/duckdb/src/include/duckdb/core_functions/aggregate/sum_helpers.hpp @@ -65,6 +65,18 @@ struct RegularAdd { } }; +struct HugeintAdd { + template + static void AddNumber(STATE &state, T input) { + state.value = Hugeint::Add(state.value, input); + } + + template + static void AddConstant(STATE &state, T input, idx_t count) { + AddNumber(state, Hugeint::Multiply(input, count)); + } +}; + struct KahanAdd { template static void AddNumber(STATE &state, T input) { @@ -77,7 +89,7 @@ struct KahanAdd { } }; -struct HugeintAdd { +struct AddToHugeint { static void AddValue(hugeint_t &result, uint64_t value, int positive) { // integer summation taken from Tim Gubner et al. - Efficient Query Processing // with Optimistically Compressed Hash Tables & Strings in the USSR diff --git a/src/duckdb/src/include/duckdb/core_functions/function_list.hpp b/src/duckdb/src/include/duckdb/core_functions/function_list.hpp index 87eb5f8c..024ca49f 100644 --- a/src/duckdb/src/include/duckdb/core_functions/function_list.hpp +++ b/src/duckdb/src/include/duckdb/core_functions/function_list.hpp @@ -27,7 +27,7 @@ struct StaticFunctionDefinition { get_aggregate_function_t get_aggregate_function; get_aggregate_function_set_t get_aggregate_function_set; - static StaticFunctionDefinition *GetFunctionList(); + static const StaticFunctionDefinition *GetFunctionList(); }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/core_functions/lambda_functions.hpp b/src/duckdb/src/include/duckdb/core_functions/lambda_functions.hpp index f560bf4b..624e087d 100644 --- a/src/duckdb/src/include/duckdb/core_functions/lambda_functions.hpp +++ b/src/duckdb/src/include/duckdb/core_functions/lambda_functions.hpp @@ -88,7 +88,8 @@ class LambdaFunctions { result_validity = &FlatVector::Validity(result); if (list_column.GetType().id() == LogicalTypeId::SQLNULL) { - result_validity->SetInvalid(0); + result.SetVectorType(VectorType::CONSTANT_VECTOR); + ConstantVector::SetNull(result, true); result_is_null = true; return; } diff --git a/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp b/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp index d05b3576..797e96ca 100644 --- a/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +++ b/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp @@ -29,7 +29,7 @@ struct FlushMoveState; stores them in the HT. It uses linear probing for collision resolution. */ -struct aggr_ht_entry_t { +struct aggr_ht_entry_t { // NOLINT public: explicit aggr_ht_entry_t(hash_t value_p) : value(value_p) { } diff --git a/src/duckdb/src/include/duckdb/execution/column_binding_resolver.hpp b/src/duckdb/src/include/duckdb/execution/column_binding_resolver.hpp index 1c47a677..f98aeb2c 100644 --- a/src/duckdb/src/include/duckdb/execution/column_binding_resolver.hpp +++ b/src/duckdb/src/include/duckdb/execution/column_binding_resolver.hpp @@ -19,7 +19,7 @@ namespace duckdb { //! are used within the execution engine class ColumnBindingResolver : public LogicalOperatorVisitor { public: - ColumnBindingResolver(bool verify_only = false); + explicit ColumnBindingResolver(bool verify_only = false); void VisitOperator(LogicalOperator &op) override; static void Verify(LogicalOperator &op); diff --git a/src/duckdb/src/include/duckdb/execution/expression_executor.hpp b/src/duckdb/src/include/duckdb/execution/expression_executor.hpp index a3430435..804c6f25 100644 --- a/src/duckdb/src/include/duckdb/execution/expression_executor.hpp +++ b/src/duckdb/src/include/duckdb/execution/expression_executor.hpp @@ -158,6 +158,6 @@ class ExpressionExecutor { private: // it is possible to create an expression executor without a ClientContext - but it should be avoided DUCKDB_API ExpressionExecutor(); - DUCKDB_API ExpressionExecutor(const vector> &exprs); + DUCKDB_API explicit ExpressionExecutor(const vector> &exprs); }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/execution/expression_executor_state.hpp b/src/duckdb/src/include/duckdb/execution/expression_executor_state.hpp index 4edecb66..c0802db2 100644 --- a/src/duckdb/src/include/duckdb/execution/expression_executor_state.hpp +++ b/src/duckdb/src/include/duckdb/execution/expression_executor_state.hpp @@ -10,7 +10,6 @@ #include "duckdb/common/common.hpp" #include "duckdb/common/types/data_chunk.hpp" -#include "duckdb/common/cycle_counter.hpp" #include "duckdb/function/function.hpp" namespace duckdb { @@ -29,7 +28,6 @@ struct ExpressionState { vector> child_states; vector types; DataChunk intermediate_chunk; - CycleCounter profiler; public: void AddChild(Expression *expr); @@ -48,14 +46,14 @@ struct ExpressionState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; struct ExecuteFunctionState : public ExpressionState { ExecuteFunctionState(const Expression &expr, ExpressionExecutorState &root); - ~ExecuteFunctionState(); + ~ExecuteFunctionState() override; unique_ptr local_state; @@ -70,7 +68,6 @@ struct ExpressionExecutorState { unique_ptr root_state; ExpressionExecutor *executor = nullptr; - CycleCounter profiler; void Verify(); }; diff --git a/src/duckdb/src/include/duckdb/execution/merge_sort_tree.hpp b/src/duckdb/src/include/duckdb/execution/merge_sort_tree.hpp index b01d7087..6ce3048b 100644 --- a/src/duckdb/src/include/duckdb/execution/merge_sort_tree.hpp +++ b/src/duckdb/src/include/duckdb/execution/merge_sort_tree.hpp @@ -226,7 +226,7 @@ struct MergeSortTree { out << ((i && i % level_width == 0) ? group_separator : separator); out << std::setw(number_width) << level.first[i]; } - out << std::endl; + out << '\n'; } // Print the pointers if (!level.second.empty()) { @@ -239,7 +239,7 @@ struct MergeSortTree { : separator); out << std::setw(number_width) << level.second[idx + child_nr]; } - out << std::endl; + out << '\n'; } } level_width *= FANOUT; @@ -254,7 +254,7 @@ MergeSortTree::MergeSortTree(Elements &&lowest_level, const CMP const auto fanout = F; const auto cascading = C; const auto count = lowest_level.size(); - tree.emplace_back(Level(lowest_level, Offsets())); + tree.emplace_back(Level(std::move(lowest_level), Offsets())); const RunElement SENTINEL(MergeSortTraits::SENTINEL(), MergeSortTraits::SENTINEL()); diff --git a/src/duckdb/src/include/duckdb/execution/operator/aggregate/aggregate_object.hpp b/src/duckdb/src/include/duckdb/execution/operator/aggregate/aggregate_object.hpp index 874a02a2..b4c7e807 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/aggregate/aggregate_object.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/aggregate/aggregate_object.hpp @@ -17,13 +17,13 @@ class BoundAggregateExpression; class BoundWindowExpression; struct FunctionDataWrapper { - FunctionDataWrapper(unique_ptr function_data_p) : function_data(std::move(function_data_p)) { + explicit FunctionDataWrapper(unique_ptr function_data_p) : function_data(std::move(function_data_p)) { } unique_ptr function_data; }; -struct AggregateObject { +struct AggregateObject { // NOLINT: work-around bug in clang-tidy AggregateObject(AggregateFunction function, FunctionData *bind_data, idx_t child_count, idx_t payload_size, AggregateType aggr_type, PhysicalType return_type, Expression *filter = nullptr); explicit AggregateObject(BoundAggregateExpression *aggr); diff --git a/src/duckdb/src/include/duckdb/execution/operator/aggregate/distinct_aggregate_data.hpp b/src/duckdb/src/include/duckdb/execution/operator/aggregate/distinct_aggregate_data.hpp index 772d116a..59d2b7a0 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/aggregate/distinct_aggregate_data.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/aggregate/distinct_aggregate_data.hpp @@ -44,7 +44,7 @@ struct DistinctAggregateCollectionInfo { struct DistinctAggregateData { public: - DistinctAggregateData(const DistinctAggregateCollectionInfo &info); + explicit DistinctAggregateData(const DistinctAggregateCollectionInfo &info); DistinctAggregateData(const DistinctAggregateCollectionInfo &info, const GroupingSet &groups, const vector> *group_expressions); //! The data used by the hashtables diff --git a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/base_scanner.hpp b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/base_scanner.hpp index c8a2f886..29a62b8e 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/base_scanner.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/base_scanner.hpp @@ -252,7 +252,7 @@ class BaseScanner { Initialize(); initialized = true; } - if (!iterator.done) { + if (!iterator.done && cur_buffer_handle) { Process(result); } FinalizeChunkProcess(); diff --git a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/column_count_scanner.hpp b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/column_count_scanner.hpp index c641541d..ce2da960 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/column_count_scanner.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/column_count_scanner.hpp @@ -48,9 +48,6 @@ class ColumnCountScanner : public BaseScanner { ColumnCountScanner(shared_ptr buffer_manager, const shared_ptr &state_machine, shared_ptr error_handler); - ~ColumnCountScanner() { - } - ColumnCountResult &ParseChunk() override; ColumnCountResult &GetResult() override; diff --git a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_buffer.hpp b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_buffer.hpp index 72665ae2..7b86f238 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_buffer.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_buffer.hpp @@ -18,16 +18,17 @@ namespace duckdb { class CSVBufferHandle { public: - CSVBufferHandle(BufferHandle handle_p, idx_t actual_size_p, const bool is_final_buffer_p, idx_t file_idx_p, - idx_t buffer_index_p) - : handle(std::move(handle_p)), actual_size(actual_size_p), is_last_buffer(is_final_buffer_p), - file_idx(file_idx_p), buffer_idx(buffer_index_p) {}; - CSVBufferHandle() : actual_size(0), is_last_buffer(false), file_idx(0), buffer_idx(0) {}; + CSVBufferHandle(BufferHandle handle_p, idx_t actual_size_p, idx_t requested_size_p, const bool is_final_buffer_p, + idx_t file_idx_p, idx_t buffer_index_p) + : handle(std::move(handle_p)), actual_size(actual_size_p), requested_size(requested_size_p), + is_last_buffer(is_final_buffer_p), file_idx(file_idx_p), buffer_idx(buffer_index_p) {}; + CSVBufferHandle() : actual_size(0), requested_size(0), is_last_buffer(false), file_idx(0), buffer_idx(0) {}; ~CSVBufferHandle() { } //! Handle created during allocation BufferHandle handle; const idx_t actual_size; + const idx_t requested_size; const bool is_last_buffer; const idx_t file_idx; const idx_t buffer_idx; @@ -86,13 +87,15 @@ class CSVBuffer { ClientContext &context; //! Actual size can be smaller than the buffer size in case we allocate it too optimistically. idx_t actual_buffer_size; + idx_t requested_size; //! Global position from the CSV File where this buffer starts idx_t global_csv_start = 0; //! Number of the file that is in this buffer idx_t file_number = 0; //! If we can seek in the file or not. - //! If we can't seek, this means we can't destroy the buffers bool can_seek; + //! If this file is being fed by a pipe. + bool is_pipe; //! Buffer Index, used as a batch index for insertion-order preservation idx_t buffer_idx = 0; //! -------- Allocated Block ---------// diff --git a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_buffer_manager.hpp b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_buffer_manager.hpp index b9b4bb92..c81b2c87 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_buffer_manager.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_buffer_manager.hpp @@ -42,10 +42,12 @@ class CSVBufferManager { //! once. bool Done(); + void ResetBufferManager(); string GetFilePath(); ClientContext &context; idx_t skip_rows = 0; + bool sniffing = false; private: //! Reads next buffer in reference to cached_buffers.front() @@ -69,6 +71,7 @@ class CSVBufferManager { //! If the file_handle used seek bool has_seeked = false; unordered_set reset_when_possible; + bool is_pipe; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_error.hpp b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_error.hpp index e04b2a5c..340c42cd 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_error.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_error.hpp @@ -37,61 +37,79 @@ class LinesPerBoundary { }; enum CSVErrorType : uint8_t { - CAST_ERROR = 0, // If when casting a value from string to the column type fails - COLUMN_NAME_TYPE_MISMATCH = 1, // If there is a mismatch between Column Names and Types - INCORRECT_COLUMN_AMOUNT = 2, // If the CSV is missing a column - UNTERMINATED_QUOTES = 3, // If a quote is not terminated - SNIFFING = 4, // If something went wrong during sniffing and was not possible to find suitable candidates - MAXIMUM_LINE_SIZE = 5, // Maximum line size was exceeded by a line in the CSV File - NULLPADDED_QUOTED_NEW_VALUE = 6, // If the null_padding option is set and we have quoted new values in parallel - INVALID_UNICODE = 7 - + CAST_ERROR = 0, //! If when casting a value from string to the column type fails + COLUMN_NAME_TYPE_MISMATCH = 1, //! If there is a mismatch between Column Names and Types + TOO_FEW_COLUMNS = 2, //! If the CSV has too few columns + TOO_MANY_COLUMNS = 3, //! If the CSV has too many column + UNTERMINATED_QUOTES = 4, //! If a quote is not terminated + SNIFFING = 5, //! If something went wrong during sniffing and was not possible to find suitable candidates + MAXIMUM_LINE_SIZE = 6, //! Maximum line size was exceeded by a line in the CSV File + NULLPADDED_QUOTED_NEW_VALUE = 7, //! If the null_padding option is set, and we have quoted new values in parallel + INVALID_UNICODE = 8 //! If we have invalid unicode values }; class CSVError { public: CSVError() {}; - CSVError(string error_message, CSVErrorType type, idx_t column_idx, vector row, LinesPerBoundary error_info); + CSVError(string error_message, CSVErrorType type, idx_t column_idx, string csv_row, LinesPerBoundary error_info, + idx_t row_byte_position, int64_t byte_position, const CSVReaderOptions &reader_options, + const string &fixes); CSVError(string error_message, CSVErrorType type, LinesPerBoundary error_info); //! Produces error messages for column name -> type mismatch. static CSVError ColumnTypesError(case_insensitive_map_t sql_types_per_column, const vector &names); //! Produces error messages for casting errors static CSVError CastError(const CSVReaderOptions &options, string &column_name, string &cast_error, - idx_t column_idx, vector &row, LinesPerBoundary error_info, LogicalTypeId type); + idx_t column_idx, string &csv_row, LinesPerBoundary error_info, idx_t row_byte_position, + int64_t byte_position, LogicalTypeId type); //! Produces error for when the line size exceeds the maximum line size option - static CSVError LineSizeError(const CSVReaderOptions &options, idx_t actual_size, LinesPerBoundary error_info); + static CSVError LineSizeError(const CSVReaderOptions &options, idx_t actual_size, LinesPerBoundary error_info, + string &csv_row, idx_t byte_position); //! Produces error for when the sniffer couldn't find viable options static CSVError SniffingError(string &file_path); //! Produces error messages for unterminated quoted values - static CSVError UnterminatedQuotesError(const CSVReaderOptions &options, string_t *vector_ptr, - idx_t vector_line_start, idx_t current_column, LinesPerBoundary error_info); + static CSVError UnterminatedQuotesError(const CSVReaderOptions &options, idx_t current_column, + LinesPerBoundary error_info, string &csv_row, idx_t row_byte_position, + int64_t byte_position); //! Produces error messages for null_padding option is set and we have quoted new values in parallel static CSVError NullPaddingFail(const CSVReaderOptions &options, LinesPerBoundary error_info); //! Produces error for incorrect (e.g., smaller and lower than the predefined) number of columns in a CSV Line - static CSVError IncorrectColumnAmountError(const CSVReaderOptions &options, string_t *vector_ptr, - idx_t vector_line_start, idx_t actual_columns, - LinesPerBoundary error_info); - //! Produces error message when we detect an invalid utf-8 value - static CSVError InvalidUTF8(const CSVReaderOptions &options, LinesPerBoundary error_info); + static CSVError IncorrectColumnAmountError(const CSVReaderOptions &state_machine, idx_t actual_columns, + LinesPerBoundary error_info, string &csv_row, idx_t row_byte_position, + int64_t byte_position); + static CSVError InvalidUTF8(const CSVReaderOptions &options, idx_t current_column, LinesPerBoundary error_info, + string &csv_row, idx_t row_byte_position, int64_t byte_position); + idx_t GetBoundaryIndex() { return error_info.boundary_idx; } + //! We might want to remove newline in errors if we are doing them for the rejects tables + void RemoveNewLine(string &error); + //! Actual error message string error_message; + //! Full error message used in throws + //! 1. The Actual error + //! 2. How to fix it + //! 3. Options that generated the error + string full_error_message; //! Error Type CSVErrorType type; //! Column Index where error happened idx_t column_idx; - //! Values from the row where error happened - vector row; + //! Original CSV row where error happened + string csv_row; //! Line information regarding this error LinesPerBoundary error_info; + //! Byte position of where the row starts + idx_t row_byte_position; + //! Byte Position where error occurred. + int64_t byte_position; }; class CSVErrorHandler { public: - CSVErrorHandler(bool ignore_errors = false); + explicit CSVErrorHandler(bool ignore_errors = false); //! Throws the error void Error(CSVError csv_error, bool force_error = false); //! If we have a cached error, and we can now error, we error. diff --git a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_file_handle.hpp b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_file_handle.hpp index c7e70b00..43e4e275 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_file_handle.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_file_handle.hpp @@ -28,6 +28,9 @@ struct CSVFileHandle { bool CanSeek(); void Seek(idx_t position); bool OnDiskFile(); + bool IsPipe(); + + void Reset(); idx_t FileSize(); @@ -50,6 +53,8 @@ struct CSVFileHandle { string path; bool can_seek = false; bool on_disk_file = false; + bool is_pipe = false; + idx_t file_size = 0; idx_t requested_bytes = 0; diff --git a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_file_scanner.hpp b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_file_scanner.hpp index ce9fc08c..0ba7c0e0 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_file_scanner.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_file_scanner.hpp @@ -35,6 +35,7 @@ class CSVFileScan { const vector &GetNames(); const vector &GetTypes(); void InitializeProjection(); + void Finish(); //! Initialize the actual names and types to be scanned from the file void InitializeFileNamesTypes(); diff --git a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_option.hpp b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_option.hpp index 8c13e2c9..befbb0f6 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_option.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_option.hpp @@ -24,10 +24,12 @@ class Deserializer; //! Wrapper for CSV Options that can be manually set by the user //! It is important to make this difference for options that can be automatically sniffed AND manually set. template -struct CSVOption { +struct CSVOption { // NOLINT: work-around bug in clang-tidy public: - CSVOption(T value_p) : value(value_p) {}; - CSVOption(T value_p, bool set_by_user_p) : value(value_p), set_by_user(set_by_user_p) {}; + CSVOption(T value_p) : value(value_p) { // NOLINT: allow implicit conversion from value + } + CSVOption(T value_p, bool set_by_user_p) : value(value_p), set_by_user(set_by_user_p) { + } CSVOption() {}; //! Sets value. @@ -73,7 +75,7 @@ struct CSVOption { return value != other; } //! Returns CSV Option value - const T GetValue() const { + inline const T GetValue() const { return value; } bool IsSetByUser() const { diff --git a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_reader_options.hpp b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_reader_options.hpp index 2f1bd3ea..d929fb72 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_reader_options.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_reader_options.hpp @@ -40,19 +40,19 @@ struct CSVReaderOptions { //! See struct above. DialectOptions dialect_options; //! Whether or not we should ignore InvalidInput errors - bool ignore_errors = false; - //! Rejects table name - string rejects_table_name; + CSVOption ignore_errors = false; + //! Whether we store CSV Errors in the rejects table or not + CSVOption store_rejects = false; + //! Rejects table name (Name of the table the store rejects errors) + CSVOption rejects_table_name = {"reject_errors"}; + //! Rejects Scan name name (Name of the table the store rejects scans) + CSVOption rejects_scan_name = {"reject_scans"}; //! Rejects table entry limit (0 = no limit) idx_t rejects_limit = 0; - //! Columns to use as recovery key for rejected rows when reading with ignore_errors = true - vector rejects_recovery_columns; - //! Index of the recovery columns - vector rejects_recovery_column_ids; //! Number of samples to buffer idx_t buffer_sample_size = (idx_t)STANDARD_VECTOR_SIZE * 50; - //! Specifies the string that represents a null value - string null_str; + //! Specifies the strings that represents a null value + vector null_str = {""}; //! Whether file is compressed or not, and if so which compression type //! AUTO_DETECT (default; infer from file extension) FileCompressionType compression = FileCompressionType::AUTO_DETECT; @@ -85,6 +85,8 @@ struct CSVReaderOptions { //! Whether or not header names shall be normalized bool normalize_names = false; //! True, if column with that index must skip null check + unordered_set force_not_null_names; + //! True, if column with that index must skip null check vector force_not_null; //! Number of sample chunks used in auto-detection idx_t sample_size_chunks = 20480 / STANDARD_VECTOR_SIZE; @@ -107,6 +109,7 @@ struct CSVReaderOptions { //! User defined parameters for the csv function concatenated on a string string user_defined_parameters; + //===--------------------------------------------------------------------===// // WriteCSVOptions //===--------------------------------------------------------------------===// @@ -147,7 +150,7 @@ struct CSVReaderOptions { void SetNewline(const string &input); //! Set an option that is supported by both reading and writing functions, called by //! the SetReadOption and SetWriteOption methods - bool SetBaseOption(const string &loption, const Value &value); + bool SetBaseOption(const string &loption, const Value &value, bool write_option = false); //! loption - lowercase string //! set - argument(s) to the option @@ -162,5 +165,16 @@ struct CSVReaderOptions { string ToString() const; //! If the type for column with idx i was manually set bool WasTypeManuallySet(idx_t i) const; + + string NewLineIdentifierToString() { + switch (dialect_options.state_machine_options.new_line.GetValue()) { + case NewLineIdentifier::SINGLE: + return "\\n"; + case NewLineIdentifier::CARRY_ON: + return "\\r\\n"; + default: + return ""; + } + } }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_state_machine.hpp b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_state_machine.hpp index 49542782..a1628e10 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_state_machine.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/csv_state_machine.hpp @@ -54,6 +54,10 @@ struct CSVStates { return states[1] == CSVState::CARRIAGE_RETURN; } + inline bool IsInvalid() { + return states[1] == CSVState::INVALID; + } + inline bool IsQuoted() { return states[0] == CSVState::QUOTED; } diff --git a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/global_csv_state.hpp b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/global_csv_state.hpp index bbeb2bfe..648948c1 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/global_csv_state.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/global_csv_state.hpp @@ -30,7 +30,7 @@ struct CSVGlobalState : public GlobalTableFunctionState { //! Generates a CSV Scanner, with information regarding the piece of buffer it should be read. //! In case it returns a nullptr it means we are done reading these files. - unique_ptr Next(); + unique_ptr Next(optional_ptr previous_scanner); void FillRejectsTable(); @@ -75,6 +75,8 @@ struct CSVGlobalState : public GlobalTableFunctionState { atomic last_file_idx; shared_ptr current_buffer_in_use; + + unordered_map threads_per_file; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/skip_scanner.hpp b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/skip_scanner.hpp index 7fd54ee1..13db60eb 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/skip_scanner.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/skip_scanner.hpp @@ -42,9 +42,6 @@ class SkipScanner : public BaseScanner { SkipScanner(shared_ptr buffer_manager, const shared_ptr &state_machine, shared_ptr error_handler, idx_t rows_to_skip); - ~SkipScanner() { - } - SkipResult &ParseChunk() override; SkipResult &GetResult() override; diff --git a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/string_value_scanner.hpp b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/string_value_scanner.hpp index d48f1b44..9ad42fd1 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/string_value_scanner.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/string_value_scanner.hpp @@ -42,17 +42,54 @@ class LinePosition { } return other.buffer_size - other.buffer_pos + buffer_pos; } + + bool operator==(const LinePosition &other) const { + return buffer_pos == other.buffer_pos && buffer_idx == other.buffer_idx && buffer_size == other.buffer_size; + } + + idx_t GetGlobalPosition(idx_t requested_buffer_size, bool first_char_nl = false) { + return requested_buffer_size * buffer_idx + buffer_pos + first_char_nl; + } idx_t buffer_pos = 0; idx_t buffer_size = 0; idx_t buffer_idx = 0; }; +//! Keeps track of start and end of line positions in regard to the CSV file +class FullLinePosition { +public: + FullLinePosition() {}; + LinePosition begin; + LinePosition end; + + //! Reconstructs the current line to be used in error messages + string ReconstructCurrentLine(bool &first_char_nl, + unordered_map> &buffer_handles); +}; + +class CurrentError { +public: + CurrentError(CSVErrorType type, idx_t col_idx_p, LinePosition error_position_p) + : type(type), col_idx(col_idx_p), error_position(error_position_p) {}; + + CSVErrorType type; + idx_t col_idx; + idx_t current_line_size; + string error_message; + //! Exact Position where the error happened + LinePosition error_position; + + friend bool operator==(const CurrentError &error, CSVErrorType other) { + return error.type == other; + } +}; + class StringValueResult : public ScannerResult { public: StringValueResult(CSVStates &states, CSVStateMachine &state_machine, const shared_ptr &buffer_handle, Allocator &buffer_allocator, idx_t result_size, - idx_t buffer_position, CSVErrorHandler &error_hander, CSVIterator &iterator, bool store_line_size, - shared_ptr csv_file_scan, idx_t &lines_read, bool sniffing); + idx_t buffer_position, CSVErrorHandler &error_handler, CSVIterator &iterator, + bool store_line_size, shared_ptr csv_file_scan, idx_t &lines_read, bool sniffing); ~StringValueResult(); @@ -61,7 +98,7 @@ class StringValueResult : public ScannerResult { unsafe_vector validity_mask; //! Variables to iterate over the CSV buffers - idx_t last_position; + LinePosition last_position; char *buffer_ptr; idx_t buffer_size; @@ -69,8 +106,10 @@ class StringValueResult : public ScannerResult { const uint32_t number_of_columns; const bool null_padding; const bool ignore_errors; - const char *null_str_ptr; - const idx_t null_str_size; + + unsafe_unique_array null_str_ptr; + unsafe_unique_array null_str_size; + idx_t null_str_count; //! Internal Data Chunk used for flushing DataChunk parse_chunk; @@ -80,16 +119,16 @@ class StringValueResult : public ScannerResult { //! Information to properly handle errors CSVErrorHandler &error_handler; CSVIterator &iterator; - //! Where the previous line started, used to validate the maximum_line_size option - LinePosition previous_line_start; - LinePosition pre_previous_line_start; + //! Line position of the current line + FullLinePosition current_line_position; + //! Used for CSV line reconstruction on flushed errors + unordered_map line_positions_per_row; bool store_line_size = false; bool added_last_line = false; bool quoted_new_line = false; unsafe_unique_array> parse_types; vector names; - unordered_map cast_errors; shared_ptr csv_file_scan; idx_t &lines_read; @@ -99,10 +138,13 @@ class StringValueResult : public ScannerResult { idx_t chunk_col_id = 0; //! We must ensure that we keep the buffers alive until processing the query result - vector> buffer_handles; + unordered_map> buffer_handles; - //! If the current row has an error, we have to skip it - bool ignore_current_row = false; + //! Requested size of buffers (i.e., either 32Mb or set by buffer_size parameter) + idx_t requested_size; + + //! Errors happening in the current line (if any) + vector current_errors; bool sniffing; //! Specialized code for quoted values, makes sure to remove quotes and escapes @@ -119,8 +161,10 @@ class StringValueResult : public ScannerResult { //! Handles EmptyLine states static inline bool EmptyLine(StringValueResult &result, const idx_t buffer_pos); inline bool AddRowInternal(); - - void HandleOverLimitRows(); + //! Force the throw of a unicode error + void HandleUnicodeError(idx_t col_idx, LinePosition &error_position); + //! Certain errors should only be handled when adding the line, to ensure proper error propagation. + bool HandleError(); inline void AddValueToVector(const char *value_ptr, const idx_t size, bool allocate = false); @@ -143,9 +187,6 @@ class StringValueScanner : public BaseScanner { const shared_ptr &state_machine, const shared_ptr &error_handler); - ~StringValueScanner() { - } - StringValueResult &ParseChunk() override; //! Flushes the result to the insert_chunk diff --git a/src/duckdb/src/include/duckdb/execution/operator/helper/physical_batch_collector.hpp b/src/duckdb/src/include/duckdb/execution/operator/helper/physical_batch_collector.hpp index 88ae8f1b..aaa387c9 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/helper/physical_batch_collector.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/helper/physical_batch_collector.hpp @@ -14,7 +14,7 @@ namespace duckdb { class PhysicalBatchCollector : public PhysicalResultCollector { public: - PhysicalBatchCollector(PreparedStatementData &data); + explicit PhysicalBatchCollector(PreparedStatementData &data); public: unique_ptr GetResult(GlobalSinkState &state) override; diff --git a/src/duckdb/src/include/duckdb/execution/operator/helper/physical_explain_analyze.hpp b/src/duckdb/src/include/duckdb/execution/operator/helper/physical_explain_analyze.hpp index 9ecd71db..ee9da831 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/helper/physical_explain_analyze.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/helper/physical_explain_analyze.hpp @@ -18,7 +18,7 @@ class PhysicalExplainAnalyze : public PhysicalOperator { static constexpr const PhysicalOperatorType TYPE = PhysicalOperatorType::EXPLAIN_ANALYZE; public: - PhysicalExplainAnalyze(vector types) + explicit PhysicalExplainAnalyze(vector types) : PhysicalOperator(PhysicalOperatorType::EXPLAIN_ANALYZE, std::move(types), 1) { } diff --git a/src/duckdb/src/include/duckdb/execution/operator/helper/physical_prepare.hpp b/src/duckdb/src/include/duckdb/execution/operator/helper/physical_prepare.hpp index 01552842..961feca1 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/helper/physical_prepare.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/helper/physical_prepare.hpp @@ -19,9 +19,9 @@ class PhysicalPrepare : public PhysicalOperator { static constexpr const PhysicalOperatorType TYPE = PhysicalOperatorType::PREPARE; public: - PhysicalPrepare(string name, shared_ptr prepared, idx_t estimated_cardinality) - : PhysicalOperator(PhysicalOperatorType::PREPARE, {LogicalType::BOOLEAN}, estimated_cardinality), name(name), - prepared(std::move(prepared)) { + PhysicalPrepare(string name_p, shared_ptr prepared, idx_t estimated_cardinality) + : PhysicalOperator(PhysicalOperatorType::PREPARE, {LogicalType::BOOLEAN}, estimated_cardinality), + name(std::move(name_p)), prepared(std::move(prepared)) { } string name; diff --git a/src/duckdb/src/include/duckdb/execution/operator/helper/physical_set.hpp b/src/duckdb/src/include/duckdb/execution/operator/helper/physical_set.hpp index e5334563..994061ae 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/helper/physical_set.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/helper/physical_set.hpp @@ -25,7 +25,7 @@ class PhysicalSet : public PhysicalOperator { public: PhysicalSet(const std::string &name_p, Value value_p, SetScope scope_p, idx_t estimated_cardinality) : PhysicalOperator(PhysicalOperatorType::SET, {LogicalType::BOOLEAN}, estimated_cardinality), name(name_p), - value(value_p), scope(scope_p) { + value(std::move(value_p)), scope(scope_p) { } public: diff --git a/src/duckdb/src/include/duckdb/execution/operator/helper/physical_vacuum.hpp b/src/duckdb/src/include/duckdb/execution/operator/helper/physical_vacuum.hpp index 77238a04..1bc3d536 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/helper/physical_vacuum.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/helper/physical_vacuum.hpp @@ -20,9 +20,12 @@ class PhysicalVacuum : public PhysicalOperator { static constexpr const PhysicalOperatorType TYPE = PhysicalOperatorType::VACUUM; public: - PhysicalVacuum(unique_ptr info, idx_t estimated_cardinality); + PhysicalVacuum(unique_ptr info, optional_ptr table, + unordered_map column_id_map, idx_t estimated_cardinality); unique_ptr info; + optional_ptr table; + unordered_map column_id_map; public: // Source interface diff --git a/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_rejects_table.hpp b/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_rejects_table.hpp index 12c9bc61..7b88e0de 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_rejects_table.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_rejects_table.hpp @@ -14,19 +14,24 @@ class ClientContext; class CSVRejectsTable : public ObjectCacheEntry { public: - CSVRejectsTable(string name) : name(name), count(0) { + CSVRejectsTable(string rejects_scan, string rejects_error) + : count(0), scan_table(std::move(rejects_scan)), errors_table(std::move(rejects_error)) { } - ~CSVRejectsTable() override = default; mutex write_lock; string name; idx_t count; + string scan_table; + string errors_table; - static shared_ptr GetOrCreate(ClientContext &context, const string &name); + static shared_ptr GetOrCreate(ClientContext &context, const string &rejects_scan, + const string &rejects_error); void InitializeTable(ClientContext &context, const ReadCSVData &options); - TableCatalogEntry &GetTable(ClientContext &context); + TableCatalogEntry &GetErrorsTable(ClientContext &context); + TableCatalogEntry &GetScansTable(ClientContext &context); + + idx_t GetCurrentFileIndex(idx_t query_id); -public: static string ObjectType() { return "csv_rejects_table_cache"; } @@ -34,6 +39,12 @@ class CSVRejectsTable : public ObjectCacheEntry { string GetObjectType() override { return ObjectType(); } + +private: + //! Current File Index being used in the query + idx_t current_file_idx = 0; + //! Current Query ID being executed + idx_t current_query_id = 0; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/execution/physical_operator_states.hpp b/src/duckdb/src/include/duckdb/execution/physical_operator_states.hpp index b0bb166a..621c8124 100644 --- a/src/duckdb/src/include/duckdb/execution/physical_operator_states.hpp +++ b/src/duckdb/src/include/duckdb/execution/physical_operator_states.hpp @@ -52,7 +52,7 @@ class OperatorState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -69,7 +69,7 @@ class GlobalOperatorState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -90,7 +90,7 @@ class GlobalSinkState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } @@ -114,7 +114,7 @@ class LocalSinkState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -135,7 +135,7 @@ class GlobalSourceState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -152,7 +152,7 @@ class LocalSourceState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; diff --git a/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp b/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp index cd43ba55..64776321 100644 --- a/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +++ b/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp @@ -28,7 +28,7 @@ class PhysicalPlanGenerator { explicit PhysicalPlanGenerator(ClientContext &context); ~PhysicalPlanGenerator(); - DependencyList dependencies; + LogicalDependencyList dependencies; //! Recursive CTEs require at least one ChunkScan, referencing the working_table. //! This data structure is used to establish it. unordered_map> recursive_cte_tables; @@ -87,6 +87,7 @@ class PhysicalPlanGenerator { unique_ptr CreatePlan(LogicalSet &op); unique_ptr CreatePlan(LogicalReset &op); unique_ptr CreatePlan(LogicalSimple &op); + unique_ptr CreatePlan(LogicalVacuum &op); unique_ptr CreatePlan(LogicalUnnest &op); unique_ptr CreatePlan(LogicalRecursiveCTE &op); unique_ptr CreatePlan(LogicalMaterializedCTE &op); diff --git a/src/duckdb/src/include/duckdb/execution/window_executor.hpp b/src/duckdb/src/include/duckdb/execution/window_executor.hpp index 9a5051fa..8d134d05 100644 --- a/src/duckdb/src/include/duckdb/execution/window_executor.hpp +++ b/src/duckdb/src/include/duckdb/execution/window_executor.hpp @@ -131,7 +131,7 @@ class WindowExecutorState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; diff --git a/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp b/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp index 0cfbff28..bcdf8743 100644 --- a/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +++ b/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp @@ -31,7 +31,7 @@ class WindowAggregatorState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } diff --git a/src/duckdb/src/include/duckdb/function/aggregate_function.hpp b/src/duckdb/src/include/duckdb/function/aggregate_function.hpp index d113b511..9d333bc5 100644 --- a/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +++ b/src/duckdb/src/include/duckdb/function/aggregate_function.hpp @@ -79,7 +79,7 @@ typedef void (*aggregate_serialize_t)(Serializer &serializer, const optional_ptr const AggregateFunction &function); typedef unique_ptr (*aggregate_deserialize_t)(Deserializer &deserializer, AggregateFunction &function); -class AggregateFunction : public BaseScalarFunction { +class AggregateFunction : public BaseScalarFunction { // NOLINT: work-around bug in clang-tidy public: AggregateFunction(const string &name, const vector &arguments, const LogicalType &return_type, aggregate_size_t state_size, aggregate_initialize_t initialize, aggregate_update_t update, diff --git a/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp b/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp index 7d43ba35..d019592a 100644 --- a/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +++ b/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp @@ -20,9 +20,9 @@ typedef BoundCastInfo (*bind_cast_function_t)(BindCastInput &input, const Logica typedef int64_t (*implicit_cast_cost_t)(const LogicalType &from, const LogicalType &to); struct GetCastFunctionInput { - GetCastFunctionInput(optional_ptr context = nullptr) : context(context) { + explicit GetCastFunctionInput(optional_ptr context = nullptr) : context(context) { } - GetCastFunctionInput(ClientContext &context) : context(&context) { + explicit GetCastFunctionInput(ClientContext &context) : context(&context) { } optional_ptr context; @@ -30,8 +30,8 @@ struct GetCastFunctionInput { }; struct BindCastFunction { - BindCastFunction(bind_cast_function_t function, - unique_ptr info = nullptr); // NOLINT: allow implicit cast + BindCastFunction(bind_cast_function_t function, // NOLINT: allow implicit cast + unique_ptr info = nullptr); bind_cast_function_t function; unique_ptr info; @@ -40,7 +40,7 @@ struct BindCastFunction { class CastFunctionSet { public: CastFunctionSet(); - CastFunctionSet(DBConfig &config); + explicit CastFunctionSet(DBConfig &config); public: DUCKDB_API static CastFunctionSet &Get(ClientContext &context); diff --git a/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp b/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp index 4bf6b4a7..5d13c435 100644 --- a/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +++ b/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp @@ -30,7 +30,7 @@ struct BindCastInfo { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -48,7 +48,7 @@ struct BoundCastData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -104,9 +104,9 @@ typedef unique_ptr (*init_cast_local_state_t)(CastLocalState struct BoundCastInfo { DUCKDB_API - BoundCastInfo( + BoundCastInfo( // NOLINT: allow explicit cast from cast_function_t cast_function_t function, unique_ptr cast_data = nullptr, - init_cast_local_state_t init_local_state = nullptr); // NOLINT: allow explicit cast from cast_function_t + init_cast_local_state_t init_local_state = nullptr); cast_function_t function; init_cast_local_state_t init_local_state; unique_ptr cast_data; diff --git a/src/duckdb/src/include/duckdb/function/cast/vector_cast_helpers.hpp b/src/duckdb/src/include/duckdb/function/cast/vector_cast_helpers.hpp index 2b010d7d..9766df4e 100644 --- a/src/duckdb/src/include/duckdb/function/cast/vector_cast_helpers.hpp +++ b/src/duckdb/src/include/duckdb/function/cast/vector_cast_helpers.hpp @@ -21,7 +21,7 @@ template struct VectorStringCastOperator { template static RESULT_TYPE Operation(INPUT_TYPE input, ValidityMask &mask, idx_t idx, void *dataptr) { - auto result = (Vector *)dataptr; + auto result = reinterpret_cast(dataptr); return OP::template Operation(input, *result); } }; @@ -34,7 +34,7 @@ struct VectorTryCastOperator { if (DUCKDB_LIKELY(OP::template Operation(input, output))) { return output; } - auto data = (VectorTryCastData *)dataptr; + auto data = reinterpret_cast(dataptr); return HandleVectorCastError::Operation(CastExceptionText(input), mask, idx, *data); } @@ -44,7 +44,7 @@ template struct VectorTryCastStrictOperator { template static RESULT_TYPE Operation(INPUT_TYPE input, ValidityMask &mask, idx_t idx, void *dataptr) { - auto data = (VectorTryCastData *)dataptr; + auto data = reinterpret_cast(dataptr); RESULT_TYPE output; if (DUCKDB_LIKELY(OP::template Operation(input, output, data->parameters.strict))) { return output; @@ -58,7 +58,7 @@ template struct VectorTryCastErrorOperator { template static RESULT_TYPE Operation(INPUT_TYPE input, ValidityMask &mask, idx_t idx, void *dataptr) { - auto data = (VectorTryCastData *)dataptr; + auto data = reinterpret_cast(dataptr); RESULT_TYPE output; if (DUCKDB_LIKELY(OP::template Operation(input, output, data->parameters))) { return output; @@ -74,7 +74,7 @@ template struct VectorTryCastStringOperator { template static RESULT_TYPE Operation(INPUT_TYPE input, ValidityMask &mask, idx_t idx, void *dataptr) { - auto data = (VectorTryCastData *)dataptr; + auto data = reinterpret_cast(dataptr); RESULT_TYPE output; if (DUCKDB_LIKELY( OP::template Operation(input, output, data->result, data->parameters))) { @@ -99,7 +99,7 @@ template struct VectorDecimalCastOperator { template static RESULT_TYPE Operation(INPUT_TYPE input, ValidityMask &mask, idx_t idx, void *dataptr) { - auto data = (VectorDecimalCastData *)dataptr; + auto data = reinterpret_cast(dataptr); RESULT_TYPE result_value; if (!OP::template Operation(input, result_value, data->vector_cast_data.parameters, data->width, data->scale)) { diff --git a/src/duckdb/src/include/duckdb/function/compression_function.hpp b/src/duckdb/src/include/duckdb/function/compression_function.hpp index 4095e182..e34e2d0c 100644 --- a/src/duckdb/src/include/duckdb/function/compression_function.hpp +++ b/src/duckdb/src/include/duckdb/function/compression_function.hpp @@ -39,7 +39,7 @@ struct AnalyzeState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -55,7 +55,7 @@ struct CompressionState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -76,7 +76,7 @@ struct CompressedSegmentState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -96,7 +96,7 @@ struct CompressionAppendState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; diff --git a/src/duckdb/src/include/duckdb/function/copy_function.hpp b/src/duckdb/src/include/duckdb/function/copy_function.hpp index 639eb989..7e3a4808 100644 --- a/src/duckdb/src/include/duckdb/function/copy_function.hpp +++ b/src/duckdb/src/include/duckdb/function/copy_function.hpp @@ -21,8 +21,7 @@ class ColumnDataCollection; class ExecutionContext; struct LocalFunctionData { - virtual ~LocalFunctionData() { - } + virtual ~LocalFunctionData() = default; template TARGET &Cast() { @@ -31,14 +30,13 @@ struct LocalFunctionData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; struct GlobalFunctionData { - virtual ~GlobalFunctionData() { - } + virtual ~GlobalFunctionData() = default; template TARGET &Cast() { @@ -47,14 +45,13 @@ struct GlobalFunctionData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; struct PreparedBatchData { - virtual ~PreparedBatchData() { - } + virtual ~PreparedBatchData() = default; template TARGET &Cast() { @@ -63,18 +60,18 @@ struct PreparedBatchData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; struct CopyFunctionBindInput { + explicit CopyFunctionBindInput(const CopyInfo &info_p) : info(info_p) { + } + const CopyInfo &info; string file_extension; - - CopyFunctionBindInput(const CopyInfo &info_p) : info(info_p) { - } }; enum class CopyFunctionExecutionMode { REGULAR_COPY_TO_FILE, PARALLEL_COPY_TO_FILE, BATCH_COPY_TO_FILE }; @@ -114,7 +111,7 @@ enum class CopyTypeSupport { SUPPORTED, LOSSY, UNSUPPORTED }; typedef CopyTypeSupport (*copy_supports_type_t)(const LogicalType &type); -class CopyFunction : public Function { +class CopyFunction : public Function { // NOLINT: work-around bug in clang-tidy public: explicit CopyFunction(const string &name) : Function(name), plan(nullptr), copy_to_bind(nullptr), copy_to_initialize_local(nullptr), diff --git a/src/duckdb/src/include/duckdb/function/function.hpp b/src/duckdb/src/include/duckdb/function/function.hpp index e6c1ff7a..7e89476e 100644 --- a/src/duckdb/src/include/duckdb/function/function.hpp +++ b/src/duckdb/src/include/duckdb/function/function.hpp @@ -58,13 +58,13 @@ struct FunctionData { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } // FIXME: this function should be removed in the future template TARGET &CastNoConst() const { - return const_cast(reinterpret_cast(*this)); + return const_cast(Cast()); // NOLINT: FIXME } }; @@ -72,7 +72,7 @@ struct TableFunctionData : public FunctionData { // used to pass on projections to table functions that support them. NB, can contain COLUMN_IDENTIFIER_ROW_ID vector column_ids; - DUCKDB_API virtual ~TableFunctionData(); + DUCKDB_API ~TableFunctionData() override; DUCKDB_API unique_ptr Copy() const override; DUCKDB_API bool Equals(const FunctionData &other) const override; diff --git a/src/duckdb/src/include/duckdb/function/function_binder.hpp b/src/duckdb/src/include/duckdb/function/function_binder.hpp index 2c092957..bddc1ffb 100644 --- a/src/duckdb/src/include/duckdb/function/function_binder.hpp +++ b/src/duckdb/src/include/duckdb/function/function_binder.hpp @@ -27,26 +27,26 @@ class FunctionBinder { public: //! Bind a scalar function from the set of functions and input arguments. Returns the index of the chosen function, - //! returns DConstants::INVALID_INDEX and sets error if none could be found - DUCKDB_API idx_t BindFunction(const string &name, ScalarFunctionSet &functions, - const vector &arguments, ErrorData &error); - DUCKDB_API idx_t BindFunction(const string &name, ScalarFunctionSet &functions, - vector> &arguments, ErrorData &error); + //! returns optional_idx() and sets error if none could be found + DUCKDB_API optional_idx BindFunction(const string &name, ScalarFunctionSet &functions, + const vector &arguments, ErrorData &error); + DUCKDB_API optional_idx BindFunction(const string &name, ScalarFunctionSet &functions, + vector> &arguments, ErrorData &error); //! Bind an aggregate function from the set of functions and input arguments. Returns the index of the chosen - //! function, returns DConstants::INVALID_INDEX and sets error if none could be found - DUCKDB_API idx_t BindFunction(const string &name, AggregateFunctionSet &functions, - const vector &arguments, ErrorData &error); - DUCKDB_API idx_t BindFunction(const string &name, AggregateFunctionSet &functions, - vector> &arguments, ErrorData &error); + //! function, returns optional_idx() and sets error if none could be found + DUCKDB_API optional_idx BindFunction(const string &name, AggregateFunctionSet &functions, + const vector &arguments, ErrorData &error); + DUCKDB_API optional_idx BindFunction(const string &name, AggregateFunctionSet &functions, + vector> &arguments, ErrorData &error); //! Bind a table function from the set of functions and input arguments. Returns the index of the chosen - //! function, returns DConstants::INVALID_INDEX and sets error if none could be found - DUCKDB_API idx_t BindFunction(const string &name, TableFunctionSet &functions, const vector &arguments, - ErrorData &error); - DUCKDB_API idx_t BindFunction(const string &name, TableFunctionSet &functions, - vector> &arguments, ErrorData &error); + //! function, returns optional_idx() and sets error if none could be found + DUCKDB_API optional_idx BindFunction(const string &name, TableFunctionSet &functions, + const vector &arguments, ErrorData &error); + DUCKDB_API optional_idx BindFunction(const string &name, TableFunctionSet &functions, + vector> &arguments, ErrorData &error); //! Bind a pragma function from the set of functions and input arguments - DUCKDB_API idx_t BindFunction(const string &name, PragmaFunctionSet &functions, vector ¶meters, - ErrorData &error); + DUCKDB_API optional_idx BindFunction(const string &name, PragmaFunctionSet &functions, vector ¶meters, + ErrorData &error); DUCKDB_API unique_ptr BindScalarFunction(const string &schema, const string &name, vector> children, ErrorData &error, @@ -70,20 +70,21 @@ class FunctionBinder { private: //! Cast a set of expressions to the arguments of this function void CastToFunctionArguments(SimpleFunction &function, vector> &children); - int64_t BindVarArgsFunctionCost(const SimpleFunction &func, const vector &arguments); - int64_t BindFunctionCost(const SimpleFunction &func, const vector &arguments); + optional_idx BindVarArgsFunctionCost(const SimpleFunction &func, const vector &arguments); + optional_idx BindFunctionCost(const SimpleFunction &func, const vector &arguments); template vector BindFunctionsFromArguments(const string &name, FunctionSet &functions, const vector &arguments, ErrorData &error); template - idx_t MultipleCandidateException(const string &name, FunctionSet &functions, vector &candidate_functions, - const vector &arguments, ErrorData &error); + optional_idx MultipleCandidateException(const string &name, FunctionSet &functions, + vector &candidate_functions, const vector &arguments, + ErrorData &error); template - idx_t BindFunctionFromArguments(const string &name, FunctionSet &functions, const vector &arguments, - ErrorData &error); + optional_idx BindFunctionFromArguments(const string &name, FunctionSet &functions, + const vector &arguments, ErrorData &error); vector GetLogicalTypesFromExpressions(vector> &arguments); }; diff --git a/src/duckdb/src/include/duckdb/function/function_serialization.hpp b/src/duckdb/src/include/duckdb/function/function_serialization.hpp index fc33f5dc..9f9d4947 100644 --- a/src/duckdb/src/include/duckdb/function/function_serialization.hpp +++ b/src/duckdb/src/include/duckdb/function/function_serialization.hpp @@ -74,7 +74,7 @@ class FunctionSerializer { template static pair> Deserialize(Deserializer &deserializer, CatalogType catalog_type, vector> &children, - LogicalType return_type) { + LogicalType return_type) { // NOLINT: clang-tidy bug auto &context = deserializer.Get(); auto entry = DeserializeBase(deserializer, catalog_type); auto &function = entry.first; diff --git a/src/duckdb/src/include/duckdb/function/function_set.hpp b/src/duckdb/src/include/duckdb/function/function_set.hpp index 38989ad9..d20a5273 100644 --- a/src/duckdb/src/include/duckdb/function/function_set.hpp +++ b/src/duckdb/src/include/duckdb/function/function_set.hpp @@ -18,7 +18,7 @@ namespace duckdb { template class FunctionSet { public: - explicit FunctionSet(string name) : name(name) { + explicit FunctionSet(string name) : name(std::move(name)) { } //! The name of the function set diff --git a/src/duckdb/src/include/duckdb/function/pragma_function.hpp b/src/duckdb/src/include/duckdb/function/pragma_function.hpp index 85e86baa..91f55f3a 100644 --- a/src/duckdb/src/include/duckdb/function/pragma_function.hpp +++ b/src/duckdb/src/include/duckdb/function/pragma_function.hpp @@ -28,7 +28,7 @@ typedef void (*pragma_function_t)(ClientContext &context, const FunctionParamete //! -> this is similar to a call pragma but without parameters //! Pragma functions can either return a new query to execute (pragma_query_t) //! or they can -class PragmaFunction : public SimpleNamedParameterFunction { +class PragmaFunction : public SimpleNamedParameterFunction { // NOLINT: work-around bug in clang-tidy public: // Call DUCKDB_API static PragmaFunction PragmaCall(const string &name, pragma_query_t query, vector arguments, diff --git a/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp b/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp index 208e033e..28dd30ed 100644 --- a/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +++ b/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp @@ -44,13 +44,13 @@ struct RegexpExtractAll { struct RegexpBaseBindData : public FunctionData { RegexpBaseBindData(); RegexpBaseBindData(duckdb_re2::RE2::Options options, string constant_string, bool constant_pattern = true); - virtual ~RegexpBaseBindData(); + ~RegexpBaseBindData() override; duckdb_re2::RE2::Options options; string constant_string; bool constant_pattern; - virtual bool Equals(const FunctionData &other_p) const override; + bool Equals(const FunctionData &other_p) const override; }; struct RegexpMatchesBindData : public RegexpBaseBindData { @@ -105,7 +105,7 @@ struct RegexStringPieceArgs { } } - RegexStringPieceArgs &operator=(RegexStringPieceArgs &&other) { + RegexStringPieceArgs &operator=(RegexStringPieceArgs &&other) noexcept { std::swap(this->size, other.size); std::swap(this->capacity, other.capacity); std::swap(this->group_buffer, other.group_buffer); diff --git a/src/duckdb/src/include/duckdb/function/scalar/strftime_format.hpp b/src/duckdb/src/include/duckdb/function/scalar/strftime_format.hpp index abaa76de..a7b3addd 100644 --- a/src/duckdb/src/include/duckdb/function/scalar/strftime_format.hpp +++ b/src/duckdb/src/include/duckdb/function/scalar/strftime_format.hpp @@ -95,7 +95,7 @@ struct StrTimeFormat { DUCKDB_API virtual void AddFormatSpecifier(string preceding_literal, StrTimeSpecifier specifier); }; -struct StrfTimeFormat : public StrTimeFormat { +struct StrfTimeFormat : public StrTimeFormat { // NOLINT: work-around bug in clang-tidy DUCKDB_API idx_t GetLength(date_t date, dtime_t time, int32_t utc_offset, const char *tz_name); DUCKDB_API void FormatString(date_t date, int32_t data[8], const char *tz_name, char *target); @@ -128,7 +128,7 @@ struct StrfTimeFormat : public StrTimeFormat { char *target); }; -struct StrpTimeFormat : public StrTimeFormat { +struct StrpTimeFormat : public StrTimeFormat { // NOLINT: work-around bug in clang-tidy public: StrpTimeFormat(); @@ -137,15 +137,17 @@ struct StrpTimeFormat : public StrTimeFormat { int32_t data[8]; // year, month, day, hour, min, sec, µs, offset string tz; string error_message; - idx_t error_position = DConstants::INVALID_INDEX; + optional_idx error_position; bool is_special; date_t special; date_t ToDate(); + dtime_t ToTime(); timestamp_t ToTimestamp(); bool TryToDate(date_t &result); + bool TryToTime(dtime_t &result); bool TryToTimestamp(timestamp_t &result); DUCKDB_API string FormatError(string_t input, const string &format_specifier); @@ -160,16 +162,14 @@ struct StrpTimeFormat : public StrTimeFormat { DUCKDB_API bool Parse(string_t str, ParseResult &result) const; DUCKDB_API bool TryParseDate(string_t str, date_t &result, string &error_message) const; + DUCKDB_API bool TryParseTime(string_t str, dtime_t &result, string &error_message) const; DUCKDB_API bool TryParseTimestamp(string_t str, timestamp_t &result, string &error_message) const; - date_t ParseDate(string_t str); - timestamp_t ParseTimestamp(string_t str); - void Serialize(Serializer &serializer) const; static StrpTimeFormat Deserialize(Deserializer &deserializer); protected: - static string FormatStrpTimeError(const string &input, idx_t position); + static string FormatStrpTimeError(const string &input, optional_idx position); DUCKDB_API void AddFormatSpecifier(string preceding_literal, StrTimeSpecifier specifier) override; int NumericSpecifierWidth(StrTimeSpecifier specifier); int32_t TryParseCollection(const char *data, idx_t &pos, idx_t size, const string_t collection[], diff --git a/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp b/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp index 293dcec9..3fc6cf62 100644 --- a/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +++ b/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp @@ -12,14 +12,14 @@ #include "utf8proc.hpp" #include "duckdb/function/built_in_functions.hpp" -namespace re2 { +namespace duckdb_re2 { class RE2; } namespace duckdb { struct LowerFun { - static uint8_t ascii_to_lower_map[]; + static const uint8_t ASCII_TO_LOWER_MAP[]; //! Returns the length of the result string obtained from lowercasing the given input (in bytes) static idx_t LowerLength(const char *input_data, idx_t input_length); @@ -31,7 +31,7 @@ struct LowerFun { }; struct UpperFun { - static uint8_t ascii_to_upper_map[]; + static const uint8_t ASCII_TO_UPPER_MAP[]; static void RegisterFunction(BuiltinFunctions &set); }; diff --git a/src/duckdb/src/include/duckdb/function/scalar_function.hpp b/src/duckdb/src/include/duckdb/function/scalar_function.hpp index 485eaca8..917f09ee 100644 --- a/src/duckdb/src/include/duckdb/function/scalar_function.hpp +++ b/src/duckdb/src/include/duckdb/function/scalar_function.hpp @@ -29,14 +29,14 @@ struct FunctionLocalState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; class Binder; class BoundFunctionExpression; -class DependencyList; +class LogicalDependencyList; class ScalarFunctionCatalogEntry; struct FunctionStatisticsInput { @@ -61,7 +61,7 @@ typedef unique_ptr (*init_local_state_t)(ExpressionState &st const BoundFunctionExpression &expr, FunctionData *bind_data); //! The type to add the dependencies of this BoundFunctionExpression to the set of dependencies -typedef void (*dependency_function_t)(BoundFunctionExpression &expr, DependencyList &dependencies); +typedef void (*dependency_function_t)(BoundFunctionExpression &expr, LogicalDependencyList &dependencies); //! The type to propagate statistics for this scalar function typedef unique_ptr (*function_statistics_t)(ClientContext &context, FunctionStatisticsInput &input); //! The type to bind lambda-specific parameter types @@ -71,7 +71,7 @@ typedef void (*function_serialize_t)(Serializer &serializer, const optional_ptr< const ScalarFunction &function); typedef unique_ptr (*function_deserialize_t)(Deserializer &deserializer, ScalarFunction &function); -class ScalarFunction : public BaseScalarFunction { +class ScalarFunction : public BaseScalarFunction { // NOLINT: work-around bug in clang-tidy public: DUCKDB_API ScalarFunction(string name, vector arguments, LogicalType return_type, scalar_function_t function, bind_scalar_function_t bind = nullptr, @@ -135,7 +135,7 @@ class ScalarFunction : public BaseScalarFunction { public: template - static scalar_function_t GetScalarUnaryFunction(LogicalType type) { + static scalar_function_t GetScalarUnaryFunction(const LogicalType &type) { scalar_function_t function; switch (type.id()) { case LogicalTypeId::TINYINT: @@ -181,7 +181,7 @@ class ScalarFunction : public BaseScalarFunction { } template - static scalar_function_t GetScalarUnaryFunctionFixedReturn(LogicalType type) { + static scalar_function_t GetScalarUnaryFunctionFixedReturn(const LogicalType &type) { scalar_function_t function; switch (type.id()) { case LogicalTypeId::TINYINT: diff --git a/src/duckdb/src/include/duckdb/function/table/arrow.hpp b/src/duckdb/src/include/duckdb/function/table/arrow.hpp index d74e4f4d..8a920121 100644 --- a/src/duckdb/src/include/duckdb/function/table/arrow.hpp +++ b/src/duckdb/src/include/duckdb/function/table/arrow.hpp @@ -82,7 +82,7 @@ struct ArrowRunEndEncodingState { struct ArrowScanLocalState; struct ArrowArrayScanState { public: - ArrowArrayScanState(ArrowScanLocalState &state); + explicit ArrowArrayScanState(ArrowScanLocalState &state); public: ArrowScanLocalState &state; @@ -146,7 +146,7 @@ struct ArrowScanLocalState : public LocalTableFunctionState { if (it == array_states.end()) { auto child_p = make_uniq(*this); auto &child = *child_p; - array_states.emplace(std::make_pair(child_idx, std::move(child_p))); + array_states.emplace(child_idx, std::move(child_p)); return child; } return *it->second; diff --git a/src/duckdb/src/include/duckdb/function/table/arrow/arrow_duck_schema.hpp b/src/duckdb/src/include/duckdb/function/table/arrow/arrow_duck_schema.hpp index 08978559..2915be40 100644 --- a/src/duckdb/src/include/duckdb/function/table/arrow/arrow_duck_schema.hpp +++ b/src/duckdb/src/include/duckdb/function/table/arrow/arrow_duck_schema.hpp @@ -35,21 +35,21 @@ enum class ArrowDateTimeType : uint8_t { class ArrowType { public: //! From a DuckDB type - ArrowType(LogicalType type_p) + ArrowType(LogicalType type_p) // NOLINT: allow implicit conversion : type(std::move(type_p)), size_type(ArrowVariableSizeType::NORMAL), date_time_precision(ArrowDateTimeType::DAYS) {}; //! From a DuckDB type + fixed_size - ArrowType(LogicalType type_p, idx_t fixed_size_p) + ArrowType(LogicalType type_p, idx_t fixed_size_p) // NOLINT: work-around bug in clang-tidy : type(std::move(type_p)), size_type(ArrowVariableSizeType::FIXED_SIZE), date_time_precision(ArrowDateTimeType::DAYS), fixed_size(fixed_size_p) {}; //! From a DuckDB type + variable size type - ArrowType(LogicalType type_p, ArrowVariableSizeType size_type_p) + ArrowType(LogicalType type_p, ArrowVariableSizeType size_type_p) // NOLINT: work-around bug in clang-tidy : type(std::move(type_p)), size_type(size_type_p), date_time_precision(ArrowDateTimeType::DAYS) {}; //! From a DuckDB type + datetime type - ArrowType(LogicalType type_p, ArrowDateTimeType date_time_precision_p) + ArrowType(LogicalType type_p, ArrowDateTimeType date_time_precision_p) // NOLINT: work-around bug in clang-tidy : type(std::move(type_p)), size_type(ArrowVariableSizeType::NORMAL), date_time_precision(date_time_precision_p) {}; diff --git a/src/duckdb/src/include/duckdb/function/table/read_csv.hpp b/src/duckdb/src/include/duckdb/function/table/read_csv.hpp index 745e2b45..aeb50502 100644 --- a/src/duckdb/src/include/duckdb/function/table/read_csv.hpp +++ b/src/duckdb/src/include/duckdb/function/table/read_csv.hpp @@ -30,8 +30,6 @@ class ReadCSV { }; struct BaseCSVData : public TableFunctionData { - virtual ~BaseCSVData() { - } //! The file path of the CSV file to read or write vector files; //! The CSV reader options @@ -55,7 +53,7 @@ struct WriteCSVData : public BaseCSVData { //! The newline string to write string newline = "\n"; //! The size of the CSV file (in bytes) that we buffer before we flush it to disk - idx_t flush_size = 4096 * 8; + idx_t flush_size = 4096ULL * 8ULL; //! For each byte whether or not the CSV file requires quotes when containing the byte unsafe_unique_array requires_quotes; }; diff --git a/src/duckdb/src/include/duckdb/function/table/table_scan.hpp b/src/duckdb/src/include/duckdb/function/table/table_scan.hpp index 1195b421..7fb19ee3 100644 --- a/src/duckdb/src/include/duckdb/function/table/table_scan.hpp +++ b/src/duckdb/src/include/duckdb/function/table/table_scan.hpp @@ -32,7 +32,7 @@ struct TableScanBindData : public TableFunctionData { public: bool Equals(const FunctionData &other_p) const override { - auto &other = (const TableScanBindData &)other_p; + auto &other = other_p.Cast(); return &other.table == &table && result_ids == other.result_ids; } }; diff --git a/src/duckdb/src/include/duckdb/function/table_function.hpp b/src/duckdb/src/include/duckdb/function/table_function.hpp index feca3860..bd8e1769 100644 --- a/src/duckdb/src/include/duckdb/function/table_function.hpp +++ b/src/duckdb/src/include/duckdb/function/table_function.hpp @@ -21,7 +21,7 @@ namespace duckdb { class BaseStatistics; -class DependencyList; +class LogicalDependencyList; class LogicalGet; class TableFilterSet; class TableCatalogEntry; @@ -36,7 +36,7 @@ struct TableFunctionInfo { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -60,7 +60,7 @@ struct GlobalTableFunctionState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -75,7 +75,7 @@ struct LocalTableFunctionState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -83,9 +83,9 @@ struct LocalTableFunctionState { struct TableFunctionBindInput { TableFunctionBindInput(vector &inputs, named_parameter_map_t &named_parameters, vector &input_table_types, vector &input_table_names, - optional_ptr info) + optional_ptr info, optional_ptr binder) : inputs(inputs), named_parameters(named_parameters), input_table_types(input_table_types), - input_table_names(input_table_names), info(info) { + input_table_names(input_table_names), info(info), binder(binder) { } vector &inputs; @@ -93,6 +93,7 @@ struct TableFunctionBindInput { vector &input_table_types; vector &input_table_names; optional_ptr info; + optional_ptr binder; }; struct TableFunctionInitInput { @@ -134,7 +135,7 @@ struct TableFunctionInput { optional_ptr global_state; }; -enum ScanType { TABLE, PARQUET }; +enum class ScanType : uint8_t { TABLE, PARQUET }; struct BindInfo { public: @@ -145,11 +146,11 @@ struct BindInfo { ScanType type; optional_ptr table; - void InsertOption(const string &name, Value value) { + void InsertOption(const string &name, Value value) { // NOLINT: work-around bug in clang-tidy if (options.find(name) != options.end()) { throw InternalException("This option already exists"); } - options[name] = std::move(value); + options.emplace(name, std::move(value)); } template T GetOption(const string &name) { @@ -199,7 +200,7 @@ typedef BindInfo (*table_function_get_bind_info_t)(const optional_ptr (*table_function_cardinality_t)(ClientContext &context, const FunctionData *bind_data); typedef void (*table_function_pushdown_complex_filter_t)(ClientContext &context, LogicalGet &get, @@ -211,7 +212,7 @@ typedef void (*table_function_serialize_t)(Serializer &serializer, const optiona const TableFunction &function); typedef unique_ptr (*table_function_deserialize_t)(Deserializer &deserializer, TableFunction &function); -class TableFunction : public SimpleNamedParameterFunction { +class TableFunction : public SimpleNamedParameterFunction { // NOLINT: work-around bug in clang-tidy public: DUCKDB_API TableFunction(string name, vector arguments, table_function_t function, diff --git a/src/duckdb/src/include/duckdb/function/udf_function.hpp b/src/duckdb/src/include/duckdb/function/udf_function.hpp index a679d4ce..571a49af 100644 --- a/src/duckdb/src/include/duckdb/function/udf_function.hpp +++ b/src/duckdb/src/include/duckdb/function/udf_function.hpp @@ -13,31 +13,33 @@ namespace duckdb { +// NOLINTBEGIN + struct UDFWrapper { public: - template - inline static scalar_function_t CreateScalarFunction(const string &name, TR (*udf_func)(Args...)) { - const std::size_t num_template_argc = sizeof...(Args); + template + inline static scalar_function_t CreateScalarFunction(const string &name, TR (*udf_func)(ARGS...)) { + const std::size_t num_template_argc = sizeof...(ARGS); switch (num_template_argc) { case 1: - return CreateUnaryFunction(name, udf_func); + return CreateUnaryFunction(name, udf_func); case 2: - return CreateBinaryFunction(name, udf_func); + return CreateBinaryFunction(name, udf_func); case 3: - return CreateTernaryFunction(name, udf_func); + return CreateTernaryFunction(name, udf_func); default: // LCOV_EXCL_START throw std::runtime_error("UDF function only supported until ternary!"); } // LCOV_EXCL_STOP } - template - inline static scalar_function_t CreateScalarFunction(const string &name, vector args, - LogicalType ret_type, TR (*udf_func)(Args...)) { + template + inline static scalar_function_t CreateScalarFunction(const string &name, const vector &args, + const LogicalType &ret_type, TR (*udf_func)(ARGS...)) { if (!TypesMatch(ret_type)) { // LCOV_EXCL_START throw std::runtime_error("Return type doesn't match with the first template type."); } // LCOV_EXCL_STOP - const std::size_t num_template_types = sizeof...(Args); + const std::size_t num_template_types = sizeof...(ARGS); if (num_template_types != args.size()) { // LCOV_EXCL_START throw std::runtime_error( "The number of templated types should be the same quantity of the LogicalType arguments."); @@ -45,25 +47,25 @@ struct UDFWrapper { switch (num_template_types) { case 1: - return CreateUnaryFunction(name, args, ret_type, udf_func); + return CreateUnaryFunction(name, args, ret_type, udf_func); case 2: - return CreateBinaryFunction(name, args, ret_type, udf_func); + return CreateBinaryFunction(name, args, ret_type, udf_func); case 3: - return CreateTernaryFunction(name, args, ret_type, udf_func); + return CreateTernaryFunction(name, args, ret_type, udf_func); default: // LCOV_EXCL_START throw std::runtime_error("UDF function only supported until ternary!"); } // LCOV_EXCL_STOP } - template + template inline static void RegisterFunction(const string &name, scalar_function_t udf_function, ClientContext &context, LogicalType varargs = LogicalType(LogicalTypeId::INVALID)) { vector arguments; - GetArgumentTypesRecursive(arguments); + GetArgumentTypesRecursive(arguments); LogicalType ret_type = GetArgumentType(); - RegisterFunction(name, arguments, ret_type, udf_function, context, varargs); + RegisterFunction(name, arguments, ret_type, std::move(udf_function), context, std::move(varargs)); } static void RegisterFunction(string name, vector args, LogicalType ret_type, @@ -82,8 +84,8 @@ struct UDFWrapper { } template - inline static AggregateFunction CreateAggregateFunction(const string &name, LogicalType ret_type, - LogicalType input_type) { + inline static AggregateFunction CreateAggregateFunction(const string &name, const LogicalType &ret_type, + const LogicalType &input_type) { if (!TypesMatch(ret_type)) { // LCOV_EXCL_START throw std::runtime_error("The return argument don't match!"); } // LCOV_EXCL_STOP @@ -96,33 +98,34 @@ struct UDFWrapper { } template - inline static AggregateFunction CreateAggregateFunction(const string &name, LogicalType ret_type, - LogicalType input_typeA, LogicalType input_typeB) { + inline static AggregateFunction CreateAggregateFunction(const string &name, const LogicalType &ret_type, + const LogicalType &input_type_a, + const LogicalType &input_type_b) { if (!TypesMatch(ret_type)) { // LCOV_EXCL_START throw std::runtime_error("The return argument don't match!"); } - if (!TypesMatch(input_typeA)) { + if (!TypesMatch(input_type_a)) { throw std::runtime_error("The first input argument don't match!"); } - if (!TypesMatch(input_typeB)) { + if (!TypesMatch(input_type_b)) { throw std::runtime_error("The second input argument don't match!"); } // LCOV_EXCL_STOP - return CreateBinaryAggregateFunction(name, ret_type, input_typeA, input_typeB); + return CreateBinaryAggregateFunction(name, ret_type, input_type_a, input_type_b); } //! A generic CreateAggregateFunction ---------------------------------------------------------------------------// inline static AggregateFunction - CreateAggregateFunction(string name, vector arguments, LogicalType return_type, + CreateAggregateFunction(const string &name, const vector &arguments, const LogicalType &return_type, aggregate_size_t state_size, aggregate_initialize_t initialize, aggregate_update_t update, aggregate_combine_t combine, aggregate_finalize_t finalize, aggregate_simple_update_t simple_update = nullptr, bind_aggregate_function_t bind = nullptr, aggregate_destructor_t destructor = nullptr) { - AggregateFunction aggr_function(std::move(name), std::move(arguments), std::move(return_type), state_size, - initialize, update, combine, finalize, simple_update, bind, destructor); + AggregateFunction aggr_function(name, arguments, return_type, state_size, initialize, update, combine, finalize, + simple_update, bind, destructor); aggr_function.null_handling = FunctionNullHandling::SPECIAL_HANDLING; return aggr_function; } @@ -167,21 +170,21 @@ struct UDFWrapper { return udf_function; } - template + template inline static scalar_function_t CreateUnaryFunction(const string &name, - TR (*udf_func)(Args...)) { // LCOV_EXCL_START + TR (*udf_func)(ARGS...)) { // LCOV_EXCL_START throw std::runtime_error("Incorrect number of arguments for unary function"); } // LCOV_EXCL_STOP - template + template inline static scalar_function_t CreateBinaryFunction(const string &name, - TR (*udf_func)(Args...)) { // LCOV_EXCL_START + TR (*udf_func)(ARGS...)) { // LCOV_EXCL_START throw std::runtime_error("Incorrect number of arguments for binary function"); } // LCOV_EXCL_STOP - template + template inline static scalar_function_t CreateTernaryFunction(const string &name, - TR (*udf_func)(Args...)) { // LCOV_EXCL_START + TR (*udf_func)(ARGS...)) { // LCOV_EXCL_START throw std::runtime_error("Incorrect number of arguments for ternary function"); } // LCOV_EXCL_STOP @@ -208,10 +211,10 @@ struct UDFWrapper { } // LCOV_EXCL_STOP } - template + template inline static void GetArgumentTypesRecursive(vector &arguments) { arguments.push_back(GetArgumentType()); - GetArgumentTypesRecursive(arguments); + GetArgumentTypesRecursive(arguments); } template @@ -222,16 +225,16 @@ struct UDFWrapper { private: //-------------------------------- Argumented functions --------------------------------// - template - inline static scalar_function_t CreateUnaryFunction(const string &name, vector args, - LogicalType ret_type, - TR (*udf_func)(Args...)) { // LCOV_EXCL_START + template + inline static scalar_function_t CreateUnaryFunction(const string &name, const vector &args, + const LogicalType &ret_type, + TR (*udf_func)(ARGS...)) { // LCOV_EXCL_START throw std::runtime_error("Incorrect number of arguments for unary function"); } // LCOV_EXCL_STOP template - inline static scalar_function_t CreateUnaryFunction(const string &name, vector args, - LogicalType ret_type, TR (*udf_func)(TA)) { + inline static scalar_function_t CreateUnaryFunction(const string &name, const vector &args, + const LogicalType &ret_type, TR (*udf_func)(TA)) { if (args.size() != 1) { // LCOV_EXCL_START throw std::runtime_error("The number of LogicalType arguments (\"args\") should be 1!"); } @@ -246,16 +249,16 @@ struct UDFWrapper { return udf_function; } - template - inline static scalar_function_t CreateBinaryFunction(const string &name, vector args, - LogicalType ret_type, - TR (*udf_func)(Args...)) { // LCOV_EXCL_START + template + inline static scalar_function_t CreateBinaryFunction(const string &name, const vector &args, + const LogicalType &ret_type, + TR (*udf_func)(ARGS...)) { // LCOV_EXCL_START throw std::runtime_error("Incorrect number of arguments for binary function"); } // LCOV_EXCL_STOP template - inline static scalar_function_t CreateBinaryFunction(const string &name, vector args, - LogicalType ret_type, TR (*udf_func)(TA, TB)) { + inline static scalar_function_t CreateBinaryFunction(const string &name, const vector &args, + const LogicalType &ret_type, TR (*udf_func)(TA, TB)) { if (args.size() != 2) { // LCOV_EXCL_START throw std::runtime_error("The number of LogicalType arguments (\"args\") should be 2!"); } @@ -272,16 +275,16 @@ struct UDFWrapper { return udf_function; } - template - inline static scalar_function_t CreateTernaryFunction(const string &name, vector args, - LogicalType ret_type, - TR (*udf_func)(Args...)) { // LCOV_EXCL_START + template + inline static scalar_function_t CreateTernaryFunction(const string &name, const vector &args, + const LogicalType &ret_type, + TR (*udf_func)(ARGS...)) { // LCOV_EXCL_START throw std::runtime_error("Incorrect number of arguments for ternary function"); } // LCOV_EXCL_STOP template - inline static scalar_function_t CreateTernaryFunction(const string &name, vector args, - LogicalType ret_type, TR (*udf_func)(TA, TB, TC)) { + inline static scalar_function_t CreateTernaryFunction(const string &name, const vector &args, + const LogicalType &ret_type, TR (*udf_func)(TA, TB, TC)) { if (args.size() != 3) { // LCOV_EXCL_START throw std::runtime_error("The number of LogicalType arguments (\"args\") should be 3!"); } @@ -350,8 +353,8 @@ struct UDFWrapper { } template - inline static AggregateFunction CreateUnaryAggregateFunction(const string &name, LogicalType ret_type, - LogicalType input_type) { + inline static AggregateFunction CreateUnaryAggregateFunction(const string &name, const LogicalType &ret_type, + const LogicalType &input_type) { AggregateFunction aggr_function = AggregateFunction::UnaryAggregate(input_type, ret_type); aggr_function.name = name; @@ -361,19 +364,22 @@ struct UDFWrapper { template inline static AggregateFunction CreateBinaryAggregateFunction(const string &name) { LogicalType return_type = GetArgumentType(); - LogicalType input_typeA = GetArgumentType(); - LogicalType input_typeB = GetArgumentType(); - return CreateBinaryAggregateFunction(name, return_type, input_typeA, input_typeB); + LogicalType input_type_a = GetArgumentType(); + LogicalType input_type_b = GetArgumentType(); + return CreateBinaryAggregateFunction(name, return_type, input_type_a, input_type_b); } template - inline static AggregateFunction CreateBinaryAggregateFunction(const string &name, LogicalType ret_type, - LogicalType input_typeA, LogicalType input_typeB) { + inline static AggregateFunction CreateBinaryAggregateFunction(const string &name, const LogicalType &ret_type, + const LogicalType &input_type_a, + const LogicalType &input_type_b) { AggregateFunction aggr_function = - AggregateFunction::BinaryAggregate(input_typeA, input_typeB, ret_type); + AggregateFunction::BinaryAggregate(input_type_a, input_type_b, ret_type); aggr_function.name = name; return aggr_function; } }; // end UDFWrapper +// NOLINTEND + } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/main/appender.hpp b/src/duckdb/src/include/duckdb/main/appender.hpp index b966b6c5..f433c194 100644 --- a/src/duckdb/src/include/duckdb/main/appender.hpp +++ b/src/duckdb/src/include/duckdb/main/appender.hpp @@ -29,7 +29,7 @@ enum class AppenderType : uint8_t { class BaseAppender { protected: //! The amount of tuples that will be gathered in the column data collection before flushing - static constexpr const idx_t FLUSH_COUNT = STANDARD_VECTOR_SIZE * 100; + static constexpr const idx_t FLUSH_COUNT = STANDARD_VECTOR_SIZE * 100ULL; Allocator &allocator; //! The append types @@ -66,8 +66,8 @@ class BaseAppender { DUCKDB_API void Append(const char *value, uint32_t length); // prepared statements - template - void AppendRow(Args... args) { + template + void AppendRow(ARGS... args) { BeginRow(); AppendRowRecursive(args...); } @@ -80,7 +80,7 @@ class BaseAppender { vector &GetTypes() { return types; } - idx_t CurrentColumn() { + idx_t CurrentColumn() const { return column; } DUCKDB_API void AppendDataChunk(DataChunk &value); @@ -102,8 +102,8 @@ class BaseAppender { EndRow(); } - template - void AppendRowRecursive(T value, Args... args) { + template + void AppendRowRecursive(T value, ARGS... args) { Append(value); AppendRowRecursive(args...); } diff --git a/src/duckdb/src/include/duckdb/main/attached_database.hpp b/src/duckdb/src/include/duckdb/main/attached_database.hpp index 63d98684..b0037d0d 100644 --- a/src/duckdb/src/include/duckdb/main/attached_database.hpp +++ b/src/duckdb/src/include/duckdb/main/attached_database.hpp @@ -43,10 +43,11 @@ class AttachedDatabase : public CatalogEntry { const AttachInfo &info, AccessMode access_mode); ~AttachedDatabase() override; - void Initialize(); + void Initialize(optional_ptr context = nullptr); void Close(); Catalog &ParentCatalog() override; + const Catalog &ParentCatalog() const override; StorageManager &GetStorageManager(); Catalog &GetCatalog(); TransactionManager &GetTransactionManager(); @@ -61,6 +62,7 @@ class AttachedDatabase : public CatalogEntry { bool IsReadOnly() const; bool IsInitialDatabase() const; void SetInitialDatabase(); + void SetReadOnlyDatabase(); static bool NameIsReserved(const string &name); static string ExtractDatabaseName(const string &dbpath, FileSystem &fs); diff --git a/src/duckdb/src/include/duckdb/main/buffered_data/buffered_data.hpp b/src/duckdb/src/include/duckdb/main/buffered_data/buffered_data.hpp index a98bfad5..d831736d 100644 --- a/src/duckdb/src/include/duckdb/main/buffered_data/buffered_data.hpp +++ b/src/duckdb/src/include/duckdb/main/buffered_data/buffered_data.hpp @@ -23,7 +23,7 @@ class ClientContextLock; struct BlockedSink { public: - BlockedSink(InterruptState state, idx_t chunk_size) : state(state), chunk_size(chunk_size) { + BlockedSink(InterruptState state, idx_t chunk_size) : state(std::move(state)), chunk_size(chunk_size) { } public: @@ -38,7 +38,7 @@ class BufferedData { enum class Type { SIMPLE }; public: - BufferedData(Type type, weak_ptr context) : type(type), context(context) { + BufferedData(Type type, weak_ptr context) : type(type), context(std::move(context)) { } virtual ~BufferedData() { } diff --git a/src/duckdb/src/include/duckdb/main/buffered_data/simple_buffered_data.hpp b/src/duckdb/src/include/duckdb/main/buffered_data/simple_buffered_data.hpp index a33928c4..f83416c2 100644 --- a/src/duckdb/src/include/duckdb/main/buffered_data/simple_buffered_data.hpp +++ b/src/duckdb/src/include/duckdb/main/buffered_data/simple_buffered_data.hpp @@ -28,7 +28,7 @@ class SimpleBufferedData : public BufferedData { static constexpr idx_t BUFFER_SIZE = 100000; public: - SimpleBufferedData(weak_ptr context); + explicit SimpleBufferedData(weak_ptr context); ~SimpleBufferedData() override; public: diff --git a/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp b/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp index 2d27949a..a8746939 100644 --- a/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +++ b/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp @@ -75,8 +75,8 @@ struct DuckDBResultData { duckdb_type ConvertCPPTypeToC(const LogicalType &type); LogicalTypeId ConvertCTypeToCPP(duckdb_type c_type); idx_t GetCTypeSize(duckdb_type type); -duckdb_state duckdb_translate_result(unique_ptr result, duckdb_result *out); -bool deprecated_materialize_result(duckdb_result *result); +duckdb_state DuckDBTranslateResult(unique_ptr result, duckdb_result *out); +bool DeprecatedMaterializeResult(duckdb_result *result); duckdb_statement_type StatementTypeToC(duckdb::StatementType statement_type); } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/main/chunk_scan_state/query_result.hpp b/src/duckdb/src/include/duckdb/main/chunk_scan_state/query_result.hpp index acdb1086..37df093a 100644 --- a/src/duckdb/src/include/duckdb/main/chunk_scan_state/query_result.hpp +++ b/src/duckdb/src/include/duckdb/main/chunk_scan_state/query_result.hpp @@ -9,8 +9,8 @@ class QueryResult; class QueryResultChunkScanState : public ChunkScanState { public: - QueryResultChunkScanState(QueryResult &result); - ~QueryResultChunkScanState(); + explicit QueryResultChunkScanState(QueryResult &result); + ~QueryResultChunkScanState() override; public: bool LoadNextChunk(ErrorData &error) override; diff --git a/src/duckdb/src/include/duckdb/main/client_context.hpp b/src/duckdb/src/include/duckdb/main/client_context.hpp index 91aad130..34ed44e4 100644 --- a/src/duckdb/src/include/duckdb/main/client_context.hpp +++ b/src/duckdb/src/include/duckdb/main/client_context.hpp @@ -167,7 +167,7 @@ class ClientContext : public std::enable_shared_from_this { bool requires_valid_transaction = true); //! Equivalent to CURRENT_SETTING(key) SQL function. - DUCKDB_API SettingLookupResult TryGetCurrentSetting(const std::string &key, Value &result); + DUCKDB_API SettingLookupResult TryGetCurrentSetting(const std::string &key, Value &result) const; //! Returns the parser options for this client context DUCKDB_API ParserOptions GetParserOptions() const; diff --git a/src/duckdb/src/include/duckdb/main/client_context_file_opener.hpp b/src/duckdb/src/include/duckdb/main/client_context_file_opener.hpp index 90a4201d..061ed852 100644 --- a/src/duckdb/src/include/duckdb/main/client_context_file_opener.hpp +++ b/src/duckdb/src/include/duckdb/main/client_context_file_opener.hpp @@ -24,9 +24,10 @@ class ClientContextFileOpener : public FileOpener { SettingLookupResult TryGetCurrentSetting(const string &key, Value &result, FileOpenerInfo &info) override; SettingLookupResult TryGetCurrentSetting(const string &key, Value &result) override; - ClientContext *TryGetClientContext() override { + optional_ptr TryGetClientContext() override { return &context; - }; + } + optional_ptr TryGetDatabase() override; private: ClientContext &context; diff --git a/src/duckdb/src/include/duckdb/main/client_data.hpp b/src/duckdb/src/include/duckdb/main/client_data.hpp index 7c281806..596cb9f9 100644 --- a/src/duckdb/src/include/duckdb/main/client_data.hpp +++ b/src/duckdb/src/include/duckdb/main/client_data.hpp @@ -64,6 +64,7 @@ struct ClientData { public: DUCKDB_API static ClientData &Get(ClientContext &context); + DUCKDB_API static const ClientData &Get(const ClientContext &context); }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/main/client_properties.hpp b/src/duckdb/src/include/duckdb/main/client_properties.hpp index 238d96c2..ae75ef10 100644 --- a/src/duckdb/src/include/duckdb/main/client_properties.hpp +++ b/src/duckdb/src/include/duckdb/main/client_properties.hpp @@ -11,7 +11,8 @@ #include namespace duckdb { -enum ArrowOffsetSize { REGULAR, LARGE }; + +enum class ArrowOffsetSize : uint8_t { REGULAR, LARGE }; //! A set of properties from the client context that can be used to interpret the query result struct ClientProperties { diff --git a/src/duckdb/src/include/duckdb/main/config.hpp b/src/duckdb/src/include/duckdb/main/config.hpp index 468ec5bf..b514d0a3 100644 --- a/src/duckdb/src/include/duckdb/main/config.hpp +++ b/src/duckdb/src/include/duckdb/main/config.hpp @@ -34,6 +34,7 @@ namespace duckdb { +class BufferManager; class BufferPool; class CastFunctionSet; class ClientContext; @@ -59,7 +60,7 @@ typedef void (*set_global_function_t)(DatabaseInstance *db, DBConfig &config, co typedef void (*set_local_function_t)(ClientContext &context, const Value ¶meter); typedef void (*reset_global_function_t)(DatabaseInstance *db, DBConfig &config); typedef void (*reset_local_function_t)(ClientContext &context); -typedef Value (*get_setting_function_t)(ClientContext &context); +typedef Value (*get_setting_function_t)(const ClientContext &context); struct ConfigurationOption { const char *name; @@ -75,6 +76,7 @@ struct ConfigurationOption { typedef void (*set_option_callback_t)(ClientContext &context, SetScope scope, Value ¶meter); struct ExtensionOption { + // NOLINTNEXTLINE: work around bug in clang-tidy ExtensionOption(string description_p, LogicalType type_p, set_option_callback_t set_function_p, Value default_value_p) : description(std::move(description_p)), type(std::move(type_p)), set_function(set_function_p), @@ -127,6 +129,9 @@ struct DBConfigOptions { bool use_temporary_directory = true; //! Directory to store temporary structures that do not fit in memory string temporary_directory; + //! Whether or not to invoke filesystem trim on free blocks after checkpoint. This will reclaim + //! space for sparse files, on platforms that support it. + bool trim_free_blocks = false; //! Whether or not to allow printing unredacted secrets bool allow_unredacted_secrets = false; //! The collation type of the database @@ -170,6 +175,8 @@ struct DBConfigOptions { string extension_directory; //! Whether unsigned extensions should be loaded bool allow_unsigned_extensions = false; + //! Whether extensions with missing metadata should be loaded + bool allow_extensions_metadata_mismatch = false; //! Enable emitting FSST Vectors bool enable_fsst_vectors = false; //! Start transactions immediately in all attached databases - instead of lazily when a database is referenced @@ -181,7 +188,7 @@ struct DBConfigOptions { //! Whether or not the configuration settings can be altered bool lock_configuration = false; //! Whether to print bindings when printing the plan (debug mode only) - static bool debug_print_bindings; + static bool debug_print_bindings; // NOLINT: debug setting //! The peak allocation threshold at which to flush the allocator after completing a task (1 << 27, ~128MB) idx_t allocator_flush_threshold = 134217728; //! DuckDB API surface @@ -200,7 +207,7 @@ struct DBConfig { public: DUCKDB_API DBConfig(); - DUCKDB_API DBConfig(bool read_only); + explicit DUCKDB_API DBConfig(bool read_only); DUCKDB_API DBConfig(const case_insensitive_map_t &config_dict, bool read_only); DUCKDB_API ~DBConfig(); @@ -233,6 +240,8 @@ struct DBConfig { case_insensitive_map_t> storage_extensions; //! A buffer pool can be shared across multiple databases (if desired). shared_ptr buffer_pool; + //! Provide a custom buffer manager implementation (if desired). + shared_ptr buffer_manager; //! Set of callbacks that can be installed by extensions vector> extension_callbacks; @@ -249,9 +258,9 @@ struct DBConfig { DUCKDB_API void AddExtensionOption(const string &name, string description, LogicalType parameter, const Value &default_value = Value(), set_option_callback_t function = nullptr); //! Fetch an option by index. Returns a pointer to the option, or nullptr if out of range - DUCKDB_API static ConfigurationOption *GetOptionByIndex(idx_t index); + DUCKDB_API static optional_ptr GetOptionByIndex(idx_t index); //! Fetch an option by name. Returns a pointer to the option, or nullptr if none exists. - DUCKDB_API static ConfigurationOption *GetOptionByName(const string &name); + DUCKDB_API static optional_ptr GetOptionByName(const string &name); DUCKDB_API void SetOption(const ConfigurationOption &option, const Value &value); DUCKDB_API void SetOption(DatabaseInstance *db, const ConfigurationOption &option, const Value &value); DUCKDB_API void SetOptionByName(const string &name, const Value &value); diff --git a/src/duckdb/src/include/duckdb/main/connection.hpp b/src/duckdb/src/include/duckdb/main/connection.hpp index 5308c40a..8b729287 100644 --- a/src/duckdb/src/include/duckdb/main/connection.hpp +++ b/src/duckdb/src/include/duckdb/main/connection.hpp @@ -32,7 +32,7 @@ class LogicalOperator; class SelectStatement; struct CSVReaderOptions; -typedef void (*warning_callback)(std::string); +typedef void (*warning_callback_t)(std::string); //! A connection to a database. This represents a (client) connection that can //! be used to query the database. @@ -49,7 +49,7 @@ class Connection { DUCKDB_API ~Connection(); shared_ptr context; - warning_callback warning_cb; + warning_callback_t warning_cb; public: //! Returns query profiling information for the current query @@ -63,8 +63,6 @@ class Connection { //! Disable query profiling DUCKDB_API void DisableProfiling(); - DUCKDB_API void SetWarningCallback(warning_callback); - //! Enable aggressive verification/testing of queries, should only be used in testing DUCKDB_API void EnableQueryVerification(); DUCKDB_API void DisableQueryVerification(); @@ -83,8 +81,8 @@ class Connection { //! MaterializedQueryResult. DUCKDB_API unique_ptr Query(unique_ptr statement); // prepared statements - template - unique_ptr Query(const string &query, Args... args) { + template + unique_ptr Query(const string &query, ARGS... args) { vector values; return QueryParamsRecursive(query, values, args...); } @@ -167,28 +165,29 @@ class Connection { //! Fetch a list of table names that are required for a given query DUCKDB_API unordered_set GetTableNames(const string &query); - template - void CreateScalarFunction(const string &name, TR (*udf_func)(Args...)) { - scalar_function_t function = UDFWrapper::CreateScalarFunction(name, udf_func); - UDFWrapper::RegisterFunction(name, function, *context); + // NOLINTBEGIN + template + void CreateScalarFunction(const string &name, TR (*udf_func)(ARGS...)) { + scalar_function_t function = UDFWrapper::CreateScalarFunction(name, udf_func); + UDFWrapper::RegisterFunction(name, function, *context); } - template + template void CreateScalarFunction(const string &name, vector args, LogicalType ret_type, - TR (*udf_func)(Args...)) { - scalar_function_t function = UDFWrapper::CreateScalarFunction(name, args, ret_type, udf_func); + TR (*udf_func)(ARGS...)) { + scalar_function_t function = UDFWrapper::CreateScalarFunction(name, args, ret_type, udf_func); UDFWrapper::RegisterFunction(name, args, ret_type, function, *context); } - template + template void CreateVectorizedFunction(const string &name, scalar_function_t udf_func, LogicalType varargs = LogicalType::INVALID) { - UDFWrapper::RegisterFunction(name, udf_func, *context, std::move(varargs)); + UDFWrapper::RegisterFunction(name, udf_func, *context, std::move(varargs)); } void CreateVectorizedFunction(const string &name, vector args, LogicalType ret_type, scalar_function_t udf_func, LogicalType varargs = LogicalType::INVALID) { - UDFWrapper::RegisterFunction(name, std::move(args), std::move(ret_type), udf_func, *context, + UDFWrapper::RegisterFunction(name, std::move(args), std::move(ret_type), std::move(udf_func), *context, std::move(varargs)); } @@ -206,23 +205,24 @@ class Connection { } template - void CreateAggregateFunction(const string &name, LogicalType ret_type, LogicalType input_typeA) { + void CreateAggregateFunction(const string &name, LogicalType ret_type, LogicalType input_type_a) { AggregateFunction function = - UDFWrapper::CreateAggregateFunction(name, ret_type, input_typeA); + UDFWrapper::CreateAggregateFunction(name, ret_type, input_type_a); UDFWrapper::RegisterAggrFunction(function, *context); } template - void CreateAggregateFunction(const string &name, LogicalType ret_type, LogicalType input_typeA, - LogicalType input_typeB) { + void CreateAggregateFunction(const string &name, LogicalType ret_type, LogicalType input_type_a, + LogicalType input_type_b) { AggregateFunction function = - UDFWrapper::CreateAggregateFunction(name, ret_type, input_typeA, input_typeB); + UDFWrapper::CreateAggregateFunction(name, ret_type, input_type_a, input_type_b); UDFWrapper::RegisterAggrFunction(function, *context); } - void CreateAggregateFunction(const string &name, vector arguments, LogicalType return_type, - aggregate_size_t state_size, aggregate_initialize_t initialize, - aggregate_update_t update, aggregate_combine_t combine, aggregate_finalize_t finalize, + void CreateAggregateFunction(const string &name, const vector &arguments, + const LogicalType &return_type, aggregate_size_t state_size, + aggregate_initialize_t initialize, aggregate_update_t update, + aggregate_combine_t combine, aggregate_finalize_t finalize, aggregate_simple_update_t simple_update = nullptr, bind_aggregate_function_t bind = nullptr, aggregate_destructor_t destructor = nullptr) { @@ -231,12 +231,13 @@ class Connection { finalize, simple_update, bind, destructor); UDFWrapper::RegisterAggrFunction(function, *context); } + // NOLINTEND private: unique_ptr QueryParamsRecursive(const string &query, vector &values); - template - unique_ptr QueryParamsRecursive(const string &query, vector &values, T value, Args... args) { + template + unique_ptr QueryParamsRecursive(const string &query, vector &values, T value, ARGS... args) { values.push_back(Value::CreateValue(value)); return QueryParamsRecursive(query, values, args...); } diff --git a/src/duckdb/src/include/duckdb/main/database.hpp b/src/duckdb/src/include/duckdb/main/database.hpp index 4bd20046..7b84253e 100644 --- a/src/duckdb/src/include/duckdb/main/database.hpp +++ b/src/duckdb/src/include/duckdb/main/database.hpp @@ -25,6 +25,17 @@ class FileSystem; class TaskScheduler; class ObjectCache; struct AttachInfo; +class DatabaseFileSystem; + +struct ExtensionInfo { + explicit ExtensionInfo(const std::string &version) : extension_version(version) { + } + ExtensionInfo() : ExtensionInfo("defaultme") { + } + ExtensionInfo(const ExtensionInfo &x) : ExtensionInfo(x.extension_version) { + } + std::string extension_version; +}; class DatabaseInstance : public std::enable_shared_from_this { friend class DuckDB; @@ -39,22 +50,25 @@ class DatabaseInstance : public std::enable_shared_from_this { BufferPool &GetBufferPool() const; DUCKDB_API SecretManager &GetSecretManager(); DUCKDB_API BufferManager &GetBufferManager(); + DUCKDB_API const BufferManager &GetBufferManager() const; DUCKDB_API DatabaseManager &GetDatabaseManager(); DUCKDB_API FileSystem &GetFileSystem(); DUCKDB_API TaskScheduler &GetScheduler(); DUCKDB_API ObjectCache &GetObjectCache(); DUCKDB_API ConnectionManager &GetConnectionManager(); DUCKDB_API ValidChecker &GetValidChecker(); - DUCKDB_API void SetExtensionLoaded(const std::string &extension_name); + DUCKDB_API void SetExtensionLoaded(const std::string &extension_name, const std::string &extension_version = ""); idx_t NumberOfThreads(); DUCKDB_API static DatabaseInstance &GetDatabase(ClientContext &context); + DUCKDB_API static const DatabaseInstance &GetDatabase(const ClientContext &context); DUCKDB_API const unordered_set &LoadedExtensions(); + DUCKDB_API const unordered_map &LoadedExtensionsData(); DUCKDB_API bool ExtensionIsLoaded(const string &name); - DUCKDB_API SettingLookupResult TryGetCurrentSetting(const string &key, Value &result); + DUCKDB_API SettingLookupResult TryGetCurrentSetting(const string &key, Value &result) const; unique_ptr CreateAttachedDatabase(ClientContext &context, const AttachInfo &info, const string &type, AccessMode access_mode); @@ -66,13 +80,15 @@ class DatabaseInstance : public std::enable_shared_from_this { void Configure(DBConfig &config); private: - unique_ptr buffer_manager; + shared_ptr buffer_manager; unique_ptr db_manager; unique_ptr scheduler; unique_ptr object_cache; unique_ptr connection_manager; unordered_set loaded_extensions; + unordered_map loaded_extensions_data; ValidChecker db_validity; + unique_ptr db_file_system; }; //! The database object. This object holds the catalog and all the diff --git a/src/duckdb/src/include/duckdb/main/database_file_opener.hpp b/src/duckdb/src/include/duckdb/main/database_file_opener.hpp new file mode 100644 index 00000000..6cf21086 --- /dev/null +++ b/src/duckdb/src/include/duckdb/main/database_file_opener.hpp @@ -0,0 +1,58 @@ +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/main/database_file_opener.hpp +// +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include "duckdb/common/file_opener.hpp" +#include "duckdb/common/opener_file_system.hpp" +#include "duckdb/main/config.hpp" +#include "duckdb/main/database.hpp" + +namespace duckdb { +class DatabaseInstance; + +class DatabaseFileOpener : public FileOpener { +public: + explicit DatabaseFileOpener(DatabaseInstance &db_p) : db(db_p) { + } + + SettingLookupResult TryGetCurrentSetting(const string &key, Value &result) override { + return SettingLookupResult(); + } + + optional_ptr TryGetClientContext() override { + return nullptr; + } + + optional_ptr TryGetDatabase() override { + return &db; + } + +private: + DatabaseInstance &db; +}; + +class DatabaseFileSystem : public OpenerFileSystem { +public: + explicit DatabaseFileSystem(DatabaseInstance &db_p) : db(db_p), database_opener(db_p) { + } + + FileSystem &GetFileSystem() const override { + auto &config = DBConfig::GetConfig(db); + return *config.file_system; + } + optional_ptr GetOpener() const override { + return &database_opener; + } + +private: + DatabaseInstance &db; + mutable DatabaseFileOpener database_opener; +}; + +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/main/database_path_and_type.hpp b/src/duckdb/src/include/duckdb/main/database_path_and_type.hpp index 55269320..cbf2a56f 100644 --- a/src/duckdb/src/include/duckdb/main/database_path_and_type.hpp +++ b/src/duckdb/src/include/duckdb/main/database_path_and_type.hpp @@ -17,9 +17,9 @@ struct DBPathAndType { //! Parse database extension type and rest of path from combined form (type:path) static void ExtractExtensionPrefix(string &path, string &db_type); //! Check the magic bytes of a file and set the database type based on that - static void CheckMagicBytes(string &path, string &db_type, const DBConfig &config); + static void CheckMagicBytes(FileSystem &fs, string &path, string &db_type); //! Run ExtractExtensionPrefix followed by CheckMagicBytes - static void ResolveDatabaseType(string &path, string &db_type, const DBConfig &config); + static void ResolveDatabaseType(FileSystem &fs, string &path, string &db_type); }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/main/error_manager.hpp b/src/duckdb/src/include/duckdb/main/error_manager.hpp index a0d1c229..bb3fcc94 100644 --- a/src/duckdb/src/include/duckdb/main/error_manager.hpp +++ b/src/duckdb/src/include/duckdb/main/error_manager.hpp @@ -32,23 +32,23 @@ enum class ErrorType : uint16_t { //! It allows for error messages to be overridden by extensions and clients class ErrorManager { public: - template - string FormatException(ErrorType error_type, Args... params) { + template + string FormatException(ErrorType error_type, ARGS... params) { vector values; return FormatExceptionRecursive(error_type, values, params...); } DUCKDB_API string FormatExceptionRecursive(ErrorType error_type, vector &values); - template + template string FormatExceptionRecursive(ErrorType error_type, vector &values, T param, - Args... params) { + ARGS... params) { values.push_back(ExceptionFormatValue::CreateFormatValue(param)); return FormatExceptionRecursive(error_type, values, params...); } - template - static string FormatException(ClientContext &context, ErrorType error_type, Args... params) { + template + static string FormatException(ClientContext &context, ErrorType error_type, ARGS... params) { return Get(context).FormatException(error_type, params...); } diff --git a/src/duckdb/src/include/duckdb/main/extension_entries.hpp b/src/duckdb/src/include/duckdb/main/extension_entries.hpp index 3b84b154..c7b3b7e4 100644 --- a/src/duckdb/src/include/duckdb/main/extension_entries.hpp +++ b/src/duckdb/src/include/duckdb/main/extension_entries.hpp @@ -47,6 +47,8 @@ static constexpr ExtensionFunctionEntry EXTENSION_FUNCTIONS[] = { {"fuzzyduck", "sqlsmith", CatalogType::TABLE_FUNCTION_ENTRY}, {"get_substrait", "substrait", CatalogType::TABLE_FUNCTION_ENTRY}, {"get_substrait_json", "substrait", CatalogType::TABLE_FUNCTION_ENTRY}, + {"hnsw_compact_index", "vss", CatalogType::PRAGMA_FUNCTION_ENTRY}, + {"hnsw_index_scan", "vss", CatalogType::TABLE_FUNCTION_ENTRY}, {"host", "inet", CatalogType::SCALAR_FUNCTION_ENTRY}, {"iceberg_metadata", "iceberg", CatalogType::TABLE_FUNCTION_ENTRY}, {"iceberg_scan", "iceberg", CatalogType::TABLE_FUNCTION_ENTRY}, @@ -88,9 +90,11 @@ static constexpr ExtensionFunctionEntry EXTENSION_FUNCTIONS[] = { {"pg_clear_cache", "postgres_scanner", CatalogType::TABLE_FUNCTION_ENTRY}, {"pg_timezone_names", "icu", CatalogType::TABLE_FUNCTION_ENTRY}, {"postgres_attach", "postgres_scanner", CatalogType::TABLE_FUNCTION_ENTRY}, + {"postgres_execute", "postgres_scanner", CatalogType::TABLE_FUNCTION_ENTRY}, {"postgres_query", "postgres_scanner", CatalogType::TABLE_FUNCTION_ENTRY}, {"postgres_scan", "postgres_scanner", CatalogType::TABLE_FUNCTION_ENTRY}, {"postgres_scan_pushdown", "postgres_scanner", CatalogType::TABLE_FUNCTION_ENTRY}, + {"pragma_hnsw_index_info", "vss", CatalogType::TABLE_FUNCTION_ENTRY}, {"read_json", "json", CatalogType::TABLE_FUNCTION_ENTRY}, {"read_json_auto", "json", CatalogType::TABLE_FUNCTION_ENTRY}, {"read_json_objects", "json", CatalogType::TABLE_FUNCTION_ENTRY}, @@ -128,6 +132,7 @@ static constexpr ExtensionFunctionEntry EXTENSION_FUNCTIONS[] = { {"st_dimension", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_disjoint", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_distance", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, + {"st_distance_sphere", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_distance_spheroid", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_drivers", "spatial", CatalogType::TABLE_FUNCTION_ENTRY}, {"st_dump", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, @@ -150,6 +155,7 @@ static constexpr ExtensionFunctionEntry EXTENSION_FUNCTIONS[] = { {"st_geomfromhexwkb", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_geomfromtext", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_geomfromwkb", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, + {"st_hilbert", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_intersection", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_intersection_agg", "spatial", CatalogType::AGGREGATE_FUNCTION_ENTRY}, {"st_intersects", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, @@ -197,6 +203,7 @@ static constexpr ExtensionFunctionEntry EXTENSION_FUNCTIONS[] = { {"st_reduceprecision", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_removerepeatedpoints", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_reverse", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, + {"st_shortestline", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_simplify", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_simplifypreservetopology", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"st_startpoint", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, @@ -257,6 +264,7 @@ static constexpr ExtensionEntry EXTENSION_SETTINGS[] = { {"pg_experimental_filter_pushdown", "postgres_scanner"}, {"pg_pages_per_task", "postgres_scanner"}, {"pg_use_binary_copy", "postgres_scanner"}, + {"pg_use_ctid_scan", "postgres_scanner"}, {"s3_access_key_id", "httpfs"}, {"s3_endpoint", "httpfs"}, {"s3_region", "httpfs"}, diff --git a/src/duckdb/src/include/duckdb/main/extension_helper.hpp b/src/duckdb/src/include/duckdb/main/extension_helper.hpp index cc29ec41..8d886468 100644 --- a/src/duckdb/src/include/duckdb/main/extension_helper.hpp +++ b/src/duckdb/src/include/duckdb/main/extension_helper.hpp @@ -31,6 +31,7 @@ struct ExtensionAlias { struct ExtensionInitResult { string filename; string filebase; + string extension_version; void *lib_hdl; }; diff --git a/src/duckdb/src/include/duckdb/main/external_dependencies.hpp b/src/duckdb/src/include/duckdb/main/external_dependencies.hpp index 2632dd8a..4523d913 100644 --- a/src/duckdb/src/include/duckdb/main/external_dependencies.hpp +++ b/src/duckdb/src/include/duckdb/main/external_dependencies.hpp @@ -10,7 +10,8 @@ namespace duckdb { -enum ExternalDependenciesType { PYTHON_DEPENDENCY }; +enum class ExternalDependenciesType : uint8_t { PYTHON_DEPENDENCY }; + class ExternalDependency { public: explicit ExternalDependency(ExternalDependenciesType type_p) : type(type_p) {}; diff --git a/src/duckdb/src/include/duckdb/main/prepared_statement.hpp b/src/duckdb/src/include/duckdb/main/prepared_statement.hpp index d448fdf0..f1368ca4 100644 --- a/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +++ b/src/duckdb/src/include/duckdb/main/prepared_statement.hpp @@ -66,8 +66,8 @@ class PreparedStatement { DUCKDB_API case_insensitive_map_t GetExpectedParameterTypes() const; //! Create a pending query result of the prepared statement with the given set of arguments - template - unique_ptr PendingQuery(Args... args) { + template + unique_ptr PendingQuery(ARGS... args) { vector values; return PendingQueryRecursive(values, args...); } @@ -87,8 +87,8 @@ class PreparedStatement { bool allow_stream_result = true); //! Execute the prepared statement with the given set of arguments - template - unique_ptr Execute(Args... args) { + template + unique_ptr Execute(ARGS... args) { vector values; return ExecuteRecursive(values, args...); } @@ -158,8 +158,8 @@ class PreparedStatement { return PendingQuery(values); } - template - unique_ptr PendingQueryRecursive(vector &values, T value, Args... args) { + template + unique_ptr PendingQueryRecursive(vector &values, T value, ARGS... args) { values.push_back(Value::CreateValue(value)); return PendingQueryRecursive(values, args...); } @@ -168,8 +168,8 @@ class PreparedStatement { return Execute(values); } - template - unique_ptr ExecuteRecursive(vector &values, T value, Args... args) { + template + unique_ptr ExecuteRecursive(vector &values, T value, ARGS... args) { values.push_back(Value::CreateValue(value)); return ExecuteRecursive(values, args...); } diff --git a/src/duckdb/src/include/duckdb/main/query_profiler.hpp b/src/duckdb/src/include/duckdb/main/query_profiler.hpp index aa5bc42e..9c231ab5 100644 --- a/src/duckdb/src/include/duckdb/main/query_profiler.hpp +++ b/src/duckdb/src/include/duckdb/main/query_profiler.hpp @@ -28,70 +28,13 @@ class ExpressionExecutor; class PhysicalOperator; class SQLStatement; -//! The ExpressionInfo keeps information related to an expression -struct ExpressionInfo { - explicit ExpressionInfo() : hasfunction(false) { - } - // A vector of children - vector> children; - // Extract ExpressionInformation from a given expression state - void ExtractExpressionsRecursive(unique_ptr &state); - - //! Whether or not expression has function - bool hasfunction; - //! The function Name - string function_name; - //! The function time - uint64_t function_time = 0; - //! Count the number of ALL tuples - uint64_t tuples_count = 0; - //! Count the number of tuples sampled - uint64_t sample_tuples_count = 0; -}; - -//! The ExpressionRootInfo keeps information related to the root of an expression tree -struct ExpressionRootInfo { - ExpressionRootInfo(ExpressionExecutorState &executor, string name); - - //! Count the number of time the executor called - uint64_t total_count = 0; - //! Count the number of time the executor called since last sampling - uint64_t current_count = 0; - //! Count the number of samples - uint64_t sample_count = 0; - //! Count the number of tuples in all samples - uint64_t sample_tuples_count = 0; - //! Count the number of tuples processed by this executor - uint64_t tuples_count = 0; - //! A vector which contain the pointer to root of each expression tree - unique_ptr root; - //! Name - string name; - //! Elapsed time - double time; - //! Extra Info - string extra_info; -}; - -struct ExpressionExecutorInfo { - explicit ExpressionExecutorInfo() {}; - explicit ExpressionExecutorInfo(ExpressionExecutor &executor, const string &name, int id); - - //! A vector which contain the pointer to all ExpressionRootInfo - vector> roots; - //! Id, it will be used as index for executors_info vector - int id; -}; - struct OperatorInformation { - explicit OperatorInformation(double time_ = 0, idx_t elements_ = 0) : time(time_), elements(elements_) { + explicit OperatorInformation(double time_p = 0, idx_t elements_p = 0) : time(time_p), elements(elements_p) { } double time = 0; idx_t elements = 0; string name; - //! A vector of Expression Executor Info - vector> executors_info; }; //! The OperatorProfiler measures timings of individual operators @@ -125,7 +68,7 @@ class OperatorProfiler { //! The QueryProfiler can be used to measure timings of queries class QueryProfiler { public: - DUCKDB_API QueryProfiler(ClientContext &context); + DUCKDB_API explicit QueryProfiler(ClientContext &context); public: struct TreeNode { diff --git a/src/duckdb/src/include/duckdb/main/query_result.hpp b/src/duckdb/src/include/duckdb/main/query_result.hpp index c42c3ac2..1c92368c 100644 --- a/src/duckdb/src/include/duckdb/main/query_result.hpp +++ b/src/duckdb/src/include/duckdb/main/query_result.hpp @@ -65,7 +65,7 @@ class QueryResult : public BaseQueryResult { vector types, vector names, ClientProperties client_properties); //! Creates an unsuccessful query result with error condition DUCKDB_API QueryResult(QueryResultType type, ErrorData error); - DUCKDB_API virtual ~QueryResult() override; + DUCKDB_API ~QueryResult() override; //! Properties from the client context ClientProperties client_properties; @@ -190,10 +190,10 @@ class QueryResult : public BaseQueryResult { }; public: - QueryResultIterator begin() { + QueryResultIterator begin() { // NOLINT: match stl API return QueryResultIterator(this); } - QueryResultIterator end() { + QueryResultIterator end() { // NOLINT: match stl API return QueryResultIterator(nullptr); } diff --git a/src/duckdb/src/include/duckdb/main/relation.hpp b/src/duckdb/src/include/duckdb/main/relation.hpp index 7d179871..c16cb2a3 100644 --- a/src/duckdb/src/include/duckdb/main/relation.hpp +++ b/src/duckdb/src/include/duckdb/main/relation.hpp @@ -185,7 +185,7 @@ class Relation : public std::enable_shared_from_this { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; diff --git a/src/duckdb/src/include/duckdb/main/relation/query_relation.hpp b/src/duckdb/src/include/duckdb/main/relation/query_relation.hpp index 3a2728bf..67cfcc06 100644 --- a/src/duckdb/src/include/duckdb/main/relation/query_relation.hpp +++ b/src/duckdb/src/include/duckdb/main/relation/query_relation.hpp @@ -17,7 +17,7 @@ class SelectStatement; class QueryRelation : public Relation { public: QueryRelation(const std::shared_ptr &context, unique_ptr select_stmt, string alias); - ~QueryRelation(); + ~QueryRelation() override; unique_ptr select_stmt; string alias; diff --git a/src/duckdb/src/include/duckdb/main/secret/secret.hpp b/src/duckdb/src/include/duckdb/main/secret/secret.hpp index 27960e0e..c05494bd 100644 --- a/src/duckdb/src/include/duckdb/main/secret/secret.hpp +++ b/src/duckdb/src/include/duckdb/main/secret/secret.hpp @@ -51,7 +51,9 @@ class CreateSecretFunction { //! should be seen as the method of secret creation. (e.g. user-provided config, env variables, auto-detect) class CreateSecretFunctionSet { public: - CreateSecretFunctionSet(string &name) : name(name) {}; + explicit CreateSecretFunctionSet(string &name) : name(name) {}; + +public: bool ProviderExists(const string &provider_name); void AddFunction(CreateSecretFunction &function, OnCreateConflict on_conflict); CreateSecretFunction &GetFunction(const string &provider); @@ -81,8 +83,9 @@ class BaseSecret { friend class SecretManager; public: - BaseSecret(const vector &prefix_paths, const string &type, const string &provider, const string &name) - : prefix_paths(prefix_paths), type(type), provider(provider), name(name), serializable(false) { + BaseSecret(vector prefix_paths_p, string type_p, string provider_p, string name_p) + : prefix_paths(std::move(prefix_paths_p)), type(std::move(type_p)), provider(std::move(provider_p)), + name(std::move(name_p)), serializable(false) { D_ASSERT(!type.empty()); } BaseSecret(const BaseSecret &other) @@ -148,7 +151,7 @@ class KeyValueSecret : public BaseSecret { D_ASSERT(!type.empty()); serializable = true; } - KeyValueSecret(BaseSecret &secret) + explicit KeyValueSecret(const BaseSecret &secret) : BaseSecret(secret.GetScope(), secret.GetType(), secret.GetProvider(), secret.GetName()) { serializable = true; }; @@ -158,15 +161,16 @@ class KeyValueSecret : public BaseSecret { redact_keys = secret.redact_keys; serializable = true; }; - KeyValueSecret(KeyValueSecret &&secret) - : BaseSecret(secret.GetScope(), secret.GetType(), secret.GetProvider(), secret.GetName()) { + KeyValueSecret(KeyValueSecret &&secret) noexcept + : BaseSecret(std::move(secret.prefix_paths), std::move(secret.type), std::move(secret.provider), + std::move(secret.name)) { secret_map = std::move(secret.secret_map); redact_keys = std::move(secret.redact_keys); serializable = true; }; //! Print the secret as a key value map in the format 'key1=value;key2=value2' - virtual string ToString(SecretDisplayType mode = SecretDisplayType::REDACTED) const override; + string ToString(SecretDisplayType mode = SecretDisplayType::REDACTED) const override; void Serialize(Serializer &serializer) const override; //! Tries to get the value at key , depending on error_on_missing will throw or return Value() diff --git a/src/duckdb/src/include/duckdb/main/secret/secret_manager.hpp b/src/duckdb/src/include/duckdb/main/secret/secret_manager.hpp index 7a6da88d..bac39686 100644 --- a/src/duckdb/src/include/duckdb/main/secret/secret_manager.hpp +++ b/src/duckdb/src/include/duckdb/main/secret/secret_manager.hpp @@ -55,8 +55,8 @@ struct SecretMatch { //! A Secret Entry in the secret manager struct SecretEntry { public: - SecretEntry(unique_ptr secret) : secret(secret != nullptr ? secret->Clone() : nullptr) {}; - + explicit SecretEntry(unique_ptr secret) : secret(secret != nullptr ? secret->Clone() : nullptr) { + } SecretEntry(const SecretEntry &other) : persist_type(other.persist_type), storage_mode(other.storage_mode), secret((other.secret != nullptr) ? other.secret->Clone() : nullptr) { diff --git a/src/duckdb/src/include/duckdb/main/secret/secret_storage.hpp b/src/duckdb/src/include/duckdb/main/secret/secret_storage.hpp index 7b40c0a4..91e059e3 100644 --- a/src/duckdb/src/include/duckdb/main/secret/secret_storage.hpp +++ b/src/duckdb/src/include/duckdb/main/secret/secret_storage.hpp @@ -26,7 +26,7 @@ class SecretStorage { friend class SecretManager; public: - SecretStorage(const string &name) : storage_name(name), persistent(false) {}; + explicit SecretStorage(const string &name) : storage_name(name), persistent(false) {}; virtual ~SecretStorage() = default; public: @@ -103,8 +103,8 @@ class CatalogSetSecretStorage : public SecretStorage { return storage_name; }; - virtual unique_ptr StoreSecret(unique_ptr secret, OnCreateConflict on_conflict, - optional_ptr transaction = nullptr) override; + unique_ptr StoreSecret(unique_ptr secret, OnCreateConflict on_conflict, + optional_ptr transaction = nullptr) override; vector AllSecrets(optional_ptr transaction = nullptr) override; void DropSecretByName(const string &name, OnEntryNotFound on_entry_not_found, optional_ptr transaction = nullptr) override; @@ -153,7 +153,7 @@ class LocalFileSecretStorage : public CatalogSetSecretStorage { //! Implements the writes to disk void WriteSecret(const BaseSecret &secret, OnCreateConflict on_conflict) override; //! Implements the deletes from disk - virtual void RemoveSecret(const string &secret, OnEntryNotFound on_entry_not_found) override; + void RemoveSecret(const string &secret, OnEntryNotFound on_entry_not_found) override; //! Set of persistent secrets that are lazily loaded case_insensitive_set_t persistent_secrets; diff --git a/src/duckdb/src/include/duckdb/main/settings.hpp b/src/duckdb/src/include/duckdb/main/settings.hpp index b7e31329..0badad65 100644 --- a/src/duckdb/src/include/duckdb/main/settings.hpp +++ b/src/duckdb/src/include/duckdb/main/settings.hpp @@ -24,12 +24,12 @@ struct SettingLookupResult { public: SettingLookupResult() : scope(SettingScope::INVALID) { } - SettingLookupResult(SettingScope scope) : scope(scope) { + explicit SettingLookupResult(SettingScope scope) : scope(scope) { D_ASSERT(scope != SettingScope::INVALID); } public: - operator bool() { + operator bool() { // NOLINT: allow implicit conversion to bool return scope != SettingScope::INVALID; } @@ -49,7 +49,7 @@ struct AccessModeSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct AllowPersistentSecrets { @@ -59,7 +59,7 @@ struct AllowPersistentSecrets { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct CheckpointThresholdSetting { @@ -69,7 +69,7 @@ struct CheckpointThresholdSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DebugCheckpointAbort { @@ -79,7 +79,7 @@ struct DebugCheckpointAbort { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DebugForceExternal { @@ -89,7 +89,7 @@ struct DebugForceExternal { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DebugForceNoCrossProduct { @@ -99,7 +99,7 @@ struct DebugForceNoCrossProduct { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct OrderedAggregateThreshold { @@ -109,7 +109,7 @@ struct OrderedAggregateThreshold { static constexpr const LogicalTypeId InputType = LogicalTypeId::UBIGINT; // NOLINT static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DebugAsOfIEJoin { @@ -118,7 +118,7 @@ struct DebugAsOfIEJoin { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; // NOLINT static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PreferRangeJoins { @@ -127,7 +127,7 @@ struct PreferRangeJoins { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; // NOLINT static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DebugWindowMode { @@ -136,7 +136,7 @@ struct DebugWindowMode { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DefaultCollationSetting { @@ -147,7 +147,7 @@ struct DefaultCollationSetting { static void ResetGlobal(DatabaseInstance *db, DBConfig &config); static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DefaultOrderSetting { @@ -156,7 +156,7 @@ struct DefaultOrderSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DefaultNullOrderSetting { @@ -165,7 +165,7 @@ struct DefaultNullOrderSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DefaultSecretStorage { @@ -174,7 +174,7 @@ struct DefaultSecretStorage { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DisabledFileSystemsSetting { @@ -183,7 +183,7 @@ struct DisabledFileSystemsSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DisabledOptimizersSetting { @@ -192,7 +192,7 @@ struct DisabledOptimizersSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct EnableExternalAccessSetting { @@ -203,7 +203,7 @@ struct EnableExternalAccessSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct EnableFSSTVectors { @@ -213,7 +213,7 @@ struct EnableFSSTVectors { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct AllowUnsignedExtensionsSetting { @@ -222,7 +222,16 @@ struct AllowUnsignedExtensionsSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); +}; + +struct AllowExtensionsMetadataMismatchSetting { + static constexpr const char *Name = "allow_extensions_metadata_mismatch"; + static constexpr const char *Description = "Allow to load extensions with not compatible metadata"; + static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; + static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); + static void ResetGlobal(DatabaseInstance *db, DBConfig &config); + static Value GetSetting(const ClientContext &context); }; struct AllowUnredactedSecretsSetting { @@ -231,7 +240,7 @@ struct AllowUnredactedSecretsSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct CustomExtensionRepository { @@ -240,7 +249,7 @@ struct CustomExtensionRepository { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct AutoloadExtensionRepository { @@ -250,7 +259,7 @@ struct AutoloadExtensionRepository { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct AutoinstallKnownExtensions { @@ -260,7 +269,7 @@ struct AutoinstallKnownExtensions { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct AutoloadKnownExtensions { @@ -270,7 +279,7 @@ struct AutoloadKnownExtensions { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct EnableObjectCacheSetting { @@ -279,7 +288,7 @@ struct EnableObjectCacheSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct EnableHTTPMetadataCacheSetting { @@ -288,7 +297,7 @@ struct EnableHTTPMetadataCacheSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void ResetGlobal(DatabaseInstance *db, DBConfig &config); static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct EnableProfilingSetting { @@ -298,7 +307,7 @@ struct EnableProfilingSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct EnableProgressBarSetting { @@ -308,7 +317,7 @@ struct EnableProgressBarSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct EnableProgressBarPrintSetting { @@ -318,7 +327,7 @@ struct EnableProgressBarPrintSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ErrorsAsJsonSetting { @@ -327,7 +336,7 @@ struct ErrorsAsJsonSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ExplainOutputSetting { @@ -336,7 +345,7 @@ struct ExplainOutputSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ExportLargeBufferArrow { @@ -346,7 +355,7 @@ struct ExportLargeBufferArrow { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ExtensionDirectorySetting { @@ -355,7 +364,7 @@ struct ExtensionDirectorySetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ExternalThreadsSetting { @@ -364,7 +373,7 @@ struct ExternalThreadsSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BIGINT; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct FileSearchPathSetting { @@ -373,7 +382,7 @@ struct FileSearchPathSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ForceCompressionSetting { @@ -382,7 +391,7 @@ struct ForceCompressionSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ForceBitpackingModeSetting { @@ -391,7 +400,7 @@ struct ForceBitpackingModeSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct HomeDirectorySetting { @@ -400,7 +409,7 @@ struct HomeDirectorySetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct IntegerDivisionSetting { @@ -410,17 +419,17 @@ struct IntegerDivisionSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct LogQueryPathSetting { static constexpr const char *Name = "log_query_path"; static constexpr const char *Description = - "Specifies the path to which queries should be logged (default: empty string, queries are not logged)"; + "Specifies the path to which queries should be logged (default: NULL, queries are not logged)"; static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct LockConfigurationSetting { @@ -429,7 +438,7 @@ struct LockConfigurationSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ImmediateTransactionModeSetting { @@ -439,7 +448,7 @@ struct ImmediateTransactionModeSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct MaximumExpressionDepthSetting { @@ -450,7 +459,7 @@ struct MaximumExpressionDepthSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::UBIGINT; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct MaximumMemorySetting { @@ -459,7 +468,7 @@ struct MaximumMemorySetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct OldImplicitCasting { @@ -468,7 +477,7 @@ struct OldImplicitCasting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PartitionedWriteFlushThreshold { @@ -478,7 +487,7 @@ struct PartitionedWriteFlushThreshold { static constexpr const LogicalTypeId InputType = LogicalTypeId::BIGINT; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PasswordSetting { @@ -487,16 +496,16 @@ struct PasswordSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PerfectHashThresholdSetting { static constexpr const char *Name = "perfect_ht_threshold"; - static constexpr const char *Description = "Threshold in bytes for when to use a perfect hash table (default: 12)"; + static constexpr const char *Description = "Threshold in bytes for when to use a perfect hash table"; static constexpr const LogicalTypeId InputType = LogicalTypeId::BIGINT; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PivotFilterThreshold { @@ -506,17 +515,16 @@ struct PivotFilterThreshold { static constexpr const LogicalTypeId InputType = LogicalTypeId::BIGINT; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PivotLimitSetting { static constexpr const char *Name = "pivot_limit"; - static constexpr const char *Description = - "The maximum number of pivot columns in a pivot statement (default: 100000)"; + static constexpr const char *Description = "The maximum number of pivot columns in a pivot statement"; static constexpr const LogicalTypeId InputType = LogicalTypeId::BIGINT; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PreserveIdentifierCase { @@ -526,7 +534,7 @@ struct PreserveIdentifierCase { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct PreserveInsertionOrder { @@ -537,7 +545,7 @@ struct PreserveInsertionOrder { static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ProfileOutputSetting { @@ -547,7 +555,7 @@ struct ProfileOutputSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ProfilingModeSetting { @@ -556,7 +564,7 @@ struct ProfilingModeSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ProgressBarTimeSetting { @@ -566,7 +574,7 @@ struct ProgressBarTimeSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BIGINT; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct SchemaSetting { @@ -576,7 +584,7 @@ struct SchemaSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct SearchPathSetting { @@ -586,7 +594,7 @@ struct SearchPathSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetLocal(ClientContext &context, const Value ¶meter); static void ResetLocal(ClientContext &context); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct SecretDirectorySetting { @@ -595,7 +603,7 @@ struct SecretDirectorySetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct TempDirectorySetting { @@ -604,7 +612,7 @@ struct TempDirectorySetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct ThreadsSetting { @@ -613,7 +621,7 @@ struct ThreadsSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::BIGINT; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct UsernameSetting { @@ -622,7 +630,7 @@ struct UsernameSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct FlushAllocatorSetting { @@ -632,7 +640,7 @@ struct FlushAllocatorSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct DuckDBApiSetting { @@ -641,7 +649,7 @@ struct DuckDBApiSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; struct CustomUserAgentSetting { @@ -650,7 +658,7 @@ struct CustomUserAgentSetting { static constexpr const LogicalTypeId InputType = LogicalTypeId::VARCHAR; static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value ¶meter); static void ResetGlobal(DatabaseInstance *db, DBConfig &config); - static Value GetSetting(ClientContext &context); + static Value GetSetting(const ClientContext &context); }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/optimizer/column_lifetime_analyzer.hpp b/src/duckdb/src/include/duckdb/optimizer/column_lifetime_analyzer.hpp new file mode 100644 index 00000000..72848bc2 --- /dev/null +++ b/src/duckdb/src/include/duckdb/optimizer/column_lifetime_analyzer.hpp @@ -0,0 +1,45 @@ +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/optimizer/column_lifetime_analyzer.hpp +// +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include "duckdb/planner/logical_operator_visitor.hpp" +#include "duckdb/planner/column_binding_map.hpp" +#include "duckdb/common/vector.hpp" + +namespace duckdb { +class BoundColumnRefExpression; + +//! The ColumnLifetimeAnalyzer optimizer traverses the logical operator tree and ensures that columns are removed from +//! the plan when no longer required +class ColumnLifetimeAnalyzer : public LogicalOperatorVisitor { +public: + explicit ColumnLifetimeAnalyzer(bool is_root = false) : everything_referenced(is_root) { + } + + void VisitOperator(LogicalOperator &op) override; + +protected: + unique_ptr VisitReplace(BoundColumnRefExpression &expr, unique_ptr *expr_ptr) override; + unique_ptr VisitReplace(BoundReferenceExpression &expr, unique_ptr *expr_ptr) override; + +private: + //! Whether or not all the columns are referenced. This happens in the case of the root expression (because the + //! output implicitly refers all the columns below it) + bool everything_referenced; + //! The set of column references + column_binding_set_t column_references; + +private: + void StandardVisitOperator(LogicalOperator &op); + + void ExtractUnusedColumnBindings(vector bindings, column_binding_set_t &unused_bindings); + void GenerateProjectionMap(vector bindings, column_binding_set_t &unused_bindings, + vector &map); +}; +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/optimizer/compressed_materialization.hpp b/src/duckdb/src/include/duckdb/optimizer/compressed_materialization.hpp index 688d8a9d..05b8a960 100644 --- a/src/duckdb/src/include/duckdb/optimizer/compressed_materialization.hpp +++ b/src/duckdb/src/include/duckdb/optimizer/compressed_materialization.hpp @@ -8,15 +8,15 @@ #pragma once -#include "duckdb/common/unordered_set.hpp" -#include "duckdb/function/scalar/compressed_materialization_functions.hpp" +#include "duckdb/common/types.hpp" #include "duckdb/planner/column_binding_map.hpp" #include "duckdb/storage/statistics/base_statistics.hpp" namespace duckdb { +class Optimizer; +class ClientContext; class LogicalOperator; -struct JoinCondition; struct CMChildInfo { public: @@ -75,14 +75,11 @@ typedef column_binding_map_t> statistics_map_t; //! but only if the data enters a materializing operator class CompressedMaterialization { public: - explicit CompressedMaterialization(ClientContext &context, Binder &binder, statistics_map_t &&statistics_map); + CompressedMaterialization(Optimizer &optimizer, LogicalOperator &root, statistics_map_t &statistics_map); void Compress(unique_ptr &op); private: - //! Depth-first traversal of the plan - void CompressInternal(unique_ptr &op); - //! Compress materializing operators void CompressAggregate(unique_ptr &op); void CompressDistinct(unique_ptr &op); @@ -102,7 +99,7 @@ class CompressedMaterialization { bool TryCompressChild(CompressedMaterializationInfo &info, const CMChildInfo &child_info, vector> &compress_expressions); void CreateCompressProjection(unique_ptr &child_op, - vector> &&compress_exprs, + vector> compress_exprs, CompressedMaterializationInfo &info, CMChildInfo &child_info); void CreateDecompressProjection(unique_ptr &op, CompressedMaterializationInfo &info); @@ -118,15 +115,16 @@ class CompressedMaterialization { const BaseStatistics &stats); unique_ptr GetIntegralDecompress(unique_ptr input, const LogicalType &result_type, const BaseStatistics &stats); - unique_ptr GetStringDecompress(unique_ptr input, const BaseStatistics &stats); + unique_ptr GetStringDecompress(unique_ptr input, const LogicalType &result_type, + const BaseStatistics &stats); private: + Optimizer &optimizer; ClientContext &context; - Binder &binder; - statistics_map_t statistics_map; - unordered_set compression_table_indices; - unordered_set decompression_table_indices; + //! The root of the query plan optional_ptr root; + //! The map of ColumnBinding -> statistics for the various nodes + statistics_map_t &statistics_map; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp b/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp index dc8de7d8..e4862ff5 100644 --- a/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +++ b/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp @@ -28,7 +28,7 @@ struct RelationsToTDom { vector filters; vector column_names; - RelationsToTDom(const column_binding_set_t &column_binding_set) + explicit RelationsToTDom(const column_binding_set_t &column_binding_set) : equivalent_relations(column_binding_set), tdom_hll(0), tdom_no_hll(NumericLimits::Maximum()), has_tdom_hll(false) {}; }; @@ -82,7 +82,7 @@ class CardinalityEstimator { void PrintRelationToTdomInfo(); private: - bool SingleColumnFilter(FilterInfo &filter_info); + bool SingleRelationFilter(FilterInfo &filter_info); vector DetermineMatchingEquivalentSets(FilterInfo *filter_info); //! Given a filter, add the column bindings to the matching equivalent set at the index //! given in matching equivalent sets. diff --git a/src/duckdb/src/include/duckdb/optimizer/join_order/cost_model.hpp b/src/duckdb/src/include/duckdb/optimizer/join_order/cost_model.hpp index d2ff77d9..49895406 100644 --- a/src/duckdb/src/include/duckdb/optimizer/join_order/cost_model.hpp +++ b/src/duckdb/src/include/duckdb/optimizer/join_order/cost_model.hpp @@ -16,7 +16,7 @@ class QueryGraphManager; class CostModel { public: - CostModel(QueryGraphManager &query_graph_manager); + explicit CostModel(QueryGraphManager &query_graph_manager); private: //! query graph storing relation manager information diff --git a/src/duckdb/src/include/duckdb/optimizer/join_order/join_node.hpp b/src/duckdb/src/include/duckdb/optimizer/join_order/join_node.hpp index f861b283..8f973c95 100644 --- a/src/duckdb/src/include/duckdb/optimizer/join_order/join_node.hpp +++ b/src/duckdb/src/include/duckdb/optimizer/join_order/join_node.hpp @@ -38,7 +38,7 @@ class JoinNode { //! Create a leaf node in the join tree //! set cost to 0 for leaf nodes //! cost will be the cost to *produce* an intermediate table - JoinNode(JoinRelationSet &set); + explicit JoinNode(JoinRelationSet &set); bool operator==(const JoinNode &other) { return other.set.ToString().compare(set.ToString()) == 0; diff --git a/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph.hpp b/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph.hpp index 92895e2c..f1c2ded0 100644 --- a/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph.hpp +++ b/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph.hpp @@ -26,7 +26,7 @@ namespace duckdb { struct FilterInfo; struct NeighborInfo { - NeighborInfo(optional_ptr neighbor) : neighbor(neighbor) { + explicit NeighborInfo(optional_ptr neighbor) : neighbor(neighbor) { } optional_ptr neighbor; diff --git a/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph_manager.hpp b/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph_manager.hpp index 79aa37fb..c65d5131 100644 --- a/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph_manager.hpp +++ b/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph_manager.hpp @@ -57,7 +57,7 @@ struct FilterInfo { //! When the plan enumerator finishes, the Query Graph Manger can then recreate the logical plan. class QueryGraphManager { public: - QueryGraphManager(ClientContext &context) : relation_manager(context), context(context) { + explicit QueryGraphManager(ClientContext &context) : relation_manager(context), context(context) { } //! manage relations and the logical operators they represent diff --git a/src/duckdb/src/include/duckdb/optimizer/join_order/relation_manager.hpp b/src/duckdb/src/include/duckdb/optimizer/join_order/relation_manager.hpp index 1a607f5e..54d557ad 100644 --- a/src/duckdb/src/include/duckdb/optimizer/join_order/relation_manager.hpp +++ b/src/duckdb/src/include/duckdb/optimizer/join_order/relation_manager.hpp @@ -31,7 +31,7 @@ struct SingleJoinRelation { SingleJoinRelation(LogicalOperator &op, optional_ptr parent) : op(op), parent(parent) { } SingleJoinRelation(LogicalOperator &op, optional_ptr parent, RelationStats stats) - : op(op), parent(parent), stats(stats) { + : op(op), parent(parent), stats(std::move(stats)) { } }; diff --git a/src/duckdb/src/include/duckdb/optimizer/matcher/expression_matcher.hpp b/src/duckdb/src/include/duckdb/optimizer/matcher/expression_matcher.hpp index 88113cc8..b7d2a3d7 100644 --- a/src/duckdb/src/include/duckdb/optimizer/matcher/expression_matcher.hpp +++ b/src/duckdb/src/include/duckdb/optimizer/matcher/expression_matcher.hpp @@ -40,7 +40,7 @@ class ExpressionMatcher { //! The ExpressionEqualityMatcher matches on equality with another (given) expression class ExpressionEqualityMatcher : public ExpressionMatcher { public: - explicit ExpressionEqualityMatcher(Expression &expr) + explicit ExpressionEqualityMatcher(const Expression &expr) : ExpressionMatcher(ExpressionClass::INVALID), expression(expr) { } @@ -61,7 +61,7 @@ class CaseExpressionMatcher : public ExpressionMatcher { CaseExpressionMatcher() : ExpressionMatcher(ExpressionClass::BOUND_CASE) { } - bool Match(Expression &expr_, vector> &bindings) override; + bool Match(Expression &expr, vector> &bindings) override; }; class ComparisonExpressionMatcher : public ExpressionMatcher { @@ -74,7 +74,7 @@ class ComparisonExpressionMatcher : public ExpressionMatcher { //! The set matcher matching policy to use SetMatcher::Policy policy; - bool Match(Expression &expr_, vector> &bindings) override; + bool Match(Expression &expr, vector> &bindings) override; }; class CastExpressionMatcher : public ExpressionMatcher { @@ -84,7 +84,7 @@ class CastExpressionMatcher : public ExpressionMatcher { //! The matcher for the child expressions unique_ptr matcher; - bool Match(Expression &expr_, vector> &bindings) override; + bool Match(Expression &expr, vector> &bindings) override; }; class InClauseExpressionMatcher : public ExpressionMatcher { @@ -96,7 +96,7 @@ class InClauseExpressionMatcher : public ExpressionMatcher { //! The set matcher matching policy to use SetMatcher::Policy policy; - bool Match(Expression &expr_, vector> &bindings) override; + bool Match(Expression &expr, vector> &bindings) override; }; class ConjunctionExpressionMatcher : public ExpressionMatcher { @@ -109,7 +109,7 @@ class ConjunctionExpressionMatcher : public ExpressionMatcher { //! The set matcher matching policy to use SetMatcher::Policy policy; - bool Match(Expression &expr_, vector> &bindings) override; + bool Match(Expression &expr, vector> &bindings) override; }; class FunctionExpressionMatcher : public ExpressionMatcher { @@ -123,7 +123,7 @@ class FunctionExpressionMatcher : public ExpressionMatcher { //! The function name to match unique_ptr function; - bool Match(Expression &expr_, vector> &bindings) override; + bool Match(Expression &expr, vector> &bindings) override; }; //! The FoldableConstant matcher matches any expression that is foldable into a constant by the ExpressionExecutor (i.e. diff --git a/src/duckdb/src/include/duckdb/optimizer/matcher/function_matcher.hpp b/src/duckdb/src/include/duckdb/optimizer/matcher/function_matcher.hpp index 6acf2bbf..162789c3 100644 --- a/src/duckdb/src/include/duckdb/optimizer/matcher/function_matcher.hpp +++ b/src/duckdb/src/include/duckdb/optimizer/matcher/function_matcher.hpp @@ -20,9 +20,9 @@ class FunctionMatcher { virtual ~FunctionMatcher() { } - virtual bool Match(string &name) = 0; + virtual bool Match(const string &name) = 0; - static bool Match(unique_ptr &matcher, string &name) { + static bool Match(unique_ptr &matcher, const string &name) { if (!matcher) { return true; } @@ -33,11 +33,11 @@ class FunctionMatcher { //! The SpecificFunctionMatcher class matches a single specified function name class SpecificFunctionMatcher : public FunctionMatcher { public: - explicit SpecificFunctionMatcher(string name) : name(std::move(name)) { + explicit SpecificFunctionMatcher(string name_p) : name(std::move(name_p)) { } - bool Match(string &name) override { - return name == this->name; + bool Match(const string &matched_name) override { + return matched_name == this->name; } private: @@ -47,10 +47,10 @@ class SpecificFunctionMatcher : public FunctionMatcher { //! The ManyFunctionMatcher class matches a set of functions class ManyFunctionMatcher : public FunctionMatcher { public: - explicit ManyFunctionMatcher(unordered_set names) : names(std::move(names)) { + explicit ManyFunctionMatcher(unordered_set names_p) : names(std::move(names_p)) { } - bool Match(string &name) override { + bool Match(const string &name) override { return names.find(name) != names.end(); } diff --git a/src/duckdb/src/include/duckdb/optimizer/matcher/type_matcher.hpp b/src/duckdb/src/include/duckdb/optimizer/matcher/type_matcher.hpp index 5cd9d73e..0536ef16 100644 --- a/src/duckdb/src/include/duckdb/optimizer/matcher/type_matcher.hpp +++ b/src/duckdb/src/include/duckdb/optimizer/matcher/type_matcher.hpp @@ -24,7 +24,7 @@ class TypeMatcher { //! The SpecificTypeMatcher class matches only a single specified type class SpecificTypeMatcher : public TypeMatcher { public: - explicit SpecificTypeMatcher(LogicalType type) : type(type) { + explicit SpecificTypeMatcher(LogicalType type) : type(std::move(type)) { } bool Match(const LogicalType &type_p) override { diff --git a/src/duckdb/src/include/duckdb/optimizer/optimizer.hpp b/src/duckdb/src/include/duckdb/optimizer/optimizer.hpp index 312fcc49..a33d10c1 100644 --- a/src/duckdb/src/include/duckdb/optimizer/optimizer.hpp +++ b/src/duckdb/src/include/duckdb/optimizer/optimizer.hpp @@ -26,7 +26,10 @@ class Optimizer { unique_ptr Optimize(unique_ptr plan); //! Return a reference to the client context of this optimizer ClientContext &GetContext(); + //! Whether the specific optimizer is disabled + bool OptimizerDisabled(OptimizerType type); +public: ClientContext &context; Binder &binder; ExpressionRewriter rewriter; diff --git a/src/duckdb/src/include/duckdb/optimizer/statistics_propagator.hpp b/src/duckdb/src/include/duckdb/optimizer/statistics_propagator.hpp index 75699099..618c0750 100644 --- a/src/duckdb/src/include/duckdb/optimizer/statistics_propagator.hpp +++ b/src/duckdb/src/include/duckdb/optimizer/statistics_propagator.hpp @@ -27,7 +27,7 @@ struct BoundOrderByNode; class StatisticsPropagator { public: - explicit StatisticsPropagator(Optimizer &optimizer); + StatisticsPropagator(Optimizer &optimizer, LogicalOperator &root); unique_ptr PropagateStatistics(unique_ptr &node_ptr); @@ -37,23 +37,23 @@ class StatisticsPropagator { private: //! Propagate statistics through an operator - unique_ptr PropagateStatistics(LogicalOperator &node, unique_ptr *node_ptr); - - unique_ptr PropagateStatistics(LogicalFilter &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalGet &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalJoin &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalPositionalJoin &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalProjection &op, unique_ptr *node_ptr); - void PropagateStatistics(LogicalComparisonJoin &op, unique_ptr *node_ptr); - void PropagateStatistics(LogicalAnyJoin &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalSetOperation &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalAggregate &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalCrossProduct &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalLimit &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalOrder &op, unique_ptr *node_ptr); - unique_ptr PropagateStatistics(LogicalWindow &op, unique_ptr *node_ptr); - - unique_ptr PropagateChildren(LogicalOperator &node, unique_ptr *node_ptr); + unique_ptr PropagateStatistics(LogicalOperator &node, unique_ptr &node_ptr); + + unique_ptr PropagateStatistics(LogicalFilter &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalGet &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalJoin &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalPositionalJoin &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalProjection &op, unique_ptr &node_ptr); + void PropagateStatistics(LogicalComparisonJoin &op, unique_ptr &node_ptr); + void PropagateStatistics(LogicalAnyJoin &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalSetOperation &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalAggregate &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalCrossProduct &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalLimit &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalOrder &op, unique_ptr &node_ptr); + unique_ptr PropagateStatistics(LogicalWindow &op, unique_ptr &node_ptr); + + unique_ptr PropagateChildren(LogicalOperator &node, unique_ptr &node_ptr); //! Return statistics from a constant value unique_ptr StatisticsFromValue(const Value &input); @@ -86,18 +86,18 @@ class StatisticsPropagator { const BaseStatistics &stats_before, const BaseStatistics &stats_after); unique_ptr PropagateExpression(unique_ptr &expr); - unique_ptr PropagateExpression(Expression &expr, unique_ptr *expr_ptr); - - unique_ptr PropagateExpression(BoundAggregateExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundBetweenExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundCaseExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundCastExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundConjunctionExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundFunctionExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundComparisonExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundConstantExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundColumnRefExpression &expr, unique_ptr *expr_ptr); - unique_ptr PropagateExpression(BoundOperatorExpression &expr, unique_ptr *expr_ptr); + unique_ptr PropagateExpression(Expression &expr, unique_ptr &expr_ptr); + + unique_ptr PropagateExpression(BoundAggregateExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundBetweenExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundCaseExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundCastExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundConjunctionExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundFunctionExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundComparisonExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundConstantExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundColumnRefExpression &expr, unique_ptr &expr_ptr); + unique_ptr PropagateExpression(BoundOperatorExpression &expr, unique_ptr &expr_ptr); void ReplaceWithEmptyResult(unique_ptr &node); @@ -107,6 +107,8 @@ class StatisticsPropagator { private: Optimizer &optimizer; ClientContext &context; + //! The root of the query plan + optional_ptr root; //! The map of ColumnBinding -> statistics for the various nodes column_binding_map_t> statistics_map; //! Node stats for the current node diff --git a/src/duckdb/src/include/duckdb/optimizer/unnest_rewriter.hpp b/src/duckdb/src/include/duckdb/optimizer/unnest_rewriter.hpp index d51a0080..3798cbd4 100644 --- a/src/duckdb/src/include/duckdb/optimizer/unnest_rewriter.hpp +++ b/src/duckdb/src/include/duckdb/optimizer/unnest_rewriter.hpp @@ -26,7 +26,7 @@ struct ReplaceBinding { struct LHSBinding { LHSBinding() {}; - LHSBinding(ColumnBinding binding, LogicalType type) : binding(binding), type(type) { + LHSBinding(ColumnBinding binding, LogicalType type_p) : binding(binding), type(std::move(type_p)) { } ColumnBinding binding; LogicalType type; diff --git a/src/duckdb/src/include/duckdb/parallel/event.hpp b/src/duckdb/src/include/duckdb/parallel/event.hpp index 89a108d9..794d1344 100644 --- a/src/duckdb/src/include/duckdb/parallel/event.hpp +++ b/src/duckdb/src/include/duckdb/parallel/event.hpp @@ -59,7 +59,7 @@ class Event : public std::enable_shared_from_this { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } diff --git a/src/duckdb/src/include/duckdb/parallel/executor_task.hpp b/src/duckdb/src/include/duckdb/parallel/executor_task.hpp index b6d22701..ba7baf3b 100644 --- a/src/duckdb/src/include/duckdb/parallel/executor_task.hpp +++ b/src/duckdb/src/include/duckdb/parallel/executor_task.hpp @@ -19,7 +19,7 @@ class ExecutorTask : public Task { public: ExecutorTask(Executor &executor, shared_ptr event); ExecutorTask(ClientContext &context, shared_ptr event); - virtual ~ExecutorTask(); + ~ExecutorTask() override; public: void Deschedule() override; diff --git a/src/duckdb/src/include/duckdb/parallel/interrupt.hpp b/src/duckdb/src/include/duckdb/parallel/interrupt.hpp index a9163ea4..fe5348bc 100644 --- a/src/duckdb/src/include/duckdb/parallel/interrupt.hpp +++ b/src/duckdb/src/include/duckdb/parallel/interrupt.hpp @@ -44,9 +44,9 @@ class InterruptState { //! Default interrupt state will be set to InterruptMode::NO_INTERRUPTS and throw an error on use of Callback() InterruptState(); //! Register the task to be interrupted and set mode to InterruptMode::TASK, the preferred way to handle interrupts - InterruptState(weak_ptr task); + explicit InterruptState(weak_ptr task); //! Register signal state and set mode to InterruptMode::BLOCKING, used for code paths without Task. - InterruptState(weak_ptr done_signal); + explicit InterruptState(weak_ptr done_signal); //! Perform the callback to indicate the Interrupt is over DUCKDB_API void Callback() const; diff --git a/src/duckdb/src/include/duckdb/parallel/pipeline_event.hpp b/src/duckdb/src/include/duckdb/parallel/pipeline_event.hpp index 7af51d48..a2448c1b 100644 --- a/src/duckdb/src/include/duckdb/parallel/pipeline_event.hpp +++ b/src/duckdb/src/include/duckdb/parallel/pipeline_event.hpp @@ -15,7 +15,7 @@ namespace duckdb { //! A PipelineEvent is responsible for scheduling a pipeline class PipelineEvent : public BasePipelineEvent { public: - PipelineEvent(shared_ptr pipeline); + explicit PipelineEvent(shared_ptr pipeline); public: void Schedule() override; diff --git a/src/duckdb/src/include/duckdb/parser/column_list.hpp b/src/duckdb/src/include/duckdb/parser/column_list.hpp index d692986b..7bf9cc17 100644 --- a/src/duckdb/src/include/duckdb/parser/column_list.hpp +++ b/src/duckdb/src/include/duckdb/parser/column_list.hpp @@ -18,7 +18,7 @@ class ColumnList { class ColumnListIterator; public: - DUCKDB_API ColumnList(bool allow_duplicate_names = false); + DUCKDB_API explicit ColumnList(bool allow_duplicate_names = false); DUCKDB_API explicit ColumnList(vector columns, bool allow_duplicate_names = false); DUCKDB_API void AddColumn(ColumnDefinition column); @@ -45,7 +45,7 @@ class ColumnList { idx_t PhysicalColumnCount() const { return physical_columns.size(); } - bool empty() const { + bool empty() const { // NOLINT: match stl API return columns.empty(); } @@ -117,10 +117,10 @@ class ColumnList { return physical ? list.PhysicalColumnCount() : list.LogicalColumnCount(); } - ColumnLogicalIteratorInternal begin() { + ColumnLogicalIteratorInternal begin() { // NOLINT: match stl API return ColumnLogicalIteratorInternal(list, physical, 0, Size()); } - ColumnLogicalIteratorInternal end() { + ColumnLogicalIteratorInternal end() { // NOLINT: match stl API return ColumnLogicalIteratorInternal(list, physical, Size(), Size()); } }; diff --git a/src/duckdb/src/include/duckdb/parser/constraints/unique_constraint.hpp b/src/duckdb/src/include/duckdb/parser/constraints/unique_constraint.hpp index 66073108..570a3e27 100644 --- a/src/duckdb/src/include/duckdb/parser/constraints/unique_constraint.hpp +++ b/src/duckdb/src/include/duckdb/parser/constraints/unique_constraint.hpp @@ -21,14 +21,6 @@ class UniqueConstraint : public Constraint { DUCKDB_API UniqueConstraint(LogicalIndex index, bool is_primary_key); DUCKDB_API UniqueConstraint(vector columns, bool is_primary_key); - //! The index of the column for which this constraint holds. Only used when the constraint relates to a single - //! column, equal to DConstants::INVALID_INDEX if not used - LogicalIndex index; - //! The set of columns for which this constraint holds by name. Only used when the index field is not used. - vector columns; - //! Whether or not this is a PRIMARY KEY constraint, or a UNIQUE constraint. - bool is_primary_key; - public: DUCKDB_API string ToString() const override; @@ -37,8 +29,57 @@ class UniqueConstraint : public Constraint { DUCKDB_API void Serialize(Serializer &serializer) const override; DUCKDB_API static unique_ptr Deserialize(Deserializer &deserializer); + bool IsPrimaryKey() const { + return is_primary_key; + } + + bool HasIndex() const { + return index.index != DConstants::INVALID_INDEX; + } + + LogicalIndex GetIndex() const { + if (!HasIndex()) { + throw InternalException("UniqueConstraint::GetIndex called on a unique constraint without a defined index"); + } + return index; + } + void SetIndex(LogicalIndex new_index) { + D_ASSERT(new_index.index != DConstants::INVALID_INDEX); + index = new_index; + } + + const vector &GetColumnNames() const { + D_ASSERT(columns.size() >= 1); + return columns; + } + vector &GetColumnNamesMutable() { + D_ASSERT(columns.size() >= 1); + return columns; + } + + void SetColumnName(string name) { + if (!columns.empty()) { + // name has already been set + return; + } + columns.push_back(std::move(name)); + } + private: UniqueConstraint(); + +#ifdef DUCKDB_API_1_0 +private: +#else +public: +#endif + //! The index of the column for which this constraint holds. Only used when the constraint relates to a single + //! column, equal to DConstants::INVALID_INDEX if not used + LogicalIndex index; + //! The set of columns for which this constraint holds by name. Only used when the index field is not used. + vector columns; + //! Whether or not this is a PRIMARY KEY constraint, or a UNIQUE constraint. + bool is_primary_key; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp b/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp index abbf57ef..6d8a380b 100644 --- a/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +++ b/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp @@ -22,7 +22,7 @@ class BoundExpression : public ParsedExpression { static constexpr const ExpressionClass TYPE = ExpressionClass::BOUND_EXPRESSION; public: - BoundExpression(unique_ptr expr); + explicit BoundExpression(unique_ptr expr); unique_ptr expr; diff --git a/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp b/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp index e2da1973..9943551b 100644 --- a/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +++ b/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp @@ -16,7 +16,7 @@ class PositionalReferenceExpression : public ParsedExpression { static constexpr const ExpressionClass TYPE = ExpressionClass::POSITIONAL_REFERENCE; public: - DUCKDB_API PositionalReferenceExpression(idx_t index); + DUCKDB_API explicit PositionalReferenceExpression(idx_t index); idx_t index; diff --git a/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp b/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp index 83f61585..3fa0847d 100644 --- a/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +++ b/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp @@ -19,7 +19,7 @@ class StarExpression : public ParsedExpression { static constexpr const ExpressionClass TYPE = ExpressionClass::STAR; public: - StarExpression(string relation_name = string()); + explicit StarExpression(string relation_name = string()); //! The relation name in case of tbl.*, or empty if this is a normal * string relation_name; diff --git a/src/duckdb/src/include/duckdb/parser/parsed_data/alter_scalar_function_info.hpp b/src/duckdb/src/include/duckdb/parser/parsed_data/alter_scalar_function_info.hpp index d7e87afb..b33d81d6 100644 --- a/src/duckdb/src/include/duckdb/parser/parsed_data/alter_scalar_function_info.hpp +++ b/src/duckdb/src/include/duckdb/parser/parsed_data/alter_scalar_function_info.hpp @@ -21,7 +21,7 @@ enum class AlterScalarFunctionType : uint8_t { INVALID = 0, ADD_FUNCTION_OVERLOA struct AlterScalarFunctionInfo : public AlterInfo { AlterScalarFunctionInfo(AlterScalarFunctionType type, AlterEntryData data); - virtual ~AlterScalarFunctionInfo() override; + ~AlterScalarFunctionInfo() override; AlterScalarFunctionType alter_scalar_function_type; diff --git a/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp b/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp index ef08f556..a518d396 100644 --- a/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp +++ b/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp @@ -21,7 +21,7 @@ enum class AlterTableFunctionType : uint8_t { INVALID = 0, ADD_FUNCTION_OVERLOAD struct AlterTableFunctionInfo : public AlterInfo { AlterTableFunctionInfo(AlterTableFunctionType type, AlterEntryData data); - virtual ~AlterTableFunctionInfo() override; + ~AlterTableFunctionInfo() override; AlterTableFunctionType alter_table_function_type; diff --git a/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp b/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp index 9da19c70..c07f05fc 100644 --- a/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +++ b/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp @@ -307,7 +307,7 @@ struct AlterViewInfo : public AlterInfo { static unique_ptr Deserialize(Deserializer &deserializer); protected: - AlterViewInfo(AlterViewType type); + explicit AlterViewInfo(AlterViewType type); }; //===--------------------------------------------------------------------===// diff --git a/src/duckdb/src/include/duckdb/parser/parsed_data/copy_database_info.hpp b/src/duckdb/src/include/duckdb/parser/parsed_data/copy_database_info.hpp new file mode 100644 index 00000000..09b375bd --- /dev/null +++ b/src/duckdb/src/include/duckdb/parser/parsed_data/copy_database_info.hpp @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/parser/parsed_data/copy_database_info.hpp +// +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include "duckdb/common/unique_ptr.hpp" +#include "duckdb/common/vector.hpp" +#include "duckdb/parser/parsed_data/create_info.hpp" +#include "duckdb/parser/parsed_data/parse_info.hpp" + +namespace duckdb { + +struct CopyDatabaseInfo : public ParseInfo { +public: + static constexpr const ParseInfoType TYPE = ParseInfoType::COPY_DATABASE_INFO; + +public: + explicit CopyDatabaseInfo() : ParseInfo(TYPE), target_database(INVALID_CATALOG) { + } + + explicit CopyDatabaseInfo(const string &target_database) : ParseInfo(TYPE), target_database(target_database) { + } + + // The destination database to which catalog entries are being copied + string target_database; + + // The catalog entries that are going to be created in the destination DB + vector> entries; + +public: + void Serialize(Serializer &serializer) const override; + static unique_ptr Deserialize(Deserializer &deserializer); +}; + +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/parser/parsed_data/create_function_info.hpp b/src/duckdb/src/include/duckdb/parser/parsed_data/create_function_info.hpp index 1e50583c..64018f3b 100644 --- a/src/duckdb/src/include/duckdb/parser/parsed_data/create_function_info.hpp +++ b/src/duckdb/src/include/duckdb/parser/parsed_data/create_function_info.hpp @@ -14,7 +14,8 @@ namespace duckdb { struct CreateFunctionInfo : public CreateInfo { - explicit CreateFunctionInfo(CatalogType type, string schema = DEFAULT_SCHEMA) : CreateInfo(type, schema) { + explicit CreateFunctionInfo(CatalogType type, string schema = DEFAULT_SCHEMA) + : CreateInfo(type, std::move(schema)) { D_ASSERT(type == CatalogType::SCALAR_FUNCTION_ENTRY || type == CatalogType::AGGREGATE_FUNCTION_ENTRY || type == CatalogType::TABLE_FUNCTION_ENTRY || type == CatalogType::PRAGMA_FUNCTION_ENTRY || type == CatalogType::MACRO_ENTRY || type == CatalogType::TABLE_MACRO_ENTRY); diff --git a/src/duckdb/src/include/duckdb/parser/parsed_data/create_index_info.hpp b/src/duckdb/src/include/duckdb/parser/parsed_data/create_index_info.hpp index 9209cc58..4b42e8e0 100644 --- a/src/duckdb/src/include/duckdb/parser/parsed_data/create_index_info.hpp +++ b/src/duckdb/src/include/duckdb/parser/parsed_data/create_index_info.hpp @@ -47,6 +47,7 @@ struct CreateIndexInfo : public CreateInfo { public: DUCKDB_API unique_ptr Copy() const override; + string ToString() const override; void Serialize(Serializer &serializer) const override; static unique_ptr Deserialize(Deserializer &deserializer); }; diff --git a/src/duckdb/src/include/duckdb/parser/parsed_data/create_info.hpp b/src/duckdb/src/include/duckdb/parser/parsed_data/create_info.hpp index 918c6fcb..50637103 100644 --- a/src/duckdb/src/include/duckdb/parser/parsed_data/create_info.hpp +++ b/src/duckdb/src/include/duckdb/parser/parsed_data/create_info.hpp @@ -13,6 +13,7 @@ #include "duckdb/common/enum_util.hpp" #include "duckdb/common/enums/on_create_conflict.hpp" #include "duckdb/common/types/value.hpp" +#include "duckdb/catalog/dependency_list.hpp" namespace duckdb { struct AlterInfo; @@ -23,7 +24,7 @@ struct CreateInfo : public ParseInfo { public: explicit CreateInfo(CatalogType type, string schema = DEFAULT_SCHEMA, string catalog_p = INVALID_CATALOG) - : ParseInfo(TYPE), type(type), catalog(std::move(catalog_p)), schema(schema), + : ParseInfo(TYPE), type(type), catalog(std::move(catalog_p)), schema(std::move(schema)), on_conflict(OnCreateConflict::ERROR_ON_CONFLICT), temporary(false), internal(false) { } ~CreateInfo() override { diff --git a/src/duckdb/src/include/duckdb/parser/parsed_data/create_macro_info.hpp b/src/duckdb/src/include/duckdb/parser/parsed_data/create_macro_info.hpp index d51ddfa7..1e335b62 100644 --- a/src/duckdb/src/include/duckdb/parser/parsed_data/create_macro_info.hpp +++ b/src/duckdb/src/include/duckdb/parser/parsed_data/create_macro_info.hpp @@ -14,7 +14,7 @@ namespace duckdb { struct CreateMacroInfo : public CreateFunctionInfo { - CreateMacroInfo(CatalogType type); + explicit CreateMacroInfo(CatalogType type); unique_ptr function; diff --git a/src/duckdb/src/include/duckdb/parser/parsed_data/create_pragma_function_info.hpp b/src/duckdb/src/include/duckdb/parser/parsed_data/create_pragma_function_info.hpp index eae55880..2e8d9a73 100644 --- a/src/duckdb/src/include/duckdb/parser/parsed_data/create_pragma_function_info.hpp +++ b/src/duckdb/src/include/duckdb/parser/parsed_data/create_pragma_function_info.hpp @@ -16,7 +16,7 @@ namespace duckdb { struct CreatePragmaFunctionInfo : public CreateFunctionInfo { DUCKDB_API explicit CreatePragmaFunctionInfo(PragmaFunction function); - DUCKDB_API CreatePragmaFunctionInfo(string name, PragmaFunctionSet functions_); + DUCKDB_API CreatePragmaFunctionInfo(string name, PragmaFunctionSet functions); PragmaFunctionSet functions; diff --git a/src/duckdb/src/include/duckdb/parser/parsed_data/create_secret_info.hpp b/src/duckdb/src/include/duckdb/parser/parsed_data/create_secret_info.hpp index 3d368938..dfe81249 100644 --- a/src/duckdb/src/include/duckdb/parser/parsed_data/create_secret_info.hpp +++ b/src/duckdb/src/include/duckdb/parser/parsed_data/create_secret_info.hpp @@ -18,7 +18,7 @@ namespace duckdb { -struct CreateSecretInfo : public CreateInfo { +struct CreateSecretInfo : public CreateInfo { // NOLINT: work-around bug in clang-tidy public: static constexpr const ParseInfoType TYPE = ParseInfoType::CREATE_SECRET_INFO; @@ -41,7 +41,7 @@ struct CreateSecretInfo : public CreateInfo { //! Named parameter list (if any) case_insensitive_map_t options; - unique_ptr Copy() const; + unique_ptr Copy() const override; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/parser/parsed_data/extra_drop_info.hpp b/src/duckdb/src/include/duckdb/parser/parsed_data/extra_drop_info.hpp index 0dfd4804..2812469d 100644 --- a/src/duckdb/src/include/duckdb/parser/parsed_data/extra_drop_info.hpp +++ b/src/duckdb/src/include/duckdb/parser/parsed_data/extra_drop_info.hpp @@ -38,7 +38,7 @@ struct ExtraDropInfo { template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } virtual unique_ptr Copy() const = 0; @@ -57,9 +57,9 @@ struct ExtraDropSecretInfo : public ExtraDropInfo { string secret_storage; public: - virtual unique_ptr Copy() const override; + unique_ptr Copy() const override; - virtual void Serialize(Serializer &serializer) const override; + void Serialize(Serializer &serializer) const override; static unique_ptr Deserialize(Deserializer &deserializer); }; diff --git a/src/duckdb/src/include/duckdb/parser/parsed_data/parse_info.hpp b/src/duckdb/src/include/duckdb/parser/parsed_data/parse_info.hpp index 16bb9dd9..5d395c6a 100644 --- a/src/duckdb/src/include/duckdb/parser/parsed_data/parse_info.hpp +++ b/src/duckdb/src/include/duckdb/parser/parsed_data/parse_info.hpp @@ -27,7 +27,8 @@ enum class ParseInfoType : uint8_t { TRANSACTION_INFO, VACUUM_INFO, COMMENT_ON_INFO, - COMMENT_ON_COLUMN_INFO + COMMENT_ON_COLUMN_INFO, + COPY_DATABASE_INFO }; struct ParseInfo { @@ -47,7 +48,7 @@ struct ParseInfo { template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } diff --git a/src/duckdb/src/include/duckdb/parser/parsed_data/vacuum_info.hpp b/src/duckdb/src/include/duckdb/parser/parsed_data/vacuum_info.hpp index 08fdda15..6bd8fe6a 100644 --- a/src/duckdb/src/include/duckdb/parser/parsed_data/vacuum_info.hpp +++ b/src/duckdb/src/include/duckdb/parser/parsed_data/vacuum_info.hpp @@ -13,6 +13,7 @@ #include "duckdb/planner/tableref/bound_basetableref.hpp" #include "duckdb/common/unordered_map.hpp" #include "duckdb/common/optional_ptr.hpp" +#include "duckdb/catalog/dependency_list.hpp" namespace duckdb { class Serializer; @@ -37,13 +38,9 @@ struct VacuumInfo : public ParseInfo { explicit VacuumInfo(VacuumOptions options); const VacuumOptions options; - -public: + vector columns; bool has_table; unique_ptr ref; - optional_ptr table; - unordered_map column_id_map; - vector columns; public: unique_ptr Copy(); diff --git a/src/duckdb/src/include/duckdb/parser/parser.hpp b/src/duckdb/src/include/duckdb/parser/parser.hpp index 4ba14181..fbc7f876 100644 --- a/src/duckdb/src/include/duckdb/parser/parser.hpp +++ b/src/duckdb/src/include/duckdb/parser/parser.hpp @@ -29,7 +29,7 @@ class GroupByNode; //! plan and executed. class Parser { public: - Parser(ParserOptions options = ParserOptions()); + explicit Parser(ParserOptions options = ParserOptions()); //! The parsed SQL statements from an invocation to ParseQuery. vector> statements; diff --git a/src/duckdb/src/include/duckdb/parser/parser_extension.hpp b/src/duckdb/src/include/duckdb/parser/parser_extension.hpp index d00b30d9..baf60fb2 100644 --- a/src/duckdb/src/include/duckdb/parser/parser_extension.hpp +++ b/src/duckdb/src/include/duckdb/parser/parser_extension.hpp @@ -38,10 +38,10 @@ struct ParserExtensionParseData { struct ParserExtensionParseResult { ParserExtensionParseResult() : type(ParserExtensionResultType::DISPLAY_ORIGINAL_ERROR) { } - ParserExtensionParseResult(string error_p) + explicit ParserExtensionParseResult(string error_p) : type(ParserExtensionResultType::DISPLAY_EXTENSION_ERROR), error(std::move(error_p)) { } - ParserExtensionParseResult(unique_ptr parse_data_p) + explicit ParserExtensionParseResult(unique_ptr parse_data_p) : type(ParserExtensionResultType::PARSE_SUCCESSFUL), parse_data(std::move(parse_data_p)) { } @@ -59,7 +59,7 @@ typedef ParserExtensionParseResult (*parse_function_t)(ParserExtensionInfo *info //===--------------------------------------------------------------------===// // Plan //===--------------------------------------------------------------------===// -struct ParserExtensionPlanResult { +struct ParserExtensionPlanResult { // NOLINT: work-around bug in clang-tidy //! The table function to execute TableFunction function; //! Parameters to the function diff --git a/src/duckdb/src/include/duckdb/parser/query_error_context.hpp b/src/duckdb/src/include/duckdb/parser/query_error_context.hpp index fd512d7e..cec72b14 100644 --- a/src/duckdb/src/include/duckdb/parser/query_error_context.hpp +++ b/src/duckdb/src/include/duckdb/parser/query_error_context.hpp @@ -17,7 +17,7 @@ namespace duckdb { class QueryErrorContext { public: - explicit QueryErrorContext(optional_idx query_location_ = optional_idx()) : query_location(query_location_) { + explicit QueryErrorContext(optional_idx query_location_p = optional_idx()) : query_location(query_location_p) { } //! The location in which the error should be thrown diff --git a/src/duckdb/src/include/duckdb/parser/transformer.hpp b/src/duckdb/src/include/duckdb/parser/transformer.hpp index 2657eb2d..40ed9071 100644 --- a/src/duckdb/src/include/duckdb/parser/transformer.hpp +++ b/src/duckdb/src/include/duckdb/parser/transformer.hpp @@ -55,7 +55,7 @@ class Transformer { public: explicit Transformer(ParserOptions &options); - explicit Transformer(Transformer &parent); + Transformer(Transformer &parent); ~Transformer(); //! Transforms a Postgres parse tree into a set of SQL Statements @@ -286,10 +286,8 @@ class Transformer { OnCreateConflict TransformOnConflict(duckdb_libpgquery::PGOnCreateConflict conflict); string TransformAlias(duckdb_libpgquery::PGAlias *root, vector &column_name_alias); vector TransformStringList(duckdb_libpgquery::PGList *list); - void TransformCTE(duckdb_libpgquery::PGWithClause &de_with_clause, CommonTableExpressionMap &cte_map, - vector> &materialized_ctes); - static unique_ptr TransformMaterializedCTE(unique_ptr root, - vector> &materialized_ctes); + void TransformCTE(duckdb_libpgquery::PGWithClause &de_with_clause, CommonTableExpressionMap &cte_map); + static unique_ptr TransformMaterializedCTE(unique_ptr root); unique_ptr TransformRecursiveCTE(duckdb_libpgquery::PGCommonTableExpr &node, CommonTableExpressionInfo &info); diff --git a/src/duckdb/src/include/duckdb/planner/bind_context.hpp b/src/duckdb/src/include/duckdb/planner/bind_context.hpp index d87a54a1..cab1479d 100644 --- a/src/duckdb/src/include/duckdb/planner/bind_context.hpp +++ b/src/duckdb/src/include/duckdb/planner/bind_context.hpp @@ -38,7 +38,7 @@ struct UsingColumnSet { //! encountered during the binding process. class BindContext { public: - BindContext(Binder &binder); + explicit BindContext(Binder &binder); //! Keep track of recursive CTE references case_insensitive_map_t> cte_references; @@ -133,7 +133,7 @@ class BindContext { return cte_bindings; } void SetCTEBindings(case_insensitive_map_t> bindings) { - cte_bindings = bindings; + cte_bindings = std::move(bindings); } //! Alias a set of column names for the specified table, using the original names if there are not enough aliases diff --git a/src/duckdb/src/include/duckdb/planner/binder.hpp b/src/duckdb/src/include/duckdb/planner/binder.hpp index d7b750bf..ed646e6b 100644 --- a/src/duckdb/src/include/duckdb/planner/binder.hpp +++ b/src/duckdb/src/include/duckdb/planner/binder.hpp @@ -37,6 +37,7 @@ class ViewCatalogEntry; class TableMacroCatalogEntry; class UpdateSetInfo; class LogicalProjection; +class LogicalVacuum; class ColumnList; class ExternalDependency; @@ -61,6 +62,7 @@ struct CorrelatedColumnInfo { string name; idx_t depth; + // NOLINTNEXTLINE - work-around bug in clang-tidy CorrelatedColumnInfo(ColumnBinding binding, LogicalType type_p, string name_p, idx_t depth) : binding(binding), type(std::move(type_p)), name(std::move(name_p)), depth(depth) { } @@ -135,8 +137,8 @@ class Binder : public std::enable_shared_from_this { //! Add a common table expression to the binder void AddCTE(const string &name, CommonTableExpressionInfo &cte); - //! Find a common table expression by name; returns nullptr if none exists - optional_ptr FindCTE(const string &name, bool skip = false); + //! Find all candidate common table expression by name; returns empty vector if none exists + vector> FindCTE(const string &name, bool skip = false); bool CTEIsAlreadyBound(CommonTableExpressionInfo &cte); @@ -162,6 +164,8 @@ class Binder : public std::enable_shared_from_this { TableCatalogEntry &table, TableStorageInfo &storage_info); void BindOnConflictClause(LogicalInsert &insert, TableCatalogEntry &table, InsertStatement &stmt); + void BindVacuumTable(LogicalVacuum &vacuum, unique_ptr &root); + static void BindSchemaOrCatalog(ClientContext &context, string &catalog, string &schema); static void BindLogicalType(ClientContext &context, LogicalType &type, optional_ptr catalog = nullptr, const string &schema = INVALID_SCHEMA); @@ -229,6 +233,8 @@ class Binder : public std::enable_shared_from_this { unique_ptr BindWithReplacementScan(ClientContext &context, const string &table_name, BaseTableRef &ref); + template + BoundStatement BindWithCTE(T &statement); BoundStatement Bind(SelectStatement &stmt); BoundStatement Bind(InsertStatement &stmt); BoundStatement Bind(CopyStatement &stmt); @@ -262,6 +268,8 @@ class Binder : public std::enable_shared_from_this { unique_ptr BindTableMacro(FunctionExpression &function, TableMacroCatalogEntry ¯o_func, idx_t depth); + unique_ptr BindMaterializedCTE(CommonTableExpressionMap &cte_map); + unique_ptr BindCTE(CTENode &statement); unique_ptr BindNode(SelectNode &node); unique_ptr BindNode(SetOperationNode &node); unique_ptr BindNode(RecursiveCTENode &node); @@ -271,6 +279,7 @@ class Binder : public std::enable_shared_from_this { unique_ptr VisitQueryNode(BoundQueryNode &node, unique_ptr root); unique_ptr CreatePlan(BoundRecursiveCTENode &node); unique_ptr CreatePlan(BoundCTENode &node); + unique_ptr CreatePlan(BoundCTENode &node, unique_ptr base); unique_ptr CreatePlan(BoundSelectNode &statement); unique_ptr CreatePlan(BoundSetOperationNode &node); unique_ptr CreatePlan(BoundQueryNode &node); @@ -318,9 +327,9 @@ class Binder : public std::enable_shared_from_this { BoundStatement BindCopyTo(CopyStatement &stmt); BoundStatement BindCopyFrom(CopyStatement &stmt); - void BindModifiers(OrderBinder &order_binder, QueryNode &statement, BoundQueryNode &result); - void BindModifierTypes(BoundQueryNode &result, const vector &sql_types, idx_t projection_index, - const vector &expansion_count = {}); + void PrepareModifiers(OrderBinder &order_binder, QueryNode &statement, BoundQueryNode &result); + void BindModifiers(BoundQueryNode &result, idx_t table_index, const vector &names, + const vector &sql_types, const SelectBindState &bind_state); unique_ptr BindLimit(OrderBinder &order_binder, LimitModifier &limit_mod); unique_ptr BindLimitPercent(OrderBinder &order_binder, LimitPercentModifier &limit_mod); @@ -362,10 +371,8 @@ class Binder : public std::enable_shared_from_this { unique_ptr BindSelectNode(SelectNode &statement, unique_ptr from_table); - unique_ptr BindCopyDatabaseSchema(CopyDatabaseStatement &stmt, Catalog &from_database, - Catalog &to_database); - unique_ptr BindCopyDatabaseData(CopyDatabaseStatement &stmt, Catalog &from_database, - Catalog &to_database); + unique_ptr BindCopyDatabaseSchema(Catalog &source_catalog, const string &target_database_name); + unique_ptr BindCopyDatabaseData(Catalog &source_catalog, const string &target_database_name); unique_ptr BindShowQuery(ShowRef &ref); unique_ptr BindShowTable(ShowRef &ref); diff --git a/src/duckdb/src/include/duckdb/planner/expression.hpp b/src/duckdb/src/include/duckdb/planner/expression.hpp index 7598986c..ed40f4f7 100644 --- a/src/duckdb/src/include/duckdb/planner/expression.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression.hpp @@ -43,7 +43,7 @@ class Expression : public BaseExpression { if (!BaseExpression::Equals(other)) { return false; } - return return_type == ((Expression &)other).return_type; + return return_type == reinterpret_cast(other).return_type; } static bool Equals(const Expression &left, const Expression &right) { return left.Equals(right); diff --git a/src/duckdb/src/include/duckdb/planner/expression/bound_case_expression.hpp b/src/duckdb/src/include/duckdb/planner/expression/bound_case_expression.hpp index c3a5abe5..7addb1be 100644 --- a/src/duckdb/src/include/duckdb/planner/expression/bound_case_expression.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression/bound_case_expression.hpp @@ -25,7 +25,7 @@ class BoundCaseExpression : public Expression { static constexpr const ExpressionClass TYPE = ExpressionClass::BOUND_CASE; public: - BoundCaseExpression(LogicalType type); + explicit BoundCaseExpression(LogicalType type); BoundCaseExpression(unique_ptr when_expr, unique_ptr then_expr, unique_ptr else_expr); diff --git a/src/duckdb/src/include/duckdb/planner/expression/bound_cast_expression.hpp b/src/duckdb/src/include/duckdb/planner/expression/bound_cast_expression.hpp index 2881cedc..c4932e7e 100644 --- a/src/duckdb/src/include/duckdb/planner/expression/bound_cast_expression.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression/bound_cast_expression.hpp @@ -29,7 +29,7 @@ class BoundCastExpression : public Expression { BoundCastInfo bound_cast; public: - LogicalType source_type() { + LogicalType source_type() { // NOLINT: allow casing for legacy reasons D_ASSERT(child->return_type.IsValid()); return child->return_type; } diff --git a/src/duckdb/src/include/duckdb/planner/expression/bound_default_expression.hpp b/src/duckdb/src/include/duckdb/planner/expression/bound_default_expression.hpp index bac032ec..526f8249 100644 --- a/src/duckdb/src/include/duckdb/planner/expression/bound_default_expression.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression/bound_default_expression.hpp @@ -18,7 +18,7 @@ class BoundDefaultExpression : public Expression { public: explicit BoundDefaultExpression(LogicalType type = LogicalType()) - : Expression(ExpressionType::VALUE_DEFAULT, ExpressionClass::BOUND_DEFAULT, type) { + : Expression(ExpressionType::VALUE_DEFAULT, ExpressionClass::BOUND_DEFAULT, std::move(type)) { } public: diff --git a/src/duckdb/src/include/duckdb/planner/expression/bound_expanded_expression.hpp b/src/duckdb/src/include/duckdb/planner/expression/bound_expanded_expression.hpp new file mode 100644 index 00000000..7b440024 --- /dev/null +++ b/src/duckdb/src/include/duckdb/planner/expression/bound_expanded_expression.hpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/planner/expression/bound_expanded_expression.hpp +// +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include "duckdb/planner/expression.hpp" + +namespace duckdb { + +//! BoundExpression is an intermediate dummy expression used by the binder. +//! It holds a set of expressions that will be "expanded" in the select list of a query +class BoundExpandedExpression : public Expression { +public: + static constexpr const ExpressionClass TYPE = ExpressionClass::BOUND_EXPANDED; + +public: + explicit BoundExpandedExpression(vector> expanded_expressions); + + vector> expanded_expressions; + +public: + string ToString() const override; + + bool Equals(const BaseExpression &other) const override; + + unique_ptr Copy() override; +}; + +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/planner/expression/bound_subquery_expression.hpp b/src/duckdb/src/include/duckdb/planner/expression/bound_subquery_expression.hpp index 73cfd2fa..23370574 100644 --- a/src/duckdb/src/include/duckdb/planner/expression/bound_subquery_expression.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression/bound_subquery_expression.hpp @@ -23,7 +23,7 @@ class BoundSubqueryExpression : public Expression { explicit BoundSubqueryExpression(LogicalType return_type); bool IsCorrelated() { - return binder->correlated_columns.size() > 0; + return !binder->correlated_columns.empty(); } //! The binder used to bind the subquery node diff --git a/src/duckdb/src/include/duckdb/planner/expression_binder.hpp b/src/duckdb/src/include/duckdb/planner/expression_binder.hpp index b74e0d28..2f43ab0a 100644 --- a/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression_binder.hpp @@ -34,6 +34,7 @@ class CatalogEntry; class SimpleFunction; struct DummyBinding; +struct SelectBindState; struct BoundColumnReferenceInfo { string name; diff --git a/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp b/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp index c05e1d8d..1fb875c7 100644 --- a/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp @@ -28,8 +28,6 @@ struct BoundGroupInformation { //! functions. class BaseSelectBinder : public ExpressionBinder { public: - BaseSelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info, - case_insensitive_map_t alias_map); BaseSelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info); bool BoundAggregates() { @@ -51,17 +49,16 @@ class BaseSelectBinder : public ExpressionBinder { BoundSelectNode &node; BoundGroupInformation &info; - case_insensitive_map_t alias_map; protected: - BindResult BindColumnRef(unique_ptr &expr_ptr, idx_t depth); BindResult BindGroupingFunction(OperatorExpression &op, idx_t depth) override; - BindResult BindWindow(WindowExpression &expr, idx_t depth); - idx_t TryBindGroup(ParsedExpression &expr, idx_t depth); - BindResult BindGroup(ParsedExpression &expr, idx_t depth, idx_t group_index); + //! Binds a WINDOW expression and returns the result. + virtual BindResult BindWindow(WindowExpression &expr, idx_t depth); + virtual BindResult BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression); - bool QualifyColumnAlias(const ColumnRefExpression &colref) override; + idx_t TryBindGroup(ParsedExpression &expr); + BindResult BindGroup(ParsedExpression &expr, idx_t depth, idx_t group_index); }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/planner/expression_binder/column_alias_binder.hpp b/src/duckdb/src/include/duckdb/planner/expression_binder/column_alias_binder.hpp index 8795ef3a..4f1e2c34 100644 --- a/src/duckdb/src/include/duckdb/planner/expression_binder/column_alias_binder.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression_binder/column_alias_binder.hpp @@ -13,20 +13,19 @@ namespace duckdb { -class BoundSelectNode; class ColumnRefExpression; +struct SelectBindState; //! A helper binder for WhereBinder and HavingBinder which support alias as a columnref. class ColumnAliasBinder { public: - ColumnAliasBinder(BoundSelectNode &node, const case_insensitive_map_t &alias_map); + explicit ColumnAliasBinder(SelectBindState &bind_state); bool BindAlias(ExpressionBinder &enclosing_binder, unique_ptr &expr_ptr, idx_t depth, bool root_expression, BindResult &result); private: - BoundSelectNode &node; - const case_insensitive_map_t &alias_map; + SelectBindState &bind_state; unordered_set visited_select_indexes; }; diff --git a/src/duckdb/src/include/duckdb/planner/expression_binder/group_binder.hpp b/src/duckdb/src/include/duckdb/planner/expression_binder/group_binder.hpp index 10e32b6c..1c398daa 100644 --- a/src/duckdb/src/include/duckdb/planner/expression_binder/group_binder.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression_binder/group_binder.hpp @@ -14,12 +14,13 @@ namespace duckdb { class ConstantExpression; class ColumnRefExpression; +struct SelectBindState; //! The GROUP binder is responsible for binding expressions in the GROUP BY clause class GroupBinder : public ExpressionBinder { public: GroupBinder(Binder &binder, ClientContext &context, SelectNode &node, idx_t group_index, - case_insensitive_map_t &alias_map, case_insensitive_map_t &group_alias_map); + SelectBindState &bind_state, case_insensitive_map_t &group_alias_map); //! The unbound root expression unique_ptr unbound_expression; @@ -36,7 +37,7 @@ class GroupBinder : public ExpressionBinder { BindResult BindConstant(ConstantExpression &expr); SelectNode &node; - case_insensitive_map_t &alias_map; + SelectBindState &bind_state; case_insensitive_map_t &group_alias_map; unordered_set used_aliases; diff --git a/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp b/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp index 113bc68a..919779fc 100644 --- a/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp @@ -18,15 +18,13 @@ namespace duckdb { class HavingBinder : public BaseSelectBinder { public: HavingBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info, - case_insensitive_map_t &alias_map, AggregateHandling aggregate_handling); + AggregateHandling aggregate_handling); protected: - BindResult BindExpression(unique_ptr &expr_ptr, idx_t depth, - bool root_expression = false) override; + BindResult BindWindow(WindowExpression &expr, idx_t depth) override; + BindResult BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression) override; private: - BindResult BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression); - ColumnAliasBinder column_alias_binder; AggregateHandling aggregate_handling; }; diff --git a/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp b/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp index 3beed2c9..8e18161a 100644 --- a/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp @@ -17,21 +17,17 @@ namespace duckdb { class Binder; class Expression; class SelectNode; +struct SelectBindState; //! The ORDER binder is responsible for binding an expression within the ORDER BY clause of a SQL statement class OrderBinder { public: - OrderBinder(vector binders, idx_t projection_index, case_insensitive_map_t &alias_map, - parsed_expression_map_t &projection_map, idx_t max_count); - OrderBinder(vector binders, idx_t projection_index, SelectNode &node, - case_insensitive_map_t &alias_map, parsed_expression_map_t &projection_map); + OrderBinder(vector binders, SelectBindState &bind_state); + OrderBinder(vector binders, SelectNode &node, SelectBindState &bind_state); public: unique_ptr Bind(unique_ptr expr); - idx_t MaxCount() const { - return max_count; - } bool HasExtraList() const { return extra_list; } @@ -42,17 +38,13 @@ class OrderBinder { unique_ptr CreateExtraReference(unique_ptr expr); private: - unique_ptr CreateProjectionReference(ParsedExpression &expr, const idx_t index, - const LogicalType &logical_type); + unique_ptr CreateProjectionReference(ParsedExpression &expr, const idx_t index); unique_ptr BindConstant(ParsedExpression &expr, const Value &val); private: vector binders; - idx_t projection_index; - idx_t max_count; - vector> *extra_list; - case_insensitive_map_t &alias_map; - parsed_expression_map_t &projection_map; + optional_ptr>> extra_list; + SelectBindState &bind_state; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp b/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp index ef5d6e59..d7cbbf5b 100644 --- a/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp @@ -12,20 +12,17 @@ #include "duckdb/planner/expression_binder/column_alias_binder.hpp" namespace duckdb { +struct SelectBindState; //! The QUALIFY binder is responsible for binding an expression within the QUALIFY clause of a SQL statement class QualifyBinder : public BaseSelectBinder { public: - QualifyBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info, - case_insensitive_map_t &alias_map); + QualifyBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info); protected: - BindResult BindExpression(unique_ptr &expr_ptr, idx_t depth, - bool root_expression = false) override; + BindResult BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression) override; private: - BindResult BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression); - ColumnAliasBinder column_alias_binder; }; diff --git a/src/duckdb/src/include/duckdb/planner/expression_binder/select_bind_state.hpp b/src/duckdb/src/include/duckdb/planner/expression_binder/select_bind_state.hpp new file mode 100644 index 00000000..d11d9473 --- /dev/null +++ b/src/duckdb/src/include/duckdb/planner/expression_binder/select_bind_state.hpp @@ -0,0 +1,52 @@ +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/planner/expression_binder/select_bind_state.hpp +// +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include "duckdb/planner/bound_query_node.hpp" +#include "duckdb/planner/logical_operator.hpp" +#include "duckdb/parser/expression_map.hpp" +#include "duckdb/planner/bound_tableref.hpp" +#include "duckdb/parser/parsed_data/sample_options.hpp" +#include "duckdb/parser/group_by_node.hpp" + +namespace duckdb { + +//! Bind state during a SelectNode +struct SelectBindState { + // Mapping of (alias -> index) and a mapping of (Expression -> index) for the SELECT list + case_insensitive_map_t alias_map; + parsed_expression_map_t projection_map; + //! The original unparsed expressions. This is exported after binding, because the binding might change the + //! expressions (e.g. when a * clause is present) + vector> original_expressions; + +public: + unique_ptr BindAlias(idx_t index); + + void SetExpressionIsVolatile(idx_t index); + void SetExpressionHasSubquery(idx_t index); + + bool AliasHasSubquery(idx_t index) const; + + void AddExpandedColumn(idx_t expand_count); + void AddRegularColumn(); + idx_t GetFinalIndex(idx_t index) const; + +private: + //! The set of referenced aliases + unordered_set referenced_aliases; + //! The set of expressions that is volatile + unordered_set volatile_expressions; + //! The set of expressions that contains a subquery + unordered_set subquery_expressions; + //! Column indices after expansion of Expanded expressions (e.g. UNNEST(STRUCT) clauses) + vector expanded_column_indices; +}; + +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp b/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp index 9c2ca8a7..64e59141 100644 --- a/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp @@ -15,22 +15,16 @@ namespace duckdb { //! The SELECT binder is responsible for binding an expression within the SELECT clause of a SQL statement class SelectBinder : public BaseSelectBinder { public: - SelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info, - case_insensitive_map_t alias_map); SelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info); - bool HasExpandedExpressions() { - return !expanded_expressions.empty(); - } - vector> &ExpandedExpressions() { - return expanded_expressions; - } - protected: BindResult BindUnnest(FunctionExpression &function, idx_t depth, bool root_expression) override; + BindResult BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression) override; + + bool QualifyColumnAlias(const ColumnRefExpression &colref) override; +protected: idx_t unnest_level = 0; - vector> expanded_expressions; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/planner/expression_binder/table_function_binder.hpp b/src/duckdb/src/include/duckdb/planner/expression_binder/table_function_binder.hpp index 46dbd1fd..9e14a852 100644 --- a/src/duckdb/src/include/duckdb/planner/expression_binder/table_function_binder.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression_binder/table_function_binder.hpp @@ -15,14 +15,17 @@ namespace duckdb { //! The table function binder can bind standard table function parameters (i.e., non-table-in-out functions) class TableFunctionBinder : public ExpressionBinder { public: - TableFunctionBinder(Binder &binder, ClientContext &context); + TableFunctionBinder(Binder &binder, ClientContext &context, string table_function_name = string()); protected: BindResult BindLambdaReference(LambdaRefExpression &expr, idx_t depth); - BindResult BindColumnReference(ColumnRefExpression &expr, idx_t depth, bool root_expression); + BindResult BindColumnReference(unique_ptr &expr, idx_t depth, bool root_expression); BindResult BindExpression(unique_ptr &expr, idx_t depth, bool root_expression = false) override; string UnsupportedAggregateMessage() override; + +private: + string table_function_name; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/planner/expression_iterator.hpp b/src/duckdb/src/include/duckdb/planner/expression_iterator.hpp index c07f60e1..36825b3a 100644 --- a/src/duckdb/src/include/duckdb/planner/expression_iterator.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression_iterator.hpp @@ -31,6 +31,8 @@ class ExpressionIterator { class BoundNodeVisitor { public: + virtual ~BoundNodeVisitor() = default; + virtual void VisitBoundQueryNode(BoundQueryNode &op); virtual void VisitBoundTableRef(BoundTableRef &ref); virtual void VisitExpression(unique_ptr &expression); diff --git a/src/duckdb/src/include/duckdb/planner/filter/conjunction_filter.hpp b/src/duckdb/src/include/duckdb/planner/filter/conjunction_filter.hpp index 470093af..aa1b9f32 100644 --- a/src/duckdb/src/include/duckdb/planner/filter/conjunction_filter.hpp +++ b/src/duckdb/src/include/duckdb/planner/filter/conjunction_filter.hpp @@ -14,20 +14,17 @@ namespace duckdb { class ConjunctionFilter : public TableFilter { public: - ConjunctionFilter(TableFilterType filter_type_p) : TableFilter(filter_type_p) { + explicit ConjunctionFilter(TableFilterType filter_type_p) : TableFilter(filter_type_p) { } - virtual ~ConjunctionFilter() { + ~ConjunctionFilter() override { } //! The filters of this conjunction vector> child_filters; public: - virtual FilterPropagateResult CheckStatistics(BaseStatistics &stats) = 0; - virtual string ToString(const string &column_name) = 0; - - virtual bool Equals(const TableFilter &other) const { + bool Equals(const TableFilter &other) const override { return TableFilter::Equals(other); } }; diff --git a/src/duckdb/src/include/duckdb/planner/logical_operator.hpp b/src/duckdb/src/include/duckdb/planner/logical_operator.hpp index ccb9cd12..98aa0fd6 100644 --- a/src/duckdb/src/include/duckdb/planner/logical_operator.hpp +++ b/src/duckdb/src/include/duckdb/planner/logical_operator.hpp @@ -43,6 +43,8 @@ class LogicalOperator { public: virtual vector GetColumnBindings(); + static string ColumnBindingsToString(const vector &bindings); + void PrintColumnBindings(); static vector GenerateColumnBindings(idx_t table_idx, idx_t column_count); static vector MapTypes(const vector &types, const vector &projection_map); static vector MapBindings(const vector &types, const vector &projection_map); diff --git a/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp b/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp index 7854bd39..91050764 100644 --- a/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +++ b/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp @@ -50,6 +50,7 @@ class LogicalMaterializedCTE; class LogicalSetOperation; class LogicalSample; class LogicalSimple; +class LogicalVacuum; class LogicalSet; class LogicalReset; class LogicalTopN; diff --git a/src/duckdb/src/include/duckdb/planner/operator/list.hpp b/src/duckdb/src/include/duckdb/planner/operator/list.hpp index 199f0a65..3fe4cb03 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/list.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/list.hpp @@ -41,4 +41,5 @@ #include "duckdb/planner/operator/logical_top_n.hpp" #include "duckdb/planner/operator/logical_unnest.hpp" #include "duckdb/planner/operator/logical_update.hpp" +#include "duckdb/planner/operator/logical_vacuum.hpp" #include "duckdb/planner/operator/logical_window.hpp" diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_copy_database.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_copy_database.hpp index 4a4144e3..1fc5ef47 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/logical_copy_database.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_copy_database.hpp @@ -8,22 +8,11 @@ #pragma once -#include "duckdb/parser/parsed_data/copy_info.hpp" -#include "duckdb/parser/parsed_data/exported_table_data.hpp" #include "duckdb/planner/logical_operator.hpp" -#include "duckdb/function/copy_function.hpp" +#include "duckdb/parser/parsed_data/copy_database_info.hpp" namespace duckdb { -struct CopyDatabaseInfo { - CopyDatabaseInfo(Catalog &from_database, Catalog &to_database); - ~CopyDatabaseInfo(); - - Catalog &from_database; - Catalog &to_database; - vector> entries; -}; - class LogicalCopyDatabase : public LogicalOperator { public: static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_COPY_DATABASE; @@ -40,6 +29,9 @@ class LogicalCopyDatabase : public LogicalOperator { protected: void ResolveTypes() override; + +private: + explicit LogicalCopyDatabase(unique_ptr info_p); }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_create_secret.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_create_secret.hpp index 1885e48c..9a780bd2 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/logical_create_secret.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_create_secret.hpp @@ -19,7 +19,7 @@ class LogicalCreateSecret : public LogicalOperator { static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_CREATE_SECRET; public: - LogicalCreateSecret(CreateSecretFunction function_p, CreateSecretInfo info_p) + explicit LogicalCreateSecret(CreateSecretInfo info_p) : LogicalOperator(LogicalOperatorType::LOGICAL_CREATE_SECRET), info(std::move(info_p)) { } diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp index b0e00ec4..d3b78640 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp @@ -24,8 +24,8 @@ class LogicalCTERef : public LogicalOperator { : LogicalOperator(LogicalOperatorType::LOGICAL_CTE_REF), table_index(table_index), cte_index(cte_index), correlated_columns(0), materialized_cte(materialized_cte) { D_ASSERT(types.size() > 0); - chunk_types = types; - bound_columns = colnames; + chunk_types = std::move(types); + bound_columns = std::move(colnames); } vector bound_columns; diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_delim_get.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_delim_get.hpp index 63421ee4..895883b1 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/logical_delim_get.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_delim_get.hpp @@ -21,7 +21,7 @@ class LogicalDelimGet : public LogicalOperator { LogicalDelimGet(idx_t table_index, vector types) : LogicalOperator(LogicalOperatorType::LOGICAL_DELIM_GET), table_index(table_index) { D_ASSERT(types.size() > 0); - chunk_types = types; + chunk_types = std::move(types); } //! The table index in the current bind context diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_dummy_scan.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_dummy_scan.hpp index 7adc63f8..8071fd0b 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/logical_dummy_scan.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_dummy_scan.hpp @@ -39,7 +39,7 @@ class LogicalDummyScan : public LogicalOperator { protected: void ResolveTypes() override { - if (types.size() == 0) { + if (types.empty()) { types.emplace_back(LogicalType::INTEGER); } } diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_explain.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_explain.hpp index dad4d898..d0233dce 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/logical_explain.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_explain.hpp @@ -14,7 +14,7 @@ namespace duckdb { class LogicalExplain : public LogicalOperator { - LogicalExplain(ExplainType explain_type) + explicit LogicalExplain(ExplainType explain_type) : LogicalOperator(LogicalOperatorType::LOGICAL_EXPLAIN), explain_type(explain_type) {}; public: diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_export.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_export.hpp index 3de951e9..9303a2f5 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/logical_export.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_export.hpp @@ -21,8 +21,8 @@ class LogicalExport : public LogicalOperator { public: LogicalExport(CopyFunction function, unique_ptr copy_info, BoundExportData exported_tables) - : LogicalOperator(LogicalOperatorType::LOGICAL_EXPORT), function(function), copy_info(std::move(copy_info)), - exported_tables(std::move(exported_tables)) { + : LogicalOperator(LogicalOperatorType::LOGICAL_EXPORT), function(std::move(function)), + copy_info(std::move(copy_info)), exported_tables(std::move(exported_tables)) { } CopyFunction function; unique_ptr copy_info; diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_expression_get.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_expression_get.hpp index 70120431..cf6180b1 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/logical_expression_get.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_expression_get.hpp @@ -20,8 +20,8 @@ class LogicalExpressionGet : public LogicalOperator { public: LogicalExpressionGet(idx_t table_index, vector types, vector>> expressions) - : LogicalOperator(LogicalOperatorType::LOGICAL_EXPRESSION_GET), table_index(table_index), expr_types(types), - expressions(std::move(expressions)) { + : LogicalOperator(LogicalOperatorType::LOGICAL_EXPRESSION_GET), table_index(table_index), + expr_types(std::move(types)), expressions(std::move(expressions)) { } //! The table index in the current bind context diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_extension_operator.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_extension_operator.hpp index 3fc6b6e7..a7d60ca3 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/logical_extension_operator.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_extension_operator.hpp @@ -22,11 +22,11 @@ struct LogicalExtensionOperator : public LogicalOperator { public: LogicalExtensionOperator() : LogicalOperator(LogicalOperatorType::LOGICAL_EXTENSION_OPERATOR) { } - LogicalExtensionOperator(vector> expressions) + explicit LogicalExtensionOperator(vector> expressions) : LogicalOperator(LogicalOperatorType::LOGICAL_EXTENSION_OPERATOR, std::move(expressions)) { } - virtual void Serialize(Serializer &serializer) const override; + void Serialize(Serializer &serializer) const override; static unique_ptr Deserialize(Deserializer &deserializer); virtual unique_ptr CreatePlan(ClientContext &context, PhysicalPlanGenerator &generator) = 0; diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_materialized_cte.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_materialized_cte.hpp index 0f5018c3..888968cd 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/logical_materialized_cte.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_materialized_cte.hpp @@ -20,10 +20,10 @@ class LogicalMaterializedCTE : public LogicalOperator { static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_MATERIALIZED_CTE; public: - LogicalMaterializedCTE(string ctename, idx_t table_index, idx_t column_count, unique_ptr cte, + LogicalMaterializedCTE(string ctename_p, idx_t table_index, idx_t column_count, unique_ptr cte, unique_ptr child) : LogicalOperator(LogicalOperatorType::LOGICAL_MATERIALIZED_CTE), table_index(table_index), - column_count(column_count), ctename(ctename) { + column_count(column_count), ctename(std::move(ctename_p)) { children.push_back(std::move(cte)); children.push_back(std::move(child)); } diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_pragma.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_pragma.hpp index 87e08fac..37fa70f8 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/logical_pragma.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_pragma.hpp @@ -19,7 +19,7 @@ class LogicalPragma : public LogicalOperator { static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_PRAGMA; public: - LogicalPragma(unique_ptr info_p) + explicit LogicalPragma(unique_ptr info_p) : LogicalOperator(LogicalOperatorType::LOGICAL_PRAGMA), info(std::move(info_p)) { } diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_prepare.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_prepare.hpp index 7977027b..58279c08 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/logical_prepare.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_prepare.hpp @@ -22,8 +22,9 @@ class LogicalPrepare : public LogicalOperator { static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_PREPARE; public: - LogicalPrepare(string name, shared_ptr prepared, unique_ptr logical_plan) - : LogicalOperator(LogicalOperatorType::LOGICAL_PREPARE), name(name), prepared(std::move(prepared)) { + LogicalPrepare(string name_p, shared_ptr prepared, unique_ptr logical_plan) + : LogicalOperator(LogicalOperatorType::LOGICAL_PREPARE), name(std::move(name_p)), + prepared(std::move(prepared)) { if (logical_plan) { children.push_back(std::move(logical_plan)); } diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp index 20a13d72..c118b41f 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp @@ -21,10 +21,10 @@ class LogicalRecursiveCTE : public LogicalOperator { static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_RECURSIVE_CTE; public: - LogicalRecursiveCTE(string ctename, idx_t table_index, idx_t column_count, bool union_all, + LogicalRecursiveCTE(string ctename_p, idx_t table_index, idx_t column_count, bool union_all, unique_ptr top, unique_ptr bottom) - : LogicalOperator(LogicalOperatorType::LOGICAL_RECURSIVE_CTE), union_all(union_all), ctename(ctename), - table_index(table_index), column_count(column_count) { + : LogicalOperator(LogicalOperatorType::LOGICAL_RECURSIVE_CTE), union_all(union_all), + ctename(std::move(ctename_p)), table_index(table_index), column_count(column_count) { children.push_back(std::move(top)); children.push_back(std::move(bottom)); } diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_reset.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_reset.hpp index 693795e6..6131b6f8 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/logical_reset.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_reset.hpp @@ -21,7 +21,7 @@ class LogicalReset : public LogicalOperator { public: LogicalReset(std::string name_p, SetScope scope_p) - : LogicalOperator(LogicalOperatorType::LOGICAL_RESET), name(name_p), scope(scope_p) { + : LogicalOperator(LogicalOperatorType::LOGICAL_RESET), name(std::move(name_p)), scope(scope_p) { } std::string name; diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_set.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_set.hpp index 185f16a4..ff3aa509 100644 --- a/src/duckdb/src/include/duckdb/planner/operator/logical_set.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_set.hpp @@ -21,7 +21,8 @@ class LogicalSet : public LogicalOperator { public: LogicalSet(std::string name_p, Value value_p, SetScope scope_p) - : LogicalOperator(LogicalOperatorType::LOGICAL_SET), name(name_p), value(value_p), scope(scope_p) { + : LogicalOperator(LogicalOperatorType::LOGICAL_SET), name(std::move(name_p)), value(std::move(value_p)), + scope(scope_p) { } std::string name; diff --git a/src/duckdb/src/include/duckdb/planner/operator/logical_vacuum.hpp b/src/duckdb/src/include/duckdb/planner/operator/logical_vacuum.hpp new file mode 100644 index 00000000..2ecf1088 --- /dev/null +++ b/src/duckdb/src/include/duckdb/planner/operator/logical_vacuum.hpp @@ -0,0 +1,52 @@ +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/planner/operator/logical_vacuum.hpp +// +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include "duckdb/common/enums/statement_type.hpp" +#include "duckdb/parser/parsed_data/parse_info.hpp" +#include "duckdb/planner/logical_operator.hpp" +#include "duckdb/parser/parsed_data/vacuum_info.hpp" + +namespace duckdb { + +//! LogicalVacuum represents a simple logical operator that only passes on the parse info +class LogicalVacuum : public LogicalOperator { +public: + static constexpr const LogicalOperatorType TYPE = LogicalOperatorType::LOGICAL_VACUUM; + +public: + LogicalVacuum(); + explicit LogicalVacuum(unique_ptr info); + +public: + VacuumInfo &GetInfo() { + return *info; + } + + TableCatalogEntry &GetTable(); + bool HasTable() const; + void SetTable(TableCatalogEntry &table_p); + +public: + optional_ptr table; + unordered_map column_id_map; + unique_ptr info; + +public: + void Serialize(Serializer &serializer) const override; + static unique_ptr Deserialize(Deserializer &deserializer); + idx_t EstimateCardinality(ClientContext &context) override; + +protected: + void ResolveTypes() override { + types.emplace_back(LogicalType::BOOLEAN); + } +}; + +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/planner/operator_extension.hpp b/src/duckdb/src/include/duckdb/planner/operator_extension.hpp index 0dc22fae..b14b640d 100644 --- a/src/duckdb/src/include/duckdb/planner/operator_extension.hpp +++ b/src/duckdb/src/include/duckdb/planner/operator_extension.hpp @@ -28,7 +28,7 @@ struct LogicalExtensionOperator; class OperatorExtension { public: - bind_function_t Bind; + bind_function_t Bind; // NOLINT: backwards compatibility //! Additional info passed to the CreatePlan & Bind functions shared_ptr operator_info; diff --git a/src/duckdb/src/include/duckdb/planner/parsed_data/bound_create_table_info.hpp b/src/duckdb/src/include/duckdb/planner/parsed_data/bound_create_table_info.hpp index 0fed15b0..fe71dfbd 100644 --- a/src/duckdb/src/include/duckdb/planner/parsed_data/bound_create_table_info.hpp +++ b/src/duckdb/src/include/duckdb/planner/parsed_data/bound_create_table_info.hpp @@ -41,7 +41,7 @@ struct BoundCreateTableInfo { //! Bound default values vector> bound_defaults; //! Dependents of the table (in e.g. default values) - DependencyList dependencies; + LogicalDependencyList dependencies; //! The existing table data on disk (if any) unique_ptr data; //! CREATE TABLE from QUERY @@ -51,7 +51,7 @@ struct BoundCreateTableInfo { CreateTableInfo &Base() { D_ASSERT(base); - return (CreateTableInfo &)*base; + return base->Cast(); } }; diff --git a/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp b/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp index af16afc5..b3a22966 100644 --- a/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +++ b/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp @@ -14,6 +14,7 @@ #include "duckdb/planner/bound_tableref.hpp" #include "duckdb/parser/parsed_data/sample_options.hpp" #include "duckdb/parser/group_by_node.hpp" +#include "duckdb/planner/expression_binder/select_bind_state.hpp" namespace duckdb { @@ -41,10 +42,8 @@ class BoundSelectNode : public BoundQueryNode { BoundSelectNode() : BoundQueryNode(QueryNodeType::SELECT_NODE) { } - //! The original unparsed expressions. This is exported after binding, because the binding might change the - //! expressions (e.g. when a * clause is present) - vector> original_expressions; - + //! Bind information + SelectBindState bind_state; //! The projection list vector> select_list; //! The FROM clause @@ -62,6 +61,8 @@ class BoundSelectNode : public BoundQueryNode { //! The amount of columns in the final result idx_t column_count; + //! The amount of bound columns in the select list + idx_t bound_column_count = 0; //! Index used by the LogicalProjection idx_t projection_index; diff --git a/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp b/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp index efc41cf6..991e084c 100644 --- a/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp +++ b/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp @@ -23,7 +23,7 @@ struct FlattenDependentJoins { //! Detects which Logical Operators have correlated expressions that they are dependent upon, filling the //! has_correlated_expressions map. - bool DetectCorrelatedExpressions(LogicalOperator *op, bool lateral = false, idx_t lateral_depth = 0); + bool DetectCorrelatedExpressions(LogicalOperator &op, bool lateral = false, idx_t lateral_depth = 0); //! Mark entire subtree of Logical Operators as correlated by adding them to the has_correlated_expressions map. bool MarkSubtreeCorrelated(LogicalOperator &op); @@ -35,7 +35,7 @@ struct FlattenDependentJoins { ColumnBinding base_binding; idx_t delim_offset; idx_t data_offset; - unordered_map has_correlated_expressions; + reference_map_t has_correlated_expressions; column_binding_map_t correlated_map; column_binding_map_t replacement_map; const vector &correlated_columns; diff --git a/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp b/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp index 444bfd2d..937c32d5 100644 --- a/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp +++ b/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp @@ -28,7 +28,7 @@ class ArenaAllocator { static constexpr const idx_t ARENA_ALLOCATOR_INITIAL_CAPACITY = 2048; public: - DUCKDB_API ArenaAllocator(Allocator &allocator, idx_t initial_capacity = ARENA_ALLOCATOR_INITIAL_CAPACITY); + DUCKDB_API explicit ArenaAllocator(Allocator &allocator, idx_t initial_capacity = ARENA_ALLOCATOR_INITIAL_CAPACITY); DUCKDB_API ~ArenaAllocator(); DUCKDB_API data_ptr_t Allocate(idx_t size); @@ -37,6 +37,9 @@ class ArenaAllocator { DUCKDB_API data_ptr_t AllocateAligned(idx_t size); DUCKDB_API data_ptr_t ReallocateAligned(data_ptr_t pointer, idx_t old_size, idx_t size); + //! Increment the internal cursor (if required) so the next allocation is guaranteed to be aligned to 8 bytes + DUCKDB_API void AlignNext(); + //! Resets the current head and destroys all previous arena chunks DUCKDB_API void Reset(); DUCKDB_API void Destroy(); diff --git a/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp b/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp index 196fb27c..92a646c8 100644 --- a/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +++ b/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp @@ -38,7 +38,7 @@ struct BufferPoolReservation { ~BufferPoolReservation(); void Resize(idx_t new_size); - void Merge(BufferPoolReservation &&src); + void Merge(BufferPoolReservation src); }; struct TempBufferPoolReservation : BufferPoolReservation { diff --git a/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp b/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp index 7238be78..b6cdb161 100644 --- a/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +++ b/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp @@ -34,7 +34,6 @@ class BufferManager { } public: - static unique_ptr CreateStandardBufferManager(DatabaseInstance &db, DBConfig &config); virtual BufferHandle Allocate(MemoryTag tag, idx_t block_size, bool can_destroy = true, shared_ptr *block = nullptr) = 0; //! Reallocate an in-memory buffer that is pinned. @@ -54,9 +53,8 @@ class BufferManager { //! blocks can be evicted virtual void SetLimit(idx_t limit = (idx_t)-1); virtual vector GetTemporaryFiles(); - virtual const string &GetTemporaryDirectory(); + virtual const string &GetTemporaryDirectory() const; virtual void SetTemporaryDirectory(const string &new_dir); - virtual DatabaseInstance &GetDatabase(); virtual bool HasTemporaryDirectory() const; //! Construct a managed buffer. virtual unique_ptr ConstructManagedBuffer(idx_t size, unique_ptr &&source, @@ -68,7 +66,9 @@ class BufferManager { // Static methods DUCKDB_API static BufferManager &GetBufferManager(DatabaseInstance &db); + DUCKDB_API static const BufferManager &GetBufferManager(const DatabaseInstance &db); DUCKDB_API static BufferManager &GetBufferManager(ClientContext &context); + DUCKDB_API static const BufferManager &GetBufferManager(const ClientContext &context); DUCKDB_API static BufferManager &GetBufferManager(AttachedDatabase &db); static idx_t GetAllocSize(idx_t block_size) { diff --git a/src/duckdb/src/include/duckdb/storage/checkpoint/row_group_writer.hpp b/src/duckdb/src/include/duckdb/storage/checkpoint/row_group_writer.hpp index 00ea3a64..2c5f78e9 100644 --- a/src/duckdb/src/include/duckdb/storage/checkpoint/row_group_writer.hpp +++ b/src/duckdb/src/include/duckdb/storage/checkpoint/row_group_writer.hpp @@ -56,10 +56,9 @@ class SingleFileRowGroupWriter : public RowGroupWriter { MetadataWriter &table_data_writer; public: - virtual void WriteColumnDataPointers(ColumnCheckpointState &column_checkpoint_state, - Serializer &serializer) override; + void WriteColumnDataPointers(ColumnCheckpointState &column_checkpoint_state, Serializer &serializer) override; - virtual MetadataWriter &GetPayloadWriter() override; + MetadataWriter &GetPayloadWriter() override; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/storage/checkpoint/string_checkpoint_state.hpp b/src/duckdb/src/include/duckdb/storage/checkpoint/string_checkpoint_state.hpp index fd3568ac..190e4d5c 100644 --- a/src/duckdb/src/include/duckdb/storage/checkpoint/string_checkpoint_state.hpp +++ b/src/duckdb/src/include/duckdb/storage/checkpoint/string_checkpoint_state.hpp @@ -33,7 +33,7 @@ struct StringBlock { unique_ptr next; }; -struct string_location_t { +struct string_location_t { // NOLINT string_location_t(block_id_t block_id, int32_t offset) : block_id(block_id), offset(offset) { } string_location_t() { diff --git a/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp b/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp index 4c3f42d5..4ab7a905 100644 --- a/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +++ b/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp @@ -31,10 +31,10 @@ class TableDataWriter { CompressionType GetColumnCompressionType(idx_t i); - virtual void FinalizeTable(TableStatistics &&global_stats, DataTableInfo *info, Serializer &serializer) = 0; + virtual void FinalizeTable(const TableStatistics &global_stats, DataTableInfo *info, Serializer &serializer) = 0; virtual unique_ptr GetRowGroupWriter(RowGroup &row_group) = 0; - virtual void AddRowGroup(RowGroupPointer &&row_group_pointer, unique_ptr &&writer); + virtual void AddRowGroup(RowGroupPointer &&row_group_pointer, unique_ptr writer); TaskScheduler &GetScheduler(); @@ -50,7 +50,7 @@ class SingleFileTableDataWriter : public TableDataWriter { MetadataWriter &table_data_writer); public: - void FinalizeTable(TableStatistics &&global_stats, DataTableInfo *info, Serializer &serializer) override; + void FinalizeTable(const TableStatistics &global_stats, DataTableInfo *info, Serializer &serializer) override; unique_ptr GetRowGroupWriter(RowGroup &row_group) override; private: diff --git a/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp b/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp index d434e50d..9899565c 100644 --- a/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +++ b/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp @@ -51,7 +51,7 @@ class CheckpointWriter { class CheckpointReader { public: - CheckpointReader(Catalog &catalog) : catalog(catalog) { + explicit CheckpointReader(Catalog &catalog) : catalog(catalog) { } virtual ~CheckpointReader() { } @@ -80,7 +80,7 @@ class SingleFileCheckpointReader final : public CheckpointReader { : CheckpointReader(Catalog::GetCatalog(storage.GetAttached())), storage(storage) { } - void LoadFromStorage(); + void LoadFromStorage(optional_ptr context = nullptr); MetadataManager &GetMetadataManager(); //! The database @@ -102,9 +102,9 @@ class SingleFileCheckpointWriter final : public CheckpointWriter { //! connection is available because right now the checkpointing cannot be done online. (TODO) void CreateCheckpoint(); - virtual MetadataWriter &GetMetadataWriter() override; - virtual MetadataManager &GetMetadataManager() override; - virtual unique_ptr GetTableDataWriter(TableCatalogEntry &table) override; + MetadataWriter &GetMetadataWriter() override; + MetadataManager &GetMetadataManager() override; + unique_ptr GetTableDataWriter(TableCatalogEntry &table) override; BlockManager &GetBlockManager(); diff --git a/src/duckdb/src/include/duckdb/storage/compression/alp/alp_analyze.hpp b/src/duckdb/src/include/duckdb/storage/compression/alp/alp_analyze.hpp index f05479bc..f77b5ffa 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/alp/alp_analyze.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/alp/alp_analyze.hpp @@ -21,7 +21,7 @@ namespace duckdb { template struct AlpAnalyzeState : public AnalyzeState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; AlpAnalyzeState() : state() { } diff --git a/src/duckdb/src/include/duckdb/storage/compression/alp/alp_compress.hpp b/src/duckdb/src/include/duckdb/storage/compression/alp/alp_compress.hpp index 3b2b91ea..fc7d8869 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/alp/alp_compress.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/alp/alp_compress.hpp @@ -32,7 +32,7 @@ template struct AlpCompressionState : public CompressionState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; explicit AlpCompressionState(ColumnDataCheckpointer &checkpointer, AlpAnalyzeState *analyze_state) : checkpointer(checkpointer), function(checkpointer.GetCompressionFunction(CompressionType::COMPRESSION_ALP)) { CreateEmptySegment(checkpointer.GetRowGroup().start); diff --git a/src/duckdb/src/include/duckdb/storage/compression/alp/alp_fetch.hpp b/src/duckdb/src/include/duckdb/storage/compression/alp/alp_fetch.hpp index 208c85a3..81d3d2ac 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/alp/alp_fetch.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/alp/alp_fetch.hpp @@ -25,7 +25,7 @@ namespace duckdb { template void AlpFetchRow(ColumnSegment &segment, ColumnFetchState &state, row_t row_id, Vector &result, idx_t result_idx) { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; AlpScanState scan_state(segment); scan_state.Skip(segment, row_id); diff --git a/src/duckdb/src/include/duckdb/storage/compression/alp/alp_scan.hpp b/src/duckdb/src/include/duckdb/storage/compression/alp/alp_scan.hpp index 93f508f4..a2180075 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/alp/alp_scan.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/alp/alp_scan.hpp @@ -66,7 +66,7 @@ struct AlpVectorState { template struct AlpScanState : public SegmentScanState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; explicit AlpScanState(ColumnSegment &segment) : segment(segment), count(segment.count) { auto &buffer_manager = BufferManager::GetBufferManager(segment.db); diff --git a/src/duckdb/src/include/duckdb/storage/compression/alprd/algorithm/alprd.hpp b/src/duckdb/src/include/duckdb/storage/compression/alprd/algorithm/alprd.hpp index 625e69cf..66d8262a 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/alprd/algorithm/alprd.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/alprd/algorithm/alprd.hpp @@ -34,7 +34,7 @@ struct AlpRDLeftPartInfo { template class AlpRDCompressionState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; AlpRDCompressionState() : right_bit_width(0), left_bit_width(0), exceptions_count(0) { } @@ -63,7 +63,7 @@ class AlpRDCompressionState { template struct AlpRDCompression { using State = AlpRDCompressionState; - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; static constexpr uint8_t EXACT_TYPE_BITSIZE = sizeof(EXACT_TYPE) * 8; /* @@ -199,7 +199,7 @@ struct AlpRDCompression { template struct AlpRDDecompression { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; static void Decompress(uint8_t *left_encoded, uint8_t *right_encoded, const uint16_t *left_parts_dict, EXACT_TYPE *output, idx_t values_count, uint16_t exceptions_count, diff --git a/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_analyze.hpp b/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_analyze.hpp index 7fa8e0bb..e88fdae6 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_analyze.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_analyze.hpp @@ -23,7 +23,7 @@ namespace duckdb { template struct AlpRDAnalyzeState : public AnalyzeState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; AlpRDAnalyzeState() : state() { } @@ -45,7 +45,7 @@ unique_ptr AlpRDInitAnalyze(ColumnData &col_data, PhysicalType typ */ template bool AlpRDAnalyze(AnalyzeState &state, Vector &input, idx_t count) { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; auto &analyze_state = (AlpRDAnalyzeState &)state; bool must_skip_current_vector = alp::AlpUtils::MustSkipSamplingFromCurrentVector( diff --git a/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_compress.hpp b/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_compress.hpp index ddcce6e3..5ff07dd7 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_compress.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_compress.hpp @@ -34,7 +34,7 @@ template struct AlpRDCompressionState : public CompressionState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; explicit AlpRDCompressionState(ColumnDataCheckpointer &checkpointer, AlpRDAnalyzeState *analyze_state) : checkpointer(checkpointer), function(checkpointer.GetCompressionFunction(CompressionType::COMPRESSION_ALPRD)) { diff --git a/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_fetch.hpp b/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_fetch.hpp index c4b36c2f..0128b8db 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_fetch.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_fetch.hpp @@ -25,7 +25,7 @@ namespace duckdb { template void AlpRDFetchRow(ColumnSegment &segment, ColumnFetchState &state, row_t row_id, Vector &result, idx_t result_idx) { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; AlpRDScanState scan_state(segment); scan_state.Skip(segment, row_id); auto result_data = FlatVector::GetData(result); diff --git a/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_scan.hpp b/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_scan.hpp index efaddbd2..7d169895 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_scan.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_scan.hpp @@ -28,7 +28,7 @@ namespace duckdb { template struct AlpRDVectorState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; void Reset() { index = 0; @@ -70,7 +70,7 @@ struct AlpRDVectorState { template struct AlpRDScanState : public SegmentScanState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; explicit AlpRDScanState(ColumnSegment &segment) : segment(segment), count(segment.count) { auto &buffer_manager = BufferManager::GetBufferManager(segment.db); @@ -220,7 +220,7 @@ unique_ptr AlpRDInitScan(ColumnSegment &segment) { template void AlpRDScanPartial(ColumnSegment &segment, ColumnScanState &state, idx_t scan_count, Vector &result, idx_t result_offset) { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; auto &scan_state = (AlpRDScanState &)*state.scan_state; // Get the pointer to the result values diff --git a/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/flag_buffer.hpp b/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/flag_buffer.hpp index 5336b334..f5c0d70b 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/flag_buffer.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/flag_buffer.hpp @@ -58,7 +58,7 @@ class FlagBuffer { #endif uint64_t BitsWritten() const { - return counter * 2; + return counter * 2ULL; } void Insert(ChimpConstants::Flags value) { diff --git a/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/leading_zero_buffer.hpp b/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/leading_zero_buffer.hpp index 88f17414..c4b23cfd 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/leading_zero_buffer.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/chimp/algorithm/leading_zero_buffer.hpp @@ -77,7 +77,7 @@ class LeadingZeroBuffer { } uint64_t BitsWritten() const { - return counter * 3; + return counter * 3ULL; } // Reset the counter, but don't replace the buffer @@ -98,7 +98,7 @@ class LeadingZeroBuffer { #endif inline uint64_t BlockIndex() const { - return ((counter >> 3) * (LEADING_ZERO_BLOCK_BIT_SIZE / 8)); + return ((counter >> 3ULL) * (LEADING_ZERO_BLOCK_BIT_SIZE / 8ULL)); } void FlushBuffer() { @@ -111,7 +111,7 @@ class LeadingZeroBuffer { // Verify that the bits are copied correctly uint32_t temp_value = 0; - memcpy((uint8_t *)&temp_value, (void *)(buffer + buffer_idx), 3); + memcpy(reinterpret_cast(&temp_value), (void *)(buffer + buffer_idx), 3); for (idx_t i = 0; i < flags.size(); i++) { D_ASSERT(flags[i] == ExtractValue(temp_value, i)); } diff --git a/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp.hpp b/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp.hpp index 1d5e14bb..27de5c20 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp.hpp @@ -25,12 +25,12 @@ struct ChimpType {}; template <> struct ChimpType { - typedef uint64_t type; + using TYPE = uint64_t; }; template <> struct ChimpType { - typedef uint32_t type; + using TYPE = uint32_t; }; class ChimpPrimitives { @@ -46,7 +46,7 @@ class ChimpPrimitives { template struct ChimpState { public: - using CHIMP_TYPE = typename ChimpType::type; + using CHIMP_TYPE = typename ChimpType::TYPE; ChimpState() : chimp() { } diff --git a/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_analyze.hpp b/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_analyze.hpp index 2b56d15b..4976e2ca 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_analyze.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_analyze.hpp @@ -33,7 +33,6 @@ bool ChimpAnalyze(AnalyzeState &state, Vector &input, idx_t count) { template idx_t ChimpFinalAnalyze(AnalyzeState &state) { throw InternalException("Chimp has been deprecated, can no longer be used to compress data"); - return DConstants::INVALID_INDEX; } } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp b/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp index 52b19c9e..c8e4edb9 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp @@ -26,7 +26,7 @@ namespace duckdb { template void ChimpFetchRow(ColumnSegment &segment, ColumnFetchState &state, row_t row_id, Vector &result, idx_t result_idx) { - using INTERNAL_TYPE = typename ChimpType::type; + using INTERNAL_TYPE = typename ChimpType::TYPE; ChimpScanState scan_state(segment); scan_state.Skip(segment, row_id); diff --git a/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp b/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp index 8cc61817..02a7e442 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp @@ -135,7 +135,7 @@ struct ChimpGroupState { template struct ChimpScanState : public SegmentScanState { public: - using CHIMP_TYPE = typename ChimpType::type; + using CHIMP_TYPE = typename ChimpType::TYPE; explicit ChimpScanState(ColumnSegment &segment) : segment(segment), segment_count(segment.count) { auto &buffer_manager = BufferManager::GetBufferManager(segment.db); @@ -203,7 +203,7 @@ struct ChimpScanState : public SegmentScanState { D_ASSERT(leading_zero_block_count <= ChimpPrimitives::CHIMP_SEQUENCE_SIZE / 8); // Load the leading zero block count - metadata_ptr -= 3 * leading_zero_block_count; + metadata_ptr -= 3ULL * leading_zero_block_count; const auto leading_zero_block_ptr = metadata_ptr; // Figure out how many flags there are @@ -240,7 +240,7 @@ struct ChimpScanState : public SegmentScanState { //! Skip the next 'skip_count' values, we don't store the values // TODO: use the metadata to determine if we can skip a group void Skip(ColumnSegment &segment, idx_t skip_count) { - using INTERNAL_TYPE = typename ChimpType::type; + using INTERNAL_TYPE = typename ChimpType::TYPE; INTERNAL_TYPE buffer[ChimpPrimitives::CHIMP_SEQUENCE_SIZE]; while (skip_count) { @@ -263,7 +263,7 @@ unique_ptr ChimpInitScan(ColumnSegment &segment) { template void ChimpScanPartial(ColumnSegment &segment, ColumnScanState &state, idx_t scan_count, Vector &result, idx_t result_offset) { - using INTERNAL_TYPE = typename ChimpType::type; + using INTERNAL_TYPE = typename ChimpType::TYPE; auto &scan_state = state.scan_state->Cast>(); T *result_data = FlatVector::GetData(result); diff --git a/src/duckdb/src/include/duckdb/storage/compression/patas/patas.hpp b/src/duckdb/src/include/duckdb/storage/compression/patas/patas.hpp index a668b4e3..ff08b1fe 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/patas/patas.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/patas/patas.hpp @@ -25,20 +25,20 @@ struct FloatingToExact {}; template <> struct FloatingToExact { - typedef uint64_t type; + using TYPE = uint64_t; }; template <> struct FloatingToExact { - typedef uint32_t type; + using TYPE = uint32_t; }; template struct PatasState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; - PatasState(void *state_p = nullptr) : data_ptr(state_p), patas_state() { + explicit PatasState(void *state_p = nullptr) : data_ptr(state_p), patas_state() { } //! The Compress/Analyze State void *data_ptr; diff --git a/src/duckdb/src/include/duckdb/storage/compression/patas/patas_analyze.hpp b/src/duckdb/src/include/duckdb/storage/compression/patas/patas_analyze.hpp index 0f9dab42..c86d2538 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/patas/patas_analyze.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/patas/patas_analyze.hpp @@ -33,7 +33,6 @@ bool PatasAnalyze(AnalyzeState &state, Vector &input, idx_t count) { template idx_t PatasFinalAnalyze(AnalyzeState &state) { throw InternalException("Patas has been deprecated, can no longer be used to compress data"); - return DConstants::INVALID_INDEX; } } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp b/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp index 9a6640c2..fd416cfc 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp @@ -26,7 +26,7 @@ namespace duckdb { template void PatasFetchRow(ColumnSegment &segment, ColumnFetchState &state, row_t row_id, Vector &result, idx_t result_idx) { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; PatasScanState scan_state(segment); scan_state.Skip(segment, row_id); diff --git a/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp b/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp index edce133a..91dfb304 100644 --- a/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp +++ b/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp @@ -87,7 +87,7 @@ struct PatasGroupState { template struct PatasScanState : public SegmentScanState { public: - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; explicit PatasScanState(ColumnSegment &segment) : segment(segment), count(segment.count) { auto &buffer_manager = BufferManager::GetBufferManager(segment.db); @@ -174,7 +174,7 @@ struct PatasScanState : public SegmentScanState { public: //! Skip the next 'skip_count' values, we don't store the values void Skip(ColumnSegment &segment, idx_t skip_count) { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; if (total_value_count != 0 && !GroupFinished()) { // Finish skipping the current group @@ -210,7 +210,7 @@ unique_ptr PatasInitScan(ColumnSegment &segment) { template void PatasScanPartial(ColumnSegment &segment, ColumnScanState &state, idx_t scan_count, Vector &result, idx_t result_offset) { - using EXACT_TYPE = typename FloatingToExact::type; + using EXACT_TYPE = typename FloatingToExact::TYPE; auto &scan_state = (PatasScanState &)*state.scan_state; // Get the pointer to the result values diff --git a/src/duckdb/src/include/duckdb/storage/data_pointer.hpp b/src/duckdb/src/include/duckdb/storage/data_pointer.hpp index c0c51df6..97752ee5 100644 --- a/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +++ b/src/duckdb/src/include/duckdb/storage/data_pointer.hpp @@ -34,7 +34,7 @@ struct ColumnSegmentState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; diff --git a/src/duckdb/src/include/duckdb/storage/index.hpp b/src/duckdb/src/include/duckdb/storage/index.hpp index 179735e8..f5e89486 100644 --- a/src/duckdb/src/include/duckdb/storage/index.hpp +++ b/src/duckdb/src/include/duckdb/storage/index.hpp @@ -160,7 +160,7 @@ class Index { template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; diff --git a/src/duckdb/src/include/duckdb/storage/magic_bytes.hpp b/src/duckdb/src/include/duckdb/storage/magic_bytes.hpp index 2fda8588..b6f7f68d 100644 --- a/src/duckdb/src/include/duckdb/storage/magic_bytes.hpp +++ b/src/duckdb/src/include/duckdb/storage/magic_bytes.hpp @@ -22,7 +22,7 @@ enum class DataFileType : uint8_t { class MagicBytes { public: - static DataFileType CheckMagicBytes(FileSystem *fs, const string &path); + static DataFileType CheckMagicBytes(FileSystem &fs, const string &path); }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/storage/object_cache.hpp b/src/duckdb/src/include/duckdb/storage/object_cache.hpp index 5136762d..25b6ab69 100644 --- a/src/duckdb/src/include/duckdb/storage/object_cache.hpp +++ b/src/duckdb/src/include/duckdb/storage/object_cache.hpp @@ -46,8 +46,8 @@ class ObjectCache { return std::static_pointer_cast(object); } - template - shared_ptr GetOrCreate(const string &key, Args &&...args) { + template + shared_ptr GetOrCreate(const string &key, ARGS &&... args) { lock_guard glock(lock); auto entry = cache.find(key); @@ -65,7 +65,7 @@ class ObjectCache { void Put(string key, shared_ptr value) { lock_guard glock(lock); - cache[key] = std::move(value); + cache.insert(make_pair(std::move(key), std::move(value))); } void Delete(const string &key) { diff --git a/src/duckdb/src/include/duckdb/storage/optimistic_data_writer.hpp b/src/duckdb/src/include/duckdb/storage/optimistic_data_writer.hpp index 59e09452..4feb456d 100644 --- a/src/duckdb/src/include/duckdb/storage/optimistic_data_writer.hpp +++ b/src/duckdb/src/include/duckdb/storage/optimistic_data_writer.hpp @@ -15,7 +15,7 @@ class PartialBlockManager; class OptimisticDataWriter { public: - OptimisticDataWriter(DataTable &table); + explicit OptimisticDataWriter(DataTable &table); OptimisticDataWriter(DataTable &table, OptimisticDataWriter &parent); ~OptimisticDataWriter(); diff --git a/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp b/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp index 818f2ff6..935f0126 100644 --- a/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp +++ b/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp @@ -110,7 +110,7 @@ class PartialBlockManager { PartialBlockAllocation GetBlockAllocation(uint32_t segment_size); //! Register a partially filled block that is filled with "segment_size" entries - void RegisterPartialBlock(PartialBlockAllocation &&allocation); + void RegisterPartialBlock(PartialBlockAllocation allocation); //! Clear remaining blocks without writing them to disk void ClearBlocks(); diff --git a/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp b/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp index 809b5f7d..2c23e154 100644 --- a/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp +++ b/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp @@ -36,7 +36,7 @@ class SingleFileBlockManager : public BlockManager { public: SingleFileBlockManager(AttachedDatabase &db, string path, StorageManagerOptions options); - void GetFileFlags(uint8_t &flags, FileLockType &lock, bool create_new); + FileOpenFlags GetFileFlags(bool create_new) const; void CreateNewDatabase(); void LoadExistingDatabase(); @@ -80,6 +80,7 @@ class SingleFileBlockManager : public BlockManager { //! Return the blocks to which we will write the free list and modified blocks vector GetFreeListBlocks(); + void TrimFreeBlocks(); private: AttachedDatabase &db; @@ -93,6 +94,8 @@ class SingleFileBlockManager : public BlockManager { FileBuffer header_buffer; //! The list of free blocks that can be written to currently set free_list; + //! The list of blocks that were freed since the last checkpoint. + set newly_freed_list; //! The list of multi-use blocks (i.e. blocks that have >1 reference in the file) //! When a multi-use block is marked as modified, the reference count is decreased by 1 instead of directly //! Appending the block to the modified_blocks list diff --git a/src/duckdb/src/include/duckdb/storage/standard_buffer_manager.hpp b/src/duckdb/src/include/duckdb/storage/standard_buffer_manager.hpp index de36f947..7f6e3447 100644 --- a/src/duckdb/src/include/duckdb/storage/standard_buffer_manager.hpp +++ b/src/duckdb/src/include/duckdb/storage/standard_buffer_manager.hpp @@ -36,7 +36,7 @@ class StandardBufferManager : public BufferManager { public: StandardBufferManager(DatabaseInstance &db, string temp_directory); - virtual ~StandardBufferManager(); + ~StandardBufferManager() override; public: static unique_ptr CreateBufferManager(DatabaseInstance &db, string temp_directory); @@ -46,41 +46,41 @@ class StandardBufferManager : public BufferManager { //! Registers an in-memory buffer that cannot be unloaded until it is destroyed //! This buffer can be small (smaller than BLOCK_SIZE) //! Unpin and pin are nops on this block of memory - shared_ptr RegisterSmallMemory(idx_t block_size) final override; + shared_ptr RegisterSmallMemory(idx_t block_size) final; - idx_t GetUsedMemory() const final override; - idx_t GetMaxMemory() const final override; + idx_t GetUsedMemory() const final; + idx_t GetMaxMemory() const final; //! Allocate an in-memory buffer with a single pin. //! The allocated memory is released when the buffer handle is destroyed. DUCKDB_API BufferHandle Allocate(MemoryTag tag, idx_t block_size, bool can_destroy = true, - shared_ptr *block = nullptr) final override; + shared_ptr *block = nullptr) final; //! Reallocate an in-memory buffer that is pinned. - void ReAllocate(shared_ptr &handle, idx_t block_size) final override; + void ReAllocate(shared_ptr &handle, idx_t block_size) final; - BufferHandle Pin(shared_ptr &handle) final override; - void Unpin(shared_ptr &handle) final override; + BufferHandle Pin(shared_ptr &handle) final; + void Unpin(shared_ptr &handle) final; //! Set a new memory limit to the buffer manager, throws an exception if the new limit is too low and not enough //! blocks can be evicted - void SetLimit(idx_t limit = (idx_t)-1) final override; + void SetLimit(idx_t limit = (idx_t)-1) final; //! Returns informaton about memory usage vector GetMemoryUsageInfo() const override; //! Returns a list of all temporary files - vector GetTemporaryFiles() final override; + vector GetTemporaryFiles() final; - const string &GetTemporaryDirectory() final override { + const string &GetTemporaryDirectory() const final { return temp_directory; } - void SetTemporaryDirectory(const string &new_dir) final override; + void SetTemporaryDirectory(const string &new_dir) final; - DUCKDB_API Allocator &GetBufferAllocator() final override; + DUCKDB_API Allocator &GetBufferAllocator() final; - DatabaseInstance &GetDatabase() final override { + DatabaseInstance &GetDatabase() { return db; } @@ -88,9 +88,9 @@ class StandardBufferManager : public BufferManager { unique_ptr ConstructManagedBuffer(idx_t size, unique_ptr &&source, FileBufferType type = FileBufferType::MANAGED_BUFFER) override; - DUCKDB_API void ReserveMemory(idx_t size) final override; - DUCKDB_API void FreeReservedMemory(idx_t size) final override; - bool HasTemporaryDirectory() const final override; + DUCKDB_API void ReserveMemory(idx_t size) final; + DUCKDB_API void FreeReservedMemory(idx_t size) final; + bool HasTemporaryDirectory() const final; protected: //! Helper @@ -106,24 +106,24 @@ class StandardBufferManager : public BufferManager { shared_ptr RegisterMemory(MemoryTag tag, idx_t block_size, bool can_destroy); //! Garbage collect eviction queue - void PurgeQueue() final override; + void PurgeQueue() final; - BufferPool &GetBufferPool() const final override; - TemporaryMemoryManager &GetTemporaryMemoryManager() final override; + BufferPool &GetBufferPool() const final; + TemporaryMemoryManager &GetTemporaryMemoryManager() final; //! Write a temporary buffer to disk - void WriteTemporaryBuffer(MemoryTag tag, block_id_t block_id, FileBuffer &buffer) final override; + void WriteTemporaryBuffer(MemoryTag tag, block_id_t block_id, FileBuffer &buffer) final; //! Read a temporary buffer from disk unique_ptr ReadTemporaryBuffer(MemoryTag tag, block_id_t id, - unique_ptr buffer = nullptr) final override; + unique_ptr buffer = nullptr) final; //! Get the path of the temporary buffer string GetTemporaryPath(block_id_t id); - void DeleteTemporaryFile(block_id_t id) final override; + void DeleteTemporaryFile(block_id_t id) final; void RequireTemporaryDirectory(); - void AddToEvictionQueue(shared_ptr &handle) final override; + void AddToEvictionQueue(shared_ptr &handle) final; const char *InMemoryWarning(); diff --git a/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp b/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp index 2c43987a..8a4fd88d 100644 --- a/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +++ b/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp @@ -27,9 +27,9 @@ struct NumericValueUnion { uint64_t ubigint; hugeint_t hugeint; uhugeint_t uhugeint; - float float_; - double double_; - } value_; + float float_; // NOLINT + double double_; // NOLINT + } value_; // NOLINT template T &GetReferenceUnsafe(); diff --git a/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp b/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp index 4f1e0d63..2690308b 100644 --- a/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp +++ b/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp @@ -16,8 +16,8 @@ namespace duckdb { class SegmentStatistics { public: - SegmentStatistics(LogicalType type); - SegmentStatistics(BaseStatistics statistics); + explicit SegmentStatistics(LogicalType type); + explicit SegmentStatistics(BaseStatistics statistics); //! Type-specific statistics of the segment BaseStatistics statistics; diff --git a/src/duckdb/src/include/duckdb/storage/storage_info.hpp b/src/duckdb/src/include/duckdb/storage/storage_info.hpp index 3fa6ffc0..1acdbba6 100644 --- a/src/duckdb/src/include/duckdb/storage/storage_info.hpp +++ b/src/duckdb/src/include/duckdb/storage/storage_info.hpp @@ -66,10 +66,10 @@ struct MainHeader { static void CheckMagicBytes(FileHandle &handle); string LibraryGitDesc() { - return string((char *)library_git_desc, 0, MAX_VERSION_SIZE); + return string(char_ptr_cast(library_git_desc), 0, MAX_VERSION_SIZE); } string LibraryGitHash() { - return string((char *)library_git_hash, 0, MAX_VERSION_SIZE); + return string(char_ptr_cast(library_git_hash), 0, MAX_VERSION_SIZE); } void Write(WriteStream &ser); diff --git a/src/duckdb/src/include/duckdb/storage/storage_manager.hpp b/src/duckdb/src/include/duckdb/storage/storage_manager.hpp index 0f5ffeb2..e0c07b6b 100644 --- a/src/duckdb/src/include/duckdb/storage/storage_manager.hpp +++ b/src/duckdb/src/include/duckdb/storage/storage_manager.hpp @@ -46,7 +46,7 @@ class StorageManager { static StorageManager &Get(Catalog &catalog); //! Initialize a database or load an existing database from the given path - void Initialize(); + void Initialize(optional_ptr context); DatabaseInstance &GetDatabase(); AttachedDatabase &GetAttached() { @@ -73,7 +73,7 @@ class StorageManager { virtual shared_ptr GetTableIOManager(BoundCreateTableInfo *info) = 0; protected: - virtual void LoadDatabase() = 0; + virtual void LoadDatabase(optional_ptr context = nullptr) = 0; protected: //! The database this storage manager belongs to @@ -96,7 +96,7 @@ class StorageManager { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -121,6 +121,6 @@ class SingleFileStorageManager : public StorageManager { shared_ptr GetTableIOManager(BoundCreateTableInfo *info) override; protected: - void LoadDatabase() override; + void LoadDatabase(optional_ptr context = nullptr) override; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp b/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp index f5eab9b4..c4545e5f 100644 --- a/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +++ b/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp @@ -61,6 +61,7 @@ struct UncompressedStringStorage { static unique_ptr StringInitAppend(ColumnSegment &segment) { auto &buffer_manager = BufferManager::GetBufferManager(segment.db); + // This block was initialized in StringInitSegment auto handle = buffer_manager.Pin(segment.block); return make_uniq(std::move(handle)); } @@ -82,9 +83,9 @@ struct UncompressedStringStorage { D_ASSERT(segment.GetBlockOffset() == 0); auto handle_ptr = handle.Ptr(); auto source_data = UnifiedVectorFormat::GetData(data); - auto result_data = (int32_t *)(handle_ptr + DICTIONARY_HEADER_SIZE); - uint32_t *dictionary_size = (uint32_t *)handle_ptr; - uint32_t *dictionary_end = (uint32_t *)(handle_ptr + sizeof(uint32_t)); + auto result_data = reinterpret_cast(handle_ptr + DICTIONARY_HEADER_SIZE); + auto dictionary_size = reinterpret_cast(handle_ptr); + auto dictionary_end = reinterpret_cast(handle_ptr + sizeof(uint32_t)); idx_t remaining_space = RemainingSpace(segment, handle); auto base_count = segment.count.load(); @@ -136,18 +137,19 @@ struct UncompressedStringStorage { if (DUCKDB_UNLIKELY(use_overflow_block)) { // write to overflow blocks block_id_t block; - int32_t offset; + int32_t current_offset; // write the string into the current string block - WriteString(segment, source_data[source_idx], block, offset); + WriteString(segment, source_data[source_idx], block, current_offset); *dictionary_size += BIG_STRING_MARKER_SIZE; remaining_space -= BIG_STRING_MARKER_SIZE; auto dict_pos = end - *dictionary_size; // write a big string marker into the dictionary - WriteStringMarker(dict_pos, block, offset); + WriteStringMarker(dict_pos, block, current_offset); // place the dictionary offset into the set of vectors // note: for overflow strings we write negative value + D_ASSERT(*dictionary_size <= int32_t(Storage::BLOCK_SIZE)); result_data[target_idx] = -(*dictionary_size); } else { // string fits in block, append to dictionary and increment dictionary position @@ -159,6 +161,7 @@ struct UncompressedStringStorage { memcpy(dict_pos, source_data[source_idx].GetData(), string_length); // place the dictionary offset into the set of vectors + D_ASSERT(*dictionary_size <= int32_t(Storage::BLOCK_SIZE)); result_data[target_idx] = *dictionary_size; } D_ASSERT(RemainingSpace(segment, handle) <= Storage::BLOCK_SIZE); diff --git a/src/duckdb/src/include/duckdb/storage/table/append_state.hpp b/src/duckdb/src/include/duckdb/storage/table/append_state.hpp index 5c5ebd0c..42cd29be 100644 --- a/src/duckdb/src/include/duckdb/storage/table/append_state.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/append_state.hpp @@ -36,7 +36,7 @@ struct ColumnAppendState { }; struct RowGroupAppendState { - RowGroupAppendState(TableAppendState &parent_p) : parent(parent_p) { + explicit RowGroupAppendState(TableAppendState &parent_p) : parent(parent_p) { } //! The parent append state diff --git a/src/duckdb/src/include/duckdb/storage/table/chunk_info.hpp b/src/duckdb/src/include/duckdb/storage/table/chunk_info.hpp index 14ed981e..bc089ecc 100644 --- a/src/duckdb/src/include/duckdb/storage/table/chunk_info.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/chunk_info.hpp @@ -17,7 +17,7 @@ class RowGroup; struct SelectionVector; class Transaction; struct TransactionData; - +struct DeleteInfo; class Serializer; class Deserializer; @@ -132,7 +132,7 @@ class ChunkVectorInfo : public ChunkInfo { //! Note that "rows" is written to to reflect the row ids that were actually deleted //! i.e. after calling this function, rows will hold [0..actual_delete_count] row ids of the actually deleted tuples idx_t Delete(transaction_t transaction_id, row_t rows[], idx_t count); - void CommitDelete(transaction_t commit_id, row_t rows[], idx_t count); + void CommitDelete(transaction_t commit_id, const DeleteInfo &info); bool HasDeletes() const override; diff --git a/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp b/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp index 5ac11cf7..1c1a6843 100644 --- a/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp @@ -51,7 +51,7 @@ struct ColumnCheckpointState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; diff --git a/src/duckdb/src/include/duckdb/storage/table/column_data.hpp b/src/duckdb/src/include/duckdb/storage/table/column_data.hpp index 0ec91725..55020f58 100644 --- a/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/column_data.hpp @@ -75,6 +75,8 @@ class ColumnData { virtual void SetStart(idx_t new_start); //! The root type of the column const LogicalType &RootType() const; + //! Whether or not the column has any updates + virtual bool HasUpdates() const; //! Initialize a scan of the column virtual void InitializeScan(ColumnScanState &state); @@ -159,11 +161,18 @@ class ColumnData { template idx_t ScanVector(TransactionData transaction, idx_t vector_index, ColumnScanState &state, Vector &result); + void ClearUpdates(); + void FetchUpdates(TransactionData transaction, idx_t vector_index, Vector &result, idx_t scan_count, + bool allow_updates, bool scan_committed); + void FetchUpdateRow(TransactionData transaction, row_t row_id, Vector &result, idx_t result_idx); + void UpdateInternal(TransactionData transaction, idx_t column_index, Vector &update_vector, row_t *row_ids, + idx_t update_count, Vector &base_vector); + protected: //! The segments holding the data of this column segment ColumnSegmentTree data; //! The lock for the updates - mutex update_lock; + mutable mutex update_lock; //! The updates for this column segment unique_ptr updates; //! The stats of the root segment diff --git a/src/duckdb/src/include/duckdb/storage/table/data_table_info.hpp b/src/duckdb/src/include/duckdb/storage/table/data_table_info.hpp index 2785486b..598d80e2 100644 --- a/src/duckdb/src/include/duckdb/storage/table/data_table_info.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/data_table_info.hpp @@ -19,8 +19,9 @@ class TableIOManager; struct DataTableInfo { DataTableInfo(AttachedDatabase &db, shared_ptr table_io_manager_p, string schema, string table); - //! Initialize any unknown indexes whose types might now be present after an extension load - void InitializeIndexes(ClientContext &context); + //! Initialize any unknown indexes whose types might now be present after an extension load, optionally throwing an + //! exception if an index can't be initialized + void InitializeIndexes(ClientContext &context, bool throw_on_failure = false); //! The database instance of the table AttachedDatabase &db; diff --git a/src/duckdb/src/include/duckdb/storage/table/row_group.hpp b/src/duckdb/src/include/duckdb/storage/table/row_group.hpp index ee413dc9..6265279f 100644 --- a/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/row_group.hpp @@ -54,7 +54,7 @@ class RowGroup : public SegmentBase { public: RowGroup(RowGroupCollection &collection, idx_t start, idx_t count); - RowGroup(RowGroupCollection &collection, RowGroupPointer &&pointer); + RowGroup(RowGroupCollection &collection, RowGroupPointer pointer); ~RowGroup(); private: diff --git a/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp b/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp index e715c1a5..94810753 100644 --- a/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp @@ -18,7 +18,7 @@ class MetadataReader; class RowGroupSegmentTree : public SegmentTree { public: - RowGroupSegmentTree(RowGroupCollection &collection); + explicit RowGroupSegmentTree(RowGroupCollection &collection); ~RowGroupSegmentTree() override; void Initialize(PersistentTableData &data); diff --git a/src/duckdb/src/include/duckdb/storage/table/row_version_manager.hpp b/src/duckdb/src/include/duckdb/storage/table/row_version_manager.hpp index 0763513b..962505a3 100644 --- a/src/duckdb/src/include/duckdb/storage/table/row_version_manager.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/row_version_manager.hpp @@ -15,6 +15,7 @@ namespace duckdb { +struct DeleteInfo; class MetadataManager; struct MetaBlockPointer; @@ -38,7 +39,7 @@ class RowVersionManager { void RevertAppend(idx_t start_row); idx_t DeleteRows(idx_t vector_idx, transaction_t transaction_id, row_t rows[], idx_t count); - void CommitDelete(idx_t vector_idx, transaction_t commit_id, row_t rows[], idx_t count); + void CommitDelete(idx_t vector_idx, transaction_t commit_id, const DeleteInfo &info); vector Checkpoint(MetadataManager &manager); static shared_ptr Deserialize(MetaBlockPointer delete_pointer, MetadataManager &manager, diff --git a/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp b/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp index 3ebcc321..7b8160fd 100644 --- a/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp @@ -44,7 +44,7 @@ struct SegmentScanState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -60,7 +60,7 @@ struct IndexScanState { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; @@ -111,7 +111,7 @@ struct ColumnFetchState { class CollectionScanState { public: - CollectionScanState(TableScanState &parent_p); + explicit CollectionScanState(TableScanState &parent_p); //! The current row_group we are scanning RowGroup *row_group; diff --git a/src/duckdb/src/include/duckdb/storage/table/segment_lock.hpp b/src/duckdb/src/include/duckdb/storage/table/segment_lock.hpp index 88840437..22ed6cee 100644 --- a/src/duckdb/src/include/duckdb/storage/table/segment_lock.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/segment_lock.hpp @@ -17,7 +17,7 @@ struct SegmentLock { public: SegmentLock() { } - SegmentLock(mutex &lock) : lock(lock) { + explicit SegmentLock(mutex &lock) : lock(lock) { } // disable copy constructors SegmentLock(const SegmentLock &other) = delete; diff --git a/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp b/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp index f561ec8b..e2778bc3 100644 --- a/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp @@ -320,10 +320,10 @@ class SegmentTree { }; public: - SegmentIterator begin() { + SegmentIterator begin() { // NOLINT: match stl API return SegmentIterator(tree, tree.GetRootSegment()); } - SegmentIterator end() { + SegmentIterator end() { // NOLINT: match stl API return SegmentIterator(tree, nullptr); } }; @@ -349,8 +349,8 @@ class SegmentTree { if (!SUPPORTS_LAZY_LOADING) { return; } - while (LoadNextSegment(l)) - ; + while (LoadNextSegment(l)) { + } } }; diff --git a/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp b/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp index 13502412..9ad0780d 100644 --- a/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp @@ -23,6 +23,8 @@ class StandardColumnData : public ColumnData { ValidityColumnData validity; public: + bool HasUpdates() const override; + void SetStart(idx_t new_start) override; bool CheckZonemap(ColumnScanState &state, TableFilter &filter) override; diff --git a/src/duckdb/src/include/duckdb/storage/table/table_index_list.hpp b/src/duckdb/src/include/duckdb/storage/table/table_index_list.hpp index be15497a..397bf282 100644 --- a/src/duckdb/src/include/duckdb/storage/table/table_index_list.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/table_index_list.hpp @@ -41,8 +41,9 @@ class TableIndexList { void CommitDrop(const string &name); //! Returns true, if the index name does not exist bool NameIsUnique(const string &name); - //! Initializes unknown indexes that might now be present after an extension load - void InitializeIndexes(ClientContext &context, DataTableInfo &table_info); + //! Initializes unknown indexes that might now be present after an extension load, optionally throwing an exception + //! if a index cant be initialized + void InitializeIndexes(ClientContext &context, DataTableInfo &table_info, bool throw_on_failure = false); bool Empty(); idx_t Count(); void Move(TableIndexList &other); diff --git a/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp b/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp index b2325327..05837184 100644 --- a/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp @@ -22,7 +22,7 @@ class Deserializer; class TableStatisticsLock { public: - TableStatisticsLock(mutex &l) : guard(l) { + explicit TableStatisticsLock(mutex &l) : guard(l) { } lock_guard guard; diff --git a/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp b/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp index cefa5d09..71fba059 100644 --- a/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp @@ -22,7 +22,7 @@ struct UpdateNode; class UpdateSegment { public: - UpdateSegment(ColumnData &column_data); + explicit UpdateSegment(ColumnData &column_data); ~UpdateSegment(); ColumnData &column_data; diff --git a/src/duckdb/src/include/duckdb/storage/table_storage_info.hpp b/src/duckdb/src/include/duckdb/storage/table_storage_info.hpp index 3ab3ea79..49b3089c 100644 --- a/src/duckdb/src/include/duckdb/storage/table_storage_info.hpp +++ b/src/duckdb/src/include/duckdb/storage/table_storage_info.hpp @@ -13,6 +13,7 @@ #include "duckdb/storage/block.hpp" #include "duckdb/storage/index_storage_info.hpp" #include "duckdb/storage/storage_info.hpp" +#include "duckdb/common/optional_idx.hpp" namespace duckdb { @@ -38,7 +39,7 @@ struct ColumnSegmentInfo { class TableStorageInfo { public: //! The (estimated) cardinality of the table - idx_t cardinality = DConstants::INVALID_INDEX; + optional_idx cardinality; //! Info of the indexes of a table vector index_info; }; diff --git a/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp b/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp index 11a11c25..6398a20b 100644 --- a/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +++ b/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp @@ -52,7 +52,7 @@ class WriteAheadLog { public: //! Replay the WAL - static bool Replay(AttachedDatabase &database, string &path); + static bool Replay(AttachedDatabase &database, unique_ptr handle); //! Returns the current size of the WAL in bytes int64_t GetWALSize(); diff --git a/src/duckdb/src/include/duckdb/transaction/delete_info.hpp b/src/duckdb/src/include/duckdb/transaction/delete_info.hpp index 569d12f1..99b02320 100644 --- a/src/duckdb/src/include/duckdb/transaction/delete_info.hpp +++ b/src/duckdb/src/include/duckdb/transaction/delete_info.hpp @@ -20,7 +20,26 @@ struct DeleteInfo { idx_t vector_idx; idx_t count; idx_t base_row; - row_t rows[1]; + //! Whether or not row ids are consecutive (0, 1, 2, ..., count). + //! If this is true no rows are stored and `rows` should not be accessed. + bool is_consecutive; + + uint16_t *GetRows() { + if (is_consecutive) { + throw InternalException("DeleteInfo is consecutive - rows are not accessible"); + } + return rows; + } + const uint16_t *GetRows() const { + if (is_consecutive) { + throw InternalException("DeleteInfo is consecutive - rows are not accessible"); + } + return rows; + } + +private: + //! The per-vector row identifiers (actual row id is base_row + rows[x]) + uint16_t rows[1]; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/transaction/transaction.hpp b/src/duckdb/src/include/duckdb/transaction/transaction.hpp index 1c47725c..723c9946 100644 --- a/src/duckdb/src/include/duckdb/transaction/transaction.hpp +++ b/src/duckdb/src/include/duckdb/transaction/transaction.hpp @@ -66,7 +66,7 @@ class Transaction { } template const TARGET &Cast() const { - D_ASSERT(dynamic_cast(this)); + DynamicCastCheck(this); return reinterpret_cast(*this); } }; diff --git a/src/duckdb/src/include/duckdb/transaction/transaction_data.hpp b/src/duckdb/src/include/duckdb/transaction/transaction_data.hpp index b8e5d23e..e182627d 100644 --- a/src/duckdb/src/include/duckdb/transaction/transaction_data.hpp +++ b/src/duckdb/src/include/duckdb/transaction/transaction_data.hpp @@ -16,7 +16,7 @@ class DuckTransaction; class Transaction; struct TransactionData { - TransactionData(DuckTransaction &transaction_p); + TransactionData(DuckTransaction &transaction_p); // NOLINT: allow implicit conversion TransactionData(transaction_t transaction_id_p, transaction_t start_time_p); optional_ptr transaction; diff --git a/src/duckdb/src/include/duckdb/transaction/undo_buffer.hpp b/src/duckdb/src/include/duckdb/transaction/undo_buffer.hpp index d0ae7096..9a212853 100644 --- a/src/duckdb/src/include/duckdb/transaction/undo_buffer.hpp +++ b/src/duckdb/src/include/duckdb/transaction/undo_buffer.hpp @@ -28,7 +28,7 @@ class UndoBuffer { }; public: - UndoBuffer(ClientContext &context); + explicit UndoBuffer(ClientContext &context); //! Reserve space for an entry of the specified type and length in the undo //! buffer diff --git a/src/duckdb/src/include/duckdb/transaction/update_info.hpp b/src/duckdb/src/include/duckdb/transaction/update_info.hpp index 8dc313a3..e7dc7dfc 100644 --- a/src/duckdb/src/include/duckdb/transaction/update_info.hpp +++ b/src/duckdb/src/include/duckdb/transaction/update_info.hpp @@ -27,7 +27,7 @@ struct UpdateInfo { //! The vector index within the uncompressed segment idx_t vector_index; //! The amount of updated tuples - sel_t N; + sel_t N; // NOLINT //! The maximum amount of tuples that can fit into this UpdateInfo sel_t max; //! The row ids of the tuples that have been updated. This should always be kept sorted! diff --git a/src/duckdb/src/main/appender.cpp b/src/duckdb/src/main/appender.cpp index c374b2cd..28a62275 100644 --- a/src/duckdb/src/main/appender.cpp +++ b/src/duckdb/src/main/appender.cpp @@ -36,7 +36,7 @@ void BaseAppender::Destructor() { // wrapped in a try/catch because Close() can throw if the table was dropped in the meantime try { Close(); - } catch (...) { + } catch (...) { // NOLINT } } diff --git a/src/duckdb/src/main/attached_database.cpp b/src/duckdb/src/main/attached_database.cpp index d9a287ef..ce9ce5f4 100644 --- a/src/duckdb/src/main/attached_database.cpp +++ b/src/duckdb/src/main/attached_database.cpp @@ -96,14 +96,14 @@ string AttachedDatabase::ExtractDatabaseName(const string &dbpath, FileSystem &f return name; } -void AttachedDatabase::Initialize() { +void AttachedDatabase::Initialize(optional_ptr context) { if (IsSystem()) { catalog->Initialize(true); } else { catalog->Initialize(false); } if (storage) { - storage->Initialize(); + storage->Initialize(context); } } @@ -126,6 +126,10 @@ Catalog &AttachedDatabase::ParentCatalog() { return *parent_catalog; } +const Catalog &AttachedDatabase::ParentCatalog() const { + return *parent_catalog; +} + bool AttachedDatabase::IsInitialDatabase() const { return is_initial_database; } @@ -134,6 +138,10 @@ void AttachedDatabase::SetInitialDatabase() { is_initial_database = true; } +void AttachedDatabase::SetReadOnlyDatabase() { + type = AttachedDatabaseType::READ_ONLY_DATABASE; +} + void AttachedDatabase::Close() { D_ASSERT(catalog); if (is_closed) { @@ -162,7 +170,7 @@ void AttachedDatabase::Close() { } storage->CreateCheckpoint(true); } - } catch (...) { + } catch (...) { // NOLINT } } diff --git a/src/duckdb/src/main/capi/arrow-c.cpp b/src/duckdb/src/main/capi/arrow-c.cpp index 1b0b366a..335b9369 100644 --- a/src/duckdb/src/main/capi/arrow-c.cpp +++ b/src/duckdb/src/main/capi/arrow-c.cpp @@ -27,8 +27,12 @@ duckdb_state duckdb_query_arrow_schema(duckdb_arrow result, duckdb_arrow_schema return DuckDBSuccess; } auto wrapper = reinterpret_cast(result); - ArrowConverter::ToArrowSchema((ArrowSchema *)*out_schema, wrapper->result->types, wrapper->result->names, - wrapper->result->client_properties); + try { + ArrowConverter::ToArrowSchema((ArrowSchema *)*out_schema, wrapper->result->types, wrapper->result->names, + wrapper->result->client_properties); + } catch (...) { + return DuckDBError; + } return DuckDBSuccess; } diff --git a/src/duckdb/src/main/capi/cast/utils-c.cpp b/src/duckdb/src/main/capi/cast/utils-c.cpp index 94c17dde..0929312e 100644 --- a/src/duckdb/src/main/capi/cast/utils-c.cpp +++ b/src/duckdb/src/main/capi/cast/utils-c.cpp @@ -78,7 +78,7 @@ bool CanUseDeprecatedFetch(duckdb_result *result, idx_t col, idx_t row) { if (!result) { return false; } - if (!duckdb::deprecated_materialize_result(result)) { + if (!duckdb::DeprecatedMaterializeResult(result)) { return false; } if (col >= result->__deprecated_column_count || row >= result->__deprecated_row_count) { diff --git a/src/duckdb/src/main/capi/duckdb-c.cpp b/src/duckdb/src/main/capi/duckdb-c.cpp index 2b14b817..ac944578 100644 --- a/src/duckdb/src/main/capi/duckdb-c.cpp +++ b/src/duckdb/src/main/capi/duckdb-c.cpp @@ -99,7 +99,7 @@ void duckdb_disconnect(duckdb_connection *connection) { duckdb_state duckdb_query(duckdb_connection connection, const char *query, duckdb_result *out) { Connection *conn = reinterpret_cast(connection); auto result = conn->Query(query); - return duckdb_translate_result(std::move(result), out); + return DuckDBTranslateResult(std::move(result), out); } const char *duckdb_library_version() { diff --git a/src/duckdb/src/main/capi/pending-c.cpp b/src/duckdb/src/main/capi/pending-c.cpp index 68875872..f75e2d98 100644 --- a/src/duckdb/src/main/capi/pending-c.cpp +++ b/src/duckdb/src/main/capi/pending-c.cpp @@ -162,5 +162,5 @@ duckdb_state duckdb_execute_pending(duckdb_pending_result pending_result, duckdb } wrapper->statement.reset(); - return duckdb_translate_result(std::move(result), out_result); + return DuckDBTranslateResult(std::move(result), out_result); } diff --git a/src/duckdb/src/main/capi/prepared-c.cpp b/src/duckdb/src/main/capi/prepared-c.cpp index 0569114e..c7aac141 100644 --- a/src/duckdb/src/main/capi/prepared-c.cpp +++ b/src/duckdb/src/main/capi/prepared-c.cpp @@ -333,7 +333,7 @@ duckdb_state duckdb_execute_prepared(duckdb_prepared_statement prepared_statemen } auto result = wrapper->statement->Execute(wrapper->values, false); - return duckdb_translate_result(std::move(result), out_result); + return DuckDBTranslateResult(std::move(result), out_result); } duckdb_state duckdb_execute_prepared_streaming(duckdb_prepared_statement prepared_statement, @@ -344,7 +344,7 @@ duckdb_state duckdb_execute_prepared_streaming(duckdb_prepared_statement prepare } auto result = wrapper->statement->Execute(wrapper->values, true); - return duckdb_translate_result(std::move(result), out_result); + return DuckDBTranslateResult(std::move(result), out_result); } duckdb_statement_type duckdb_prepared_statement_type(duckdb_prepared_statement statement) { diff --git a/src/duckdb/src/main/capi/result-c.cpp b/src/duckdb/src/main/capi/result-c.cpp index 610ecc3b..81c03cc5 100644 --- a/src/duckdb/src/main/capi/result-c.cpp +++ b/src/duckdb/src/main/capi/result-c.cpp @@ -273,7 +273,7 @@ duckdb_state deprecated_duckdb_translate_column(MaterializedQueryResult &result, return DuckDBSuccess; } -duckdb_state duckdb_translate_result(unique_ptr result_p, duckdb_result *out) { +duckdb_state DuckDBTranslateResult(unique_ptr result_p, duckdb_result *out) { auto &result = *result_p; D_ASSERT(result_p); if (!out) { @@ -301,7 +301,7 @@ duckdb_state duckdb_translate_result(unique_ptr result_p, duckdb_re return DuckDBSuccess; } -bool deprecated_materialize_result(duckdb_result *result) { +bool DeprecatedMaterializeResult(duckdb_result *result) { if (!result) { return false; } @@ -475,7 +475,7 @@ void *duckdb_column_data(duckdb_result *result, idx_t col) { if (!result || col >= result->__deprecated_column_count) { return nullptr; } - if (!duckdb::deprecated_materialize_result(result)) { + if (!duckdb::DeprecatedMaterializeResult(result)) { return nullptr; } return result->__deprecated_columns[col].__deprecated_data; @@ -485,7 +485,7 @@ bool *duckdb_nullmask_data(duckdb_result *result, idx_t col) { if (!result || col >= result->__deprecated_column_count) { return nullptr; } - if (!duckdb::deprecated_materialize_result(result)) { + if (!duckdb::DeprecatedMaterializeResult(result)) { return nullptr; } return result->__deprecated_columns[col].__deprecated_nullmask; diff --git a/src/duckdb/src/main/client_context.cpp b/src/duckdb/src/main/client_context.cpp index 909593aa..c3aa1917 100644 --- a/src/duckdb/src/main/client_context.cpp +++ b/src/duckdb/src/main/client_context.cpp @@ -1235,7 +1235,7 @@ unique_ptr ClientContext::Execute(const shared_ptr &relat return ErrorResult(ErrorData(err_str)); } -SettingLookupResult ClientContext::TryGetCurrentSetting(const std::string &key, Value &result) { +SettingLookupResult ClientContext::TryGetCurrentSetting(const std::string &key, Value &result) const { // first check the built-in settings auto &db_config = DBConfig::GetConfig(*this); auto option = db_config.GetOptionByName(key); @@ -1270,17 +1270,9 @@ ParserOptions ClientContext::GetParserOptions() const { ClientProperties ClientContext::GetClientProperties() const { string timezone = "UTC"; Value result; - // 1) Check Set Variable - auto &client_config = ClientConfig::GetConfig(*this); - auto tz_config = client_config.set_variables.find("timezone"); - if (tz_config == client_config.set_variables.end()) { - // 2) Check for Default Value - auto default_value = db->config.extension_parameters.find("timezone"); - if (default_value != db->config.extension_parameters.end()) { - timezone = default_value->second.default_value.GetValue(); - } - } else { - timezone = tz_config->second.GetValue(); + + if (TryGetCurrentSetting("TimeZone", result)) { + timezone = result.ToString(); } return {timezone, db->config.options.arrow_offset_size}; } diff --git a/src/duckdb/src/main/client_context_file_opener.cpp b/src/duckdb/src/main/client_context_file_opener.cpp index a21e4505..17ddef4f 100644 --- a/src/duckdb/src/main/client_context_file_opener.cpp +++ b/src/duckdb/src/main/client_context_file_opener.cpp @@ -14,21 +14,33 @@ SettingLookupResult ClientContextFileOpener::TryGetCurrentSetting(const string & return context.TryGetCurrentSetting(key, result); } -ClientContext *FileOpener::TryGetClientContext(FileOpener *opener) { +optional_ptr ClientContextFileOpener::TryGetDatabase() { + return context.db.get(); +} + +optional_ptr FileOpener::TryGetClientContext(optional_ptr opener) { if (!opener) { return nullptr; } return opener->TryGetClientContext(); } -SettingLookupResult FileOpener::TryGetCurrentSetting(FileOpener *opener, const string &key, Value &result) { +optional_ptr FileOpener::TryGetDatabase(optional_ptr opener) { + if (!opener) { + return nullptr; + } + return opener->TryGetDatabase(); +} + +SettingLookupResult FileOpener::TryGetCurrentSetting(optional_ptr opener, const string &key, + Value &result) { if (!opener) { return SettingLookupResult(); } return opener->TryGetCurrentSetting(key, result); } -SettingLookupResult FileOpener::TryGetCurrentSetting(FileOpener *opener, const string &key, Value &result, +SettingLookupResult FileOpener::TryGetCurrentSetting(optional_ptr opener, const string &key, Value &result, FileOpenerInfo &info) { if (!opener) { return SettingLookupResult(); diff --git a/src/duckdb/src/main/client_data.cpp b/src/duckdb/src/main/client_data.cpp index 5b061f1d..07d164b6 100644 --- a/src/duckdb/src/main/client_data.cpp +++ b/src/duckdb/src/main/client_data.cpp @@ -24,6 +24,7 @@ class ClientFileSystem : public OpenerFileSystem { auto &config = DBConfig::GetConfig(context); return *config.file_system; } + optional_ptr GetOpener() const override { return ClientData::Get(context).file_opener.get(); } @@ -49,6 +50,10 @@ ClientData &ClientData::Get(ClientContext &context) { return *context.client_data; } +const ClientData &ClientData::Get(const ClientContext &context) { + return *context.client_data; +} + RandomEngine &RandomEngine::Get(ClientContext &context) { return *ClientData::Get(context).random_engine; } diff --git a/src/duckdb/src/main/config.cpp b/src/duckdb/src/main/config.cpp index 9901d5d8..c1e86b96 100644 --- a/src/duckdb/src/main/config.cpp +++ b/src/duckdb/src/main/config.cpp @@ -53,77 +53,79 @@ bool DBConfigOptions::debug_print_bindings = false; #define FINAL_SETTING \ { nullptr, nullptr, LogicalTypeId::INVALID, nullptr, nullptr, nullptr, nullptr, nullptr } -static ConfigurationOption internal_options[] = {DUCKDB_GLOBAL(AccessModeSetting), - DUCKDB_GLOBAL(AllowPersistentSecrets), - DUCKDB_GLOBAL(CheckpointThresholdSetting), - DUCKDB_GLOBAL(DebugCheckpointAbort), - DUCKDB_LOCAL(DebugForceExternal), - DUCKDB_LOCAL(DebugForceNoCrossProduct), - DUCKDB_LOCAL(DebugAsOfIEJoin), - DUCKDB_LOCAL(PreferRangeJoins), - DUCKDB_GLOBAL(DebugWindowMode), - DUCKDB_GLOBAL_LOCAL(DefaultCollationSetting), - DUCKDB_GLOBAL(DefaultOrderSetting), - DUCKDB_GLOBAL(DefaultNullOrderSetting), - DUCKDB_GLOBAL(DisabledFileSystemsSetting), - DUCKDB_GLOBAL(DisabledOptimizersSetting), - DUCKDB_GLOBAL(EnableExternalAccessSetting), - DUCKDB_GLOBAL(EnableFSSTVectors), - DUCKDB_GLOBAL(AllowUnsignedExtensionsSetting), - DUCKDB_GLOBAL(AllowUnredactedSecretsSetting), - DUCKDB_GLOBAL(CustomExtensionRepository), - DUCKDB_GLOBAL(AutoloadExtensionRepository), - DUCKDB_GLOBAL(AutoinstallKnownExtensions), - DUCKDB_GLOBAL(AutoloadKnownExtensions), - DUCKDB_GLOBAL(EnableObjectCacheSetting), - DUCKDB_GLOBAL(EnableHTTPMetadataCacheSetting), - DUCKDB_LOCAL(EnableProfilingSetting), - DUCKDB_LOCAL(EnableProgressBarSetting), - DUCKDB_LOCAL(EnableProgressBarPrintSetting), - DUCKDB_LOCAL(ErrorsAsJsonSetting), - DUCKDB_LOCAL(ExplainOutputSetting), - DUCKDB_GLOBAL(ExtensionDirectorySetting), - DUCKDB_GLOBAL(ExternalThreadsSetting), - DUCKDB_LOCAL(FileSearchPathSetting), - DUCKDB_GLOBAL(ForceCompressionSetting), - DUCKDB_GLOBAL(ForceBitpackingModeSetting), - DUCKDB_LOCAL(HomeDirectorySetting), - DUCKDB_LOCAL(LogQueryPathSetting), - DUCKDB_GLOBAL(LockConfigurationSetting), - DUCKDB_GLOBAL(ImmediateTransactionModeSetting), - DUCKDB_LOCAL(IntegerDivisionSetting), - DUCKDB_LOCAL(MaximumExpressionDepthSetting), - DUCKDB_GLOBAL(MaximumMemorySetting), - DUCKDB_GLOBAL(OldImplicitCasting), - DUCKDB_GLOBAL_ALIAS("memory_limit", MaximumMemorySetting), - DUCKDB_GLOBAL_ALIAS("null_order", DefaultNullOrderSetting), - DUCKDB_LOCAL(OrderedAggregateThreshold), - DUCKDB_GLOBAL(PasswordSetting), - DUCKDB_LOCAL(PerfectHashThresholdSetting), - DUCKDB_LOCAL(PivotFilterThreshold), - DUCKDB_LOCAL(PivotLimitSetting), - DUCKDB_LOCAL(PreserveIdentifierCase), - DUCKDB_GLOBAL(PreserveInsertionOrder), - DUCKDB_LOCAL(ProfileOutputSetting), - DUCKDB_LOCAL(ProfilingModeSetting), - DUCKDB_LOCAL_ALIAS("profiling_output", ProfileOutputSetting), - DUCKDB_LOCAL(ProgressBarTimeSetting), - DUCKDB_LOCAL(SchemaSetting), - DUCKDB_LOCAL(SearchPathSetting), - DUCKDB_GLOBAL(SecretDirectorySetting), - DUCKDB_GLOBAL(DefaultSecretStorage), - DUCKDB_GLOBAL(TempDirectorySetting), - DUCKDB_GLOBAL(ThreadsSetting), - DUCKDB_GLOBAL(UsernameSetting), - DUCKDB_GLOBAL(ExportLargeBufferArrow), - DUCKDB_GLOBAL_ALIAS("user", UsernameSetting), - DUCKDB_GLOBAL_ALIAS("wal_autocheckpoint", CheckpointThresholdSetting), - DUCKDB_GLOBAL_ALIAS("worker_threads", ThreadsSetting), - DUCKDB_GLOBAL(FlushAllocatorSetting), - DUCKDB_GLOBAL(DuckDBApiSetting), - DUCKDB_GLOBAL(CustomUserAgentSetting), - DUCKDB_LOCAL(PartitionedWriteFlushThreshold), - FINAL_SETTING}; +static const ConfigurationOption internal_options[] = { + DUCKDB_GLOBAL(AccessModeSetting), + DUCKDB_GLOBAL(AllowPersistentSecrets), + DUCKDB_GLOBAL(CheckpointThresholdSetting), + DUCKDB_GLOBAL(DebugCheckpointAbort), + DUCKDB_LOCAL(DebugForceExternal), + DUCKDB_LOCAL(DebugForceNoCrossProduct), + DUCKDB_LOCAL(DebugAsOfIEJoin), + DUCKDB_LOCAL(PreferRangeJoins), + DUCKDB_GLOBAL(DebugWindowMode), + DUCKDB_GLOBAL_LOCAL(DefaultCollationSetting), + DUCKDB_GLOBAL(DefaultOrderSetting), + DUCKDB_GLOBAL(DefaultNullOrderSetting), + DUCKDB_GLOBAL(DisabledFileSystemsSetting), + DUCKDB_GLOBAL(DisabledOptimizersSetting), + DUCKDB_GLOBAL(EnableExternalAccessSetting), + DUCKDB_GLOBAL(EnableFSSTVectors), + DUCKDB_GLOBAL(AllowUnsignedExtensionsSetting), + DUCKDB_GLOBAL(AllowExtensionsMetadataMismatchSetting), + DUCKDB_GLOBAL(AllowUnredactedSecretsSetting), + DUCKDB_GLOBAL(CustomExtensionRepository), + DUCKDB_GLOBAL(AutoloadExtensionRepository), + DUCKDB_GLOBAL(AutoinstallKnownExtensions), + DUCKDB_GLOBAL(AutoloadKnownExtensions), + DUCKDB_GLOBAL(EnableObjectCacheSetting), + DUCKDB_GLOBAL(EnableHTTPMetadataCacheSetting), + DUCKDB_LOCAL(EnableProfilingSetting), + DUCKDB_LOCAL(EnableProgressBarSetting), + DUCKDB_LOCAL(EnableProgressBarPrintSetting), + DUCKDB_LOCAL(ErrorsAsJsonSetting), + DUCKDB_LOCAL(ExplainOutputSetting), + DUCKDB_GLOBAL(ExtensionDirectorySetting), + DUCKDB_GLOBAL(ExternalThreadsSetting), + DUCKDB_LOCAL(FileSearchPathSetting), + DUCKDB_GLOBAL(ForceCompressionSetting), + DUCKDB_GLOBAL(ForceBitpackingModeSetting), + DUCKDB_LOCAL(HomeDirectorySetting), + DUCKDB_LOCAL(LogQueryPathSetting), + DUCKDB_GLOBAL(LockConfigurationSetting), + DUCKDB_GLOBAL(ImmediateTransactionModeSetting), + DUCKDB_LOCAL(IntegerDivisionSetting), + DUCKDB_LOCAL(MaximumExpressionDepthSetting), + DUCKDB_GLOBAL(MaximumMemorySetting), + DUCKDB_GLOBAL(OldImplicitCasting), + DUCKDB_GLOBAL_ALIAS("memory_limit", MaximumMemorySetting), + DUCKDB_GLOBAL_ALIAS("null_order", DefaultNullOrderSetting), + DUCKDB_LOCAL(OrderedAggregateThreshold), + DUCKDB_GLOBAL(PasswordSetting), + DUCKDB_LOCAL(PerfectHashThresholdSetting), + DUCKDB_LOCAL(PivotFilterThreshold), + DUCKDB_LOCAL(PivotLimitSetting), + DUCKDB_LOCAL(PreserveIdentifierCase), + DUCKDB_GLOBAL(PreserveInsertionOrder), + DUCKDB_LOCAL(ProfileOutputSetting), + DUCKDB_LOCAL(ProfilingModeSetting), + DUCKDB_LOCAL_ALIAS("profiling_output", ProfileOutputSetting), + DUCKDB_LOCAL(ProgressBarTimeSetting), + DUCKDB_LOCAL(SchemaSetting), + DUCKDB_LOCAL(SearchPathSetting), + DUCKDB_GLOBAL(SecretDirectorySetting), + DUCKDB_GLOBAL(DefaultSecretStorage), + DUCKDB_GLOBAL(TempDirectorySetting), + DUCKDB_GLOBAL(ThreadsSetting), + DUCKDB_GLOBAL(UsernameSetting), + DUCKDB_GLOBAL(ExportLargeBufferArrow), + DUCKDB_GLOBAL_ALIAS("user", UsernameSetting), + DUCKDB_GLOBAL_ALIAS("wal_autocheckpoint", CheckpointThresholdSetting), + DUCKDB_GLOBAL_ALIAS("worker_threads", ThreadsSetting), + DUCKDB_GLOBAL(FlushAllocatorSetting), + DUCKDB_GLOBAL(DuckDBApiSetting), + DUCKDB_GLOBAL(CustomUserAgentSetting), + DUCKDB_LOCAL(PartitionedWriteFlushThreshold), + FINAL_SETTING}; vector DBConfig::GetOptions() { vector options; @@ -149,7 +151,7 @@ vector DBConfig::GetOptionNames() { return names; } -ConfigurationOption *DBConfig::GetOptionByIndex(idx_t target_index) { +optional_ptr DBConfig::GetOptionByIndex(idx_t target_index) { for (idx_t index = 0; internal_options[index].name; index++) { if (index == target_index) { return internal_options + index; @@ -158,7 +160,7 @@ ConfigurationOption *DBConfig::GetOptionByIndex(idx_t target_index) { return nullptr; } -ConfigurationOption *DBConfig::GetOptionByName(const string &name) { +optional_ptr DBConfig::GetOptionByName(const string &name) { auto lname = StringUtil::Lower(name); for (idx_t index = 0; internal_options[index].name; index++) { D_ASSERT(StringUtil::Lower(internal_options[index].name) == string(internal_options[index].name)); @@ -255,8 +257,8 @@ IndexTypeSet &DBConfig::GetIndexTypes() { void DBConfig::SetDefaultMaxMemory() { auto memory = FileSystem::GetAvailableMemory(); - if (memory != DConstants::INVALID_INDEX) { - options.maximum_memory = memory * 8 / 10; + if (memory.IsValid()) { + options.maximum_memory = memory.GetIndex() * 8 / 10; } } @@ -287,8 +289,7 @@ idx_t CGroupBandwidthQuota(idx_t physical_cores, FileSystem &fs) { if (fs.FileExists(CPU_MAX)) { // cgroup v2 // https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html - handle = - fs.OpenFile(CPU_MAX, FileFlags::FILE_FLAGS_READ, FileSystem::DEFAULT_LOCK, FileSystem::DEFAULT_COMPRESSION); + handle = fs.OpenFile(CPU_MAX, FileFlags::FILE_FLAGS_READ); read_bytes = fs.Read(*handle, (void *)byte_buffer, 999); byte_buffer[read_bytes] = '\0'; if (std::sscanf(byte_buffer, "%" SCNd64 " %" SCNd64 "", "a, &period) != 2) { @@ -299,8 +300,7 @@ idx_t CGroupBandwidthQuota(idx_t physical_cores, FileSystem &fs) { // https://www.kernel.org/doc/html/latest/scheduler/sched-bwc.html#management // Read the quota, this indicates how many microseconds the CPU can be utilized by this cgroup per period - handle = fs.OpenFile(CFS_QUOTA, FileFlags::FILE_FLAGS_READ, FileSystem::DEFAULT_LOCK, - FileSystem::DEFAULT_COMPRESSION); + handle = fs.OpenFile(CFS_QUOTA, FileFlags::FILE_FLAGS_READ); read_bytes = fs.Read(*handle, (void *)byte_buffer, 999); byte_buffer[read_bytes] = '\0'; if (std::sscanf(byte_buffer, "%" SCNd64 "", "a) != 1) { @@ -308,8 +308,7 @@ idx_t CGroupBandwidthQuota(idx_t physical_cores, FileSystem &fs) { } // Read the time period, a cgroup can utilize the CPU up to quota microseconds every period - handle = fs.OpenFile(CFS_PERIOD, FileFlags::FILE_FLAGS_READ, FileSystem::DEFAULT_LOCK, - FileSystem::DEFAULT_COMPRESSION); + handle = fs.OpenFile(CFS_PERIOD, FileFlags::FILE_FLAGS_READ); read_bytes = fs.Read(*handle, (void *)byte_buffer, 999); byte_buffer[read_bytes] = '\0'; if (std::sscanf(byte_buffer, "%" SCNd64 "", &period) != 1) { @@ -342,7 +341,8 @@ idx_t DBConfig::GetSystemMaxThreads(FileSystem &fs) { idx_t DBConfig::ParseMemoryLimit(const string &arg) { if (arg[0] == '-' || arg == "null" || arg == "none") { - return DConstants::INVALID_INDEX; + // infinite + return NumericLimits::Maximum(); } // split based on the number/non-number idx_t idx = 0; diff --git a/src/duckdb/src/main/database.cpp b/src/duckdb/src/main/database.cpp index bcadf5e3..b3fe6954 100644 --- a/src/duckdb/src/main/database.cpp +++ b/src/duckdb/src/main/database.cpp @@ -22,6 +22,7 @@ #include "duckdb/storage/storage_manager.hpp" #include "duckdb/transaction/transaction_manager.hpp" #include "duckdb/execution/index/index_type_set.hpp" +#include "duckdb/main/database_file_opener.hpp" #ifndef DUCKDB_NO_THREADS #include "duckdb/common/thread.hpp" @@ -70,6 +71,10 @@ BufferManager &BufferManager::GetBufferManager(DatabaseInstance &db) { return db.GetBufferManager(); } +const BufferManager &BufferManager::GetBufferManager(const DatabaseInstance &db) { + return db.GetBufferManager(); +} + BufferManager &BufferManager::GetBufferManager(AttachedDatabase &db) { return BufferManager::GetBufferManager(db.GetDatabase()); } @@ -78,6 +83,10 @@ DatabaseInstance &DatabaseInstance::GetDatabase(ClientContext &context) { return *context.db; } +const DatabaseInstance &DatabaseInstance::GetDatabase(const ClientContext &context) { + return *context.db; +} + DatabaseManager &DatabaseInstance::GetDatabaseManager() { if (!db_manager) { throw InternalException("Missing DB manager"); @@ -221,18 +230,24 @@ void DatabaseInstance::Initialize(const char *database_path, DBConfig *user_conf config.options.temporary_directory = string(); } + db_file_system = make_uniq(*this); db_manager = make_uniq(*this); - buffer_manager = make_uniq(*this, config.options.temporary_directory); + if (config.buffer_manager) { + buffer_manager = config.buffer_manager; + } else { + buffer_manager = make_uniq(*this, config.options.temporary_directory); + } scheduler = make_uniq(*this); object_cache = make_uniq(); connection_manager = make_uniq(); - // resolve the type of teh database we are opening - DBPathAndType::ResolveDatabaseType(config.options.database_path, config.options.database_type, config); - // initialize the secret manager config.secret_manager->Initialize(*this); + // resolve the type of teh database we are opening + auto &fs = FileSystem::GetFileSystem(*this); + DBPathAndType::ResolveDatabaseType(fs, config.options.database_path, config.options.database_type); + // initialize the system catalog db_manager->InitializeSystemCatalog(); @@ -281,6 +296,10 @@ BufferManager &DatabaseInstance::GetBufferManager() { return *buffer_manager; } +const BufferManager &DatabaseInstance::GetBufferManager() const { + return *buffer_manager; +} + BufferPool &DatabaseInstance::GetBufferPool() const { return *config.buffer_pool; } @@ -302,7 +321,7 @@ ObjectCache &DatabaseInstance::GetObjectCache() { } FileSystem &DatabaseInstance::GetFileSystem() { - return *config.file_system; + return *db_file_system; } ConnectionManager &DatabaseInstance::GetConnectionManager() { @@ -381,6 +400,10 @@ const unordered_set &DatabaseInstance::LoadedExtensions() { return loaded_extensions; } +const unordered_map &DatabaseInstance::LoadedExtensionsData() { + return loaded_extensions_data; +} + idx_t DuckDB::NumberOfThreads() { return instance->NumberOfThreads(); } @@ -394,9 +417,10 @@ bool DuckDB::ExtensionIsLoaded(const std::string &name) { return instance->ExtensionIsLoaded(name); } -void DatabaseInstance::SetExtensionLoaded(const std::string &name) { +void DatabaseInstance::SetExtensionLoaded(const std::string &name, const std::string &extension_version) { auto extension_name = ExtensionHelper::GetExtensionName(name); loaded_extensions.insert(extension_name); + loaded_extensions_data.insert({extension_name, ExtensionInfo(extension_version)}); auto &callbacks = DBConfig::GetConfig(*this).extension_callbacks; for (auto &callback : callbacks) { @@ -404,7 +428,7 @@ void DatabaseInstance::SetExtensionLoaded(const std::string &name) { } } -SettingLookupResult DatabaseInstance::TryGetCurrentSetting(const std::string &key, Value &result) { +SettingLookupResult DatabaseInstance::TryGetCurrentSetting(const std::string &key, Value &result) const { // check the session values auto &db_config = DBConfig::GetConfig(*this); const auto &global_config_map = db_config.options.set_variables; diff --git a/src/duckdb/src/main/database_manager.cpp b/src/duckdb/src/main/database_manager.cpp index b3bbdf69..e9b6812e 100644 --- a/src/duckdb/src/main/database_manager.cpp +++ b/src/duckdb/src/main/database_manager.cpp @@ -49,7 +49,7 @@ optional_ptr DatabaseManager::AttachDatabase(ClientContext &co const auto name = attached_db->GetName(); attached_db->oid = ModifyCatalog(); - DependencyList dependencies; + LogicalDependencyList dependencies; if (default_database.empty()) { default_database = name; } @@ -151,7 +151,8 @@ void DatabaseManager::GetDatabaseType(ClientContext &context, string &db_type, A if (db_type.empty()) { CheckPathConflict(context, info.path); - DBPathAndType::CheckMagicBytes(info.path, db_type, config); + auto &fs = FileSystem::GetFileSystem(context); + DBPathAndType::CheckMagicBytes(fs, info.path, db_type); } // if we are loading a database type from an extension - check if that extension is loaded diff --git a/src/duckdb/src/main/database_path_and_type.cpp b/src/duckdb/src/main/database_path_and_type.cpp index 3accb4e2..61db6c5b 100644 --- a/src/duckdb/src/main/database_path_and_type.cpp +++ b/src/duckdb/src/main/database_path_and_type.cpp @@ -14,9 +14,9 @@ void DBPathAndType::ExtractExtensionPrefix(string &path, string &db_type) { } } -void DBPathAndType::CheckMagicBytes(string &path, string &db_type, const DBConfig &config) { +void DBPathAndType::CheckMagicBytes(FileSystem &fs, string &path, string &db_type) { // if there isn't - check the magic bytes of the file (if any) - auto file_type = MagicBytes::CheckMagicBytes(config.file_system.get(), path); + auto file_type = MagicBytes::CheckMagicBytes(fs, path); if (file_type == DataFileType::SQLITE_FILE) { db_type = "sqlite"; } else { @@ -24,7 +24,7 @@ void DBPathAndType::CheckMagicBytes(string &path, string &db_type, const DBConfi } } -void DBPathAndType::ResolveDatabaseType(string &path, string &db_type, const DBConfig &config) { +void DBPathAndType::ResolveDatabaseType(FileSystem &fs, string &path, string &db_type) { if (!db_type.empty()) { // database type specified explicitly - no need to check return; @@ -36,7 +36,7 @@ void DBPathAndType::ResolveDatabaseType(string &path, string &db_type, const DBC return; } // check database type by reading the magic bytes of a file - DBPathAndType::CheckMagicBytes(path, db_type, config); + DBPathAndType::CheckMagicBytes(fs, path, db_type); } } // namespace duckdb diff --git a/src/duckdb/src/main/error_manager.cpp b/src/duckdb/src/main/error_manager.cpp index ece4ce43..4ec024c1 100644 --- a/src/duckdb/src/main/error_manager.cpp +++ b/src/duckdb/src/main/error_manager.cpp @@ -10,7 +10,7 @@ struct DefaultError { const char *error; }; -static DefaultError internal_errors[] = { +static const DefaultError internal_errors[] = { {ErrorType::UNSIGNED_EXTENSION, "Extension \"%s\" could not be loaded because its signature is either missing or invalid and unsigned extensions " "are disabled by configuration (allow_unsigned_extensions)"}, diff --git a/src/duckdb/src/main/extension/extension_alias.cpp b/src/duckdb/src/main/extension/extension_alias.cpp index 84305552..81d3c1e1 100644 --- a/src/duckdb/src/main/extension/extension_alias.cpp +++ b/src/duckdb/src/main/extension/extension_alias.cpp @@ -2,15 +2,15 @@ namespace duckdb { -static ExtensionAlias internal_aliases[] = {{"http", "httpfs"}, // httpfs - {"https", "httpfs"}, - {"md", "motherduck"}, // motherduck - {"mysql", "mysql_scanner"}, // mysql - {"s3", "httpfs"}, - {"postgres", "postgres_scanner"}, // postgres - {"sqlite", "sqlite_scanner"}, // sqlite - {"sqlite3", "sqlite_scanner"}, - {nullptr, nullptr}}; +static const ExtensionAlias internal_aliases[] = {{"http", "httpfs"}, // httpfs + {"https", "httpfs"}, + {"md", "motherduck"}, // motherduck + {"mysql", "mysql_scanner"}, // mysql + {"s3", "httpfs"}, + {"postgres", "postgres_scanner"}, // postgres + {"sqlite", "sqlite_scanner"}, // sqlite + {"sqlite3", "sqlite_scanner"}, + {nullptr, nullptr}}; idx_t ExtensionHelper::ExtensionAliasCount() { idx_t index; diff --git a/src/duckdb/src/main/extension/extension_helper.cpp b/src/duckdb/src/main/extension/extension_helper.cpp index bc446d14..818a2585 100644 --- a/src/duckdb/src/main/extension/extension_helper.cpp +++ b/src/duckdb/src/main/extension/extension_helper.cpp @@ -100,7 +100,7 @@ namespace duckdb { //===--------------------------------------------------------------------===// // Default Extensions //===--------------------------------------------------------------------===// -static DefaultExtension internal_extensions[] = { +static const DefaultExtension internal_extensions[] = { {"icu", "Adds support for time zones and collations using the ICU library", DUCKDB_EXTENSION_ICU_LINKED}, {"excel", "Adds support for Excel-like format strings", DUCKDB_EXTENSION_EXCEL_LINKED}, {"parquet", "Adds support for reading and writing parquet files", DUCKDB_EXTENSION_PARQUET_LINKED}, @@ -139,7 +139,8 @@ DefaultExtension ExtensionHelper::GetDefaultExtension(idx_t index) { //===--------------------------------------------------------------------===// // Allow Auto-Install Extensions //===--------------------------------------------------------------------===// -static const char *auto_install[] = {"motherduck", "postgres_scanner", "mysql_scanner", "sqlite_scanner", nullptr}; +static const char *const auto_install[] = {"motherduck", "postgres_scanner", "mysql_scanner", "sqlite_scanner", + nullptr}; // TODO: unify with new autoload mechanism bool ExtensionHelper::AllowAutoInstall(const string &extension) { @@ -398,7 +399,7 @@ ExtensionLoadResult ExtensionHelper::LoadExtensionInternal(DuckDB &db, const std return ExtensionLoadResult::LOADED_EXTENSION; } -static vector public_keys = { +static const char *const public_keys[] = { R"( -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6aZuHUa1cLR9YDDYaEfi @@ -618,10 +619,14 @@ SLWQo0+/ciQ21Zwz5SwimX8ep1YpqYirO04gcyGZzAfGboXRvdUwA+1bZvuUXdKC EMS5gLv50CzQqJXK9mNzPuYXNUIc4Pw4ssVWe0OfN3Od90gl5uFUwk/G9lWSYnBN 3wIDAQAB -----END PUBLIC KEY----- -)"}; +)", nullptr}; const vector ExtensionHelper::GetPublicKeys() { - return public_keys; + vector keys; + for (idx_t i = 0; public_keys[i]; i++) { + keys.emplace_back(public_keys[i]); + } + return keys; } } // namespace duckdb diff --git a/src/duckdb/src/main/extension/extension_install.cpp b/src/duckdb/src/main/extension/extension_install.cpp index e7943a95..7e182510 100644 --- a/src/duckdb/src/main/extension/extension_install.cpp +++ b/src/duckdb/src/main/extension/extension_install.cpp @@ -19,7 +19,7 @@ namespace duckdb { // Install Extension //===--------------------------------------------------------------------===// const string ExtensionHelper::NormalizeVersionTag(const string &version_tag) { - if (version_tag.length() > 0 && version_tag[0] != 'v') { + if (!version_tag.empty() && version_tag[0] != 'v') { return "v" + version_tag; } return version_tag; diff --git a/src/duckdb/src/main/extension/extension_load.cpp b/src/duckdb/src/main/extension/extension_load.cpp index a001f2b9..002cf4ae 100644 --- a/src/duckdb/src/main/extension/extension_load.cpp +++ b/src/duckdb/src/main/extension/extension_load.cpp @@ -38,7 +38,7 @@ static void ComputeSHA256String(const std::string &to_hash, std::string *res) { static void ComputeSHA256FileSegment(FileHandle *handle, const idx_t start, const idx_t end, std::string *res) { idx_t iter = start; - const idx_t segment_size = 1024 * 8; + const idx_t segment_size = 1024ULL * 8ULL; duckdb_mbedtls::MbedTlsWrapper::SHA256State state; @@ -57,6 +57,39 @@ static void ComputeSHA256FileSegment(FileHandle *handle, const idx_t start, cons } #endif +static string FilterZeroAtEnd(string s) { + while (!s.empty() && s.back() == '\0') { + s.pop_back(); + } + return s; +} + +static string PrettyPrintString(const string &s) { + string res = ""; + for (auto c : s) { + if (StringUtil::CharacterIsAlpha(c) || StringUtil::CharacterIsDigit(c) || c == '_' || c == '-' || c == ' ' || + c == '.') { + res += c; + } else { + uint8_t value = c; + res += "\\x"; + uint8_t first = value / 16; + if (first < 10) { + res.push_back((char)('0' + first)); + } else { + res.push_back((char)('a' + first - 10)); + } + uint8_t second = value % 16; + if (second < 10) { + res.push_back((char)('0' + second)); + } else { + res.push_back((char)('a' + second - 10)); + } + } + } + return res; +} + bool ExtensionHelper::TryInitialLoad(DBConfig &config, FileSystem &fs, const string &extension, ExtensionInitResult &result, string &error) { #ifdef DUCKDB_DISABLE_EXTENSION_LOAD @@ -119,15 +152,66 @@ bool ExtensionHelper::TryInitialLoad(DBConfig &config, FileSystem &fs, const str error = StringUtil::Format("Extension \"%s\" not found.\n%s", filename, message); return false; } - if (!config.options.allow_unsigned_extensions) { - auto handle = fs.OpenFile(filename, FileFlags::FILE_FLAGS_READ); - // signature is the last 256 bytes of the file + string metadata_segment; + metadata_segment.resize(512); + + const std::string engine_version = std::string(GetVersionDirectoryName()); + const std::string engine_platform = std::string(DuckDB::Platform()); + + auto handle = fs.OpenFile(filename, FileFlags::FILE_FLAGS_READ); + + idx_t file_size = handle->GetFileSize(); + + if (file_size < 1024) { + throw InvalidInputException( + "Extension \"%s\" do not have metadata compatible with DuckDB loading it " + "(version %s, platform %s). File size in particular is lower than minimum threshold of 1024", + filename, engine_version, engine_platform); + } + + auto metadata_offset = file_size - metadata_segment.size(); + + handle->Read((void *)metadata_segment.data(), metadata_segment.size(), metadata_offset); + + std::vector metadata_field; + for (idx_t i = 0; i < 8; i++) { + metadata_field.emplace_back(metadata_segment, i * 32, 32); + } - string signature; - signature.resize(256); + std::reverse(metadata_field.begin(), metadata_field.end()); + + std::string extension_duckdb_platform = FilterZeroAtEnd(metadata_field[1]); + std::string extension_duckdb_version = FilterZeroAtEnd(metadata_field[2]); + std::string extension_version = FilterZeroAtEnd(metadata_field[3]); + + string metadata_mismatch_error = ""; + { + char a[32] = {0}; + a[0] = '4'; + if (strncmp(a, metadata_field[0].data(), 32) != 0) { + // metadata do not looks right, add this to the error message + metadata_mismatch_error = + "\n" + StringUtil::Format("Extension \"%s\" do not have metadata compatible with DuckDB " + "loading it (version %s, platform %s)", + filename, engine_version, engine_platform); + } else if (engine_version != extension_duckdb_version || engine_platform != extension_duckdb_platform) { + metadata_mismatch_error = "\n" + StringUtil::Format("Extension \"%s\" (version %s, platfrom %s) does not " + "match DuckDB loading it (version %s, platform %s)", + filename, PrettyPrintString(extension_duckdb_version), + PrettyPrintString(extension_duckdb_platform), + engine_version, engine_platform); + + } else { + // All looks good + } + } + + if (!config.options.allow_unsigned_extensions) { + // signature is the last 256 bytes of the file + string signature(metadata_segment, metadata_segment.size() - 256); - auto signature_offset = handle->GetFileSize() - signature.size(); + auto signature_offset = metadata_offset + metadata_segment.size() - signature.size(); const idx_t maxLenChunks = 1024ULL * 1024ULL; const idx_t numChunks = (signature_offset + maxLenChunks - 1) / maxLenChunks; @@ -176,9 +260,26 @@ bool ExtensionHelper::TryInitialLoad(DBConfig &config, FileSystem &fs, const str } } if (!any_valid) { - throw IOException(config.error_manager->FormatException(ErrorType::UNSIGNED_EXTENSION, filename)); + throw IOException(config.error_manager->FormatException(ErrorType::UNSIGNED_EXTENSION, filename) + + metadata_mismatch_error); + } + + if (!metadata_mismatch_error.empty()) { + // Signed extensions perform the full check + throw InvalidInputException(metadata_mismatch_error.substr(1)); + } + } else if (!config.options.allow_extensions_metadata_mismatch) { + if (!metadata_mismatch_error.empty()) { + // Unsigned extensions AND configuration allowing metadata_mismatch_error, loading allowed, mainly for + // debugging purposes + throw InvalidInputException(metadata_mismatch_error.substr(1)); } } + + auto number_metadata_fields = 3; + D_ASSERT(number_metadata_fields == 3); // Currently hardcoded value + metadata_field.resize(number_metadata_fields + 1); + auto filebase = fs.ExtractBaseName(filename); #ifdef WASM_LOADABLE_EXTENSIONS @@ -210,35 +311,8 @@ bool ExtensionHelper::TryInitialLoad(DBConfig &config, FileSystem &fs, const str auto lowercase_extension_name = StringUtil::Lower(filebase); - ext_version_fun_t version_fun; - auto version_fun_name = lowercase_extension_name + "_version"; - - version_fun = LoadFunctionFromDLL(lib_hdl, version_fun_name, filename); - - std::string engine_version = std::string(DuckDB::LibraryVersion()); - - auto version_fun_result = (*version_fun)(); - if (version_fun_result == nullptr) { - throw InvalidInputException("Extension \"%s\" returned a nullptr", filename); - } - std::string extension_version = std::string(version_fun_result); - - // Trim v's if necessary - std::string extension_version_trimmed = extension_version; - std::string engine_version_trimmed = engine_version; - if (extension_version.length() > 0 && extension_version[0] == 'v') { - extension_version_trimmed = extension_version.substr(1); - } - if (engine_version.length() > 0 && engine_version[0] == 'v') { - engine_version_trimmed = engine_version.substr(1); - } - - if (extension_version_trimmed != engine_version_trimmed) { - throw InvalidInputException("Extension \"%s\" version (%s) does not match DuckDB version (%s)", filename, - extension_version, engine_version); - } - result.filebase = lowercase_extension_name; + result.extension_version = extension_version; result.filename = filename; result.lib_hdl = lib_hdl; return true; @@ -304,7 +378,7 @@ void ExtensionHelper::LoadExternalExtension(DatabaseInstance &db, FileSystem &fs init_fun_name, res.filename, error.RawMessage()); } - db.SetExtensionLoaded(extension); + db.SetExtensionLoaded(extension, res.extension_version); #endif } diff --git a/src/duckdb/src/main/query_profiler.cpp b/src/duckdb/src/main/query_profiler.cpp index fc223796..176b1e43 100644 --- a/src/duckdb/src/main/query_profiler.cpp +++ b/src/duckdb/src/main/query_profiler.cpp @@ -284,10 +284,6 @@ void OperatorProfiler::Flush(const PhysicalOperator &phys_op, ExpressionExecutor return; } auto &operator_timing = timings.find(phys_op)->second; - if (int(operator_timing.executors_info.size()) <= id) { - operator_timing.executors_info.resize(id + 1); - } - operator_timing.executors_info[id] = make_uniq(expression_executor, name, id); operator_timing.name = phys_op.GetName(); } @@ -307,16 +303,6 @@ void QueryProfiler::Flush(OperatorProfiler &profiler) { if (!IsDetailedEnabled()) { continue; } - for (auto &info : node.second.executors_info) { - if (!info) { - continue; - } - auto info_id = info->id; - if (int32_t(tree_node.info.executors_info.size()) <= info_id) { - tree_node.info.executors_info.resize(info_id + 1); - } - tree_node.info.executors_info[info_id] = std::move(info); - } } profiler.timings.clear(); } @@ -484,70 +470,12 @@ static string JSONSanitize(const string &text) { return result; } -// Print a row -static void PrintRow(std::ostream &ss, const string &annotation, int id, const string &name, double time, - int sample_counter, int tuple_counter, const string &extra_info, int depth) { - ss << string(depth * 3, ' ') << " {\n"; - ss << string(depth * 3, ' ') << " \"annotation\": \"" + JSONSanitize(annotation) + "\",\n"; - ss << string(depth * 3, ' ') << " \"id\": " + to_string(id) + ",\n"; - ss << string(depth * 3, ' ') << " \"name\": \"" + JSONSanitize(name) + "\",\n"; -#if defined(RDTSC) - ss << string(depth * 3, ' ') << " \"timing\": \"NULL\" ,\n"; - ss << string(depth * 3, ' ') << " \"cycles_per_tuple\": " + StringUtil::Format("%.4f", time) + ",\n"; -#else - ss << string(depth * 3, ' ') << " \"timing\":" + to_string(time) + ",\n"; - ss << string(depth * 3, ' ') << " \"cycles_per_tuple\": \"NULL\" ,\n"; -#endif - ss << string(depth * 3, ' ') << " \"sample_size\": " << to_string(sample_counter) + ",\n"; - ss << string(depth * 3, ' ') << " \"input_size\": " << to_string(tuple_counter) + ",\n"; - ss << string(depth * 3, ' ') << " \"extra_info\": \"" << JSONSanitize(extra_info) + "\"\n"; - ss << string(depth * 3, ' ') << " },\n"; -} - -static void ExtractFunctions(std::ostream &ss, ExpressionInfo &info, int &fun_id, int depth) { - if (info.hasfunction) { - double time = info.sample_tuples_count == 0 ? 0 : int(info.function_time) / double(info.sample_tuples_count); - PrintRow(ss, "Function", fun_id++, info.function_name, time, NumericCast(info.sample_tuples_count), - NumericCast(info.tuples_count), "", NumericCast(depth)); - } - if (info.children.empty()) { - return; - } - // extract the children of this node - for (auto &child : info.children) { - ExtractFunctions(ss, *child, fun_id, depth); - } -} - -static void ToJSONRecursive(QueryProfiler::TreeNode &node, std::ostream &ss, int depth = 1) { +static void ToJSONRecursive(QueryProfiler::TreeNode &node, std::ostream &ss, idx_t depth = 1) { ss << string(depth * 3, ' ') << " {\n"; ss << string(depth * 3, ' ') << " \"name\": \"" + JSONSanitize(node.name) + "\",\n"; ss << string(depth * 3, ' ') << " \"timing\":" + to_string(node.info.time) + ",\n"; ss << string(depth * 3, ' ') << " \"cardinality\":" + to_string(node.info.elements) + ",\n"; ss << string(depth * 3, ' ') << " \"extra_info\": \"" + JSONSanitize(node.extra_info) + "\",\n"; - ss << string(depth * 3, ' ') << " \"timings\": ["; - int32_t function_counter = 1; - int32_t expression_counter = 1; - ss << "\n "; - for (auto &expr_executor : node.info.executors_info) { - // For each Expression tree - if (!expr_executor) { - continue; - } - for (auto &expr_timer : expr_executor->roots) { - double time = expr_timer->sample_tuples_count == 0 - ? 0 - : double(expr_timer->time) / double(expr_timer->sample_tuples_count); - PrintRow(ss, "ExpressionRoot", expression_counter++, expr_timer->name, time, - NumericCast(expr_timer->sample_tuples_count), NumericCast(expr_timer->tuples_count), - expr_timer->extra_info, depth + 1); - // Extract all functions inside the tree - ExtractFunctions(ss, *expr_timer->root, function_counter, depth + 1); - } - } - ss.seekp(-2, ss.cur); - ss << "\n"; - ss << string(depth * 3, ' ') << " ],\n"; ss << string(depth * 3, ' ') << " \"children\": [\n"; if (node.children.empty()) { ss << string(depth * 3, ' ') << " ]\n"; @@ -664,49 +592,4 @@ vector QueryProfiler::GetOrderedPhaseTimings() c void QueryProfiler::Propagate(QueryProfiler &qp) { } -void ExpressionInfo::ExtractExpressionsRecursive(unique_ptr &state) { - if (state->child_states.empty()) { - return; - } - // extract the children of this node - for (auto &child : state->child_states) { - auto expr_info = make_uniq(); - if (child->expr.expression_class == ExpressionClass::BOUND_FUNCTION) { - expr_info->hasfunction = true; - expr_info->function_name = child->expr.Cast().function.ToString(); - expr_info->function_time = child->profiler.time; - expr_info->sample_tuples_count = child->profiler.sample_tuples_count; - expr_info->tuples_count = child->profiler.tuples_count; - } - expr_info->ExtractExpressionsRecursive(child); - children.push_back(std::move(expr_info)); - } - return; -} - -ExpressionExecutorInfo::ExpressionExecutorInfo(ExpressionExecutor &executor, const string &name, int id) : id(id) { - // Extract Expression Root Information from ExpressionExecutorStats - for (auto &state : executor.GetStates()) { - roots.push_back(make_uniq(*state, name)); - } -} - -ExpressionRootInfo::ExpressionRootInfo(ExpressionExecutorState &state, string name) - : current_count(state.profiler.current_count), sample_count(state.profiler.sample_count), - sample_tuples_count(state.profiler.sample_tuples_count), tuples_count(state.profiler.tuples_count), - name("expression"), time(state.profiler.time) { - // Use the name of expression-tree as extra-info - extra_info = std::move(name); - auto expression_info_p = make_uniq(); - // Maybe root has a function - if (state.root_state->expr.expression_class == ExpressionClass::BOUND_FUNCTION) { - expression_info_p->hasfunction = true; - expression_info_p->function_name = (state.root_state->expr.Cast()).function.name; - expression_info_p->function_time = state.root_state->profiler.time; - expression_info_p->sample_tuples_count = state.root_state->profiler.sample_tuples_count; - expression_info_p->tuples_count = state.root_state->profiler.tuples_count; - } - expression_info_p->ExtractExpressionsRecursive(state.root_state); - root = std::move(expression_info_p); -} } // namespace duckdb diff --git a/src/duckdb/src/main/secret/secret_manager.cpp b/src/duckdb/src/main/secret/secret_manager.cpp index a02b41f9..8d827f32 100644 --- a/src/duckdb/src/main/secret/secret_manager.cpp +++ b/src/duckdb/src/main/secret/secret_manager.cpp @@ -285,7 +285,7 @@ BoundStatement SecretManager::BindCreateSecret(CatalogTransaction transaction, C BoundStatement result; result.names = {"Success"}; result.types = {LogicalType::BOOLEAN}; - result.plan = make_uniq(*function, std::move(bound_info)); + result.plan = make_uniq(std::move(bound_info)); return result; } @@ -607,7 +607,6 @@ unique_ptr DefaultSecretGenerator::CreateDefaultEntry(ClientContex auto deserialized_secret = secret_manager.DeserializeSecret(deserializer); deserializer.End(); - auto name = deserialized_secret->GetName(); auto entry = make_uniq(std::move(deserialized_secret), catalog); entry->secret->storage_mode = SecretManager::LOCAL_FILE_STORAGE_NAME; entry->secret->persist_type = SecretPersistType::PERSISTENT; diff --git a/src/duckdb/src/main/secret/secret_storage.cpp b/src/duckdb/src/main/secret/secret_storage.cpp index 6179800b..4173f9de 100644 --- a/src/duckdb/src/main/secret/secret_storage.cpp +++ b/src/duckdb/src/main/secret/secret_storage.cpp @@ -66,7 +66,7 @@ unique_ptr CatalogSetSecretStorage::StoreSecret(unique_ptrtemporary = !persistent; secret_entry->secret->storage_mode = storage_name; secret_entry->secret->persist_type = persistent ? SecretPersistType::PERSISTENT : SecretPersistType::TEMPORARY; - DependencyList l; + LogicalDependencyList l; secrets->CreateEntry(GetTransactionOrDefault(transaction), secret_name, std::move(secret_entry), l); auto secret_catalog_entry = diff --git a/src/duckdb/src/main/settings/settings.cpp b/src/duckdb/src/main/settings/settings.cpp index c38f542f..36d0036c 100644 --- a/src/duckdb/src/main/settings/settings.cpp +++ b/src/duckdb/src/main/settings/settings.cpp @@ -47,7 +47,7 @@ void AccessModeSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.access_mode = DBConfig().options.access_mode; } -Value AccessModeSetting::GetSetting(ClientContext &context) { +Value AccessModeSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); switch (config.options.access_mode) { case AccessMode::AUTOMATIC: @@ -73,7 +73,7 @@ void AllowPersistentSecrets::ResetGlobal(DatabaseInstance *db, DBConfig &config) config.secret_manager->ResetEnablePersistentSecrets(); } -Value AllowPersistentSecrets::GetSetting(ClientContext &context) { +Value AllowPersistentSecrets::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.secret_manager->PersistentSecretsEnabled()); } @@ -90,7 +90,7 @@ void CheckpointThresholdSetting::ResetGlobal(DatabaseInstance *db, DBConfig &con config.options.checkpoint_wal_size = DBConfig().options.checkpoint_wal_size; } -Value CheckpointThresholdSetting::GetSetting(ClientContext &context) { +Value CheckpointThresholdSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(StringUtil::BytesToHumanReadableString(config.options.checkpoint_wal_size)); } @@ -118,7 +118,7 @@ void DebugCheckpointAbort::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.checkpoint_abort = DBConfig().options.checkpoint_abort; } -Value DebugCheckpointAbort::GetSetting(ClientContext &context) { +Value DebugCheckpointAbort::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(*context.db); auto setting = config.options.checkpoint_abort; switch (setting) { @@ -146,7 +146,7 @@ void DebugForceExternal::SetLocal(ClientContext &context, const Value &input) { ClientConfig::GetConfig(context).force_external = input.GetValue(); } -Value DebugForceExternal::GetSetting(ClientContext &context) { +Value DebugForceExternal::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).force_external); } @@ -161,7 +161,7 @@ void DebugForceNoCrossProduct::SetLocal(ClientContext &context, const Value &inp ClientConfig::GetConfig(context).force_no_cross_product = input.GetValue(); } -Value DebugForceNoCrossProduct::GetSetting(ClientContext &context) { +Value DebugForceNoCrossProduct::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).force_no_cross_product); } @@ -180,7 +180,7 @@ void OrderedAggregateThreshold::SetLocal(ClientContext &context, const Value &in ClientConfig::GetConfig(context).ordered_aggregate_threshold = param; } -Value OrderedAggregateThreshold::GetSetting(ClientContext &context) { +Value OrderedAggregateThreshold::GetSetting(const ClientContext &context) { return Value::UBIGINT(ClientConfig::GetConfig(context).ordered_aggregate_threshold); } @@ -204,7 +204,7 @@ void DebugWindowMode::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.window_mode = DBConfig().options.window_mode; } -Value DebugWindowMode::GetSetting(ClientContext &context) { +Value DebugWindowMode::GetSetting(const ClientContext &context) { return Value(); } @@ -219,7 +219,7 @@ void DebugAsOfIEJoin::SetLocal(ClientContext &context, const Value &input) { ClientConfig::GetConfig(context).force_asof_iejoin = input.GetValue(); } -Value DebugAsOfIEJoin::GetSetting(ClientContext &context) { +Value DebugAsOfIEJoin::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).force_asof_iejoin); } @@ -234,7 +234,7 @@ void PreferRangeJoins::SetLocal(ClientContext &context, const Value &input) { ClientConfig::GetConfig(context).prefer_range_joins = input.GetValue(); } -Value PreferRangeJoins::GetSetting(ClientContext &context) { +Value PreferRangeJoins::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).prefer_range_joins); } @@ -263,7 +263,7 @@ void DefaultCollationSetting::SetLocal(ClientContext &context, const Value &inpu config.options.collation = parameter; } -Value DefaultCollationSetting::GetSetting(ClientContext &context) { +Value DefaultCollationSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(config.options.collation); } @@ -287,7 +287,7 @@ void DefaultOrderSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.default_order_type = DBConfig().options.default_order_type; } -Value DefaultOrderSetting::GetSetting(ClientContext &context) { +Value DefaultOrderSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); switch (config.options.default_order_type) { case OrderType::ASCENDING: @@ -325,7 +325,7 @@ void DefaultNullOrderSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config config.options.default_null_order = DBConfig().options.default_null_order; } -Value DefaultNullOrderSetting::GetSetting(ClientContext &context) { +Value DefaultNullOrderSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); switch (config.options.default_null_order) { case DefaultOrderByNullType::NULLS_FIRST: @@ -352,7 +352,7 @@ void DefaultSecretStorage::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.secret_manager->ResetDefaultStorage(); } -Value DefaultSecretStorage::GetSetting(ClientContext &context) { +Value DefaultSecretStorage::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return config.secret_manager->DefaultStorage(); } @@ -377,7 +377,7 @@ void DisabledFileSystemsSetting::ResetGlobal(DatabaseInstance *db, DBConfig &con fs.SetDisabledFileSystems(vector()); } -Value DisabledFileSystemsSetting::GetSetting(ClientContext &context) { +Value DisabledFileSystemsSetting::GetSetting(const ClientContext &context) { return Value(""); } @@ -402,7 +402,7 @@ void DisabledOptimizersSetting::ResetGlobal(DatabaseInstance *db, DBConfig &conf config.options.disabled_optimizers = DBConfig().options.disabled_optimizers; } -Value DisabledOptimizersSetting::GetSetting(ClientContext &context) { +Value DisabledOptimizersSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); string result; for (auto &optimizer : config.options.disabled_optimizers) { @@ -432,7 +432,7 @@ void EnableExternalAccessSetting::ResetGlobal(DatabaseInstance *db, DBConfig &co config.options.enable_external_access = DBConfig().options.enable_external_access; } -Value EnableExternalAccessSetting::GetSetting(ClientContext &context) { +Value EnableExternalAccessSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.enable_external_access); } @@ -448,7 +448,7 @@ void EnableFSSTVectors::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.enable_fsst_vectors = DBConfig().options.enable_fsst_vectors; } -Value EnableFSSTVectors::GetSetting(ClientContext &context) { +Value EnableFSSTVectors::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.enable_fsst_vectors); } @@ -471,11 +471,28 @@ void AllowUnsignedExtensionsSetting::ResetGlobal(DatabaseInstance *db, DBConfig config.options.allow_unsigned_extensions = DBConfig().options.allow_unsigned_extensions; } -Value AllowUnsignedExtensionsSetting::GetSetting(ClientContext &context) { +Value AllowUnsignedExtensionsSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.allow_unsigned_extensions); } +//===--------------------------------------------------------------------===// +// Allow Extensions Metadata Mismatch +//===--------------------------------------------------------------------===// +void AllowExtensionsMetadataMismatchSetting::SetGlobal(DatabaseInstance *db, DBConfig &config, const Value &input) { + auto new_value = input.GetValue(); + config.options.allow_extensions_metadata_mismatch = new_value; +} + +void AllowExtensionsMetadataMismatchSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { + config.options.allow_extensions_metadata_mismatch = DBConfig().options.allow_extensions_metadata_mismatch; +} + +Value AllowExtensionsMetadataMismatchSetting::GetSetting(const ClientContext &context) { + auto &config = DBConfig::GetConfig(context); + return Value::BOOLEAN(config.options.allow_extensions_metadata_mismatch); +} + //===--------------------------------------------------------------------===// // Allow Unredacted Secrets //===--------------------------------------------------------------------===// @@ -494,7 +511,7 @@ void AllowUnredactedSecretsSetting::ResetGlobal(DatabaseInstance *db, DBConfig & config.options.allow_unredacted_secrets = DBConfig().options.allow_unredacted_secrets; } -Value AllowUnredactedSecretsSetting::GetSetting(ClientContext &context) { +Value AllowUnredactedSecretsSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.allow_unredacted_secrets); } @@ -510,7 +527,7 @@ void EnableObjectCacheSetting::ResetGlobal(DatabaseInstance *db, DBConfig &confi config.options.object_cache_enable = DBConfig().options.object_cache_enable; } -Value EnableObjectCacheSetting::GetSetting(ClientContext &context) { +Value EnableObjectCacheSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.object_cache_enable); } @@ -526,7 +543,7 @@ void EnableHTTPMetadataCacheSetting::ResetGlobal(DatabaseInstance *db, DBConfig config.options.http_metadata_cache_enable = DBConfig().options.http_metadata_cache_enable; } -Value EnableHTTPMetadataCacheSetting::GetSetting(ClientContext &context) { +Value EnableHTTPMetadataCacheSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.http_metadata_cache_enable); } @@ -559,7 +576,7 @@ void EnableProfilingSetting::SetLocal(ClientContext &context, const Value &input config.emit_profiler_output = true; } -Value EnableProfilingSetting::GetSetting(ClientContext &context) { +Value EnableProfilingSetting::GetSetting(const ClientContext &context) { auto &config = ClientConfig::GetConfig(context); if (!config.enable_profiler) { return Value(); @@ -587,7 +604,7 @@ void CustomExtensionRepository::SetGlobal(DatabaseInstance *db, DBConfig &config config.options.custom_extension_repo = input.ToString(); } -Value CustomExtensionRepository::GetSetting(ClientContext &context) { +Value CustomExtensionRepository::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(config.options.custom_extension_repo); } @@ -603,7 +620,7 @@ void AutoloadExtensionRepository::SetGlobal(DatabaseInstance *db, DBConfig &conf config.options.autoinstall_extension_repo = input.ToString(); } -Value AutoloadExtensionRepository::GetSetting(ClientContext &context) { +Value AutoloadExtensionRepository::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(config.options.autoinstall_extension_repo); } @@ -619,7 +636,7 @@ void AutoinstallKnownExtensions::ResetGlobal(DatabaseInstance *db, DBConfig &con config.options.autoinstall_known_extensions = DBConfig().options.autoinstall_known_extensions; } -Value AutoinstallKnownExtensions::GetSetting(ClientContext &context) { +Value AutoinstallKnownExtensions::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.autoinstall_known_extensions); } @@ -634,7 +651,7 @@ void AutoloadKnownExtensions::ResetGlobal(DatabaseInstance *db, DBConfig &config config.options.autoload_known_extensions = DBConfig().options.autoload_known_extensions; } -Value AutoloadKnownExtensions::GetSetting(ClientContext &context) { +Value AutoloadKnownExtensions::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.autoload_known_extensions); } @@ -654,7 +671,7 @@ void EnableProgressBarSetting::SetLocal(ClientContext &context, const Value &inp config.enable_progress_bar = input.GetValue(); } -Value EnableProgressBarSetting::GetSetting(ClientContext &context) { +Value EnableProgressBarSetting::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).enable_progress_bar); } @@ -673,7 +690,7 @@ void EnableProgressBarPrintSetting::ResetLocal(ClientContext &context) { config.print_progress_bar = ClientConfig().print_progress_bar; } -Value EnableProgressBarPrintSetting::GetSetting(ClientContext &context) { +Value EnableProgressBarPrintSetting::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).print_progress_bar); } @@ -688,7 +705,7 @@ void ErrorsAsJsonSetting::SetLocal(ClientContext &context, const Value &input) { ClientConfig::GetConfig(context).errors_as_json = BooleanValue::Get(input); } -Value ErrorsAsJsonSetting::GetSetting(ClientContext &context) { +Value ErrorsAsJsonSetting::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).errors_as_json ? 1 : 0); } @@ -713,7 +730,7 @@ void ExplainOutputSetting::SetLocal(ClientContext &context, const Value &input) } } -Value ExplainOutputSetting::GetSetting(ClientContext &context) { +Value ExplainOutputSetting::GetSetting(const ClientContext &context) { switch (ClientConfig::GetConfig(context).explain_output_type) { case ExplainOutputType::ALL: return "all"; @@ -730,7 +747,6 @@ Value ExplainOutputSetting::GetSetting(ClientContext &context) { // Extension Directory Setting //===--------------------------------------------------------------------===// void ExtensionDirectorySetting::SetGlobal(DatabaseInstance *db, DBConfig &config, const Value &input) { - auto new_directory = input.ToString(); config.options.extension_directory = input.ToString(); } @@ -738,7 +754,7 @@ void ExtensionDirectorySetting::ResetGlobal(DatabaseInstance *db, DBConfig &conf config.options.extension_directory = DBConfig().options.extension_directory; } -Value ExtensionDirectorySetting::GetSetting(ClientContext &context) { +Value ExtensionDirectorySetting::GetSetting(const ClientContext &context) { return Value(DBConfig::GetConfig(context).options.extension_directory); } @@ -765,7 +781,7 @@ void ExternalThreadsSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) config.options.external_threads = new_external_threads; } -Value ExternalThreadsSetting::GetSetting(ClientContext &context) { +Value ExternalThreadsSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BIGINT(config.options.external_threads); } @@ -784,7 +800,7 @@ void FileSearchPathSetting::SetLocal(ClientContext &context, const Value &input) client_data.file_search_path = parameter; } -Value FileSearchPathSetting::GetSetting(ClientContext &context) { +Value FileSearchPathSetting::GetSetting(const ClientContext &context) { auto &client_data = ClientData::Get(context); return Value(client_data.file_search_path); } @@ -814,7 +830,7 @@ void ForceCompressionSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config config.options.force_compression = DBConfig().options.force_compression; } -Value ForceCompressionSetting::GetSetting(ClientContext &context) { +Value ForceCompressionSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(*context.db); return CompressionTypeToString(config.options.force_compression); } @@ -836,7 +852,7 @@ void ForceBitpackingModeSetting::ResetGlobal(DatabaseInstance *db, DBConfig &con config.options.force_bitpacking_mode = DBConfig().options.force_bitpacking_mode; } -Value ForceBitpackingModeSetting::GetSetting(ClientContext &context) { +Value ForceBitpackingModeSetting::GetSetting(const ClientContext &context) { return Value(BitpackingModeToString(context.db->config.options.force_bitpacking_mode)); } @@ -857,7 +873,7 @@ void HomeDirectorySetting::SetLocal(ClientContext &context, const Value &input) config.home_directory = input.IsNull() ? string() : input.ToString(); } -Value HomeDirectorySetting::GetSetting(ClientContext &context) { +Value HomeDirectorySetting::GetSetting(const ClientContext &context) { auto &config = ClientConfig::GetConfig(context); return Value(config.home_directory); } @@ -874,7 +890,7 @@ void IntegerDivisionSetting::SetLocal(ClientContext &context, const Value &input config.integer_division = input.GetValue(); } -Value IntegerDivisionSetting::GetSetting(ClientContext &context) { +Value IntegerDivisionSetting::GetSetting(const ClientContext &context) { auto &config = ClientConfig::GetConfig(context); return Value(config.integer_division); } @@ -900,7 +916,7 @@ void LogQueryPathSetting::SetLocal(ClientContext &context, const Value &input) { } } -Value LogQueryPathSetting::GetSetting(ClientContext &context) { +Value LogQueryPathSetting::GetSetting(const ClientContext &context) { auto &client_data = ClientData::Get(context); return client_data.log_query_writer ? Value(client_data.log_query_writer->path) : Value(); } @@ -917,7 +933,7 @@ void LockConfigurationSetting::ResetGlobal(DatabaseInstance *db, DBConfig &confi config.options.lock_configuration = DBConfig().options.lock_configuration; } -Value LockConfigurationSetting::GetSetting(ClientContext &context) { +Value LockConfigurationSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.lock_configuration); } @@ -933,7 +949,7 @@ void ImmediateTransactionModeSetting::ResetGlobal(DatabaseInstance *db, DBConfig config.options.immediate_transaction_mode = DBConfig().options.immediate_transaction_mode; } -Value ImmediateTransactionModeSetting::GetSetting(ClientContext &context) { +Value ImmediateTransactionModeSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.immediate_transaction_mode); } @@ -949,7 +965,7 @@ void MaximumExpressionDepthSetting::SetLocal(ClientContext &context, const Value ClientConfig::GetConfig(context).max_expression_depth = input.GetValue(); } -Value MaximumExpressionDepthSetting::GetSetting(ClientContext &context) { +Value MaximumExpressionDepthSetting::GetSetting(const ClientContext &context) { return Value::UBIGINT(ClientConfig::GetConfig(context).max_expression_depth); } @@ -967,7 +983,7 @@ void MaximumMemorySetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.SetDefaultMaxMemory(); } -Value MaximumMemorySetting::GetSetting(ClientContext &context) { +Value MaximumMemorySetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(StringUtil::BytesToHumanReadableString(config.options.maximum_memory)); } @@ -983,7 +999,7 @@ void OldImplicitCasting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.old_implicit_casting = DBConfig().options.old_implicit_casting; } -Value OldImplicitCasting::GetSetting(ClientContext &context) { +Value OldImplicitCasting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.old_implicit_casting); } @@ -1000,7 +1016,7 @@ void PartitionedWriteFlushThreshold::SetLocal(ClientContext &context, const Valu ClientConfig::GetConfig(context).partitioned_write_flush_threshold = input.GetValue(); } -Value PartitionedWriteFlushThreshold::GetSetting(ClientContext &context) { +Value PartitionedWriteFlushThreshold::GetSetting(const ClientContext &context) { return Value::BIGINT(ClientConfig::GetConfig(context).partitioned_write_flush_threshold); } @@ -1015,7 +1031,7 @@ void PasswordSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { // nop } -Value PasswordSetting::GetSetting(ClientContext &context) { +Value PasswordSetting::GetSetting(const ClientContext &context) { return Value(); } @@ -1034,7 +1050,7 @@ void PerfectHashThresholdSetting::SetLocal(ClientContext &context, const Value & ClientConfig::GetConfig(context).perfect_ht_threshold = bits; } -Value PerfectHashThresholdSetting::GetSetting(ClientContext &context) { +Value PerfectHashThresholdSetting::GetSetting(const ClientContext &context) { return Value::BIGINT(ClientConfig::GetConfig(context).perfect_ht_threshold); } @@ -1049,7 +1065,7 @@ void PivotFilterThreshold::SetLocal(ClientContext &context, const Value &input) ClientConfig::GetConfig(context).pivot_filter_threshold = input.GetValue(); } -Value PivotFilterThreshold::GetSetting(ClientContext &context) { +Value PivotFilterThreshold::GetSetting(const ClientContext &context) { return Value::BIGINT(ClientConfig::GetConfig(context).pivot_filter_threshold); } @@ -1064,7 +1080,7 @@ void PivotLimitSetting::SetLocal(ClientContext &context, const Value &input) { ClientConfig::GetConfig(context).pivot_limit = input.GetValue(); } -Value PivotLimitSetting::GetSetting(ClientContext &context) { +Value PivotLimitSetting::GetSetting(const ClientContext &context) { return Value::BIGINT(ClientConfig::GetConfig(context).pivot_limit); } @@ -1079,7 +1095,7 @@ void PreserveIdentifierCase::SetLocal(ClientContext &context, const Value &input ClientConfig::GetConfig(context).preserve_identifier_case = input.GetValue(); } -Value PreserveIdentifierCase::GetSetting(ClientContext &context) { +Value PreserveIdentifierCase::GetSetting(const ClientContext &context) { return Value::BOOLEAN(ClientConfig::GetConfig(context).preserve_identifier_case); } @@ -1094,7 +1110,7 @@ void PreserveInsertionOrder::ResetGlobal(DatabaseInstance *db, DBConfig &config) config.options.preserve_insertion_order = DBConfig().options.preserve_insertion_order; } -Value PreserveInsertionOrder::GetSetting(ClientContext &context) { +Value PreserveInsertionOrder::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BOOLEAN(config.options.preserve_insertion_order); } @@ -1112,7 +1128,7 @@ void ExportLargeBufferArrow::ResetGlobal(DatabaseInstance *db, DBConfig &config) config.options.arrow_offset_size = DBConfig().options.arrow_offset_size; } -Value ExportLargeBufferArrow::GetSetting(ClientContext &context) { +Value ExportLargeBufferArrow::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); bool export_large_buffers_arrow = config.options.arrow_offset_size == ArrowOffsetSize::LARGE; return Value::BOOLEAN(export_large_buffers_arrow); @@ -1131,7 +1147,7 @@ void ProfileOutputSetting::SetLocal(ClientContext &context, const Value &input) config.profiler_save_location = parameter; } -Value ProfileOutputSetting::GetSetting(ClientContext &context) { +Value ProfileOutputSetting::GetSetting(const ClientContext &context) { auto &config = ClientConfig::GetConfig(context); return Value(config.profiler_save_location); } @@ -1161,7 +1177,7 @@ void ProfilingModeSetting::SetLocal(ClientContext &context, const Value &input) } } -Value ProfilingModeSetting::GetSetting(ClientContext &context) { +Value ProfilingModeSetting::GetSetting(const ClientContext &context) { auto &config = ClientConfig::GetConfig(context); if (!config.enable_profiler) { return Value(); @@ -1186,7 +1202,7 @@ void ProgressBarTimeSetting::SetLocal(ClientContext &context, const Value &input config.enable_progress_bar = true; } -Value ProgressBarTimeSetting::GetSetting(ClientContext &context) { +Value ProgressBarTimeSetting::GetSetting(const ClientContext &context) { return Value::BIGINT(ClientConfig::GetConfig(context).wait_time); } @@ -1205,7 +1221,7 @@ void SchemaSetting::SetLocal(ClientContext &context, const Value &input) { client_data.catalog_search_path->Set(CatalogSearchEntry::Parse(parameter), CatalogSetPathType::SET_SCHEMA); } -Value SchemaSetting::GetSetting(ClientContext &context) { +Value SchemaSetting::GetSetting(const ClientContext &context) { auto &client_data = ClientData::Get(context); return client_data.catalog_search_path->GetDefault().schema; } @@ -1225,7 +1241,7 @@ void SearchPathSetting::SetLocal(ClientContext &context, const Value &input) { client_data.catalog_search_path->Set(CatalogSearchEntry::ParseList(parameter), CatalogSetPathType::SET_SCHEMAS); } -Value SearchPathSetting::GetSetting(ClientContext &context) { +Value SearchPathSetting::GetSetting(const ClientContext &context) { auto &client_data = ClientData::Get(context); auto &set_paths = client_data.catalog_search_path->GetSetPaths(); return Value(CatalogSearchEntry::ListToString(set_paths)); @@ -1242,7 +1258,7 @@ void SecretDirectorySetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) config.secret_manager->ResetPersistentSecretPath(); } -Value SecretDirectorySetting::GetSetting(ClientContext &context) { +Value SecretDirectorySetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return config.secret_manager->PersistentSecretPath(); } @@ -1268,7 +1284,7 @@ void TempDirectorySetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { } } -Value TempDirectorySetting::GetSetting(ClientContext &context) { +Value TempDirectorySetting::GetSetting(const ClientContext &context) { auto &buffer_manager = BufferManager::GetBufferManager(context); return Value(buffer_manager.GetTemporaryDirectory()); } @@ -1296,7 +1312,7 @@ void ThreadsSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.maximum_threads = new_maximum_threads; } -Value ThreadsSetting::GetSetting(ClientContext &context) { +Value ThreadsSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value::BIGINT(config.options.maximum_threads); } @@ -1312,7 +1328,7 @@ void UsernameSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { // nop } -Value UsernameSetting::GetSetting(ClientContext &context) { +Value UsernameSetting::GetSetting(const ClientContext &context) { return Value(); } @@ -1333,7 +1349,7 @@ void FlushAllocatorSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) } } -Value FlushAllocatorSetting::GetSetting(ClientContext &context) { +Value FlushAllocatorSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(StringUtil::BytesToHumanReadableString(config.options.allocator_flush_threshold)); } @@ -1357,7 +1373,7 @@ void DuckDBApiSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.duckdb_api = GetDefaultUserAgent(); } -Value DuckDBApiSetting::GetSetting(ClientContext &context) { +Value DuckDBApiSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(config.options.duckdb_api); } @@ -1382,7 +1398,7 @@ void CustomUserAgentSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) config.options.custom_user_agent = DBConfig().options.custom_user_agent; } -Value CustomUserAgentSetting::GetSetting(ClientContext &context) { +Value CustomUserAgentSetting::GetSetting(const ClientContext &context) { auto &config = DBConfig::GetConfig(context); return Value(config.options.custom_user_agent); } diff --git a/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp b/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp index 4d30d5f7..7a934546 100644 --- a/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +++ b/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp @@ -1,4 +1,5 @@ -#include "duckdb/optimizer/column_lifetime_optimizer.hpp" +#include "duckdb/optimizer/column_lifetime_analyzer.hpp" + #include "duckdb/planner/expression/bound_columnref_expression.hpp" #include "duckdb/planner/operator/logical_comparison_join.hpp" #include "duckdb/planner/operator/logical_filter.hpp" @@ -139,6 +140,12 @@ void ColumnLifetimeAnalyzer::VisitOperator(LogicalOperator &op) { // then generate the projection map GenerateProjectionMap(op.children[0]->GetColumnBindings(), unused_bindings, filter.projection_map); + auto bindings = filter.GetColumnBindings(); + + if (bindings.empty()) { + return; + } + return; } default: diff --git a/src/duckdb/src/optimizer/compressed_materialization.cpp b/src/duckdb/src/optimizer/compressed_materialization.cpp index a1fc9912..a034d44f 100644 --- a/src/duckdb/src/optimizer/compressed_materialization.cpp +++ b/src/duckdb/src/optimizer/compressed_materialization.cpp @@ -1,14 +1,15 @@ #include "duckdb/optimizer/compressed_materialization.hpp" #include "duckdb/execution/expression_executor.hpp" +#include "duckdb/function/scalar/compressed_materialization_functions.hpp" #include "duckdb/function/scalar/operators.hpp" #include "duckdb/optimizer/column_binding_replacer.hpp" +#include "duckdb/optimizer/optimizer.hpp" #include "duckdb/optimizer/topn_optimizer.hpp" #include "duckdb/planner/binder.hpp" #include "duckdb/planner/expression/bound_constant_expression.hpp" #include "duckdb/planner/expression/bound_function_expression.hpp" #include "duckdb/planner/expression_iterator.hpp" -#include "duckdb/planner/operator/logical_comparison_join.hpp" #include "duckdb/planner/operator/logical_projection.hpp" namespace duckdb { @@ -30,7 +31,7 @@ CMBindingInfo::CMBindingInfo(ColumnBinding binding_p, const LogicalType &type_p) CompressedMaterializationInfo::CompressedMaterializationInfo(LogicalOperator &op, vector &&child_idxs_p, const column_binding_set_t &referenced_bindings) - : child_idxs(child_idxs_p) { + : child_idxs(std::move(child_idxs_p)) { child_info.reserve(child_idxs.size()); for (const auto &child_idx : child_idxs) { child_info.emplace_back(*op.children[child_idx], referenced_bindings); @@ -41,9 +42,9 @@ CompressExpression::CompressExpression(unique_ptr expression_p, uniq : expression(std::move(expression_p)), stats(std::move(stats_p)) { } -CompressedMaterialization::CompressedMaterialization(ClientContext &context_p, Binder &binder_p, - statistics_map_t &&statistics_map_p) - : context(context_p), binder(binder_p), statistics_map(std::move(statistics_map_p)) { +CompressedMaterialization::CompressedMaterialization(Optimizer &optimizer_p, LogicalOperator &root_p, + statistics_map_t &statistics_map_p) + : optimizer(optimizer_p), context(optimizer.context), root(&root_p), statistics_map(statistics_map_p) { } void CompressedMaterialization::GetReferencedBindings(const Expression &expression, @@ -74,22 +75,21 @@ void CompressedMaterialization::UpdateBindingInfo(CompressedMaterializationInfo } void CompressedMaterialization::Compress(unique_ptr &op) { - root = op.get(); - root->ResolveOperatorTypes(); - - CompressInternal(op); -} - -void CompressedMaterialization::CompressInternal(unique_ptr &op) { if (TopN::CanOptimize(*op)) { // Let's not mess with the TopN optimizer - CompressInternal(op->children[0]->children[0]); return; } - for (auto &child : op->children) { - CompressInternal(child); + switch (op->type) { + case LogicalOperatorType::LOGICAL_AGGREGATE_AND_GROUP_BY: + case LogicalOperatorType::LOGICAL_DISTINCT: + case LogicalOperatorType::LOGICAL_ORDER_BY: + break; + default: + return; } + root->ResolveOperatorTypes(); + switch (op->type) { case LogicalOperatorType::LOGICAL_AGGREGATE_AND_GROUP_BY: CompressAggregate(op); @@ -158,7 +158,7 @@ bool CompressedMaterialization::TryCompressChild(CompressedMaterializationInfo & } void CompressedMaterialization::CreateCompressProjection(unique_ptr &child_op, - vector> &&compress_exprs, + vector> compress_exprs, CompressedMaterializationInfo &info, CMChildInfo &child_info) { // Replace child op with a projection vector> projections; @@ -166,9 +166,8 @@ void CompressedMaterialization::CreateCompressProjection(unique_ptrexpression)); } - const auto table_index = binder.GenerateTableIndex(); + const auto table_index = optimizer.binder.GenerateTableIndex(); auto compress_projection = make_uniq(table_index, std::move(projections)); - compression_table_indices.insert(table_index); compress_projection->ResolveOperatorTypes(); compress_projection->children.emplace_back(std::move(child_op)); @@ -191,7 +190,7 @@ void CompressedMaterialization::CreateCompressProjection(unique_ptr(table_index, std::move(decompress_exprs)); - decompression_table_indices.insert(table_index); decompress_projection->children.emplace_back(std::move(op)); op = std::move(decompress_projection); // Check if we're placing a projection on top of the root - if (op->children[0].get() == root.get()) { - root = op.get(); + if (RefersToSameObject(*op->children[0], *root)) { + root = op; return; } @@ -410,11 +408,11 @@ unique_ptr CompressedMaterialization::GetStringCompress(uniq auto max_string = StringStats::Max(stats); uint8_t min_numeric = 0; - if (max_string_length != 0 && min_string.length() != 0) { + if (max_string_length != 0 && !min_string.empty()) { min_numeric = *reinterpret_cast(min_string.c_str()); } uint8_t max_numeric = 0; - if (max_string_length != 0 && max_string.length() != 0) { + if (max_string_length != 0 && !max_string.empty()) { max_numeric = *reinterpret_cast(max_string.c_str()); } @@ -447,7 +445,7 @@ unique_ptr CompressedMaterialization::GetDecompressExpression(unique if (TypeIsIntegral(type.InternalType())) { return GetIntegralDecompress(std::move(input), result_type, stats); } else if (type.id() == LogicalTypeId::VARCHAR) { - return GetStringDecompress(std::move(input), stats); + return GetStringDecompress(std::move(input), result_type, stats); } else { throw InternalException("Type other than integral/string marked for decompression!"); } @@ -465,13 +463,13 @@ unique_ptr CompressedMaterialization::GetIntegralDecompress(unique_p } unique_ptr CompressedMaterialization::GetStringDecompress(unique_ptr input, + const LogicalType &result_type, const BaseStatistics &stats) { D_ASSERT(StringStats::HasMaxStringLength(stats)); auto decompress_function = CMStringDecompressFun::GetFunction(input->return_type); vector> arguments; arguments.emplace_back(std::move(input)); - return make_uniq(decompress_function.return_type, decompress_function, - std::move(arguments), nullptr); + return make_uniq(result_type, decompress_function, std::move(arguments), nullptr); } } // namespace duckdb diff --git a/src/duckdb/src/optimizer/compressed_materialization/compress_aggregate.cpp b/src/duckdb/src/optimizer/compressed_materialization/compress_aggregate.cpp index a61787e7..beea67d4 100644 --- a/src/duckdb/src/optimizer/compressed_materialization/compress_aggregate.cpp +++ b/src/duckdb/src/optimizer/compressed_materialization/compress_aggregate.cpp @@ -7,6 +7,9 @@ namespace duckdb { void CompressedMaterialization::CompressAggregate(unique_ptr &op) { auto &aggregate = op->Cast(); + if (aggregate.grouping_sets.size() > 1) { + return; // FIXME: we should be able to compress here but for some reason the NULL statistics ain't right + } auto &groups = aggregate.groups; column_binding_set_t group_binding_set; for (const auto &group : groups) { diff --git a/src/duckdb/src/optimizer/cse_optimizer.cpp b/src/duckdb/src/optimizer/cse_optimizer.cpp index 1442a9a3..d3f11bdd 100644 --- a/src/duckdb/src/optimizer/cse_optimizer.cpp +++ b/src/duckdb/src/optimizer/cse_optimizer.cpp @@ -13,9 +13,9 @@ namespace duckdb { //! underlying projection struct CSENode { idx_t count; - idx_t column_index; + optional_idx column_index; - CSENode() : count(1), column_index(DConstants::INVALID_INDEX) { + CSENode() : count(1), column_index() { } }; @@ -102,7 +102,7 @@ void CommonSubExpressionOptimizer::PerformCSEReplacement(unique_ptr // check if it has already been pushed into the projection auto alias = expr.alias; auto type = expr.return_type; - if (node.column_index == DConstants::INVALID_INDEX) { + if (!node.column_index.IsValid()) { // has not been pushed yet: push it node.column_index = state.expressions.size(); state.expressions.push_back(std::move(expr_ptr)); @@ -110,8 +110,8 @@ void CommonSubExpressionOptimizer::PerformCSEReplacement(unique_ptr state.cached_expressions.push_back(std::move(expr_ptr)); } // replace the original expression with a bound column ref - expr_ptr = make_uniq(alias, type, - ColumnBinding(state.projection_index, node.column_index)); + expr_ptr = make_uniq( + alias, type, ColumnBinding(state.projection_index, node.column_index.GetIndex())); return; } } diff --git a/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp b/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp index 18fd5c85..8cf884e3 100644 --- a/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +++ b/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp @@ -37,9 +37,9 @@ void CardinalityEstimator::AddRelationTdom(FilterInfo &filter_info) { relations_to_tdoms.emplace_back(new_r2tdom); } -bool CardinalityEstimator::SingleColumnFilter(FilterInfo &filter_info) { - if (filter_info.left_set && filter_info.right_set) { - // Both set +bool CardinalityEstimator::SingleRelationFilter(FilterInfo &filter_info) { + if (filter_info.left_set && filter_info.right_set && filter_info.set.count > 1) { + // Both set and are from different relations return false; } if (EmptyFilter(filter_info)) { @@ -100,7 +100,7 @@ void CardinalityEstimator::InitEquivalentRelations(const vector &stats) for (auto &total_domain : relations_to_tdoms) { for (auto &binding : total_domain.equivalent_relations) { D_ASSERT(binding.table_index < stats.size()); - D_ASSERT(binding.column_index < stats.at(binding.table_index).column_names.size()); - string column_name = stats.at(binding.table_index).column_names.at(binding.column_index); + string column_name; + if (binding.column_index < stats[binding.table_index].column_names.size()) { + column_name = stats[binding.table_index].column_names[binding.column_index]; + } else { + column_name = "[unknown]"; + } total_domain.column_names.push_back(column_name); } } diff --git a/src/duckdb/src/optimizer/optimizer.cpp b/src/duckdb/src/optimizer/optimizer.cpp index 0a66f000..b4bbd37c 100644 --- a/src/duckdb/src/optimizer/optimizer.cpp +++ b/src/duckdb/src/optimizer/optimizer.cpp @@ -4,9 +4,8 @@ #include "duckdb/main/client_context.hpp" #include "duckdb/main/config.hpp" #include "duckdb/main/query_profiler.hpp" -#include "duckdb/optimizer/column_lifetime_optimizer.hpp" +#include "duckdb/optimizer/column_lifetime_analyzer.hpp" #include "duckdb/optimizer/common_aggregate_optimizer.hpp" -#include "duckdb/optimizer/compressed_materialization.hpp" #include "duckdb/optimizer/cse_optimizer.hpp" #include "duckdb/optimizer/deliminator.hpp" #include "duckdb/optimizer/expression_heuristics.hpp" @@ -57,9 +56,13 @@ ClientContext &Optimizer::GetContext() { return context; } -void Optimizer::RunOptimizer(OptimizerType type, const std::function &callback) { +bool Optimizer::OptimizerDisabled(OptimizerType type) { auto &config = DBConfig::GetConfig(context); - if (config.options.disabled_optimizers.find(type) != config.options.disabled_optimizers.end()) { + return config.options.disabled_optimizers.find(type) != config.options.disabled_optimizers.end(); +} + +void Optimizer::RunOptimizer(OptimizerType type, const std::function &callback) { + if (OptimizerDisabled(type)) { // optimizer is marked as disabled: skip return; } @@ -150,6 +153,12 @@ unique_ptr Optimizer::Optimize(unique_ptr plan cse_optimizer.VisitOperator(*plan); }); + // transform ORDER BY + LIMIT to TopN + RunOptimizer(OptimizerType::TOP_N, [&]() { + TopN topn; + plan = topn.Optimize(std::move(plan)); + }); + // creates projection maps so unused columns are projected out early RunOptimizer(OptimizerType::COLUMN_LIFETIME, [&]() { ColumnLifetimeAnalyzer column_lifetime(true); @@ -159,7 +168,7 @@ unique_ptr Optimizer::Optimize(unique_ptr plan // perform statistics propagation column_binding_map_t> statistics_map; RunOptimizer(OptimizerType::STATISTICS_PROPAGATION, [&]() { - StatisticsPropagator propagator(*this); + StatisticsPropagator propagator(*this, *plan); propagator.PropagateStatistics(plan); statistics_map = propagator.GetStatisticsMap(); }); @@ -176,18 +185,6 @@ unique_ptr Optimizer::Optimize(unique_ptr plan column_lifetime.VisitOperator(*plan); }); - // compress data based on statistics for materializing operators - RunOptimizer(OptimizerType::COMPRESSED_MATERIALIZATION, [&]() { - CompressedMaterialization compressed_materialization(context, binder, std::move(statistics_map)); - compressed_materialization.Compress(plan); - }); - - // transform ORDER BY + LIMIT to TopN - RunOptimizer(OptimizerType::TOP_N, [&]() { - TopN topn; - plan = topn.Optimize(std::move(plan)); - }); - // apply simple expression heuristics to get an initial reordering RunOptimizer(OptimizerType::REORDER_FILTER, [&]() { ExpressionHeuristics expression_heuristics(*this); diff --git a/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp b/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp index efa3fa4e..facc77d5 100644 --- a/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +++ b/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp @@ -7,9 +7,19 @@ namespace duckdb { using Filter = FilterPushdown::Filter; unique_ptr FilterPushdown::PushdownCrossProduct(unique_ptr op) { - D_ASSERT(op->type == LogicalOperatorType::LOGICAL_CROSS_PRODUCT); + D_ASSERT(op->children.size() > 1); FilterPushdown left_pushdown(optimizer), right_pushdown(optimizer); vector> join_expressions; + auto join_ref_type = JoinRefType::REGULAR; + switch (op->type) { + case LogicalOperatorType::LOGICAL_CROSS_PRODUCT: + break; + case LogicalOperatorType::LOGICAL_ASOF_JOIN: + join_ref_type = JoinRefType::ASOF; + break; + default: + throw InternalException("Unsupported join type for cross product push down"); + } unordered_set left_bindings, right_bindings; if (!filters.empty()) { // check to see into which side we should push the filters @@ -41,16 +51,17 @@ unique_ptr FilterPushdown::PushdownCrossProduct(unique_ptr conditions; vector> arbitrary_expressions; - auto join_type = JoinType::INNER; + const auto join_type = JoinType::INNER; LogicalComparisonJoin::ExtractJoinConditions(GetContext(), join_type, op->children[0], op->children[1], left_bindings, right_bindings, join_expressions, conditions, arbitrary_expressions); // create the join from the join conditions - return LogicalComparisonJoin::CreateJoin(GetContext(), JoinType::INNER, JoinRefType::REGULAR, - std::move(op->children[0]), std::move(op->children[1]), - std::move(conditions), std::move(arbitrary_expressions)); + return LogicalComparisonJoin::CreateJoin(GetContext(), join_type, join_ref_type, std::move(op->children[0]), + std::move(op->children[1]), std::move(conditions), + std::move(arbitrary_expressions)); } else { // no join conditions found: keep as cross product + D_ASSERT(op->type == LogicalOperatorType::LOGICAL_CROSS_PRODUCT); return op; } } diff --git a/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp b/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp index dd94d3f3..985110d4 100644 --- a/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp +++ b/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp @@ -24,12 +24,10 @@ unique_ptr FilterPushdown::PushdownInnerJoin(unique_ptr(std::move(op)); } - } else if (op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) { - // Don't mess with non-standard condition interpretations - return FinishPushdown(std::move(op)); } else { // comparison join - D_ASSERT(op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN); + D_ASSERT(op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN || + op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN); auto &comp_join = join.Cast(); // turn the conditions into filters for (auto &i : comp_join.conditions) { @@ -42,6 +40,11 @@ unique_ptr FilterPushdown::PushdownInnerJoin(unique_ptrtype == LogicalOperatorType::LOGICAL_ASOF_JOIN) { + return PushdownCrossProduct(std::move(op)); + } + // turn the inner join into a cross product auto cross_product = make_uniq(std::move(op->children[0]), std::move(op->children[1])); // then push down cross product diff --git a/src/duckdb/src/optimizer/pushdown/pushdown_set_operation.cpp b/src/duckdb/src/optimizer/pushdown/pushdown_set_operation.cpp index e96eba2e..315fe5dc 100644 --- a/src/duckdb/src/optimizer/pushdown/pushdown_set_operation.cpp +++ b/src/duckdb/src/optimizer/pushdown/pushdown_set_operation.cpp @@ -69,7 +69,7 @@ unique_ptr FilterPushdown::PushdownSetOperation(unique_ptr(std::move(op)); } - if (left_empty) { + if (left_empty && setop.setop_all) { // left child is empty result switch (op->type) { case LogicalOperatorType::LOGICAL_UNION: @@ -88,7 +88,7 @@ unique_ptr FilterPushdown::PushdownSetOperation(unique_ptrtype) { case LogicalOperatorType::LOGICAL_UNION: diff --git a/src/duckdb/src/optimizer/remove_unused_columns.cpp b/src/duckdb/src/optimizer/remove_unused_columns.cpp index 73d10655..6597d3e3 100644 --- a/src/duckdb/src/optimizer/remove_unused_columns.cpp +++ b/src/duckdb/src/optimizer/remove_unused_columns.cpp @@ -234,17 +234,17 @@ void RemoveUnusedColumns::VisitOperator(LogicalOperator &op) { // for every table filter, push a column binding into the column references map to prevent the column from // being projected out for (auto &filter : get.table_filters.filters) { - idx_t index = DConstants::INVALID_INDEX; + optional_idx index; for (idx_t i = 0; i < get.column_ids.size(); i++) { if (get.column_ids[i] == filter.first) { index = i; break; } } - if (index == DConstants::INVALID_INDEX) { + if (!index.IsValid()) { throw InternalException("Could not find column index for table filter"); } - ColumnBinding filter_binding(get.table_index, index); + ColumnBinding filter_binding(get.table_index, index.GetIndex()); if (column_references.find(filter_binding) == column_references.end()) { column_references.insert(make_pair(filter_binding, vector())); } diff --git a/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp b/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp index 553c0e30..5aa9a4b7 100644 --- a/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +++ b/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp @@ -84,11 +84,11 @@ unique_ptr OrderedAggregateOptimizer::Apply(ClientContext &context, types.emplace_back(child->return_type); } auto best_function = binder.BindFunction(func.name, func.functions, types, error); - if (best_function == DConstants::INVALID_INDEX) { + if (!best_function.IsValid()) { error.Throw(); } // found a matching function! - auto bound_function = func.functions.GetFunctionByOffset(best_function); + auto bound_function = func.functions.GetFunctionByOffset(best_function.GetIndex()); return binder.BindAggregateFunction(bound_function, std::move(children), std::move(aggr.filter), aggr.IsDistinct() ? AggregateType::DISTINCT : AggregateType::NON_DISTINCT); } diff --git a/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp b/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp index b3dc53b8..d0e24dac 100644 --- a/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp +++ b/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp @@ -4,7 +4,7 @@ namespace duckdb { unique_ptr StatisticsPropagator::PropagateExpression(BoundAggregateExpression &aggr, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { vector stats; stats.reserve(aggr.children.size()); for (auto &child : aggr.children) { diff --git a/src/duckdb/src/optimizer/statistics/expression/propagate_between.cpp b/src/duckdb/src/optimizer/statistics/expression/propagate_between.cpp index fd4865e7..b7953332 100644 --- a/src/duckdb/src/optimizer/statistics/expression/propagate_between.cpp +++ b/src/duckdb/src/optimizer/statistics/expression/propagate_between.cpp @@ -1,13 +1,13 @@ +#include "duckdb/optimizer/expression_rewriter.hpp" #include "duckdb/optimizer/statistics_propagator.hpp" #include "duckdb/planner/expression/bound_between_expression.hpp" #include "duckdb/planner/expression/bound_comparison_expression.hpp" #include "duckdb/planner/expression/bound_constant_expression.hpp" -#include "duckdb/optimizer/expression_rewriter.hpp" namespace duckdb { unique_ptr StatisticsPropagator::PropagateExpression(BoundBetweenExpression &between, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { // propagate in all the children auto input_stats = PropagateExpression(between.input); auto lower_stats = PropagateExpression(between.lower); @@ -29,11 +29,11 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundBetwee if (lower_prune == FilterPropagateResult::FILTER_ALWAYS_TRUE && upper_prune == FilterPropagateResult::FILTER_ALWAYS_TRUE) { // both filters are always true: replace the between expression with a constant true - *expr_ptr = make_uniq(Value::BOOLEAN(true)); + expr_ptr = make_uniq(Value::BOOLEAN(true)); } else if (lower_prune == FilterPropagateResult::FILTER_ALWAYS_FALSE || upper_prune == FilterPropagateResult::FILTER_ALWAYS_FALSE) { // either one of the filters is always false: replace the between expression with a constant false - *expr_ptr = make_uniq(Value::BOOLEAN(false)); + expr_ptr = make_uniq(Value::BOOLEAN(false)); } else if (lower_prune == FilterPropagateResult::FILTER_FALSE_OR_NULL || upper_prune == FilterPropagateResult::FILTER_FALSE_OR_NULL) { // either one of the filters is false or null: replace with a constant or null (false) @@ -41,7 +41,7 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundBetwee children.push_back(std::move(between.input)); children.push_back(std::move(between.lower)); children.push_back(std::move(between.upper)); - *expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(false)); + expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(false)); } else if (lower_prune == FilterPropagateResult::FILTER_TRUE_OR_NULL && upper_prune == FilterPropagateResult::FILTER_TRUE_OR_NULL) { // both filters are true or null: replace with a true or null @@ -49,14 +49,14 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundBetwee children.push_back(std::move(between.input)); children.push_back(std::move(between.lower)); children.push_back(std::move(between.upper)); - *expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(true)); + expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(true)); } else if (lower_prune == FilterPropagateResult::FILTER_ALWAYS_TRUE) { // lower filter is always true: replace with upper comparison - *expr_ptr = + expr_ptr = make_uniq(upper_comparison, std::move(between.input), std::move(between.upper)); } else if (upper_prune == FilterPropagateResult::FILTER_ALWAYS_TRUE) { // upper filter is always true: replace with lower comparison - *expr_ptr = + expr_ptr = make_uniq(lower_comparison, std::move(between.input), std::move(between.lower)); } return nullptr; diff --git a/src/duckdb/src/optimizer/statistics/expression/propagate_case.cpp b/src/duckdb/src/optimizer/statistics/expression/propagate_case.cpp index 7586b9a4..d74a0575 100644 --- a/src/duckdb/src/optimizer/statistics/expression/propagate_case.cpp +++ b/src/duckdb/src/optimizer/statistics/expression/propagate_case.cpp @@ -4,7 +4,7 @@ namespace duckdb { unique_ptr StatisticsPropagator::PropagateExpression(BoundCaseExpression &bound_case, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { // propagate in all the children auto result_stats = PropagateExpression(bound_case.else_expr); for (auto &case_check : bound_case.case_checks) { diff --git a/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp b/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp index 94908ea4..9cb59082 100644 --- a/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +++ b/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp @@ -122,7 +122,7 @@ static unique_ptr StatisticsNumericCastSwitch(const BaseStatisti } unique_ptr StatisticsPropagator::PropagateExpression(BoundCastExpression &cast, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { auto child_stats = PropagateExpression(cast.child); if (!child_stats) { return nullptr; diff --git a/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp b/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp index 8a8d7db1..94ed2b0a 100644 --- a/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp +++ b/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp @@ -4,7 +4,7 @@ namespace duckdb { unique_ptr StatisticsPropagator::PropagateExpression(BoundColumnRefExpression &colref, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { auto stats = statistics_map.find(colref.binding); if (stats == statistics_map.end()) { return nullptr; diff --git a/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp b/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp index 1331d816..3022d7c5 100644 --- a/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +++ b/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp @@ -92,7 +92,7 @@ FilterPropagateResult StatisticsPropagator::PropagateComparison(BaseStatistics & } unique_ptr StatisticsPropagator::PropagateExpression(BoundComparisonExpression &expr, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { auto left_stats = PropagateExpression(expr.left); auto right_stats = PropagateExpression(expr.right); if (!left_stats || !right_stats) { @@ -102,23 +102,23 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundCompar auto propagate_result = PropagateComparison(*left_stats, *right_stats, expr.type); switch (propagate_result) { case FilterPropagateResult::FILTER_ALWAYS_TRUE: - *expr_ptr = make_uniq(Value::BOOLEAN(true)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(true)); + return PropagateExpression(expr_ptr); case FilterPropagateResult::FILTER_ALWAYS_FALSE: - *expr_ptr = make_uniq(Value::BOOLEAN(false)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(false)); + return PropagateExpression(expr_ptr); case FilterPropagateResult::FILTER_TRUE_OR_NULL: { vector> children; children.push_back(std::move(expr.left)); children.push_back(std::move(expr.right)); - *expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(true)); + expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(true)); return nullptr; } case FilterPropagateResult::FILTER_FALSE_OR_NULL: { vector> children; children.push_back(std::move(expr.left)); children.push_back(std::move(expr.right)); - *expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(false)); + expr_ptr = ExpressionRewriter::ConstantOrNull(std::move(children), Value::BOOLEAN(false)); return nullptr; } default: diff --git a/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp b/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp index 1fce16c8..8c6fa087 100644 --- a/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp +++ b/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp @@ -8,7 +8,7 @@ namespace duckdb { unique_ptr StatisticsPropagator::PropagateExpression(BoundConjunctionExpression &expr, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { auto is_and = expr.type == ExpressionType::CONJUNCTION_AND; for (idx_t expr_idx = 0; expr_idx < expr.children.size(); expr_idx++) { auto &child = expr.children[expr_idx]; @@ -50,16 +50,16 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundConjun expr_idx--; continue; } - *expr_ptr = make_uniq(Value::BOOLEAN(constant_value)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(constant_value)); + return PropagateExpression(expr_ptr); } if (expr.children.empty()) { // if there are no children left, replace the conjunction with TRUE (for AND) or FALSE (for OR) - *expr_ptr = make_uniq(Value::BOOLEAN(is_and)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(is_and)); + return PropagateExpression(expr_ptr); } else if (expr.children.size() == 1) { // if there is one child left, replace the conjunction with that one child - *expr_ptr = std::move(expr.children[0]); + expr_ptr = std::move(expr.children[0]); } return nullptr; } diff --git a/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp b/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp index c531311d..a8732810 100644 --- a/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp +++ b/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp @@ -11,7 +11,7 @@ unique_ptr StatisticsPropagator::StatisticsFromValue(const Value } unique_ptr StatisticsPropagator::PropagateExpression(BoundConstantExpression &constant, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { return StatisticsFromValue(constant.value); } diff --git a/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp b/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp index 3d7a2d7a..2a026345 100644 --- a/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp +++ b/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp @@ -4,7 +4,7 @@ namespace duckdb { unique_ptr StatisticsPropagator::PropagateExpression(BoundFunctionExpression &func, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { vector stats; stats.reserve(func.children.size()); for (idx_t i = 0; i < func.children.size(); i++) { @@ -18,7 +18,7 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundFuncti if (!func.function.statistics) { return nullptr; } - FunctionStatisticsInput input(func, func.bind_info.get(), stats, expr_ptr); + FunctionStatisticsInput input(func, func.bind_info.get(), stats, &expr_ptr); return func.function.statistics(context, input); } diff --git a/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp b/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp index 4bb1f8fd..2d97357c 100644 --- a/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp +++ b/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp @@ -5,7 +5,7 @@ namespace duckdb { unique_ptr StatisticsPropagator::PropagateExpression(BoundOperatorExpression &expr, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { bool all_have_stats = true; vector> child_stats; child_stats.reserve(expr.children.size()); @@ -47,7 +47,7 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundOperat D_ASSERT(expr.children.size() == child_stats.size()); if (expr.children.size() == 1) { // coalesce of one entry: simply return that entry - *expr_ptr = std::move(expr.children[0]); + expr_ptr = std::move(expr.children[0]); } else { // coalesce of multiple entries // merge the stats @@ -59,25 +59,25 @@ unique_ptr StatisticsPropagator::PropagateExpression(BoundOperat case ExpressionType::OPERATOR_IS_NULL: if (!child_stats[0]->CanHaveNull()) { // child has no null values: x IS NULL will always be false - *expr_ptr = make_uniq(Value::BOOLEAN(false)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(false)); + return PropagateExpression(expr_ptr); } if (!child_stats[0]->CanHaveNoNull()) { // child has no valid values: x IS NULL will always be true - *expr_ptr = make_uniq(Value::BOOLEAN(true)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(true)); + return PropagateExpression(expr_ptr); } return nullptr; case ExpressionType::OPERATOR_IS_NOT_NULL: if (!child_stats[0]->CanHaveNull()) { // child has no null values: x IS NOT NULL will always be true - *expr_ptr = make_uniq(Value::BOOLEAN(true)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(true)); + return PropagateExpression(expr_ptr); } if (!child_stats[0]->CanHaveNoNull()) { // child has no valid values: x IS NOT NULL will always be false - *expr_ptr = make_uniq(Value::BOOLEAN(false)); - return PropagateExpression(*expr_ptr); + expr_ptr = make_uniq(Value::BOOLEAN(false)); + return PropagateExpression(expr_ptr); } return nullptr; default: diff --git a/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp b/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp index 1824a4f1..677b4835 100644 --- a/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp +++ b/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp @@ -4,7 +4,7 @@ namespace duckdb { unique_ptr StatisticsPropagator::PropagateStatistics(LogicalAggregate &aggr, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate statistics in the child node node_stats = PropagateStatistics(aggr.children[0]); diff --git a/src/duckdb/src/optimizer/statistics/operator/propagate_cross_product.cpp b/src/duckdb/src/optimizer/statistics/operator/propagate_cross_product.cpp index c69c9b88..5e9b7529 100644 --- a/src/duckdb/src/optimizer/statistics/operator/propagate_cross_product.cpp +++ b/src/duckdb/src/optimizer/statistics/operator/propagate_cross_product.cpp @@ -4,7 +4,7 @@ namespace duckdb { unique_ptr StatisticsPropagator::PropagateStatistics(LogicalCrossProduct &cp, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate statistics in the child node auto left_stats = PropagateStatistics(cp.children[0]); auto right_stats = PropagateStatistics(cp.children[1]); diff --git a/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp b/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp index 39d9d61e..68fdfdeb 100644 --- a/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +++ b/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp @@ -1,3 +1,4 @@ +#include "duckdb/execution/expression_executor.hpp" #include "duckdb/function/scalar/generic_functions.hpp" #include "duckdb/optimizer/statistics_propagator.hpp" #include "duckdb/planner/expression/bound_between_expression.hpp" @@ -15,12 +16,18 @@ static bool IsCompareDistinct(ExpressionType type) { } bool StatisticsPropagator::ExpressionIsConstant(Expression &expr, const Value &val) { - if (expr.GetExpressionClass() != ExpressionClass::BOUND_CONSTANT) { + Value expr_value; + if (expr.GetExpressionClass() == ExpressionClass::BOUND_CONSTANT) { + expr_value = expr.Cast().value; + } else if (expr.IsFoldable()) { + if (!ExpressionExecutor::TryEvaluateScalar(context, expr, expr_value)) { + return false; + } + } else { return false; } - auto &bound_constant = expr.Cast(); - D_ASSERT(bound_constant.value.type() == val.type()); - return Value::NotDistinctFrom(bound_constant.value, val); + D_ASSERT(expr_value.type() == val.type()); + return Value::NotDistinctFrom(expr_value, val); } bool StatisticsPropagator::ExpressionIsConstantOrNull(Expression &expr, const Value &val) { @@ -215,11 +222,11 @@ void StatisticsPropagator::UpdateFilterStatistics(Expression &condition) { } unique_ptr StatisticsPropagator::PropagateStatistics(LogicalFilter &filter, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate to the child node_stats = PropagateStatistics(filter.children[0]); if (filter.children[0]->type == LogicalOperatorType::LOGICAL_EMPTY_RESULT) { - ReplaceWithEmptyResult(*node_ptr); + ReplaceWithEmptyResult(node_ptr); return make_uniq(0, 0); } @@ -240,7 +247,7 @@ unique_ptr StatisticsPropagator::PropagateStatistics(LogicalFilt } else if (ExpressionIsConstant(*condition, Value::BOOLEAN(false)) || ExpressionIsConstantOrNull(*condition, Value::BOOLEAN(false))) { // filter is always false or null; this entire filter should be replaced by an empty result block - ReplaceWithEmptyResult(*node_ptr); + ReplaceWithEmptyResult(node_ptr); return make_uniq(0, 0); } else { // cannot prune this filter: propagate statistics from the filter diff --git a/src/duckdb/src/optimizer/statistics/operator/propagate_get.cpp b/src/duckdb/src/optimizer/statistics/operator/propagate_get.cpp index 22979f19..0d3d2c73 100644 --- a/src/duckdb/src/optimizer/statistics/operator/propagate_get.cpp +++ b/src/duckdb/src/optimizer/statistics/operator/propagate_get.cpp @@ -31,7 +31,7 @@ void StatisticsPropagator::UpdateFilterStatistics(BaseStatistics &input, TableFi } unique_ptr StatisticsPropagator::PropagateStatistics(LogicalGet &get, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { if (get.function.cardinality) { node_stats = get.function.cardinality(context, get.bind_data.get()); } @@ -85,7 +85,7 @@ unique_ptr StatisticsPropagator::PropagateStatistics(LogicalGet case FilterPropagateResult::FILTER_FALSE_OR_NULL: case FilterPropagateResult::FILTER_ALWAYS_FALSE: // filter is always false; this entire filter should be replaced by an empty result block - ReplaceWithEmptyResult(*node_ptr); + ReplaceWithEmptyResult(node_ptr); return make_uniq(0, 0); default: // general case: filter can be true or false, update this columns' statistics diff --git a/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp b/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp index 093a3790..16541cf6 100644 --- a/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +++ b/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp @@ -14,7 +14,7 @@ namespace duckdb { -void StatisticsPropagator::PropagateStatistics(LogicalComparisonJoin &join, unique_ptr *node_ptr) { +void StatisticsPropagator::PropagateStatistics(LogicalComparisonJoin &join, unique_ptr &node_ptr) { for (idx_t i = 0; i < join.conditions.size(); i++) { auto &condition = join.conditions[i]; const auto stats_left = PropagateExpression(condition.left); @@ -40,7 +40,7 @@ void StatisticsPropagator::PropagateStatistics(LogicalComparisonJoin &join, uniq case JoinType::SEMI: case JoinType::INNER: // semi or inner join on false; entire node can be pruned - ReplaceWithEmptyResult(*node_ptr); + ReplaceWithEmptyResult(node_ptr); return; case JoinType::RIGHT_ANTI: case JoinType::ANTI: { @@ -48,7 +48,7 @@ void StatisticsPropagator::PropagateStatistics(LogicalComparisonJoin &join, uniq std::swap(join.children[0], join.children[1]); } // If the filter is always false or Null, just return the left child. - *node_ptr = std::move(join.children[0]); + node_ptr = std::move(join.children[0]); return; } case JoinType::LEFT: @@ -106,19 +106,19 @@ void StatisticsPropagator::PropagateStatistics(LogicalComparisonJoin &join, uniq auto limit = make_uniq(BoundLimitNode::ConstantValue(1), BoundLimitNode()); limit->AddChild(std::move(join.children[1])); auto cross_product = LogicalCrossProduct::Create(std::move(join.children[0]), std::move(limit)); - *node_ptr = std::move(cross_product); + node_ptr = std::move(cross_product); return; } case JoinType::INNER: { // inner, replace with cross product auto cross_product = LogicalCrossProduct::Create(std::move(join.children[0]), std::move(join.children[1])); - *node_ptr = std::move(cross_product); + node_ptr = std::move(cross_product); return; } case JoinType::ANTI: case JoinType::RIGHT_ANTI: { - ReplaceWithEmptyResult(*node_ptr); + ReplaceWithEmptyResult(node_ptr); return; } default: @@ -175,7 +175,7 @@ void StatisticsPropagator::PropagateStatistics(LogicalComparisonJoin &join, uniq } } -void StatisticsPropagator::PropagateStatistics(LogicalAnyJoin &join, unique_ptr *node_ptr) { +void StatisticsPropagator::PropagateStatistics(LogicalAnyJoin &join, unique_ptr &node_ptr) { // propagate the expression into the join condition PropagateExpression(join.condition); } @@ -201,7 +201,7 @@ void StatisticsPropagator::MultiplyCardinalities(unique_ptr &sta } unique_ptr StatisticsPropagator::PropagateStatistics(LogicalJoin &join, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate through the children of the join node_stats = PropagateStatistics(join.children[0]); for (idx_t child_idx = 1; child_idx < join.children.size(); child_idx++) { @@ -274,7 +274,7 @@ static void MaxCardinalities(unique_ptr &stats, NodeStatistics & } unique_ptr StatisticsPropagator::PropagateStatistics(LogicalPositionalJoin &join, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { D_ASSERT(join.type == LogicalOperatorType::LOGICAL_POSITIONAL_JOIN); // first propagate through the children of the join diff --git a/src/duckdb/src/optimizer/statistics/operator/propagate_limit.cpp b/src/duckdb/src/optimizer/statistics/operator/propagate_limit.cpp index 390e24ab..8dd710ac 100644 --- a/src/duckdb/src/optimizer/statistics/operator/propagate_limit.cpp +++ b/src/duckdb/src/optimizer/statistics/operator/propagate_limit.cpp @@ -4,7 +4,7 @@ namespace duckdb { unique_ptr StatisticsPropagator::PropagateStatistics(LogicalLimit &limit, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // propagate statistics in the child node PropagateStatistics(limit.children[0]); // return the node stats, with as expected cardinality the amount specified in the limit diff --git a/src/duckdb/src/optimizer/statistics/operator/propagate_order.cpp b/src/duckdb/src/optimizer/statistics/operator/propagate_order.cpp index 5770fcc8..d9de1607 100644 --- a/src/duckdb/src/optimizer/statistics/operator/propagate_order.cpp +++ b/src/duckdb/src/optimizer/statistics/operator/propagate_order.cpp @@ -5,7 +5,7 @@ namespace duckdb { unique_ptr StatisticsPropagator::PropagateStatistics(LogicalOrder &order, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate to the child node_stats = PropagateStatistics(order.children[0]); diff --git a/src/duckdb/src/optimizer/statistics/operator/propagate_projection.cpp b/src/duckdb/src/optimizer/statistics/operator/propagate_projection.cpp index 83c83095..d867343d 100644 --- a/src/duckdb/src/optimizer/statistics/operator/propagate_projection.cpp +++ b/src/duckdb/src/optimizer/statistics/operator/propagate_projection.cpp @@ -4,11 +4,11 @@ namespace duckdb { unique_ptr StatisticsPropagator::PropagateStatistics(LogicalProjection &proj, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate to the child node_stats = PropagateStatistics(proj.children[0]); if (proj.children[0]->type == LogicalOperatorType::LOGICAL_EMPTY_RESULT) { - ReplaceWithEmptyResult(*node_ptr); + ReplaceWithEmptyResult(node_ptr); return std::move(node_stats); } // then propagate to each of the expressions diff --git a/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp b/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp index 8b90aeb6..2f697719 100644 --- a/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp +++ b/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp @@ -24,7 +24,7 @@ void StatisticsPropagator::AddCardinalities(unique_ptr &stats, N } unique_ptr StatisticsPropagator::PropagateStatistics(LogicalSetOperation &setop, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate statistics in the child nodes auto left_stats = PropagateStatistics(setop.children[0]); auto right_stats = PropagateStatistics(setop.children[1]); diff --git a/src/duckdb/src/optimizer/statistics/operator/propagate_window.cpp b/src/duckdb/src/optimizer/statistics/operator/propagate_window.cpp index 9b6dcc49..55dd7af7 100644 --- a/src/duckdb/src/optimizer/statistics/operator/propagate_window.cpp +++ b/src/duckdb/src/optimizer/statistics/operator/propagate_window.cpp @@ -5,7 +5,7 @@ namespace duckdb { unique_ptr StatisticsPropagator::PropagateStatistics(LogicalWindow &window, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { // first propagate to the child node_stats = PropagateStatistics(window.children[0]); diff --git a/src/duckdb/src/optimizer/statistics_propagator.cpp b/src/duckdb/src/optimizer/statistics_propagator.cpp index 70169723..d3b1b1fe 100644 --- a/src/duckdb/src/optimizer/statistics_propagator.cpp +++ b/src/duckdb/src/optimizer/statistics_propagator.cpp @@ -1,6 +1,7 @@ #include "duckdb/optimizer/statistics_propagator.hpp" #include "duckdb/main/client_context.hpp" +#include "duckdb/optimizer/compressed_materialization.hpp" #include "duckdb/optimizer/optimizer.hpp" #include "duckdb/planner/expression/list.hpp" #include "duckdb/planner/expression_iterator.hpp" @@ -19,8 +20,9 @@ namespace duckdb { -StatisticsPropagator::StatisticsPropagator(Optimizer &optimizer_p) - : optimizer(optimizer_p), context(optimizer.context) { +StatisticsPropagator::StatisticsPropagator(Optimizer &optimizer_p, LogicalOperator &root_p) + : optimizer(optimizer_p), context(optimizer.context), root(&root_p) { + root->ResolveOperatorTypes(); } void StatisticsPropagator::ReplaceWithEmptyResult(unique_ptr &node) { @@ -28,7 +30,7 @@ void StatisticsPropagator::ReplaceWithEmptyResult(unique_ptr &n } unique_ptr StatisticsPropagator::PropagateChildren(LogicalOperator &node, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { for (idx_t child_idx = 0; child_idx < node.children.size(); child_idx++) { PropagateStatistics(node.children[child_idx]); } @@ -36,45 +38,64 @@ unique_ptr StatisticsPropagator::PropagateChildren(LogicalOperat } unique_ptr StatisticsPropagator::PropagateStatistics(LogicalOperator &node, - unique_ptr *node_ptr) { + unique_ptr &node_ptr) { + unique_ptr result; switch (node.type) { case LogicalOperatorType::LOGICAL_AGGREGATE_AND_GROUP_BY: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_CROSS_PRODUCT: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_FILTER: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_GET: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_PROJECTION: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_ANY_JOIN: case LogicalOperatorType::LOGICAL_ASOF_JOIN: case LogicalOperatorType::LOGICAL_COMPARISON_JOIN: case LogicalOperatorType::LOGICAL_JOIN: case LogicalOperatorType::LOGICAL_DELIM_JOIN: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_POSITIONAL_JOIN: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_UNION: case LogicalOperatorType::LOGICAL_EXCEPT: case LogicalOperatorType::LOGICAL_INTERSECT: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_ORDER_BY: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; case LogicalOperatorType::LOGICAL_WINDOW: - return PropagateStatistics(node.Cast(), node_ptr); + result = PropagateStatistics(node.Cast(), node_ptr); + break; default: - return PropagateChildren(node, node_ptr); + result = PropagateChildren(node, node_ptr); } + + if (!optimizer.OptimizerDisabled(OptimizerType::COMPRESSED_MATERIALIZATION)) { + // compress data based on statistics for materializing operators + CompressedMaterialization compressed_materialization(optimizer, *root, statistics_map); + compressed_materialization.Compress(node_ptr); + } + + return result; } unique_ptr StatisticsPropagator::PropagateStatistics(unique_ptr &node_ptr) { - return PropagateStatistics(*node_ptr, &node_ptr); + return PropagateStatistics(*node_ptr, node_ptr); } unique_ptr StatisticsPropagator::PropagateExpression(Expression &expr, - unique_ptr *expr_ptr) { + unique_ptr &expr_ptr) { switch (expr.GetExpressionClass()) { case ExpressionClass::BOUND_AGGREGATE: return PropagateExpression(expr.Cast(), expr_ptr); @@ -104,7 +125,7 @@ unique_ptr StatisticsPropagator::PropagateExpression(Expression } unique_ptr StatisticsPropagator::PropagateExpression(unique_ptr &expr) { - auto stats = PropagateExpression(*expr, &expr); + auto stats = PropagateExpression(*expr, expr); if (ClientConfig::GetConfig(context).query_verification_enabled && stats) { expr->verification_stats = stats->ToUnique(); } diff --git a/src/duckdb/src/parallel/pipeline_finish_event.cpp b/src/duckdb/src/parallel/pipeline_finish_event.cpp index 1b83fc14..b933e7ea 100644 --- a/src/duckdb/src/parallel/pipeline_finish_event.cpp +++ b/src/duckdb/src/parallel/pipeline_finish_event.cpp @@ -51,7 +51,7 @@ class PipelineFinishTask : public ExecutorTask { //! Debugging state: number of times blocked int debug_blocked_count = 0; //! Number of times the Finalize will block before actually returning data - int debug_blocked_target_count = 10; + int debug_blocked_target_count = 1; #endif }; diff --git a/src/duckdb/src/parallel/task_scheduler.cpp b/src/duckdb/src/parallel/task_scheduler.cpp index 92be66f5..50364833 100644 --- a/src/duckdb/src/parallel/task_scheduler.cpp +++ b/src/duckdb/src/parallel/task_scheduler.cpp @@ -304,7 +304,14 @@ void TaskScheduler::RelaunchThreadsInternal(int32_t n) { for (idx_t i = 0; i < create_new_threads; i++) { // launch a thread and assign it a cancellation marker auto marker = unique_ptr>(new atomic(true)); - auto worker_thread = make_uniq(ThreadExecuteTasks, this, marker.get()); + unique_ptr worker_thread; + try { + worker_thread = make_uniq(ThreadExecuteTasks, this, marker.get()); + } catch (std::exception &ex) { + // thread constructor failed - this can happen when the system has too many threads allocated + // in this case we cannot allocate more threads - stop launching them + break; + } auto thread_wrapper = make_uniq(std::move(worker_thread)); threads.push_back(std::move(thread_wrapper)); diff --git a/src/duckdb/src/parser/constraints/unique_constraint.cpp b/src/duckdb/src/parser/constraints/unique_constraint.cpp index 29fd536e..8613231e 100644 --- a/src/duckdb/src/parser/constraints/unique_constraint.cpp +++ b/src/duckdb/src/parser/constraints/unique_constraint.cpp @@ -28,11 +28,13 @@ string UniqueConstraint::ToString() const { } unique_ptr UniqueConstraint::Copy() const { - if (index.index == DConstants::INVALID_INDEX) { + if (!HasIndex()) { return make_uniq(columns, is_primary_key); } else { auto result = make_uniq(index, is_primary_key); - result->columns = columns; + if (!columns.empty()) { + result->columns.push_back(columns[0]); + } return std::move(result); } } diff --git a/src/duckdb/src/parser/parsed_data/create_index_info.cpp b/src/duckdb/src/parser/parsed_data/create_index_info.cpp index 93984b5a..739d0362 100644 --- a/src/duckdb/src/parser/parsed_data/create_index_info.cpp +++ b/src/duckdb/src/parser/parsed_data/create_index_info.cpp @@ -1,4 +1,6 @@ #include "duckdb/parser/parsed_data/create_index_info.hpp" +#include "duckdb/parser/parsed_expression_iterator.hpp" +#include "duckdb/parser/expression/columnref_expression.hpp" namespace duckdb { @@ -11,6 +13,68 @@ CreateIndexInfo::CreateIndexInfo(const duckdb::CreateIndexInfo &info) scan_types(info.scan_types), names(info.names) { } +static void RemoveTableQualificationRecursive(unique_ptr &expr, const string &table_name) { + if (expr->GetExpressionType() == ExpressionType::COLUMN_REF) { + auto &col_ref = expr->Cast(); + auto &col_names = col_ref.column_names; + if (col_ref.IsQualified() && col_ref.GetTableName() == table_name) { + col_names.erase(col_names.begin()); + } + } else { + ParsedExpressionIterator::EnumerateChildren(*expr, [&table_name](unique_ptr &child) { + RemoveTableQualificationRecursive(child, table_name); + }); + } +} + +string CreateIndexInfo::ToString() const { + string result; + + result += "CREATE"; + D_ASSERT(constraint_type == IndexConstraintType::UNIQUE || constraint_type == IndexConstraintType::NONE); + if (constraint_type == IndexConstraintType::UNIQUE) { + result += " UNIQUE"; + } + result += " INDEX "; + if (on_conflict == OnCreateConflict::IGNORE_ON_CONFLICT) { + result += "IF NOT EXISTS "; + } + result += KeywordHelper::WriteOptionallyQuoted(index_name); + result += " ON "; + result += KeywordHelper::WriteOptionallyQuoted(table); + if (index_type != "ART") { + result += " USING "; + result += KeywordHelper::WriteOptionallyQuoted(index_type); + result += " "; + } + result += "("; + for (idx_t i = 0; i < parsed_expressions.size(); i++) { + auto &expr = parsed_expressions[i]; + auto copy = expr->Copy(); + if (i > 0) { + result += ", "; + } + // column ref expressions are qualified with the table name + // we need to remove them to reproduce the original query + RemoveTableQualificationRecursive(copy, table); + result += copy->ToString(); + } + result += ")"; + if (!options.empty()) { + result += " WITH ("; + idx_t i = 0; + for (auto &opt : options) { + result += StringUtil::Format("%s = %s", opt.first, opt.second.ToString()); + if (i > 0) { + result += ", "; + } + i++; + } + result += " )"; + } + return result; +} + unique_ptr CreateIndexInfo::Copy() const { auto result = make_uniq(*this); diff --git a/src/duckdb/src/parser/parsed_data/vacuum_info.cpp b/src/duckdb/src/parser/parsed_data/vacuum_info.cpp index bbbd9fb5..cf832693 100644 --- a/src/duckdb/src/parser/parsed_data/vacuum_info.cpp +++ b/src/duckdb/src/parser/parsed_data/vacuum_info.cpp @@ -11,6 +11,7 @@ unique_ptr VacuumInfo::Copy() { if (has_table) { result->ref = ref->Copy(); } + result->columns = columns; return result; } diff --git a/src/duckdb/src/parser/transform/expression/transform_function.cpp b/src/duckdb/src/parser/transform/expression/transform_function.cpp index 606477fd..9b9019b6 100644 --- a/src/duckdb/src/parser/transform/expression/transform_function.cpp +++ b/src/duckdb/src/parser/transform/expression/transform_function.cpp @@ -163,12 +163,13 @@ unique_ptr Transformer::TransformFuncCall(duckdb_libpgquery::P throw ParserException("EXPORT_STATE is not supported for window functions!"); } - if (win_fun_type == ExpressionType::WINDOW_AGGREGATE && root.agg_ignore_nulls) { - throw ParserException("IGNORE NULLS is not supported for windowed aggregates"); + if (win_fun_type == ExpressionType::WINDOW_AGGREGATE && + root.agg_ignore_nulls != duckdb_libpgquery::PG_DEFAULT_NULLS) { + throw ParserException("RESPECT/IGNORE NULLS is not supported for windowed aggregates"); } auto expr = make_uniq(win_fun_type, std::move(catalog), std::move(schema), lowercase_name); - expr->ignore_nulls = root.agg_ignore_nulls; + expr->ignore_nulls = (root.agg_ignore_nulls == duckdb_libpgquery::PG_IGNORE_NULLS); expr->distinct = root.agg_distinct; if (root.agg_filter) { @@ -238,8 +239,8 @@ unique_ptr Transformer::TransformFuncCall(duckdb_libpgquery::P return std::move(expr); } - if (root.agg_ignore_nulls) { - throw ParserException("IGNORE NULLS is not supported for non-window functions"); + if (root.agg_ignore_nulls != duckdb_libpgquery::PG_DEFAULT_NULLS) { + throw ParserException("RESPECT/IGNORE NULLS is not supported for non-window functions"); } unique_ptr filter_expr; @@ -298,6 +299,13 @@ unique_ptr Transformer::TransformFuncCall(duckdb_libpgquery::P auto construct_array = make_uniq(ExpressionType::ARRAY_CONSTRUCTOR); construct_array->children = std::move(children); return std::move(construct_array); + } else if (lowercase_name == "__internal_position_operator") { + if (children.size() != 2) { + throw ParserException("Wrong number of arguments to __internal_position_operator."); + } + // swap arguments for POSITION(x IN y) + std::swap(children[0], children[1]); + lowercase_name = "position"; } else if (lowercase_name == "ifnull") { if (children.size() != 2) { throw ParserException("Wrong number of arguments to IFNULL."); diff --git a/src/duckdb/src/parser/transform/expression/transform_subquery.cpp b/src/duckdb/src/parser/transform/expression/transform_subquery.cpp index 5b636890..c8dbe23a 100644 --- a/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +++ b/src/duckdb/src/parser/transform/expression/transform_subquery.cpp @@ -2,6 +2,8 @@ #include "duckdb/parser/transformer.hpp" #include "duckdb/parser/query_node/select_node.hpp" #include "duckdb/parser/tableref/subqueryref.hpp" +#include "duckdb/parser/expression/constant_expression.hpp" +#include "duckdb/parser/expression/positional_reference_expression.hpp" namespace duckdb { @@ -69,6 +71,28 @@ unique_ptr Transformer::TransformSubquery(duckdb_libpgquery::P vector> children; children.push_back(std::move(columns_star)); auto aggr = make_uniq("array_agg", std::move(children)); + // push ORDER BY modifiers into the array_agg + for (auto &modifier : subquery_expr->subquery->node->modifiers) { + if (modifier->type == ResultModifierType::ORDER_MODIFIER) { + aggr->order_bys = unique_ptr_cast(modifier->Copy()); + break; + } + } + // transform constants (e.g. ORDER BY 1) into positional references (ORDER BY #1) + if (aggr->order_bys) { + for (auto &order : aggr->order_bys->orders) { + if (order.expression->type == ExpressionType::VALUE_CONSTANT) { + auto &constant_expr = order.expression->Cast(); + Value bigint_value; + string error; + if (constant_expr.value.DefaultTryCastAs(LogicalType::BIGINT, bigint_value, &error)) { + int64_t order_index = BigIntValue::Get(bigint_value); + idx_t positional_index = order_index < 0 ? NumericLimits::Maximum() : idx_t(order_index); + order.expression = make_uniq(positional_index); + } + } + } + } // ARRAY_AGG(COLUMNS(*)) IS NULL auto agg_is_null = make_uniq(ExpressionType::OPERATOR_IS_NULL, aggr->Copy()); // empty list diff --git a/src/duckdb/src/parser/transform/helpers/transform_cte.cpp b/src/duckdb/src/parser/transform/helpers/transform_cte.cpp index ca919241..c4678bdd 100644 --- a/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +++ b/src/duckdb/src/parser/transform/helpers/transform_cte.cpp @@ -31,8 +31,7 @@ void Transformer::ExtractCTEsRecursive(CommonTableExpressionMap &cte_map) { } } -void Transformer::TransformCTE(duckdb_libpgquery::PGWithClause &de_with_clause, CommonTableExpressionMap &cte_map, - vector> &materialized_ctes) { +void Transformer::TransformCTE(duckdb_libpgquery::PGWithClause &de_with_clause, CommonTableExpressionMap &cte_map) { stored_cte_map.push_back(&cte_map); // TODO: might need to update in case of future lawsuit @@ -88,12 +87,6 @@ void Transformer::TransformCTE(duckdb_libpgquery::PGWithClause &de_with_clause, #else if (cte.ctematerialized == duckdb_libpgquery::PGCTEMaterializeAlways) { #endif - auto materialize = make_uniq(); - materialize->query = info->query->node->Copy(); - materialize->ctename = cte_name; - materialize->aliases = info->aliases; - materialized_ctes.push_back(std::move(materialize)); - info->materialized = CTEMaterialize::CTE_MATERIALIZE_ALWAYS; } diff --git a/src/duckdb/src/parser/transform/statement/transform_create_function.cpp b/src/duckdb/src/parser/transform/statement/transform_create_function.cpp index 4bdc21d2..4d1a8fdc 100644 --- a/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +++ b/src/duckdb/src/parser/transform/statement/transform_create_function.cpp @@ -40,10 +40,11 @@ unique_ptr Transformer::TransformCreateFunction(duckdb_libpgque break; case duckdb_libpgquery::PG_RELPERSISTENCE_UNLOGGED: throw ParserException("Unlogged flag not supported for macros: '%s'", qname.name); - break; case duckdb_libpgquery::RELPERSISTENCE_PERMANENT: info->temporary = false; break; + default: + throw ParserException("Unsupported persistence flag for table '%s'", qname.name); } // what to do on conflict diff --git a/src/duckdb/src/parser/transform/statement/transform_create_index.cpp b/src/duckdb/src/parser/transform/statement/transform_create_index.cpp index cf3c81f4..3b13d53c 100644 --- a/src/duckdb/src/parser/transform/statement/transform_create_index.cpp +++ b/src/duckdb/src/parser/transform/statement/transform_create_index.cpp @@ -77,6 +77,9 @@ unique_ptr Transformer::TransformCreateIndex(duckdb_libpgquery: for (auto &expr : info->expressions) { info->parsed_expressions.emplace_back(expr->Copy()); } + if (stmt.whereClause) { + throw NotImplementedException("Creating partial indexes is not supported currently"); + } result->info = std::move(info); return result; } diff --git a/src/duckdb/src/parser/transform/statement/transform_delete.cpp b/src/duckdb/src/parser/transform/statement/transform_delete.cpp index bad33043..1a185968 100644 --- a/src/duckdb/src/parser/transform/statement/transform_delete.cpp +++ b/src/duckdb/src/parser/transform/statement/transform_delete.cpp @@ -5,13 +5,8 @@ namespace duckdb { unique_ptr Transformer::TransformDelete(duckdb_libpgquery::PGDeleteStmt &stmt) { auto result = make_uniq(); - vector> materialized_ctes; if (stmt.withClause) { - TransformCTE(*PGPointerCast(stmt.withClause), result->cte_map, - materialized_ctes); - if (!materialized_ctes.empty()) { - throw NotImplementedException("Materialized CTEs are not implemented for delete."); - } + TransformCTE(*PGPointerCast(stmt.withClause), result->cte_map); } result->condition = TransformExpression(stmt.whereClause); @@ -30,6 +25,7 @@ unique_ptr Transformer::TransformDelete(duckdb_libpgquery::PGDe if (stmt.returningList) { TransformExpressionList(*stmt.returningList, result->returning_list); } + return result; } diff --git a/src/duckdb/src/parser/transform/statement/transform_insert.cpp b/src/duckdb/src/parser/transform/statement/transform_insert.cpp index 30d7aeb6..491632bb 100644 --- a/src/duckdb/src/parser/transform/statement/transform_insert.cpp +++ b/src/duckdb/src/parser/transform/statement/transform_insert.cpp @@ -24,13 +24,8 @@ unique_ptr Transformer::TransformValuesList(duckdb_libpgquery::PGList unique_ptr Transformer::TransformInsert(duckdb_libpgquery::PGInsertStmt &stmt) { auto result = make_uniq(); - vector> materialized_ctes; if (stmt.withClause) { - TransformCTE(*PGPointerCast(stmt.withClause), result->cte_map, - materialized_ctes); - if (!materialized_ctes.empty()) { - throw NotImplementedException("Materialized CTEs are not implemented for insert."); - } + TransformCTE(*PGPointerCast(stmt.withClause), result->cte_map); } // first check if there are any columns specified @@ -47,6 +42,7 @@ unique_ptr Transformer::TransformInsert(duckdb_libpgquery::PGIn } if (stmt.selectStmt) { result->select_statement = TransformSelect(stmt.selectStmt, false); + result->select_statement->node = TransformMaterializedCTE(std::move(result->select_statement->node)); } else { result->default_values = true; } diff --git a/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp b/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp index ae36530e..4bfb1c46 100644 --- a/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +++ b/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp @@ -140,11 +140,9 @@ unique_ptr Transformer::TransformPivotStatement(duckdb_libpgquery::PG bool has_parameters = next_param_count > current_param_count; auto select_node = make_uniq(); - vector> materialized_ctes; // handle the CTEs if (select.withClause) { - TransformCTE(*PGPointerCast(select.withClause), select_node->cte_map, - materialized_ctes); + TransformCTE(*PGPointerCast(select.withClause), select_node->cte_map); } if (!pivot->columns) { // no pivot columns - not actually a pivot @@ -215,9 +213,7 @@ unique_ptr Transformer::TransformPivotStatement(duckdb_libpgquery::PG // transform order by/limit modifiers TransformModifiers(select, *select_node); - auto node = Transformer::TransformMaterializedCTE(std::move(select_node), materialized_ctes); - - return node; + return std::move(select_node); } } // namespace duckdb diff --git a/src/duckdb/src/parser/transform/statement/transform_pragma.cpp b/src/duckdb/src/parser/transform/statement/transform_pragma.cpp index d55d6a2b..63a5c35d 100644 --- a/src/duckdb/src/parser/transform/statement/transform_pragma.cpp +++ b/src/duckdb/src/parser/transform/statement/transform_pragma.cpp @@ -49,7 +49,7 @@ unique_ptr Transformer::TransformPragma(duckdb_libpgquery::PGPragm break; case duckdb_libpgquery::PG_PRAGMA_TYPE_ASSIGNMENT: if (info.parameters.size() != 1) { - throw InternalException("PRAGMA statement with assignment should contain exactly one parameter"); + throw ParserException("PRAGMA statement with assignment should contain exactly one parameter"); } if (!info.named_parameters.empty()) { throw InternalException("PRAGMA statement with assignment cannot have named parameters"); diff --git a/src/duckdb/src/parser/transform/statement/transform_select.cpp b/src/duckdb/src/parser/transform/statement/transform_select.cpp index 15331a3a..7b85d1f5 100644 --- a/src/duckdb/src/parser/transform/statement/transform_select.cpp +++ b/src/duckdb/src/parser/transform/statement/transform_select.cpp @@ -5,11 +5,14 @@ namespace duckdb { unique_ptr Transformer::TransformSelectNode(duckdb_libpgquery::PGSelectStmt &select) { + unique_ptr stmt = nullptr; if (select.pivot) { - return TransformPivotStatement(select); + stmt = TransformPivotStatement(select); } else { - return TransformSelectInternal(select); + stmt = TransformSelectInternal(select); } + + return TransformMaterializedCTE(std::move(stmt)); } unique_ptr Transformer::TransformSelect(duckdb_libpgquery::PGSelectStmt &select, bool is_select) { diff --git a/src/duckdb/src/parser/transform/statement/transform_select_node.cpp b/src/duckdb/src/parser/transform/statement/transform_select_node.cpp index c024476b..b5aa73a3 100644 --- a/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +++ b/src/duckdb/src/parser/transform/statement/transform_select_node.cpp @@ -47,15 +47,13 @@ unique_ptr Transformer::TransformSelectInternal(duckdb_libpgquery::PG auto stack_checker = StackCheck(); unique_ptr node; - vector> materialized_ctes; switch (stmt.op) { case duckdb_libpgquery::PG_SETOP_NONE: { node = make_uniq(); auto &result = node->Cast(); if (stmt.withClause) { - TransformCTE(*PGPointerCast(stmt.withClause), node->cte_map, - materialized_ctes); + TransformCTE(*PGPointerCast(stmt.withClause), node->cte_map); } if (stmt.windowClause) { for (auto window_ele = stmt.windowClause->head; window_ele != nullptr; window_ele = window_ele->next) { @@ -117,8 +115,7 @@ unique_ptr Transformer::TransformSelectInternal(duckdb_libpgquery::PG node = make_uniq(); auto &result = node->Cast(); if (stmt.withClause) { - TransformCTE(*PGPointerCast(stmt.withClause), node->cte_map, - materialized_ctes); + TransformCTE(*PGPointerCast(stmt.withClause), node->cte_map); } result.left = TransformSelectNode(*stmt.larg); result.right = TransformSelectNode(*stmt.rarg); @@ -154,9 +151,6 @@ unique_ptr Transformer::TransformSelectInternal(duckdb_libpgquery::PG TransformModifiers(stmt, *node); - // Handle materialized CTEs - node = Transformer::TransformMaterializedCTE(std::move(node), materialized_ctes); - return node; } diff --git a/src/duckdb/src/parser/transform/statement/transform_update.cpp b/src/duckdb/src/parser/transform/statement/transform_update.cpp index c283af83..6d704835 100644 --- a/src/duckdb/src/parser/transform/statement/transform_update.cpp +++ b/src/duckdb/src/parser/transform/statement/transform_update.cpp @@ -19,13 +19,8 @@ unique_ptr Transformer::TransformUpdateSetInfo(duckdb_libpgquery: unique_ptr Transformer::TransformUpdate(duckdb_libpgquery::PGUpdateStmt &stmt) { auto result = make_uniq(); - vector> materialized_ctes; if (stmt.withClause) { - TransformCTE(*PGPointerCast(stmt.withClause), result->cte_map, - materialized_ctes); - if (!materialized_ctes.empty()) { - throw NotImplementedException("Materialized CTEs are not implemented for update."); - } + TransformCTE(*PGPointerCast(stmt.withClause), result->cte_map); } result->table = TransformRangeVar(*stmt.relation); diff --git a/src/duckdb/src/parser/transform/statement/transform_use.cpp b/src/duckdb/src/parser/transform/statement/transform_use.cpp index a4d76843..4bb8a2b8 100644 --- a/src/duckdb/src/parser/transform/statement/transform_use.cpp +++ b/src/duckdb/src/parser/transform/statement/transform_use.cpp @@ -11,9 +11,10 @@ unique_ptr Transformer::TransformUse(duckdb_libpgquery::PGUseStmt } string name; if (IsInvalidSchema(qualified_name.schema)) { - name = qualified_name.name; + name = KeywordHelper::WriteOptionallyQuoted(qualified_name.name, '"'); } else { - name = qualified_name.schema + "." + qualified_name.name; + name = KeywordHelper::WriteOptionallyQuoted(qualified_name.schema, '"') + "." + + KeywordHelper::WriteOptionallyQuoted(qualified_name.name, '"'); } auto name_expr = make_uniq(Value(name)); return make_uniq("schema", std::move(name_expr), SetScope::AUTOMATIC); diff --git a/src/duckdb/src/parser/transformer.cpp b/src/duckdb/src/parser/transformer.cpp index e36d7c2e..8c54c46a 100644 --- a/src/duckdb/src/parser/transformer.cpp +++ b/src/duckdb/src/parser/transformer.cpp @@ -222,8 +222,20 @@ unique_ptr Transformer::TransformStatementInternal(duckdb_libpgque } } -unique_ptr Transformer::TransformMaterializedCTE(unique_ptr root, - vector> &materialized_ctes) { +unique_ptr Transformer::TransformMaterializedCTE(unique_ptr root) { + // Extract materialized CTEs from cte_map + vector> materialized_ctes; + for (auto &cte : root->cte_map.map) { + auto &cte_entry = cte.second; + if (cte_entry->materialized == CTEMaterialize::CTE_MATERIALIZE_ALWAYS) { + auto mat_cte = make_uniq(); + mat_cte->ctename = cte.first; + mat_cte->query = cte_entry->query->node->Copy(); + mat_cte->aliases = cte_entry->aliases; + materialized_ctes.push_back(std::move(mat_cte)); + } + } + while (!materialized_ctes.empty()) { unique_ptr node_result; node_result = std::move(materialized_ctes.back()); diff --git a/src/duckdb/src/planner/binder.cpp b/src/duckdb/src/planner/binder.cpp index 9ab70f44..8239fd29 100644 --- a/src/duckdb/src/planner/binder.cpp +++ b/src/duckdb/src/planner/binder.cpp @@ -67,6 +67,76 @@ Binder::Binder(bool, ClientContext &context, shared_ptr parent_p, bool i } } +unique_ptr Binder::BindMaterializedCTE(CommonTableExpressionMap &cte_map) { + // Extract materialized CTEs from cte_map + vector> materialized_ctes; + for (auto &cte : cte_map.map) { + auto &cte_entry = cte.second; + if (cte_entry->materialized == CTEMaterialize::CTE_MATERIALIZE_ALWAYS) { + auto mat_cte = make_uniq(); + mat_cte->ctename = cte.first; + mat_cte->query = cte_entry->query->node->Copy(); + mat_cte->aliases = cte_entry->aliases; + materialized_ctes.push_back(std::move(mat_cte)); + } + } + + if (materialized_ctes.empty()) { + return nullptr; + } + + unique_ptr cte_root = nullptr; + while (!materialized_ctes.empty()) { + unique_ptr node_result; + node_result = std::move(materialized_ctes.back()); + node_result->cte_map = cte_map.Copy(); + if (cte_root) { + node_result->child = std::move(cte_root); + } else { + node_result->child = nullptr; + } + cte_root = std::move(node_result); + materialized_ctes.pop_back(); + } + + AddCTEMap(cte_map); + auto bound_cte = BindCTE(cte_root->Cast()); + + return bound_cte; +} + +template +BoundStatement Binder::BindWithCTE(T &statement) { + BoundStatement bound_statement; + auto bound_cte = BindMaterializedCTE(statement.template Cast().cte_map); + if (bound_cte) { + BoundCTENode *tail = bound_cte.get(); + + while (tail->child && tail->child->type == QueryNodeType::CTE_NODE) { + tail = &tail->child->Cast(); + } + + bound_statement = tail->child_binder->Bind(statement.template Cast()); + + tail->types = bound_statement.types; + tail->names = bound_statement.names; + + for (auto &c : tail->query_binder->correlated_columns) { + tail->child_binder->AddCorrelatedColumn(c); + } + + MoveCorrelatedExpressions(*tail->child_binder); + + // extract operator below root operation + auto plan = std::move(bound_statement.plan->children[0]); + bound_statement.plan->children.clear(); + bound_statement.plan->children.push_back(CreatePlan(*bound_cte, std::move(plan))); + } else { + bound_statement = Bind(statement.template Cast()); + } + return bound_statement; +} + BoundStatement Binder::Bind(SQLStatement &statement) { root_statement = &statement; switch (statement.type) { @@ -77,9 +147,9 @@ BoundStatement Binder::Bind(SQLStatement &statement) { case StatementType::COPY_STATEMENT: return Bind(statement.Cast()); case StatementType::DELETE_STATEMENT: - return Bind(statement.Cast()); + return BindWithCTE(statement.Cast()); case StatementType::UPDATE_STATEMENT: - return Bind(statement.Cast()); + return BindWithCTE(statement.Cast()); case StatementType::RELATION_STATEMENT: return Bind(statement.Cast()); case StatementType::CREATE_STATEMENT: @@ -263,17 +333,19 @@ void Binder::AddCTE(const string &name, CommonTableExpressionInfo &info) { CTE_bindings.insert(make_pair(name, reference(info))); } -optional_ptr Binder::FindCTE(const string &name, bool skip) { +vector> Binder::FindCTE(const string &name, bool skip) { auto entry = CTE_bindings.find(name); + vector> ctes; if (entry != CTE_bindings.end()) { if (!skip || entry->second.get().query->node->type == QueryNodeType::RECURSIVE_CTE_NODE) { - return &entry->second.get(); + ctes.push_back(entry->second); } } if (parent && inherit_ctes) { - return parent->FindCTE(name, name == alias); + auto parent_ctes = parent->FindCTE(name, name == alias); + ctes.insert(ctes.end(), parent_ctes.begin(), parent_ctes.end()); } - return nullptr; + return ctes; } bool Binder::CTEIsAlreadyBound(CommonTableExpressionInfo &cte) { diff --git a/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp b/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp index 2af12ca4..eecd07ea 100644 --- a/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +++ b/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp @@ -95,14 +95,17 @@ BindResult BaseSelectBinder::BindAggregate(FunctionExpression &aggr, AggregateFu // Handle ordered-set aggregates by moving the single ORDER BY expression to the front of the children. // https://www.postgresql.org/docs/current/functions-aggregate.html#FUNCTIONS-ORDEREDSET-TABLE - bool ordered_set_agg = false; + // We also have to handle ORDER BY in the argument list, so note how many arguments we should have + // and only inject the ordering expression if there are too few. + idx_t ordered_set_agg = 0; bool negate_fractions = false; if (aggr.order_bys && aggr.order_bys->orders.size() == 1) { const auto &func_name = aggr.function_name; - ordered_set_agg = (func_name == "quantile_cont" || func_name == "quantile_disc" || - (func_name == "mode" && aggr.children.empty())); + if (func_name == "mode") { + ordered_set_agg = 1; + } else if (func_name == "quantile_cont" || func_name == "quantile_disc") { + ordered_set_agg = 2; - if (ordered_set_agg) { auto &config = DBConfig::GetConfig(context); const auto &order = aggr.order_bys->orders[0]; const auto sense = @@ -111,10 +114,11 @@ BindResult BaseSelectBinder::BindAggregate(FunctionExpression &aggr, AggregateFu } } - for (auto &child : aggr.children) { + for (idx_t i = 0; i < aggr.children.size(); ++i) { + auto &child = aggr.children[i]; aggregate_binder.BindChild(child, 0, error); // We have to negate the fractions for PERCENTILE_XXXX DESC - if (!error.HasError() && ordered_set_agg) { + if (!error.HasError() && ordered_set_agg && i == aggr.children.size() - 1) { NegatePercentileFractions(context, child, negate_fractions); } } @@ -181,14 +185,17 @@ BindResult BaseSelectBinder::BindAggregate(FunctionExpression &aggr, AggregateFu if (ordered_set_agg) { const bool order_sensitive = (aggr.function_name == "mode"); - for (auto &order : aggr.order_bys->orders) { - auto &child = BoundExpression::GetExpression(*order.expression); - types.push_back(child->return_type); - arguments.push_back(child->return_type); - if (order_sensitive) { - children.push_back(child->Copy()); - } else { - children.push_back(std::move(child)); + // Inject missing ordering arguments + if (aggr.children.size() < ordered_set_agg) { + for (auto &order : aggr.order_bys->orders) { + auto &child = BoundExpression::GetExpression(*order.expression); + types.push_back(child->return_type); + arguments.push_back(child->return_type); + if (order_sensitive) { + children.push_back(child->Copy()); + } else { + children.push_back(std::move(child)); + } } } if (!order_sensitive) { @@ -205,13 +212,13 @@ BindResult BaseSelectBinder::BindAggregate(FunctionExpression &aggr, AggregateFu // bind the aggregate FunctionBinder function_binder(context); - idx_t best_function = function_binder.BindFunction(func.name, func.functions, types, error); - if (best_function == DConstants::INVALID_INDEX) { + auto best_function = function_binder.BindFunction(func.name, func.functions, types, error); + if (!best_function.IsValid()) { error.AddQueryLocation(aggr); error.Throw(); } // found a matching function! - auto bound_function = func.functions.GetFunctionByOffset(best_function); + auto bound_function = func.functions.GetFunctionByOffset(best_function.GetIndex()); // Bind any sort columns, unless the aggregate is order-insensitive unique_ptr order_bys; @@ -226,6 +233,22 @@ BindResult BaseSelectBinder::BindAggregate(FunctionExpression &aggr, AggregateFu } } + // If the aggregate is DISTINCT then the ORDER BYs need to be arguments. + if (aggr.distinct && order_bys) { + for (const auto &order_by : order_bys->orders) { + bool is_arg = false; + for (const auto &child : children) { + if (order_by.expression->Equals(*child)) { + is_arg = true; + break; + } + } + if (!is_arg) { + throw BinderException("In a DISTINCT aggregate, ORDER BY expressions must appear in the argument list"); + } + } + } + auto aggregate = function_binder.BindAggregateFunction(bound_function, std::move(children), std::move(bound_filter), aggr.distinct ? AggregateType::DISTINCT : AggregateType::NON_DISTINCT); diff --git a/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp b/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp index 92a41d7f..58d50a46 100644 --- a/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +++ b/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp @@ -4,6 +4,7 @@ #include "duckdb/planner/expression/bound_aggregate_expression.hpp" #include "duckdb/planner/expression/bound_columnref_expression.hpp" #include "duckdb/planner/expression/bound_constant_expression.hpp" +#include "duckdb/planner/expression/bound_expanded_expression.hpp" #include "duckdb/planner/expression/bound_function_expression.hpp" #include "duckdb/planner/expression/bound_parameter_expression.hpp" #include "duckdb/planner/expression_binder/aggregate_binder.hpp" @@ -47,10 +48,15 @@ BindResult SelectBinder::BindUnnest(FunctionExpression &function, idx_t depth, b if (depth > 0) { return BindResult(BinderException(function, "UNNEST() for correlated expressions is not supported yet")); } + ErrorData error; if (function.children.empty()) { return BindResult(BinderException(function, "UNNEST() requires a single argument")); } + if (inside_window) { + return BindResult(BinderException(function, UnsupportedUnnestMessage())); + } + idx_t max_depth = 1; if (function.children.size() != 1) { bool has_parameter = false; @@ -65,7 +71,7 @@ BindResult SelectBinder::BindUnnest(FunctionExpression &function, idx_t depth, b if (!function.children[i]->IsScalar()) { break; } - auto alias = function.children[i]->alias; + auto alias = StringUtil::Lower(function.children[i]->alias); BindChild(function.children[i], depth, error); if (error.HasError()) { return BindResult(std::move(error)); @@ -219,8 +225,7 @@ BindResult SelectBinder::BindUnnest(FunctionExpression &function, idx_t depth, b break; } } - expanded_expressions = std::move(struct_expressions); - unnest_expr = make_uniq(Value(42)); + unnest_expr = make_uniq(std::move(struct_expressions)); } return BindResult(std::move(unnest_expr)); } diff --git a/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp b/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp index 7801f5e6..677ec8dd 100644 --- a/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +++ b/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp @@ -1,6 +1,11 @@ -#include "duckdb/parser/expression/window_expression.hpp" +#include "duckdb/catalog/catalog.hpp" +#include "duckdb/catalog/catalog_entry/aggregate_function_catalog_entry.hpp" +#include "duckdb/function/function_binder.hpp" +#include "duckdb/function/scalar_function.hpp" +#include "duckdb/main/config.hpp" #include "duckdb/parser/expression/constant_expression.hpp" #include "duckdb/parser/expression/function_expression.hpp" +#include "duckdb/parser/expression/window_expression.hpp" #include "duckdb/planner/expression/bound_aggregate_expression.hpp" #include "duckdb/planner/expression/bound_cast_expression.hpp" #include "duckdb/planner/expression/bound_columnref_expression.hpp" @@ -8,13 +13,6 @@ #include "duckdb/planner/expression/bound_window_expression.hpp" #include "duckdb/planner/expression_binder/select_binder.hpp" #include "duckdb/planner/query_node/bound_select_node.hpp" -#include "duckdb/planner/binder.hpp" -#include "duckdb/main/config.hpp" -#include "duckdb/function/scalar_function.hpp" -#include "duckdb/function/function_binder.hpp" - -#include "duckdb/catalog/catalog.hpp" -#include "duckdb/catalog/catalog_entry/aggregate_function_catalog_entry.hpp" namespace duckdb { @@ -153,6 +151,7 @@ BindResult BaseSelectBinder::BindWindow(WindowExpression &window, idx_t depth) { if (depth > 0) { throw BinderException(error_context, "correlated columns in window functions not supported"); } + // If we have range expressions, then only one order by clause is allowed. const auto is_range = (window.start == WindowBoundary::EXPR_PRECEDING_RANGE || window.start == WindowBoundary::EXPR_FOLLOWING_RANGE || @@ -162,7 +161,7 @@ BindResult BaseSelectBinder::BindWindow(WindowExpression &window, idx_t depth) { } // bind inside the children of the window function // we set the inside_window flag to true to prevent binding nested window functions - this->inside_window = true; + inside_window = true; ErrorData error; for (auto &child : window.children) { BindChild(child, depth, error); @@ -194,7 +193,7 @@ BindResult BaseSelectBinder::BindWindow(WindowExpression &window, idx_t depth) { BindChild(window.offset_expr, depth, error); BindChild(window.default_expr, depth, error); - this->inside_window = false; + inside_window = false; if (error.HasError()) { // failed to bind children of window function return BindResult(std::move(error)); @@ -249,21 +248,23 @@ BindResult BaseSelectBinder::BindWindow(WindowExpression &window, idx_t depth) { D_ASSERT(func.type == CatalogType::AGGREGATE_FUNCTION_ENTRY); // bind the aggregate - ErrorData error; + ErrorData error_aggr; FunctionBinder function_binder(context); - auto best_function = function_binder.BindFunction(func.name, func.functions, types, error); - if (best_function == DConstants::INVALID_INDEX) { - error.AddQueryLocation(window); - error.Throw(); + auto best_function = function_binder.BindFunction(func.name, func.functions, types, error_aggr); + if (!best_function.IsValid()) { + error_aggr.AddQueryLocation(window); + error_aggr.Throw(); } + // found a matching function! bind it as an aggregate - auto bound_function = func.functions.GetFunctionByOffset(best_function); - auto bound_aggregate = function_binder.BindAggregateFunction(bound_function, std::move(children)); + auto bound_function = func.functions.GetFunctionByOffset(best_function.GetIndex()); + auto window_bound_aggregate = function_binder.BindAggregateFunction(bound_function, std::move(children)); // create the aggregate - aggregate = make_uniq(bound_aggregate->function); - bind_info = std::move(bound_aggregate->bind_info); - children = std::move(bound_aggregate->children); - sql_type = bound_aggregate->return_type; + aggregate = make_uniq(window_bound_aggregate->function); + bind_info = std::move(window_bound_aggregate->bind_info); + children = std::move(window_bound_aggregate->children); + sql_type = window_bound_aggregate->return_type; + } else { // fetch the child of the non-aggregate window function (if any) sql_type = ResolveWindowExpressionType(window.type, types); @@ -286,26 +287,28 @@ BindResult BaseSelectBinder::BindWindow(WindowExpression &window, idx_t depth) { if (window.start == WindowBoundary::EXPR_PRECEDING_RANGE) { D_ASSERT(window.orders.size() == 1); range_sense = config.ResolveOrder(window.orders[0].type); - const auto name = (range_sense == OrderType::ASCENDING) ? "-" : "+"; - start_type = BindRangeExpression(context, name, window.start_expr, window.orders[0].expression); + const auto range_name = (range_sense == OrderType::ASCENDING) ? "-" : "+"; + start_type = BindRangeExpression(context, range_name, window.start_expr, window.orders[0].expression); + } else if (window.start == WindowBoundary::EXPR_FOLLOWING_RANGE) { D_ASSERT(window.orders.size() == 1); range_sense = config.ResolveOrder(window.orders[0].type); - const auto name = (range_sense == OrderType::ASCENDING) ? "+" : "-"; - start_type = BindRangeExpression(context, name, window.start_expr, window.orders[0].expression); + const auto range_name = (range_sense == OrderType::ASCENDING) ? "+" : "-"; + start_type = BindRangeExpression(context, range_name, window.start_expr, window.orders[0].expression); } LogicalType end_type = LogicalType::BIGINT; if (window.end == WindowBoundary::EXPR_PRECEDING_RANGE) { D_ASSERT(window.orders.size() == 1); range_sense = config.ResolveOrder(window.orders[0].type); - const auto name = (range_sense == OrderType::ASCENDING) ? "-" : "+"; - end_type = BindRangeExpression(context, name, window.end_expr, window.orders[0].expression); + const auto range_name = (range_sense == OrderType::ASCENDING) ? "-" : "+"; + end_type = BindRangeExpression(context, range_name, window.end_expr, window.orders[0].expression); + } else if (window.end == WindowBoundary::EXPR_FOLLOWING_RANGE) { D_ASSERT(window.orders.size() == 1); range_sense = config.ResolveOrder(window.orders[0].type); - const auto name = (range_sense == OrderType::ASCENDING) ? "+" : "-"; - end_type = BindRangeExpression(context, name, window.end_expr, window.orders[0].expression); + const auto range_name = (range_sense == OrderType::ASCENDING) ? "+" : "-"; + end_type = BindRangeExpression(context, range_name, window.end_expr, window.orders[0].expression); } // Cast ORDER and boundary expressions to the same type @@ -337,7 +340,6 @@ BindResult BaseSelectBinder::BindWindow(WindowExpression &window, idx_t depth) { } result->filter_expr = CastWindowExpression(window.filter_expr, LogicalType::BOOLEAN); - result->start_expr = CastWindowExpression(window.start_expr, start_type); result->end_expr = CastWindowExpression(window.end_expr, end_type); result->offset_expr = CastWindowExpression(window.offset_expr, LogicalType::BIGINT); diff --git a/src/duckdb/src/planner/binder/query_node/bind_cte_node.cpp b/src/duckdb/src/planner/binder/query_node/bind_cte_node.cpp index c422b7d8..cd61b03e 100644 --- a/src/duckdb/src/planner/binder/query_node/bind_cte_node.cpp +++ b/src/duckdb/src/planner/binder/query_node/bind_cte_node.cpp @@ -9,12 +9,19 @@ namespace duckdb { unique_ptr Binder::BindNode(CTENode &statement) { + // first recursively visit the materialized CTE operations + // the left side is visited first and is added to the BindContext of the right side + D_ASSERT(statement.query); + + return BindCTE(statement); +} + +unique_ptr Binder::BindCTE(CTENode &statement) { auto result = make_uniq(); // first recursively visit the materialized CTE operations // the left side is visited first and is added to the BindContext of the right side D_ASSERT(statement.query); - D_ASSERT(statement.child); result->ctename = statement.ctename; result->setop_index = GenerateTableIndex(); @@ -46,28 +53,32 @@ unique_ptr Binder::BindNode(CTENode &statement) { result->child_binder = Binder::CreateBinder(context, this); - // Move all modifiers to the child node. - for (auto &modifier : statement.modifiers) { - statement.child->modifiers.push_back(std::move(modifier)); - } - - statement.modifiers.clear(); - // Add bindings of left side to temporary CTE bindings context result->child_binder->bind_context.AddCTEBinding(result->setop_index, statement.ctename, names, result->types); - result->child = result->child_binder->BindNode(*statement.child); - for (auto &c : result->query_binder->correlated_columns) { - result->child_binder->AddCorrelatedColumn(c); - } - // the result types of the CTE are the types of the LHS - result->types = result->child->types; - result->names = result->child->names; + if (statement.child) { + // Move all modifiers to the child node. + for (auto &modifier : statement.modifiers) { + statement.child->modifiers.push_back(std::move(modifier)); + } + + statement.modifiers.clear(); + + result->child = result->child_binder->BindNode(*statement.child); + for (auto &c : result->query_binder->correlated_columns) { + result->child_binder->AddCorrelatedColumn(c); + } + + // the result types of the CTE are the types of the LHS + result->types = result->child->types; + result->names = result->child->names; + + MoveCorrelatedExpressions(*result->child_binder); + } MoveCorrelatedExpressions(*result->query_binder); - MoveCorrelatedExpressions(*result->child_binder); - return std::move(result); + return result; } } // namespace duckdb diff --git a/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp b/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp index accd54a2..8c557a45 100644 --- a/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +++ b/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp @@ -14,6 +14,8 @@ #include "duckdb/parser/tableref/joinref.hpp" #include "duckdb/planner/binder.hpp" #include "duckdb/planner/expression/bound_aggregate_expression.hpp" +#include "duckdb/planner/expression/bound_constant_expression.hpp" +#include "duckdb/planner/expression/bound_expanded_expression.hpp" #include "duckdb/planner/expression_binder/column_alias_binder.hpp" #include "duckdb/planner/expression_binder/constant_binder.hpp" #include "duckdb/planner/expression_binder/group_binder.hpp" @@ -25,6 +27,7 @@ #include "duckdb/planner/expression_iterator.hpp" #include "duckdb/planner/query_node/bound_select_node.hpp" #include "duckdb/parser/expression/function_expression.hpp" +#include "duckdb/planner/expression_binder/select_bind_state.hpp" namespace duckdb { @@ -36,29 +39,29 @@ unique_ptr Binder::BindOrderExpression(OrderBinder &order_binder, un // remove the expression from the DISTINCT ON list return nullptr; } - D_ASSERT(bound_expr->type == ExpressionType::BOUND_COLUMN_REF); + D_ASSERT(bound_expr->type == ExpressionType::VALUE_CONSTANT); return bound_expr; } BoundLimitNode Binder::BindLimitValue(OrderBinder &order_binder, unique_ptr limit_val, bool is_percentage, bool is_offset) { auto new_binder = Binder::CreateBinder(context, this, true); - if (limit_val->HasSubquery()) { + ExpressionBinder expr_binder(*new_binder, context); + auto target_type = is_percentage ? LogicalType::DOUBLE : LogicalType::BIGINT; + expr_binder.target_type = target_type; + auto original_limit = limit_val->Copy(); + auto expr = expr_binder.Bind(limit_val); + if (expr->HasSubquery()) { if (!order_binder.HasExtraList()) { throw BinderException("Subquery in LIMIT/OFFSET not supported in set operation"); } - auto bound_limit = order_binder.CreateExtraReference(std::move(limit_val)); + auto bound_limit = order_binder.CreateExtraReference(std::move(original_limit)); if (is_percentage) { return BoundLimitNode::ExpressionPercentage(std::move(bound_limit)); } else { return BoundLimitNode::ExpressionValue(std::move(bound_limit)); } } - ExpressionBinder expr_binder(*new_binder, context); - auto target_type = is_percentage ? LogicalType::DOUBLE : LogicalType::BIGINT; - ; - expr_binder.target_type = target_type; - auto expr = expr_binder.Bind(limit_val); if (expr->IsFoldable()) { //! this is a constant auto val = ExpressionExecutor::EvaluateScalar(context, *expr).CastAs(context, target_type); @@ -121,7 +124,7 @@ unique_ptr Binder::BindLimitPercent(OrderBinder &order_bind return std::move(result); } -void Binder::BindModifiers(OrderBinder &order_binder, QueryNode &statement, BoundQueryNode &result) { +void Binder::PrepareModifiers(OrderBinder &order_binder, QueryNode &statement, BoundQueryNode &result) { for (auto &mod : statement.modifiers) { unique_ptr bound_modifier; switch (mod->type) { @@ -157,16 +160,12 @@ void Binder::BindModifiers(OrderBinder &order_binder, QueryNode &statement, Boun if (star.exclude_list.empty() && star.replace_list.empty() && !star.expr) { // ORDER BY ALL // replace the order list with the all elements in the SELECT list - auto order_type = order.orders[0].type; - auto null_order = order.orders[0].null_order; - - vector new_orders; - for (idx_t i = 0; i < order_binder.MaxCount(); i++) { - new_orders.emplace_back( - order_type, null_order, - make_uniq(Value::INTEGER(UnsafeNumericCast(i + 1)))); - } - order.orders = std::move(new_orders); + auto order_type = config.ResolveOrder(order.orders[0].type); + auto null_order = config.ResolveNullOrder(order_type, order.orders[0].null_order); + auto constant_expr = make_uniq(Value("ALL")); + bound_order->orders.emplace_back(order_type, null_order, std::move(constant_expr)); + bound_modifier = std::move(bound_order); + break; } } #if 0 @@ -233,10 +232,66 @@ void Binder::BindModifiers(OrderBinder &order_binder, QueryNode &statement, Boun } } -static void AssignReturnType(unique_ptr &expr, const vector &sql_types) { +unique_ptr CreateOrderExpression(unique_ptr expr, const vector &names, + const vector &sql_types, idx_t table_index, idx_t index) { + if (index >= sql_types.size()) { + throw BinderException(*expr, "ORDER term out of range - should be between 1 and %lld", sql_types.size()); + } + auto result = make_uniq(std::move(expr->alias), sql_types[index], + ColumnBinding(table_index, index)); + if (result->alias.empty() && index < names.size()) { + result->alias = names[index]; + } + return std::move(result); +} + +unique_ptr FinalizeBindOrderExpression(unique_ptr expr, idx_t table_index, + const vector &names, const vector &sql_types, + const SelectBindState &bind_state) { + auto &constant = expr->Cast(); + switch (constant.value.type().id()) { + case LogicalTypeId::UBIGINT: { + // index + auto index = UBigIntValue::Get(constant.value); + return CreateOrderExpression(std::move(expr), names, sql_types, table_index, bind_state.GetFinalIndex(index)); + } + case LogicalTypeId::VARCHAR: { + // ORDER BY ALL + return nullptr; + } + case LogicalTypeId::STRUCT: { + // collation + auto &struct_values = StructValue::GetChildren(constant.value); + if (struct_values.size() > 2) { + throw InternalException("Expected one or two children: index and optional collation"); + } + auto index = UBigIntValue::Get(struct_values[0]); + string collation; + if (struct_values.size() == 2) { + collation = StringValue::Get(struct_values[1]); + } + auto result = CreateOrderExpression(std::move(expr), names, sql_types, table_index, index); + if (!collation.empty()) { + if (sql_types[index].id() != LogicalTypeId::VARCHAR) { + throw BinderException(*result, "COLLATE can only be applied to varchar columns"); + } + result->return_type = LogicalType::VARCHAR_COLLATION(std::move(collation)); + } + return result; + } + default: + throw InternalException("Unknown type in FinalizeBindOrderExpression"); + } +} + +static void AssignReturnType(unique_ptr &expr, idx_t table_index, const vector &names, + const vector &sql_types, const SelectBindState &bind_state) { if (!expr) { return; } + if (expr->type == ExpressionType::VALUE_CONSTANT) { + expr = FinalizeBindOrderExpression(std::move(expr), table_index, names, sql_types, bind_state); + } if (expr->type != ExpressionType::BOUND_COLUMN_REF) { return; } @@ -244,8 +299,8 @@ static void AssignReturnType(unique_ptr &expr, const vector &sql_types, idx_t, - const vector &expansion_count) { +void Binder::BindModifiers(BoundQueryNode &result, idx_t table_index, const vector &names, + const vector &sql_types, const SelectBindState &bind_state) { for (auto &bound_mod : result.modifiers) { switch (bound_mod->type) { case ResultModifierType::DISTINCT_MODIFIER: { @@ -253,59 +308,48 @@ void Binder::BindModifierTypes(BoundQueryNode &result, const vector D_ASSERT(!distinct.target_distincts.empty()); // set types of distinct targets for (auto &expr : distinct.target_distincts) { - D_ASSERT(expr->type == ExpressionType::BOUND_COLUMN_REF); - auto &bound_colref = expr->Cast(); - if (bound_colref.binding.column_index == DConstants::INVALID_INDEX) { - throw BinderException("Ambiguous name in DISTINCT ON!"); - } - - idx_t max_count = sql_types.size(); - if (bound_colref.binding.column_index > max_count - 1) { - D_ASSERT(bound_colref.return_type == LogicalType::ANY); - throw BinderException("ORDER term out of range - should be between 1 and %lld", max_count); + expr = FinalizeBindOrderExpression(std::move(expr), table_index, names, sql_types, bind_state); + if (!expr) { + throw InternalException("DISTINCT ON ORDER BY ALL not supported"); } - - bound_colref.return_type = sql_types[bound_colref.binding.column_index]; } - for (auto &target_distinct : distinct.target_distincts) { - auto &bound_colref = target_distinct->Cast(); - const auto &sql_type = sql_types[bound_colref.binding.column_index]; - ExpressionBinder::PushCollation(context, target_distinct, sql_type, true); + for (auto &expr : distinct.target_distincts) { + ExpressionBinder::PushCollation(context, expr, expr->return_type, true); } break; } case ResultModifierType::LIMIT_MODIFIER: { auto &limit = bound_mod->Cast(); - AssignReturnType(limit.limit_val.GetExpression(), sql_types); - AssignReturnType(limit.offset_val.GetExpression(), sql_types); + AssignReturnType(limit.limit_val.GetExpression(), table_index, names, sql_types, bind_state); + AssignReturnType(limit.offset_val.GetExpression(), table_index, names, sql_types, bind_state); break; } case ResultModifierType::ORDER_MODIFIER: { - auto &order = bound_mod->Cast(); + bool order_by_all = false; for (auto &order_node : order.orders) { - auto &expr = order_node.expression; - D_ASSERT(expr->type == ExpressionType::BOUND_COLUMN_REF); - auto &bound_colref = expr->Cast(); - if (bound_colref.binding.column_index == DConstants::INVALID_INDEX) { - throw BinderException("Ambiguous name in ORDER BY!"); - } - - if (!expansion_count.empty() && bound_colref.return_type.id() != LogicalTypeId::ANY) { - bound_colref.binding.column_index = expansion_count[bound_colref.binding.column_index]; + expr = FinalizeBindOrderExpression(std::move(expr), table_index, names, sql_types, bind_state); + if (!expr) { + order_by_all = true; } - - idx_t max_count = sql_types.size(); - if (bound_colref.binding.column_index > max_count - 1) { - D_ASSERT(bound_colref.return_type == LogicalType::ANY); - throw BinderException("ORDER term out of range - should be between 1 and %lld", max_count); + } + if (order_by_all) { + D_ASSERT(order.orders.size() == 1); + auto order_type = order.orders[0].type; + auto null_order = order.orders[0].null_order; + order.orders.clear(); + for (idx_t i = 0; i < sql_types.size(); i++) { + auto expr = make_uniq(sql_types[i], ColumnBinding(table_index, i)); + if (i < names.size()) { + expr->alias = names[i]; + } + order.orders.emplace_back(order_type, null_order, std::move(expr)); } - - const auto &sql_type = sql_types[bound_colref.binding.column_index]; - bound_colref.return_type = sql_type; - - ExpressionBinder::PushCollation(context, order_node.expression, sql_type); + } + for (auto &order_node : order.orders) { + auto &expr = order_node.expression; + ExpressionBinder::PushCollation(context, order_node.expression, expr->return_type); } break; } @@ -380,19 +424,17 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ } statement.select_list = std::move(new_select_list); - // create a mapping of (alias -> index) and a mapping of (Expression -> index) for the SELECT list - case_insensitive_map_t alias_map; - parsed_expression_map_t projection_map; + auto &bind_state = result->bind_state; for (idx_t i = 0; i < statement.select_list.size(); i++) { auto &expr = statement.select_list[i]; result->names.push_back(expr->GetName()); ExpressionBinder::QualifyColumnNames(*this, expr); if (!expr->alias.empty()) { - alias_map[expr->alias] = i; + bind_state.alias_map[expr->alias] = i; result->names[i] = expr->alias; } - projection_map[*expr] = i; - result->original_expressions.push_back(expr->Copy()); + bind_state.projection_map[*expr] = i; + bind_state.original_expressions.push_back(expr->Copy()); } result->column_count = statement.select_list.size(); @@ -402,15 +444,15 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ // bind any star expressions in the WHERE clause BindWhereStarExpression(statement.where_clause); - ColumnAliasBinder alias_binder(*result, alias_map); + ColumnAliasBinder alias_binder(bind_state); WhereBinder where_binder(*this, context, &alias_binder); unique_ptr condition = std::move(statement.where_clause); result->where_clause = where_binder.Bind(condition); } // now bind all the result modifiers; including DISTINCT and ORDER BY targets - OrderBinder order_binder({this}, result->projection_index, statement, alias_map, projection_map); - BindModifiers(order_binder, statement, *result); + OrderBinder order_binder({this}, statement, bind_state); + PrepareModifiers(order_binder, statement, *result); vector> unbound_groups; BoundGroupInformation info; @@ -418,7 +460,7 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ if (!group_expressions.empty()) { // the statement has a GROUP BY clause, bind it unbound_groups.resize(group_expressions.size()); - GroupBinder group_binder(*this, context, statement, result->group_index, alias_map, info.alias_map); + GroupBinder group_binder(*this, context, statement, result->group_index, bind_state, info.alias_map); for (idx_t i = 0; i < group_expressions.size(); i++) { // we keep a copy of the unbound expression; @@ -468,35 +510,36 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ // bind the HAVING clause, if any if (statement.having) { - HavingBinder having_binder(*this, context, *result, info, alias_map, statement.aggregate_handling); + HavingBinder having_binder(*this, context, *result, info, statement.aggregate_handling); ExpressionBinder::QualifyColumnNames(*this, statement.having); result->having = having_binder.Bind(statement.having); } // bind the QUALIFY clause, if any - unique_ptr qualify_binder; + vector bound_qualify_columns; if (statement.qualify) { if (statement.aggregate_handling == AggregateHandling::FORCE_AGGREGATES) { throw BinderException("Combining QUALIFY with GROUP BY ALL is not supported yet"); } - qualify_binder = make_uniq(*this, context, *result, info, alias_map); + QualifyBinder qualify_binder(*this, context, *result, info); ExpressionBinder::QualifyColumnNames(*this, statement.qualify); - result->qualify = qualify_binder->Bind(statement.qualify); - if (qualify_binder->HasBoundColumns() && qualify_binder->BoundAggregates()) { - throw BinderException("Cannot mix aggregates with non-aggregated columns!"); + result->qualify = qualify_binder.Bind(statement.qualify); + if (qualify_binder.HasBoundColumns()) { + if (qualify_binder.BoundAggregates()) { + throw BinderException("Cannot mix aggregates with non-aggregated columns!"); + } + bound_qualify_columns = qualify_binder.GetBoundColumns(); } } // after that, we bind to the SELECT list - SelectBinder select_binder(*this, context, *result, info, alias_map); + SelectBinder select_binder(*this, context, *result, info); // if we expand select-list expressions, e.g., via UNNEST, then we need to possibly // adjust the column index of the already bound ORDER BY modifiers, and not only set their types - vector modifier_sql_types; - vector modifier_expansion_count; - vector group_by_all_indexes; vector new_names; + vector internal_sql_types; for (idx_t i = 0; i < statement.select_list.size(); i++) { bool is_window = statement.select_list[i]->IsWindow(); @@ -506,33 +549,37 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ bool is_original_column = i < result->column_count; bool can_group_by_all = statement.aggregate_handling == AggregateHandling::FORCE_AGGREGATES && is_original_column; + result->bound_column_count++; - if (select_binder.HasExpandedExpressions()) { + if (expr->type == ExpressionType::BOUND_EXPANDED) { if (!is_original_column) { - throw InternalException("Only original columns can have expanded expressions"); + throw BinderException("UNNEST of struct cannot be used in ORDER BY/DISTINCT ON clause"); } if (statement.aggregate_handling == AggregateHandling::FORCE_AGGREGATES) { throw BinderException("UNNEST of struct cannot be combined with GROUP BY ALL"); } - auto &struct_expressions = select_binder.ExpandedExpressions(); + auto &expanded = expr->Cast(); + auto &struct_expressions = expanded.expanded_expressions; D_ASSERT(!struct_expressions.empty()); - modifier_expansion_count.push_back(modifier_sql_types.size()); for (auto &struct_expr : struct_expressions) { - modifier_sql_types.push_back(struct_expr->return_type); new_names.push_back(struct_expr->GetName()); result->types.push_back(struct_expr->return_type); + internal_sql_types.push_back(struct_expr->return_type); result->select_list.push_back(std::move(struct_expr)); } - - struct_expressions.clear(); + bind_state.AddExpandedColumn(struct_expressions.size()); continue; } - // not an expanded expression - modifier_expansion_count.push_back(modifier_sql_types.size()); - modifier_sql_types.push_back(result_type); + if (expr->IsVolatile()) { + bind_state.SetExpressionIsVolatile(i); + } + if (expr->HasSubquery()) { + bind_state.SetExpressionHasSubquery(i); + } + bind_state.AddRegularColumn(); if (can_group_by_all && select_binder.HasBoundColumns()) { if (select_binder.BoundAggregates()) { @@ -554,6 +601,7 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ new_names.push_back(std::move(result->names[i])); result->types.push_back(result_type); } + internal_sql_types.push_back(result_type); if (can_group_by_all) { select_binder.ResetBindings(); @@ -581,17 +629,14 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ if (statement.aggregate_handling == AggregateHandling::NO_AGGREGATES_ALLOWED) { throw BinderException("Aggregates cannot be present in a Project relation!"); } else { - vector> to_check_binders; - to_check_binders.push_back(select_binder); - if (qualify_binder) { - to_check_binders.push_back(*qualify_binder); + vector bound_columns; + if (select_binder.HasBoundColumns()) { + bound_columns = select_binder.GetBoundColumns(); } - for (auto &binder : to_check_binders) { - auto &sel_binder = binder.get(); - if (!sel_binder.HasBoundColumns()) { - continue; - } - auto &bound_columns = sel_binder.GetBoundColumns(); + for (auto &bound_qualify_col : bound_qualify_columns) { + bound_columns.push_back(bound_qualify_col); + } + if (!bound_columns.empty()) { string error; error = "column \"%s\" must appear in the GROUP BY clause or must be part of an aggregate function."; if (statement.aggregate_handling == AggregateHandling::FORCE_AGGREGATES) { @@ -616,7 +661,7 @@ unique_ptr Binder::BindSelectNode(SelectNode &statement, unique_ } // now that the SELECT list is bound, we set the types of DISTINCT/ORDER BY expressions - BindModifierTypes(*result, modifier_sql_types, result->projection_index, modifier_expansion_count); + BindModifiers(*result, result->projection_index, result->names, internal_sql_types, bind_state); return std::move(result); } diff --git a/src/duckdb/src/planner/binder/query_node/bind_setop_node.cpp b/src/duckdb/src/planner/binder/query_node/bind_setop_node.cpp index 0d8d4445..316e9c9e 100644 --- a/src/duckdb/src/planner/binder/query_node/bind_setop_node.cpp +++ b/src/duckdb/src/planner/binder/query_node/bind_setop_node.cpp @@ -9,12 +9,12 @@ #include "duckdb/planner/expression_binder/order_binder.hpp" #include "duckdb/planner/query_node/bound_select_node.hpp" #include "duckdb/planner/query_node/bound_set_operation_node.hpp" +#include "duckdb/planner/expression_binder/select_bind_state.hpp" #include "duckdb/common/enum_util.hpp" namespace duckdb { -static void GatherAliases(BoundQueryNode &node, case_insensitive_map_t &aliases, - parsed_expression_map_t &expressions, const vector &reorder_idx) { +static void GatherAliases(BoundQueryNode &node, SelectBindState &bind_state, const vector &reorder_idx) { if (node.type == QueryNodeType::SET_OPERATION_NODE) { // setop, recurse auto &setop = node.Cast(); @@ -32,41 +32,45 @@ static void GatherAliases(BoundQueryNode &node, case_insensitive_map_t &a } // use new reorder index - GatherAliases(*setop.left, aliases, expressions, new_left_reorder_idx); - GatherAliases(*setop.right, aliases, expressions, new_right_reorder_idx); + GatherAliases(*setop.left, bind_state, new_left_reorder_idx); + GatherAliases(*setop.right, bind_state, new_right_reorder_idx); return; } - GatherAliases(*setop.left, aliases, expressions, reorder_idx); - GatherAliases(*setop.right, aliases, expressions, reorder_idx); + GatherAliases(*setop.left, bind_state, reorder_idx); + GatherAliases(*setop.right, bind_state, reorder_idx); } else { // query node D_ASSERT(node.type == QueryNodeType::SELECT_NODE); auto &select = node.Cast(); - // fill the alias lists + // fill the alias lists with the names for (idx_t i = 0; i < select.names.size(); i++) { auto &name = select.names[i]; - auto &expr = select.original_expressions[i]; // first check if the alias is already in there - auto entry = aliases.find(name); + auto entry = bind_state.alias_map.find(name); idx_t index = reorder_idx[i]; - if (entry == aliases.end()) { + if (entry == bind_state.alias_map.end()) { // the alias is not in there yet, just assign it - aliases[name] = index; + bind_state.alias_map[name] = index; } + } + // check if the expression matches one of the expressions in the original expression liset + for (idx_t i = 0; i < select.bind_state.original_expressions.size(); i++) { + auto &expr = select.bind_state.original_expressions[i]; + idx_t index = reorder_idx[i]; // now check if the node is already in the set of expressions - auto expr_entry = expressions.find(*expr); - if (expr_entry != expressions.end()) { + auto expr_entry = bind_state.projection_map.find(*expr); + if (expr_entry != bind_state.projection_map.end()) { // the node is in there // repeat the same as with the alias: if there is an ambiguity we insert "-1" if (expr_entry->second != index) { - expressions[*expr] = DConstants::INVALID_INDEX; + bind_state.projection_map[*expr] = DConstants::INVALID_INDEX; } } else { // not in there yet, just place it in there - expressions[*expr] = index; + bind_state.projection_map[*expr] = index; } } } @@ -114,8 +118,8 @@ static void BuildUnionByNameInfo(ClientContext &context, BoundSetOperationNode & bool right_exist = right_index != right_names_map.end(); LogicalType result_type; if (left_exist && right_exist) { - result_type = LogicalType::MaxLogicalType(context, left_node.types[left_index->second], - right_node.types[right_index->second]); + result_type = LogicalType::ForceMaxLogicalType(left_node.types[left_index->second], + right_node.types[right_index->second]); if (left_index->second != i || right_index->second != i) { need_reorder = true; } @@ -225,32 +229,30 @@ unique_ptr Binder::BindNode(SetOperationNode &statement) { } } + SelectBindState bind_state; if (!statement.modifiers.empty()) { // handle the ORDER BY/DISTINCT clauses // we recursively visit the children of this node to extract aliases and expressions that can be referenced // in the ORDER BY - case_insensitive_map_t alias_map; - parsed_expression_map_t expression_map; if (result->setop_type == SetOperationType::UNION_BY_NAME) { - GatherAliases(*result->left, alias_map, expression_map, result->left_reorder_idx); - GatherAliases(*result->right, alias_map, expression_map, result->right_reorder_idx); + GatherAliases(*result->left, bind_state, result->left_reorder_idx); + GatherAliases(*result->right, bind_state, result->right_reorder_idx); } else { vector reorder_idx; for (idx_t i = 0; i < result->names.size(); i++) { reorder_idx.push_back(i); } - GatherAliases(*result, alias_map, expression_map, reorder_idx); + GatherAliases(*result, bind_state, reorder_idx); } // now we perform the actual resolution of the ORDER BY/DISTINCT expressions - OrderBinder order_binder({result->left_binder.get(), result->right_binder.get()}, result->setop_index, - alias_map, expression_map, result->names.size()); - BindModifiers(order_binder, statement, *result); + OrderBinder order_binder({result->left_binder.get(), result->right_binder.get()}, bind_state); + PrepareModifiers(order_binder, statement, *result); } // finally bind the types of the ORDER/DISTINCT clause expressions - BindModifierTypes(*result, result->types, result->setop_index); + BindModifiers(*result, result->setop_index, result->names, result->types, bind_state); return std::move(result); } diff --git a/src/duckdb/src/planner/binder/query_node/plan_cte_node.cpp b/src/duckdb/src/planner/binder/query_node/plan_cte_node.cpp index b3dbe43f..f221ade5 100644 --- a/src/duckdb/src/planner/binder/query_node/plan_cte_node.cpp +++ b/src/duckdb/src/planner/binder/query_node/plan_cte_node.cpp @@ -23,4 +23,33 @@ unique_ptr Binder::CreatePlan(BoundCTENode &node) { return VisitQueryNode(node, std::move(root)); } +unique_ptr Binder::CreatePlan(BoundCTENode &node, unique_ptr base) { + // Generate the logical plan for the cte_query and child. + auto cte_query = CreatePlan(*node.query); + unique_ptr cte_child; + if (node.child && node.child->type == QueryNodeType::CTE_NODE) { + cte_child = CreatePlan(node.child->Cast(), std::move(base)); + } else if (node.child) { + cte_child = CreatePlan(*node.child); + } else { + cte_child = std::move(base); + } + + // Only keep the materialized CTE, if it is used + if (node.child_binder->bind_context.cte_references[node.ctename] && + *node.child_binder->bind_context.cte_references[node.ctename] > 0) { + auto root = make_uniq(node.ctename, node.setop_index, node.types.size(), + std::move(cte_query), std::move(cte_child)); + + // check if there are any unplanned subqueries left in either child + has_unplanned_dependent_joins = has_unplanned_dependent_joins || + node.child_binder->has_unplanned_dependent_joins || + node.query_binder->has_unplanned_dependent_joins; + + return VisitQueryNode(node, std::move(root)); + } else { + return VisitQueryNode(node, std::move(cte_child)); + } +} + } // namespace duckdb diff --git a/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp b/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp index 7370457a..3f3aaa92 100644 --- a/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +++ b/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp @@ -254,7 +254,7 @@ static unique_ptr PlanCorrelatedSubquery(Binder &binder, BoundSubque FlattenDependentJoins flatten(binder, correlated_columns, perform_delim); // first we check which logical operators have correlated expressions in the first place - flatten.DetectCorrelatedExpressions(plan.get()); + flatten.DetectCorrelatedExpressions(*plan); // now we push the dependent join down auto dependent_join = flatten.PushDownDependentJoin(std::move(plan)); @@ -279,7 +279,7 @@ static unique_ptr PlanCorrelatedSubquery(Binder &binder, BoundSubque delim_join->mark_index = mark_index; // RHS FlattenDependentJoins flatten(binder, correlated_columns, perform_delim, true); - flatten.DetectCorrelatedExpressions(plan.get()); + flatten.DetectCorrelatedExpressions(*plan); auto dependent_join = flatten.PushDownDependentJoin(std::move(plan)); // fetch the set of columns @@ -307,7 +307,7 @@ static unique_ptr PlanCorrelatedSubquery(Binder &binder, BoundSubque delim_join->mark_index = mark_index; // RHS FlattenDependentJoins flatten(binder, correlated_columns, true, true); - flatten.DetectCorrelatedExpressions(plan.get()); + flatten.DetectCorrelatedExpressions(*plan); auto dependent_join = flatten.PushDownDependentJoin(std::move(plan)); // fetch the columns @@ -411,8 +411,8 @@ void Binder::PlanSubqueries(unique_ptr &expr_ptr, unique_ptr Binder::PlanLateralJoin(unique_ptr left, unique_ptr right, - vector &correlated_columns, - JoinType join_type, unique_ptr condition) { + vector &correlated, JoinType join_type, + unique_ptr condition) { // scan the right operator for correlated columns // correlated LATERAL JOIN vector conditions; @@ -423,13 +423,13 @@ unique_ptr Binder::PlanLateralJoin(unique_ptr arbitrary_expressions); } - auto perform_delim = PerformDuplicateElimination(*this, correlated_columns); - auto delim_join = CreateDuplicateEliminatedJoin(correlated_columns, join_type, std::move(left), perform_delim); + auto perform_delim = PerformDuplicateElimination(*this, correlated); + auto delim_join = CreateDuplicateEliminatedJoin(correlated, join_type, std::move(left), perform_delim); - FlattenDependentJoins flatten(*this, correlated_columns, perform_delim); + FlattenDependentJoins flatten(*this, correlated, perform_delim); // first we check which logical operators have correlated expressions in the first place - flatten.DetectCorrelatedExpressions(right.get(), true); + flatten.DetectCorrelatedExpressions(*right, true); // now we push the dependent join down auto dependent_join = flatten.PushDownDependentJoin(std::move(right)); @@ -448,7 +448,7 @@ unique_ptr Binder::PlanLateralJoin(unique_ptr D_ASSERT(delim_join->conditions.empty()); delim_join->conditions = std::move(conditions); // then add the delim join conditions - CreateDelimJoinConditions(*delim_join, correlated_columns, plan_columns, flatten.delim_offset, perform_delim); + CreateDelimJoinConditions(*delim_join, correlated, plan_columns, flatten.delim_offset, perform_delim); delim_join->AddChild(std::move(dependent_join)); // check if there are any arbitrary expressions left diff --git a/src/duckdb/src/planner/binder/statement/bind_copy.cpp b/src/duckdb/src/planner/binder/statement/bind_copy.cpp index d696a2c2..80cdc002 100644 --- a/src/duckdb/src/planner/binder/statement/bind_copy.cpp +++ b/src/duckdb/src/planner/binder/statement/bind_copy.cpp @@ -121,11 +121,12 @@ BoundStatement Binder::BindCopyTo(CopyStatement &stmt) { if (file_size_bytes.IsValid() && !partition_cols.empty()) { throw NotImplementedException("Can't combine FILE_SIZE_BYTES and PARTITION_BY for COPY"); } - bool is_remote_file = config.file_system->IsRemoteFile(stmt.info->file_path); + bool is_remote_file = FileSystem::IsRemoteFile(stmt.info->file_path); if (is_remote_file) { use_tmp_file = false; } else { - bool is_file_and_exists = config.file_system->FileExists(stmt.info->file_path); + auto &fs = FileSystem::GetFileSystem(context); + bool is_file_and_exists = fs.FileExists(stmt.info->file_path); bool is_stdout = stmt.info->file_path == "/dev/stdout"; if (!user_set_use_tmp_file) { use_tmp_file = is_file_and_exists && !per_thread_output && partition_cols.empty() && !is_stdout; diff --git a/src/duckdb/src/planner/binder/statement/bind_copy_database.cpp b/src/duckdb/src/planner/binder/statement/bind_copy_database.cpp index 8a0047da..9ab4cc44 100644 --- a/src/duckdb/src/planner/binder/statement/bind_copy_database.cpp +++ b/src/duckdb/src/planner/binder/statement/bind_copy_database.cpp @@ -1,12 +1,8 @@ #include "duckdb/catalog/catalog.hpp" #include "duckdb/parser/statement/copy_database_statement.hpp" #include "duckdb/catalog/catalog_entry/list.hpp" -#include "duckdb/parser/parsed_data/create_macro_info.hpp" #include "duckdb/parser/parsed_data/create_schema_info.hpp" -#include "duckdb/parser/parsed_data/create_sequence_info.hpp" #include "duckdb/parser/parsed_data/create_table_info.hpp" -#include "duckdb/parser/parsed_data/create_type_info.hpp" -#include "duckdb/parser/parsed_data/create_view_info.hpp" #include "duckdb/planner/operator/logical_copy_database.hpp" #include "duckdb/execution/operator/persistent/physical_export.hpp" #include "duckdb/planner/operator/logical_create_table.hpp" @@ -22,23 +18,23 @@ namespace duckdb { -unique_ptr Binder::BindCopyDatabaseSchema(CopyDatabaseStatement &stmt, Catalog &from_database, - Catalog &to_database) { - auto from_schemas = from_database.GetSchemas(context); +unique_ptr Binder::BindCopyDatabaseSchema(Catalog &source_catalog, + const string &target_database_name) { + auto source_schemas = source_catalog.GetSchemas(context); ExportEntries entries; - PhysicalExport::ExtractEntries(context, from_schemas, entries); + PhysicalExport::ExtractEntries(context, source_schemas, entries); - auto info = make_uniq(from_database, to_database); + auto info = make_uniq(target_database_name); // get a list of all schemas to copy over - for (auto &schema_ref : from_schemas) { + for (auto &schema_ref : source_schemas) { auto &schema = schema_ref.get().Cast(); if (schema.internal) { continue; } auto create_info = schema.GetInfo(); - create_info->catalog = to_database.GetName(); + create_info->catalog = target_database_name; create_info->on_conflict = OnCreateConflict::IGNORE_ON_CONFLICT; info->entries.push_back(std::move(create_info)); } @@ -49,7 +45,7 @@ unique_ptr Binder::BindCopyDatabaseSchema(CopyDatabaseStatement continue; } auto create_info = seq_entry.GetInfo(); - create_info->catalog = to_database.GetName(); + create_info->catalog = target_database_name; create_info->on_conflict = OnCreateConflict::ERROR_ON_CONFLICT; info->entries.push_back(std::move(create_info)); } @@ -60,7 +56,7 @@ unique_ptr Binder::BindCopyDatabaseSchema(CopyDatabaseStatement continue; } auto create_info = type_entry.GetInfo(); - create_info->catalog = to_database.GetName(); + create_info->catalog = target_database_name; create_info->on_conflict = OnCreateConflict::ERROR_ON_CONFLICT; info->entries.push_back(std::move(create_info)); } @@ -71,7 +67,7 @@ unique_ptr Binder::BindCopyDatabaseSchema(CopyDatabaseStatement continue; } auto create_info = table.GetInfo(); - create_info->catalog = to_database.GetName(); + create_info->catalog = target_database_name; create_info->on_conflict = OnCreateConflict::ERROR_ON_CONFLICT; info->entries.push_back(std::move(create_info)); } @@ -81,7 +77,7 @@ unique_ptr Binder::BindCopyDatabaseSchema(CopyDatabaseStatement continue; } auto create_info = macro.GetInfo(); - create_info->catalog = to_database.GetName(); + create_info->catalog = target_database_name; create_info->on_conflict = OnCreateConflict::ERROR_ON_CONFLICT; info->entries.push_back(std::move(create_info)); } @@ -92,7 +88,7 @@ unique_ptr Binder::BindCopyDatabaseSchema(CopyDatabaseStatement continue; } auto create_info = view.GetInfo(); - create_info->catalog = to_database.GetName(); + create_info->catalog = target_database_name; create_info->on_conflict = OnCreateConflict::ERROR_ON_CONFLICT; info->entries.push_back(std::move(create_info)); } @@ -101,24 +97,23 @@ unique_ptr Binder::BindCopyDatabaseSchema(CopyDatabaseStatement return make_uniq(std::move(info)); } -unique_ptr Binder::BindCopyDatabaseData(CopyDatabaseStatement &stmt, Catalog &from_database, - Catalog &to_database) { - auto from_schemas = from_database.GetSchemas(context); +unique_ptr Binder::BindCopyDatabaseData(Catalog &source_catalog, const string &target_database_name) { + auto source_schemas = source_catalog.GetSchemas(context); ExportEntries entries; - PhysicalExport::ExtractEntries(context, from_schemas, entries); + PhysicalExport::ExtractEntries(context, source_schemas, entries); unique_ptr result; for (auto &table_ref : entries.tables) { auto &table = table_ref.get(); // generate the insert statement InsertStatement insert_stmt; - insert_stmt.catalog = stmt.to_database; + insert_stmt.catalog = target_database_name; insert_stmt.schema = table.ParentSchema().name; insert_stmt.table = table.name; auto from_tbl = make_uniq(); - from_tbl->catalog_name = stmt.from_database; + from_tbl->catalog_name = source_catalog.GetName(); from_tbl->schema_name = table.ParentSchema().name; from_tbl->table_name = table.name; @@ -159,9 +154,9 @@ BoundStatement Binder::Bind(CopyDatabaseStatement &stmt) { BoundStatement result; unique_ptr plan; - auto &from_database = Catalog::GetCatalog(context, stmt.from_database); - auto &to_database = Catalog::GetCatalog(context, stmt.to_database); - if (&from_database == &to_database) { + auto &source_catalog = Catalog::GetCatalog(context, stmt.from_database); + auto &target_catalog = Catalog::GetCatalog(context, stmt.to_database); + if (&source_catalog == &target_catalog) { throw BinderException("Cannot copy from \"%s\" to \"%s\" - FROM and TO databases are the same", stmt.from_database, stmt.to_database); } @@ -169,18 +164,18 @@ BoundStatement Binder::Bind(CopyDatabaseStatement &stmt) { result.types = {LogicalType::BOOLEAN}; result.names = {"Success"}; - plan = BindCopyDatabaseSchema(stmt, from_database, to_database); + plan = BindCopyDatabaseSchema(source_catalog, target_catalog.GetName()); } else { result.types = {LogicalType::BIGINT}; result.names = {"Count"}; - plan = BindCopyDatabaseData(stmt, from_database, to_database); + plan = BindCopyDatabaseData(source_catalog, target_catalog.GetName()); } result.plan = std::move(plan); properties.allow_stream_result = false; properties.return_type = StatementReturnType::NOTHING; - properties.modified_databases.insert(stmt.to_database); + properties.modified_databases.insert(target_catalog.GetName()); return result; } diff --git a/src/duckdb/src/planner/binder/statement/bind_create.cpp b/src/duckdb/src/planner/binder/statement/bind_create.cpp index 7903342b..8f66ea03 100644 --- a/src/duckdb/src/planner/binder/statement/bind_create.cpp +++ b/src/duckdb/src/planner/binder/statement/bind_create.cpp @@ -42,6 +42,7 @@ #include "duckdb/catalog/duck_catalog.hpp" #include "duckdb/function/table/table_scan.hpp" #include "duckdb/parser/tableref/basetableref.hpp" +#include "duckdb/planner/expression_binder/select_bind_state.hpp" namespace duckdb { @@ -184,11 +185,10 @@ SchemaCatalogEntry &Binder::BindCreateFunctionInfo(CreateInfo &info) { // bind it to verify the function was defined correctly ErrorData error; - auto sel_node = make_uniq(); - auto group_info = make_uniq(); - SelectBinder binder(*this, context, *sel_node, *group_info); + BoundSelectNode sel_node; + BoundGroupInformation group_info; + SelectBinder binder(*this, context, sel_node, group_info); error = binder.Bind(expression, 0, false); - if (error.HasError()) { error.Throw(); } @@ -272,16 +272,16 @@ static void FindMatchingPrimaryKeyColumns(const ColumnList &columns, const vecto continue; } auto &unique = constr->Cast(); - if (find_primary_key && !unique.is_primary_key) { + if (find_primary_key && !unique.IsPrimaryKey()) { continue; } found_constraint = true; vector pk_names; - if (unique.index.index != DConstants::INVALID_INDEX) { - pk_names.push_back(columns.GetColumn(LogicalIndex(unique.index)).Name()); + if (unique.HasIndex()) { + pk_names.push_back(columns.GetColumn(LogicalIndex(unique.GetIndex())).Name()); } else { - pk_names = unique.columns; + pk_names = unique.GetColumnNames(); } if (find_primary_key) { // found matching primary key @@ -414,15 +414,14 @@ static bool AnyConstraintReferencesGeneratedColumn(CreateTableInfo &table_info) } case ConstraintType::UNIQUE: { auto &constraint = constr->Cast(); - auto index = constraint.index; - if (index.index == DConstants::INVALID_INDEX) { - for (auto &col : constraint.columns) { + if (!constraint.HasIndex()) { + for (auto &col : constraint.GetColumnNames()) { if (generated_columns.count(col)) { return true; } } } else { - if (table_info.columns.GetColumn(index).Generated()) { + if (table_info.columns.GetColumn(constraint.GetIndex()).Generated()) { return true; } } diff --git a/src/duckdb/src/planner/binder/statement/bind_create_table.cpp b/src/duckdb/src/planner/binder/statement/bind_create_table.cpp index 683c475d..4564cb0f 100644 --- a/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +++ b/src/duckdb/src/planner/binder/statement/bind_create_table.cpp @@ -76,17 +76,16 @@ static void BindConstraints(Binder &binder, BoundCreateTableInfo &info) { // have to resolve columns of the unique constraint vector keys; logical_index_set_t key_set; - if (unique.index.index != DConstants::INVALID_INDEX) { - D_ASSERT(unique.index.index < base.columns.LogicalColumnCount()); + if (unique.HasIndex()) { + D_ASSERT(unique.GetIndex().index < base.columns.LogicalColumnCount()); // unique constraint is given by single index - unique.columns.push_back(base.columns.GetColumn(unique.index).Name()); - keys.push_back(unique.index); - key_set.insert(unique.index); + unique.SetColumnName(base.columns.GetColumn(unique.GetIndex()).Name()); + keys.push_back(unique.GetIndex()); + key_set.insert(unique.GetIndex()); } else { // unique constraint is given by list of names // have to resolve names - D_ASSERT(!unique.columns.empty()); - for (auto &keyname : unique.columns) { + for (auto &keyname : unique.GetColumnNames()) { if (!base.columns.ColumnExists(keyname)) { throw ParserException("column \"%s\" named in key does not exist", keyname); } @@ -102,7 +101,7 @@ static void BindConstraints(Binder &binder, BoundCreateTableInfo &info) { } } - if (unique.is_primary_key) { + if (unique.IsPrimaryKey()) { // we can only have one primary key per table if (has_primary_key) { throw ParserException("table \"%s\" has more than one primary key", base.table); @@ -111,7 +110,7 @@ static void BindConstraints(Binder &binder, BoundCreateTableInfo &info) { primary_keys = keys; } info.bound_constraints.push_back( - make_uniq(std::move(keys), std::move(key_set), unique.is_primary_key)); + make_uniq(std::move(keys), std::move(key_set), unique.IsPrimaryKey())); break; } case ConstraintType::FOREIGN_KEY: { @@ -202,7 +201,6 @@ void Binder::BindGeneratedColumns(BoundCreateTableInfo &info) { col.SetType(bound_expression->return_type); // Update the type in the binding, for future expansions - string ignore; table_binding->types[i.index] = col.Type(); } bound_indices.insert(i); @@ -230,7 +228,7 @@ void Binder::BindDefaultValues(const ColumnList &columns, vector(); if (function.function.dependency) { diff --git a/src/duckdb/src/planner/binder/statement/bind_insert.cpp b/src/duckdb/src/planner/binder/statement/bind_insert.cpp index d0827fde..1829d776 100644 --- a/src/duckdb/src/planner/binder/statement/bind_insert.cpp +++ b/src/duckdb/src/planner/binder/statement/bind_insert.cpp @@ -305,25 +305,23 @@ void Binder::BindOnConflictClause(LogicalInsert &insert, TableCatalogEntry &tabl } auto bindings = insert.children[0]->GetColumnBindings(); - idx_t projection_index = DConstants::INVALID_INDEX; - vector> *insert_child_operators; - insert_child_operators = &insert.children; - while (projection_index == DConstants::INVALID_INDEX) { - if (insert_child_operators->empty()) { + optional_idx projection_index; + reference>> insert_child_operators = insert.children; + while (!projection_index.IsValid()) { + if (insert_child_operators.get().empty()) { // No further children to visit break; } - D_ASSERT(insert_child_operators->size() >= 1); - auto ¤t_child = (*insert_child_operators)[0]; + auto ¤t_child = insert_child_operators.get()[0]; auto table_indices = current_child->GetTableIndex(); if (table_indices.empty()) { // This operator does not have a table index to refer to, we have to visit its children - insert_child_operators = ¤t_child->children; + insert_child_operators = current_child->children; continue; } projection_index = table_indices[0]; } - if (projection_index == DConstants::INVALID_INDEX) { + if (!projection_index.IsValid()) { throw InternalException("Could not locate a table_index from the children of the insert"); } @@ -335,7 +333,7 @@ void Binder::BindOnConflictClause(LogicalInsert &insert, TableCatalogEntry &tabl // Replace any column bindings to refer to the projection table_index, rather than the source table if (insert.on_conflict_condition) { - ReplaceColumnBindings(*insert.on_conflict_condition, table_index, projection_index); + ReplaceColumnBindings(*insert.on_conflict_condition, table_index, projection_index.GetIndex()); } if (insert.action_type == OnConflictAction::REPLACE) { @@ -387,11 +385,11 @@ void Binder::BindOnConflictClause(LogicalInsert &insert, TableCatalogEntry &tabl // Replace the column bindings to refer to the child operator for (auto &expr : insert.expressions) { // Change the non-excluded column references to refer to the projection index - ReplaceColumnBindings(*expr, table_index, projection_index); + ReplaceColumnBindings(*expr, table_index, projection_index.GetIndex()); } // Do the same for the (optional) DO UPDATE condition if (insert.do_update_condition) { - ReplaceColumnBindings(*insert.do_update_condition, table_index, projection_index); + ReplaceColumnBindings(*insert.do_update_condition, table_index, projection_index.GetIndex()); } } @@ -442,7 +440,6 @@ BoundStatement Binder::Bind(InsertStatement &stmt) { if (!entry.second) { throw BinderException("Duplicate column name \"%s\" in INSERT", stmt.columns[i]); } - column_name_map[stmt.columns[i]] = i; auto column_index = table.GetColumnIndex(stmt.columns[i]); if (column_index.index == COLUMN_IDENTIFIER_ROW_ID) { throw BinderException("Cannot explicitly insert values into rowid column"); diff --git a/src/duckdb/src/planner/binder/statement/bind_pragma.cpp b/src/duckdb/src/planner/binder/statement/bind_pragma.cpp index 12f30e92..61bf0672 100644 --- a/src/duckdb/src/planner/binder/statement/bind_pragma.cpp +++ b/src/duckdb/src/planner/binder/statement/bind_pragma.cpp @@ -31,13 +31,13 @@ unique_ptr Binder::BindPragma(PragmaInfo &info, QueryErrorConte auto &entry = Catalog::GetEntry(context, INVALID_CATALOG, DEFAULT_SCHEMA, info.name); FunctionBinder function_binder(context); ErrorData error; - idx_t bound_idx = function_binder.BindFunction(entry.name, entry.functions, params, error); - if (bound_idx == DConstants::INVALID_INDEX) { + auto bound_idx = function_binder.BindFunction(entry.name, entry.functions, params, error); + if (!bound_idx.IsValid()) { D_ASSERT(error.HasError()); error.AddQueryLocation(error_context); error.Throw(); } - auto bound_function = entry.functions.GetFunctionByOffset(bound_idx); + auto bound_function = entry.functions.GetFunctionByOffset(bound_idx.GetIndex()); // bind and check named params BindNamedParameters(bound_function.named_parameters, named_parameters, error_context, bound_function.name); return make_uniq(std::move(bound_function), std::move(params), std::move(named_parameters)); diff --git a/src/duckdb/src/planner/binder/statement/bind_set.cpp b/src/duckdb/src/planner/binder/statement/bind_set.cpp index 15f33d31..77c23e22 100644 --- a/src/duckdb/src/planner/binder/statement/bind_set.cpp +++ b/src/duckdb/src/planner/binder/statement/bind_set.cpp @@ -15,6 +15,9 @@ BoundStatement Binder::Bind(SetVariableStatement &stmt) { // evaluate the scalar value ConstantBinder default_binder(*this, context, "SET value"); auto bound_value = default_binder.Bind(stmt.value); + if (bound_value->HasParameter()) { + throw NotImplementedException("SET statements cannot have parameters"); + } auto value = ExpressionExecutor::EvaluateScalar(context, *bound_value, true); result.plan = make_uniq(stmt.name, std::move(value), stmt.scope); diff --git a/src/duckdb/src/planner/binder/statement/bind_vacuum.cpp b/src/duckdb/src/planner/binder/statement/bind_vacuum.cpp index c7aaa0ab..5d48772e 100644 --- a/src/duckdb/src/planner/binder/statement/bind_vacuum.cpp +++ b/src/duckdb/src/planner/binder/statement/bind_vacuum.cpp @@ -3,84 +3,85 @@ #include "duckdb/planner/binder.hpp" #include "duckdb/planner/operator/logical_get.hpp" #include "duckdb/planner/operator/logical_projection.hpp" -#include "duckdb/planner/operator/logical_simple.hpp" +#include "duckdb/planner/operator/logical_vacuum.hpp" #include "duckdb/catalog/catalog_entry/table_catalog_entry.hpp" namespace duckdb { -BoundStatement Binder::Bind(VacuumStatement &stmt) { - BoundStatement result; +void Binder::BindVacuumTable(LogicalVacuum &vacuum, unique_ptr &root) { + auto &info = vacuum.GetInfo(); + if (!info.has_table) { + return; + } - unique_ptr root; + D_ASSERT(vacuum.column_id_map.empty()); + auto bound_table = Bind(*info.ref); + if (bound_table->type != TableReferenceType::BASE_TABLE) { + throw InvalidInputException("Can only vacuum/analyze base tables!"); + } + auto ref = unique_ptr_cast(std::move(bound_table)); + auto &table = ref->table; + vacuum.SetTable(table); - if (stmt.info->has_table) { - D_ASSERT(!stmt.info->table); - D_ASSERT(stmt.info->column_id_map.empty()); - auto bound_table = Bind(*stmt.info->ref); - if (bound_table->type != TableReferenceType::BASE_TABLE) { - throw InvalidInputException("Can only vacuum/analyze base tables!"); - } - auto ref = unique_ptr_cast(std::move(bound_table)); - auto &table = ref->table; - stmt.info->table = &table; + vector> select_list; + auto &columns = info.columns; + if (columns.empty()) { + // Empty means ALL columns should be vacuumed/analyzed + auto &get = ref->get->Cast(); + columns.insert(columns.end(), get.names.begin(), get.names.end()); + } - auto &columns = stmt.info->columns; - vector> select_list; - if (columns.empty()) { - // Empty means ALL columns should be vacuumed/analyzed - auto &get = ref->get->Cast(); - columns.insert(columns.end(), get.names.begin(), get.names.end()); + case_insensitive_set_t column_name_set; + vector non_generated_column_names; + for (auto &col_name : columns) { + if (column_name_set.count(col_name) > 0) { + throw BinderException("Vacuum the same column twice(same name in column name list)"); } - - case_insensitive_set_t column_name_set; - vector non_generated_column_names; - for (auto &col_name : columns) { - if (column_name_set.count(col_name) > 0) { - throw BinderException("Vacuum the same column twice(same name in column name list)"); - } - column_name_set.insert(col_name); - if (!table.ColumnExists(col_name)) { - throw BinderException("Column with name \"%s\" does not exist", col_name); - } - auto &col = table.GetColumn(col_name); - // ignore generated column - if (col.Generated()) { - continue; - } - non_generated_column_names.push_back(col_name); - ColumnRefExpression colref(col_name, table.name); - auto result = bind_context.BindColumn(colref, 0); - if (result.HasError()) { - result.error.Throw(); - } - select_list.push_back(std::move(result.expression)); + column_name_set.insert(col_name); + if (!table.ColumnExists(col_name)) { + throw BinderException("Column with name \"%s\" does not exist", col_name); } - stmt.info->columns = std::move(non_generated_column_names); - if (!select_list.empty()) { - auto table_scan = CreatePlan(*ref); - D_ASSERT(table_scan->type == LogicalOperatorType::LOGICAL_GET); - - auto &get = table_scan->Cast(); + auto &col = table.GetColumn(col_name); + // ignore generated column + if (col.Generated()) { + continue; + } + non_generated_column_names.push_back(col_name); + ColumnRefExpression colref(col_name, table.name); + auto result = bind_context.BindColumn(colref, 0); + if (result.HasError()) { + result.error.Throw(); + } + select_list.push_back(std::move(result.expression)); + } + info.columns = std::move(non_generated_column_names); + // Creating a table without any physical columns is not supported + D_ASSERT(!select_list.empty()); - D_ASSERT(select_list.size() == get.column_ids.size()); - D_ASSERT(stmt.info->columns.size() == get.column_ids.size()); - for (idx_t i = 0; i < get.column_ids.size(); i++) { - stmt.info->column_id_map[i] = - table.GetColumns().LogicalToPhysical(LogicalIndex(get.column_ids[i])).index; - } + auto table_scan = CreatePlan(*ref); + D_ASSERT(table_scan->type == LogicalOperatorType::LOGICAL_GET); - auto projection = make_uniq(GenerateTableIndex(), std::move(select_list)); - projection->children.push_back(std::move(table_scan)); + auto &get = table_scan->Cast(); - root = std::move(projection); - } else { - // eg. CREATE TABLE test (x AS (1)); - // ANALYZE test; - // Make it not a SINK so it doesn't have to do anything - stmt.info->has_table = false; - } + D_ASSERT(select_list.size() == get.column_ids.size()); + D_ASSERT(info.columns.size() == get.column_ids.size()); + for (idx_t i = 0; i < get.column_ids.size(); i++) { + vacuum.column_id_map[i] = table.GetColumns().LogicalToPhysical(LogicalIndex(get.column_ids[i])).index; } - auto vacuum = make_uniq(LogicalOperatorType::LOGICAL_VACUUM, std::move(stmt.info)); + + auto projection = make_uniq(GenerateTableIndex(), std::move(select_list)); + projection->children.push_back(std::move(table_scan)); + + root = std::move(projection); +} + +BoundStatement Binder::Bind(VacuumStatement &stmt) { + BoundStatement result; + + unique_ptr root; + + auto vacuum = make_uniq(std::move(stmt.info)); + BindVacuumTable(*vacuum, root); if (root) { vacuum->children.push_back(std::move(root)); } diff --git a/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp b/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp index f68634db..30b2b264 100644 --- a/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +++ b/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp @@ -80,62 +80,70 @@ unique_ptr Binder::Bind(BaseTableRef &ref) { // check if the table name refers to a CTE // CTE name should never be qualified (i.e. schema_name should be empty) - optional_ptr found_cte = nullptr; + vector> found_ctes; if (ref.schema_name.empty()) { - found_cte = FindCTE(ref.table_name, ref.table_name == alias); + found_ctes = FindCTE(ref.table_name, ref.table_name == alias); } - if (found_cte) { + if (!found_ctes.empty()) { // Check if there is a CTE binding in the BindContext - auto &cte = *found_cte; - auto ctebinding = bind_context.GetCTEBinding(ref.table_name); - if (!ctebinding) { - if (CTEIsAlreadyBound(cte)) { - throw BinderException( - "Circular reference to CTE \"%s\", There are two possible solutions. \n1. use WITH RECURSIVE to " - "use recursive CTEs. \n2. If " - "you want to use the TABLE name \"%s\" the same as the CTE name, please explicitly add " - "\"SCHEMA\" before table name. You can try \"main.%s\" (main is the duckdb default schema)", - ref.table_name, ref.table_name, ref.table_name); - } - // Move CTE to subquery and bind recursively - SubqueryRef subquery(unique_ptr_cast(cte.query->Copy())); - subquery.alias = ref.alias.empty() ? ref.table_name : ref.alias; - subquery.column_name_alias = cte.aliases; - for (idx_t i = 0; i < ref.column_name_alias.size(); i++) { - if (i < subquery.column_name_alias.size()) { - subquery.column_name_alias[i] = ref.column_name_alias[i]; - } else { - subquery.column_name_alias.push_back(ref.column_name_alias[i]); + bool circular_cte = false; + for (auto found_cte : found_ctes) { + auto &cte = found_cte.get(); + auto ctebinding = bind_context.GetCTEBinding(ref.table_name); + if (!ctebinding) { + if (CTEIsAlreadyBound(cte)) { + // remember error state + circular_cte = true; + // retry with next candidate CTE + continue; } - } - return Bind(subquery, found_cte); - } else { - // There is a CTE binding in the BindContext. - // This can only be the case if there is a recursive CTE, - // or a materialized CTE present. - auto index = GenerateTableIndex(); - auto materialized = cte.materialized; - if (materialized == CTEMaterialize::CTE_MATERIALIZE_DEFAULT) { + // Move CTE to subquery and bind recursively + SubqueryRef subquery(unique_ptr_cast(cte.query->Copy())); + subquery.alias = ref.alias.empty() ? ref.table_name : ref.alias; + subquery.column_name_alias = cte.aliases; + for (idx_t i = 0; i < ref.column_name_alias.size(); i++) { + if (i < subquery.column_name_alias.size()) { + subquery.column_name_alias[i] = ref.column_name_alias[i]; + } else { + subquery.column_name_alias.push_back(ref.column_name_alias[i]); + } + } + return Bind(subquery, &found_cte.get()); + } else { + // There is a CTE binding in the BindContext. + // This can only be the case if there is a recursive CTE, + // or a materialized CTE present. + auto index = GenerateTableIndex(); + auto materialized = cte.materialized; + if (materialized == CTEMaterialize::CTE_MATERIALIZE_DEFAULT) { #ifdef DUCKDB_ALTERNATIVE_VERIFY - materialized = CTEMaterialize::CTE_MATERIALIZE_ALWAYS; + materialized = CTEMaterialize::CTE_MATERIALIZE_ALWAYS; #else - materialized = CTEMaterialize::CTE_MATERIALIZE_NEVER; + materialized = CTEMaterialize::CTE_MATERIALIZE_NEVER; #endif - } - auto result = make_uniq(index, ctebinding->index, materialized); - auto b = ctebinding; - auto alias = ref.alias.empty() ? ref.table_name : ref.alias; - auto names = BindContext::AliasColumnNames(alias, b->names, ref.column_name_alias); + } + auto result = make_uniq(index, ctebinding->index, materialized); + auto alias = ref.alias.empty() ? ref.table_name : ref.alias; + auto names = BindContext::AliasColumnNames(alias, ctebinding->names, ref.column_name_alias); - bind_context.AddGenericBinding(index, alias, names, b->types); - // Update references to CTE - auto cteref = bind_context.cte_references[ref.table_name]; - (*cteref)++; + bind_context.AddGenericBinding(index, alias, names, ctebinding->types); + // Update references to CTE + auto cteref = bind_context.cte_references[ref.table_name]; + (*cteref)++; - result->types = b->types; - result->bound_columns = std::move(names); - return std::move(result); + result->types = ctebinding->types; + result->bound_columns = std::move(names); + return std::move(result); + } + } + if (circular_cte) { + throw BinderException( + "Circular reference to CTE \"%s\", There are two possible solutions. \n1. use WITH RECURSIVE to " + "use recursive CTEs. \n2. If " + "you want to use the TABLE name \"%s\" the same as the CTE name, please explicitly add " + "\"SCHEMA\" before table name. You can try \"main.%s\" (main is the duckdb default schema)", + ref.table_name, ref.table_name, ref.table_name); } } // not a CTE diff --git a/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp b/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp index 6c89b7b2..34a9ae6a 100644 --- a/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +++ b/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp @@ -19,6 +19,7 @@ #include "duckdb/planner/expression/bound_aggregate_expression.hpp" #include "duckdb/main/client_config.hpp" #include "duckdb/catalog/catalog_entry/aggregate_function_catalog_entry.hpp" +#include "duckdb/main/query_result.hpp" namespace duckdb { @@ -344,7 +345,9 @@ unique_ptr Binder::BindBoundPivot(PivotRef &ref) { result->bound_pivot.group_count = ref.bound_group_names.size(); result->bound_pivot.types = types; auto subquery_alias = ref.alias.empty() ? "__unnamed_pivot" : ref.alias; + QueryResult::DeduplicateColumns(names); bind_context.AddGenericBinding(result->bind_index, subquery_alias, names, types); + MoveCorrelatedExpressions(*result->child_binder); return std::move(result); } diff --git a/src/duckdb/src/planner/binder/tableref/bind_subqueryref.cpp b/src/duckdb/src/planner/binder/tableref/bind_subqueryref.cpp index f674970f..5acbd06b 100644 --- a/src/duckdb/src/planner/binder/tableref/bind_subqueryref.cpp +++ b/src/duckdb/src/planner/binder/tableref/bind_subqueryref.cpp @@ -10,8 +10,8 @@ unique_ptr Binder::Bind(SubqueryRef &ref, optional_ptrbound_ctes.insert(*cte); } - binder->alias = ref.alias.empty() ? "unnamed_subquery" : ref.alias; auto subquery = binder->BindNode(*ref.subquery->node); + binder->alias = ref.alias.empty() ? "unnamed_subquery" : ref.alias; idx_t bind_index = subquery->GetRootIndex(); string subquery_alias; if (ref.alias.empty()) { diff --git a/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp b/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp index 25962432..be984868 100644 --- a/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +++ b/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp @@ -102,7 +102,7 @@ bool Binder::BindTableFunctionParameters(TableFunctionCatalogEntry &table_functi continue; } - TableFunctionBinder binder(*this, context); + TableFunctionBinder binder(*this, context, table_function.name); LogicalType sql_type; auto expr = binder.Bind(child, &sql_type); if (expr->HasParameter()) { @@ -140,7 +140,7 @@ Binder::BindTableFunctionInternal(TableFunction &table_function, const string &f vector return_names; if (table_function.bind || table_function.bind_replace) { TableFunctionBindInput bind_input(parameters, named_parameters, input_table_types, input_table_names, - table_function.function_info.get()); + table_function.function_info.get(), this); if (table_function.bind_replace) { auto new_plan = table_function.bind_replace(context, bind_input); if (new_plan != nullptr) { @@ -251,12 +251,12 @@ unique_ptr Binder::Bind(TableFunctionRef &ref) { // select the function based on the input parameters FunctionBinder function_binder(context); - idx_t best_function_idx = function_binder.BindFunction(function.name, function.functions, arguments, error); - if (best_function_idx == DConstants::INVALID_INDEX) { + auto best_function_idx = function_binder.BindFunction(function.name, function.functions, arguments, error); + if (!best_function_idx.IsValid()) { error.AddQueryLocation(ref); error.Throw(); } - auto table_function = function.functions.GetFunctionByOffset(best_function_idx); + auto table_function = function.functions.GetFunctionByOffset(best_function_idx.GetIndex()); // now check the named parameters BindNamedParameters(table_function.named_parameters, named_parameters, error_context, table_function.name); diff --git a/src/duckdb/src/planner/expression/bound_cast_expression.cpp b/src/duckdb/src/planner/expression/bound_cast_expression.cpp index af176cb9..81aaf321 100644 --- a/src/duckdb/src/planner/expression/bound_cast_expression.cpp +++ b/src/duckdb/src/planner/expression/bound_cast_expression.cpp @@ -142,7 +142,12 @@ bool BoundCastExpression::CastIsInvertible(const LogicalType &source_type, const } return true; } - if (source_type.id() == LogicalTypeId::TIMESTAMP || source_type.id() == LogicalTypeId::TIMESTAMP_TZ) { + switch (source_type.id()) { + case LogicalTypeId::TIMESTAMP: + case LogicalTypeId::TIMESTAMP_TZ: + case LogicalTypeId::TIMESTAMP_SEC: + case LogicalTypeId::TIMESTAMP_MS: + case LogicalTypeId::TIMESTAMP_NS: switch (target_type.id()) { case LogicalTypeId::DATE: case LogicalTypeId::TIME: @@ -151,8 +156,8 @@ bool BoundCastExpression::CastIsInvertible(const LogicalType &source_type, const default: break; } - } - if (source_type.id() == LogicalTypeId::VARCHAR) { + break; + case LogicalTypeId::VARCHAR: switch (target_type.id()) { case LogicalTypeId::TIMESTAMP: case LogicalTypeId::TIMESTAMP_NS: @@ -163,6 +168,9 @@ bool BoundCastExpression::CastIsInvertible(const LogicalType &source_type, const default: return false; } + break; + default: + break; } if (target_type.id() == LogicalTypeId::VARCHAR) { switch (source_type.id()) { diff --git a/src/duckdb/src/planner/expression/bound_expanded_expression.cpp b/src/duckdb/src/planner/expression/bound_expanded_expression.cpp new file mode 100644 index 00000000..5a02a62a --- /dev/null +++ b/src/duckdb/src/planner/expression/bound_expanded_expression.cpp @@ -0,0 +1,22 @@ +#include "duckdb/planner/expression/bound_expanded_expression.hpp" + +namespace duckdb { + +BoundExpandedExpression::BoundExpandedExpression(vector> expanded_expressions_p) + : Expression(ExpressionType::BOUND_EXPANDED, ExpressionClass::BOUND_EXPANDED, LogicalType::INTEGER), + expanded_expressions(std::move(expanded_expressions_p)) { +} + +string BoundExpandedExpression::ToString() const { + return "BOUND_EXPANDED"; +} + +bool BoundExpandedExpression::Equals(const BaseExpression &other_p) const { + return false; +} + +unique_ptr BoundExpandedExpression::Copy() { + throw SerializationException("Cannot copy BoundExpandedExpression"); +} + +} // namespace duckdb diff --git a/src/duckdb/src/planner/expression_binder/base_select_binder.cpp b/src/duckdb/src/planner/expression_binder/base_select_binder.cpp index b4708561..cadc3ac6 100644 --- a/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +++ b/src/duckdb/src/planner/expression_binder/base_select_binder.cpp @@ -4,35 +4,29 @@ #include "duckdb/parser/expression/columnref_expression.hpp" #include "duckdb/parser/expression/operator_expression.hpp" #include "duckdb/parser/expression/window_expression.hpp" -#include "duckdb/parser/parsed_expression_iterator.hpp" #include "duckdb/planner/binder.hpp" #include "duckdb/planner/expression/bound_columnref_expression.hpp" -#include "duckdb/planner/expression/bound_window_expression.hpp" #include "duckdb/planner/expression_binder/aggregate_binder.hpp" #include "duckdb/planner/query_node/bound_select_node.hpp" +#include "duckdb/planner/expression_binder/select_bind_state.hpp" namespace duckdb { -BaseSelectBinder::BaseSelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, - BoundGroupInformation &info, case_insensitive_map_t alias_map) - : ExpressionBinder(binder, context), inside_window(false), node(node), info(info), alias_map(std::move(alias_map)) { -} - BaseSelectBinder::BaseSelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info) - : BaseSelectBinder(binder, context, node, info, case_insensitive_map_t()) { + : ExpressionBinder(binder, context), inside_window(false), node(node), info(info) { } BindResult BaseSelectBinder::BindExpression(unique_ptr &expr_ptr, idx_t depth, bool root_expression) { auto &expr = *expr_ptr; // check if the expression binds to one of the groups - auto group_index = TryBindGroup(expr, depth); + auto group_index = TryBindGroup(expr); if (group_index != DConstants::INVALID_INDEX) { return BindGroup(expr, depth, group_index); } switch (expr.expression_class) { case ExpressionClass::COLUMN_REF: - return BindColumnRef(expr_ptr, depth); + return BindColumnRef(expr_ptr, depth, root_expression); case ExpressionClass::DEFAULT: return BindResult("SELECT clause cannot contain DEFAULT clause"); case ExpressionClass::WINDOW: @@ -42,7 +36,7 @@ BindResult BaseSelectBinder::BindExpression(unique_ptr &expr_p } } -idx_t BaseSelectBinder::TryBindGroup(ParsedExpression &expr, idx_t depth) { +idx_t BaseSelectBinder::TryBindGroup(ParsedExpression &expr) { // first check the group alias map, if expr is a ColumnRefExpression if (expr.type == ExpressionType::COLUMN_REF) { auto &colref = expr.Cast(); @@ -61,50 +55,16 @@ idx_t BaseSelectBinder::TryBindGroup(ParsedExpression &expr, idx_t depth) { return entry->second; } #ifdef DEBUG - for (auto entry : info.map) { - D_ASSERT(!entry.first.get().Equals(expr)); - D_ASSERT(!expr.Equals(entry.first.get())); + for (auto map_entry : info.map) { + D_ASSERT(!map_entry.first.get().Equals(expr)); + D_ASSERT(!expr.Equals(map_entry.first.get())); } #endif return DConstants::INVALID_INDEX; } -BindResult BaseSelectBinder::BindColumnRef(unique_ptr &expr_ptr, idx_t depth) { - // first try to bind the column reference regularly - auto result = ExpressionBinder::BindExpression(expr_ptr, depth); - if (!result.HasError()) { - return result; - } - // binding failed - // check in the alias map - auto &colref = (expr_ptr.get())->Cast(); - if (!colref.IsQualified()) { - auto alias_entry = alias_map.find(colref.column_names[0]); - if (alias_entry != alias_map.end()) { - // found entry! - auto index = alias_entry->second; - if (index >= node.select_list.size()) { - throw BinderException("Column \"%s\" referenced that exists in the SELECT clause - but this column " - "cannot be referenced before it is defined", - colref.column_names[0]); - } - if (node.select_list[index]->IsVolatile()) { - throw BinderException("Alias \"%s\" referenced in a SELECT clause - but the expression has side " - "effects. This is not yet supported.", - colref.column_names[0]); - } - if (node.select_list[index]->HasSubquery()) { - throw BinderException("Alias \"%s\" referenced in a SELECT clause - but the expression has a subquery." - " This is not yet supported.", - colref.column_names[0]); - } - auto copied_expression = node.original_expressions[index]->Copy(); - result = BindExpression(copied_expression, depth, false); - return result; - } - } - // entry was not found in the alias map: return the original error - return result; +BindResult BaseSelectBinder::BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression) { + return ExpressionBinder::BindExpression(expr_ptr, depth); } BindResult BaseSelectBinder::BindGroupingFunction(OperatorExpression &op, idx_t depth) { @@ -121,7 +81,7 @@ BindResult BaseSelectBinder::BindGroupingFunction(OperatorExpression &op, idx_t group_indexes.reserve(op.children.size()); for (auto &child : op.children) { ExpressionBinder::QualifyColumnNames(binder, child); - auto idx = TryBindGroup(*child, depth); + auto idx = TryBindGroup(*child); if (idx == DConstants::INVALID_INDEX) { return BindResult(BinderException(op, "GROUPING child \"%s\" must be a grouping column", child->GetName())); } @@ -147,11 +107,4 @@ BindResult BaseSelectBinder::BindGroup(ParsedExpression &expr, idx_t depth, idx_ } } -bool BaseSelectBinder::QualifyColumnAlias(const ColumnRefExpression &colref) { - if (!colref.IsQualified()) { - return alias_map.find(colref.column_names[0]) != alias_map.end(); - } - return false; -} - } // namespace duckdb diff --git a/src/duckdb/src/planner/expression_binder/column_alias_binder.cpp b/src/duckdb/src/planner/expression_binder/column_alias_binder.cpp index df83dee4..fbe0f5a3 100644 --- a/src/duckdb/src/planner/expression_binder/column_alias_binder.cpp +++ b/src/duckdb/src/planner/expression_binder/column_alias_binder.cpp @@ -1,15 +1,14 @@ #include "duckdb/planner/expression_binder/column_alias_binder.hpp" #include "duckdb/parser/expression/columnref_expression.hpp" -#include "duckdb/planner/query_node/bound_select_node.hpp" #include "duckdb/common/string_util.hpp" #include "duckdb/planner/expression_binder.hpp" #include "duckdb/planner/binder.hpp" +#include "duckdb/planner/expression_binder/select_bind_state.hpp" namespace duckdb { -ColumnAliasBinder::ColumnAliasBinder(BoundSelectNode &node, const case_insensitive_map_t &alias_map) - : node(node), alias_map(alias_map), visited_select_indexes() { +ColumnAliasBinder::ColumnAliasBinder(SelectBindState &bind_state) : bind_state(bind_state), visited_select_indexes() { } bool ColumnAliasBinder::BindAlias(ExpressionBinder &enclosing_binder, unique_ptr &expr_ptr, @@ -24,8 +23,8 @@ bool ColumnAliasBinder::BindAlias(ExpressionBinder &enclosing_binder, unique_ptr } // We try to find the alias in the alias_map and return false, if no alias exists. - auto alias_entry = alias_map.find(expr.column_names[0]); - if (alias_entry == alias_map.end()) { + auto alias_entry = bind_state.alias_map.find(expr.column_names[0]); + if (alias_entry == bind_state.alias_map.end()) { return false; } @@ -35,12 +34,10 @@ bool ColumnAliasBinder::BindAlias(ExpressionBinder &enclosing_binder, unique_ptr } // We found an alias, so we copy the alias expression into this expression. - auto original_expr = node.original_expressions[alias_entry->second]->Copy(); + auto original_expr = bind_state.BindAlias(alias_entry->second); expr_ptr = std::move(original_expr); visited_select_indexes.insert(alias_entry->second); - // Since the alias has been found, we pass a depth of 0. See issue 4978 (#16). - // Only HAVING, QUALIFY, and WHERE binders contain ColumnAliasBinders. result = enclosing_binder.BindExpression(expr_ptr, depth, root_expression); visited_select_indexes.erase(alias_entry->second); return true; diff --git a/src/duckdb/src/planner/expression_binder/group_binder.cpp b/src/duckdb/src/planner/expression_binder/group_binder.cpp index f2fb36a5..cbf25d76 100644 --- a/src/duckdb/src/planner/expression_binder/group_binder.cpp +++ b/src/duckdb/src/planner/expression_binder/group_binder.cpp @@ -4,13 +4,14 @@ #include "duckdb/parser/expression/constant_expression.hpp" #include "duckdb/parser/query_node/select_node.hpp" #include "duckdb/planner/expression/bound_constant_expression.hpp" +#include "duckdb/planner/expression_binder/select_bind_state.hpp" #include "duckdb/common/to_string.hpp" namespace duckdb { GroupBinder::GroupBinder(Binder &binder, ClientContext &context, SelectNode &node, idx_t group_index, - case_insensitive_map_t &alias_map, case_insensitive_map_t &group_alias_map) - : ExpressionBinder(binder, context), node(node), alias_map(alias_map), group_alias_map(group_alias_map), + SelectBindState &bind_state, case_insensitive_map_t &group_alias_map) + : ExpressionBinder(binder, context), node(node), bind_state(bind_state), group_alias_map(group_alias_map), group_index(group_index) { } @@ -94,8 +95,8 @@ BindResult GroupBinder::BindColumnRef(ColumnRefExpression &colref) { // failed to bind the column and the node is the root expression with depth = 0 // check if refers to an alias in the select clause auto alias_name = colref.column_names[0]; - auto entry = alias_map.find(alias_name); - if (entry == alias_map.end()) { + auto entry = bind_state.alias_map.find(alias_name); + if (entry == bind_state.alias_map.end()) { // no matching alias found return result; } diff --git a/src/duckdb/src/planner/expression_binder/having_binder.cpp b/src/duckdb/src/planner/expression_binder/having_binder.cpp index 9cc1e6c2..5a987ef7 100644 --- a/src/duckdb/src/planner/expression_binder/having_binder.cpp +++ b/src/duckdb/src/planner/expression_binder/having_binder.cpp @@ -9,14 +9,13 @@ namespace duckdb { HavingBinder::HavingBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info, - case_insensitive_map_t &alias_map, AggregateHandling aggregate_handling) - : BaseSelectBinder(binder, context, node, info), column_alias_binder(node, alias_map), + AggregateHandling aggregate_handling) + : BaseSelectBinder(binder, context, node, info), column_alias_binder(node.bind_state), aggregate_handling(aggregate_handling) { target_type = LogicalType(LogicalTypeId::BOOLEAN); } BindResult HavingBinder::BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression) { - // Keep the original column name to return a meaningful error message. auto column_name = expr_ptr->Cast().GetColumnName(); @@ -37,7 +36,7 @@ BindResult HavingBinder::BindColumnRef(unique_ptr &expr_ptr, i "Having clause cannot reference column \"%s\" in correlated subquery and group by all", column_name); } - auto expr = duckdb::BaseSelectBinder::BindExpression(expr_ptr, depth); + auto expr = duckdb::BaseSelectBinder::BindColumnRef(expr_ptr, depth, root_expression); if (expr.HasError()) { return expr; } @@ -54,21 +53,8 @@ BindResult HavingBinder::BindColumnRef(unique_ptr &expr_ptr, i "column %s must appear in the GROUP BY clause or be used in an aggregate function", column_name)); } -BindResult HavingBinder::BindExpression(unique_ptr &expr_ptr, idx_t depth, bool root_expression) { - auto &expr = *expr_ptr; - // check if the expression binds to one of the groups - auto group_index = TryBindGroup(expr, depth); - if (group_index != DConstants::INVALID_INDEX) { - return BindGroup(expr, depth, group_index); - } - switch (expr.expression_class) { - case ExpressionClass::WINDOW: - return BindResult("HAVING clause cannot contain window functions!"); - case ExpressionClass::COLUMN_REF: - return BindColumnRef(expr_ptr, depth, root_expression); - default: - return duckdb::BaseSelectBinder::BindExpression(expr_ptr, depth); - } +BindResult HavingBinder::BindWindow(WindowExpression &expr, idx_t depth) { + return BindResult("HAVING clause cannot contain window functions!"); } } // namespace duckdb diff --git a/src/duckdb/src/planner/expression_binder/lateral_binder.cpp b/src/duckdb/src/planner/expression_binder/lateral_binder.cpp index 13e3ae59..21ceb4e5 100644 --- a/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +++ b/src/duckdb/src/planner/expression_binder/lateral_binder.cpp @@ -81,11 +81,6 @@ static void ReduceColumnDepth(vector &columns, } } -static void ReduceExpressionSubquery(BoundSubqueryExpression &expr, - const vector &correlated_columns) { - ReduceColumnDepth(expr.binder->correlated_columns, correlated_columns); -} - class ExpressionDepthReducerRecursive : public BoundNodeVisitor { public: explicit ExpressionDepthReducerRecursive(const vector &correlated) @@ -111,6 +106,13 @@ class ExpressionDepthReducerRecursive : public BoundNodeVisitor { BoundNodeVisitor::VisitBoundTableRef(ref); } + static void ReduceExpressionSubquery(BoundSubqueryExpression &expr, + const vector &correlated_columns) { + ReduceColumnDepth(expr.binder->correlated_columns, correlated_columns); + ExpressionDepthReducerRecursive recursive(correlated_columns); + recursive.VisitBoundQueryNode(*expr.subquery); + } + private: const vector &correlated_columns; }; @@ -127,9 +129,7 @@ class ExpressionDepthReducer : public LogicalOperatorVisitor { } unique_ptr VisitReplace(BoundSubqueryExpression &expr, unique_ptr *expr_ptr) override { - ReduceExpressionSubquery(expr, correlated_columns); - ExpressionDepthReducerRecursive recursive(correlated_columns); - recursive.VisitBoundQueryNode(*expr.subquery); + ExpressionDepthReducerRecursive::ReduceExpressionSubquery(expr, correlated_columns); return nullptr; } diff --git a/src/duckdb/src/planner/expression_binder/order_binder.cpp b/src/duckdb/src/planner/expression_binder/order_binder.cpp index 0235d55e..c5a63de8 100644 --- a/src/duckdb/src/planner/expression_binder/order_binder.cpp +++ b/src/duckdb/src/planner/expression_binder/order_binder.cpp @@ -1,5 +1,6 @@ #include "duckdb/planner/expression_binder/order_binder.hpp" +#include "duckdb/parser/expression/collate_expression.hpp" #include "duckdb/parser/expression/columnref_expression.hpp" #include "duckdb/parser/expression/constant_expression.hpp" #include "duckdb/parser/expression/parameter_expression.hpp" @@ -7,26 +8,23 @@ #include "duckdb/parser/expression/star_expression.hpp" #include "duckdb/parser/query_node/select_node.hpp" #include "duckdb/planner/binder.hpp" +#include "duckdb/planner/expression/bound_constant_expression.hpp" #include "duckdb/planner/expression/bound_parameter_expression.hpp" #include "duckdb/planner/expression_binder.hpp" +#include "duckdb/planner/expression_binder/select_bind_state.hpp" +#include "duckdb/common/pair.hpp" namespace duckdb { -OrderBinder::OrderBinder(vector binders, idx_t projection_index, case_insensitive_map_t &alias_map, - parsed_expression_map_t &projection_map, idx_t max_count) - : binders(std::move(binders)), projection_index(projection_index), max_count(max_count), extra_list(nullptr), - alias_map(alias_map), projection_map(projection_map) { +OrderBinder::OrderBinder(vector binders, SelectBindState &bind_state) + : binders(std::move(binders)), extra_list(nullptr), bind_state(bind_state) { } -OrderBinder::OrderBinder(vector binders, idx_t projection_index, SelectNode &node, - case_insensitive_map_t &alias_map, parsed_expression_map_t &projection_map) - : binders(std::move(binders)), projection_index(projection_index), alias_map(alias_map), - projection_map(projection_map) { - this->max_count = node.select_list.size(); +OrderBinder::OrderBinder(vector binders, SelectNode &node, SelectBindState &bind_state) + : binders(std::move(binders)), bind_state(bind_state) { this->extra_list = &node.select_list; } -unique_ptr OrderBinder::CreateProjectionReference(ParsedExpression &expr, const idx_t index, - const LogicalType &logical_type) { +unique_ptr OrderBinder::CreateProjectionReference(ParsedExpression &expr, const idx_t index) { string alias; if (extra_list && index < extra_list->size()) { alias = extra_list->at(index)->ToString(); @@ -35,15 +33,18 @@ unique_ptr OrderBinder::CreateProjectionReference(ParsedExpression & alias = expr.alias; } } - return make_uniq(std::move(alias), logical_type, ColumnBinding(projection_index, index)); + auto result = make_uniq(Value::UBIGINT(index)); + result->alias = std::move(alias); + result->query_location = expr.query_location; + return std::move(result); } unique_ptr OrderBinder::CreateExtraReference(unique_ptr expr) { if (!extra_list) { throw InternalException("CreateExtraReference called without extra_list"); } - projection_map[*expr] = extra_list->size(); - auto result = CreateProjectionReference(*expr, extra_list->size(), LogicalType::INVALID); + bind_state.projection_map[*expr] = extra_list->size(); + auto result = CreateProjectionReference(*expr, extra_list->size()); extra_list->push_back(std::move(expr)); return result; } @@ -57,8 +58,14 @@ unique_ptr OrderBinder::BindConstant(ParsedExpression &expr, const V return nullptr; } // INTEGER constant: we use the integer as an index into the select list (e.g. ORDER BY 1) - auto index = (idx_t)val.GetValue(); - return CreateProjectionReference(expr, index - 1, LogicalType::ANY); + auto order_value = val.GetValue(); + auto index = order_value <= 0 ? NumericLimits::Maximum() : idx_t(order_value - 1); + child_list_t values; + values.push_back(make_pair("index", Value::UBIGINT(index))); + auto result = make_uniq(Value::STRUCT(std::move(values))); + result->alias = std::move(expr.alias); + result->query_location = expr.query_location; + return std::move(result); } unique_ptr OrderBinder::Bind(unique_ptr expr) { @@ -83,23 +90,32 @@ unique_ptr OrderBinder::Bind(unique_ptr expr) { break; } // check the alias list - auto entry = alias_map.find(colref.column_names[0]); - if (entry != alias_map.end()) { + auto entry = bind_state.alias_map.find(colref.column_names[0]); + if (entry != bind_state.alias_map.end()) { // it does! point it to that entry - return CreateProjectionReference(*expr, entry->second, LogicalType::INVALID); + return CreateProjectionReference(*expr, entry->second); } break; } case ExpressionClass::POSITIONAL_REFERENCE: { auto &posref = expr->Cast(); - if (posref.index < 1 || posref.index > max_count) { - throw BinderException("ORDER term out of range - should be between 1 and %lld", (idx_t)max_count); - } - return CreateProjectionReference(*expr, posref.index - 1, LogicalType::ANY); + return CreateProjectionReference(*expr, posref.index - 1); } case ExpressionClass::PARAMETER: { throw ParameterNotAllowedException("Parameter not supported in ORDER BY clause"); } + case ExpressionClass::COLLATE: { + auto &collation = expr->Cast(); + if (collation.child->expression_class == ExpressionClass::CONSTANT) { + auto &constant = collation.child->Cast(); + auto index = NumericCast(constant.value.GetValue()) - 1; + child_list_t values; + values.push_back(make_pair("index", Value::UBIGINT(index))); + values.push_back(make_pair("collation", Value(std::move(collation.collation)))); + return make_uniq(Value::STRUCT(std::move(values))); + } + break; + } default: break; } @@ -109,14 +125,14 @@ unique_ptr OrderBinder::Bind(unique_ptr expr) { ExpressionBinder::QualifyColumnNames(*binder, expr); } // first check if the ORDER BY clause already points to an entry in the projection list - auto entry = projection_map.find(*expr); - if (entry != projection_map.end()) { + auto entry = bind_state.projection_map.find(*expr); + if (entry != bind_state.projection_map.end()) { if (entry->second == DConstants::INVALID_INDEX) { throw BinderException("Ambiguous reference to column"); } // there is a matching entry in the projection list // just point to that entry - return CreateProjectionReference(*expr, entry->second, LogicalType::INVALID); + return CreateProjectionReference(*expr, entry->second); } if (!extra_list) { // no extra list specified: we cannot push an extra ORDER BY clause diff --git a/src/duckdb/src/planner/expression_binder/qualify_binder.cpp b/src/duckdb/src/planner/expression_binder/qualify_binder.cpp index 7a486cf8..e778c203 100644 --- a/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +++ b/src/duckdb/src/planner/expression_binder/qualify_binder.cpp @@ -9,15 +9,13 @@ namespace duckdb { -QualifyBinder::QualifyBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info, - case_insensitive_map_t &alias_map) - : BaseSelectBinder(binder, context, node, info), column_alias_binder(node, alias_map) { +QualifyBinder::QualifyBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info) + : BaseSelectBinder(binder, context, node, info), column_alias_binder(node.bind_state) { target_type = LogicalType(LogicalTypeId::BOOLEAN); } BindResult QualifyBinder::BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression) { - - auto result = duckdb::BaseSelectBinder::BindExpression(expr_ptr, depth); + auto result = duckdb::BaseSelectBinder::BindColumnRef(expr_ptr, depth, root_expression); if (!result.HasError()) { return result; } @@ -36,21 +34,4 @@ BindResult QualifyBinder::BindColumnRef(unique_ptr &expr_ptr, StringUtil::Format("Referenced column %s not found in FROM clause and can't find in alias map.", expr_string)); } -BindResult QualifyBinder::BindExpression(unique_ptr &expr_ptr, idx_t depth, bool root_expression) { - auto &expr = *expr_ptr; - // check if the expression binds to one of the groups - auto group_index = TryBindGroup(expr, depth); - if (group_index != DConstants::INVALID_INDEX) { - return BindGroup(expr, depth, group_index); - } - switch (expr.expression_class) { - case ExpressionClass::WINDOW: - return BindWindow(expr.Cast(), depth); - case ExpressionClass::COLUMN_REF: - return BindColumnRef(expr_ptr, depth, root_expression); - default: - return duckdb::BaseSelectBinder::BindExpression(expr_ptr, depth); - } -} - } // namespace duckdb diff --git a/src/duckdb/src/planner/expression_binder/select_bind_state.cpp b/src/duckdb/src/planner/expression_binder/select_bind_state.cpp new file mode 100644 index 00000000..23ada81d --- /dev/null +++ b/src/duckdb/src/planner/expression_binder/select_bind_state.cpp @@ -0,0 +1,52 @@ +#include "duckdb/planner/expression_binder/select_bind_state.hpp" +#include "duckdb/common/exception/binder_exception.hpp" + +namespace duckdb { + +unique_ptr SelectBindState::BindAlias(idx_t index) { + if (volatile_expressions.find(index) != volatile_expressions.end()) { + throw BinderException("Alias \"%s\" referenced - but the expression has side " + "effects. This is not yet supported.", + original_expressions[index]->alias); + } + referenced_aliases.insert(index); + return original_expressions[index]->Copy(); +} + +void SelectBindState::SetExpressionIsVolatile(idx_t index) { + // check if this expression has been referenced before + if (referenced_aliases.find(index) != referenced_aliases.end()) { + throw BinderException("Alias \"%s\" referenced - but the expression has side " + "effects. This is not yet supported.", + original_expressions[index]->alias); + } + volatile_expressions.insert(index); +} + +void SelectBindState::SetExpressionHasSubquery(idx_t index) { + subquery_expressions.insert(index); +} + +bool SelectBindState::AliasHasSubquery(idx_t index) const { + return subquery_expressions.find(index) != subquery_expressions.end(); +} + +void SelectBindState::AddExpandedColumn(idx_t expand_count) { + if (expanded_column_indices.empty()) { + expanded_column_indices.push_back(0); + } + expanded_column_indices.push_back(expanded_column_indices.back() + expand_count); +} + +void SelectBindState::AddRegularColumn() { + AddExpandedColumn(1); +} + +idx_t SelectBindState::GetFinalIndex(idx_t index) const { + if (index >= expanded_column_indices.size()) { + return index; + } + return expanded_column_indices[index]; +} + +} // namespace duckdb diff --git a/src/duckdb/src/planner/expression_binder/select_binder.cpp b/src/duckdb/src/planner/expression_binder/select_binder.cpp index d83b2e6c..69c1dcdf 100644 --- a/src/duckdb/src/planner/expression_binder/select_binder.cpp +++ b/src/duckdb/src/planner/expression_binder/select_binder.cpp @@ -1,14 +1,52 @@ #include "duckdb/planner/expression_binder/select_binder.hpp" +#include "duckdb/parser/expression/columnref_expression.hpp" +#include "duckdb/planner/query_node/bound_select_node.hpp" namespace duckdb { -SelectBinder::SelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info, - case_insensitive_map_t alias_map) - : BaseSelectBinder(binder, context, node, info, std::move(alias_map)) { +SelectBinder::SelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info) + : BaseSelectBinder(binder, context, node, info) { } -SelectBinder::SelectBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info) - : SelectBinder(binder, context, node, info, case_insensitive_map_t()) { +BindResult SelectBinder::BindColumnRef(unique_ptr &expr_ptr, idx_t depth, bool root_expression) { + // first try to bind the column reference regularly + auto result = BaseSelectBinder::BindColumnRef(expr_ptr, depth, root_expression); + if (!result.HasError()) { + return result; + } + // binding failed + // check in the alias map + auto &colref = (expr_ptr.get())->Cast(); + if (!colref.IsQualified()) { + auto &bind_state = node.bind_state; + auto alias_entry = node.bind_state.alias_map.find(colref.column_names[0]); + if (alias_entry != node.bind_state.alias_map.end()) { + // found entry! + auto index = alias_entry->second; + if (index >= node.bound_column_count) { + throw BinderException("Column \"%s\" referenced that exists in the SELECT clause - but this column " + "cannot be referenced before it is defined", + colref.column_names[0]); + } + if (bind_state.AliasHasSubquery(index)) { + throw BinderException("Alias \"%s\" referenced in a SELECT clause - but the expression has a subquery." + " This is not yet supported.", + colref.column_names[0]); + } + auto copied_expression = node.bind_state.BindAlias(index); + result = BindExpression(copied_expression, depth, false); + return result; + } + } + // entry was not found in the alias map: return the original error + return result; +} + +bool SelectBinder::QualifyColumnAlias(const ColumnRefExpression &colref) { + if (!colref.IsQualified()) { + return node.bind_state.alias_map.find(colref.column_names[0]) != node.bind_state.alias_map.end(); + } + return false; } } // namespace duckdb diff --git a/src/duckdb/src/planner/expression_binder/table_function_binder.cpp b/src/duckdb/src/planner/expression_binder/table_function_binder.cpp index 98a73ed3..7f20e9c3 100644 --- a/src/duckdb/src/planner/expression_binder/table_function_binder.cpp +++ b/src/duckdb/src/planner/expression_binder/table_function_binder.cpp @@ -5,7 +5,8 @@ namespace duckdb { -TableFunctionBinder::TableFunctionBinder(Binder &binder, ClientContext &context) : ExpressionBinder(binder, context) { +TableFunctionBinder::TableFunctionBinder(Binder &binder, ClientContext &context, string table_function_name_p) + : ExpressionBinder(binder, context), table_function_name(std::move(table_function_name_p)) { } BindResult TableFunctionBinder::BindLambdaReference(LambdaRefExpression &expr, idx_t depth) { @@ -14,23 +15,34 @@ BindResult TableFunctionBinder::BindLambdaReference(LambdaRefExpression &expr, i return (*lambda_bindings)[expr.lambda_idx].Bind(lambda_ref, depth); } -BindResult TableFunctionBinder::BindColumnReference(ColumnRefExpression &expr, idx_t depth, bool root_expression) { - +BindResult TableFunctionBinder::BindColumnReference(unique_ptr &expr_ptr, idx_t depth, + bool root_expression) { // try binding as a lambda parameter - auto &col_ref = expr.Cast(); + auto &col_ref = expr_ptr->Cast(); if (!col_ref.IsQualified()) { auto lambda_ref = LambdaRefExpression::FindMatchingBinding(lambda_bindings, col_ref.GetName()); if (lambda_ref) { return BindLambdaReference(lambda_ref->Cast(), depth); } } + auto column_names = col_ref.column_names; + auto result_name = StringUtil::Join(column_names, "."); + if (!table_function_name.empty()) { + // check if this is a lateral join column/parameter + auto result = BindCorrelatedColumns(expr_ptr, ErrorData("error")); + if (!result.HasError()) { + // it is a lateral join parameter - this is not supported in this type of table function + throw BinderException("Table function \"%s\" does not support lateral join column parameters - cannot use " + "column \"%s\" in this context", + table_function_name, result_name); + } + } - auto value_function = ExpressionBinder::GetSQLValueFunction(expr.GetColumnName()); + auto value_function = ExpressionBinder::GetSQLValueFunction(column_names.back()); if (value_function) { return BindExpression(value_function, depth, root_expression); } - auto result_name = StringUtil::Join(expr.column_names, "."); return BindResult(make_uniq(Value(result_name))); } @@ -41,7 +53,7 @@ BindResult TableFunctionBinder::BindExpression(unique_ptr &exp case ExpressionClass::LAMBDA_REF: return BindLambdaReference(expr.Cast(), depth); case ExpressionClass::COLUMN_REF: - return BindColumnReference(expr.Cast(), depth, root_expression); + return BindColumnReference(expr_ptr, depth, root_expression); case ExpressionClass::SUBQUERY: throw BinderException("Table function cannot contain subqueries"); case ExpressionClass::DEFAULT: diff --git a/src/duckdb/src/planner/logical_operator.cpp b/src/duckdb/src/planner/logical_operator.cpp index b7b9dc9f..78f41843 100644 --- a/src/duckdb/src/planner/logical_operator.cpp +++ b/src/duckdb/src/planner/logical_operator.cpp @@ -1,13 +1,13 @@ #include "duckdb/planner/logical_operator.hpp" #include "duckdb/common/printer.hpp" +#include "duckdb/common/serializer/binary_deserializer.hpp" +#include "duckdb/common/serializer/binary_serializer.hpp" +#include "duckdb/common/serializer/memory_stream.hpp" #include "duckdb/common/string_util.hpp" #include "duckdb/common/tree_renderer.hpp" #include "duckdb/parser/parser.hpp" #include "duckdb/planner/operator/list.hpp" -#include "duckdb/common/serializer/binary_serializer.hpp" -#include "duckdb/common/serializer/binary_deserializer.hpp" -#include "duckdb/common/serializer/memory_stream.hpp" namespace duckdb { @@ -26,6 +26,23 @@ vector LogicalOperator::GetColumnBindings() { return {ColumnBinding(0, 0)}; } +// LCOV_EXCL_START +string LogicalOperator::ColumnBindingsToString(const vector &bindings) { + string result = "{"; + for (idx_t i = 0; i < bindings.size(); i++) { + if (i != 0) { + result += ", "; + } + result += bindings[i].ToString(); + } + return result + "}"; +} + +void LogicalOperator::PrintColumnBindings() { + Printer::Print(ColumnBindingsToString(GetColumnBindings())); +} +// LCOV_EXCL_STOP + string LogicalOperator::GetName() const { return LogicalOperatorToString(type); } diff --git a/src/duckdb/src/planner/operator/logical_copy_database.cpp b/src/duckdb/src/planner/operator/logical_copy_database.cpp index 67ca0943..ce67fab7 100644 --- a/src/duckdb/src/planner/operator/logical_copy_database.cpp +++ b/src/duckdb/src/planner/operator/logical_copy_database.cpp @@ -1,28 +1,18 @@ #include "duckdb/planner/operator/logical_copy_database.hpp" -#include "duckdb/parser/parsed_data/create_schema_info.hpp" #include "duckdb/parser/parsed_data/create_table_info.hpp" namespace duckdb { -CopyDatabaseInfo::CopyDatabaseInfo(Catalog &from_database, Catalog &to_database) - : from_database(from_database), to_database(to_database) { -} - -CopyDatabaseInfo::~CopyDatabaseInfo() { -} - LogicalCopyDatabase::LogicalCopyDatabase(unique_ptr info_p) : LogicalOperator(LogicalOperatorType::LOGICAL_COPY_DATABASE), info(std::move(info_p)) { } -LogicalCopyDatabase::~LogicalCopyDatabase() { +LogicalCopyDatabase::LogicalCopyDatabase(unique_ptr info_p) + : LogicalOperator(LogicalOperatorType::LOGICAL_COPY_DATABASE), + info(unique_ptr_cast(std::move(info_p))) { } -void LogicalCopyDatabase::Serialize(Serializer &serializer) const { - throw NotImplementedException("LogicalCopyDatabase::Serialize"); -} -unique_ptr LogicalCopyDatabase::Deserialize(Deserializer &deserializer) { - throw NotImplementedException("LogicalCopyDatabase::Deserialize"); +LogicalCopyDatabase::~LogicalCopyDatabase() { } void LogicalCopyDatabase::ResolveTypes() { diff --git a/src/duckdb/src/planner/operator/logical_delete.cpp b/src/duckdb/src/planner/operator/logical_delete.cpp index a028a1ea..950f2eaa 100644 --- a/src/duckdb/src/planner/operator/logical_delete.cpp +++ b/src/duckdb/src/planner/operator/logical_delete.cpp @@ -14,7 +14,7 @@ LogicalDelete::LogicalDelete(TableCatalogEntry &table, idx_t table_index) LogicalDelete::LogicalDelete(ClientContext &context, const unique_ptr &table_info) : LogicalOperator(LogicalOperatorType::LOGICAL_DELETE), table(Catalog::GetEntry(context, table_info->catalog, table_info->schema, - dynamic_cast(*table_info).table)) { + table_info->Cast().table)) { } idx_t LogicalDelete::EstimateCardinality(ClientContext &context) { diff --git a/src/duckdb/src/planner/operator/logical_get.cpp b/src/duckdb/src/planner/operator/logical_get.cpp index 1ee92561..077eb6cb 100644 --- a/src/duckdb/src/planner/operator/logical_get.cpp +++ b/src/duckdb/src/planner/operator/logical_get.cpp @@ -165,7 +165,7 @@ unique_ptr LogicalGet::Deserialize(Deserializer &deserializer) deserializer.ReadProperty(208, "input_table_types", result->input_table_types); deserializer.ReadProperty(209, "input_table_names", result->input_table_names); TableFunctionBindInput input(result->parameters, result->named_parameters, result->input_table_types, - result->input_table_names, function.function_info.get()); + result->input_table_names, function.function_info.get(), nullptr); vector bind_return_types; vector bind_names; diff --git a/src/duckdb/src/planner/operator/logical_insert.cpp b/src/duckdb/src/planner/operator/logical_insert.cpp index 3846ed00..51866161 100644 --- a/src/duckdb/src/planner/operator/logical_insert.cpp +++ b/src/duckdb/src/planner/operator/logical_insert.cpp @@ -14,7 +14,7 @@ LogicalInsert::LogicalInsert(TableCatalogEntry &table, idx_t table_index) LogicalInsert::LogicalInsert(ClientContext &context, const unique_ptr table_info) : LogicalOperator(LogicalOperatorType::LOGICAL_INSERT), table(Catalog::GetEntry(context, table_info->catalog, table_info->schema, - dynamic_cast(*table_info).table)) { + table_info->Cast().table)) { } idx_t LogicalInsert::EstimateCardinality(ClientContext &context) { diff --git a/src/duckdb/src/planner/operator/logical_update.cpp b/src/duckdb/src/planner/operator/logical_update.cpp index e66dd36d..edcfd5d8 100644 --- a/src/duckdb/src/planner/operator/logical_update.cpp +++ b/src/duckdb/src/planner/operator/logical_update.cpp @@ -12,7 +12,7 @@ LogicalUpdate::LogicalUpdate(TableCatalogEntry &table) LogicalUpdate::LogicalUpdate(ClientContext &context, const unique_ptr &table_info) : LogicalOperator(LogicalOperatorType::LOGICAL_UPDATE), table(Catalog::GetEntry(context, table_info->catalog, table_info->schema, - dynamic_cast(*table_info).table)) { + table_info->Cast().table)) { } idx_t LogicalUpdate::EstimateCardinality(ClientContext &context) { diff --git a/src/duckdb/src/planner/operator/logical_vacuum.cpp b/src/duckdb/src/planner/operator/logical_vacuum.cpp new file mode 100644 index 00000000..f2a82d7b --- /dev/null +++ b/src/duckdb/src/planner/operator/logical_vacuum.cpp @@ -0,0 +1,65 @@ +#include "duckdb/planner/operator/logical_vacuum.hpp" + +#include "duckdb/catalog/catalog_entry/table_catalog_entry.hpp" +#include "duckdb/common/serializer/serializer.hpp" +#include "duckdb/common/serializer/deserializer.hpp" +#include "duckdb/parser/parsed_data/vacuum_info.hpp" + +namespace duckdb { + +LogicalVacuum::LogicalVacuum() : LogicalOperator(LogicalOperatorType::LOGICAL_VACUUM) { +} + +LogicalVacuum::LogicalVacuum(unique_ptr info) + : LogicalOperator(LogicalOperatorType::LOGICAL_VACUUM), info(std::move(info)) { +} + +TableCatalogEntry &LogicalVacuum::GetTable() { + D_ASSERT(HasTable()); + return *table; +} +bool LogicalVacuum::HasTable() const { + return table != nullptr; +} + +void LogicalVacuum::SetTable(TableCatalogEntry &table_p) { + table = &table_p; +} + +void LogicalVacuum::Serialize(Serializer &serializer) const { + LogicalOperator::Serialize(serializer); + + serializer.WriteProperty(200, "info", info); + serializer.WriteProperty(201, "column_id_map", column_id_map); +} + +unique_ptr LogicalVacuum::Deserialize(Deserializer &deserializer) { + auto result = unique_ptr(new LogicalVacuum()); + + auto tmp_info = deserializer.ReadPropertyWithDefault>(200, "info"); + deserializer.ReadProperty(201, "column_id_map", result->column_id_map); + + result->info = unique_ptr_cast(std::move(tmp_info)); + auto &info = *result->info; + if (info.has_table) { + // deserialize the 'table' + auto &context = deserializer.Get(); + auto binder = Binder::CreateBinder(context); + auto bound_table = binder->Bind(*info.ref); + if (bound_table->type != TableReferenceType::BASE_TABLE) { + throw InvalidInputException("Can only vacuum/analyze base tables!"); + } + auto ref = unique_ptr_cast(std::move(bound_table)); + auto &table = ref->table; + result->SetTable(table); + // FIXME: we should probably verify that the 'column_id_map' and 'columns' are the same on the bound table after + // deserialization? + } + return std::move(result); +} + +idx_t LogicalVacuum::EstimateCardinality(ClientContext &context) { + return 1; +} + +} // namespace duckdb diff --git a/src/duckdb/src/planner/planner.cpp b/src/duckdb/src/planner/planner.cpp index e1efe1e4..2df3a698 100644 --- a/src/duckdb/src/planner/planner.cpp +++ b/src/duckdb/src/planner/planner.cpp @@ -182,10 +182,10 @@ void Planner::VerifyPlan(ClientContext &context, unique_ptr &op *map = std::move(parameters); } op = std::move(new_plan); - } catch (SerializationException &ex) { - // pass - } catch (NotImplementedException &ex) { - // pass + } catch (SerializationException &ex) { // NOLINT: explicitly allowing these errors (for now) + // pass + } catch (NotImplementedException &ex) { // NOLINT: explicitly allowing these errors (for now) + // pass } } diff --git a/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp b/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp index 4e5623ca..7e863703 100644 --- a/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +++ b/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp @@ -27,21 +27,20 @@ FlattenDependentJoins::FlattenDependentJoins(Binder &binder, const vectortype == LogicalOperatorType::LOGICAL_DEPENDENT_JOIN) { + if (op.type == LogicalOperatorType::LOGICAL_DEPENDENT_JOIN) { is_lateral_join = true; } HasCorrelatedExpressions visitor(correlated_columns, lateral, lateral_depth); - visitor.VisitOperator(*op); + visitor.VisitOperator(op); bool has_correlation = visitor.has_correlated_expressions; int child_idx = 0; // now visit the children of this entry and check if they have correlated expressions - for (auto &child : op->children) { + for (auto &child : op.children) { auto new_lateral_depth = lateral_depth; if (is_lateral_join && child_idx == 1) { new_lateral_depth = lateral_depth + 1; @@ -49,7 +48,7 @@ bool FlattenDependentJoins::DetectCorrelatedExpressions(LogicalOperator *op, boo // we OR the property with its children such that has_correlation is true if either // (1) this node has a correlated expression or // (2) one of its children has a correlated expression - if (DetectCorrelatedExpressions(child.get(), lateral, new_lateral_depth)) { + if (DetectCorrelatedExpressions(*child, lateral, new_lateral_depth)) { has_correlation = true; } child_idx++; @@ -60,10 +59,10 @@ bool FlattenDependentJoins::DetectCorrelatedExpressions(LogicalOperator *op, boo // If we detect correlation in a materialized or recursive CTE, the entire right side of the operator // needs to be marked as correlated. Otherwise, function PushDownDependentJoinInternal does not do the // right thing. - if (op->type == LogicalOperatorType::LOGICAL_MATERIALIZED_CTE || - op->type == LogicalOperatorType::LOGICAL_RECURSIVE_CTE) { + if (op.type == LogicalOperatorType::LOGICAL_MATERIALIZED_CTE || + op.type == LogicalOperatorType::LOGICAL_RECURSIVE_CTE) { if (has_correlation) { - MarkSubtreeCorrelated(*op->children[1].get()); + MarkSubtreeCorrelated(*op.children[1].get()); } } return has_correlation; @@ -71,7 +70,7 @@ bool FlattenDependentJoins::DetectCorrelatedExpressions(LogicalOperator *op, boo bool FlattenDependentJoins::MarkSubtreeCorrelated(LogicalOperator &op) { // Do not mark base table scans as correlated - auto entry = has_correlated_expressions.find(&op); + auto entry = has_correlated_expressions.find(op); D_ASSERT(entry != has_correlated_expressions.end()); bool has_correlation = entry->second; for (auto &child : op.children) { @@ -79,10 +78,10 @@ bool FlattenDependentJoins::MarkSubtreeCorrelated(LogicalOperator &op) { } if (op.type != LogicalOperatorType::LOGICAL_GET || op.children.size() == 1) { if (op.type == LogicalOperatorType::LOGICAL_CTE_REF) { - has_correlated_expressions[&op] = true; + has_correlated_expressions[op] = true; return true; } else { - has_correlated_expressions[&op] = has_correlation; + has_correlated_expressions[op] = has_correlation; } } return has_correlation; @@ -99,17 +98,17 @@ unique_ptr FlattenDependentJoins::PushDownDependentJoin(unique_ return result; } -bool SubqueryDependentFilter(Expression *expr) { - if (expr->expression_class == ExpressionClass::BOUND_CONJUNCTION && - expr->GetExpressionType() == ExpressionType::CONJUNCTION_AND) { - auto &bound_conjuction = expr->Cast(); +bool SubqueryDependentFilter(Expression &expr) { + if (expr.expression_class == ExpressionClass::BOUND_CONJUNCTION && + expr.GetExpressionType() == ExpressionType::CONJUNCTION_AND) { + auto &bound_conjuction = expr.Cast(); for (auto &child : bound_conjuction.children) { - if (SubqueryDependentFilter(child.get())) { + if (SubqueryDependentFilter(*child)) { return true; } } } - if (expr->expression_class == ExpressionClass::BOUND_SUBQUERY) { + if (expr.expression_class == ExpressionClass::BOUND_SUBQUERY) { return true; } return false; @@ -119,7 +118,7 @@ unique_ptr FlattenDependentJoins::PushDownDependentJoinInternal bool &parent_propagate_null_values, idx_t lateral_depth) { // first check if the logical operator has correlated expressions - auto entry = has_correlated_expressions.find(plan.get()); + auto entry = has_correlated_expressions.find(*plan); D_ASSERT(entry != has_correlated_expressions.end()); if (!entry->second) { // we reached a node without correlated expressions @@ -151,7 +150,7 @@ unique_ptr FlattenDependentJoins::PushDownDependentJoinInternal // filter // first we flatten the dependent join in the child of the filter for (auto &expr : plan->expressions) { - any_join |= SubqueryDependentFilter(expr.get()); + any_join |= SubqueryDependentFilter(*expr); } plan->children[0] = PushDownDependentJoinInternal(std::move(plan->children[0]), parent_propagate_null_values, lateral_depth); @@ -288,8 +287,8 @@ unique_ptr FlattenDependentJoins::PushDownDependentJoinInternal case LogicalOperatorType::LOGICAL_CROSS_PRODUCT: { // cross product // push into both sides of the plan - bool left_has_correlation = has_correlated_expressions.find(plan->children[0].get())->second; - bool right_has_correlation = has_correlated_expressions.find(plan->children[1].get())->second; + bool left_has_correlation = has_correlated_expressions.find(*plan->children[0])->second; + bool right_has_correlation = has_correlated_expressions.find(*plan->children[1])->second; if (!right_has_correlation) { // only left has correlation: push into left plan->children[0] = PushDownDependentJoinInternal(std::move(plan->children[0]), @@ -350,8 +349,8 @@ unique_ptr FlattenDependentJoins::PushDownDependentJoinInternal auto &join = plan->Cast(); D_ASSERT(plan->children.size() == 2); // check the correlated expressions in the children of the join - bool left_has_correlation = has_correlated_expressions.find(plan->children[0].get())->second; - bool right_has_correlation = has_correlated_expressions.find(plan->children[1].get())->second; + bool left_has_correlation = has_correlated_expressions.find(*plan->children[0])->second; + bool right_has_correlation = has_correlated_expressions.find(*plan->children[1])->second; if (join.join_type == JoinType::INNER) { // inner join @@ -433,12 +432,12 @@ unique_ptr FlattenDependentJoins::PushDownDependentJoinInternal auto &comparison_join = join.Cast(); comparison_join.conditions.push_back(std::move(cond)); } else { - auto &any_join = join.Cast(); + auto &logical_any_join = join.Cast(); auto comparison = make_uniq(ExpressionType::COMPARE_NOT_DISTINCT_FROM, std::move(left), std::move(right)); auto conjunction = make_uniq( - ExpressionType::CONJUNCTION_AND, std::move(comparison), std::move(any_join.condition)); - any_join.condition = std::move(conjunction); + ExpressionType::CONJUNCTION_AND, std::move(comparison), std::move(logical_any_join.condition)); + logical_any_join.condition = std::move(conjunction); } } // then we replace any correlated expressions with the corresponding entry in the correlated_map diff --git a/src/duckdb/src/storage/arena_allocator.cpp b/src/duckdb/src/storage/arena_allocator.cpp index f5eae77c..c659b2c1 100644 --- a/src/duckdb/src/storage/arena_allocator.cpp +++ b/src/duckdb/src/storage/arena_allocator.cpp @@ -101,11 +101,20 @@ data_ptr_t ArenaAllocator::Reallocate(data_ptr_t pointer, idx_t old_size, idx_t } } +void ArenaAllocator::AlignNext() { + if (head && !ValueIsAligned(head->current_position)) { + // move the current position forward so that the next allocation is aligned + head->current_position = AlignValue(head->current_position); + } +} + data_ptr_t ArenaAllocator::AllocateAligned(idx_t size) { + AlignNext(); return Allocate(AlignValue(size)); } data_ptr_t ArenaAllocator::ReallocateAligned(data_ptr_t pointer, idx_t old_size, idx_t size) { + AlignNext(); return Reallocate(pointer, old_size, AlignValue(size)); } diff --git a/src/duckdb/src/storage/buffer/buffer_pool_reservation.cpp b/src/duckdb/src/storage/buffer/buffer_pool_reservation.cpp index c602af1d..f22a96ff 100644 --- a/src/duckdb/src/storage/buffer/buffer_pool_reservation.cpp +++ b/src/duckdb/src/storage/buffer/buffer_pool_reservation.cpp @@ -28,7 +28,7 @@ void BufferPoolReservation::Resize(idx_t new_size) { size = new_size; } -void BufferPoolReservation::Merge(BufferPoolReservation &&src) { +void BufferPoolReservation::Merge(BufferPoolReservation src) { size += src.size; src.size = 0; } diff --git a/src/duckdb/src/storage/buffer_manager.cpp b/src/duckdb/src/storage/buffer_manager.cpp index 5b0a8929..cf49535d 100644 --- a/src/duckdb/src/storage/buffer_manager.cpp +++ b/src/duckdb/src/storage/buffer_manager.cpp @@ -8,10 +8,6 @@ namespace duckdb { -unique_ptr BufferManager::CreateStandardBufferManager(DatabaseInstance &db, DBConfig &config) { - return make_uniq(db, config.options.temporary_directory); -} - shared_ptr BufferManager::RegisterSmallMemory(idx_t block_size) { throw NotImplementedException("This type of BufferManager can not create 'small-memory' blocks"); } @@ -35,7 +31,7 @@ vector BufferManager::GetTemporaryFiles() { throw InternalException("This type of BufferManager does not allow temporary files"); } -const string &BufferManager::GetTemporaryDirectory() { +const string &BufferManager::GetTemporaryDirectory() const { throw InternalException("This type of BufferManager does not allow a temporary directory"); } @@ -51,10 +47,6 @@ void BufferManager::SetTemporaryDirectory(const string &new_dir) { throw NotImplementedException("This type of BufferManager can not set a temporary directory"); } -DatabaseInstance &BufferManager::GetDatabase() { - throw NotImplementedException("This type of BufferManager is not linked to a DatabaseInstance"); -} - bool BufferManager::HasTemporaryDirectory() const { return false; } @@ -64,7 +56,7 @@ idx_t BufferManager::GetQueryMaxMemory() const { return GetBufferPool().GetQueryMaxMemory(); } -unique_ptr BufferManager::ConstructManagedBuffer(idx_t size, unique_ptr &&source, +unique_ptr BufferManager::ConstructManagedBuffer(idx_t size, unique_ptr &&, FileBufferType type) { throw NotImplementedException("This type of BufferManager can not construct managed buffers"); } diff --git a/src/duckdb/src/storage/checkpoint/table_data_writer.cpp b/src/duckdb/src/storage/checkpoint/table_data_writer.cpp index 5382da0b..b90cae89 100644 --- a/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +++ b/src/duckdb/src/storage/checkpoint/table_data_writer.cpp @@ -25,9 +25,8 @@ CompressionType TableDataWriter::GetColumnCompressionType(idx_t i) { return table.GetColumn(LogicalIndex(i)).CompressionType(); } -void TableDataWriter::AddRowGroup(RowGroupPointer &&row_group_pointer, unique_ptr &&writer) { +void TableDataWriter::AddRowGroup(RowGroupPointer &&row_group_pointer, unique_ptr writer) { row_group_pointers.push_back(std::move(row_group_pointer)); - writer.reset(); } TaskScheduler &TableDataWriter::GetScheduler() { @@ -43,7 +42,7 @@ unique_ptr SingleFileTableDataWriter::GetRowGroupWriter(RowGroup return make_uniq(table, checkpoint_manager.partial_block_manager, table_data_writer); } -void SingleFileTableDataWriter::FinalizeTable(TableStatistics &&global_stats, DataTableInfo *info, +void SingleFileTableDataWriter::FinalizeTable(const TableStatistics &global_stats, DataTableInfo *info, Serializer &serializer) { // store the current position in the metadata writer // this is where the row groups for this table start diff --git a/src/duckdb/src/storage/checkpoint_manager.cpp b/src/duckdb/src/storage/checkpoint_manager.cpp index 1f97b538..574fc066 100644 --- a/src/duckdb/src/storage/checkpoint_manager.cpp +++ b/src/duckdb/src/storage/checkpoint_manager.cpp @@ -229,7 +229,7 @@ MetadataManager &SingleFileCheckpointReader::GetMetadataManager() { return storage.block_manager->GetMetadataManager(); } -void SingleFileCheckpointReader::LoadFromStorage() { +void SingleFileCheckpointReader::LoadFromStorage(optional_ptr context) { auto &block_manager = *storage.block_manager; auto &metadata_manager = GetMetadataManager(); MetaBlockPointer meta_block(block_manager.GetMetaBlock(), 0); @@ -238,13 +238,20 @@ void SingleFileCheckpointReader::LoadFromStorage() { return; } - Connection con(storage.GetDatabase()); - con.BeginTransaction(); - // create the MetadataReader to read from the storage - MetadataReader reader(metadata_manager, meta_block); - // reader.SetContext(*con.context); - LoadCheckpoint(*con.context, reader); - con.Commit(); + if (context) { + // create the MetadataReader to read from the storage + MetadataReader reader(metadata_manager, meta_block); + // reader.SetContext(*con.context); + LoadCheckpoint(*context, reader); + } else { + Connection con(storage.GetDatabase()); + con.BeginTransaction(); + // create the MetadataReader to read from the storage + MetadataReader reader(metadata_manager, meta_block); + // reader.SetContext(*con.context); + LoadCheckpoint(*con.context, reader); + con.Commit(); + } } void CheckpointWriter::WriteEntry(CatalogEntry &entry, Serializer &serializer) { diff --git a/src/duckdb/src/storage/compression/bitpacking.cpp b/src/duckdb/src/storage/compression/bitpacking.cpp index fa7f4a7c..5a82482e 100644 --- a/src/duckdb/src/storage/compression/bitpacking.cpp +++ b/src/duckdb/src/storage/compression/bitpacking.cpp @@ -514,7 +514,8 @@ struct BitpackingCompressState : public CompressionState { auto base_ptr = handle.Ptr(); // Compact the segment by moving the metadata next to the data. - idx_t metadata_offset = AlignValue(data_ptr - base_ptr); + idx_t unaligned_offset = data_ptr - base_ptr; + idx_t metadata_offset = AlignValue(unaligned_offset); idx_t metadata_size = base_ptr + Storage::BLOCK_SIZE - metadata_ptr; idx_t total_segment_size = metadata_offset + metadata_size; @@ -523,6 +524,10 @@ struct BitpackingCompressState : public CompressionState { throw InternalException("Error in bitpacking size calculation"); } + if (unaligned_offset != metadata_offset) { + // zero initialize any padding bits + memset(base_ptr + unaligned_offset, 0, metadata_offset - unaligned_offset); + } memmove(base_ptr + metadata_offset, metadata_ptr, metadata_size); // Store the offset of the metadata of the first group (which is at the highest address). diff --git a/src/duckdb/src/storage/compression/string_uncompressed.cpp b/src/duckdb/src/storage/compression/string_uncompressed.cpp index 6aee5045..bfdebbe3 100644 --- a/src/duckdb/src/storage/compression/string_uncompressed.cpp +++ b/src/duckdb/src/storage/compression/string_uncompressed.cpp @@ -406,7 +406,7 @@ string_location_t UncompressedStringStorage::FetchStringLocation(StringDictionar D_ASSERT(dict_offset >= -1 * int32_t(Storage::BLOCK_SIZE) && dict_offset <= int32_t(Storage::BLOCK_SIZE)); if (dict_offset < 0) { string_location_t result; - ReadStringMarker(baseptr + dict.end - (-1 * dict_offset), result.block_id, result.offset); + ReadStringMarker(baseptr + dict.end - idx_t(-1 * dict_offset), result.block_id, result.offset); return result; } else { return string_location_t(INVALID_BLOCK, dict_offset); diff --git a/src/duckdb/src/storage/data_pointer.cpp b/src/duckdb/src/storage/data_pointer.cpp index 29718e72..92c57245 100644 --- a/src/duckdb/src/storage/data_pointer.cpp +++ b/src/duckdb/src/storage/data_pointer.cpp @@ -9,7 +9,7 @@ namespace duckdb { unique_ptr ColumnSegmentState::Deserialize(Deserializer &deserializer) { auto compression_type = deserializer.Get(); auto &db = deserializer.Get(); - auto &type = deserializer.Get(); + auto &type = deserializer.Get(); auto compression_function = DBConfig::GetConfig(db).GetCompressionFunction(compression_type, type.InternalType()); if (!compression_function || !compression_function->deserialize_state) { throw SerializationException("Deserializing a ColumnSegmentState but could not find deserialize method"); diff --git a/src/duckdb/src/storage/data_table.cpp b/src/duckdb/src/storage/data_table.cpp index 6541bf19..2b09cfa6 100644 --- a/src/duckdb/src/storage/data_table.cpp +++ b/src/duckdb/src/storage/data_table.cpp @@ -34,8 +34,8 @@ DataTableInfo::DataTableInfo(AttachedDatabase &db, shared_ptr ta table(std::move(table)) { } -void DataTableInfo::InitializeIndexes(ClientContext &context) { - indexes.InitializeIndexes(context, *this); +void DataTableInfo::InitializeIndexes(ClientContext &context, bool throw_on_failure) { + indexes.InitializeIndexes(context, *this, throw_on_failure); } bool DataTableInfo::IsTemporary() const { @@ -89,8 +89,8 @@ DataTable::DataTable(ClientContext &context, DataTable &parent, idx_t removed_co column_definitions.emplace_back(column_def.Copy()); } - // try to initialize unknown indexes info->InitializeIndexes(context); + // first check if there are any indexes that exist that point to the removed column info->indexes.Scan([&](Index &index) { for (auto &column_id : index.column_ids) { @@ -137,6 +137,8 @@ DataTable::DataTable(ClientContext &context, DataTable &parent, unique_ptrInitializeIndexes(context); + // Verify the new constraint against current persistent/local data VerifyNewConstraint(context, parent, constraint.get()); @@ -155,7 +157,7 @@ DataTable::DataTable(ClientContext &context, DataTable &parent, idx_t changed_id for (auto &column_def : parent.column_definitions) { column_definitions.emplace_back(column_def.Copy()); } - // try to initialize unknown indexes + info->InitializeIndexes(context); // first check if there are any indexes that exist that point to the changed column @@ -858,7 +860,9 @@ void DataTable::RevertAppend(idx_t start_row, idx_t count) { row_data[i] = current_row_base + i; } info->indexes.Scan([&](Index &index) { - index.Delete(chunk, row_identifiers); + if (!index.IsUnknown()) { + index.Delete(chunk, row_identifiers); + } return false; }); current_row_base += chunk.size(); @@ -868,7 +872,9 @@ void DataTable::RevertAppend(idx_t start_row, idx_t count) { // we need to vacuum the indexes to remove any buffers that are now empty // due to reverting the appends info->indexes.Scan([&](Index &index) { - index.Vacuum(); + if (!index.IsUnknown()) { + index.Vacuum(); + } return false; }); @@ -1000,6 +1006,8 @@ idx_t DataTable::Delete(TableCatalogEntry &table, ClientContext &context, Vector return 0; } + info->InitializeIndexes(context, true); + auto &transaction = DuckTransaction::Get(context, db); auto &local_storage = LocalStorage::Get(transaction); bool has_delete_constraints = TableHasDeleteConstraints(table); @@ -1157,6 +1165,9 @@ void DataTable::Update(TableCatalogEntry &table, ClientContext &context, Vector throw TransactionException("Transaction conflict: cannot update a table that has been altered!"); } + // check that there are no unknown indexes + info->InitializeIndexes(context, true); + // first verify that no constraints are violated VerifyUpdateConstraints(context, table, updates, column_ids); @@ -1244,7 +1255,7 @@ void DataTable::Checkpoint(TableDataWriter &writer, Serializer &serializer) { // row-group pointers // table pointer // index data - writer.FinalizeTable(std::move(global_stats), info.get(), serializer); + writer.FinalizeTable(global_stats, info.get(), serializer); } void DataTable::CommitDropColumn(idx_t index) { diff --git a/src/duckdb/src/storage/local_storage.cpp b/src/duckdb/src/storage/local_storage.cpp index 2c7fb0fe..b8482e2d 100644 --- a/src/duckdb/src/storage/local_storage.cpp +++ b/src/duckdb/src/storage/local_storage.cpp @@ -197,7 +197,11 @@ void LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, TableAppen // we need to vacuum the indexes to remove any buffers that are now empty // due to reverting the appends table.info->indexes.Scan([&](Index &index) { - index.Vacuum(); + try { + index.Vacuum(); + } catch (std::exception &ex) { // LCOV_EXCL_START + error = ErrorData(ex); + } // LCOV_EXCL_STOP return false; }); error.Throw(); @@ -354,6 +358,7 @@ bool LocalStorage::NextParallelScan(ClientContext &context, DataTable &table, Pa } void LocalStorage::InitializeAppend(LocalAppendState &state, DataTable &table) { + table.info->InitializeIndexes(context); state.storage = &table_manager.GetOrCreateStorage(table); state.storage->row_groups->InitializeAppend(TransactionData(transaction), state.append_state); } @@ -445,6 +450,8 @@ void LocalStorage::Flush(DataTable &table, LocalTableStorage &storage) { } idx_t append_count = storage.row_groups->GetTotalRows() - storage.deleted_rows; + table.info->InitializeIndexes(context); + TableAppendState append_state; table.AppendLock(append_state); transaction.PushAppend(table, append_state.row_start, append_count); @@ -470,9 +477,6 @@ void LocalStorage::Flush(DataTable &table, LocalTableStorage &storage) { storage.AppendToIndexes(transaction, append_state, append_count, true); } - // try to initialize any unknown indexes - table.info->InitializeIndexes(context); - // possibly vacuum any excess index data table.info->indexes.Scan([&](Index &index) { index.Vacuum(); @@ -575,7 +579,6 @@ TableIndexList &LocalStorage::GetIndexes(DataTable &table) { if (!storage) { throw InternalException("LocalStorage::GetIndexes - local storage not found"); } - table.info->InitializeIndexes(context); return storage->indexes; } diff --git a/src/duckdb/src/storage/magic_bytes.cpp b/src/duckdb/src/storage/magic_bytes.cpp index f004d754..30309410 100644 --- a/src/duckdb/src/storage/magic_bytes.cpp +++ b/src/duckdb/src/storage/magic_bytes.cpp @@ -4,13 +4,14 @@ namespace duckdb { -DataFileType MagicBytes::CheckMagicBytes(FileSystem *fs_p, const string &path) { - LocalFileSystem lfs; - FileSystem &fs = fs_p ? *fs_p : lfs; - if (!fs.FileExists(path)) { +DataFileType MagicBytes::CheckMagicBytes(FileSystem &fs, const string &path) { + if (path.empty() || path == IN_MEMORY_PATH) { + return DataFileType::DUCKDB_FILE; + } + auto handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_READ | FileFlags::FILE_FLAGS_NULL_IF_NOT_EXISTS); + if (!handle) { return DataFileType::FILE_DOES_NOT_EXIST; } - auto handle = fs.OpenFile(path, FileFlags::FILE_FLAGS_READ); constexpr const idx_t MAGIC_BYTES_READ_SIZE = 16; char buffer[MAGIC_BYTES_READ_SIZE]; diff --git a/src/duckdb/src/storage/partial_block_manager.cpp b/src/duckdb/src/storage/partial_block_manager.cpp index 26366706..7fd73d6f 100644 --- a/src/duckdb/src/storage/partial_block_manager.cpp +++ b/src/duckdb/src/storage/partial_block_manager.cpp @@ -95,7 +95,7 @@ bool PartialBlockManager::GetPartialBlock(idx_t segment_size, unique_ptrstate; D_ASSERT(checkpoint_type != CheckpointType::FULL_CHECKPOINT || state.block_id >= 0); if (state.block_use_count < max_use_count) { diff --git a/src/duckdb/src/storage/serialization/serialize_logical_operator.cpp b/src/duckdb/src/storage/serialization/serialize_logical_operator.cpp index 1c155485..0fec4cbe 100644 --- a/src/duckdb/src/storage/serialization/serialize_logical_operator.cpp +++ b/src/duckdb/src/storage/serialization/serialize_logical_operator.cpp @@ -43,6 +43,9 @@ unique_ptr LogicalOperator::Deserialize(Deserializer &deseriali case LogicalOperatorType::LOGICAL_COMPARISON_JOIN: result = LogicalComparisonJoin::Deserialize(deserializer); break; + case LogicalOperatorType::LOGICAL_COPY_DATABASE: + result = LogicalCopyDatabase::Deserialize(deserializer); + break; case LogicalOperatorType::LOGICAL_COPY_TO_FILE: result = LogicalCopyToFile::Deserialize(deserializer); break; @@ -169,9 +172,6 @@ unique_ptr LogicalOperator::Deserialize(Deserializer &deseriali case LogicalOperatorType::LOGICAL_UPDATE: result = LogicalUpdate::Deserialize(deserializer); break; - case LogicalOperatorType::LOGICAL_VACUUM: - result = LogicalSimple::Deserialize(deserializer); - break; case LogicalOperatorType::LOGICAL_WINDOW: result = LogicalWindow::Deserialize(deserializer); break; @@ -184,16 +184,16 @@ unique_ptr LogicalOperator::Deserialize(Deserializer &deseriali } void FilenamePattern::Serialize(Serializer &serializer) const { - serializer.WritePropertyWithDefault(200, "base", _base); - serializer.WritePropertyWithDefault(201, "pos", _pos); - serializer.WritePropertyWithDefault(202, "uuid", _uuid); + serializer.WritePropertyWithDefault(200, "base", base); + serializer.WritePropertyWithDefault(201, "pos", pos); + serializer.WritePropertyWithDefault(202, "uuid", uuid); } FilenamePattern FilenamePattern::Deserialize(Deserializer &deserializer) { FilenamePattern result; - deserializer.ReadPropertyWithDefault(200, "base", result._base); - deserializer.ReadPropertyWithDefault(201, "pos", result._pos); - deserializer.ReadPropertyWithDefault(202, "uuid", result._uuid); + deserializer.ReadPropertyWithDefault(200, "base", result.base); + deserializer.ReadPropertyWithDefault(201, "pos", result.pos); + deserializer.ReadPropertyWithDefault(202, "uuid", result.uuid); return result; } @@ -298,6 +298,17 @@ unique_ptr LogicalComparisonJoin::Deserialize(Deserializer &des return std::move(result); } +void LogicalCopyDatabase::Serialize(Serializer &serializer) const { + LogicalOperator::Serialize(serializer); + serializer.WritePropertyWithDefault>(200, "info", info); +} + +unique_ptr LogicalCopyDatabase::Deserialize(Deserializer &deserializer) { + auto info = deserializer.ReadPropertyWithDefault>(200, "info"); + auto result = duckdb::unique_ptr(new LogicalCopyDatabase(std::move(info))); + return std::move(result); +} + void LogicalCreate::Serialize(Serializer &serializer) const { LogicalOperator::Serialize(serializer); serializer.WritePropertyWithDefault>(200, "info", info); diff --git a/src/duckdb/src/storage/serialization/serialize_nodes.cpp b/src/duckdb/src/storage/serialization/serialize_nodes.cpp index 44531988..03afa0d5 100644 --- a/src/duckdb/src/storage/serialization/serialize_nodes.cpp +++ b/src/duckdb/src/storage/serialization/serialize_nodes.cpp @@ -118,9 +118,9 @@ CSVOption CSVOption::Deserialize(Deserializer &deserializer) { } void CSVReaderOptions::Serialize(Serializer &serializer) const { - serializer.WritePropertyWithDefault(100, "ignore_errors", ignore_errors); + serializer.WritePropertyWithDefault(100, "ignore_errors", ignore_errors, false); serializer.WritePropertyWithDefault(101, "buffer_sample_size", buffer_sample_size); - serializer.WritePropertyWithDefault(102, "null_str", null_str); + serializer.WritePropertyWithDefault>(102, "null_str", null_str); serializer.WriteProperty(103, "compression", compression); serializer.WritePropertyWithDefault(104, "allow_quoted_nulls", allow_quoted_nulls); serializer.WritePropertyWithDefault(105, "maximum_line_size", maximum_line_size); @@ -135,10 +135,10 @@ void CSVReaderOptions::Serialize(Serializer &serializer) const { serializer.WritePropertyWithDefault(114, "buffer_size", buffer_size); serializer.WriteProperty(115, "file_options", file_options); serializer.WritePropertyWithDefault>(116, "force_quote", force_quote); - serializer.WritePropertyWithDefault(117, "rejects_table_name", rejects_table_name); + serializer.WritePropertyWithDefault(117, "rejects_table_name", rejects_table_name, "reject_errors"); serializer.WritePropertyWithDefault(118, "rejects_limit", rejects_limit); - serializer.WritePropertyWithDefault>(119, "rejects_recovery_columns", rejects_recovery_columns); - serializer.WritePropertyWithDefault>(120, "rejects_recovery_column_ids", rejects_recovery_column_ids); + /* [Deleted] (vector) "rejects_recovery_columns" */ + /* [Deleted] (vector) "rejects_recovery_column_ids" */ serializer.WriteProperty>(121, "dialect_options.state_machine_options.delimiter", dialect_options.state_machine_options.delimiter); serializer.WriteProperty>(122, "dialect_options.state_machine_options.quote", dialect_options.state_machine_options.quote); serializer.WriteProperty>(123, "dialect_options.state_machine_options.escape", dialect_options.state_machine_options.escape); @@ -150,13 +150,14 @@ void CSVReaderOptions::Serialize(Serializer &serializer) const { serializer.WritePropertyWithDefault(129, "sniffer_user_mismatch_error", sniffer_user_mismatch_error); serializer.WritePropertyWithDefault(130, "parallel", parallel); serializer.WritePropertyWithDefault>(131, "was_type_manually_set", was_type_manually_set); + serializer.WritePropertyWithDefault>(132, "rejects_scan_name", rejects_scan_name, {"reject_scans"}); } CSVReaderOptions CSVReaderOptions::Deserialize(Deserializer &deserializer) { CSVReaderOptions result; - deserializer.ReadPropertyWithDefault(100, "ignore_errors", result.ignore_errors); + deserializer.ReadPropertyWithDefault(100, "ignore_errors", result.ignore_errors, false); deserializer.ReadPropertyWithDefault(101, "buffer_sample_size", result.buffer_sample_size); - deserializer.ReadPropertyWithDefault(102, "null_str", result.null_str); + deserializer.ReadPropertyWithDefault>(102, "null_str", result.null_str); deserializer.ReadProperty(103, "compression", result.compression); deserializer.ReadPropertyWithDefault(104, "allow_quoted_nulls", result.allow_quoted_nulls); deserializer.ReadPropertyWithDefault(105, "maximum_line_size", result.maximum_line_size); @@ -171,10 +172,10 @@ CSVReaderOptions CSVReaderOptions::Deserialize(Deserializer &deserializer) { deserializer.ReadPropertyWithDefault(114, "buffer_size", result.buffer_size); deserializer.ReadProperty(115, "file_options", result.file_options); deserializer.ReadPropertyWithDefault>(116, "force_quote", result.force_quote); - deserializer.ReadPropertyWithDefault(117, "rejects_table_name", result.rejects_table_name); + deserializer.ReadPropertyWithDefault(117, "rejects_table_name", result.rejects_table_name, "reject_errors"); deserializer.ReadPropertyWithDefault(118, "rejects_limit", result.rejects_limit); - deserializer.ReadPropertyWithDefault>(119, "rejects_recovery_columns", result.rejects_recovery_columns); - deserializer.ReadPropertyWithDefault>(120, "rejects_recovery_column_ids", result.rejects_recovery_column_ids); + deserializer.ReadDeletedProperty>(119, "rejects_recovery_columns"); + deserializer.ReadDeletedProperty>(120, "rejects_recovery_column_ids"); deserializer.ReadProperty>(121, "dialect_options.state_machine_options.delimiter", result.dialect_options.state_machine_options.delimiter); deserializer.ReadProperty>(122, "dialect_options.state_machine_options.quote", result.dialect_options.state_machine_options.quote); deserializer.ReadProperty>(123, "dialect_options.state_machine_options.escape", result.dialect_options.state_machine_options.escape); @@ -186,6 +187,7 @@ CSVReaderOptions CSVReaderOptions::Deserialize(Deserializer &deserializer) { deserializer.ReadPropertyWithDefault(129, "sniffer_user_mismatch_error", result.sniffer_user_mismatch_error); deserializer.ReadPropertyWithDefault(130, "parallel", result.parallel); deserializer.ReadPropertyWithDefault>(131, "was_type_manually_set", result.was_type_manually_set); + deserializer.ReadPropertyWithDefault>(132, "rejects_scan_name", result.rejects_scan_name, {"reject_scans"}); return result; } diff --git a/src/duckdb/src/storage/serialization/serialize_parse_info.cpp b/src/duckdb/src/storage/serialization/serialize_parse_info.cpp index a0f931eb..fbd3d32c 100644 --- a/src/duckdb/src/storage/serialization/serialize_parse_info.cpp +++ b/src/duckdb/src/storage/serialization/serialize_parse_info.cpp @@ -10,6 +10,7 @@ #include "duckdb/parser/parsed_data/alter_table_info.hpp" #include "duckdb/parser/parsed_data/comment_on_column_info.hpp" #include "duckdb/parser/parsed_data/attach_info.hpp" +#include "duckdb/parser/parsed_data/copy_database_info.hpp" #include "duckdb/parser/parsed_data/copy_info.hpp" #include "duckdb/parser/parsed_data/detach_info.hpp" #include "duckdb/parser/parsed_data/drop_info.hpp" @@ -34,6 +35,9 @@ unique_ptr ParseInfo::Deserialize(Deserializer &deserializer) { case ParseInfoType::ATTACH_INFO: result = AttachInfo::Deserialize(deserializer); break; + case ParseInfoType::COPY_DATABASE_INFO: + result = CopyDatabaseInfo::Deserialize(deserializer); + break; case ParseInfoType::COPY_INFO: result = CopyInfo::Deserialize(deserializer); break; @@ -229,6 +233,19 @@ unique_ptr ChangeColumnTypeInfo::Deserialize(Deserializer &deser return std::move(result); } +void CopyDatabaseInfo::Serialize(Serializer &serializer) const { + ParseInfo::Serialize(serializer); + serializer.WritePropertyWithDefault(200, "target_database", target_database); + serializer.WritePropertyWithDefault>>(201, "entries", entries); +} + +unique_ptr CopyDatabaseInfo::Deserialize(Deserializer &deserializer) { + auto result = duckdb::unique_ptr(new CopyDatabaseInfo()); + deserializer.ReadPropertyWithDefault(200, "target_database", result->target_database); + deserializer.ReadPropertyWithDefault>>(201, "entries", result->entries); + return std::move(result); +} + void CopyInfo::Serialize(Serializer &serializer) const { ParseInfo::Serialize(serializer); serializer.WritePropertyWithDefault(200, "catalog", catalog); @@ -449,11 +466,17 @@ unique_ptr TransactionInfo::Deserialize(Deserializer &deserializer) { void VacuumInfo::Serialize(Serializer &serializer) const { ParseInfo::Serialize(serializer); serializer.WriteProperty(200, "options", options); + serializer.WritePropertyWithDefault(201, "has_table", has_table); + serializer.WritePropertyWithDefault>(202, "ref", ref); + serializer.WritePropertyWithDefault>(203, "columns", columns); } unique_ptr VacuumInfo::Deserialize(Deserializer &deserializer) { auto options = deserializer.ReadProperty(200, "options"); auto result = duckdb::unique_ptr(new VacuumInfo(options)); + deserializer.ReadPropertyWithDefault(201, "has_table", result->has_table); + deserializer.ReadPropertyWithDefault>(202, "ref", result->ref); + deserializer.ReadPropertyWithDefault>(203, "columns", result->columns); return std::move(result); } diff --git a/src/duckdb/src/storage/single_file_block_manager.cpp b/src/duckdb/src/storage/single_file_block_manager.cpp index 322db7ee..b46f4f92 100644 --- a/src/duckdb/src/storage/single_file_block_manager.cpp +++ b/src/duckdb/src/storage/single_file_block_manager.cpp @@ -150,31 +150,31 @@ SingleFileBlockManager::SingleFileBlockManager(AttachedDatabase &db, string path iteration_count(0), options(options) { } -void SingleFileBlockManager::GetFileFlags(uint8_t &flags, FileLockType &lock, bool create_new) { +FileOpenFlags SingleFileBlockManager::GetFileFlags(bool create_new) const { + FileOpenFlags result; if (options.read_only) { D_ASSERT(!create_new); - flags = FileFlags::FILE_FLAGS_READ; - lock = FileLockType::READ_LOCK; + result = FileFlags::FILE_FLAGS_READ | FileFlags::FILE_FLAGS_NULL_IF_NOT_EXISTS | FileLockType::READ_LOCK; } else { - flags = FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_READ; - lock = FileLockType::WRITE_LOCK; + result = FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_READ | FileLockType::WRITE_LOCK; if (create_new) { - flags |= FileFlags::FILE_FLAGS_FILE_CREATE; + result |= FileFlags::FILE_FLAGS_FILE_CREATE; } } if (options.use_direct_io) { - flags |= FileFlags::FILE_FLAGS_DIRECT_IO; + result |= FileFlags::FILE_FLAGS_DIRECT_IO; } + // database files can be read from in parallel + result |= FileFlags::FILE_FLAGS_PARALLEL_ACCESS; + return result; } void SingleFileBlockManager::CreateNewDatabase() { - uint8_t flags; - FileLockType lock; - GetFileFlags(flags, lock, true); + auto flags = GetFileFlags(true); // open the RDBMS handle auto &fs = FileSystem::Get(db); - handle = fs.OpenFile(path, flags, lock); + handle = fs.OpenFile(path, flags); // if we create a new file, we fill the metadata of the file // first fill in the new header @@ -221,13 +221,15 @@ void SingleFileBlockManager::CreateNewDatabase() { } void SingleFileBlockManager::LoadExistingDatabase() { - uint8_t flags; - FileLockType lock; - GetFileFlags(flags, lock, false); + auto flags = GetFileFlags(false); // open the RDBMS handle auto &fs = FileSystem::Get(db); - handle = fs.OpenFile(path, flags, lock); + handle = fs.OpenFile(path, flags); + if (!handle) { + // this can only happen in read-only mode - as that is when we set FILE_FLAGS_NULL_IF_NOT_EXISTS + throw CatalogException("Cannot open database \"%s\" in read-only mode: database does not exist", path); + } MainHeader::CheckMagicBytes(*handle); // otherwise, we check the metadata of the file @@ -294,7 +296,9 @@ void SingleFileBlockManager::LoadFreeList() { auto free_list_count = reader.Read(); free_list.clear(); for (idx_t i = 0; i < free_list_count; i++) { - free_list.insert(reader.Read()); + auto block = reader.Read(); + free_list.insert(block); + newly_freed_list.insert(block); } auto multi_use_blocks_count = reader.Read(); multi_use_blocks.clear(); @@ -320,6 +324,7 @@ block_id_t SingleFileBlockManager::GetFreeBlockId() { block = *free_list.begin(); // erase the entry from the free list again free_list.erase(free_list.begin()); + newly_freed_list.erase(block); } else { block = max_block++; } @@ -335,6 +340,7 @@ void SingleFileBlockManager::MarkBlockAsFree(block_id_t block_id) { } multi_use_blocks.erase(block_id); free_list.insert(block_id); + newly_freed_list.insert(block_id); } void SingleFileBlockManager::MarkBlockAsModified(block_id_t block_id) { @@ -432,9 +438,8 @@ void SingleFileBlockManager::Truncate() { return; } // truncate the file - for (idx_t i = 0; i < blocks_to_truncate; i++) { - free_list.erase(max_block + i); - } + free_list.erase(free_list.lower_bound(max_block), free_list.end()); + newly_freed_list.erase(newly_freed_list.lower_bound(max_block), newly_freed_list.end()); handle->Truncate(BLOCK_START + max_block * Storage::BLOCK_ALLOC_SIZE); } @@ -494,6 +499,7 @@ void SingleFileBlockManager::WriteHeader(DatabaseHeader header) { metadata_manager.MarkBlocksAsModified(); for (auto &block : modified_blocks) { free_list.insert(block); + newly_freed_list.insert(block); } modified_blocks.clear(); @@ -547,6 +553,27 @@ void SingleFileBlockManager::WriteHeader(DatabaseHeader header) { active_header = 1 - active_header; //! Ensure the header write ends up on disk handle->Sync(); + // Release the free blocks to the filesystem. + TrimFreeBlocks(); +} + +void SingleFileBlockManager::TrimFreeBlocks() { + if (DBConfig::Get(db).options.trim_free_blocks) { + for (auto itr = newly_freed_list.begin(); itr != newly_freed_list.end(); ++itr) { + block_id_t first = *itr; + block_id_t last = first; + // Find end of contiguous range. + for (++itr; itr != newly_freed_list.end() && (*itr == last + 1); ++itr) { + last = *itr; + } + // We are now one too far. + --itr; + // Trim the range. + handle->Trim(BLOCK_START + (first * Storage::BLOCK_ALLOC_SIZE), + (last + 1 - first) * Storage::BLOCK_ALLOC_SIZE); + } + } + newly_freed_list.clear(); } } // namespace duckdb diff --git a/src/duckdb/src/storage/standard_buffer_manager.cpp b/src/duckdb/src/storage/standard_buffer_manager.cpp index ab5ad560..5b801134 100644 --- a/src/duckdb/src/storage/standard_buffer_manager.cpp +++ b/src/duckdb/src/storage/standard_buffer_manager.cpp @@ -13,6 +13,12 @@ namespace duckdb { +#ifdef DUCKDB_DEBUG_DESTROY_BLOCKS +static void WriteGarbageIntoBuffer(FileBuffer &buffer) { + memset(buffer.buffer, 0xa5, buffer.size); // 0xa5 is default memory in debug mode +} +#endif + struct BufferAllocatorData : PrivateAllocatorData { explicit BufferAllocatorData(StandardBufferManager &manager) : manager(manager) { } @@ -85,14 +91,20 @@ TempBufferPoolReservation StandardBufferManager::EvictBlocksOrThrow(MemoryTag ta shared_ptr StandardBufferManager::RegisterSmallMemory(idx_t block_size) { D_ASSERT(block_size < Storage::BLOCK_SIZE); - auto res = EvictBlocksOrThrow(MemoryTag::BASE_TABLE, block_size, nullptr, "could not allocate block of size %s%s", - StringUtil::BytesToHumanReadableString(block_size)); + auto reservation = + EvictBlocksOrThrow(MemoryTag::BASE_TABLE, block_size, nullptr, "could not allocate block of size %s%s", + StringUtil::BytesToHumanReadableString(block_size)); auto buffer = ConstructManagedBuffer(block_size, nullptr, FileBufferType::TINY_BUFFER); // create a new block pointer for this block - return make_shared(*temp_block_manager, ++temporary_id, MemoryTag::BASE_TABLE, std::move(buffer), - false, block_size, std::move(res)); + auto result = make_shared(*temp_block_manager, ++temporary_id, MemoryTag::BASE_TABLE, + std::move(buffer), false, block_size, std::move(reservation)); +#ifdef DUCKDB_DEBUG_DESTROY_BLOCKS + // Initialize the memory with garbage data + WriteGarbageIntoBuffer(*result->buffer); +#endif + return result; } shared_ptr StandardBufferManager::RegisterMemory(MemoryTag tag, idx_t block_size, bool can_destroy) { @@ -115,6 +127,10 @@ BufferHandle StandardBufferManager::Allocate(MemoryTag tag, idx_t block_size, bo shared_ptr local_block; auto block_ptr = block ? block : &local_block; *block_ptr = RegisterMemory(tag, block_size, can_destroy); +#ifdef DUCKDB_DEBUG_DESTROY_BLOCKS + // Initialize the memory with garbage data + WriteGarbageIntoBuffer(*(*block_ptr)->buffer); +#endif return Pin(*block_ptr); } @@ -206,7 +222,7 @@ void StandardBufferManager::VerifyZeroReaders(shared_ptr &handle) { auto replacement_buffer = make_uniq(Allocator::Get(db), handle->buffer->type, handle->memory_usage - Storage::BLOCK_HEADER_SIZE); memcpy(replacement_buffer->buffer, handle->buffer->buffer, handle->buffer->size); - memset(handle->buffer->buffer, 0xa5, handle->buffer->size); // 0xa5 is default memory in debug mode + WriteGarbageIntoBuffer(*handle->buffer); handle->buffer = std::move(replacement_buffer); #endif } diff --git a/src/duckdb/src/storage/statistics/array_stats.cpp b/src/duckdb/src/storage/statistics/array_stats.cpp index d01b573b..ecb399d2 100644 --- a/src/duckdb/src/storage/statistics/array_stats.cpp +++ b/src/duckdb/src/storage/statistics/array_stats.cpp @@ -78,7 +78,7 @@ void ArrayStats::Deserialize(Deserializer &deserializer, BaseStatistics &base) { auto &child_type = ArrayType::GetChildType(type); // Push the logical type of the child type to the deserialization context - deserializer.Set(const_cast(child_type)); + deserializer.Set(child_type); base.child_stats[0].Copy(deserializer.ReadProperty(200, "child_stats")); deserializer.Unset(); } diff --git a/src/duckdb/src/storage/statistics/base_statistics.cpp b/src/duckdb/src/storage/statistics/base_statistics.cpp index 53bd862f..10659900 100644 --- a/src/duckdb/src/storage/statistics/base_statistics.cpp +++ b/src/duckdb/src/storage/statistics/base_statistics.cpp @@ -341,11 +341,10 @@ BaseStatistics BaseStatistics::Deserialize(Deserializer &deserializer) { auto distinct_count = deserializer.ReadProperty(102, "distinct_count"); // Get the logical type from the deserializer context. - auto type = deserializer.Get(); - + auto &type = deserializer.Get(); auto stats_type = GetStatsType(type); - BaseStatistics stats(std::move(type)); + BaseStatistics stats(type); stats.has_null = has_null; stats.has_no_null = has_no_null; diff --git a/src/duckdb/src/storage/statistics/list_stats.cpp b/src/duckdb/src/storage/statistics/list_stats.cpp index 0d4a0011..d6b658af 100644 --- a/src/duckdb/src/storage/statistics/list_stats.cpp +++ b/src/duckdb/src/storage/statistics/list_stats.cpp @@ -79,7 +79,7 @@ void ListStats::Deserialize(Deserializer &deserializer, BaseStatistics &base) { auto &child_type = ListType::GetChildType(type); // Push the logical type of the child type to the deserialization context - deserializer.Set(const_cast(child_type)); + deserializer.Set(child_type); base.child_stats[0].Copy(deserializer.ReadProperty(200, "child_stats")); deserializer.Unset(); } diff --git a/src/duckdb/src/storage/statistics/struct_stats.cpp b/src/duckdb/src/storage/statistics/struct_stats.cpp index 38096384..74c0921f 100644 --- a/src/duckdb/src/storage/statistics/struct_stats.cpp +++ b/src/duckdb/src/storage/statistics/struct_stats.cpp @@ -107,7 +107,7 @@ void StructStats::Deserialize(Deserializer &deserializer, BaseStatistics &base) auto &child_types = StructType::GetChildTypes(type); deserializer.ReadList(200, "child_stats", [&](Deserializer::List &list, idx_t i) { - deserializer.Set(const_cast(child_types[i].second)); + deserializer.Set(child_types[i].second); auto stat = list.ReadElement(); base.child_stats[i].Copy(stat); deserializer.Unset(); diff --git a/src/duckdb/src/storage/storage_info.cpp b/src/duckdb/src/storage/storage_info.cpp index ab882242..a8fd657b 100644 --- a/src/duckdb/src/storage/storage_info.cpp +++ b/src/duckdb/src/storage/storage_info.cpp @@ -9,25 +9,25 @@ struct StorageVersionInfo { idx_t storage_version; }; -static StorageVersionInfo storage_version_info[] = {{"v0.9.0, v0.9.1, v0.9.2 or v0.10.0", 64}, - {"v0.8.0 or v0.8.1", 51}, - {"v0.7.0 or v0.7.1", 43}, - {"v0.6.0 or v0.6.1", 39}, - {"v0.5.0 or v0.5.1", 38}, - {"v0.3.3, v0.3.4 or v0.4.0", 33}, - {"v0.3.2", 31}, - {"v0.3.1", 27}, - {"v0.3.0", 25}, - {"v0.2.9", 21}, - {"v0.2.8", 18}, - {"v0.2.7", 17}, - {"v0.2.6", 15}, - {"v0.2.5", 13}, - {"v0.2.4", 11}, - {"v0.2.3", 6}, - {"v0.2.2", 4}, - {"v0.2.1 and prior", 1}, - {nullptr, 0}}; +static const StorageVersionInfo storage_version_info[] = {{"v0.9.0, v0.9.1, v0.9.2 or v0.10.0", 64}, + {"v0.8.0 or v0.8.1", 51}, + {"v0.7.0 or v0.7.1", 43}, + {"v0.6.0 or v0.6.1", 39}, + {"v0.5.0 or v0.5.1", 38}, + {"v0.3.3, v0.3.4 or v0.4.0", 33}, + {"v0.3.2", 31}, + {"v0.3.1", 27}, + {"v0.3.0", 25}, + {"v0.2.9", 21}, + {"v0.2.8", 18}, + {"v0.2.7", 17}, + {"v0.2.6", 15}, + {"v0.2.5", 13}, + {"v0.2.4", 11}, + {"v0.2.3", 6}, + {"v0.2.2", 4}, + {"v0.2.1 and prior", 1}, + {nullptr, 0}}; const char *GetDuckDBVersion(idx_t version_number) { for (idx_t i = 0; storage_version_info[i].version_name; i++) { diff --git a/src/duckdb/src/storage/storage_manager.cpp b/src/duckdb/src/storage/storage_manager.cpp index 832924af..072584d7 100644 --- a/src/duckdb/src/storage/storage_manager.cpp +++ b/src/duckdb/src/storage/storage_manager.cpp @@ -44,6 +44,10 @@ BufferManager &BufferManager::GetBufferManager(ClientContext &context) { return BufferManager::GetBufferManager(*context.db); } +const BufferManager &BufferManager::GetBufferManager(const ClientContext &context) { + return BufferManager::GetBufferManager(*context.db); +} + ObjectCache &ObjectCache::GetObjectCache(ClientContext &context) { return context.db->GetObjectCache(); } @@ -83,14 +87,14 @@ bool StorageManager::InMemory() { return path == IN_MEMORY_PATH; } -void StorageManager::Initialize() { +void StorageManager::Initialize(optional_ptr context) { bool in_memory = InMemory(); if (in_memory && read_only) { throw CatalogException("Cannot launch in-memory database in read-only mode!"); } // create or load the database from disk, if not in-memory mode - LoadDatabase(); + LoadDatabase(context); } /////////////////////////////////////////////////////////////////////////// @@ -117,8 +121,7 @@ SingleFileStorageManager::SingleFileStorageManager(AttachedDatabase &db, string : StorageManager(db, std::move(path), read_only) { } -void SingleFileStorageManager::LoadDatabase() { - +void SingleFileStorageManager::LoadDatabase(optional_ptr context) { if (InMemory()) { block_manager = make_uniq(BufferManager::GetBufferManager(db)); table_io_manager = make_uniq(*block_manager); @@ -139,12 +142,11 @@ void SingleFileStorageManager::LoadDatabase() { options.debug_initialize = config.options.debug_initialize; // first check if the database exists - if (!fs.FileExists(path)) { - if (read_only) { - throw CatalogException("Cannot open database \"%s\" in read-only mode: database does not exist", path); - } + if (!read_only && !fs.FileExists(path)) { + // file does not exist and we are in read-write mode + // create a new file - // check if the WAL exists + // check if a WAL file already exists auto wal_path = GetWALPath(); if (fs.FileExists(wal_path)) { // WAL file exists but database file does not @@ -157,8 +159,10 @@ void SingleFileStorageManager::LoadDatabase() { sf_block_manager->CreateNewDatabase(); block_manager = std::move(sf_block_manager); table_io_manager = make_uniq(*block_manager); - } else { + // either the file exists, or we are in read-only mode + // try to read the existing file on disk + // initialize the block manager while loading the current db file auto sf_block_manager = make_uniq(db, path, options); sf_block_manager->LoadExistingDatabase(); @@ -167,13 +171,14 @@ void SingleFileStorageManager::LoadDatabase() { // load the db from storage auto checkpoint_reader = SingleFileCheckpointReader(*this); - checkpoint_reader.LoadFromStorage(); + checkpoint_reader.LoadFromStorage(context); // check if the WAL file exists auto wal_path = GetWALPath(); - if (fs.FileExists(wal_path)) { + auto handle = fs.OpenFile(wal_path, FileFlags::FILE_FLAGS_READ | FileFlags::FILE_FLAGS_NULL_IF_NOT_EXISTS); + if (handle) { // replay the WAL - if (WriteAheadLog::Replay(db, wal_path)) { + if (WriteAheadLog::Replay(db, std::move(handle))) { fs.RemoveFile(wal_path); } } diff --git a/src/duckdb/src/storage/table/chunk_info.cpp b/src/duckdb/src/storage/table/chunk_info.cpp index d220e080..86236aaa 100644 --- a/src/duckdb/src/storage/table/chunk_info.cpp +++ b/src/duckdb/src/storage/table/chunk_info.cpp @@ -4,6 +4,7 @@ #include "duckdb/common/serializer/serializer.hpp" #include "duckdb/common/serializer/deserializer.hpp" #include "duckdb/common/serializer/memory_stream.hpp" +#include "duckdb/transaction/delete_info.hpp" namespace duckdb { @@ -198,9 +199,16 @@ idx_t ChunkVectorInfo::Delete(transaction_t transaction_id, row_t rows[], idx_t return deleted_tuples; } -void ChunkVectorInfo::CommitDelete(transaction_t commit_id, row_t rows[], idx_t count) { - for (idx_t i = 0; i < count; i++) { - deleted[rows[i]] = commit_id; +void ChunkVectorInfo::CommitDelete(transaction_t commit_id, const DeleteInfo &info) { + if (info.is_consecutive) { + for (idx_t i = 0; i < info.count; i++) { + deleted[i] = commit_id; + } + } else { + auto rows = info.GetRows(); + for (idx_t i = 0; i < info.count; i++) { + deleted[rows[i]] = commit_id; + } } } diff --git a/src/duckdb/src/storage/table/column_data.cpp b/src/duckdb/src/storage/table/column_data.cpp index 456135c7..21924d03 100644 --- a/src/duckdb/src/storage/table/column_data.cpp +++ b/src/duckdb/src/storage/table/column_data.cpp @@ -57,6 +57,16 @@ const LogicalType &ColumnData::RootType() const { return type; } +bool ColumnData::HasUpdates() const { + lock_guard update_guard(update_lock); + return updates.get(); +} + +void ColumnData::ClearUpdates() { + lock_guard update_guard(update_lock); + updates.reset(); +} + idx_t ColumnData::GetMaxEntry() { return count; } @@ -133,26 +143,52 @@ idx_t ColumnData::ScanVector(ColumnScanState &state, Vector &result, idx_t remai return initial_remaining - remaining; } -template -idx_t ColumnData::ScanVector(TransactionData transaction, idx_t vector_index, ColumnScanState &state, Vector &result) { - bool has_updates; - { - lock_guard update_guard(update_lock); - has_updates = updates ? true : false; +unique_ptr ColumnData::GetUpdateStatistics() { + lock_guard update_guard(update_lock); + return updates ? updates->GetStatistics() : nullptr; +} + +void ColumnData::FetchUpdates(TransactionData transaction, idx_t vector_index, Vector &result, idx_t scan_count, + bool allow_updates, bool scan_committed) { + lock_guard update_guard(update_lock); + if (!updates) { + return; } - auto scan_count = ScanVector(state, result, STANDARD_VECTOR_SIZE, has_updates); - if (has_updates) { - lock_guard update_guard(update_lock); - if (!ALLOW_UPDATES && updates->HasUncommittedUpdates(vector_index)) { - throw TransactionException("Cannot create index with outstanding updates"); - } - result.Flatten(scan_count); - if (SCAN_COMMITTED) { - updates->FetchCommitted(vector_index, result); - } else { - updates->FetchUpdates(transaction, vector_index, result); - } + if (!allow_updates && updates->HasUncommittedUpdates(vector_index)) { + throw TransactionException("Cannot create index with outstanding updates"); + } + result.Flatten(scan_count); + if (scan_committed) { + updates->FetchCommitted(vector_index, result); + } else { + updates->FetchUpdates(transaction, vector_index, result); } +} + +void ColumnData::FetchUpdateRow(TransactionData transaction, row_t row_id, Vector &result, idx_t result_idx) { + lock_guard update_guard(update_lock); + if (!updates) { + return; + } + updates->FetchRow(transaction, row_id, result, result_idx); +} + +void ColumnData::UpdateInternal(TransactionData transaction, idx_t column_index, Vector &update_vector, row_t *row_ids, + idx_t update_count, Vector &base_vector) { + lock_guard update_guard(update_lock); + if (!updates) { + updates = make_uniq(*this); + } + updates->Update(transaction, column_index, update_vector, row_ids, update_count, base_vector); +} + +template +idx_t ColumnData::ScanVector(TransactionData transaction, idx_t vector_index, ColumnScanState &state, Vector &result) { + idx_t current_row = vector_index * STANDARD_VECTOR_SIZE; + auto vector_count = MinValue(STANDARD_VECTOR_SIZE, count - current_row); + + auto scan_count = ScanVector(state, result, vector_count, HasUpdates()); + FetchUpdates(transaction, vector_index, result, scan_count, ALLOW_UPDATES, SCAN_COMMITTED); return scan_count; } @@ -177,61 +213,62 @@ idx_t ColumnData::ScanCommitted(idx_t vector_index, ColumnScanState &state, Vect } } -void ColumnData::ScanCommittedRange(idx_t row_group_start, idx_t offset_in_row_group, idx_t count, Vector &result) { +void ColumnData::ScanCommittedRange(idx_t row_group_start, idx_t offset_in_row_group, idx_t s_count, Vector &result) { ColumnScanState child_state; InitializeScanWithOffset(child_state, row_group_start + offset_in_row_group); - auto scan_count = ScanVector(child_state, result, count, updates ? true : false); - if (updates) { + bool has_updates = HasUpdates(); + auto scan_count = ScanVector(child_state, result, s_count, has_updates); + if (has_updates) { result.Flatten(scan_count); - updates->FetchCommittedRange(offset_in_row_group, count, result); + updates->FetchCommittedRange(offset_in_row_group, s_count, result); } } -idx_t ColumnData::ScanCount(ColumnScanState &state, Vector &result, idx_t count) { - if (count == 0) { +idx_t ColumnData::ScanCount(ColumnScanState &state, Vector &result, idx_t scan_count) { + if (scan_count == 0) { return 0; } // ScanCount can only be used if there are no updates - D_ASSERT(!updates); - return ScanVector(state, result, count, false); + D_ASSERT(!HasUpdates()); + return ScanVector(state, result, scan_count, false); } void ColumnData::Select(TransactionData transaction, idx_t vector_index, ColumnScanState &state, Vector &result, - SelectionVector &sel, idx_t &count, const TableFilter &filter) { + SelectionVector &sel, idx_t &s_count, const TableFilter &filter) { idx_t scan_count = Scan(transaction, vector_index, state, result); UnifiedVectorFormat vdata; result.ToUnifiedFormat(scan_count, vdata); - ColumnSegment::FilterSelection(sel, result, vdata, filter, scan_count, count); + ColumnSegment::FilterSelection(sel, result, vdata, filter, scan_count, s_count); } void ColumnData::FilterScan(TransactionData transaction, idx_t vector_index, ColumnScanState &state, Vector &result, - SelectionVector &sel, idx_t count) { + SelectionVector &sel, idx_t s_count) { Scan(transaction, vector_index, state, result); - result.Slice(sel, count); + result.Slice(sel, s_count); } void ColumnData::FilterScanCommitted(idx_t vector_index, ColumnScanState &state, Vector &result, SelectionVector &sel, - idx_t count, bool allow_updates) { + idx_t s_count, bool allow_updates) { ScanCommitted(vector_index, state, result, allow_updates); - result.Slice(sel, count); + result.Slice(sel, s_count); } -void ColumnData::Skip(ColumnScanState &state, idx_t count) { - state.Next(count); +void ColumnData::Skip(ColumnScanState &state, idx_t s_count) { + state.Next(s_count); } -void ColumnData::Append(BaseStatistics &stats, ColumnAppendState &state, Vector &vector, idx_t count) { +void ColumnData::Append(BaseStatistics &append_stats, ColumnAppendState &state, Vector &vector, idx_t append_count) { UnifiedVectorFormat vdata; vector.ToUnifiedFormat(count, vdata); - AppendData(stats, state, vdata, count); + AppendData(append_stats, state, vdata, append_count); } -void ColumnData::Append(ColumnAppendState &state, Vector &vector, idx_t count) { +void ColumnData::Append(ColumnAppendState &state, Vector &vector, idx_t append_count) { if (parent || !stats) { throw InternalException("ColumnData::Append called on a column with a parent or without stats"); } - Append(stats->statistics, state, vector, count); + Append(stats->statistics, state, vector, append_count); } bool ColumnData::CheckZonemap(TableFilter &filter) { @@ -288,14 +325,15 @@ void ColumnData::InitializeAppend(ColumnAppendState &state) { D_ASSERT(state.current->function.get().append); } -void ColumnData::AppendData(BaseStatistics &stats, ColumnAppendState &state, UnifiedVectorFormat &vdata, idx_t count) { +void ColumnData::AppendData(BaseStatistics &append_stats, ColumnAppendState &state, UnifiedVectorFormat &vdata, + idx_t append_count) { idx_t offset = 0; - this->count += count; + this->count += append_count; while (true) { // append the data from the vector - idx_t copied_elements = state.current->Append(state, vdata, offset, count); - stats.Merge(state.current->stats.statistics); - if (copied_elements == count) { + idx_t copied_elements = state.current->Append(state, vdata, offset, append_count); + append_stats.Merge(state.current->stats.statistics); + if (copied_elements == append_count) { // finished copying everything break; } @@ -308,7 +346,7 @@ void ColumnData::AppendData(BaseStatistics &stats, ColumnAppendState &state, Uni state.current->InitializeAppend(state); } offset += copied_elements; - count -= copied_elements; + append_count -= copied_elements; } } @@ -352,24 +390,17 @@ void ColumnData::FetchRow(TransactionData transaction, ColumnFetchState &state, // now perform the fetch within the segment segment->FetchRow(state, row_id, result, result_idx); // merge any updates made to this row - lock_guard update_guard(update_lock); - if (updates) { - updates->FetchRow(transaction, row_id, result, result_idx); - } + FetchUpdateRow(transaction, row_id, result, result_idx); } void ColumnData::Update(TransactionData transaction, idx_t column_index, Vector &update_vector, row_t *row_ids, idx_t update_count) { - lock_guard update_guard(update_lock); - if (!updates) { - updates = make_uniq(*this); - } Vector base_vector(type); ColumnScanState state; auto fetch_count = Fetch(state, row_ids[0], base_vector); base_vector.Flatten(fetch_count); - updates->Update(transaction, column_index, update_vector, row_ids, update_count, base_vector); + UpdateInternal(transaction, column_index, update_vector, row_ids, update_count, base_vector); } void ColumnData::UpdateColumn(TransactionData transaction, const vector &column_path, Vector &update_vector, @@ -379,11 +410,6 @@ void ColumnData::UpdateColumn(TransactionData transaction, const vector ColumnData::GetUpdateStatistics() { - lock_guard update_guard(update_lock); - return updates ? updates->GetStatistics() : nullptr; -} - void ColumnData::AppendTransientSegment(SegmentLock &l, idx_t start_row) { idx_t vector_segment_size = Storage::BLOCK_SIZE; @@ -422,11 +448,11 @@ void ColumnData::CheckpointScan(ColumnSegment &segment, ColumnScanState &state, segment.FetchRow(fetch_state, state.row_index + i, scan_vector, i); } } else { - segment.Scan(state, count, scan_vector, 0, true); + segment.Scan(state, count, scan_vector, 0, !HasUpdates()); } if (updates) { - scan_vector.Flatten(count); + D_ASSERT(scan_vector.GetVectorType() == VectorType::FLAT_VECTOR); updates->FetchCommittedRange(state.row_index - row_group_start, count, scan_vector); } } @@ -445,14 +471,13 @@ unique_ptr ColumnData::Checkpoint(RowGroup &row_group, // empty table: flush the empty list return checkpoint_state; } - lock_guard update_guard(update_lock); ColumnDataCheckpointer checkpointer(*this, row_group, *checkpoint_state, checkpoint_info); checkpointer.Checkpoint(std::move(nodes)); // replace the old tree with the new one data.Replace(l, checkpoint_state->new_tree); - updates.reset(); + ClearUpdates(); return checkpoint_state; } @@ -527,10 +552,7 @@ void ColumnData::GetColumnSegmentInfo(idx_t row_group_index, vector col_p column_info.segment_count = segment->count; column_info.compression_type = CompressionTypeToString(segment->function.get().type); column_info.segment_stats = segment->stats.statistics.ToString(); - { - lock_guard ulock(update_lock); - column_info.has_updates = updates ? true : false; - } + column_info.has_updates = ColumnData::HasUpdates(); // persistent // block_id // block_offset diff --git a/src/duckdb/src/storage/table/row_group.cpp b/src/duckdb/src/storage/table/row_group.cpp index 67e17737..824827d7 100644 --- a/src/duckdb/src/storage/table/row_group.cpp +++ b/src/duckdb/src/storage/table/row_group.cpp @@ -25,15 +25,15 @@ namespace duckdb { -RowGroup::RowGroup(RowGroupCollection &collection, idx_t start, idx_t count) - : SegmentBase(start, count), collection(collection), allocation_size(0) { +RowGroup::RowGroup(RowGroupCollection &collection_p, idx_t start, idx_t count) + : SegmentBase(start, count), collection(collection_p), allocation_size(0) { Verify(); } -RowGroup::RowGroup(RowGroupCollection &collection, RowGroupPointer &&pointer) - : SegmentBase(pointer.row_start, pointer.tuple_count), collection(collection), allocation_size(0) { +RowGroup::RowGroup(RowGroupCollection &collection_p, RowGroupPointer pointer) + : SegmentBase(pointer.row_start, pointer.tuple_count), collection(collection_p), allocation_size(0) { // deserialize the columns - if (pointer.data_pointers.size() != collection.GetTypes().size()) { + if (pointer.data_pointers.size() != collection_p.GetTypes().size()) { throw IOException("Row group column count is unaligned with table column count. Corrupt file?"); } this->column_pointers = std::move(pointer.data_pointers); @@ -48,8 +48,8 @@ RowGroup::RowGroup(RowGroupCollection &collection, RowGroupPointer &&pointer) Verify(); } -void RowGroup::MoveToCollection(RowGroupCollection &collection, idx_t new_start) { - this->collection = collection; +void RowGroup::MoveToCollection(RowGroupCollection &collection_p, idx_t new_start) { + this->collection = collection_p; this->start = new_start; for (auto &column : GetColumns()) { column->SetStart(new_start); diff --git a/src/duckdb/src/storage/table/row_version_manager.cpp b/src/duckdb/src/storage/table/row_version_manager.cpp index e1ffecb4..ead21f89 100644 --- a/src/duckdb/src/storage/table/row_version_manager.cpp +++ b/src/duckdb/src/storage/table/row_version_manager.cpp @@ -159,10 +159,10 @@ idx_t RowVersionManager::DeleteRows(idx_t vector_idx, transaction_t transaction_ return GetVectorInfo(vector_idx).Delete(transaction_id, rows, count); } -void RowVersionManager::CommitDelete(idx_t vector_idx, transaction_t commit_id, row_t rows[], idx_t count) { +void RowVersionManager::CommitDelete(idx_t vector_idx, transaction_t commit_id, const DeleteInfo &info) { lock_guard lock(version_lock); has_changes = true; - GetVectorInfo(vector_idx).CommitDelete(commit_id, rows, count); + GetVectorInfo(vector_idx).CommitDelete(commit_id, info); } vector RowVersionManager::Checkpoint(MetadataManager &manager) { diff --git a/src/duckdb/src/storage/table/standard_column_data.cpp b/src/duckdb/src/storage/table/standard_column_data.cpp index 9347e72e..ce851f00 100644 --- a/src/duckdb/src/storage/table/standard_column_data.cpp +++ b/src/duckdb/src/storage/table/standard_column_data.cpp @@ -21,6 +21,10 @@ void StandardColumnData::SetStart(idx_t new_start) { validity.SetStart(new_start); } +bool StandardColumnData::HasUpdates() const { + return ColumnData::HasUpdates() || validity.HasUpdates(); +} + bool StandardColumnData::CheckZonemap(ColumnScanState &state, TableFilter &filter) { if (!state.segment_checked) { if (!state.current) { diff --git a/src/duckdb/src/storage/table/update_segment.cpp b/src/duckdb/src/storage/table/update_segment.cpp index 88524159..624d987e 100644 --- a/src/duckdb/src/storage/table/update_segment.cpp +++ b/src/duckdb/src/storage/table/update_segment.cpp @@ -501,7 +501,9 @@ void UpdateSegment::RollbackUpdate(UpdateInfo &info) { auto lock_handle = lock.GetExclusiveLock(); // move the data from the UpdateInfo back into the base info - D_ASSERT(root->info[info.vector_index]); + if (!root->info[info.vector_index]) { + return; + } rollback_update_function(*root->info[info.vector_index]->info, info); // clean up the update chain diff --git a/src/duckdb/src/storage/table_index_list.cpp b/src/duckdb/src/storage/table_index_list.cpp index ef14073f..1e07ce6f 100644 --- a/src/duckdb/src/storage/table_index_list.cpp +++ b/src/duckdb/src/storage/table_index_list.cpp @@ -55,7 +55,7 @@ bool TableIndexList::NameIsUnique(const string &name) { return true; } -void TableIndexList::InitializeIndexes(ClientContext &context, DataTableInfo &table_info) { +void TableIndexList::InitializeIndexes(ClientContext &context, DataTableInfo &table_info, bool throw_on_failure) { lock_guard lock(indexes_lock); for (auto &index : indexes) { if (!index->IsUnknown()) { @@ -68,6 +68,11 @@ void TableIndexList::InitializeIndexes(ClientContext &context, DataTableInfo &ta // Do we know the type of this index now? auto index_type = context.db->config.GetIndexTypes().FindByName(index_type_name); if (!index_type) { + if (throw_on_failure) { + throw MissingExtensionException( + "Cannot initialize index '%s', unknown index type '%s'. You probably need to load an extension.", + unknown_index.name, index_type_name); + } continue; } diff --git a/src/duckdb/src/storage/temporary_file_manager.cpp b/src/duckdb/src/storage/temporary_file_manager.cpp index 34ec0ca5..c3748290 100644 --- a/src/duckdb/src/storage/temporary_file_manager.cpp +++ b/src/duckdb/src/storage/temporary_file_manager.cpp @@ -135,7 +135,7 @@ void TemporaryFileHandle::CreateFileIfNotExists(TemporaryFileLock &) { return; } auto &fs = FileSystem::GetFileSystem(db); - uint8_t open_flags = FileFlags::FILE_FLAGS_READ | FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE; + auto open_flags = FileFlags::FILE_FLAGS_READ | FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE; handle = fs.OpenFile(path, open_flags); } diff --git a/src/duckdb/src/storage/wal_replay.cpp b/src/duckdb/src/storage/wal_replay.cpp index e66f6060..9699bbac 100644 --- a/src/duckdb/src/storage/wal_replay.cpp +++ b/src/duckdb/src/storage/wal_replay.cpp @@ -158,10 +158,10 @@ class WriteAheadLogDeserializer { //===--------------------------------------------------------------------===// // Replay //===--------------------------------------------------------------------===// -bool WriteAheadLog::Replay(AttachedDatabase &database, string &path) { +bool WriteAheadLog::Replay(AttachedDatabase &database, unique_ptr handle) { Connection con(database.GetDatabase()); - auto initial_source = make_uniq(FileSystem::Get(database), path.c_str()); - if (initial_source->Finished()) { + BufferedFileReader reader(FileSystem::Get(database), std::move(handle)); + if (reader.Finished()) { // WAL is empty return false; } @@ -174,10 +174,10 @@ bool WriteAheadLog::Replay(AttachedDatabase &database, string &path) { try { while (true) { // read the current entry (deserialize only) - auto deserializer = WriteAheadLogDeserializer::Open(checkpoint_state, *initial_source, true); + auto deserializer = WriteAheadLogDeserializer::Open(checkpoint_state, reader, true); if (deserializer.ReplayEntry()) { // check if the file is exhausted - if (initial_source->Finished()) { + if (reader.Finished()) { // we finished reading the file: break break; } @@ -196,7 +196,6 @@ bool WriteAheadLog::Replay(AttachedDatabase &database, string &path) { Printer::Print("Unknown Exception in WAL playback during initial read"); return false; } // LCOV_EXCL_STOP - initial_source.reset(); if (checkpoint_state.checkpoint_id.IsValid()) { // there is a checkpoint flag: check if we need to deserialize the WAL auto &manager = database.GetStorageManager(); @@ -208,9 +207,11 @@ bool WriteAheadLog::Replay(AttachedDatabase &database, string &path) { } // we need to recover from the WAL: actually set up the replay state - BufferedFileReader reader(FileSystem::Get(database), path.c_str()); ReplayState state(database, *con.context); + // reset the reader - we are going to read the WAL from the beginning again + reader.Reset(); + // replay the WAL // note that everything is wrapped inside a try/catch block here // there can be errors in WAL replay because of a corrupt WAL file diff --git a/src/duckdb/src/storage/write_ahead_log.cpp b/src/duckdb/src/storage/write_ahead_log.cpp index 5dac22c5..165ef10e 100644 --- a/src/duckdb/src/storage/write_ahead_log.cpp +++ b/src/duckdb/src/storage/write_ahead_log.cpp @@ -21,10 +21,9 @@ const uint64_t WAL_VERSION_NUMBER = 2; WriteAheadLog::WriteAheadLog(AttachedDatabase &database, const string &path) : skip_writing(false), database(database) { wal_path = path; - writer = make_uniq(FileSystem::Get(database), path.c_str(), - NumericCast(FileFlags::FILE_FLAGS_WRITE | - FileFlags::FILE_FLAGS_FILE_CREATE | - FileFlags::FILE_FLAGS_APPEND)); + writer = make_uniq(FileSystem::Get(database), path, + FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE | + FileFlags::FILE_FLAGS_APPEND); } WriteAheadLog::~WriteAheadLog() { diff --git a/src/duckdb/src/transaction/cleanup_state.cpp b/src/duckdb/src/transaction/cleanup_state.cpp index 6df9cad5..0ec438c2 100644 --- a/src/duckdb/src/transaction/cleanup_state.cpp +++ b/src/duckdb/src/transaction/cleanup_state.cpp @@ -70,8 +70,15 @@ void CleanupState::CleanupDelete(DeleteInfo &info) { indexed_tables[current_table->info->table] = current_table; count = 0; - for (idx_t i = 0; i < info.count; i++) { - row_numbers[count++] = info.base_row + info.rows[i]; + if (info.is_consecutive) { + for (idx_t i = 0; i < info.count; i++) { + row_numbers[count++] = info.base_row + i; + } + } else { + auto rows = info.GetRows(); + for (idx_t i = 0; i < info.count; i++) { + row_numbers[count++] = info.base_row + rows[i]; + } } Flush(); } @@ -87,7 +94,7 @@ void CleanupState::Flush() { // delete the tuples from all the indexes try { current_table->RemoveFromIndexes(row_identifiers, count); - } catch (...) { + } catch (...) { // NOLINT: ignore errors here } count = 0; diff --git a/src/duckdb/src/transaction/commit_state.cpp b/src/duckdb/src/transaction/commit_state.cpp index 46cd9e49..986aac3b 100644 --- a/src/duckdb/src/transaction/commit_state.cpp +++ b/src/duckdb/src/transaction/commit_state.cpp @@ -204,8 +204,15 @@ void CommitState::WriteDelete(DeleteInfo &info) { delete_chunk->Initialize(Allocator::DefaultAllocator(), delete_types); } auto rows = FlatVector::GetData(delete_chunk->data[0]); - for (idx_t i = 0; i < info.count; i++) { - rows[i] = info.base_row + info.rows[i]; + if (info.is_consecutive) { + for (idx_t i = 0; i < info.count; i++) { + rows[i] = info.base_row + i; + } + } else { + auto delete_rows = info.GetRows(); + for (idx_t i = 0; i < info.count; i++) { + rows[i] = info.base_row + delete_rows[i]; + } } delete_chunk->SetCardinality(info.count); log->WriteDelete(*delete_chunk); @@ -310,7 +317,7 @@ void CommitState::CommitEntry(UndoFlags type, data_ptr_t data) { WriteDelete(*info); } // mark the tuples as committed - info->version_info->CommitDelete(info->vector_idx, commit_id, info->rows, info->count); + info->version_info->CommitDelete(info->vector_idx, commit_id, *info); break; } case UndoFlags::UPDATE_TUPLE: { @@ -351,7 +358,7 @@ void CommitState::RevertCommit(UndoFlags type, data_ptr_t data) { auto info = reinterpret_cast(data); info->table->info->cardinality += info->count; // revert the commit by writing the (uncommitted) transaction_id back into the version info - info->version_info->CommitDelete(info->vector_idx, transaction_id, info->rows, info->count); + info->version_info->CommitDelete(info->vector_idx, transaction_id, *info); break; } case UndoFlags::UPDATE_TUPLE: { diff --git a/src/duckdb/src/transaction/duck_transaction.cpp b/src/duckdb/src/transaction/duck_transaction.cpp index 528d718b..d2ce3657 100644 --- a/src/duckdb/src/transaction/duck_transaction.cpp +++ b/src/duckdb/src/transaction/duck_transaction.cpp @@ -73,14 +73,34 @@ void DuckTransaction::PushCatalogEntry(CatalogEntry &entry, data_ptr_t extra_dat void DuckTransaction::PushDelete(DataTable &table, RowVersionManager &info, idx_t vector_idx, row_t rows[], idx_t count, idx_t base_row) { - auto delete_info = reinterpret_cast( - undo_buffer.CreateEntry(UndoFlags::DELETE_TUPLE, sizeof(DeleteInfo) + sizeof(row_t) * count)); + bool is_consecutive = true; + // check if the rows are consecutive + for (idx_t i = 0; i < count; i++) { + if (rows[i] != row_t(i)) { + is_consecutive = false; + break; + } + } + idx_t alloc_size = sizeof(DeleteInfo); + if (!is_consecutive) { + // if rows are not consecutive we need to allocate row identifiers + alloc_size += sizeof(uint16_t) * count; + } + + auto delete_info = reinterpret_cast(undo_buffer.CreateEntry(UndoFlags::DELETE_TUPLE, alloc_size)); delete_info->version_info = &info; delete_info->vector_idx = vector_idx; delete_info->table = &table; delete_info->count = count; delete_info->base_row = base_row; - memcpy(delete_info->rows, rows, sizeof(row_t) * count); + delete_info->is_consecutive = is_consecutive; + if (!is_consecutive) { + // if rows are not consecutive + auto delete_rows = delete_info->GetRows(); + for (idx_t i = 0; i < count; i++) { + delete_rows[i] = NumericCast(rows[i]); + } + } } void DuckTransaction::PushAppend(DataTable &table, idx_t start_row, idx_t row_count) { diff --git a/src/duckdb/src/transaction/rollback_state.cpp b/src/duckdb/src/transaction/rollback_state.cpp index b30124c1..3210cffb 100644 --- a/src/duckdb/src/transaction/rollback_state.cpp +++ b/src/duckdb/src/transaction/rollback_state.cpp @@ -31,7 +31,7 @@ void RollbackState::RollbackEntry(UndoFlags type, data_ptr_t data) { case UndoFlags::DELETE_TUPLE: { auto info = reinterpret_cast(data); // reset the deleted flag on rollback - info->version_info->CommitDelete(info->vector_idx, NOT_DELETED_ID, info->rows, info->count); + info->version_info->CommitDelete(info->vector_idx, NOT_DELETED_ID, *info); break; } case UndoFlags::UPDATE_TUPLE: { diff --git a/src/duckdb/src/transaction/transaction_context.cpp b/src/duckdb/src/transaction/transaction_context.cpp index f2eaa9fe..7185a263 100644 --- a/src/duckdb/src/transaction/transaction_context.cpp +++ b/src/duckdb/src/transaction/transaction_context.cpp @@ -18,7 +18,7 @@ TransactionContext::~TransactionContext() { if (current_transaction) { try { Rollback(); - } catch (...) { + } catch (...) { // NOLINT } } } diff --git a/src/duckdb/src/transaction/undo_buffer.cpp b/src/duckdb/src/transaction/undo_buffer.cpp index 148bd3d0..2e94aa7f 100644 --- a/src/duckdb/src/transaction/undo_buffer.cpp +++ b/src/duckdb/src/transaction/undo_buffer.cpp @@ -142,7 +142,9 @@ void UndoBuffer::Cleanup() { // possibly vacuum indexes for (const auto &table : state.indexed_tables) { table.second->info->indexes.Scan([&](Index &index) { - index.Vacuum(); + if (!index.IsUnknown()) { + index.Vacuum(); + } return false; }); } diff --git a/src/duckdb/third_party/fmt/include/fmt/core.h b/src/duckdb/third_party/fmt/include/fmt/core.h index 70d899a1..fe95196b 100644 --- a/src/duckdb/third_party/fmt/include/fmt/core.h +++ b/src/duckdb/third_party/fmt/include/fmt/core.h @@ -353,12 +353,7 @@ template class basic_string_view { using string_view = basic_string_view; using wstring_view = basic_string_view; -// A UTF-8 code unit type. -#if FMT_HAS_FEATURE(__cpp_char8_t) -typedef char8_t fmt_char8_t; -#else typedef char fmt_char8_t; -#endif /** Specifies if ``T`` is a character type. Can be specialized by users. */ template struct is_char : std::false_type {}; diff --git a/src/duckdb/third_party/fsst/fsst.h b/src/duckdb/third_party/fsst/fsst.h index 6970dedc..ea80be6c 100644 --- a/src/duckdb/third_party/fsst/fsst.h +++ b/src/duckdb/third_party/fsst/fsst.h @@ -48,7 +48,7 @@ #ifndef FSST_INCLUDED_H #define FSST_INCLUDED_H -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) #define __restrict__ #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ #define __ORDER_LITTLE_ENDIAN__ 2 diff --git a/src/duckdb/third_party/fsst/libfsst.cpp b/src/duckdb/third_party/fsst/libfsst.cpp index 38f9a7eb..684471de 100644 --- a/src/duckdb/third_party/fsst/libfsst.cpp +++ b/src/duckdb/third_party/fsst/libfsst.cpp @@ -241,140 +241,6 @@ SymbolTable *buildSymbolTable(Counters& counters, vector line, size_t len[] return bestTable; } -static inline size_t compressSIMD(SymbolTable &symbolTable, u8* symbolBase, size_t nlines, size_t len[], u8* line[], size_t size, u8* dst, size_t lenOut[], u8* strOut[], int unroll) { - size_t curLine = 0, inOff = 0, outOff = 0, batchPos = 0, empty = 0, budget = size; - u8 *lim = dst + size, *codeBase = symbolBase + (1<<18); // 512KB temp space for compressing 512 strings - SIMDjob input[512]; // combined offsets of input strings (cur,end), and string #id (pos) and output (dst) pointer - SIMDjob output[512]; // output are (pos:9,dst:19) end pointers (compute compressed length from this) - size_t jobLine[512]; // for which line in the input sequence was this job (needed because we may split a line into multiple jobs) - - while (curLine < nlines && outOff <= (1<<19)) { - size_t prevLine = curLine, chunk, curOff = 0; - - // bail out if the output buffer cannot hold the compressed next string fully - if (((len[curLine]-curOff)*2 + 7) > budget) break; // see below for the +7 - else budget -= (len[curLine]-curOff)*2; - - strOut[curLine] = (u8*) 0; - lenOut[curLine] = 0; - - do { - do { - chunk = len[curLine] - curOff; - if (chunk > 511) { - chunk = 511; // large strings need to be chopped up into segments of 511 bytes - } - // create a job in this batch - SIMDjob job; - job.cur = inOff; - job.end = job.cur + chunk; - job.pos = batchPos; - job.out = outOff; - - // worst case estimate for compressed size (+7 is for the scatter that writes extra 7 zeros) - outOff += 7 + 2*(size_t)(job.end - job.cur); // note, total size needed is 512*(511*2+7) bytes. - if (outOff > (1<<19)) break; // simdbuf may get full, stop before this chunk - - // register job in this batch - input[batchPos] = job; - jobLine[batchPos] = curLine; - - if (chunk == 0) { - empty++; // detect empty chunks -- SIMD code cannot handle empty strings, so they need to be filtered out - } else { - // copy string chunk into temp buffer - memcpy(symbolBase + inOff, line[curLine] + curOff, chunk); - inOff += chunk; - curOff += chunk; - symbolBase[inOff++] = (u8) symbolTable.terminator; // write an extra char at the end that will not be encoded - } - if (++batchPos == 512) break; - } while(curOff < len[curLine]); - - if ((batchPos == 512) || (outOff > (1<<19)) || (++curLine >= nlines)) { // cannot accumulate more? - if (batchPos-empty >= 32) { // if we have enough work, fire off fsst_compressAVX512 (32 is due to max 4x8 unrolling) - // radix-sort jobs on length (longest string first) - // -- this provides best load balancing and allows to skip empty jobs at the end - u16 sortpos[513]; - memset(sortpos, 0, sizeof(sortpos)); - - // calculate length histo - for(size_t i=0; i> (u8) s.icl); - if ((s.icl < FSST_ICL_FREE) && s.val.num == word) { - *out++ = (u8) s.code(); cur += s.length(); - } else { - // could be a 2-byte or 1-byte code, or miss - // handle everything with predication - *out = (u8) code; - out += 1+((code&FSST_CODE_BASE)>>8); - cur += (code>>FSST_LEN_BITS); - } - } - job.out = out - codeBase; - } - // postprocess job info - job.cur = 0; - job.end = job.out - input[job.pos].out; // misuse .end field as compressed size - job.out = input[job.pos].out; // reset offset to start of encoded string - input[job.pos] = job; - } - - // copy out the result data - for(size_t i=0; isymbolTable, e->simdbuf, nlines, lenIn, strIn, size, output, lenOut, strOut, simd); -#endif - (void) simd; +inline size_t _compressImpl(Encoder *e, size_t nlines, size_t lenIn[], u8 *strIn[], size_t size, u8 *output, size_t *lenOut, u8 *strOut[], bool noSuffixOpt, bool avoidBranch, int) { return compressBulk(*e->symbolTable, nlines, lenIn, strIn, size, output, lenOut, strOut, noSuffixOpt, avoidBranch); } size_t compressImpl(Encoder *e, size_t nlines, size_t lenIn[], u8 *strIn[], size_t size, u8 *output, size_t *lenOut, u8 *strOut[], bool noSuffixOpt, bool avoidBranch, int simd) { diff --git a/src/duckdb/third_party/fsst/libfsst.hpp b/src/duckdb/third_party/fsst/libfsst.hpp index a0e42565..ae4a6ceb 100644 --- a/src/duckdb/third_party/fsst/libfsst.hpp +++ b/src/duckdb/third_party/fsst/libfsst.hpp @@ -432,19 +432,6 @@ struct SIMDjob { u64 out:19,pos:9,end:18,cur:18; // cur/end is input offsets (2^18=256KB), out is output offset (2^19=512KB) }; -extern bool -duckdb_fsst_hasAVX512(); // runtime check for avx512 capability - -extern size_t -duckdb_fsst_compressAVX512( - SymbolTable &symbolTable, - u8* codeBase, // IN: base address for codes, i.e. compression output (points to simdbuf+256KB) - u8* symbolBase, // IN: base address for string bytes, i.e. compression input (points to simdbuf) - SIMDjob* input, // IN: input array (size n) with job information: what to encode, where to store it. - SIMDjob* output, // OUT: output array (size n) with job information: how much got encoded, end output pointer. - size_t n, // IN: size of arrays input and output (should be max 512) - size_t unroll); // IN: degree of SIMD unrolling - // C++ fsst-compress function with some more control of how the compression happens (algorithm flavor, simd unroll degree) size_t compressImpl(Encoder *encoder, size_t n, size_t lenIn[], u8 *strIn[], size_t size, u8 * output, size_t *lenOut, u8 *strOut[], bool noSuffixOpt, bool avoidBranch, int simd); size_t compressAuto(Encoder *encoder, size_t n, size_t lenIn[], u8 *strIn[], size_t size, u8 * output, size_t *lenOut, u8 *strOut[], int simd); diff --git a/src/duckdb/third_party/hyperloglog/hyperloglog.hpp b/src/duckdb/third_party/hyperloglog/hyperloglog.hpp index 72ae1a17..461ecc53 100644 --- a/src/duckdb/third_party/hyperloglog/hyperloglog.hpp +++ b/src/duckdb/third_party/hyperloglog/hyperloglog.hpp @@ -13,6 +13,8 @@ namespace duckdb_hll { +// NOLINTBEGIN + /* Error codes */ #define HLL_C_OK 0 #define HLL_C_ERR -1 @@ -40,6 +42,8 @@ uint64_t get_size(); uint64_t MurmurHash64A(const void *key, int len, unsigned int seed); +// NOLINTEND + } // namespace duckdb_hll namespace duckdb { diff --git a/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp b/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp index cb1dc7a4..1a96c321 100644 --- a/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +++ b/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp @@ -51,6 +51,13 @@ typedef enum PGSortByDir { SORTBY_USING /* not allowed in CREATE INDEX ... */ } PGSortByDir; +/* PGFuncCall options RESPECT/IGNORE NULLS */ +typedef enum PGIgnoreNulls { + PG_DEFAULT_NULLS, + PG_RESPECT_NULLS, + PG_IGNORE_NULLS +} PGIgnoreNulls; + typedef enum PGSortByNulls { PG_SORTBY_NULLS_DEFAULT, PG_SORTBY_NULLS_FIRST, PG_SORTBY_NULLS_LAST } PGSortByNulls; /***************************************************************************** @@ -292,7 +299,7 @@ typedef struct PGFuncCall { bool agg_within_group; /* ORDER BY appeared in WITHIN GROUP */ bool agg_star; /* argument was really '*' */ bool agg_distinct; /* arguments were labeled DISTINCT */ - bool agg_ignore_nulls; /* arguments were labeled IGNORE NULLS */ + PGIgnoreNulls agg_ignore_nulls; /* arguments were labeled IGNORE NULLS */ bool func_variadic; /* last argument was labeled VARIADIC */ struct PGWindowDef *over; /* OVER clause, if any */ int location; /* token location, or -1 if unknown */ diff --git a/src/duckdb/third_party/libpg_query/include/parser/gram.hpp b/src/duckdb/third_party/libpg_query/include/parser/gram.hpp index 35b5c45e..c6485a96 100644 --- a/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +++ b/src/duckdb/third_party/libpg_query/include/parser/gram.hpp @@ -1089,6 +1089,7 @@ typedef union YYSTYPE PGOverridingKind override; PGSortByDir sortorder; PGSortByNulls nullorder; + PGIgnoreNulls ignorenulls; PGConstrType constr; PGLockClauseStrength lockstrength; PGLockWaitPolicy lockwaitpolicy; @@ -1097,7 +1098,7 @@ typedef union YYSTYPE PGInsertColumnOrder bynameorposition; } /* Line 1529 of yacc.c. */ -#line 1101 "third_party/libpg_query/grammar/grammar_out.hpp" +#line 1102 "third_party/libpg_query/grammar/grammar_out.hpp" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 diff --git a/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp b/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp index bf569d2b..f8b6577f 100644 --- a/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +++ b/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp @@ -1309,6 +1309,7 @@ typedef union YYSTYPE PGOverridingKind override; PGSortByDir sortorder; PGSortByNulls nullorder; + PGIgnoreNulls ignorenulls; PGConstrType constr; PGLockClauseStrength lockstrength; PGLockWaitPolicy lockwaitpolicy; @@ -1317,7 +1318,7 @@ typedef union YYSTYPE PGInsertColumnOrder bynameorposition; } /* Line 193 of yacc.c. */ -#line 1321 "third_party/libpg_query/grammar/grammar_out.cpp" +#line 1322 "third_party/libpg_query/grammar/grammar_out.cpp" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 @@ -1342,7 +1343,7 @@ typedef struct YYLTYPE /* Line 216 of yacc.c. */ -#line 1346 "third_party/libpg_query/grammar/grammar_out.cpp" +#line 1347 "third_party/libpg_query/grammar/grammar_out.cpp" #ifdef short # undef short @@ -1559,16 +1560,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 867 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 72581 +#define YYLAST 72739 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 525 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 459 +#define YYNNTS 460 /* YYNRULES -- Number of rules. */ -#define YYNRULES 2118 +#define YYNRULES 2120 /* YYNRULES -- Number of states. */ -#define YYNSTATES 3526 +#define YYNSTATES 3529 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 @@ -1710,110 +1711,110 @@ static const yytype_uint16 yyprhs[] = 1539, 1541, 1543, 1552, 1564, 1575, 1583, 1594, 1604, 1606, 1608, 1611, 1615, 1624, 1636, 1646, 1654, 1655, 1659, 1663, 1665, 1667, 1671, 1672, 1674, 1678, 1680, 1681, 1683, 1684, - 1686, 1687, 1689, 1693, 1695, 1697, 1699, 1703, 1705, 1706, - 1709, 1712, 1713, 1716, 1717, 1719, 1720, 1722, 1724, 1726, - 1730, 1734, 1736, 1738, 1742, 1746, 1750, 1754, 1758, 1762, - 1767, 1771, 1774, 1776, 1778, 1780, 1782, 1786, 1788, 1790, - 1794, 1796, 1798, 1802, 1806, 1810, 1812, 1815, 1820, 1825, - 1828, 1832, 1838, 1844, 1846, 1848, 1852, 1853, 1865, 1877, - 1888, 1901, 1903, 1906, 1912, 1917, 1922, 1927, 1932, 1940, - 1946, 1951, 1959, 1966, 1976, 1986, 1991, 1993, 1995, 1997, - 1999, 2001, 2003, 2005, 2011, 2013, 2015, 2019, 2021, 2024, - 2027, 2030, 2034, 2036, 2040, 2048, 2050, 2053, 2054, 2057, - 2058, 2062, 2066, 2071, 2076, 2081, 2086, 2090, 2093, 2095, - 2097, 2098, 2100, 2102, 2103, 2106, 2108, 2114, 2116, 2117, - 2120, 2123, 2124, 2126, 2127, 2131, 2137, 2139, 2143, 2148, - 2152, 2154, 2156, 2157, 2160, 2163, 2164, 2167, 2170, 2172, - 2174, 2176, 2177, 2180, 2185, 2191, 2196, 2199, 2203, 2206, - 2209, 2212, 2215, 2217, 2220, 2224, 2225, 2227, 2228, 2234, - 2236, 2241, 2248, 2251, 2253, 2254, 2259, 2260, 2262, 2264, - 2267, 2270, 2273, 2275, 2277, 2280, 2283, 2285, 2287, 2289, - 2291, 2293, 2295, 2299, 2303, 2304, 2306, 2310, 2312, 2315, - 2317, 2319, 2321, 2323, 2325, 2328, 2333, 2338, 2344, 2346, - 2348, 2351, 2352, 2355, 2356, 2358, 2362, 2364, 2365, 2367, - 2370, 2374, 2377, 2382, 2385, 2389, 2392, 2393, 2395, 2398, - 2399, 2404, 2410, 2412, 2415, 2418, 2419, 2421, 2425, 2427, - 2430, 2434, 2438, 2442, 2446, 2450, 2454, 2456, 2461, 2471, - 2481, 2485, 2486, 2489, 2492, 2493, 2499, 2503, 2504, 2506, - 2508, 2512, 2518, 2522, 2524, 2527, 2529, 2533, 2539, 2541, - 2544, 2548, 2553, 2559, 2564, 2570, 2575, 2582, 2588, 2593, - 2599, 2605, 2611, 2614, 2619, 2621, 2623, 2624, 2626, 2631, - 2637, 2642, 2643, 2646, 2649, 2652, 2654, 2656, 2658, 2660, - 2661, 2666, 2669, 2671, 2674, 2677, 2682, 2685, 2692, 2695, - 2697, 2701, 2706, 2707, 2710, 2711, 2714, 2715, 2717, 2721, - 2725, 2728, 2729, 2732, 2737, 2739, 2741, 2743, 2744, 2747, - 2751, 2757, 2764, 2767, 2771, 2773, 2779, 2785, 2791, 2795, - 2799, 2803, 2808, 2809, 2811, 2813, 2815, 2817, 2819, 2822, - 2827, 2829, 2831, 2833, 2835, 2838, 2842, 2843, 2845, 2847, - 2849, 2851, 2853, 2856, 2859, 2862, 2865, 2868, 2870, 2874, - 2875, 2877, 2879, 2881, 2883, 2889, 2892, 2894, 2896, 2898, - 2900, 2905, 2907, 2910, 2913, 2915, 2919, 2923, 2926, 2928, - 2929, 2935, 2938, 2944, 2947, 2949, 2953, 2957, 2958, 2960, + 1686, 1687, 1689, 1693, 1695, 1697, 1699, 1701, 1705, 1707, + 1708, 1711, 1714, 1715, 1718, 1719, 1721, 1722, 1724, 1726, + 1728, 1732, 1736, 1738, 1740, 1744, 1748, 1752, 1756, 1760, + 1764, 1769, 1773, 1776, 1778, 1780, 1782, 1784, 1788, 1790, + 1792, 1796, 1798, 1800, 1804, 1808, 1812, 1814, 1817, 1822, + 1827, 1830, 1834, 1840, 1846, 1848, 1850, 1854, 1855, 1867, + 1879, 1890, 1903, 1905, 1908, 1914, 1919, 1924, 1929, 1934, + 1942, 1948, 1953, 1961, 1968, 1978, 1988, 1993, 1995, 1997, + 1999, 2001, 2003, 2005, 2007, 2013, 2015, 2017, 2021, 2023, + 2026, 2029, 2032, 2036, 2038, 2042, 2050, 2052, 2055, 2056, + 2059, 2060, 2064, 2068, 2073, 2078, 2083, 2088, 2092, 2095, + 2097, 2099, 2100, 2102, 2104, 2105, 2108, 2110, 2116, 2118, + 2119, 2122, 2125, 2126, 2128, 2129, 2133, 2139, 2141, 2145, + 2150, 2154, 2156, 2158, 2159, 2162, 2165, 2166, 2169, 2172, + 2174, 2176, 2178, 2179, 2182, 2187, 2193, 2198, 2201, 2205, + 2208, 2211, 2214, 2217, 2219, 2222, 2226, 2227, 2229, 2230, + 2236, 2238, 2243, 2250, 2253, 2255, 2256, 2261, 2262, 2264, + 2266, 2269, 2272, 2275, 2277, 2279, 2282, 2285, 2287, 2289, + 2291, 2293, 2295, 2297, 2301, 2305, 2306, 2308, 2312, 2314, + 2317, 2319, 2321, 2323, 2325, 2327, 2330, 2335, 2340, 2346, + 2348, 2350, 2353, 2354, 2357, 2358, 2360, 2364, 2366, 2367, + 2369, 2372, 2376, 2379, 2384, 2387, 2391, 2394, 2395, 2397, + 2400, 2401, 2406, 2412, 2414, 2417, 2420, 2421, 2423, 2427, + 2429, 2432, 2436, 2440, 2444, 2448, 2452, 2456, 2458, 2463, + 2473, 2483, 2487, 2488, 2491, 2494, 2495, 2501, 2505, 2506, + 2508, 2510, 2514, 2520, 2524, 2526, 2529, 2531, 2535, 2541, + 2543, 2546, 2550, 2555, 2561, 2566, 2572, 2577, 2584, 2590, + 2595, 2601, 2607, 2613, 2616, 2621, 2623, 2625, 2626, 2628, + 2633, 2639, 2644, 2645, 2648, 2651, 2654, 2656, 2658, 2660, + 2662, 2663, 2668, 2671, 2673, 2676, 2679, 2684, 2687, 2694, + 2697, 2699, 2703, 2708, 2709, 2712, 2713, 2716, 2717, 2719, + 2723, 2727, 2730, 2731, 2734, 2739, 2741, 2743, 2745, 2746, + 2749, 2753, 2759, 2766, 2769, 2773, 2775, 2781, 2787, 2793, + 2797, 2801, 2805, 2810, 2811, 2813, 2815, 2817, 2819, 2821, + 2824, 2829, 2831, 2833, 2835, 2837, 2840, 2844, 2845, 2847, + 2849, 2851, 2853, 2855, 2858, 2861, 2864, 2867, 2870, 2872, + 2876, 2877, 2879, 2881, 2883, 2885, 2891, 2894, 2896, 2898, + 2900, 2902, 2907, 2909, 2912, 2915, 2917, 2921, 2925, 2928, + 2930, 2931, 2937, 2940, 2946, 2949, 2951, 2955, 2959, 2960, 2962, 2964, 2966, 2968, 2970, 2972, 2974, 2976, 2978, 2980, 2982, 2984, 2986, 2988, 2990, 2992, 2994, 2996, 2998, 3000, 3002, 3004, 3006, 3008, 3010, 3012, 3014, 3016, 3018, 3020, - 3022, 3024, 3026, 3028, 3030, 3034, 3038, 3042, 3046, 3050, - 3054, 3058, 3059, 3061, 3065, 3069, 3075, 3078, 3081, 3085, - 3089, 3093, 3097, 3101, 3105, 3109, 3113, 3117, 3121, 3125, - 3129, 3133, 3137, 3141, 3144, 3147, 3151, 3155, 3158, 3161, - 3165, 3169, 3175, 3180, 3187, 3191, 3197, 3202, 3209, 3214, - 3221, 3227, 3235, 3239, 3242, 3247, 3251, 3254, 3258, 3262, - 3266, 3270, 3275, 3279, 3284, 3288, 3293, 3299, 3306, 3313, - 3321, 3328, 3336, 3343, 3351, 3355, 3360, 3365, 3372, 3374, - 3379, 3383, 3389, 3391, 3395, 3398, 3401, 3405, 3409, 3413, - 3417, 3421, 3425, 3429, 3433, 3437, 3441, 3445, 3449, 3453, - 3457, 3461, 3464, 3467, 3473, 3480, 3487, 3495, 3497, 3500, - 3502, 3504, 3506, 3509, 3512, 3517, 3521, 3523, 3525, 3527, - 3529, 3531, 3536, 3538, 3540, 3544, 3546, 3549, 3554, 3557, - 3560, 3564, 3568, 3575, 3583, 3593, 3601, 3609, 3615, 3617, - 3619, 3621, 3627, 3634, 3641, 3646, 3651, 3656, 3661, 3668, - 3674, 3680, 3686, 3691, 3698, 3703, 3711, 3721, 3727, 3728, - 3734, 3739, 3740, 3742, 3743, 3746, 3747, 3749, 3753, 3757, - 3760, 3763, 3764, 3771, 3773, 3774, 3778, 3779, 3783, 3787, - 3791, 3792, 3794, 3799, 3802, 3805, 3808, 3811, 3814, 3818, - 3821, 3824, 3828, 3829, 3834, 3838, 3840, 3846, 3850, 3852, - 3856, 3858, 3861, 3865, 3867, 3871, 3873, 3876, 3878, 3879, - 3881, 3883, 3885, 3887, 3889, 3891, 3893, 3895, 3897, 3899, + 3022, 3024, 3026, 3028, 3030, 3032, 3036, 3040, 3044, 3048, + 3052, 3056, 3060, 3061, 3063, 3067, 3071, 3077, 3080, 3083, + 3087, 3091, 3095, 3099, 3103, 3107, 3111, 3115, 3119, 3123, + 3127, 3131, 3135, 3139, 3143, 3146, 3149, 3153, 3157, 3160, + 3163, 3167, 3171, 3177, 3182, 3189, 3193, 3199, 3204, 3211, + 3216, 3223, 3229, 3237, 3241, 3244, 3249, 3253, 3256, 3260, + 3264, 3268, 3272, 3277, 3281, 3286, 3290, 3295, 3301, 3308, + 3315, 3323, 3330, 3338, 3345, 3353, 3357, 3362, 3367, 3374, + 3376, 3381, 3385, 3391, 3393, 3397, 3400, 3403, 3407, 3411, + 3415, 3419, 3423, 3427, 3431, 3435, 3439, 3443, 3447, 3451, + 3455, 3459, 3463, 3466, 3469, 3475, 3482, 3489, 3497, 3499, + 3502, 3504, 3506, 3508, 3511, 3514, 3519, 3523, 3525, 3527, + 3529, 3531, 3533, 3538, 3540, 3542, 3544, 3546, 3549, 3554, + 3557, 3560, 3564, 3568, 3572, 3579, 3587, 3597, 3605, 3613, + 3619, 3621, 3623, 3625, 3631, 3638, 3645, 3650, 3655, 3660, + 3665, 3672, 3678, 3684, 3690, 3695, 3702, 3707, 3715, 3725, + 3731, 3732, 3738, 3743, 3744, 3746, 3747, 3750, 3751, 3753, + 3757, 3761, 3764, 3767, 3768, 3775, 3777, 3778, 3782, 3783, + 3787, 3791, 3795, 3796, 3798, 3803, 3806, 3809, 3812, 3815, + 3818, 3822, 3825, 3828, 3832, 3833, 3838, 3842, 3844, 3850, + 3854, 3856, 3860, 3862, 3865, 3869, 3871, 3875, 3877, 3880, + 3882, 3883, 3885, 3887, 3889, 3891, 3893, 3895, 3897, 3899, 3901, 3903, 3905, 3907, 3909, 3911, 3913, 3915, 3917, 3919, - 3924, 3926, 3931, 3933, 3938, 3940, 3943, 3945, 3948, 3950, - 3953, 3955, 3959, 3961, 3965, 3967, 3970, 3972, 3976, 3978, - 3981, 3983, 3984, 3986, 3990, 3992, 3996, 4000, 4002, 4006, - 4010, 4011, 4013, 4015, 4017, 4019, 4021, 4023, 4025, 4027, - 4029, 4031, 4033, 4035, 4037, 4039, 4044, 4048, 4051, 4055, - 4056, 4060, 4064, 4067, 4070, 4072, 4073, 4076, 4079, 4083, - 4086, 4088, 4090, 4094, 4100, 4102, 4105, 4110, 4113, 4114, - 4116, 4117, 4119, 4122, 4126, 4132, 4140, 4148, 4150, 4151, - 4152, 4155, 4156, 4159, 4163, 4167, 4171, 4177, 4185, 4193, - 4194, 4197, 4199, 4200, 4202, 4203, 4205, 4209, 4211, 4214, - 4218, 4221, 4223, 4228, 4231, 4233, 4234, 4238, 4240, 4244, - 4246, 4249, 4254, 4257, 4258, 4260, 4264, 4266, 4270, 4272, - 4275, 4277, 4281, 4283, 4285, 4288, 4290, 4292, 4295, 4297, - 4299, 4302, 4310, 4313, 4319, 4323, 4327, 4329, 4331, 4333, + 3921, 3923, 3928, 3930, 3935, 3937, 3942, 3944, 3947, 3949, + 3952, 3954, 3957, 3959, 3963, 3965, 3969, 3971, 3974, 3976, + 3980, 3982, 3985, 3987, 3988, 3990, 3994, 3996, 4000, 4004, + 4006, 4010, 4014, 4015, 4017, 4019, 4021, 4023, 4025, 4027, + 4029, 4031, 4033, 4035, 4037, 4039, 4041, 4043, 4048, 4052, + 4055, 4059, 4060, 4064, 4068, 4071, 4074, 4076, 4077, 4080, + 4083, 4087, 4090, 4092, 4094, 4098, 4104, 4106, 4109, 4114, + 4117, 4118, 4120, 4121, 4123, 4126, 4130, 4136, 4144, 4152, + 4154, 4155, 4156, 4159, 4160, 4163, 4167, 4171, 4175, 4181, + 4189, 4197, 4198, 4201, 4203, 4204, 4206, 4207, 4209, 4213, + 4215, 4218, 4222, 4225, 4227, 4232, 4235, 4237, 4238, 4242, + 4244, 4248, 4250, 4253, 4258, 4261, 4262, 4264, 4268, 4270, + 4274, 4276, 4279, 4281, 4285, 4287, 4289, 4292, 4294, 4296, + 4299, 4301, 4303, 4306, 4314, 4317, 4323, 4327, 4331, 4333, 4335, 4337, 4339, 4341, 4343, 4345, 4347, 4349, 4351, 4353, - 4355, 4358, 4361, 4365, 4369, 4370, 4372, 4374, 4376, 4382, - 4386, 4387, 4389, 4391, 4393, 4395, 4397, 4399, 4404, 4412, - 4419, 4422, 4423, 4425, 4427, 4429, 4431, 4445, 4462, 4464, - 4467, 4468, 4470, 4471, 4473, 4474, 4477, 4478, 4480, 4481, - 4488, 4497, 4504, 4513, 4520, 4529, 4533, 4536, 4538, 4539, - 4546, 4553, 4555, 4557, 4559, 4561, 4563, 4565, 4568, 4570, - 4572, 4574, 4576, 4578, 4583, 4590, 4594, 4597, 4602, 4606, - 4612, 4614, 4615, 4617, 4619, 4620, 4622, 4624, 4626, 4628, + 4355, 4357, 4359, 4362, 4365, 4369, 4373, 4374, 4376, 4378, + 4380, 4386, 4390, 4391, 4393, 4395, 4397, 4399, 4401, 4403, + 4408, 4416, 4423, 4426, 4427, 4429, 4431, 4433, 4435, 4449, + 4466, 4468, 4471, 4472, 4474, 4475, 4477, 4478, 4481, 4482, + 4484, 4485, 4492, 4501, 4508, 4517, 4524, 4533, 4537, 4540, + 4542, 4543, 4550, 4557, 4559, 4561, 4563, 4565, 4567, 4569, + 4572, 4574, 4576, 4578, 4580, 4582, 4587, 4594, 4598, 4601, + 4606, 4610, 4616, 4618, 4619, 4621, 4623, 4624, 4626, 4628, 4630, 4632, 4634, 4636, 4638, 4640, 4642, 4644, 4646, 4648, 4650, 4652, 4654, 4656, 4658, 4660, 4662, 4664, 4666, 4668, 4670, 4672, 4674, 4676, 4678, 4680, 4682, 4684, 4686, 4688, - 4690, 4692, 4696, 4698, 4700, 4702, 4704, 4706, 4708, 4711, - 4713, 4715, 4718, 4722, 4726, 4730, 4732, 4736, 4740, 4743, - 4747, 4751, 4753, 4755, 4757, 4761, 4767, 4769, 4771, 4773, - 4775, 4779, 4782, 4785, 4789, 4794, 4800, 4802, 4804, 4806, - 4808, 4813, 4820, 4826, 4831, 4838, 4840, 4842, 4844, 4846, - 4848, 4850, 4851, 4853, 4857, 4859, 4860, 4868, 4872, 4874, - 4877, 4881, 4884, 4885, 4888, 4889, 4892, 4897, 4903, 4912, - 4915, 4919, 4925, 4927, 4928, 4931, 4932, 4935, 4939, 4943, - 4947, 4949, 4951, 4953, 4956, 4960, 4963, 4966, 4969, 4972, - 4976, 4981, 4985, 4987, 4989, 4991, 4993, 4995, 4997, 4998, - 5000, 5004, 5006, 5010, 5013, 5023, 5036, 5048, 5061, 5076, - 5080, 5085, 5090, 5091, 5099, 5110, 5120, 5123, 5127, 5128, - 5133, 5135, 5137, 5139, 5141, 5143, 5145, 5147, 5149, 5151, + 4690, 4692, 4694, 4696, 4700, 4702, 4704, 4706, 4708, 4710, + 4712, 4715, 4717, 4719, 4722, 4726, 4730, 4734, 4736, 4740, + 4744, 4747, 4751, 4755, 4757, 4759, 4761, 4765, 4771, 4773, + 4775, 4777, 4779, 4783, 4786, 4789, 4793, 4798, 4804, 4806, + 4808, 4810, 4812, 4817, 4824, 4830, 4835, 4842, 4844, 4846, + 4848, 4850, 4852, 4854, 4855, 4857, 4861, 4863, 4864, 4872, + 4876, 4878, 4881, 4885, 4888, 4889, 4892, 4893, 4896, 4901, + 4907, 4916, 4919, 4923, 4929, 4931, 4932, 4935, 4936, 4939, + 4943, 4947, 4951, 4953, 4955, 4957, 4960, 4964, 4967, 4970, + 4973, 4976, 4980, 4985, 4989, 4991, 4993, 4995, 4997, 4999, + 5001, 5002, 5004, 5008, 5010, 5014, 5017, 5027, 5040, 5052, + 5065, 5080, 5084, 5089, 5094, 5095, 5103, 5114, 5124, 5127, + 5131, 5132, 5137, 5139, 5141, 5143, 5145, 5147, 5149, 5151, 5153, 5155, 5157, 5159, 5161, 5163, 5165, 5167, 5169, 5171, 5173, 5175, 5177, 5179, 5181, 5183, 5185, 5187, 5189, 5191, 5193, 5195, 5197, 5199, 5201, 5203, 5205, 5207, 5209, 5211, @@ -1874,21 +1875,22 @@ static const yytype_uint16 yyprhs[] = 6293, 6295, 6297, 6299, 6301, 6303, 6305, 6307, 6309, 6311, 6313, 6315, 6317, 6319, 6321, 6323, 6325, 6327, 6329, 6331, 6333, 6335, 6337, 6339, 6341, 6343, 6345, 6347, 6349, 6351, - 6353, 6355, 6357, 6359, 6361, 6363, 6365, 6367, 6369 + 6353, 6355, 6357, 6359, 6361, 6363, 6365, 6367, 6369, 6371, + 6373 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { 526, 0, -1, 527, -1, 527, 517, 528, -1, 528, - -1, 920, -1, 586, -1, 529, -1, 957, -1, 958, - -1, 971, -1, 921, -1, 923, -1, 656, -1, 974, - -1, 652, -1, 910, -1, 578, -1, 576, -1, 598, - -1, 572, -1, 540, -1, 953, -1, 959, -1, 593, - -1, 646, -1, 582, -1, 928, -1, 926, -1, 927, - -1, 913, -1, 551, -1, 945, -1, 575, -1, 907, + -1, 921, -1, 586, -1, 529, -1, 958, -1, 959, + -1, 972, -1, 922, -1, 924, -1, 656, -1, 975, + -1, 652, -1, 911, -1, 578, -1, 576, -1, 598, + -1, 572, -1, 540, -1, 954, -1, 960, -1, 593, + -1, 646, -1, 582, -1, 929, -1, 927, -1, 928, + -1, 914, -1, 551, -1, 946, -1, 575, -1, 908, -1, 549, -1, 674, -1, 595, -1, 655, -1, 597, - -1, 948, -1, 962, -1, 939, -1, 965, -1, 972, + -1, 949, -1, 963, -1, 940, -1, 966, -1, 973, -1, -1, 32, 416, 761, 537, -1, 32, 416, 191, 152, 761, 537, -1, 32, 202, 541, 537, -1, 32, 202, 191, 152, 541, 537, -1, 32, 381, 541, 537, @@ -1909,50 +1911,50 @@ static const yytype_int16 yyrhs[] = 137, 190, 191, 152, -1, 137, 550, 191, 152, 542, 650, -1, 137, 550, 542, 650, -1, 32, 550, 542, 539, 439, 774, 770, 535, -1, 32, 550, 542, 538, - -1, 26, 615, -1, 32, 93, 895, 599, -1, 457, - 93, 895, -1, 137, 93, 191, 152, 895, 650, -1, - 137, 93, 895, 650, -1, 386, 244, -1, 386, 448, + -1, 26, 615, -1, 32, 93, 896, 599, -1, 457, + 93, 896, -1, 137, 93, 191, 152, 896, 650, -1, + 137, 93, 896, 650, -1, 386, 244, -1, 386, 448, -1, 386, 613, -1, 354, 613, -1, 538, -1, 454, 809, -1, -1, 609, -1, 386, 609, -1, 26, 609, -1, 137, 623, -1, 534, -1, 537, 518, 534, -1, 293, 514, 533, 515, -1, 386, 107, -1, 386, -1, - -1, 111, 895, -1, 111, 325, 895, -1, 111, 30, + -1, 111, 896, -1, 111, 325, 896, -1, 111, 30, -1, 111, 325, 30, -1, 543, -1, 542, 545, -1, - 3, -1, 977, -1, 978, -1, 542, -1, 5, -1, + 3, -1, 978, -1, 979, -1, 542, -1, 5, -1, 5, -1, 546, -1, 545, 546, -1, 516, 547, -1, - 548, -1, 3, -1, 981, -1, 977, -1, 983, -1, - 32, 370, 895, 350, 428, 895, -1, 32, 416, 761, - 350, 428, 895, -1, 32, 416, 191, 152, 761, 350, - 428, 895, -1, 32, 381, 541, 350, 428, 895, -1, - 32, 381, 191, 152, 541, 350, 428, 895, -1, 32, - 466, 541, 350, 428, 895, -1, 32, 466, 191, 152, - 541, 350, 428, 895, -1, 32, 202, 541, 350, 428, - 895, -1, 32, 202, 191, 152, 541, 350, 428, 895, - -1, 32, 416, 761, 350, 550, 895, 428, 895, -1, - 32, 416, 191, 152, 761, 350, 550, 895, 428, 895, - -1, 32, 416, 761, 350, 93, 895, 428, 895, -1, - 32, 416, 191, 152, 761, 350, 93, 895, 428, 895, + 548, -1, 3, -1, 982, -1, 978, -1, 984, -1, + 32, 370, 896, 350, 428, 896, -1, 32, 416, 761, + 350, 428, 896, -1, 32, 416, 191, 152, 761, 350, + 428, 896, -1, 32, 381, 541, 350, 428, 896, -1, + 32, 381, 191, 152, 541, 350, 428, 896, -1, 32, + 466, 541, 350, 428, 896, -1, 32, 466, 191, 152, + 541, 350, 428, 896, -1, 32, 202, 541, 350, 428, + 896, -1, 32, 202, 191, 152, 541, 350, 428, 896, + -1, 32, 416, 761, 350, 550, 896, 428, 896, -1, + 32, 416, 191, 152, 761, 350, 550, 896, 428, 896, + -1, 32, 416, 761, 350, 93, 896, 428, 896, -1, + 32, 416, 191, 152, 761, 350, 93, 896, 428, 896, -1, 82, -1, -1, 556, 212, 559, 219, 553, 554, 552, 560, 562, -1, 674, -1, 303, 563, 459, 674, -1, 514, 567, 515, 674, -1, 514, 567, 515, 303, 563, 459, 674, -1, 117, 460, -1, 541, -1, 541, 40, 542, -1, 59, 265, -1, 59, 320, -1, -1, - 514, 570, 515, 767, -1, 289, 93, 895, -1, -1, - 686, -1, -1, 542, 876, -1, 571, 503, 809, -1, + 514, 570, 515, 767, -1, 289, 93, 896, -1, -1, + 686, -1, -1, 542, 877, -1, 571, 503, 809, -1, 514, 564, 515, 503, 809, -1, 294, 352, -1, 294, 192, -1, -1, 289, 91, 555, 133, 451, 386, 569, 767, -1, 289, 91, 555, 133, 275, -1, -1, 542, - 565, 566, 702, 703, -1, 818, 565, 566, 702, 703, + 565, 566, 702, 703, -1, 819, 565, 566, 702, 703, -1, 514, 809, 515, 565, 566, 702, 703, -1, 358, - 882, -1, -1, 453, -1, 415, -1, 571, -1, 564, - 518, 571, -1, 80, 902, -1, -1, 902, -1, -1, + 883, -1, -1, 453, -1, 415, -1, 571, -1, 564, + 518, 571, -1, 80, 903, -1, -1, 903, -1, -1, 557, -1, 567, 518, 557, -1, 558, -1, 568, 518, 558, -1, 568, -1, 568, 518, -1, 561, -1, 570, - 518, 561, -1, 542, 876, -1, 100, 439, 541, 40, + 518, 561, -1, 542, 877, -1, 100, 439, 541, 40, 144, 675, -1, 100, 439, 541, 40, 144, 514, 573, 515, -1, 100, 439, 541, 40, 774, -1, 574, -1, -1, 544, -1, 574, 518, 544, -1, 322, 542, -1, - 322, 542, 503, 944, -1, 322, 542, 514, 856, 515, + 322, 542, 503, 945, -1, 322, 542, 514, 857, 515, -1, 100, 644, 381, 541, 577, -1, 100, 644, 381, 191, 274, 152, 541, 577, -1, 100, 294, 352, 644, 381, 541, 577, -1, 587, -1, -1, 100, 580, 377, @@ -1960,20 +1962,20 @@ static const yytype_int16 yyrhs[] = 274, 152, 579, 581, 514, 673, 515, -1, 100, 294, 352, 580, 377, 579, 581, 514, 673, 515, -1, -1, 542, -1, -1, 422, -1, 313, -1, -1, 198, 3, - -1, 151, 895, 585, -1, 100, 644, 416, 976, 40, - 151, 895, 585, 975, -1, 100, 644, 416, 191, 274, - 152, 976, 40, 151, 895, 585, 975, -1, 809, -1, - 905, 13, 809, -1, 583, -1, 584, 518, 583, -1, + -1, 151, 896, 585, -1, 100, 644, 416, 977, 40, + 151, 896, 585, 976, -1, 100, 644, 416, 191, 274, + 152, 977, 40, 151, 896, 585, 976, -1, 809, -1, + 906, 13, 809, -1, 583, -1, 584, 518, 583, -1, 514, 584, 515, -1, -1, 32, 381, 541, 587, -1, 32, 381, 191, 152, 541, 587, -1, 590, -1, 587, 590, -1, 476, -1, 500, -1, -1, 4, -1, 505, 4, -1, 506, 4, -1, 592, -1, 40, 777, -1, 60, 589, -1, 106, -1, 272, 106, -1, 201, 591, 589, -1, 250, 589, -1, 260, 589, -1, 272, 250, - -1, 272, 260, -1, 304, 59, 902, -1, 381, 265, - 902, -1, 400, 588, 589, -1, 356, -1, 356, 588, - 589, -1, 59, -1, -1, 898, -1, 505, 898, -1, - 506, 898, -1, 137, 580, 377, 542, 594, -1, 137, + -1, 272, 260, -1, 304, 59, 903, -1, 381, 265, + 903, -1, 400, 588, 589, -1, 356, -1, 356, 588, + 589, -1, 59, -1, -1, 899, -1, 505, 899, -1, + 506, 899, -1, 137, 580, 377, 542, 594, -1, 137, 580, 377, 191, 152, 542, 594, -1, -1, 171, 3, -1, 22, 596, -1, 52, 596, -1, 400, 596, -1, 86, 596, -1, 143, 596, -1, 363, 596, -1, 479, @@ -1981,13 +1983,13 @@ static const yytype_int16 yyrhs[] = 541, 514, 631, 515, 620, 612, -1, 100, 644, 416, 191, 274, 152, 541, 514, 631, 515, 620, 612, -1, 100, 294, 352, 644, 416, 541, 514, 631, 515, 620, - 612, -1, -1, 599, 624, -1, 639, -1, 983, -1, - 848, -1, 589, -1, 544, -1, 273, -1, 514, 587, + 612, -1, -1, 599, 624, -1, 639, -1, 984, -1, + 849, -1, 589, -1, 544, -1, 273, -1, 514, 587, 515, -1, -1, 544, -1, 272, 25, -1, 357, -1, - 63, -1, 386, 279, -1, 386, 117, -1, 93, 895, - 605, -1, 605, -1, 619, -1, 80, 902, -1, 274, + 63, -1, 386, 279, -1, 386, 117, -1, 93, 896, + 605, -1, 605, -1, 619, -1, 80, 903, -1, 274, 279, -1, 279, -1, 445, 630, -1, 328, 226, 630, - -1, 74, 514, 809, 515, 614, -1, 454, 88, 895, + -1, 74, 514, 809, 515, 614, -1, 454, 88, 896, -1, 117, 810, -1, 344, 541, 633, 642, 611, -1, 468, -1, 406, -1, 606, -1, -1, 175, 645, 40, 190, 601, -1, 175, 645, 40, 514, 809, 515, 607, @@ -1995,7 +1997,7 @@ static const yytype_int16 yyrhs[] = 289, 451, 603, -1, 610, -1, 635, -1, 610, 635, -1, 635, 610, -1, -1, 289, 86, 137, -1, 289, 86, 122, 366, -1, 289, 86, 327, 366, -1, -1, - 514, 617, 515, -1, 272, 204, -1, -1, 93, 895, + 514, 617, 515, -1, 272, 204, -1, -1, 93, 896, 640, -1, 640, -1, 85, -1, 94, -1, 118, -1, 190, -1, 203, -1, 402, -1, 405, -1, 30, -1, 636, -1, 617, 518, 636, -1, 454, 202, 627, -1, @@ -2012,8 +2014,8 @@ static const yytype_int16 yyrhs[] = 604, -1, -1, 289, 122, 603, -1, 548, 503, 600, -1, 548, -1, 548, 516, 548, 503, 600, -1, 548, 516, 548, -1, 632, -1, 637, 518, 632, -1, 637, - -1, 637, 518, -1, 774, -1, 899, 903, 509, 439, - -1, 387, 899, 903, 509, 439, -1, 74, 514, 809, + -1, 637, 518, -1, 774, -1, 900, 904, 509, 439, + -1, 387, 900, 904, 509, 439, -1, 74, 514, 809, 515, 599, -1, 445, 514, 638, 515, 630, 599, -1, 445, 618, 599, -1, 328, 226, 514, 638, 515, 630, 599, -1, 328, 226, 618, 599, -1, 168, 226, 514, @@ -2023,17 +2025,17 @@ static const yytype_int16 yyrhs[] = -1, 420, -1, 240, 422, -1, 240, 420, -1, 177, 422, -1, 177, 420, -1, 448, -1, -1, 33, -1, 59, 117, -1, 137, 647, 191, 152, 649, 650, -1, - 137, 647, 649, 650, -1, 137, 648, 191, 152, 892, - 650, -1, 137, 648, 892, 650, -1, 137, 651, 895, - 289, 902, 650, -1, 137, 651, 191, 152, 895, 289, - 902, 650, -1, 416, -1, 381, -1, 173, -1, 245, + 137, 647, 649, 650, -1, 137, 648, 191, 152, 893, + 650, -1, 137, 648, 893, 650, -1, 137, 651, 896, + 289, 903, 650, -1, 137, 651, 191, 152, 896, 289, + 903, 650, -1, 416, -1, 381, -1, 173, -1, 245, -1, 245, 416, -1, 466, -1, 249, 466, -1, 202, -1, 168, 416, -1, 81, -1, 97, -1, 370, -1, 402, -1, 423, 374, 307, -1, 423, 374, 129, -1, 423, 374, 421, -1, 423, 374, 90, -1, 439, -1, 24, 251, -1, 146, 433, -1, 156, -1, 168, 107, - 480, -1, 334, -1, 384, -1, 902, -1, 649, 518, - 902, -1, 63, -1, 357, -1, -1, 319, -1, 367, + 480, -1, 334, -1, 384, -1, 903, -1, 649, 518, + 903, -1, 63, -1, 357, -1, -1, 319, -1, 367, -1, 433, -1, 100, 644, 653, 541, 654, 40, 416, 674, -1, 100, 644, 653, 191, 274, 152, 541, 654, 40, 416, 674, -1, 100, 294, 352, 644, 653, 541, @@ -2041,493 +2043,493 @@ static const yytype_int16 yyrhs[] = 40, 809, -1, 100, 644, 653, 191, 274, 152, 541, 654, 40, 809, -1, 100, 294, 352, 644, 653, 541, 654, 40, 809, -1, 173, -1, 245, -1, 514, 515, - -1, 514, 856, 515, -1, 556, 451, 954, 386, 569, - 741, 955, 562, -1, 98, 669, 541, 633, 667, 658, + -1, 514, 857, 515, -1, 556, 451, 955, 386, 569, + 741, 956, 562, -1, 98, 669, 541, 633, 667, 658, 663, 672, 659, 588, 664, -1, 98, 514, 674, 515, 428, 663, 672, 588, 664, -1, 98, 171, 108, 542, 428, 542, 657, -1, -1, 514, 370, 515, -1, 514, 107, 515, -1, 171, -1, 428, -1, 661, 124, 544, -1, -1, 671, -1, 660, 518, 671, -1, 454, -1, -1, 40, -1, -1, 333, -1, -1, 668, -1, 514, - 673, 515, -1, 936, -1, 589, -1, 507, -1, 514, - 660, 515, -1, 815, -1, -1, 548, 665, -1, 476, - 287, -1, -1, 668, 670, -1, -1, 55, -1, -1, - 55, -1, 287, -1, 170, -1, 123, 662, 544, -1, - 279, 662, 544, -1, 102, -1, 186, -1, 336, 662, - 544, -1, 145, 662, 544, -1, 167, 336, 637, -1, - 167, 336, 507, -1, 309, 59, 637, -1, 309, 59, - 507, -1, 167, 274, 279, 637, -1, 167, 279, 637, - -1, 141, 544, -1, 936, -1, 544, -1, 403, -1, - 404, -1, 3, 516, 542, -1, 3, -1, 666, -1, - 673, 518, 666, -1, 676, -1, 675, -1, 514, 676, - 515, -1, 514, 675, 515, -1, 514, 965, 515, -1, - 679, -1, 677, 699, -1, 677, 698, 732, 705, -1, - 677, 698, 704, 733, -1, 686, 677, -1, 686, 677, - 699, -1, 686, 677, 698, 732, 705, -1, 686, 677, - 698, 704, 733, -1, 679, -1, 675, -1, 379, 696, - 881, -1, -1, 379, 696, 881, 690, 741, 767, 721, - 730, 824, 731, 709, -1, 379, 695, 883, 690, 741, - 767, 721, 730, 824, 731, 709, -1, 171, 742, 678, - 690, 767, 721, 730, 824, 731, 709, -1, 171, 742, - 379, 695, 883, 690, 767, 721, 730, 824, 731, 709, - -1, 740, -1, 416, 761, -1, 677, 444, 693, 694, - 677, -1, 677, 444, 693, 677, -1, 677, 217, 693, - 677, -1, 677, 147, 693, 677, -1, 681, 744, 454, - 883, -1, 681, 744, 454, 883, 180, 59, 894, -1, - 681, 744, 180, 59, 894, -1, 681, 744, 289, 685, - -1, 681, 744, 289, 685, 180, 59, 894, -1, 681, - 744, 289, 685, 454, 883, -1, 681, 744, 289, 685, - 454, 883, 180, 59, 894, -1, 682, 744, 289, 883, - 219, 265, 895, 680, 894, -1, 682, 744, 289, 883, - -1, 459, -1, 460, -1, 314, -1, 316, -1, 449, - -1, 315, -1, 810, -1, 810, 198, 514, 676, 515, - -1, 747, -1, 683, -1, 684, 518, 683, -1, 684, - -1, 684, 518, -1, 476, 687, -1, 500, 687, -1, - 476, 342, 687, -1, 688, -1, 687, 518, 688, -1, - 895, 904, 40, 689, 514, 909, 515, -1, 249, -1, - 274, 249, -1, -1, 219, 691, -1, -1, 422, 692, - 541, -1, 420, 692, 541, -1, 240, 422, 692, 541, - -1, 240, 420, 692, 541, -1, 177, 422, 692, 541, - -1, 177, 420, 692, 541, -1, 448, 692, 541, -1, - 416, 541, -1, 541, -1, 416, -1, -1, 30, -1, - 132, -1, -1, 59, 265, -1, 132, -1, 132, 289, - 514, 854, 515, -1, 30, -1, -1, 192, 281, -1, - 355, 281, -1, -1, 699, -1, -1, 295, 59, 700, - -1, 295, 59, 30, 702, 703, -1, 701, -1, 700, - 518, 701, -1, 809, 454, 848, 703, -1, 809, 702, - 703, -1, 41, -1, 126, -1, -1, 499, 163, -1, - 499, 230, -1, -1, 706, 707, -1, 707, 706, -1, - 706, -1, 707, -1, 704, -1, -1, 237, 715, -1, - 237, 715, 518, 716, -1, 161, 720, 717, 719, 290, - -1, 161, 720, 719, 290, -1, 286, 716, -1, 286, - 717, 719, -1, 4, 509, -1, 9, 509, -1, 4, - 312, -1, 9, 312, -1, 9, -1, 9, 366, -1, - 454, 368, 711, -1, -1, 542, -1, -1, 710, 514, - 708, 515, 714, -1, 708, -1, 708, 514, 542, 515, - -1, 708, 514, 542, 518, 9, 515, -1, 418, 711, - -1, 712, -1, -1, 351, 514, 9, 515, -1, -1, - 809, -1, 30, -1, 809, 509, -1, 4, 312, -1, - 9, 312, -1, 809, -1, 811, -1, 505, 718, -1, - 506, 718, -1, 898, -1, 4, -1, 365, -1, 366, - -1, 163, -1, 271, -1, 180, 59, 723, -1, 180, - 59, 30, -1, -1, 724, -1, 722, 518, 724, -1, - 722, -1, 722, 518, -1, 809, -1, 725, -1, 727, - -1, 726, -1, 728, -1, 514, 515, -1, 364, 514, - 854, 515, -1, 103, 514, 854, 515, -1, 181, 388, - 514, 723, 515, -1, 181, -1, 182, -1, 185, 809, - -1, -1, 335, 809, -1, -1, 734, -1, 166, 338, - 290, -1, 732, -1, -1, 735, -1, 734, 735, -1, - 736, 737, 738, -1, 166, 451, -1, 166, 272, 226, - 451, -1, 166, 389, -1, 166, 226, 389, -1, 284, - 891, -1, -1, 278, -1, 393, 243, -1, -1, 460, - 514, 854, 515, -1, 739, 518, 514, 854, 515, -1, - 739, -1, 739, 518, -1, 171, 743, -1, -1, 744, - -1, 742, 518, 744, -1, 742, -1, 742, 518, -1, - 761, 756, 713, -1, 762, 757, 713, -1, 740, 755, - 713, -1, 231, 762, 757, -1, 675, 756, 713, -1, - 231, 675, 756, -1, 754, -1, 514, 754, 515, 755, - -1, 744, 314, 514, 883, 166, 750, 745, 515, 756, - -1, 744, 449, 746, 514, 751, 166, 753, 515, 756, - -1, 180, 59, 893, -1, -1, 199, 281, -1, 148, - 281, -1, -1, 810, 198, 514, 883, 515, -1, 810, - 198, 543, -1, -1, 812, -1, 814, -1, 514, 852, - 515, -1, 748, 198, 514, 883, 515, -1, 748, 198, - 543, -1, 749, -1, 750, 749, -1, 543, -1, 514, - 893, 515, -1, 751, 198, 514, 883, 515, -1, 752, - -1, 753, 752, -1, 514, 754, 515, -1, 744, 101, - 224, 744, -1, 744, 758, 224, 744, 760, -1, 744, - 224, 744, 760, -1, 744, 268, 758, 224, 744, -1, - 744, 268, 224, 744, -1, 744, 42, 758, 224, 744, - 760, -1, 744, 42, 224, 744, 760, -1, 744, 321, - 224, 744, -1, 744, 37, 224, 744, 760, -1, 744, - 380, 224, 744, 760, -1, 40, 543, 514, 893, 515, - -1, 40, 543, -1, 542, 514, 893, 515, -1, 542, - -1, 755, -1, -1, 755, -1, 40, 514, 768, 515, - -1, 40, 543, 514, 768, 515, -1, 542, 514, 768, - 515, -1, -1, 172, 759, -1, 234, 759, -1, 361, - 759, -1, 380, -1, 37, -1, 208, -1, 299, -1, - -1, 454, 514, 893, 515, -1, 289, 809, -1, 541, - -1, 541, 507, -1, 290, 541, -1, 290, 514, 541, - 515, -1, 818, 766, -1, 366, 171, 514, 764, 515, - 766, -1, 818, 765, -1, 763, -1, 764, 518, 763, - -1, 40, 514, 768, 515, -1, -1, 500, 296, -1, - -1, 473, 809, -1, -1, 769, -1, 768, 518, 769, - -1, 543, 774, 770, -1, 80, 902, -1, -1, 542, - 774, -1, 771, 518, 542, 774, -1, 365, -1, 409, - -1, 774, -1, -1, 777, 776, -1, 387, 777, 776, - -1, 777, 39, 512, 898, 513, -1, 387, 777, 39, - 512, 898, 513, -1, 777, 39, -1, 387, 777, 39, - -1, 775, -1, 772, 514, 771, 515, 776, -1, 246, - 514, 858, 515, 776, -1, 444, 514, 771, 515, 776, - -1, 3, 516, 3, -1, 775, 516, 3, -1, 776, - 512, 513, -1, 776, 512, 898, 513, -1, -1, 779, - -1, 781, -1, 783, -1, 787, -1, 793, -1, 794, - 808, -1, 794, 514, 898, 515, -1, 781, -1, 784, - -1, 788, -1, 793, -1, 901, 780, -1, 514, 855, - 515, -1, -1, 215, -1, 216, -1, 394, -1, 54, - -1, 339, -1, 164, 782, -1, 136, 324, -1, 115, - 780, -1, 112, 780, -1, 282, 780, -1, 57, -1, - 514, 898, 515, -1, -1, 785, -1, 786, -1, 785, - -1, 786, -1, 56, 792, 514, 854, 515, -1, 56, - 792, -1, 789, -1, 790, -1, 789, -1, 790, -1, - 791, 514, 898, 515, -1, 791, -1, 72, 792, -1, - 71, 792, -1, 461, -1, 267, 72, 792, -1, 267, - 71, 792, -1, 269, 792, -1, 463, -1, -1, 427, - 514, 898, 515, 795, -1, 427, 795, -1, 426, 514, - 898, 515, 795, -1, 426, 795, -1, 218, -1, 500, - 426, 497, -1, 478, 426, 497, -1, -1, 494, -1, - 495, -1, 262, -1, 263, -1, 109, -1, 110, -1, - 188, -1, 189, -1, 258, -1, 259, -1, 375, -1, - 376, -1, 256, -1, 257, -1, 252, -1, 253, -1, - 470, -1, 471, -1, 113, -1, 114, -1, 69, -1, - 68, -1, 255, -1, 254, -1, 796, -1, 797, -1, - 798, -1, 799, -1, 800, -1, 801, -1, 802, -1, - 803, -1, 804, -1, 805, -1, 806, -1, 807, -1, - 796, 428, 797, -1, 798, 428, 799, -1, 798, 428, - 800, -1, 798, 428, 801, -1, 799, 428, 800, -1, - 799, 428, 801, -1, 800, 428, 801, -1, -1, 811, - -1, 809, 11, 774, -1, 809, 80, 902, -1, 809, - 46, 426, 497, 809, -1, 505, 809, -1, 506, 809, - -1, 809, 505, 809, -1, 809, 506, 809, -1, 809, - 507, 809, -1, 809, 508, 809, -1, 809, 15, 809, - -1, 809, 509, 809, -1, 809, 510, 809, -1, 809, - 16, 809, -1, 809, 501, 809, -1, 809, 502, 809, - -1, 809, 503, 809, -1, 809, 19, 809, -1, 809, - 20, 809, -1, 809, 21, 809, -1, 809, 847, 809, - -1, 847, 809, -1, 809, 847, -1, 809, 36, 809, - -1, 809, 294, 809, -1, 274, 809, -1, 498, 809, - -1, 809, 176, 809, -1, 809, 236, 809, -1, 809, - 236, 809, 145, 809, -1, 809, 498, 236, 809, -1, - 809, 498, 236, 809, 145, 809, -1, 809, 193, 809, - -1, 809, 193, 809, 145, 809, -1, 809, 498, 193, - 809, -1, 809, 498, 193, 809, 145, 809, -1, 809, - 391, 428, 809, -1, 809, 391, 428, 809, 145, 809, - -1, 809, 498, 391, 428, 809, -1, 809, 498, 391, - 428, 809, 145, 809, -1, 809, 221, 279, -1, 809, - 222, -1, 809, 221, 274, 279, -1, 809, 274, 279, - -1, 809, 277, -1, 809, 17, 809, -1, 809, 18, - 809, -1, 836, 301, 836, -1, 809, 221, 435, -1, - 809, 221, 274, 435, -1, 809, 221, 159, -1, 809, - 221, 274, 159, -1, 809, 221, 446, -1, 809, 221, - 274, 446, -1, 809, 221, 132, 171, 809, -1, 809, - 221, 274, 132, 171, 809, -1, 809, 221, 284, 514, - 858, 515, -1, 809, 221, 274, 284, 514, 858, 515, - -1, 809, 53, 880, 810, 36, 809, -1, 809, 498, - 53, 880, 810, 36, 809, -1, 809, 53, 413, 810, - 36, 809, -1, 809, 498, 53, 413, 810, 36, 809, - -1, 809, 198, 868, -1, 809, 498, 198, 868, -1, - 809, 849, 844, 675, -1, 809, 849, 844, 514, 809, - 515, -1, 117, -1, 83, 514, 809, 515, -1, 507, - 886, 890, -1, 542, 516, 507, 886, 890, -1, 811, - -1, 810, 11, 774, -1, 505, 810, -1, 506, 810, - -1, 810, 505, 810, -1, 810, 506, 810, -1, 810, - 507, 810, -1, 810, 508, 810, -1, 810, 15, 810, - -1, 810, 509, 810, -1, 810, 510, 810, -1, 810, - 16, 810, -1, 810, 501, 810, -1, 810, 502, 810, - -1, 810, 503, 810, -1, 810, 19, 810, -1, 810, - 20, 810, -1, 810, 21, 810, -1, 810, 847, 810, - -1, 847, 810, -1, 810, 847, -1, 810, 221, 132, - 171, 810, -1, 810, 221, 274, 132, 171, 810, -1, - 810, 221, 284, 514, 858, 515, -1, 810, 221, 274, - 284, 514, 858, 515, -1, 812, -1, 813, 879, -1, - 874, -1, 897, -1, 675, -1, 675, 545, -1, 152, - 675, -1, 729, 514, 854, 515, -1, 514, 809, 515, - -1, 814, -1, 836, -1, 519, -1, 10, -1, 815, - -1, 246, 520, 843, 521, -1, 817, -1, 869, -1, - 512, 855, 513, -1, 820, -1, 39, 675, -1, 39, - 512, 855, 513, -1, 522, 9, -1, 523, 548, -1, - 520, 839, 521, -1, 896, 514, 515, -1, 896, 514, - 856, 698, 697, 515, -1, 896, 514, 462, 857, 698, - 697, 515, -1, 896, 514, 856, 518, 462, 857, 698, - 697, 515, -1, 896, 514, 30, 856, 698, 697, 515, - -1, 896, 514, 132, 856, 698, 697, 515, -1, 816, - 821, 822, 823, 827, -1, 819, -1, 816, -1, 819, - -1, 81, 166, 514, 809, 515, -1, 66, 514, 809, - 40, 774, 515, -1, 438, 514, 809, 40, 774, 515, - -1, 158, 514, 859, 515, -1, 302, 514, 861, 515, - -1, 320, 514, 863, 515, -1, 411, 514, 864, 515, - -1, 432, 514, 809, 40, 774, 515, -1, 434, 514, - 58, 867, 515, -1, 434, 514, 232, 867, 515, -1, - 434, 514, 429, 867, 515, -1, 434, 514, 867, 515, - -1, 280, 514, 809, 518, 809, 515, -1, 79, 514, - 854, 515, -1, 512, 809, 166, 542, 198, 809, 513, - -1, 512, 809, 166, 542, 198, 811, 191, 809, 513, - -1, 477, 180, 514, 699, 515, -1, -1, 162, 514, - 473, 809, 515, -1, 162, 514, 809, 515, -1, -1, - 155, -1, -1, 475, 825, -1, -1, 826, -1, 825, - 518, 826, -1, 542, 40, 828, -1, 300, 828, -1, - 300, 542, -1, -1, 514, 829, 830, 698, 831, 515, - -1, 542, -1, -1, 309, 59, 853, -1, -1, 337, - 832, 834, -1, 366, 832, 834, -1, 183, 832, 834, - -1, -1, 833, -1, 53, 833, 36, 833, -1, 441, - 323, -1, 441, 165, -1, 104, 365, -1, 809, 323, - -1, 809, 165, -1, 148, 104, 365, -1, 148, 180, - -1, 148, 425, -1, 148, 272, 297, -1, -1, 365, - 514, 854, 515, -1, 365, 514, 515, -1, 835, -1, - 514, 853, 518, 809, 515, -1, 543, 524, 809, -1, - 837, -1, 838, 518, 837, -1, 838, -1, 838, 518, - -1, 809, 524, 809, -1, 840, -1, 841, 518, 840, - -1, 841, -1, 841, 518, -1, 842, -1, -1, 38, - -1, 396, -1, 30, -1, 8, -1, 846, -1, 505, - -1, 506, -1, 507, -1, 508, -1, 15, -1, 509, - -1, 510, -1, 16, -1, 501, -1, 502, -1, 503, - -1, 19, -1, 20, -1, 21, -1, 8, -1, 291, - 514, 850, 515, -1, 845, -1, 291, 514, 850, 515, - -1, 845, -1, 291, 514, 850, 515, -1, 236, -1, - 498, 236, -1, 176, -1, 498, 176, -1, 193, -1, - 498, 193, -1, 845, -1, 542, 516, 850, -1, 811, - -1, 851, 518, 811, -1, 851, -1, 851, 518, -1, - 809, -1, 853, 518, 809, -1, 853, -1, 853, 518, - -1, 854, -1, -1, 857, -1, 856, 518, 857, -1, - 809, -1, 905, 13, 809, -1, 905, 14, 809, -1, - 774, -1, 858, 518, 774, -1, 860, 171, 809, -1, - -1, 3, -1, 796, -1, 797, -1, 798, -1, 799, - -1, 800, -1, 801, -1, 802, -1, 803, -1, 804, - -1, 805, -1, 806, -1, 807, -1, 544, -1, 809, - 862, 865, 866, -1, 809, 862, 865, -1, 317, 809, - -1, 810, 198, 810, -1, -1, 809, 865, 866, -1, - 809, 866, 865, -1, 809, 865, -1, 809, 866, -1, - 853, -1, -1, 171, 809, -1, 166, 809, -1, 809, - 171, 854, -1, 171, 854, -1, 854, -1, 675, -1, - 514, 854, 515, -1, 65, 873, 870, 872, 143, -1, - 871, -1, 870, 871, -1, 472, 809, 424, 809, -1, - 139, 809, -1, -1, 809, -1, -1, 542, -1, 542, - 545, -1, 512, 809, 513, -1, 512, 875, 524, 875, - 513, -1, 512, 875, 524, 875, 524, 875, 513, -1, - 512, 875, 524, 506, 524, 875, 513, -1, 809, -1, - -1, -1, 876, 546, -1, -1, 514, 515, -1, 514, - 856, 515, -1, 516, 547, 877, -1, 512, 809, 513, - -1, 512, 875, 524, 875, 513, -1, 512, 875, 524, - 875, 524, 875, 513, -1, 512, 875, 524, 506, 524, - 875, 513, -1, -1, 879, 878, -1, 45, -1, -1, - 883, -1, -1, 884, -1, 882, 518, 884, -1, 882, - -1, 882, 518, -1, 809, 40, 906, -1, 809, 3, - -1, 809, -1, 148, 514, 893, 515, -1, 148, 542, - -1, 885, -1, -1, 809, 40, 542, -1, 887, -1, - 888, 518, 887, -1, 888, -1, 888, 518, -1, 352, - 514, 889, 515, -1, 352, 887, -1, -1, 541, -1, - 891, 518, 541, -1, 895, -1, 892, 518, 895, -1, - 892, -1, 892, 518, -1, 893, -1, 514, 893, 515, - -1, 543, -1, 900, -1, 542, 545, -1, 898, -1, - 4, -1, 544, 876, -1, 6, -1, 7, -1, 896, - 544, -1, 896, 514, 856, 698, 697, 515, 544, -1, - 778, 544, -1, 794, 514, 809, 515, 808, -1, 794, - 898, 808, -1, 794, 544, 808, -1, 435, -1, 159, - -1, 279, -1, 9, -1, 3, -1, 977, -1, 982, - -1, 3, -1, 977, -1, 979, -1, 3, -1, 977, - -1, 980, -1, 542, -1, 542, 903, -1, 516, 547, - -1, 903, 516, 547, -1, 514, 893, 515, -1, -1, - 899, -1, 548, -1, 5, -1, 325, 895, 908, 40, - 909, -1, 514, 858, 515, -1, -1, 674, -1, 551, - -1, 655, -1, 656, -1, 953, -1, 965, -1, 100, - 370, 541, 911, -1, 100, 370, 191, 274, 152, 541, - 911, -1, 100, 294, 352, 370, 541, 911, -1, 911, - 912, -1, -1, 598, -1, 913, -1, 576, -1, 972, - -1, 100, 919, 202, 916, 917, 289, 541, 915, 514, - 570, 515, 918, 767, -1, 100, 919, 202, 916, 191, - 274, 152, 627, 289, 541, 915, 514, 570, 515, 918, - 767, -1, 542, -1, 454, 914, -1, -1, 89, -1, - -1, 627, -1, -1, 476, 613, -1, -1, 445, -1, - -1, 32, 416, 761, 386, 370, 895, -1, 32, 416, - 191, 152, 761, 386, 370, 895, -1, 32, 381, 541, - 386, 370, 895, -1, 32, 381, 191, 152, 541, 386, - 370, 895, -1, 32, 466, 541, 386, 370, 895, -1, - 32, 466, 191, 152, 541, 386, 370, 895, -1, 167, - 75, 922, -1, 75, 922, -1, 542, -1, -1, 84, - 289, 925, 541, 221, 924, -1, 84, 289, 82, 809, - 221, 924, -1, 544, -1, 279, -1, 416, -1, 381, - -1, 173, -1, 245, -1, 245, 416, -1, 466, -1, - 108, -1, 202, -1, 370, -1, 439, -1, 154, 108, - 544, 664, -1, 154, 108, 542, 428, 544, 664, -1, - 197, 108, 544, -1, 153, 931, -1, 153, 935, 929, - 931, -1, 153, 464, 931, -1, 153, 514, 934, 515, - 931, -1, 464, -1, -1, 936, -1, 589, -1, -1, - 920, -1, 586, -1, 529, -1, 971, -1, 921, -1, - 656, -1, 974, -1, 652, -1, 910, -1, 576, -1, - 598, -1, 572, -1, 540, -1, 953, -1, 646, -1, - 582, -1, 913, -1, 551, -1, 945, -1, 575, -1, - 907, -1, 549, -1, 674, -1, 595, -1, 655, -1, - 948, -1, 962, -1, 939, -1, 965, -1, 972, -1, - 3, -1, 977, -1, 981, -1, 932, -1, 544, -1, - 937, -1, 934, 518, 937, -1, 35, -1, 34, -1, - 435, -1, 159, -1, 289, -1, 933, -1, 938, 930, - -1, 932, -1, 935, -1, 386, 940, -1, 386, 240, - 940, -1, 386, 385, 940, -1, 386, 177, 940, -1, - 941, -1, 969, 171, 104, -1, 426, 497, 943, -1, - 370, 544, -1, 969, 428, 944, -1, 969, 503, 944, - -1, 809, -1, 544, -1, 3, -1, 794, 544, 808, - -1, 794, 514, 898, 515, 544, -1, 589, -1, 117, - -1, 240, -1, 942, -1, 944, 518, 942, -1, 239, - 946, -1, 213, 946, -1, 167, 213, 946, -1, 213, - 946, 171, 947, -1, 167, 213, 946, 171, 947, -1, - 544, -1, 542, -1, 544, -1, 542, -1, 455, 950, - 952, 929, -1, 455, 950, 952, 929, 541, 904, -1, - 455, 950, 952, 929, 957, -1, 455, 514, 951, 515, - -1, 455, 514, 951, 515, 541, 904, -1, 935, -1, - 464, -1, 170, -1, 172, -1, 3, -1, 172, -1, - -1, 949, -1, 951, 518, 949, -1, 170, -1, -1, - 556, 122, 171, 954, 956, 955, 562, -1, 436, 692, - 954, -1, 761, -1, 761, 542, -1, 761, 40, 542, - -1, 473, 809, -1, -1, 454, 743, -1, -1, 935, - 929, -1, 935, 929, 541, 904, -1, 47, 960, 544, - 961, 664, -1, 47, 191, 274, 152, 960, 544, 961, - 664, -1, 128, 548, -1, 128, 108, 548, -1, 128, - 108, 191, 152, 548, -1, 108, -1, -1, 40, 542, - -1, -1, 354, 964, -1, 354, 240, 964, -1, 354, - 385, 964, -1, 354, 177, 964, -1, 969, -1, 30, - -1, 963, -1, 426, 497, -1, 430, 223, 235, -1, - 967, 674, -1, 412, 674, -1, 412, 970, -1, 967, - 970, -1, 967, 426, 497, -1, 967, 430, 223, 235, - -1, 967, 30, 968, -1, 967, -1, 127, -1, 126, - -1, 390, -1, 966, -1, 417, -1, -1, 542, -1, - 969, 516, 542, -1, 542, -1, 970, 516, 542, -1, - 61, 816, -1, 100, 644, 466, 541, 633, 918, 40, - 674, 973, -1, 100, 644, 466, 191, 274, 152, 541, - 633, 918, 40, 674, 973, -1, 100, 294, 352, 644, - 466, 541, 633, 918, 40, 674, 973, -1, 100, 644, - 342, 466, 541, 514, 637, 515, 918, 40, 674, 973, - -1, 100, 294, 352, 644, 342, 466, 541, 514, 637, - 515, 918, 40, 674, 973, -1, 476, 74, 292, -1, - 476, 64, 74, 292, -1, 476, 240, 74, 292, -1, - -1, 100, 644, 416, 976, 40, 674, 975, -1, 100, - 644, 416, 191, 274, 152, 976, 40, 674, 975, -1, - 100, 294, 352, 644, 416, 976, 40, 674, 975, -1, - 476, 107, -1, 476, 272, 107, -1, -1, 541, 633, - 620, 612, -1, 22, -1, 23, -1, 24, -1, 25, - -1, 26, -1, 27, -1, 28, -1, 29, -1, 31, - -1, 32, -1, 33, -1, 43, -1, 44, -1, 46, - -1, 47, -1, 48, -1, 50, -1, 51, -1, 52, - -1, 59, -1, 60, -1, 61, -1, 62, -1, 63, - -1, 64, -1, 67, -1, 68, -1, 69, -1, 70, - -1, 73, -1, 75, -1, 76, -1, 77, -1, 78, - -1, 84, -1, 85, -1, 86, -1, 87, -1, 88, - -1, 90, -1, 91, -1, 92, -1, 94, -1, 95, - -1, 96, -1, 97, -1, 98, -1, 99, -1, 102, - -1, 103, -1, 104, -1, 105, -1, 106, -1, 107, - -1, 108, -1, 109, -1, 110, -1, 111, -1, 113, - -1, 114, -1, 116, -1, 118, -1, 120, -1, 121, - -1, 122, -1, 123, -1, 124, -1, 125, -1, 128, - -1, 129, -1, 130, -1, 131, -1, 134, -1, 135, - -1, 136, -1, 137, -1, 138, -1, 140, -1, 141, - -1, 142, -1, 144, -1, 145, -1, 146, -1, 148, - -1, 149, -1, 150, -1, 151, -1, 153, -1, 154, - -1, 155, -1, 156, -1, 157, -1, 160, -1, 162, - -1, 163, -1, 165, -1, 167, -1, 169, -1, 173, - -1, 174, -1, 177, -1, 179, -1, 183, -1, 184, - -1, 186, -1, 187, -1, 188, -1, 189, -1, 190, - -1, 191, -1, 192, -1, 194, -1, 195, -1, 196, - -1, 197, -1, 199, -1, 200, -1, 201, -1, 202, - -1, 203, -1, 204, -1, 205, -1, 207, -1, 210, - -1, 211, -1, 212, -1, 213, -1, 214, -1, 220, - -1, 223, -1, 225, -1, 226, -1, 227, -1, 228, - -1, 229, -1, 230, -1, 233, -1, 235, -1, 238, - -1, 239, -1, 240, -1, 241, -1, 242, -1, 243, - -1, 244, -1, 245, -1, 247, -1, 248, -1, 249, - -1, 250, -1, 251, -1, 252, -1, 253, -1, 254, - -1, 255, -1, 256, -1, 257, -1, 258, -1, 259, - -1, 260, -1, 261, -1, 262, -1, 263, -1, 264, - -1, 265, -1, 266, -1, 270, -1, 271, -1, 272, - -1, 275, -1, 276, -1, 278, -1, 281, -1, 283, - -1, 284, -1, 285, -1, 287, -1, 288, -1, 291, - -1, 292, -1, 293, -1, 296, -1, 297, -1, 300, - -1, 303, -1, 304, -1, 305, -1, 306, -1, 307, - -1, 308, -1, 309, -1, 310, -1, 311, -1, 312, - -1, 313, -1, 318, -1, 319, -1, 322, -1, 323, - -1, 325, -1, 326, -1, 327, -1, 329, -1, 330, - -1, 331, -1, 332, -1, 333, -1, 334, -1, 336, - -1, 337, -1, 338, -1, 340, -1, 341, -1, 342, - -1, 343, -1, 345, -1, 346, -1, 347, -1, 348, - -1, 349, -1, 350, -1, 351, -1, 352, -1, 353, - -1, 354, -1, 355, -1, 356, -1, 357, -1, 359, - -1, 360, -1, 362, -1, 363, -1, 364, -1, 366, - -1, 367, -1, 368, -1, 369, -1, 370, -1, 371, - -1, 372, -1, 373, -1, 374, -1, 375, -1, 376, - -1, 377, -1, 378, -1, 381, -1, 382, -1, 383, - -1, 384, -1, 385, -1, 386, -1, 388, -1, 389, - -1, 392, -1, 393, -1, 395, -1, 397, -1, 398, - -1, 399, -1, 400, -1, 401, -1, 402, -1, 403, - -1, 404, -1, 405, -1, 406, -1, 407, -1, 408, - -1, 410, -1, 414, -1, 415, -1, 417, -1, 419, - -1, 420, -1, 421, -1, 422, -1, 423, -1, 425, - -1, 430, -1, 431, -1, 433, -1, 436, -1, 437, - -1, 439, -1, 440, -1, 441, -1, 442, -1, 443, - -1, 446, -1, 447, -1, 448, -1, 450, -1, 451, - -1, 452, -1, 453, -1, 455, -1, 456, -1, 457, - -1, 458, -1, 459, -1, 463, -1, 465, -1, 466, - -1, 467, -1, 468, -1, 469, -1, 470, -1, 471, - -1, 474, -1, 477, -1, 478, -1, 479, -1, 480, - -1, 481, -1, 482, -1, 494, -1, 495, -1, 496, - -1, 497, -1, 53, -1, 54, -1, 56, -1, 57, - -1, 71, -1, 72, -1, 79, -1, 83, -1, 112, - -1, 115, -1, 152, -1, 158, -1, 164, -1, 175, - -1, 181, -1, 182, -1, 209, -1, 215, -1, 216, - -1, 218, -1, 246, -1, 267, -1, 269, -1, 273, - -1, 280, -1, 282, -1, 298, -1, 302, -1, 320, - -1, 324, -1, 339, -1, 365, -1, 387, -1, 394, - -1, 409, -1, 411, -1, 426, -1, 427, -1, 432, - -1, 434, -1, 438, -1, 460, -1, 461, -1, 483, + 673, 515, -1, 937, -1, 589, -1, 815, -1, 507, + -1, 514, 660, 515, -1, 816, -1, -1, 548, 665, + -1, 476, 287, -1, -1, 668, 670, -1, -1, 55, + -1, -1, 55, -1, 287, -1, 170, -1, 123, 662, + 544, -1, 279, 662, 544, -1, 102, -1, 186, -1, + 336, 662, 544, -1, 145, 662, 544, -1, 167, 336, + 637, -1, 167, 336, 507, -1, 309, 59, 637, -1, + 309, 59, 507, -1, 167, 274, 279, 637, -1, 167, + 279, 637, -1, 141, 544, -1, 937, -1, 544, -1, + 403, -1, 404, -1, 3, 516, 542, -1, 3, -1, + 666, -1, 673, 518, 666, -1, 676, -1, 675, -1, + 514, 676, 515, -1, 514, 675, 515, -1, 514, 966, + 515, -1, 679, -1, 677, 699, -1, 677, 698, 732, + 705, -1, 677, 698, 704, 733, -1, 686, 677, -1, + 686, 677, 699, -1, 686, 677, 698, 732, 705, -1, + 686, 677, 698, 704, 733, -1, 679, -1, 675, -1, + 379, 696, 882, -1, -1, 379, 696, 882, 690, 741, + 767, 721, 730, 825, 731, 709, -1, 379, 695, 884, + 690, 741, 767, 721, 730, 825, 731, 709, -1, 171, + 742, 678, 690, 767, 721, 730, 825, 731, 709, -1, + 171, 742, 379, 695, 884, 690, 767, 721, 730, 825, + 731, 709, -1, 740, -1, 416, 761, -1, 677, 444, + 693, 694, 677, -1, 677, 444, 693, 677, -1, 677, + 217, 693, 677, -1, 677, 147, 693, 677, -1, 681, + 744, 454, 884, -1, 681, 744, 454, 884, 180, 59, + 895, -1, 681, 744, 180, 59, 895, -1, 681, 744, + 289, 685, -1, 681, 744, 289, 685, 180, 59, 895, + -1, 681, 744, 289, 685, 454, 884, -1, 681, 744, + 289, 685, 454, 884, 180, 59, 895, -1, 682, 744, + 289, 884, 219, 265, 896, 680, 895, -1, 682, 744, + 289, 884, -1, 459, -1, 460, -1, 314, -1, 316, + -1, 449, -1, 315, -1, 810, -1, 810, 198, 514, + 676, 515, -1, 747, -1, 683, -1, 684, 518, 683, + -1, 684, -1, 684, 518, -1, 476, 687, -1, 500, + 687, -1, 476, 342, 687, -1, 688, -1, 687, 518, + 688, -1, 896, 905, 40, 689, 514, 910, 515, -1, + 249, -1, 274, 249, -1, -1, 219, 691, -1, -1, + 422, 692, 541, -1, 420, 692, 541, -1, 240, 422, + 692, 541, -1, 240, 420, 692, 541, -1, 177, 422, + 692, 541, -1, 177, 420, 692, 541, -1, 448, 692, + 541, -1, 416, 541, -1, 541, -1, 416, -1, -1, + 30, -1, 132, -1, -1, 59, 265, -1, 132, -1, + 132, 289, 514, 855, 515, -1, 30, -1, -1, 192, + 281, -1, 355, 281, -1, -1, 699, -1, -1, 295, + 59, 700, -1, 295, 59, 30, 702, 703, -1, 701, + -1, 700, 518, 701, -1, 809, 454, 849, 703, -1, + 809, 702, 703, -1, 41, -1, 126, -1, -1, 499, + 163, -1, 499, 230, -1, -1, 706, 707, -1, 707, + 706, -1, 706, -1, 707, -1, 704, -1, -1, 237, + 715, -1, 237, 715, 518, 716, -1, 161, 720, 717, + 719, 290, -1, 161, 720, 719, 290, -1, 286, 716, + -1, 286, 717, 719, -1, 4, 509, -1, 9, 509, + -1, 4, 312, -1, 9, 312, -1, 9, -1, 9, + 366, -1, 454, 368, 711, -1, -1, 542, -1, -1, + 710, 514, 708, 515, 714, -1, 708, -1, 708, 514, + 542, 515, -1, 708, 514, 542, 518, 9, 515, -1, + 418, 711, -1, 712, -1, -1, 351, 514, 9, 515, + -1, -1, 809, -1, 30, -1, 809, 509, -1, 4, + 312, -1, 9, 312, -1, 809, -1, 811, -1, 505, + 718, -1, 506, 718, -1, 899, -1, 4, -1, 365, + -1, 366, -1, 163, -1, 271, -1, 180, 59, 723, + -1, 180, 59, 30, -1, -1, 724, -1, 722, 518, + 724, -1, 722, -1, 722, 518, -1, 809, -1, 725, + -1, 727, -1, 726, -1, 728, -1, 514, 515, -1, + 364, 514, 855, 515, -1, 103, 514, 855, 515, -1, + 181, 388, 514, 723, 515, -1, 181, -1, 182, -1, + 185, 809, -1, -1, 335, 809, -1, -1, 734, -1, + 166, 338, 290, -1, 732, -1, -1, 735, -1, 734, + 735, -1, 736, 737, 738, -1, 166, 451, -1, 166, + 272, 226, 451, -1, 166, 389, -1, 166, 226, 389, + -1, 284, 892, -1, -1, 278, -1, 393, 243, -1, + -1, 460, 514, 855, 515, -1, 739, 518, 514, 855, + 515, -1, 739, -1, 739, 518, -1, 171, 743, -1, + -1, 744, -1, 742, 518, 744, -1, 742, -1, 742, + 518, -1, 761, 756, 713, -1, 762, 757, 713, -1, + 740, 755, 713, -1, 231, 762, 757, -1, 675, 756, + 713, -1, 231, 675, 756, -1, 754, -1, 514, 754, + 515, 755, -1, 744, 314, 514, 884, 166, 750, 745, + 515, 756, -1, 744, 449, 746, 514, 751, 166, 753, + 515, 756, -1, 180, 59, 894, -1, -1, 199, 281, + -1, 148, 281, -1, -1, 810, 198, 514, 884, 515, + -1, 810, 198, 543, -1, -1, 812, -1, 814, -1, + 514, 853, 515, -1, 748, 198, 514, 884, 515, -1, + 748, 198, 543, -1, 749, -1, 750, 749, -1, 543, + -1, 514, 894, 515, -1, 751, 198, 514, 884, 515, + -1, 752, -1, 753, 752, -1, 514, 754, 515, -1, + 744, 101, 224, 744, -1, 744, 758, 224, 744, 760, + -1, 744, 224, 744, 760, -1, 744, 268, 758, 224, + 744, -1, 744, 268, 224, 744, -1, 744, 42, 758, + 224, 744, 760, -1, 744, 42, 224, 744, 760, -1, + 744, 321, 224, 744, -1, 744, 37, 224, 744, 760, + -1, 744, 380, 224, 744, 760, -1, 40, 543, 514, + 894, 515, -1, 40, 543, -1, 542, 514, 894, 515, + -1, 542, -1, 755, -1, -1, 755, -1, 40, 514, + 768, 515, -1, 40, 543, 514, 768, 515, -1, 542, + 514, 768, 515, -1, -1, 172, 759, -1, 234, 759, + -1, 361, 759, -1, 380, -1, 37, -1, 208, -1, + 299, -1, -1, 454, 514, 894, 515, -1, 289, 809, + -1, 541, -1, 541, 507, -1, 290, 541, -1, 290, + 514, 541, 515, -1, 819, 766, -1, 366, 171, 514, + 764, 515, 766, -1, 819, 765, -1, 763, -1, 764, + 518, 763, -1, 40, 514, 768, 515, -1, -1, 500, + 296, -1, -1, 473, 809, -1, -1, 769, -1, 768, + 518, 769, -1, 543, 774, 770, -1, 80, 903, -1, + -1, 542, 774, -1, 771, 518, 542, 774, -1, 365, + -1, 409, -1, 774, -1, -1, 777, 776, -1, 387, + 777, 776, -1, 777, 39, 512, 899, 513, -1, 387, + 777, 39, 512, 899, 513, -1, 777, 39, -1, 387, + 777, 39, -1, 775, -1, 772, 514, 771, 515, 776, + -1, 246, 514, 859, 515, 776, -1, 444, 514, 771, + 515, 776, -1, 3, 516, 3, -1, 775, 516, 3, + -1, 776, 512, 513, -1, 776, 512, 899, 513, -1, + -1, 779, -1, 781, -1, 783, -1, 787, -1, 793, + -1, 794, 808, -1, 794, 514, 899, 515, -1, 781, + -1, 784, -1, 788, -1, 793, -1, 902, 780, -1, + 514, 856, 515, -1, -1, 215, -1, 216, -1, 394, + -1, 54, -1, 339, -1, 164, 782, -1, 136, 324, + -1, 115, 780, -1, 112, 780, -1, 282, 780, -1, + 57, -1, 514, 899, 515, -1, -1, 785, -1, 786, + -1, 785, -1, 786, -1, 56, 792, 514, 855, 515, + -1, 56, 792, -1, 789, -1, 790, -1, 789, -1, + 790, -1, 791, 514, 899, 515, -1, 791, -1, 72, + 792, -1, 71, 792, -1, 461, -1, 267, 72, 792, + -1, 267, 71, 792, -1, 269, 792, -1, 463, -1, + -1, 427, 514, 899, 515, 795, -1, 427, 795, -1, + 426, 514, 899, 515, 795, -1, 426, 795, -1, 218, + -1, 500, 426, 497, -1, 478, 426, 497, -1, -1, + 494, -1, 495, -1, 262, -1, 263, -1, 109, -1, + 110, -1, 188, -1, 189, -1, 258, -1, 259, -1, + 375, -1, 376, -1, 256, -1, 257, -1, 252, -1, + 253, -1, 470, -1, 471, -1, 113, -1, 114, -1, + 69, -1, 68, -1, 255, -1, 254, -1, 796, -1, + 797, -1, 798, -1, 799, -1, 800, -1, 801, -1, + 802, -1, 803, -1, 804, -1, 805, -1, 806, -1, + 807, -1, 796, 428, 797, -1, 798, 428, 799, -1, + 798, 428, 800, -1, 798, 428, 801, -1, 799, 428, + 800, -1, 799, 428, 801, -1, 800, 428, 801, -1, + -1, 811, -1, 809, 11, 774, -1, 809, 80, 903, + -1, 809, 46, 426, 497, 809, -1, 505, 809, -1, + 506, 809, -1, 809, 505, 809, -1, 809, 506, 809, + -1, 809, 507, 809, -1, 809, 508, 809, -1, 809, + 15, 809, -1, 809, 509, 809, -1, 809, 510, 809, + -1, 809, 16, 809, -1, 809, 501, 809, -1, 809, + 502, 809, -1, 809, 503, 809, -1, 809, 19, 809, + -1, 809, 20, 809, -1, 809, 21, 809, -1, 809, + 848, 809, -1, 848, 809, -1, 809, 848, -1, 809, + 36, 809, -1, 809, 294, 809, -1, 274, 809, -1, + 498, 809, -1, 809, 176, 809, -1, 809, 236, 809, + -1, 809, 236, 809, 145, 809, -1, 809, 498, 236, + 809, -1, 809, 498, 236, 809, 145, 809, -1, 809, + 193, 809, -1, 809, 193, 809, 145, 809, -1, 809, + 498, 193, 809, -1, 809, 498, 193, 809, 145, 809, + -1, 809, 391, 428, 809, -1, 809, 391, 428, 809, + 145, 809, -1, 809, 498, 391, 428, 809, -1, 809, + 498, 391, 428, 809, 145, 809, -1, 809, 221, 279, + -1, 809, 222, -1, 809, 221, 274, 279, -1, 809, + 274, 279, -1, 809, 277, -1, 809, 17, 809, -1, + 809, 18, 809, -1, 837, 301, 837, -1, 809, 221, + 435, -1, 809, 221, 274, 435, -1, 809, 221, 159, + -1, 809, 221, 274, 159, -1, 809, 221, 446, -1, + 809, 221, 274, 446, -1, 809, 221, 132, 171, 809, + -1, 809, 221, 274, 132, 171, 809, -1, 809, 221, + 284, 514, 859, 515, -1, 809, 221, 274, 284, 514, + 859, 515, -1, 809, 53, 881, 810, 36, 809, -1, + 809, 498, 53, 881, 810, 36, 809, -1, 809, 53, + 413, 810, 36, 809, -1, 809, 498, 53, 413, 810, + 36, 809, -1, 809, 198, 869, -1, 809, 498, 198, + 869, -1, 809, 850, 845, 675, -1, 809, 850, 845, + 514, 809, 515, -1, 117, -1, 83, 514, 809, 515, + -1, 507, 887, 891, -1, 542, 516, 507, 887, 891, + -1, 811, -1, 810, 11, 774, -1, 505, 810, -1, + 506, 810, -1, 810, 505, 810, -1, 810, 506, 810, + -1, 810, 507, 810, -1, 810, 508, 810, -1, 810, + 15, 810, -1, 810, 509, 810, -1, 810, 510, 810, + -1, 810, 16, 810, -1, 810, 501, 810, -1, 810, + 502, 810, -1, 810, 503, 810, -1, 810, 19, 810, + -1, 810, 20, 810, -1, 810, 21, 810, -1, 810, + 848, 810, -1, 848, 810, -1, 810, 848, -1, 810, + 221, 132, 171, 810, -1, 810, 221, 274, 132, 171, + 810, -1, 810, 221, 284, 514, 859, 515, -1, 810, + 221, 274, 284, 514, 859, 515, -1, 812, -1, 813, + 880, -1, 875, -1, 898, -1, 675, -1, 675, 545, + -1, 152, 675, -1, 729, 514, 855, 515, -1, 514, + 809, 515, -1, 814, -1, 837, -1, 519, -1, 10, + -1, 816, -1, 246, 520, 844, 521, -1, 818, -1, + 870, -1, 815, -1, 821, -1, 39, 675, -1, 39, + 512, 856, 513, -1, 522, 9, -1, 523, 548, -1, + 512, 856, 513, -1, 520, 840, 521, -1, 897, 514, + 515, -1, 897, 514, 857, 698, 697, 515, -1, 897, + 514, 462, 858, 698, 697, 515, -1, 897, 514, 857, + 518, 462, 858, 698, 697, 515, -1, 897, 514, 30, + 857, 698, 697, 515, -1, 897, 514, 132, 857, 698, + 697, 515, -1, 817, 822, 823, 824, 828, -1, 820, + -1, 817, -1, 820, -1, 81, 166, 514, 809, 515, + -1, 66, 514, 809, 40, 774, 515, -1, 438, 514, + 809, 40, 774, 515, -1, 158, 514, 860, 515, -1, + 302, 514, 862, 515, -1, 320, 514, 864, 515, -1, + 411, 514, 865, 515, -1, 432, 514, 809, 40, 774, + 515, -1, 434, 514, 58, 868, 515, -1, 434, 514, + 232, 868, 515, -1, 434, 514, 429, 868, 515, -1, + 434, 514, 868, 515, -1, 280, 514, 809, 518, 809, + 515, -1, 79, 514, 855, 515, -1, 512, 809, 166, + 542, 198, 809, 513, -1, 512, 809, 166, 542, 198, + 811, 191, 809, 513, -1, 477, 180, 514, 699, 515, + -1, -1, 162, 514, 473, 809, 515, -1, 162, 514, + 809, 515, -1, -1, 155, -1, -1, 475, 826, -1, + -1, 827, -1, 826, 518, 827, -1, 542, 40, 829, + -1, 300, 829, -1, 300, 542, -1, -1, 514, 830, + 831, 698, 832, 515, -1, 542, -1, -1, 309, 59, + 854, -1, -1, 337, 833, 835, -1, 366, 833, 835, + -1, 183, 833, 835, -1, -1, 834, -1, 53, 834, + 36, 834, -1, 441, 323, -1, 441, 165, -1, 104, + 365, -1, 809, 323, -1, 809, 165, -1, 148, 104, + 365, -1, 148, 180, -1, 148, 425, -1, 148, 272, + 297, -1, -1, 365, 514, 855, 515, -1, 365, 514, + 515, -1, 836, -1, 514, 854, 518, 809, 515, -1, + 543, 524, 809, -1, 838, -1, 839, 518, 838, -1, + 839, -1, 839, 518, -1, 809, 524, 809, -1, 841, + -1, 842, 518, 841, -1, 842, -1, 842, 518, -1, + 843, -1, -1, 38, -1, 396, -1, 30, -1, 8, + -1, 847, -1, 505, -1, 506, -1, 507, -1, 508, + -1, 15, -1, 509, -1, 510, -1, 16, -1, 501, + -1, 502, -1, 503, -1, 19, -1, 20, -1, 21, + -1, 8, -1, 291, 514, 851, 515, -1, 846, -1, + 291, 514, 851, 515, -1, 846, -1, 291, 514, 851, + 515, -1, 236, -1, 498, 236, -1, 176, -1, 498, + 176, -1, 193, -1, 498, 193, -1, 846, -1, 542, + 516, 851, -1, 811, -1, 852, 518, 811, -1, 852, + -1, 852, 518, -1, 809, -1, 854, 518, 809, -1, + 854, -1, 854, 518, -1, 855, -1, -1, 858, -1, + 857, 518, 858, -1, 809, -1, 906, 13, 809, -1, + 906, 14, 809, -1, 774, -1, 859, 518, 774, -1, + 861, 171, 809, -1, -1, 3, -1, 796, -1, 797, + -1, 798, -1, 799, -1, 800, -1, 801, -1, 802, + -1, 803, -1, 804, -1, 805, -1, 806, -1, 807, + -1, 544, -1, 809, 863, 866, 867, -1, 809, 863, + 866, -1, 317, 809, -1, 810, 198, 810, -1, -1, + 809, 866, 867, -1, 809, 867, 866, -1, 809, 866, + -1, 809, 867, -1, 854, -1, -1, 171, 809, -1, + 166, 809, -1, 809, 171, 855, -1, 171, 855, -1, + 855, -1, 675, -1, 514, 855, 515, -1, 65, 874, + 871, 873, 143, -1, 872, -1, 871, 872, -1, 472, + 809, 424, 809, -1, 139, 809, -1, -1, 809, -1, + -1, 542, -1, 542, 545, -1, 512, 809, 513, -1, + 512, 876, 524, 876, 513, -1, 512, 876, 524, 876, + 524, 876, 513, -1, 512, 876, 524, 506, 524, 876, + 513, -1, 809, -1, -1, -1, 877, 546, -1, -1, + 514, 515, -1, 514, 857, 515, -1, 516, 547, 878, + -1, 512, 809, 513, -1, 512, 876, 524, 876, 513, + -1, 512, 876, 524, 876, 524, 876, 513, -1, 512, + 876, 524, 506, 524, 876, 513, -1, -1, 880, 879, + -1, 45, -1, -1, 884, -1, -1, 885, -1, 883, + 518, 885, -1, 883, -1, 883, 518, -1, 809, 40, + 907, -1, 809, 3, -1, 809, -1, 148, 514, 894, + 515, -1, 148, 542, -1, 886, -1, -1, 809, 40, + 542, -1, 888, -1, 889, 518, 888, -1, 889, -1, + 889, 518, -1, 352, 514, 890, 515, -1, 352, 888, + -1, -1, 541, -1, 892, 518, 541, -1, 896, -1, + 893, 518, 896, -1, 893, -1, 893, 518, -1, 894, + -1, 514, 894, 515, -1, 543, -1, 901, -1, 542, + 545, -1, 899, -1, 4, -1, 544, 877, -1, 6, + -1, 7, -1, 897, 544, -1, 897, 514, 857, 698, + 697, 515, 544, -1, 778, 544, -1, 794, 514, 809, + 515, 808, -1, 794, 899, 808, -1, 794, 544, 808, + -1, 435, -1, 159, -1, 279, -1, 9, -1, 3, + -1, 978, -1, 983, -1, 3, -1, 978, -1, 980, + -1, 3, -1, 978, -1, 981, -1, 542, -1, 542, + 904, -1, 516, 547, -1, 904, 516, 547, -1, 514, + 894, 515, -1, -1, 900, -1, 548, -1, 5, -1, + 325, 896, 909, 40, 910, -1, 514, 859, 515, -1, + -1, 674, -1, 551, -1, 655, -1, 656, -1, 954, + -1, 966, -1, 100, 370, 541, 912, -1, 100, 370, + 191, 274, 152, 541, 912, -1, 100, 294, 352, 370, + 541, 912, -1, 912, 913, -1, -1, 598, -1, 914, + -1, 576, -1, 973, -1, 100, 920, 202, 917, 918, + 289, 541, 916, 514, 570, 515, 919, 767, -1, 100, + 920, 202, 917, 191, 274, 152, 627, 289, 541, 916, + 514, 570, 515, 919, 767, -1, 542, -1, 454, 915, + -1, -1, 89, -1, -1, 627, -1, -1, 476, 613, + -1, -1, 445, -1, -1, 32, 416, 761, 386, 370, + 896, -1, 32, 416, 191, 152, 761, 386, 370, 896, + -1, 32, 381, 541, 386, 370, 896, -1, 32, 381, + 191, 152, 541, 386, 370, 896, -1, 32, 466, 541, + 386, 370, 896, -1, 32, 466, 191, 152, 541, 386, + 370, 896, -1, 167, 75, 923, -1, 75, 923, -1, + 542, -1, -1, 84, 289, 926, 541, 221, 925, -1, + 84, 289, 82, 809, 221, 925, -1, 544, -1, 279, + -1, 416, -1, 381, -1, 173, -1, 245, -1, 245, + 416, -1, 466, -1, 108, -1, 202, -1, 370, -1, + 439, -1, 154, 108, 544, 664, -1, 154, 108, 542, + 428, 544, 664, -1, 197, 108, 544, -1, 153, 932, + -1, 153, 936, 930, 932, -1, 153, 464, 932, -1, + 153, 514, 935, 515, 932, -1, 464, -1, -1, 937, + -1, 589, -1, -1, 921, -1, 586, -1, 529, -1, + 972, -1, 922, -1, 656, -1, 975, -1, 652, -1, + 911, -1, 576, -1, 598, -1, 572, -1, 540, -1, + 954, -1, 646, -1, 582, -1, 914, -1, 551, -1, + 946, -1, 575, -1, 908, -1, 549, -1, 674, -1, + 595, -1, 655, -1, 949, -1, 963, -1, 940, -1, + 966, -1, 973, -1, 3, -1, 978, -1, 982, -1, + 933, -1, 544, -1, 938, -1, 935, 518, 938, -1, + 35, -1, 34, -1, 435, -1, 159, -1, 289, -1, + 934, -1, 939, 931, -1, 933, -1, 936, -1, 386, + 941, -1, 386, 240, 941, -1, 386, 385, 941, -1, + 386, 177, 941, -1, 942, -1, 970, 171, 104, -1, + 426, 497, 944, -1, 370, 544, -1, 970, 428, 945, + -1, 970, 503, 945, -1, 809, -1, 544, -1, 3, + -1, 794, 544, 808, -1, 794, 514, 899, 515, 544, + -1, 589, -1, 117, -1, 240, -1, 943, -1, 945, + 518, 943, -1, 239, 947, -1, 213, 947, -1, 167, + 213, 947, -1, 213, 947, 171, 948, -1, 167, 213, + 947, 171, 948, -1, 544, -1, 542, -1, 544, -1, + 542, -1, 455, 951, 953, 930, -1, 455, 951, 953, + 930, 541, 905, -1, 455, 951, 953, 930, 958, -1, + 455, 514, 952, 515, -1, 455, 514, 952, 515, 541, + 905, -1, 936, -1, 464, -1, 170, -1, 172, -1, + 3, -1, 172, -1, -1, 950, -1, 952, 518, 950, + -1, 170, -1, -1, 556, 122, 171, 955, 957, 956, + 562, -1, 436, 692, 955, -1, 761, -1, 761, 542, + -1, 761, 40, 542, -1, 473, 809, -1, -1, 454, + 743, -1, -1, 936, 930, -1, 936, 930, 541, 905, + -1, 47, 961, 544, 962, 664, -1, 47, 191, 274, + 152, 961, 544, 962, 664, -1, 128, 548, -1, 128, + 108, 548, -1, 128, 108, 191, 152, 548, -1, 108, + -1, -1, 40, 542, -1, -1, 354, 965, -1, 354, + 240, 965, -1, 354, 385, 965, -1, 354, 177, 965, + -1, 970, -1, 30, -1, 964, -1, 426, 497, -1, + 430, 223, 235, -1, 968, 674, -1, 412, 674, -1, + 412, 971, -1, 968, 971, -1, 968, 426, 497, -1, + 968, 430, 223, 235, -1, 968, 30, 969, -1, 968, + -1, 127, -1, 126, -1, 390, -1, 967, -1, 417, + -1, -1, 542, -1, 970, 516, 542, -1, 542, -1, + 971, 516, 542, -1, 61, 817, -1, 100, 644, 466, + 541, 633, 919, 40, 674, 974, -1, 100, 644, 466, + 191, 274, 152, 541, 633, 919, 40, 674, 974, -1, + 100, 294, 352, 644, 466, 541, 633, 919, 40, 674, + 974, -1, 100, 644, 342, 466, 541, 514, 637, 515, + 919, 40, 674, 974, -1, 100, 294, 352, 644, 342, + 466, 541, 514, 637, 515, 919, 40, 674, 974, -1, + 476, 74, 292, -1, 476, 64, 74, 292, -1, 476, + 240, 74, 292, -1, -1, 100, 644, 416, 977, 40, + 674, 976, -1, 100, 644, 416, 191, 274, 152, 977, + 40, 674, 976, -1, 100, 294, 352, 644, 416, 977, + 40, 674, 976, -1, 476, 107, -1, 476, 272, 107, + -1, -1, 541, 633, 620, 612, -1, 22, -1, 23, + -1, 24, -1, 25, -1, 26, -1, 27, -1, 28, + -1, 29, -1, 31, -1, 32, -1, 33, -1, 43, + -1, 44, -1, 46, -1, 47, -1, 48, -1, 50, + -1, 51, -1, 52, -1, 59, -1, 60, -1, 61, + -1, 62, -1, 63, -1, 64, -1, 67, -1, 68, + -1, 69, -1, 70, -1, 73, -1, 75, -1, 76, + -1, 77, -1, 78, -1, 84, -1, 85, -1, 86, + -1, 87, -1, 88, -1, 90, -1, 91, -1, 92, + -1, 94, -1, 95, -1, 96, -1, 97, -1, 98, + -1, 99, -1, 102, -1, 103, -1, 104, -1, 105, + -1, 106, -1, 107, -1, 108, -1, 109, -1, 110, + -1, 111, -1, 113, -1, 114, -1, 116, -1, 118, + -1, 120, -1, 121, -1, 122, -1, 123, -1, 124, + -1, 125, -1, 128, -1, 129, -1, 130, -1, 131, + -1, 134, -1, 135, -1, 136, -1, 137, -1, 138, + -1, 140, -1, 141, -1, 142, -1, 144, -1, 145, + -1, 146, -1, 148, -1, 149, -1, 150, -1, 151, + -1, 153, -1, 154, -1, 155, -1, 156, -1, 157, + -1, 160, -1, 162, -1, 163, -1, 165, -1, 167, + -1, 169, -1, 173, -1, 174, -1, 177, -1, 179, + -1, 183, -1, 184, -1, 186, -1, 187, -1, 188, + -1, 189, -1, 190, -1, 191, -1, 192, -1, 194, + -1, 195, -1, 196, -1, 197, -1, 199, -1, 200, + -1, 201, -1, 202, -1, 203, -1, 204, -1, 205, + -1, 207, -1, 210, -1, 211, -1, 212, -1, 213, + -1, 214, -1, 220, -1, 223, -1, 225, -1, 226, + -1, 227, -1, 228, -1, 229, -1, 230, -1, 233, + -1, 235, -1, 238, -1, 239, -1, 240, -1, 241, + -1, 242, -1, 243, -1, 244, -1, 245, -1, 247, + -1, 248, -1, 249, -1, 250, -1, 251, -1, 252, + -1, 253, -1, 254, -1, 255, -1, 256, -1, 257, + -1, 258, -1, 259, -1, 260, -1, 261, -1, 262, + -1, 263, -1, 264, -1, 265, -1, 266, -1, 270, + -1, 271, -1, 272, -1, 275, -1, 276, -1, 278, + -1, 281, -1, 283, -1, 284, -1, 285, -1, 287, + -1, 288, -1, 291, -1, 292, -1, 293, -1, 296, + -1, 297, -1, 300, -1, 303, -1, 304, -1, 305, + -1, 306, -1, 307, -1, 308, -1, 309, -1, 310, + -1, 311, -1, 312, -1, 313, -1, 318, -1, 319, + -1, 322, -1, 323, -1, 325, -1, 326, -1, 327, + -1, 329, -1, 330, -1, 331, -1, 332, -1, 333, + -1, 334, -1, 336, -1, 337, -1, 338, -1, 340, + -1, 341, -1, 342, -1, 343, -1, 345, -1, 346, + -1, 347, -1, 348, -1, 349, -1, 350, -1, 351, + -1, 352, -1, 353, -1, 354, -1, 355, -1, 356, + -1, 357, -1, 359, -1, 360, -1, 362, -1, 363, + -1, 364, -1, 366, -1, 367, -1, 368, -1, 369, + -1, 370, -1, 371, -1, 372, -1, 373, -1, 374, + -1, 375, -1, 376, -1, 377, -1, 378, -1, 381, + -1, 382, -1, 383, -1, 384, -1, 385, -1, 386, + -1, 388, -1, 389, -1, 392, -1, 393, -1, 395, + -1, 397, -1, 398, -1, 399, -1, 400, -1, 401, + -1, 402, -1, 403, -1, 404, -1, 405, -1, 406, + -1, 407, -1, 408, -1, 410, -1, 414, -1, 415, + -1, 417, -1, 419, -1, 420, -1, 421, -1, 422, + -1, 423, -1, 425, -1, 430, -1, 431, -1, 433, + -1, 436, -1, 437, -1, 439, -1, 440, -1, 441, + -1, 442, -1, 443, -1, 446, -1, 447, -1, 448, + -1, 450, -1, 451, -1, 452, -1, 453, -1, 455, + -1, 456, -1, 457, -1, 458, -1, 459, -1, 463, + -1, 465, -1, 466, -1, 467, -1, 468, -1, 469, + -1, 470, -1, 471, -1, 474, -1, 477, -1, 478, + -1, 479, -1, 480, -1, 481, -1, 482, -1, 494, + -1, 495, -1, 496, -1, 497, -1, 53, -1, 54, + -1, 56, -1, 57, -1, 71, -1, 72, -1, 79, + -1, 83, -1, 112, -1, 115, -1, 152, -1, 158, + -1, 164, -1, 175, -1, 181, -1, 182, -1, 209, + -1, 215, -1, 216, -1, 218, -1, 246, -1, 267, + -1, 269, -1, 273, -1, 280, -1, 282, -1, 298, + -1, 302, -1, 320, -1, 324, -1, 339, -1, 365, + -1, 387, -1, 394, -1, 409, -1, 411, -1, 426, + -1, 427, -1, 432, -1, 434, -1, 438, -1, 460, + -1, 461, -1, 483, -1, 484, -1, 485, -1, 486, + -1, 487, -1, 488, -1, 489, -1, 490, -1, 491, + -1, 492, -1, 493, -1, 42, -1, 49, -1, 55, + -1, 81, -1, 89, -1, 101, -1, 170, -1, 172, + -1, 175, -1, 176, -1, 193, -1, 208, -1, 221, + -1, 222, -1, 224, -1, 234, -1, 236, -1, 246, + -1, 268, -1, 277, -1, 299, -1, 301, -1, 321, + -1, 361, -1, 391, -1, 409, -1, 418, -1, 464, + -1, 37, -1, 42, -1, 49, -1, 55, -1, 81, + -1, 83, -1, 89, -1, 101, -1, 170, -1, 172, + -1, 176, -1, 193, -1, 208, -1, 221, -1, 222, + -1, 224, -1, 234, -1, 236, -1, 268, -1, 277, + -1, 299, -1, 301, -1, 321, -1, 361, -1, 380, + -1, 391, -1, 418, -1, 438, -1, 464, -1, 37, + -1, 42, -1, 49, -1, 53, -1, 54, -1, 55, + -1, 56, -1, 57, -1, 72, -1, 71, -1, 79, + -1, 81, -1, 83, -1, 89, -1, 101, -1, 112, + -1, 115, -1, 152, -1, 158, -1, 164, -1, 170, + -1, 172, -1, 175, -1, 176, -1, 181, -1, 182, + -1, 193, -1, 208, -1, 209, -1, 216, -1, 218, + -1, 215, -1, 221, -1, 222, -1, 224, -1, 234, + -1, 236, -1, 246, -1, 267, -1, 268, -1, 269, + -1, 273, -1, 277, -1, 280, -1, 282, -1, 299, + -1, 298, -1, 301, -1, 302, -1, 320, -1, 321, + -1, 324, -1, 339, -1, 361, -1, 365, -1, 380, + -1, 387, -1, 391, -1, 394, -1, 409, -1, 411, + -1, 418, -1, 426, -1, 427, -1, 432, -1, 434, + -1, 438, -1, 460, -1, 461, -1, 464, -1, 483, -1, 484, -1, 485, -1, 486, -1, 487, -1, 488, -1, 489, -1, 490, -1, 491, -1, 492, -1, 493, - -1, 42, -1, 49, -1, 55, -1, 81, -1, 89, - -1, 101, -1, 170, -1, 172, -1, 175, -1, 176, - -1, 193, -1, 208, -1, 221, -1, 222, -1, 224, - -1, 234, -1, 236, -1, 246, -1, 268, -1, 277, - -1, 299, -1, 301, -1, 321, -1, 361, -1, 391, - -1, 409, -1, 418, -1, 464, -1, 37, -1, 42, - -1, 49, -1, 55, -1, 81, -1, 83, -1, 89, - -1, 101, -1, 170, -1, 172, -1, 176, -1, 193, - -1, 208, -1, 221, -1, 222, -1, 224, -1, 234, - -1, 236, -1, 268, -1, 277, -1, 299, -1, 301, - -1, 321, -1, 361, -1, 380, -1, 391, -1, 418, - -1, 438, -1, 464, -1, 37, -1, 42, -1, 49, - -1, 53, -1, 54, -1, 55, -1, 56, -1, 57, - -1, 72, -1, 71, -1, 79, -1, 81, -1, 83, - -1, 89, -1, 101, -1, 112, -1, 115, -1, 152, - -1, 158, -1, 164, -1, 170, -1, 172, -1, 175, - -1, 176, -1, 181, -1, 182, -1, 193, -1, 208, - -1, 209, -1, 216, -1, 218, -1, 215, -1, 221, + -1, 37, -1, 42, -1, 49, -1, 55, -1, 81, + -1, 83, -1, 89, -1, 101, -1, 170, -1, 172, + -1, 175, -1, 176, -1, 193, -1, 208, -1, 221, -1, 222, -1, 224, -1, 234, -1, 236, -1, 246, - -1, 267, -1, 268, -1, 269, -1, 273, -1, 277, - -1, 280, -1, 282, -1, 299, -1, 298, -1, 301, - -1, 302, -1, 320, -1, 321, -1, 324, -1, 339, - -1, 361, -1, 365, -1, 380, -1, 387, -1, 391, - -1, 394, -1, 409, -1, 411, -1, 418, -1, 426, - -1, 427, -1, 432, -1, 434, -1, 438, -1, 460, - -1, 461, -1, 464, -1, 483, -1, 484, -1, 485, - -1, 486, -1, 487, -1, 488, -1, 489, -1, 490, - -1, 491, -1, 492, -1, 493, -1, 37, -1, 42, - -1, 49, -1, 55, -1, 81, -1, 83, -1, 89, - -1, 101, -1, 170, -1, 172, -1, 175, -1, 176, - -1, 193, -1, 208, -1, 221, -1, 222, -1, 224, - -1, 234, -1, 236, -1, 246, -1, 268, -1, 277, - -1, 299, -1, 301, -1, 321, -1, 361, -1, 380, - -1, 391, -1, 409, -1, 418, -1, 438, -1, 464, - -1, 30, -1, 34, -1, 35, -1, 36, -1, 38, - -1, 39, -1, 40, -1, 41, -1, 45, -1, 58, - -1, 65, -1, 66, -1, 74, -1, 80, -1, 82, - -1, 93, -1, 100, -1, 117, -1, 119, -1, 126, - -1, 127, -1, 132, -1, 133, -1, 139, -1, 143, - -1, 147, -1, 159, -1, 161, -1, 166, -1, 168, - -1, 171, -1, 178, -1, 180, -1, 185, -1, 198, - -1, 206, -1, 217, -1, 219, -1, 231, -1, 232, - -1, 237, -1, 274, -1, 279, -1, 286, -1, 289, - -1, 290, -1, 294, -1, 295, -1, 314, -1, 315, - -1, 316, -1, 317, -1, 328, -1, 335, -1, 344, - -1, 358, -1, 379, -1, 390, -1, 396, -1, 412, - -1, 413, -1, 416, -1, 424, -1, 428, -1, 429, - -1, 435, -1, 444, -1, 445, -1, 449, -1, 454, - -1, 462, -1, 472, -1, 473, -1, 475, -1, 476, - -1 + -1, 268, -1, 277, -1, 299, -1, 301, -1, 321, + -1, 361, -1, 380, -1, 391, -1, 409, -1, 418, + -1, 438, -1, 464, -1, 30, -1, 34, -1, 35, + -1, 36, -1, 38, -1, 39, -1, 40, -1, 41, + -1, 45, -1, 58, -1, 65, -1, 66, -1, 74, + -1, 80, -1, 82, -1, 93, -1, 100, -1, 117, + -1, 119, -1, 126, -1, 127, -1, 132, -1, 133, + -1, 139, -1, 143, -1, 147, -1, 159, -1, 161, + -1, 166, -1, 168, -1, 171, -1, 178, -1, 180, + -1, 185, -1, 198, -1, 206, -1, 217, -1, 219, + -1, 231, -1, 232, -1, 237, -1, 274, -1, 279, + -1, 286, -1, 289, -1, 290, -1, 294, -1, 295, + -1, 314, -1, 315, -1, 316, -1, 317, -1, 328, + -1, 335, -1, 344, -1, 358, -1, 379, -1, 390, + -1, 396, -1, 412, -1, 413, -1, 416, -1, 424, + -1, 428, -1, 429, -1, 435, -1, 444, -1, 445, + -1, 449, -1, 454, -1, 462, -1, 472, -1, 473, + -1, 475, -1, 476, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 500, 500, 516, 528, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 575, 576, 578, 9, 18, 27, 36, + 0, 502, 502, 518, 530, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 580, 9, 18, 27, 36, 45, 54, 63, 72, 85, 87, 93, 94, 99, 103, 107, 118, 126, 130, 139, 148, 157, 166, 175, 184, 192, 200, 209, 218, 227, 236, 253, 262, 271, 280, @@ -2570,110 +2572,110 @@ static const yytype_uint16 yyrline[] = 119, 120, 8, 20, 33, 46, 58, 70, 86, 87, 91, 95, 7, 1, 30, 49, 61, 62, 63, 67, 68, 73, 77, 82, 86, 94, 95, 99, 100, 105, - 106, 110, 111, 116, 117, 118, 119, 120, 121, 126, - 134, 138, 143, 144, 149, 153, 158, 162, 166, 170, - 174, 178, 182, 186, 190, 194, 198, 202, 206, 210, - 214, 218, 226, 231, 232, 233, 234, 235, 241, 245, - 47, 48, 52, 53, 54, 72, 73, 80, 88, 96, - 104, 112, 120, 131, 132, 159, 164, 172, 188, 205, - 222, 239, 240, 259, 263, 267, 271, 275, 285, 296, - 306, 315, 326, 337, 349, 364, 382, 382, 386, 386, - 390, 390, 394, 400, 407, 411, 412, 416, 417, 431, - 438, 445, 455, 456, 459, 472, 473, 474, 478, 489, - 497, 502, 507, 512, 517, 525, 533, 538, 543, 550, - 551, 555, 556, 557, 561, 568, 569, 573, 574, 578, - 579, 580, 584, 585, 589, 590, 606, 607, 610, 619, - 630, 631, 632, 635, 636, 637, 641, 642, 643, 644, - 648, 649, 653, 655, 671, 673, 678, 681, 689, 693, - 697, 701, 705, 709, 716, 721, 728, 729, 733, 738, - 742, 746, 754, 761, 762, 767, 768, 772, 773, 778, - 780, 782, 787, 807, 808, 810, 815, 816, 820, 821, - 824, 825, 850, 851, 856, 860, 861, 865, 866, 870, - 871, 872, 873, 874, 878, 891, 898, 905, 912, 913, - 917, 918, 922, 923, 927, 928, 932, 933, 937, 938, - 942, 953, 954, 955, 956, 960, 961, 966, 967, 968, - 977, 983, 992, 993, 1006, 1007, 1011, 1012, 1016, 1017, - 1023, 1029, 1037, 1046, 1054, 1063, 1072, 1076, 1081, 1092, - 1106, 1107, 1110, 1111, 1112, 1115, 1123, 1132, 1133, 1134, - 1135, 1138, 1146, 1155, 1159, 1166, 1167, 1171, 1180, 1184, - 1209, 1213, 1226, 1240, 1255, 1267, 1280, 1294, 1308, 1321, - 1336, 1355, 1361, 1366, 1372, 1379, 1380, 1388, 1392, 1396, - 1402, 1409, 1414, 1415, 1416, 1417, 1418, 1419, 1423, 1424, - 1436, 1437, 1442, 1449, 1456, 1463, 1495, 1506, 1519, 1524, - 1525, 1528, 1529, 1532, 1533, 1538, 1539, 1544, 1548, 1554, - 1575, 1583, 1596, 1599, 1603, 1603, 1606, 1607, 1609, 1614, - 1621, 1626, 1632, 1637, 1643, 1647, 1654, 1661, 1671, 1672, - 1676, 1678, 1681, 1685, 1686, 1687, 1688, 1689, 1690, 1695, - 1715, 1716, 1717, 1718, 1729, 1743, 1744, 1750, 1755, 1760, - 1765, 1770, 1775, 1780, 1785, 1791, 1797, 1803, 1810, 1832, - 1841, 1845, 1853, 1857, 1865, 1877, 1898, 1902, 1908, 1912, - 1925, 1933, 1943, 1945, 1947, 1949, 1951, 1953, 1958, 1959, - 1966, 1975, 1983, 1992, 2003, 2011, 2012, 2013, 2017, 2017, - 2020, 2020, 2023, 2023, 2026, 2026, 2029, 2029, 2032, 2032, - 2035, 2035, 2038, 2038, 2041, 2041, 2044, 2044, 2047, 2047, - 2050, 2050, 2053, 2055, 2057, 2059, 2061, 2063, 2065, 2067, - 2069, 2071, 2073, 2075, 2077, 2082, 2087, 2093, 2100, 2105, - 2111, 2117, 2148, 2150, 2152, 2160, 2175, 2177, 2179, 2181, - 2183, 2185, 2187, 2189, 2191, 2193, 2195, 2197, 2199, 2201, - 2203, 2205, 2208, 2210, 2212, 2215, 2217, 2219, 2221, 2223, - 2228, 2233, 2240, 2245, 2252, 2257, 2264, 2269, 2277, 2285, - 2293, 2301, 2319, 2327, 2335, 2343, 2351, 2359, 2367, 2371, - 2387, 2395, 2403, 2411, 2419, 2427, 2435, 2439, 2443, 2447, - 2451, 2459, 2467, 2475, 2483, 2503, 2525, 2536, 2543, 2557, - 2565, 2573, 2593, 2595, 2597, 2599, 2601, 2603, 2605, 2607, - 2609, 2611, 2613, 2615, 2617, 2619, 2621, 2623, 2625, 2627, - 2629, 2631, 2633, 2635, 2639, 2643, 2647, 2661, 2662, 2676, - 2677, 2678, 2689, 2713, 2724, 2734, 2738, 2742, 2749, 2753, - 2760, 2764, 2781, 2785, 2787, 2791, 2794, 2805, 2810, 2817, - 2825, 2834, 2838, 2845, 2853, 2861, 2872, 2892, 2928, 2939, - 2940, 2947, 2953, 2955, 2957, 2961, 2970, 2975, 2982, 2997, - 3004, 3008, 3012, 3016, 3020, 3030, 3039, 3061, 3062, 3066, - 3067, 3068, 3072, 3073, 3080, 3081, 3085, 3086, 3091, 3099, - 3101, 3115, 3118, 3145, 3146, 3149, 3150, 3158, 3166, 3174, - 3183, 3193, 3211, 3257, 3266, 3275, 3284, 3293, 3305, 3306, - 3307, 3308, 3309, 3323, 3324, 3327, 3328, 3332, 3342, 3343, - 3347, 3348, 3352, 3359, 3360, 3365, 3366, 3371, 3372, 3375, - 3376, 3377, 3380, 3381, 3384, 3385, 3386, 3387, 3388, 3389, - 3390, 3391, 3392, 3393, 3394, 3395, 3396, 3397, 3400, 3402, - 3407, 3409, 3414, 3416, 3418, 3420, 3422, 3424, 3426, 3428, - 3442, 3444, 3449, 3453, 3460, 3465, 3471, 3475, 3482, 3487, - 3494, 3499, 3507, 3511, 3517, 3521, 3530, 3541, 3542, 3546, - 3550, 3557, 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, - 3566, 3567, 3568, 3569, 3570, 3580, 3584, 3591, 3598, 3599, - 3615, 3619, 3624, 3628, 3643, 3648, 3652, 3655, 3658, 3659, - 3660, 3663, 3670, 3680, 3694, 3695, 3699, 3710, 3711, 3714, - 3715, 3718, 3722, 3729, 3737, 3745, 3753, 3763, 3764, 3769, - 3770, 3774, 3775, 3776, 3780, 3789, 3797, 3805, 3814, 3829, - 3830, 3835, 3836, 3846, 3847, 3851, 3852, 3856, 3857, 3860, - 3876, 3884, 3894, 3895, 3898, 3899, 3902, 3906, 3907, 3911, - 3912, 3915, 3916, 3917, 3927, 3928, 3932, 3934, 3940, 3941, - 3945, 3946, 3949, 3960, 3963, 3974, 3978, 3982, 3994, 3998, - 4007, 4014, 4052, 4056, 4060, 4064, 4068, 4072, 4076, 4082, - 4099, 4100, 4101, 4104, 4105, 4106, 4109, 4110, 4111, 4114, - 4115, 4118, 4120, 4125, 4126, 4129, 4133, 4134, 7, 18, - 19, 23, 24, 25, 26, 27, 28, 7, 26, 50, - 73, 80, 85, 86, 87, 88, 8, 33, 62, 66, - 67, 72, 73, 78, 79, 83, 84, 89, 90, 7, - 16, 25, 34, 43, 52, 5, 12, 22, 23, 7, - 15, 26, 27, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 7, 19, 33, 9, 16, 26, 33, - 44, 45, 50, 51, 52, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 90, 91, 92, 97, 98, - 103, 107, 115, 116, 121, 122, 123, 129, 134, 142, - 143, 10, 16, 22, 28, 38, 39, 47, 58, 70, - 78, 89, 95, 99, 103, 118, 125, 126, 127, 131, - 132, 7, 15, 22, 29, 36, 45, 46, 48, 49, - 8, 22, 36, 48, 56, 70, 71, 72, 73, 74, - 87, 88, 93, 94, 98, 99, 7, 18, 31, 35, - 42, 53, 54, 60, 61, 9, 19, 7, 16, 28, - 35, 42, 51, 52, 56, 57, 2, 7, 12, 17, - 26, 33, 43, 44, 51, 3, 10, 17, 24, 31, - 38, 45, 52, 61, 61, 63, 63, 65, 65, 67, - 68, 72, 73, 6, 8, 21, 34, 47, 65, 87, - 88, 89, 90, 11, 24, 37, 54, 55, 56, 61, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 106, 110, 111, 116, 117, 118, 119, 120, 121, 122, + 127, 135, 139, 144, 145, 150, 154, 159, 163, 167, + 171, 175, 179, 183, 187, 191, 195, 199, 203, 207, + 211, 215, 219, 227, 232, 233, 234, 235, 236, 242, + 246, 47, 48, 52, 53, 54, 72, 73, 80, 88, + 96, 104, 112, 120, 131, 132, 159, 164, 172, 188, + 205, 222, 239, 240, 259, 263, 267, 271, 275, 285, + 296, 306, 315, 326, 337, 349, 364, 382, 382, 386, + 386, 390, 390, 394, 400, 407, 411, 412, 416, 417, + 431, 438, 445, 455, 456, 459, 472, 473, 474, 478, + 489, 497, 502, 507, 512, 517, 525, 533, 538, 543, + 550, 551, 555, 556, 557, 561, 568, 569, 573, 574, + 578, 579, 580, 584, 585, 589, 590, 606, 607, 610, + 619, 630, 631, 632, 635, 636, 637, 641, 642, 643, + 644, 648, 649, 653, 655, 671, 673, 678, 681, 689, + 693, 697, 701, 705, 709, 716, 721, 728, 729, 733, + 738, 742, 746, 754, 761, 762, 767, 768, 772, 773, + 778, 780, 782, 787, 807, 808, 810, 815, 816, 820, + 821, 824, 825, 850, 851, 856, 860, 861, 865, 866, + 870, 871, 872, 873, 874, 878, 891, 898, 905, 912, + 913, 917, 918, 922, 923, 927, 928, 932, 933, 937, + 938, 942, 953, 954, 955, 956, 960, 961, 966, 967, + 968, 977, 983, 992, 993, 1006, 1007, 1011, 1012, 1016, + 1017, 1023, 1029, 1037, 1046, 1054, 1063, 1072, 1076, 1081, + 1092, 1106, 1107, 1110, 1111, 1112, 1115, 1123, 1132, 1133, + 1134, 1135, 1138, 1146, 1155, 1159, 1166, 1167, 1171, 1180, + 1184, 1209, 1213, 1226, 1240, 1255, 1267, 1280, 1294, 1308, + 1321, 1336, 1355, 1361, 1366, 1372, 1379, 1380, 1388, 1392, + 1396, 1402, 1409, 1414, 1415, 1416, 1417, 1418, 1419, 1423, + 1424, 1436, 1437, 1442, 1449, 1456, 1463, 1495, 1506, 1519, + 1524, 1525, 1528, 1529, 1532, 1533, 1538, 1539, 1544, 1548, + 1554, 1575, 1583, 1596, 1599, 1603, 1603, 1606, 1607, 1609, + 1614, 1621, 1626, 1632, 1637, 1643, 1647, 1654, 1661, 1671, + 1672, 1676, 1678, 1681, 1685, 1686, 1687, 1688, 1689, 1690, + 1695, 1715, 1716, 1717, 1718, 1729, 1743, 1744, 1750, 1755, + 1760, 1765, 1770, 1775, 1780, 1785, 1791, 1797, 1803, 1810, + 1832, 1841, 1845, 1853, 1857, 1865, 1877, 1898, 1902, 1908, + 1912, 1925, 1933, 1943, 1945, 1947, 1949, 1951, 1953, 1958, + 1959, 1966, 1975, 1983, 1992, 2003, 2011, 2012, 2013, 2017, + 2017, 2020, 2020, 2023, 2023, 2026, 2026, 2029, 2029, 2032, + 2032, 2035, 2035, 2038, 2038, 2041, 2041, 2044, 2044, 2047, + 2047, 2050, 2050, 2053, 2055, 2057, 2059, 2061, 2063, 2065, + 2067, 2069, 2071, 2073, 2075, 2077, 2082, 2087, 2093, 2100, + 2105, 2111, 2117, 2148, 2150, 2152, 2160, 2175, 2177, 2179, + 2181, 2183, 2185, 2187, 2189, 2191, 2193, 2195, 2197, 2199, + 2201, 2203, 2205, 2208, 2210, 2212, 2215, 2217, 2219, 2221, + 2223, 2228, 2233, 2240, 2245, 2252, 2257, 2264, 2269, 2277, + 2285, 2293, 2301, 2319, 2327, 2335, 2343, 2351, 2359, 2367, + 2371, 2387, 2395, 2403, 2411, 2419, 2427, 2435, 2439, 2443, + 2447, 2451, 2459, 2467, 2475, 2483, 2503, 2525, 2536, 2543, + 2557, 2565, 2573, 2593, 2595, 2597, 2599, 2601, 2603, 2605, + 2607, 2609, 2611, 2613, 2615, 2617, 2619, 2621, 2623, 2625, + 2627, 2629, 2631, 2633, 2635, 2639, 2643, 2647, 2661, 2662, + 2676, 2677, 2678, 2689, 2713, 2724, 2734, 2738, 2742, 2749, + 2753, 2760, 2764, 2781, 2785, 2787, 2790, 2793, 2804, 2809, + 2816, 2822, 2828, 2837, 2841, 2848, 2856, 2864, 2875, 2895, + 2931, 2942, 2943, 2950, 2956, 2958, 2960, 2964, 2973, 2978, + 2985, 3000, 3007, 3011, 3015, 3019, 3023, 3033, 3042, 3064, + 3065, 3069, 3070, 3071, 3075, 3076, 3083, 3084, 3088, 3089, + 3094, 3102, 3104, 3118, 3121, 3148, 3149, 3152, 3153, 3161, + 3169, 3177, 3186, 3196, 3214, 3260, 3269, 3278, 3287, 3296, + 3308, 3309, 3310, 3311, 3312, 3326, 3327, 3330, 3331, 3335, + 3345, 3346, 3350, 3351, 3355, 3362, 3363, 3368, 3369, 3374, + 3375, 3378, 3379, 3380, 3383, 3384, 3387, 3388, 3389, 3390, + 3391, 3392, 3393, 3394, 3395, 3396, 3397, 3398, 3399, 3400, + 3403, 3405, 3410, 3412, 3417, 3419, 3421, 3423, 3425, 3427, + 3429, 3431, 3445, 3447, 3452, 3456, 3463, 3468, 3474, 3478, + 3485, 3490, 3497, 3502, 3510, 3514, 3520, 3524, 3533, 3544, + 3545, 3549, 3553, 3560, 3561, 3562, 3563, 3564, 3565, 3566, + 3567, 3568, 3569, 3570, 3571, 3572, 3573, 3583, 3587, 3594, + 3601, 3602, 3618, 3622, 3627, 3631, 3646, 3651, 3655, 3658, + 3661, 3662, 3663, 3666, 3673, 3683, 3697, 3698, 3702, 3713, + 3714, 3717, 3718, 3721, 3725, 3732, 3740, 3748, 3756, 3766, + 3767, 3772, 3773, 3777, 3778, 3779, 3783, 3792, 3800, 3808, + 3817, 3832, 3833, 3838, 3839, 3849, 3850, 3854, 3855, 3859, + 3860, 3863, 3879, 3887, 3897, 3898, 3901, 3902, 3905, 3909, + 3910, 3914, 3915, 3918, 3919, 3920, 3930, 3931, 3935, 3937, + 3943, 3944, 3948, 3949, 3952, 3963, 3966, 3977, 3981, 3985, + 3997, 4001, 4010, 4017, 4055, 4059, 4063, 4067, 4071, 4075, + 4079, 4085, 4102, 4103, 4104, 4107, 4108, 4109, 4112, 4113, + 4114, 4117, 4118, 4121, 4123, 4128, 4129, 4132, 4136, 4137, + 7, 18, 19, 23, 24, 25, 26, 27, 28, 7, + 26, 50, 73, 80, 85, 86, 87, 88, 8, 33, + 62, 66, 67, 72, 73, 78, 79, 83, 84, 89, + 90, 7, 16, 25, 34, 43, 52, 5, 12, 22, + 23, 7, 15, 26, 27, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 7, 19, 33, 9, 16, + 26, 33, 44, 45, 50, 51, 52, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 90, 91, 92, + 97, 98, 103, 107, 115, 116, 121, 122, 123, 129, + 134, 142, 143, 10, 16, 22, 28, 38, 39, 47, + 58, 70, 78, 89, 95, 99, 103, 118, 125, 126, + 127, 131, 132, 7, 15, 22, 29, 36, 45, 46, + 48, 49, 8, 22, 36, 48, 56, 70, 71, 72, + 73, 74, 87, 88, 93, 94, 98, 99, 7, 18, + 31, 35, 42, 53, 54, 60, 61, 9, 19, 7, + 16, 28, 35, 42, 51, 52, 56, 57, 2, 7, + 12, 17, 26, 33, 43, 44, 51, 3, 10, 17, + 24, 31, 38, 45, 52, 61, 61, 63, 63, 65, + 65, 67, 68, 72, 73, 6, 8, 21, 34, 47, + 65, 87, 88, 89, 90, 11, 24, 37, 54, 55, + 56, 61, 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, @@ -2705,18 +2707,18 @@ static const yytype_uint16 yyrline[] = 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, 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, 76, 76, 76, 76, 76, 76, + 75, 75, 75, 75, 75, 75, 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, 77, 77, 77, 77, 77, 77, 77, 77, + 76, 76, 76, 76, 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, 78, 78, 78, 78, 78, 78, 78, 78, + 77, 77, 77, 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, @@ -2724,17 +2726,18 @@ static const yytype_uint16 yyrline[] = 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, 79, 79, 79, 79, 79, 79, 79, 79, + 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, + 79, 79, 79, 79, 79, 79, 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, 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, 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, 80, 80, 80, 80, 80 + 80 }; #endif @@ -2905,8 +2908,8 @@ static const char *const yytname[] = "millisecond_keyword", "microsecond_keyword", "week_keyword", "decade_keyword", "century_keyword", "millennium_keyword", "opt_interval", "a_expr", "b_expr", "c_expr", "d_expr", - "indirection_expr_or_a_expr", "indirection_expr", "struct_expr", - "func_application", "func_expr", "func_expr_windowless", + "indirection_expr_or_a_expr", "indirection_expr", "list_expr", + "struct_expr", "func_application", "func_expr", "func_expr_windowless", "func_expr_common_subexpr", "list_comprehension", "within_group_clause", "filter_clause", "export_clause", "window_clause", "window_definition_list", "window_definition", "over_clause", @@ -3068,171 +3071,172 @@ static const yytype_uint16 yyr1[] = 651, 651, 652, 652, 652, 652, 652, 652, 653, 653, 654, 654, 655, 656, 656, 656, 657, 657, 657, 658, 658, 659, 659, 660, 660, 661, 661, 662, 662, 663, - 663, 664, 664, 665, 665, 665, 665, 665, 665, 666, - 667, 667, 668, 668, 669, 669, 670, 670, 670, 670, + 663, 664, 664, 665, 665, 665, 665, 665, 665, 665, + 666, 667, 667, 668, 668, 669, 669, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 671, 672, 672, 672, 672, 672, 673, 673, - 674, 674, 675, 675, 675, 676, 676, 676, 676, 676, - 676, 676, 676, 677, 677, 678, 678, 679, 679, 679, + 670, 670, 670, 671, 672, 672, 672, 672, 672, 673, + 673, 674, 674, 675, 675, 675, 676, 676, 676, 676, + 676, 676, 676, 676, 677, 677, 678, 678, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, - 679, 679, 679, 679, 679, 679, 680, 680, 681, 681, - 682, 682, 683, 683, 683, 684, 684, 685, 685, 686, - 686, 686, 687, 687, 688, 689, 689, 689, 690, 690, - 691, 691, 691, 691, 691, 691, 691, 691, 691, 692, - 692, 693, 693, 693, 694, 695, 695, 696, 696, 697, - 697, 697, 698, 698, 699, 699, 700, 700, 701, 701, - 702, 702, 702, 703, 703, 703, 704, 704, 704, 704, - 705, 705, 706, 706, 706, 706, 707, 707, 708, 708, - 708, 708, 708, 708, 709, 709, 710, 710, 711, 711, - 711, 711, 712, 713, 713, 714, 714, 715, 715, 715, - 715, 715, 716, 717, 717, 717, 718, 718, 719, 719, - 720, 720, 721, 721, 721, 722, 722, 723, 723, 724, - 724, 724, 724, 724, 725, 726, 727, 728, 729, 729, - 730, 730, 731, 731, 732, 732, 733, 733, 734, 734, - 735, 736, 736, 736, 736, 737, 737, 738, 738, 738, - 739, 739, 740, 740, 741, 741, 742, 742, 743, 743, - 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, - 745, 745, 746, 746, 746, 747, 747, 748, 748, 748, - 748, 749, 749, 750, 750, 751, 751, 752, 753, 753, - 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, - 754, 755, 755, 755, 755, 756, 756, 757, 757, 757, - 757, 757, 758, 758, 758, 758, 758, 758, 759, 759, - 760, 760, 761, 761, 761, 761, 762, 762, 763, 764, - 764, 765, 765, 766, 766, 767, 767, 768, 768, 769, - 770, 770, 771, 771, 772, 772, 773, 773, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, 775, 775, - 776, 776, 776, 777, 777, 777, 777, 777, 777, 777, - 778, 778, 778, 778, 779, 780, 780, 781, 781, 781, - 781, 781, 781, 781, 781, 781, 781, 781, 782, 782, - 783, 783, 784, 784, 785, 786, 787, 787, 788, 788, - 789, 790, 791, 791, 791, 791, 791, 791, 792, 792, - 793, 793, 793, 793, 794, 795, 795, 795, 796, 796, - 797, 797, 798, 798, 799, 799, 800, 800, 801, 801, - 802, 802, 803, 803, 804, 804, 805, 805, 806, 806, - 807, 807, 808, 808, 808, 808, 808, 808, 808, 808, + 679, 679, 679, 679, 679, 679, 679, 680, 680, 681, + 681, 682, 682, 683, 683, 683, 684, 684, 685, 685, + 686, 686, 686, 687, 687, 688, 689, 689, 689, 690, + 690, 691, 691, 691, 691, 691, 691, 691, 691, 691, + 692, 692, 693, 693, 693, 694, 695, 695, 696, 696, + 697, 697, 697, 698, 698, 699, 699, 700, 700, 701, + 701, 702, 702, 702, 703, 703, 703, 704, 704, 704, + 704, 705, 705, 706, 706, 706, 706, 707, 707, 708, + 708, 708, 708, 708, 708, 709, 709, 710, 710, 711, + 711, 711, 711, 712, 713, 713, 714, 714, 715, 715, + 715, 715, 715, 716, 717, 717, 717, 718, 718, 719, + 719, 720, 720, 721, 721, 721, 722, 722, 723, 723, + 724, 724, 724, 724, 724, 725, 726, 727, 728, 729, + 729, 730, 730, 731, 731, 732, 732, 733, 733, 734, + 734, 735, 736, 736, 736, 736, 737, 737, 738, 738, + 738, 739, 739, 740, 740, 741, 741, 742, 742, 743, + 743, 744, 744, 744, 744, 744, 744, 744, 744, 744, + 744, 745, 745, 746, 746, 746, 747, 747, 748, 748, + 748, 748, 749, 749, 750, 750, 751, 751, 752, 753, + 753, 754, 754, 754, 754, 754, 754, 754, 754, 754, + 754, 754, 755, 755, 755, 755, 756, 756, 757, 757, + 757, 757, 757, 758, 758, 758, 758, 758, 758, 759, + 759, 760, 760, 761, 761, 761, 761, 762, 762, 763, + 764, 764, 765, 765, 766, 766, 767, 767, 768, 768, + 769, 770, 770, 771, 771, 772, 772, 773, 773, 774, + 774, 774, 774, 774, 774, 774, 774, 774, 774, 775, + 775, 776, 776, 776, 777, 777, 777, 777, 777, 777, + 777, 778, 778, 778, 778, 779, 780, 780, 781, 781, + 781, 781, 781, 781, 781, 781, 781, 781, 781, 782, + 782, 783, 783, 784, 784, 785, 786, 787, 787, 788, + 788, 789, 790, 791, 791, 791, 791, 791, 791, 792, + 792, 793, 793, 793, 793, 794, 795, 795, 795, 796, + 796, 797, 797, 798, 798, 799, 799, 800, 800, 801, + 801, 802, 802, 803, 803, 804, 804, 805, 805, 806, + 806, 807, 807, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, - 808, 808, 809, 809, 809, 809, 809, 809, 809, 809, + 808, 808, 808, 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, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, - 809, 809, 810, 810, 810, 810, 810, 810, 810, 810, + 809, 809, 809, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, - 810, 810, 810, 810, 810, 810, 810, 811, 811, 812, - 812, 812, 812, 812, 812, 813, 813, 813, 814, 814, + 810, 810, 810, 810, 810, 810, 810, 810, 811, 811, + 812, 812, 812, 812, 812, 812, 813, 813, 813, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, - 815, 816, 816, 816, 816, 816, 816, 817, 817, 818, - 818, 819, 819, 819, 819, 819, 819, 819, 819, 819, - 819, 819, 819, 819, 819, 820, 820, 821, 821, 822, - 822, 822, 823, 823, 824, 824, 825, 825, 826, 827, - 827, 827, 828, 829, 829, 830, 830, 831, 831, 831, - 831, 832, 832, 833, 833, 833, 833, 833, 834, 834, - 834, 834, 834, 835, 835, 836, 836, 837, 838, 838, - 839, 839, 840, 841, 841, 842, 842, 843, 843, 844, - 844, 844, 845, 845, 846, 846, 846, 846, 846, 846, - 846, 846, 846, 846, 846, 846, 846, 846, 847, 847, - 848, 848, 849, 849, 849, 849, 849, 849, 849, 849, + 814, 815, 816, 817, 817, 817, 817, 817, 817, 818, + 818, 819, 819, 820, 820, 820, 820, 820, 820, 820, + 820, 820, 820, 820, 820, 820, 820, 821, 821, 822, + 822, 823, 823, 823, 824, 824, 825, 825, 826, 826, + 827, 828, 828, 828, 829, 830, 830, 831, 831, 832, + 832, 832, 832, 833, 833, 834, 834, 834, 834, 834, + 835, 835, 835, 835, 835, 836, 836, 837, 837, 838, + 839, 839, 840, 840, 841, 842, 842, 843, 843, 844, + 844, 845, 845, 845, 846, 846, 847, 847, 847, 847, + 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, + 848, 848, 849, 849, 850, 850, 850, 850, 850, 850, 850, 850, 851, 851, 852, 852, 853, 853, 854, 854, - 855, 855, 856, 856, 857, 857, 857, 858, 858, 859, - 859, 860, 860, 860, 860, 860, 860, 860, 860, 860, - 860, 860, 860, 860, 860, 861, 861, 862, 863, 863, - 864, 864, 864, 864, 864, 864, 865, 866, 867, 867, - 867, 868, 868, 869, 870, 870, 871, 872, 872, 873, - 873, 874, 874, 546, 546, 546, 546, 875, 875, 876, - 876, 877, 877, 877, 878, 878, 878, 878, 878, 879, + 855, 855, 856, 856, 857, 857, 858, 858, 858, 859, + 859, 860, 860, 861, 861, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 861, 861, 862, 862, 863, + 864, 864, 865, 865, 865, 865, 865, 865, 866, 867, + 868, 868, 868, 869, 869, 870, 871, 871, 872, 873, + 873, 874, 874, 875, 875, 546, 546, 546, 546, 876, + 876, 877, 877, 878, 878, 878, 879, 879, 879, 879, 879, 880, 880, 881, 881, 882, 882, 883, 883, 884, - 884, 884, 885, 885, 886, 886, 887, 888, 888, 889, - 889, 890, 890, 890, 891, 891, 892, 892, 893, 893, - 894, 894, 895, 896, 896, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, 897, 898, - 899, 899, 899, 900, 900, 900, 901, 901, 901, 902, - 902, 903, 903, 904, 904, 905, 906, 906, 907, 908, - 908, 909, 909, 909, 909, 909, 909, 910, 910, 910, - 911, 911, 912, 912, 912, 912, 913, 913, 914, 915, + 884, 885, 885, 885, 886, 886, 887, 887, 888, 889, + 889, 890, 890, 891, 891, 891, 892, 892, 893, 893, + 894, 894, 895, 895, 896, 897, 897, 898, 898, 898, + 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, + 898, 899, 900, 900, 900, 901, 901, 901, 902, 902, + 902, 903, 903, 904, 904, 905, 905, 906, 907, 907, + 908, 909, 909, 910, 910, 910, 910, 910, 910, 911, + 911, 911, 912, 912, 913, 913, 913, 913, 914, 914, 915, 916, 916, 917, 917, 918, 918, 919, 919, 920, - 920, 920, 920, 920, 920, 921, 921, 922, 922, 923, - 923, 924, 924, 925, 925, 925, 925, 925, 925, 925, - 925, 925, 925, 926, 926, 927, 928, 928, 928, 928, - 929, 929, 930, 930, 930, 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, 932, 932, 932, 933, 933, - 934, 934, 935, 935, 936, 936, 936, 936, 937, 938, - 938, 939, 939, 939, 939, 940, 940, 940, 940, 941, - 941, 942, 943, 943, 943, 943, 943, 943, 943, 944, - 944, 945, 945, 945, 945, 945, 946, 946, 947, 947, - 948, 948, 948, 948, 948, 949, 949, 949, 949, 949, + 920, 921, 921, 921, 921, 921, 921, 922, 922, 923, + 923, 924, 924, 925, 925, 926, 926, 926, 926, 926, + 926, 926, 926, 926, 926, 927, 927, 928, 929, 929, + 929, 929, 930, 930, 931, 931, 931, 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, 933, 933, 933, + 934, 934, 935, 935, 936, 936, 937, 937, 937, 937, + 938, 939, 939, 940, 940, 940, 940, 941, 941, 941, + 941, 942, 942, 943, 944, 944, 944, 944, 944, 944, + 944, 945, 945, 946, 946, 946, 946, 946, 947, 947, + 948, 948, 949, 949, 949, 949, 949, 950, 950, 950, 950, 950, 951, 951, 952, 952, 953, 953, 954, 954, - 954, 955, 955, 956, 956, 957, 957, 958, 958, 959, - 959, 959, 960, 960, 961, 961, 962, 962, 962, 962, - 963, 963, 964, 964, 964, 965, 965, 965, 965, 965, - 965, 965, 965, 966, 966, 967, 967, 968, 968, 969, - 969, 970, 970, 971, 972, 972, 972, 972, 972, 973, - 973, 973, 973, 974, 974, 974, 975, 975, 975, 976, - 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, + 955, 955, 955, 956, 956, 957, 957, 958, 958, 959, + 959, 960, 960, 960, 961, 961, 962, 962, 963, 963, + 963, 963, 964, 964, 965, 965, 965, 966, 966, 966, + 966, 966, 966, 966, 966, 967, 967, 968, 968, 969, + 969, 970, 970, 971, 971, 972, 973, 973, 973, 973, + 973, 974, 974, 974, 974, 975, 975, 975, 976, 976, + 976, 977, 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, 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, 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, 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, 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, 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, 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, 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, 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, 978, 978, 978, 979, 979, 979, 979, 979, 979, + 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, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 980, 980, 980, 980, 980, 980, 980, 980, + 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, + 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, + 979, 979, 979, 979, 979, 979, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, - 980, 981, 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, + 980, 980, 980, 980, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, - 981, 981, 982, 982, 982, 982, 982, 982, 982, 982, + 981, 981, 981, 982, 982, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, + 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 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, - 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, 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, 983, 983, 983, 984, 984, 984, 984, + 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, + 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, + 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, + 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, + 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, + 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, + 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, + 984 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -3285,109 +3289,110 @@ static const yytype_uint8 yyr2[] = 1, 1, 8, 11, 10, 7, 10, 9, 1, 1, 2, 3, 8, 11, 9, 7, 0, 3, 3, 1, 1, 3, 0, 1, 3, 1, 0, 1, 0, 1, - 0, 1, 3, 1, 1, 1, 3, 1, 0, 2, - 2, 0, 2, 0, 1, 0, 1, 1, 1, 3, - 3, 1, 1, 3, 3, 3, 3, 3, 3, 4, - 3, 2, 1, 1, 1, 1, 3, 1, 1, 3, - 1, 1, 3, 3, 3, 1, 2, 4, 4, 2, - 3, 5, 5, 1, 1, 3, 0, 11, 11, 10, - 12, 1, 2, 5, 4, 4, 4, 4, 7, 5, - 4, 7, 6, 9, 9, 4, 1, 1, 1, 1, - 1, 1, 1, 5, 1, 1, 3, 1, 2, 2, - 2, 3, 1, 3, 7, 1, 2, 0, 2, 0, - 3, 3, 4, 4, 4, 4, 3, 2, 1, 1, - 0, 1, 1, 0, 2, 1, 5, 1, 0, 2, - 2, 0, 1, 0, 3, 5, 1, 3, 4, 3, - 1, 1, 0, 2, 2, 0, 2, 2, 1, 1, - 1, 0, 2, 4, 5, 4, 2, 3, 2, 2, - 2, 2, 1, 2, 3, 0, 1, 0, 5, 1, - 4, 6, 2, 1, 0, 4, 0, 1, 1, 2, - 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, - 1, 1, 3, 3, 0, 1, 3, 1, 2, 1, - 1, 1, 1, 1, 2, 4, 4, 5, 1, 1, - 2, 0, 2, 0, 1, 3, 1, 0, 1, 2, - 3, 2, 4, 2, 3, 2, 0, 1, 2, 0, - 4, 5, 1, 2, 2, 0, 1, 3, 1, 2, - 3, 3, 3, 3, 3, 3, 1, 4, 9, 9, - 3, 0, 2, 2, 0, 5, 3, 0, 1, 1, - 3, 5, 3, 1, 2, 1, 3, 5, 1, 2, - 3, 4, 5, 4, 5, 4, 6, 5, 4, 5, - 5, 5, 2, 4, 1, 1, 0, 1, 4, 5, - 4, 0, 2, 2, 2, 1, 1, 1, 1, 0, - 4, 2, 1, 2, 2, 4, 2, 6, 2, 1, - 3, 4, 0, 2, 0, 2, 0, 1, 3, 3, - 2, 0, 2, 4, 1, 1, 1, 0, 2, 3, - 5, 6, 2, 3, 1, 5, 5, 5, 3, 3, - 3, 4, 0, 1, 1, 1, 1, 1, 2, 4, - 1, 1, 1, 1, 2, 3, 0, 1, 1, 1, - 1, 1, 2, 2, 2, 2, 2, 1, 3, 0, - 1, 1, 1, 1, 5, 2, 1, 1, 1, 1, - 4, 1, 2, 2, 1, 3, 3, 2, 1, 0, - 5, 2, 5, 2, 1, 3, 3, 0, 1, 1, + 0, 1, 3, 1, 1, 1, 1, 3, 1, 0, + 2, 2, 0, 2, 0, 1, 0, 1, 1, 1, + 3, 3, 1, 1, 3, 3, 3, 3, 3, 3, + 4, 3, 2, 1, 1, 1, 1, 3, 1, 1, + 3, 1, 1, 3, 3, 3, 1, 2, 4, 4, + 2, 3, 5, 5, 1, 1, 3, 0, 11, 11, + 10, 12, 1, 2, 5, 4, 4, 4, 4, 7, + 5, 4, 7, 6, 9, 9, 4, 1, 1, 1, + 1, 1, 1, 1, 5, 1, 1, 3, 1, 2, + 2, 2, 3, 1, 3, 7, 1, 2, 0, 2, + 0, 3, 3, 4, 4, 4, 4, 3, 2, 1, + 1, 0, 1, 1, 0, 2, 1, 5, 1, 0, + 2, 2, 0, 1, 0, 3, 5, 1, 3, 4, + 3, 1, 1, 0, 2, 2, 0, 2, 2, 1, + 1, 1, 0, 2, 4, 5, 4, 2, 3, 2, + 2, 2, 2, 1, 2, 3, 0, 1, 0, 5, + 1, 4, 6, 2, 1, 0, 4, 0, 1, 1, + 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, + 1, 1, 1, 3, 3, 0, 1, 3, 1, 2, + 1, 1, 1, 1, 1, 2, 4, 4, 5, 1, + 1, 2, 0, 2, 0, 1, 3, 1, 0, 1, + 2, 3, 2, 4, 2, 3, 2, 0, 1, 2, + 0, 4, 5, 1, 2, 2, 0, 1, 3, 1, + 2, 3, 3, 3, 3, 3, 3, 1, 4, 9, + 9, 3, 0, 2, 2, 0, 5, 3, 0, 1, + 1, 3, 5, 3, 1, 2, 1, 3, 5, 1, + 2, 3, 4, 5, 4, 5, 4, 6, 5, 4, + 5, 5, 5, 2, 4, 1, 1, 0, 1, 4, + 5, 4, 0, 2, 2, 2, 1, 1, 1, 1, + 0, 4, 2, 1, 2, 2, 4, 2, 6, 2, + 1, 3, 4, 0, 2, 0, 2, 0, 1, 3, + 3, 2, 0, 2, 4, 1, 1, 1, 0, 2, + 3, 5, 6, 2, 3, 1, 5, 5, 5, 3, + 3, 3, 4, 0, 1, 1, 1, 1, 1, 2, + 4, 1, 1, 1, 1, 2, 3, 0, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 2, 1, 3, + 0, 1, 1, 1, 1, 5, 2, 1, 1, 1, + 1, 4, 1, 2, 2, 1, 3, 3, 2, 1, + 0, 5, 2, 5, 2, 1, 3, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, - 3, 0, 1, 3, 3, 5, 2, 2, 3, 3, + 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, + 3, 3, 0, 1, 3, 3, 5, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 3, 3, 2, 2, 3, - 3, 5, 4, 6, 3, 5, 4, 6, 4, 6, - 5, 7, 3, 2, 4, 3, 2, 3, 3, 3, - 3, 4, 3, 4, 3, 4, 5, 6, 6, 7, - 6, 7, 6, 7, 3, 4, 4, 6, 1, 4, - 3, 5, 1, 3, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 2, 2, 3, 3, 2, 2, + 3, 3, 5, 4, 6, 3, 5, 4, 6, 4, + 6, 5, 7, 3, 2, 4, 3, 2, 3, 3, + 3, 3, 4, 3, 4, 3, 4, 5, 6, 6, + 7, 6, 7, 6, 7, 3, 4, 4, 6, 1, + 4, 3, 5, 1, 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 2, 2, 5, 6, 6, 7, 1, 2, 1, - 1, 1, 2, 2, 4, 3, 1, 1, 1, 1, - 1, 4, 1, 1, 3, 1, 2, 4, 2, 2, - 3, 3, 6, 7, 9, 7, 7, 5, 1, 1, - 1, 5, 6, 6, 4, 4, 4, 4, 6, 5, - 5, 5, 4, 6, 4, 7, 9, 5, 0, 5, - 4, 0, 1, 0, 2, 0, 1, 3, 3, 2, - 2, 0, 6, 1, 0, 3, 0, 3, 3, 3, - 0, 1, 4, 2, 2, 2, 2, 2, 3, 2, - 2, 3, 0, 4, 3, 1, 5, 3, 1, 3, - 1, 2, 3, 1, 3, 1, 2, 1, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, - 1, 4, 1, 4, 1, 2, 1, 2, 1, 2, - 1, 3, 1, 3, 1, 2, 1, 3, 1, 2, - 1, 0, 1, 3, 1, 3, 3, 1, 3, 3, + 3, 3, 2, 2, 5, 6, 6, 7, 1, 2, + 1, 1, 1, 2, 2, 4, 3, 1, 1, 1, + 1, 1, 4, 1, 1, 1, 1, 2, 4, 2, + 2, 3, 3, 3, 6, 7, 9, 7, 7, 5, + 1, 1, 1, 5, 6, 6, 4, 4, 4, 4, + 6, 5, 5, 5, 4, 6, 4, 7, 9, 5, + 0, 5, 4, 0, 1, 0, 2, 0, 1, 3, + 3, 2, 2, 0, 6, 1, 0, 3, 0, 3, + 3, 3, 0, 1, 4, 2, 2, 2, 2, 2, + 3, 2, 2, 3, 0, 4, 3, 1, 5, 3, + 1, 3, 1, 2, 3, 1, 3, 1, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 4, 3, 2, 3, 0, - 3, 3, 2, 2, 1, 0, 2, 2, 3, 2, - 1, 1, 3, 5, 1, 2, 4, 2, 0, 1, - 0, 1, 2, 3, 5, 7, 7, 1, 0, 0, - 2, 0, 2, 3, 3, 3, 5, 7, 7, 0, - 2, 1, 0, 1, 0, 1, 3, 1, 2, 3, - 2, 1, 4, 2, 1, 0, 3, 1, 3, 1, - 2, 4, 2, 0, 1, 3, 1, 3, 1, 2, - 1, 3, 1, 1, 2, 1, 1, 2, 1, 1, - 2, 7, 2, 5, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 3, 3, 0, 1, 1, 1, 5, 3, - 0, 1, 1, 1, 1, 1, 1, 4, 7, 6, - 2, 0, 1, 1, 1, 1, 13, 16, 1, 2, - 0, 1, 0, 1, 0, 2, 0, 1, 0, 6, - 8, 6, 8, 6, 8, 3, 2, 1, 0, 6, - 6, 1, 1, 1, 1, 1, 1, 2, 1, 1, - 1, 1, 1, 4, 6, 3, 2, 4, 3, 5, - 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, + 1, 4, 1, 4, 1, 4, 1, 2, 1, 2, + 1, 2, 1, 3, 1, 3, 1, 2, 1, 3, + 1, 2, 1, 0, 1, 3, 1, 3, 3, 1, + 3, 3, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 4, 3, 2, + 3, 0, 3, 3, 2, 2, 1, 0, 2, 2, + 3, 2, 1, 1, 3, 5, 1, 2, 4, 2, + 0, 1, 0, 1, 2, 3, 5, 7, 7, 1, + 0, 0, 2, 0, 2, 3, 3, 3, 5, 7, + 7, 0, 2, 1, 0, 1, 0, 1, 3, 1, + 2, 3, 2, 1, 4, 2, 1, 0, 3, 1, + 3, 1, 2, 4, 2, 0, 1, 3, 1, 3, + 1, 2, 1, 3, 1, 1, 2, 1, 1, 2, + 1, 1, 2, 7, 2, 5, 3, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 2, 3, 3, 0, 1, 1, 1, + 5, 3, 0, 1, 1, 1, 1, 1, 1, 4, + 7, 6, 2, 0, 1, 1, 1, 1, 13, 16, + 1, 2, 0, 1, 0, 1, 0, 2, 0, 1, + 0, 6, 8, 6, 8, 6, 8, 3, 2, 1, + 0, 6, 6, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 4, 6, 3, 2, 4, + 3, 5, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 1, 1, 1, 1, 1, 1, 2, 1, - 1, 2, 3, 3, 3, 1, 3, 3, 2, 3, - 3, 1, 1, 1, 3, 5, 1, 1, 1, 1, - 3, 2, 2, 3, 4, 5, 1, 1, 1, 1, - 4, 6, 5, 4, 6, 1, 1, 1, 1, 1, - 1, 0, 1, 3, 1, 0, 7, 3, 1, 2, - 3, 2, 0, 2, 0, 2, 4, 5, 8, 2, - 3, 5, 1, 0, 2, 0, 2, 3, 3, 3, - 1, 1, 1, 2, 3, 2, 2, 2, 2, 3, - 4, 3, 1, 1, 1, 1, 1, 1, 0, 1, - 3, 1, 3, 2, 9, 12, 11, 12, 14, 3, - 4, 4, 0, 7, 10, 9, 2, 3, 0, 4, + 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 2, 3, 3, 3, 1, 3, 3, + 2, 3, 3, 1, 1, 1, 3, 5, 1, 1, + 1, 1, 3, 2, 2, 3, 4, 5, 1, 1, + 1, 1, 4, 6, 5, 4, 6, 1, 1, 1, + 1, 1, 1, 0, 1, 3, 1, 0, 7, 3, + 1, 2, 3, 2, 0, 2, 0, 2, 4, 5, + 8, 2, 3, 5, 1, 0, 2, 0, 2, 3, + 3, 3, 1, 1, 1, 2, 3, 2, 2, 2, + 2, 3, 4, 3, 1, 1, 1, 1, 1, 1, + 0, 1, 3, 1, 3, 2, 9, 12, 11, 12, + 14, 3, 4, 4, 0, 7, 10, 9, 2, 3, + 0, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -3449,7 +3454,7 @@ static const yytype_uint8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1 + 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -3457,1944 +3462,1899 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint16 yydefact[] = { - 155, 263, 0, 1383, 1382, 1453, 263, 0, 1318, 0, - 263, 485, 401, 0, 1474, 1473, 0, 207, 263, 0, - 155, 0, 0, 0, 0, 0, 0, 548, 551, 549, - 0, 0, 0, 263, 588, 0, 1475, 263, 0, 0, - 580, 550, 0, 1431, 0, 0, 0, 0, 0, 2, + 155, 263, 0, 1385, 1384, 1455, 263, 0, 1320, 0, + 263, 486, 401, 0, 1476, 1475, 0, 207, 263, 0, + 155, 0, 0, 0, 0, 0, 0, 549, 552, 550, + 0, 0, 0, 263, 589, 0, 1477, 263, 0, 0, + 581, 551, 0, 1433, 0, 0, 0, 0, 0, 2, 4, 7, 21, 35, 31, 0, 20, 33, 18, 17, 26, 6, 24, 37, 39, 19, 25, 15, 38, 13, - 36, 524, 510, 593, 523, 0, 0, 154, 692, 531, - 34, 16, 30, 5, 11, 12, 28, 29, 27, 1341, - 42, 32, 40, 22, 8, 9, 23, 41, 43, 1476, - 1472, 10, 44, 14, 262, 261, 255, 0, 0, 0, - 0, 0, 1452, 0, 0, 256, 111, 1500, 1501, 1502, - 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1874, 1511, - 1512, 1513, 1514, 1515, 1875, 1516, 1517, 1518, 1820, 1821, - 1876, 1822, 1823, 1519, 1520, 1521, 1522, 1523, 1524, 1525, - 1526, 1527, 1528, 1824, 1825, 1529, 1530, 1531, 1532, 1533, - 1826, 1877, 1827, 1534, 1535, 1536, 1537, 1538, 1878, 1539, - 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1879, 1548, - 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1828, - 1558, 1559, 1829, 1560, 1561, 1562, 1563, 1564, 1565, 1566, - 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, - 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, - 1830, 1587, 1588, 1589, 1590, 1591, 1831, 1592, 1593, 1594, - 1832, 1595, 1596, 1597, 1880, 1881, 1598, 1599, 1833, 1883, - 1600, 1601, 1834, 1835, 1602, 1603, 1604, 1605, 1606, 1607, - 1608, 1609, 1610, 1884, 1611, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 1619, 1620, 1621, 1622, 1885, 1836, 1623, 1624, - 1625, 1626, 1627, 1837, 1838, 1839, 1628, 1886, 1887, 1629, - 1888, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1889, 1637, - 1890, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1840, - 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, - 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, - 1841, 1892, 1842, 1666, 1667, 1668, 1843, 1669, 1670, 1893, - 1671, 1844, 1672, 1845, 1673, 1674, 1675, 1676, 1677, 1678, - 1679, 1680, 1681, 1682, 1846, 1894, 1683, 1895, 1847, 1684, - 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, - 1695, 1696, 1848, 1896, 1697, 1698, 1849, 1699, 1700, 1701, - 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1850, - 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, - 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1897, - 1730, 1731, 1732, 1851, 1733, 1734, 1735, 1736, 1737, 1738, - 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, - 1749, 1750, 1751, 1852, 1752, 1753, 1898, 1754, 1755, 1853, - 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, - 1766, 1767, 1768, 1854, 1769, 1855, 1770, 1771, 1772, 1900, - 1773, 1774, 1775, 1776, 1777, 1778, 1856, 1857, 1779, 1780, - 1858, 1781, 1859, 1782, 1783, 1860, 1784, 1785, 1786, 1787, - 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, - 1798, 1799, 1800, 1861, 1862, 1801, 1901, 1802, 1803, 1804, - 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, - 1815, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, - 1872, 1873, 1816, 1817, 1818, 1819, 0, 1483, 0, 1243, - 112, 113, 1265, 111, 1833, 1840, 1854, 1317, 1316, 112, - 0, 258, 484, 0, 0, 0, 0, 0, 0, 209, - 0, 395, 394, 0, 1307, 400, 0, 0, 0, 115, - 107, 1699, 114, 1242, 105, 121, 2044, 2045, 2046, 2047, - 1931, 2048, 2049, 2050, 2051, 1932, 2052, 1933, 1934, 1935, - 1936, 1937, 1938, 2053, 2054, 2055, 1940, 1939, 2056, 1941, - 2057, 1942, 2058, 1943, 1944, 2059, 2060, 1945, 1554, 1946, - 1947, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, - 1948, 1949, 2070, 2071, 1950, 2072, 2073, 1951, 2074, 1952, - 1953, 1954, 2075, 2076, 1955, 1956, 2077, 1957, 2078, 2079, - 1958, 1959, 1962, 1960, 2080, 1961, 2081, 1963, 1964, 1965, - 2082, 2083, 1966, 1967, 2084, 1968, 1969, 1970, 1971, 1972, - 2085, 1973, 2086, 1974, 1975, 2087, 2088, 2089, 2090, 2091, - 1977, 1976, 1978, 1979, 2092, 2093, 2094, 2095, 1980, 1981, - 1982, 2096, 2097, 1983, 2098, 2099, 1984, 1985, 2100, 1986, - 1987, 2101, 1988, 1989, 2102, 1990, 1991, 2103, 2104, 2105, - 1992, 2106, 1993, 1994, 2107, 2108, 1995, 1996, 2109, 1997, - 2110, 2111, 2112, 2113, 1998, 1999, 2114, 2000, 2115, 2116, - 2117, 2118, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, - 2009, 2010, 2011, 1449, 123, 122, 124, 0, 419, 420, + 36, 525, 511, 594, 524, 0, 0, 154, 693, 532, + 34, 16, 30, 5, 11, 12, 28, 29, 27, 1343, + 42, 32, 40, 22, 8, 9, 23, 41, 43, 1478, + 1474, 10, 44, 14, 262, 261, 255, 0, 0, 0, + 0, 0, 1454, 0, 0, 256, 111, 1502, 1503, 1504, + 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1876, 1513, + 1514, 1515, 1516, 1517, 1877, 1518, 1519, 1520, 1822, 1823, + 1878, 1824, 1825, 1521, 1522, 1523, 1524, 1525, 1526, 1527, + 1528, 1529, 1530, 1826, 1827, 1531, 1532, 1533, 1534, 1535, + 1828, 1879, 1829, 1536, 1537, 1538, 1539, 1540, 1880, 1541, + 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1881, 1550, + 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1830, + 1560, 1561, 1831, 1562, 1563, 1564, 1565, 1566, 1567, 1568, + 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, + 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, + 1832, 1589, 1590, 1591, 1592, 1593, 1833, 1594, 1595, 1596, + 1834, 1597, 1598, 1599, 1882, 1883, 1600, 1601, 1835, 1885, + 1602, 1603, 1836, 1837, 1604, 1605, 1606, 1607, 1608, 1609, + 1610, 1611, 1612, 1886, 1613, 1614, 1615, 1616, 1617, 1618, + 1619, 1620, 1621, 1622, 1623, 1624, 1887, 1838, 1625, 1626, + 1627, 1628, 1629, 1839, 1840, 1841, 1630, 1888, 1889, 1631, + 1890, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1891, 1639, + 1892, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1842, + 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, + 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, + 1843, 1894, 1844, 1668, 1669, 1670, 1845, 1671, 1672, 1895, + 1673, 1846, 1674, 1847, 1675, 1676, 1677, 1678, 1679, 1680, + 1681, 1682, 1683, 1684, 1848, 1896, 1685, 1897, 1849, 1686, + 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, + 1697, 1698, 1850, 1898, 1699, 1700, 1851, 1701, 1702, 1703, + 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1852, + 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, + 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1899, + 1732, 1733, 1734, 1853, 1735, 1736, 1737, 1738, 1739, 1740, + 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, + 1751, 1752, 1753, 1854, 1754, 1755, 1900, 1756, 1757, 1855, + 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, + 1768, 1769, 1770, 1856, 1771, 1857, 1772, 1773, 1774, 1902, + 1775, 1776, 1777, 1778, 1779, 1780, 1858, 1859, 1781, 1782, + 1860, 1783, 1861, 1784, 1785, 1862, 1786, 1787, 1788, 1789, + 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, + 1800, 1801, 1802, 1863, 1864, 1803, 1903, 1804, 1805, 1806, + 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, + 1817, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, + 1874, 1875, 1818, 1819, 1820, 1821, 0, 1485, 0, 1245, + 112, 113, 1267, 111, 1835, 1842, 1856, 1319, 1318, 112, + 0, 258, 485, 0, 0, 0, 0, 0, 0, 209, + 0, 395, 394, 0, 1309, 400, 0, 0, 0, 115, + 107, 1701, 114, 1244, 105, 121, 2046, 2047, 2048, 2049, + 1933, 2050, 2051, 2052, 2053, 1934, 2054, 1935, 1936, 1937, + 1938, 1939, 1940, 2055, 2056, 2057, 1942, 1941, 2058, 1943, + 2059, 1944, 2060, 1945, 1946, 2061, 2062, 1947, 1556, 1948, + 1949, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, + 1950, 1951, 2072, 2073, 1952, 2074, 2075, 1953, 2076, 1954, + 1955, 1956, 2077, 2078, 1957, 1958, 2079, 1959, 2080, 2081, + 1960, 1961, 1964, 1962, 2082, 1963, 2083, 1965, 1966, 1967, + 2084, 2085, 1968, 1969, 2086, 1970, 1971, 1972, 1973, 1974, + 2087, 1975, 2088, 1976, 1977, 2089, 2090, 2091, 2092, 2093, + 1979, 1978, 1980, 1981, 2094, 2095, 2096, 2097, 1982, 1983, + 1984, 2098, 2099, 1985, 2100, 2101, 1986, 1987, 2102, 1988, + 1989, 2103, 1990, 1991, 2104, 1992, 1993, 2105, 2106, 2107, + 1994, 2108, 1995, 1996, 2109, 2110, 1997, 1998, 2111, 1999, + 2112, 2113, 2114, 2115, 2000, 2001, 2116, 2002, 2117, 2118, + 2119, 2120, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, + 2011, 2012, 2013, 1451, 123, 122, 124, 0, 419, 420, 0, 430, 0, 412, 417, 413, 0, 439, 432, 440, 421, 411, 433, 422, 410, 208, 0, 441, 427, 415, 0, 0, 0, 0, 259, 220, 401, 0, 155, 0, - 1347, 1357, 1366, 1362, 1356, 1364, 1354, 1360, 1346, 1368, - 1355, 1359, 1352, 1369, 1350, 1367, 1365, 1353, 1361, 1345, - 1349, 1336, 1341, 1372, 1363, 1370, 1358, 1371, 1373, 1348, - 1374, 1351, 0, 1318, 0, 0, 1826, 1877, 1831, 0, - 1844, 0, 1847, 1848, 1733, 1855, 1858, 1859, 1860, 1861, - 0, 762, 114, 109, 746, 0, 526, 696, 706, 746, - 751, 1029, 774, 1030, 0, 116, 1417, 1416, 1412, 1411, - 194, 1280, 1461, 1600, 1640, 1750, 1856, 1779, 1479, 1462, - 1456, 1460, 260, 587, 585, 0, 1214, 1600, 1640, 1737, - 1750, 1856, 1391, 1395, 0, 257, 1481, 1466, 0, 1467, - 114, 532, 579, 0, 264, 1430, 0, 1435, 0, 1713, - 559, 562, 1274, 560, 524, 0, 0, 1, 155, 0, - 161, 0, 583, 583, 0, 583, 0, 516, 0, 0, - 524, 519, 523, 693, 1340, 1445, 1478, 1856, 1779, 1465, - 1468, 1609, 0, 0, 1609, 0, 1609, 0, 1609, 0, - 0, 1455, 1198, 0, 1244, 117, 0, 0, 1329, 1325, - 1330, 1326, 1331, 1324, 1323, 1332, 1328, 0, 0, 0, - 366, 399, 398, 397, 396, 401, 1609, 1291, 0, 205, - 448, 449, 0, 0, 0, 0, 0, 1302, 108, 106, - 1609, 1450, 428, 429, 0, 418, 414, 416, 0, 0, - 1609, 1269, 438, 434, 1609, 438, 1236, 1609, 0, 0, - 212, 0, 394, 1338, 1375, 1998, 1389, 0, 1390, 1380, - 1344, 1376, 1377, 155, 0, 483, 1315, 1413, 0, 0, - 0, 1150, 746, 751, 0, 0, 764, 0, 1169, 0, - 1175, 0, 0, 0, 746, 531, 0, 706, 763, 110, - 0, 744, 745, 634, 634, 588, 0, 569, 756, 0, - 0, 759, 757, 0, 759, 0, 0, 0, 759, 755, - 714, 0, 634, 0, 744, 747, 634, 0, 766, 1335, - 0, 0, 0, 0, 0, 1459, 1457, 1458, 1463, 0, - 0, 0, 1246, 1248, 1249, 1118, 1259, 1009, 0, 1821, - 1822, 1823, 1190, 1824, 1825, 1827, 1828, 1829, 968, 1574, - 1830, 1257, 1832, 1834, 1835, 1837, 1838, 1839, 1840, 1841, - 1842, 0, 1258, 1845, 1678, 1850, 1851, 1853, 1856, 1857, - 1256, 1862, 0, 0, 0, 1225, 1141, 0, 1008, 0, - 0, 0, 1191, 1199, 1001, 0, 0, 810, 811, 832, - 833, 812, 838, 839, 841, 813, 0, 1221, 902, 997, - 1209, 1006, 1010, 1048, 1012, 1028, 1015, 1085, 1007, 0, - 1013, 999, 1217, 569, 1215, 0, 1000, 1245, 569, 1213, - 1394, 1392, 1398, 1393, 0, 0, 0, 0, 0, 110, - 1438, 1437, 1429, 1427, 1428, 1426, 1425, 1432, 0, 1434, - 1341, 1136, 1138, 0, 561, 0, 0, 0, 513, 512, - 514, 3, 0, 0, 0, 0, 581, 582, 0, 0, - 0, 0, 0, 0, 0, 0, 677, 608, 609, 611, - 674, 678, 686, 0, 0, 0, 0, 0, 520, 0, - 1274, 1477, 1471, 1469, 0, 0, 0, 139, 139, 0, - 0, 0, 0, 0, 99, 48, 92, 0, 0, 0, - 0, 234, 247, 0, 0, 0, 0, 0, 244, 0, - 0, 227, 50, 221, 223, 0, 139, 0, 46, 0, - 0, 0, 52, 1453, 0, 483, 1197, 0, 119, 120, - 118, 111, 0, 2012, 1874, 1875, 1876, 1877, 1827, 1878, - 1879, 0, 1880, 1881, 1833, 1883, 1884, 1885, 1886, 1887, - 1888, 1889, 1890, 1840, 1892, 1893, 1894, 1895, 1896, 1897, - 2038, 1898, 1854, 1900, 1860, 0, 1901, 1021, 1144, 593, - 1142, 1275, 0, 112, 1262, 0, 1327, 0, 0, 0, - 0, 481, 0, 0, 0, 0, 1287, 0, 1609, 206, - 210, 0, 1609, 201, 1609, 366, 0, 1609, 366, 1609, - 0, 1301, 1304, 0, 431, 426, 424, 423, 425, 1609, - 253, 0, 0, 1270, 436, 437, 0, 405, 0, 0, - 407, 0, 0, 217, 0, 215, 0, 401, 155, 0, - 228, 1385, 1386, 1384, 0, 0, 1379, 1343, 231, 248, - 1388, 1378, 1387, 1342, 1337, 0, 0, 1333, 471, 0, - 0, 0, 0, 1151, 879, 878, 862, 863, 876, 877, - 864, 865, 872, 873, 881, 880, 870, 871, 866, 867, - 860, 861, 868, 869, 874, 875, 858, 859, 1164, 1152, - 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, - 1163, 0, 0, 705, 703, 0, 0, 0, 0, 0, - 0, 1191, 0, 972, 1007, 0, 0, 0, 1136, 1174, - 0, 0, 0, 0, 0, 0, 1136, 1180, 0, 0, - 730, 742, 0, 627, 633, 704, 702, 0, 1214, 697, - 0, 776, 0, 756, 0, 755, 0, 0, 758, 752, - 0, 753, 0, 0, 0, 0, 754, 0, 0, 0, - 0, 0, 700, 0, 742, 0, 701, 773, 1419, 1418, - 1414, 1401, 1409, 195, 0, 1266, 1902, 1903, 1904, 820, - 1905, 849, 827, 849, 849, 1906, 1907, 1908, 1909, 816, - 816, 829, 1910, 1911, 1912, 1913, 1914, 817, 818, 854, - 1915, 1916, 1917, 1918, 1919, 0, 0, 1920, 849, 1921, - 816, 1922, 1923, 1924, 821, 1925, 784, 1926, 0, 1927, - 819, 785, 1928, 857, 857, 1929, 0, 844, 1930, 0, - 1147, 794, 802, 803, 804, 805, 830, 831, 806, 836, - 837, 807, 901, 0, 816, 1267, 1268, 155, 1464, 1480, - 0, 1141, 1016, 848, 835, 1189, 0, 843, 842, 0, - 1141, 825, 824, 823, 1003, 0, 822, 1098, 849, 849, - 847, 927, 826, 0, 0, 0, 0, 0, 853, 0, - 851, 928, 906, 907, 0, 1224, 1233, 1136, 1140, 0, - 1001, 1136, 0, 0, 1088, 1090, 0, 1018, 1019, 0, - 1192, 1247, 1002, 0, 1252, 0, 0, 901, 901, 1220, - 1118, 0, 1108, 1111, 0, 0, 1115, 1116, 1117, 0, - 0, 0, 1212, 0, 1126, 1128, 0, 0, 943, 1124, - 0, 946, 0, 0, 0, 0, 1112, 1113, 1114, 1104, - 1105, 1106, 1107, 1109, 1110, 1122, 1103, 924, 0, 998, - 0, 1051, 0, 923, 1218, 695, 0, 1250, 695, 1403, - 1407, 1408, 1402, 1406, 0, 1397, 1396, 1399, 1400, 1482, - 0, 1439, 1423, 0, 1420, 1139, 690, 563, 1238, 0, - 567, 1444, 160, 159, 0, 0, 536, 535, 602, 594, - 596, 602, 0, 534, 0, 650, 651, 0, 0, 0, - 0, 683, 681, 1246, 1259, 638, 612, 637, 0, 0, - 616, 0, 642, 902, 676, 518, 606, 607, 610, 517, - 0, 679, 0, 689, 0, 555, 557, 540, 554, 552, - 537, 545, 677, 611, 0, 1446, 1470, 0, 0, 0, - 0, 0, 1609, 0, 0, 787, 83, 64, 318, 138, - 0, 0, 0, 0, 0, 0, 0, 91, 88, 89, - 90, 0, 0, 0, 0, 1266, 232, 233, 246, 0, - 237, 238, 235, 239, 240, 0, 0, 225, 226, 0, - 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1454, 1447, 1193, 1198, 593, 593, 593, - 0, 591, 592, 0, 0, 0, 0, 0, 470, 364, - 374, 0, 0, 0, 1291, 205, 0, 0, 0, 0, - 0, 0, 401, 1294, 1292, 1290, 1293, 1295, 1580, 189, - 0, 0, 0, 0, 0, 197, 200, 0, 363, 337, - 0, 0, 1306, 0, 0, 0, 1609, 353, 1303, 0, - 1451, 0, 0, 251, 438, 1271, 0, 435, 438, 1237, - 0, 438, 219, 0, 0, 1339, 1381, 229, 249, 230, - 250, 483, 478, 508, 0, 486, 491, 468, 0, 468, - 0, 488, 492, 468, 487, 0, 468, 482, 1415, 0, - 1044, 0, 1034, 0, 0, 765, 0, 0, 1035, 974, - 975, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 992, - 991, 1036, 769, 0, 772, 0, 0, 1172, 1173, 0, - 1037, 0, 0, 1179, 0, 0, 0, 1042, 0, 707, - 0, 0, 0, 622, 626, 629, 0, 632, 569, 525, - 1600, 1640, 0, 580, 580, 580, 578, 568, 0, 654, - 0, 0, 0, 731, 0, 0, 733, 735, 0, 0, - 738, 0, 713, 712, 0, 0, 0, 0, 777, 0, - 1242, 0, 0, 196, 0, 0, 0, 802, 0, 0, - 0, 792, 788, 0, 882, 883, 884, 885, 886, 887, - 888, 889, 890, 891, 892, 893, 808, 1279, 0, 814, - 1282, 1283, 1284, 1281, 1278, 1285, 1286, 0, 0, 0, - 0, 1188, 1184, 0, 0, 0, 0, 1093, 1095, 1097, - 0, 846, 845, 1102, 1108, 1111, 1115, 1116, 1117, 1112, - 1113, 1114, 1104, 1105, 1106, 1107, 1109, 1110, 0, 1130, - 0, 1084, 0, 0, 0, 0, 0, 0, 1223, 0, - 970, 0, 1014, 1005, 0, 0, 1091, 1020, 1225, 1200, - 0, 0, 0, 1255, 1254, 903, 912, 915, 947, 948, - 919, 920, 921, 925, 1277, 1276, 1219, 0, 1211, 0, - 0, 904, 929, 934, 0, 1181, 964, 0, 952, 0, - 942, 0, 950, 954, 930, 945, 0, 926, 0, 1212, - 1127, 1129, 0, 1125, 0, 916, 917, 918, 908, 909, - 910, 911, 913, 914, 922, 1101, 1099, 1100, 0, 1198, - 0, 1210, 0, 0, 1053, 0, 0, 949, 1216, 0, - 776, 593, 776, 0, 901, 1440, 1274, 1433, 1274, 1422, - 1137, 1239, 1273, 565, 0, 0, 0, 1442, 146, 150, - 0, 1199, 180, 182, 695, 0, 600, 601, 605, 0, - 0, 605, 584, 533, 1851, 1733, 0, 0, 0, 0, - 643, 684, 0, 675, 640, 641, 0, 639, 1246, 644, - 1245, 645, 648, 649, 617, 1234, 685, 687, 0, 680, - 0, 1240, 539, 558, 0, 0, 0, 0, 0, 522, - 521, 691, 0, 49, 0, 1609, 66, 0, 0, 0, - 0, 0, 0, 268, 0, 368, 268, 104, 1609, 438, - 1609, 438, 1504, 1575, 1751, 0, 62, 342, 95, 0, - 132, 371, 0, 327, 85, 100, 125, 0, 0, 51, - 222, 236, 241, 128, 245, 242, 1311, 243, 139, 0, - 47, 0, 126, 0, 1309, 0, 0, 53, 130, 1313, - 1455, 0, 1197, 0, 591, 591, 591, 0, 1143, 0, - 0, 0, 1145, 1146, 942, 1321, 1320, 1322, 1319, 456, - 469, 0, 365, 0, 480, 459, 460, 470, 1289, 210, - 0, 201, 366, 0, 366, 0, 1291, 0, 0, 191, - 187, 205, 211, 0, 0, 0, 0, 0, 364, 356, - 354, 387, 0, 361, 355, 0, 0, 313, 0, 1498, - 0, 0, 0, 0, 450, 0, 0, 0, 0, 253, - 254, 404, 1272, 406, 0, 408, 218, 216, 1334, 475, - 0, 474, 479, 477, 473, 472, 0, 467, 0, 501, - 0, 0, 0, 0, 0, 0, 0, 0, 1031, 1149, - 0, 1167, 1166, 973, 980, 983, 987, 988, 989, 1168, - 0, 0, 0, 984, 985, 986, 976, 977, 978, 979, - 981, 982, 990, 774, 0, 0, 768, 1177, 1176, 1170, - 1171, 0, 1039, 1040, 1041, 1178, 0, 0, 743, 620, - 618, 621, 623, 619, 0, 0, 776, 580, 580, 580, - 580, 577, 0, 0, 0, 775, 0, 671, 739, 737, - 0, 761, 0, 734, 717, 740, 0, 725, 0, 732, - 781, 748, 0, 0, 750, 1410, 798, 0, 793, 789, - 0, 0, 0, 799, 0, 0, 0, 0, 0, 0, - 0, 1148, 586, 1017, 0, 0, 0, 1185, 0, 969, - 815, 828, 0, 1096, 1011, 0, 1119, 1083, 856, 855, - 857, 857, 0, 0, 0, 1232, 0, 1137, 1087, 1089, - 1233, 1004, 840, 901, 0, 0, 0, 0, 0, 0, - 0, 953, 944, 0, 951, 955, 0, 0, 0, 938, - 0, 0, 936, 965, 932, 0, 0, 966, 1197, 0, - 1201, 0, 0, 1052, 1061, 698, 694, 654, 591, 654, - 0, 1404, 1424, 1421, 566, 155, 1443, 0, 169, 0, - 0, 0, 0, 172, 186, 183, 1442, 0, 0, 595, - 597, 0, 1120, 605, 599, 647, 646, 0, 615, 682, - 613, 0, 688, 0, 556, 0, 542, 0, 716, 0, - 0, 0, 0, 0, 317, 0, 0, 0, 268, 0, - 376, 0, 383, 0, 0, 368, 349, 84, 0, 0, - 0, 58, 103, 76, 68, 54, 82, 0, 0, 87, - 0, 80, 97, 98, 96, 101, 0, 278, 303, 0, - 0, 314, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 483, 1198, 1194, 1198, 0, 0, 0, - 593, 589, 590, 1022, 0, 455, 507, 504, 505, 503, - 227, 375, 0, 0, 0, 199, 363, 0, 1306, 0, - 1288, 401, 0, 192, 0, 190, 210, 0, 0, 201, - 366, 0, 341, 337, 362, 335, 334, 336, 0, 1499, - 220, 0, 1493, 366, 1305, 0, 0, 451, 0, 445, - 0, 1300, 252, 438, 0, 463, 502, 509, 489, 494, - 0, 500, 496, 495, 490, 498, 497, 493, 1032, 1043, - 1165, 0, 0, 0, 0, 767, 770, 0, 1038, 1033, - 741, 0, 0, 654, 0, 0, 0, 0, 571, 570, - 576, 0, 0, 1055, 736, 0, 0, 0, 723, 711, - 718, 719, 0, 0, 0, 779, 778, 749, 802, 0, - 782, 802, 0, 802, 0, 800, 0, 809, 894, 895, - 896, 897, 898, 899, 900, 834, 0, 1187, 1183, 1092, - 1094, 1131, 852, 850, 1222, 1136, 1227, 1229, 0, 0, - 0, 1086, 971, 1253, 905, 0, 0, 935, 1182, 956, - 0, 0, 0, 931, 1119, 0, 0, 0, 0, 0, - 940, 0, 1205, 1198, 0, 1204, 0, 0, 0, 0, - 1027, 699, 671, 0, 671, 0, 0, 1441, 0, 1436, - 147, 148, 149, 0, 0, 0, 164, 141, 0, 0, - 181, 169, 157, 603, 604, 0, 598, 614, 1235, 1241, - 541, 0, 1001, 0, 0, 538, 0, 133, 268, 0, - 0, 65, 0, 385, 329, 377, 360, 344, 0, 0, - 0, 269, 0, 402, 0, 0, 350, 0, 0, 0, - 0, 330, 0, 0, 289, 0, 0, 360, 0, 367, - 285, 286, 0, 57, 77, 0, 73, 0, 102, 0, - 0, 0, 0, 0, 60, 72, 0, 55, 0, 438, - 438, 63, 1266, 1902, 1903, 1904, 1905, 1906, 1907, 1908, - 1909, 1910, 1911, 2022, 1912, 1913, 1914, 1915, 1916, 1917, - 1918, 1919, 2031, 1920, 275, 1921, 1678, 1922, 1923, 1924, - 1925, 1926, 0, 1927, 785, 1928, 1929, 2110, 1930, 1104, - 1105, 274, 273, 370, 270, 378, 272, 0, 1267, 271, - 373, 328, 129, 1312, 0, 127, 0, 1310, 136, 134, - 131, 1314, 1448, 0, 0, 1025, 1026, 1023, 591, 0, - 0, 0, 483, 462, 0, 0, 0, 1498, 0, 0, - 0, 1609, 0, 188, 0, 0, 202, 1306, 198, 363, - 0, 393, 313, 388, 0, 1498, 1496, 0, 1306, 1492, - 0, 442, 0, 0, 0, 409, 476, 0, 499, 993, - 0, 0, 0, 0, 630, 0, 636, 671, 575, 574, - 573, 572, 653, 1549, 1834, 1732, 0, 657, 652, 655, - 660, 662, 661, 663, 659, 670, 0, 673, 760, 1132, - 1134, 0, 0, 0, 0, 724, 726, 0, 728, 0, - 780, 796, 0, 797, 0, 795, 790, 801, 1186, 1230, - 1231, 1226, 0, 902, 962, 960, 957, 0, 958, 939, - 0, 0, 937, 933, 0, 967, 0, 0, 1202, 0, - 1047, 0, 1050, 1064, 1060, 1059, 1055, 1022, 1055, 1405, - 564, 168, 145, 171, 170, 0, 1199, 178, 0, 0, - 169, 0, 173, 452, 0, 0, 553, 715, 546, 547, - 0, 381, 67, 0, 360, 0, 268, 346, 345, 348, - 343, 347, 0, 403, 0, 0, 287, 0, 294, 332, - 333, 331, 288, 360, 366, 290, 0, 0, 0, 69, - 59, 56, 61, 70, 0, 0, 71, 74, 781, 86, - 79, 1266, 2031, 2040, 0, 0, 0, 0, 0, 1196, - 1195, 0, 458, 457, 506, 454, 465, 227, 0, 0, - 0, 337, 1495, 0, 0, 447, 0, 0, 363, 193, - 0, 0, 0, 0, 1498, 0, 0, 265, 0, 310, - 0, 213, 1497, 0, 0, 1484, 0, 0, 1298, 1299, - 0, 464, 994, 0, 995, 771, 0, 0, 628, 1055, - 0, 0, 0, 664, 658, 0, 1054, 1056, 0, 625, - 1135, 720, 0, 722, 0, 746, 0, 746, 729, 791, - 783, 1228, 1045, 0, 959, 963, 961, 941, 1198, 1206, - 1198, 1203, 1049, 1063, 1066, 673, 1251, 673, 0, 0, - 156, 0, 0, 153, 140, 158, 1121, 543, 544, 0, - 268, 0, 359, 382, 299, 277, 0, 0, 0, 284, - 291, 392, 293, 0, 78, 94, 0, 0, 372, 137, - 135, 1024, 483, 0, 204, 1306, 313, 1492, 444, 0, - 0, 0, 0, 337, 220, 1494, 326, 319, 320, 321, - 322, 323, 324, 325, 340, 339, 311, 312, 0, 0, - 0, 0, 0, 446, 1300, 0, 175, 184, 0, 175, - 996, 631, 0, 673, 0, 0, 0, 656, 0, 0, - 672, 0, 529, 1133, 0, 710, 708, 0, 709, 0, - 0, 0, 0, 593, 625, 625, 142, 0, 143, 179, - 0, 0, 0, 366, 384, 358, 0, 351, 297, 296, - 298, 302, 0, 300, 0, 316, 0, 309, 277, 0, - 81, 0, 379, 453, 461, 0, 267, 1486, 363, 0, - 203, 1492, 313, 1498, 1492, 0, 1489, 0, 443, 0, - 0, 0, 177, 1306, 0, 177, 0, 625, 666, 0, - 665, 1058, 1057, 627, 721, 0, 1046, 1208, 1207, 0, - 1070, 528, 527, 0, 0, 0, 0, 392, 0, 338, - 0, 0, 299, 0, 292, 389, 390, 391, 0, 305, - 295, 306, 75, 93, 380, 0, 363, 1487, 266, 214, - 1485, 1490, 1491, 0, 175, 174, 602, 176, 776, 185, - 602, 635, 530, 667, 624, 727, 1065, 0, 0, 0, - 0, 0, 152, 776, 163, 0, 309, 357, 352, 276, - 301, 315, 0, 0, 0, 307, 0, 308, 1492, 0, - 177, 605, 1296, 605, 1820, 1550, 1786, 0, 1082, 1071, - 1082, 1082, 1062, 144, 151, 0, 268, 281, 0, 280, - 0, 369, 304, 1488, 1306, 602, 165, 166, 0, 1075, - 1074, 1073, 1077, 1076, 0, 1069, 1067, 1068, 776, 386, - 279, 283, 282, 776, 605, 0, 0, 1079, 0, 1080, - 162, 1297, 167, 1072, 1078, 1081 + 1349, 1359, 1368, 1364, 1358, 1366, 1356, 1362, 1348, 1370, + 1357, 1361, 1354, 1371, 1352, 1369, 1367, 1355, 1363, 1347, + 1351, 1338, 1343, 1374, 1365, 1372, 1360, 1373, 1375, 1350, + 1376, 1353, 0, 1320, 0, 0, 1828, 1879, 1833, 0, + 1846, 0, 1849, 1850, 1735, 1857, 1860, 1861, 1862, 1863, + 0, 763, 114, 109, 747, 0, 527, 697, 707, 747, + 752, 1031, 775, 1032, 0, 116, 1419, 1418, 1414, 1413, + 194, 1282, 1463, 1602, 1642, 1752, 1858, 1781, 1481, 1464, + 1458, 1462, 260, 588, 586, 0, 1216, 1602, 1642, 1739, + 1752, 1858, 1393, 1397, 0, 257, 1483, 1468, 0, 1469, + 114, 533, 580, 0, 264, 1432, 0, 1437, 0, 1715, + 560, 563, 1276, 561, 525, 0, 0, 1, 155, 0, + 161, 0, 584, 584, 0, 584, 0, 517, 0, 0, + 525, 520, 524, 694, 1342, 1447, 1480, 1858, 1781, 1467, + 1470, 1611, 0, 0, 1611, 0, 1611, 0, 1611, 0, + 0, 1457, 1200, 0, 1246, 117, 0, 0, 1331, 1327, + 1332, 1328, 1333, 1326, 1325, 1334, 1330, 0, 0, 0, + 366, 399, 398, 397, 396, 401, 1611, 1293, 0, 205, + 448, 449, 0, 0, 0, 0, 0, 1304, 108, 106, + 1611, 1452, 428, 429, 0, 418, 414, 416, 0, 0, + 1611, 1271, 438, 434, 1611, 438, 1238, 1611, 0, 0, + 212, 0, 394, 1340, 1377, 2000, 1391, 0, 1392, 1382, + 1346, 1378, 1379, 155, 0, 484, 1317, 1415, 0, 0, + 0, 1152, 747, 752, 0, 0, 765, 0, 1171, 0, + 1177, 0, 0, 0, 747, 532, 0, 707, 764, 110, + 0, 745, 746, 635, 635, 589, 0, 570, 757, 0, + 0, 760, 758, 0, 760, 0, 0, 0, 760, 756, + 715, 0, 635, 0, 745, 748, 635, 0, 767, 1337, + 0, 0, 0, 0, 0, 1461, 1459, 1460, 1465, 0, + 0, 0, 1248, 1250, 1251, 1120, 1261, 1010, 0, 1823, + 1824, 1825, 1192, 1826, 1827, 1829, 1830, 1831, 969, 1576, + 1832, 1259, 1834, 1836, 1837, 1839, 1840, 1841, 1842, 1843, + 1844, 0, 1260, 1847, 1680, 1852, 1853, 1855, 1858, 1859, + 1258, 1864, 0, 0, 0, 1227, 1143, 0, 1009, 0, + 0, 0, 1193, 1201, 1002, 0, 0, 811, 812, 833, + 834, 813, 839, 840, 842, 814, 0, 1223, 903, 998, + 1211, 1007, 1015, 1011, 1050, 1013, 1030, 1016, 1087, 1008, + 0, 1014, 1000, 1219, 570, 1217, 0, 1001, 1247, 570, + 1215, 1396, 1394, 1400, 1395, 0, 0, 0, 0, 0, + 110, 1440, 1439, 1431, 1429, 1430, 1428, 1427, 1434, 0, + 1436, 1343, 1138, 1140, 0, 562, 0, 0, 0, 514, + 513, 515, 3, 0, 0, 0, 0, 582, 583, 0, + 0, 0, 0, 0, 0, 0, 0, 678, 609, 610, + 612, 675, 679, 687, 0, 0, 0, 0, 0, 521, + 0, 1276, 1479, 1473, 1471, 0, 0, 0, 139, 139, + 0, 0, 0, 0, 0, 99, 48, 92, 0, 0, + 0, 0, 234, 247, 0, 0, 0, 0, 0, 244, + 0, 0, 227, 50, 221, 223, 0, 139, 0, 46, + 0, 0, 0, 52, 1455, 0, 484, 1199, 0, 119, + 120, 118, 111, 0, 2014, 1876, 1877, 1878, 1879, 1829, + 1880, 1881, 0, 1882, 1883, 1835, 1885, 1886, 1887, 1888, + 1889, 1890, 1891, 1892, 1842, 1894, 1895, 1896, 1897, 1898, + 1899, 2040, 1900, 1856, 1902, 1862, 0, 1903, 1023, 1146, + 594, 1144, 1277, 0, 112, 1264, 0, 1329, 0, 0, + 0, 0, 482, 0, 0, 0, 0, 1289, 0, 1611, + 206, 210, 0, 1611, 201, 1611, 366, 0, 1611, 366, + 1611, 0, 1303, 1306, 0, 431, 426, 424, 423, 425, + 1611, 253, 0, 0, 1272, 436, 437, 0, 405, 0, + 0, 407, 0, 0, 217, 0, 215, 0, 401, 155, + 0, 228, 1387, 1388, 1386, 0, 0, 1381, 1345, 231, + 248, 1390, 1380, 1389, 1344, 1339, 0, 0, 1335, 471, + 0, 0, 0, 0, 1153, 880, 879, 863, 864, 877, + 878, 865, 866, 873, 874, 882, 881, 871, 872, 867, + 868, 861, 862, 869, 870, 875, 876, 859, 860, 1166, + 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, + 1164, 1165, 0, 0, 706, 704, 0, 0, 0, 0, + 0, 0, 1193, 0, 973, 1008, 0, 0, 0, 1138, + 1176, 0, 0, 0, 0, 0, 0, 1138, 1182, 0, + 0, 731, 743, 0, 628, 634, 705, 703, 0, 1216, + 698, 0, 777, 0, 757, 0, 756, 0, 0, 759, + 753, 0, 754, 0, 0, 0, 0, 755, 0, 0, + 0, 0, 0, 701, 0, 743, 0, 702, 774, 1421, + 1420, 1416, 1403, 1411, 195, 0, 1268, 1904, 1905, 1906, + 821, 1907, 850, 828, 850, 850, 1908, 1909, 1910, 1911, + 817, 817, 830, 1912, 1913, 1914, 1915, 1916, 818, 819, + 855, 1917, 1918, 1919, 1920, 1921, 0, 0, 1922, 850, + 1923, 817, 1924, 1925, 1926, 822, 1927, 785, 1928, 0, + 1929, 820, 786, 1930, 858, 858, 1931, 0, 845, 1932, + 0, 1149, 795, 803, 804, 805, 806, 831, 832, 807, + 837, 838, 808, 902, 0, 817, 1269, 1270, 155, 1466, + 1482, 0, 1143, 1017, 849, 836, 1191, 0, 844, 843, + 0, 1143, 826, 825, 824, 1004, 0, 823, 1100, 850, + 850, 848, 928, 827, 0, 0, 0, 0, 0, 854, + 0, 852, 929, 907, 908, 0, 1226, 1235, 1138, 1142, + 0, 1002, 1138, 0, 0, 1090, 1092, 0, 1019, 1020, + 0, 1194, 1249, 1003, 0, 1254, 0, 0, 902, 902, + 1222, 1120, 0, 1110, 1113, 0, 0, 1117, 1118, 1119, + 0, 0, 0, 1214, 0, 1128, 1130, 0, 0, 944, + 1126, 0, 947, 0, 0, 0, 0, 1114, 1115, 1116, + 1106, 1107, 1108, 1109, 1111, 1112, 1124, 1105, 925, 0, + 999, 0, 1053, 0, 924, 1220, 696, 0, 1252, 696, + 1405, 1409, 1410, 1404, 1408, 0, 1399, 1398, 1401, 1402, + 1484, 0, 1441, 1425, 0, 1422, 1141, 691, 564, 1240, + 0, 568, 1446, 160, 159, 0, 0, 537, 536, 603, + 595, 597, 603, 0, 535, 0, 651, 652, 0, 0, + 0, 0, 684, 682, 1248, 1261, 639, 613, 638, 0, + 0, 617, 0, 643, 903, 677, 519, 607, 608, 611, + 518, 0, 680, 0, 690, 0, 556, 558, 541, 555, + 553, 538, 546, 678, 612, 0, 1448, 1472, 0, 0, + 0, 0, 0, 1611, 0, 0, 788, 83, 64, 318, + 138, 0, 0, 0, 0, 0, 0, 0, 91, 88, + 89, 90, 0, 0, 0, 0, 1268, 232, 233, 246, + 0, 237, 238, 235, 239, 240, 0, 0, 225, 226, + 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1456, 1449, 1195, 1200, 594, 594, + 594, 0, 592, 593, 0, 0, 0, 0, 0, 470, + 364, 374, 0, 0, 0, 1293, 205, 0, 0, 0, + 0, 0, 0, 401, 1296, 1294, 1292, 1295, 1297, 1582, + 189, 0, 0, 0, 0, 0, 197, 200, 0, 363, + 337, 0, 0, 1308, 0, 0, 0, 1611, 353, 1305, + 0, 1453, 0, 0, 251, 438, 1273, 0, 435, 438, + 1239, 0, 438, 219, 0, 0, 1341, 1383, 229, 249, + 230, 250, 484, 479, 509, 0, 487, 492, 468, 0, + 468, 0, 489, 493, 468, 488, 0, 468, 483, 1417, + 0, 1046, 0, 1036, 0, 0, 766, 0, 0, 1037, + 975, 976, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 993, 992, 1038, 770, 0, 773, 0, 0, 1174, 1175, + 0, 1039, 0, 0, 1181, 0, 0, 0, 1044, 0, + 708, 0, 0, 0, 623, 627, 630, 0, 633, 570, + 526, 1602, 1642, 0, 581, 581, 581, 579, 569, 0, + 655, 0, 0, 0, 732, 0, 0, 734, 736, 0, + 0, 739, 0, 714, 713, 0, 0, 0, 0, 778, + 0, 1244, 0, 0, 196, 0, 0, 0, 803, 0, + 0, 0, 793, 789, 0, 883, 884, 885, 886, 887, + 888, 889, 890, 891, 892, 893, 894, 809, 1281, 0, + 815, 1284, 1285, 1286, 1283, 1280, 1287, 1288, 0, 0, + 0, 0, 1190, 1186, 0, 0, 0, 0, 1095, 1097, + 1099, 0, 847, 846, 1104, 1110, 1113, 1117, 1118, 1119, + 1114, 1115, 1116, 1106, 1107, 1108, 1109, 1111, 1112, 0, + 1132, 0, 1086, 0, 0, 0, 0, 0, 0, 1225, + 0, 971, 0, 1021, 1006, 0, 0, 1093, 1022, 1227, + 1202, 0, 0, 0, 1257, 1256, 904, 913, 916, 948, + 949, 920, 921, 922, 926, 1279, 1278, 1221, 0, 1213, + 0, 0, 905, 930, 935, 0, 1183, 965, 0, 953, + 0, 943, 0, 951, 955, 931, 946, 0, 927, 0, + 1214, 1129, 1131, 0, 1127, 0, 917, 918, 919, 909, + 910, 911, 912, 914, 915, 923, 1103, 1101, 1102, 0, + 1200, 0, 1212, 0, 0, 1055, 0, 0, 950, 1218, + 0, 777, 594, 777, 0, 902, 1442, 1276, 1435, 1276, + 1424, 1139, 1241, 1275, 566, 0, 0, 0, 1444, 146, + 150, 0, 1201, 180, 182, 696, 0, 601, 602, 606, + 0, 0, 606, 585, 534, 1853, 1735, 0, 0, 0, + 0, 644, 685, 0, 676, 641, 642, 0, 640, 1248, + 645, 1247, 646, 649, 650, 618, 1236, 686, 688, 0, + 681, 0, 1242, 540, 559, 0, 0, 0, 0, 0, + 523, 522, 692, 0, 49, 0, 1611, 66, 0, 0, + 0, 0, 0, 0, 268, 0, 368, 268, 104, 1611, + 438, 1611, 438, 1506, 1577, 1753, 0, 62, 342, 95, + 0, 132, 371, 0, 327, 85, 100, 125, 0, 0, + 51, 222, 236, 241, 128, 245, 242, 1313, 243, 139, + 0, 47, 0, 126, 0, 1311, 0, 0, 53, 130, + 1315, 1457, 0, 1199, 0, 592, 592, 592, 0, 1145, + 0, 0, 0, 1147, 1148, 943, 1323, 1322, 1324, 1321, + 456, 469, 0, 365, 0, 481, 459, 460, 470, 1291, + 210, 0, 201, 366, 0, 366, 0, 1293, 0, 0, + 191, 187, 205, 211, 0, 0, 0, 0, 0, 364, + 356, 354, 387, 0, 361, 355, 0, 0, 313, 0, + 1500, 0, 0, 0, 0, 450, 0, 0, 0, 0, + 253, 254, 404, 1274, 406, 0, 408, 218, 216, 1336, + 476, 1143, 0, 474, 480, 475, 478, 473, 472, 0, + 467, 0, 502, 0, 0, 0, 0, 0, 0, 0, + 0, 1033, 1151, 0, 1169, 1168, 974, 981, 984, 988, + 989, 990, 1170, 0, 0, 0, 985, 986, 987, 977, + 978, 979, 980, 982, 983, 991, 775, 0, 0, 769, + 1179, 1178, 1172, 1173, 0, 1041, 1042, 1043, 1180, 0, + 0, 744, 621, 619, 622, 624, 620, 0, 0, 777, + 581, 581, 581, 581, 578, 0, 0, 0, 776, 0, + 672, 740, 738, 0, 762, 0, 735, 718, 741, 0, + 726, 0, 733, 782, 749, 0, 0, 751, 1412, 799, + 0, 794, 790, 0, 0, 0, 800, 0, 0, 0, + 0, 0, 0, 0, 1150, 587, 1018, 0, 0, 0, + 1187, 0, 970, 816, 829, 0, 1098, 1012, 0, 1121, + 1085, 857, 856, 858, 858, 0, 0, 0, 1234, 0, + 1139, 1089, 1091, 1235, 1005, 841, 902, 0, 0, 0, + 0, 0, 0, 0, 954, 945, 0, 952, 956, 0, + 0, 0, 939, 0, 0, 937, 966, 933, 0, 0, + 967, 1199, 0, 1203, 0, 0, 1054, 1063, 699, 695, + 655, 592, 655, 0, 1406, 1426, 1423, 567, 155, 1445, + 0, 169, 0, 0, 0, 0, 172, 186, 183, 1444, + 0, 0, 596, 598, 0, 1122, 606, 600, 648, 647, + 0, 616, 683, 614, 0, 689, 0, 557, 0, 543, + 0, 717, 0, 0, 0, 0, 0, 317, 0, 0, + 0, 268, 0, 376, 0, 383, 0, 0, 368, 349, + 84, 0, 0, 0, 58, 103, 76, 68, 54, 82, + 0, 0, 87, 0, 80, 97, 98, 96, 101, 0, + 278, 303, 0, 0, 314, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 484, 1200, 1196, 1200, + 0, 0, 0, 594, 590, 591, 1024, 0, 455, 508, + 505, 506, 504, 227, 375, 0, 0, 0, 199, 363, + 0, 1308, 0, 1290, 401, 0, 192, 0, 190, 210, + 0, 0, 201, 366, 0, 341, 337, 362, 335, 334, + 336, 0, 1501, 220, 0, 1495, 366, 1307, 0, 0, + 451, 0, 445, 0, 1302, 252, 438, 0, 463, 503, + 510, 490, 495, 0, 501, 497, 496, 491, 499, 498, + 494, 1034, 1045, 1167, 0, 0, 0, 0, 768, 771, + 0, 1040, 1035, 742, 0, 0, 655, 0, 0, 0, + 0, 572, 571, 577, 0, 0, 1057, 737, 0, 0, + 0, 724, 712, 719, 720, 0, 0, 0, 780, 779, + 750, 803, 0, 783, 803, 0, 803, 0, 801, 0, + 810, 895, 896, 897, 898, 899, 900, 901, 835, 0, + 1189, 1185, 1094, 1096, 1133, 853, 851, 1224, 1138, 1229, + 1231, 0, 0, 0, 1088, 972, 1255, 906, 0, 0, + 936, 1184, 957, 0, 0, 0, 932, 1121, 0, 0, + 0, 0, 0, 941, 0, 1207, 1200, 0, 1206, 0, + 0, 0, 0, 1029, 700, 672, 0, 672, 0, 0, + 1443, 0, 1438, 147, 148, 149, 0, 0, 0, 164, + 141, 0, 0, 181, 169, 157, 604, 605, 0, 599, + 615, 1237, 1243, 542, 0, 1002, 0, 0, 539, 0, + 133, 268, 0, 0, 65, 0, 385, 329, 377, 360, + 344, 0, 0, 0, 269, 0, 402, 0, 0, 350, + 0, 0, 0, 0, 330, 0, 0, 289, 0, 0, + 360, 0, 367, 285, 286, 0, 57, 77, 0, 73, + 0, 102, 0, 0, 0, 0, 0, 60, 72, 0, + 55, 0, 438, 438, 63, 1268, 1904, 1905, 1906, 1907, + 1908, 1909, 1910, 1911, 1912, 1913, 2024, 1914, 1915, 1916, + 1917, 1918, 1919, 1920, 1921, 2033, 1922, 275, 1923, 1680, + 1924, 1925, 1926, 1927, 1928, 0, 1929, 786, 1930, 1931, + 2112, 1932, 1106, 1107, 274, 273, 370, 270, 378, 272, + 0, 1269, 271, 373, 328, 129, 1314, 0, 127, 0, + 1312, 136, 134, 131, 1316, 1450, 0, 0, 1027, 1028, + 1025, 592, 0, 0, 0, 484, 462, 0, 0, 0, + 1500, 0, 0, 0, 1611, 0, 188, 0, 0, 202, + 1308, 198, 363, 0, 393, 313, 388, 0, 1500, 1498, + 0, 1308, 1494, 0, 442, 0, 0, 0, 409, 477, + 0, 500, 994, 0, 0, 0, 0, 631, 0, 637, + 672, 576, 575, 574, 573, 654, 1551, 1836, 1734, 0, + 658, 653, 656, 661, 663, 662, 664, 660, 671, 0, + 674, 761, 1134, 1136, 0, 0, 0, 0, 725, 727, + 0, 729, 0, 781, 797, 0, 798, 0, 796, 791, + 802, 1188, 1232, 1233, 1228, 0, 903, 963, 961, 958, + 0, 959, 940, 0, 0, 938, 934, 0, 968, 0, + 0, 1204, 0, 1049, 0, 1052, 1066, 1062, 1061, 1057, + 1024, 1057, 1407, 565, 168, 145, 171, 170, 0, 1201, + 178, 0, 0, 169, 0, 173, 452, 0, 0, 554, + 716, 547, 548, 0, 381, 67, 0, 360, 0, 268, + 346, 345, 348, 343, 347, 0, 403, 0, 0, 287, + 0, 294, 332, 333, 331, 288, 360, 366, 290, 0, + 0, 0, 69, 59, 56, 61, 70, 0, 0, 71, + 74, 782, 86, 79, 1268, 2033, 2042, 0, 0, 0, + 0, 0, 1198, 1197, 0, 458, 457, 507, 454, 465, + 227, 0, 0, 0, 337, 1497, 0, 0, 447, 0, + 0, 363, 193, 0, 0, 0, 0, 1500, 0, 0, + 265, 0, 310, 0, 213, 1499, 0, 0, 1486, 0, + 0, 1300, 1301, 0, 464, 995, 0, 996, 772, 0, + 0, 629, 1057, 0, 0, 0, 665, 659, 0, 1056, + 1058, 0, 626, 1137, 721, 0, 723, 0, 747, 0, + 747, 730, 792, 784, 1230, 1047, 0, 960, 964, 962, + 942, 1200, 1208, 1200, 1205, 1051, 1065, 1068, 674, 1253, + 674, 0, 0, 156, 0, 0, 153, 140, 158, 1123, + 544, 545, 0, 268, 0, 359, 382, 299, 277, 0, + 0, 0, 284, 291, 392, 293, 0, 78, 94, 0, + 0, 372, 137, 135, 1026, 484, 0, 204, 1308, 313, + 1494, 444, 0, 0, 0, 0, 337, 220, 1496, 326, + 319, 320, 321, 322, 323, 324, 325, 340, 339, 311, + 312, 0, 0, 0, 0, 0, 446, 1302, 0, 175, + 184, 0, 175, 997, 632, 0, 674, 0, 0, 0, + 657, 0, 0, 673, 0, 530, 1135, 0, 711, 709, + 0, 710, 0, 0, 0, 0, 594, 626, 626, 142, + 0, 143, 179, 0, 0, 0, 366, 384, 358, 0, + 351, 297, 296, 298, 302, 0, 300, 0, 316, 0, + 309, 277, 0, 81, 0, 379, 453, 461, 0, 267, + 1488, 363, 0, 203, 1494, 313, 1500, 1494, 0, 1491, + 0, 443, 0, 0, 0, 177, 1308, 0, 177, 0, + 626, 667, 0, 666, 1060, 1059, 628, 722, 0, 1048, + 1210, 1209, 0, 1072, 529, 528, 0, 0, 0, 0, + 392, 0, 338, 0, 0, 299, 0, 292, 389, 390, + 391, 0, 305, 295, 306, 75, 93, 380, 0, 363, + 1489, 266, 214, 1487, 1492, 1493, 0, 175, 174, 603, + 176, 777, 185, 603, 636, 531, 668, 625, 728, 1067, + 0, 0, 0, 0, 0, 152, 777, 163, 0, 309, + 357, 352, 276, 301, 315, 0, 0, 0, 307, 0, + 308, 1494, 0, 177, 606, 1298, 606, 1822, 1552, 1788, + 0, 1084, 1073, 1084, 1084, 1064, 144, 151, 0, 268, + 281, 0, 280, 0, 369, 304, 1490, 1308, 603, 165, + 166, 0, 1077, 1076, 1075, 1079, 1078, 0, 1071, 1069, + 1070, 777, 386, 279, 283, 282, 777, 606, 0, 0, + 1081, 0, 1082, 162, 1299, 167, 1074, 1080, 1083 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 48, 49, 50, 750, 2593, 2594, 2595, 2235, 1204, - 3360, 2236, 1205, 1206, 2597, 751, 801, 1092, 803, 1093, - 1602, 905, 1238, 1239, 752, 1751, 753, 2816, 2159, 2541, - 3342, 55, 3087, 2162, 1164, 3090, 3307, 2809, 3085, 2542, - 3382, 3436, 3088, 2163, 2164, 3308, 2165, 754, 2654, 2655, - 755, 756, 1835, 59, 1300, 546, 1832, 757, 1333, 1334, - 960, 758, 1836, 1779, 2932, 1224, 1769, 1348, 62, 1853, - 759, 106, 64, 760, 2582, 2933, 3353, 2608, 3491, 2869, - 2870, 3350, 3351, 2585, 2238, 3419, 3420, 2669, 1760, 3414, - 2319, 3294, 2242, 2223, 2871, 2327, 3252, 2981, 2239, 2851, - 2320, 3346, 1848, 2321, 3347, 3106, 2322, 1810, 1839, 2586, - 3421, 2243, 1811, 2581, 2934, 1748, 2323, 3357, 2324, 547, - 2855, 761, 741, 742, 952, 1327, 743, 762, 936, 1845, - 763, 764, 2635, 2297, 3157, 2684, 3158, 2358, 2291, 1357, - 2352, 1873, 1813, 1358, 535, 1887, 2685, 2640, 1874, 765, - 1094, 72, 73, 1007, 74, 3100, 75, 76, 1725, 1726, - 1727, 848, 860, 861, 2155, 1441, 1957, 853, 1168, 1694, - 835, 836, 2281, 876, 1802, 1689, 1690, 2168, 2549, 1718, - 1719, 1177, 1178, 1945, 3322, 1946, 1947, 1434, 1435, 3198, - 1706, 1710, 1711, 2189, 2179, 1697, 2427, 3017, 3018, 3019, - 3020, 3021, 3022, 3023, 1095, 2723, 3209, 1714, 1715, 1180, - 1181, 1182, 1723, 2199, 78, 79, 2140, 2525, 2526, 807, - 3034, 1460, 1728, 2727, 2728, 2729, 3037, 3038, 3039, 808, - 1002, 1003, 1026, 1021, 1449, 1966, 809, 810, 1922, 1923, - 2396, 1028, 1959, 1977, 1978, 2735, 2451, 1529, 2224, 1530, - 1531, 1992, 1532, 1096, 1533, 1561, 1097, 1566, 1535, 1098, - 1099, 1100, 1538, 1101, 1102, 1103, 1104, 1554, 1105, 1106, - 1578, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2006, 1151, 1729, 1108, 1109, 1110, 1111, - 1112, 1113, 1114, 812, 1115, 1116, 1651, 2134, 2524, 3027, - 3206, 3207, 2800, 3075, 3234, 3333, 3450, 3478, 3479, 3505, - 1117, 1118, 1594, 1595, 1596, 2027, 2028, 2029, 2030, 2128, - 1645, 1646, 1119, 2936, 1648, 2050, 3030, 3031, 1152, 1427, - 1589, 1279, 1280, 1543, 1401, 1402, 1408, 1897, 1416, 1420, - 1927, 1928, 1428, 2096, 1120, 2021, 2022, 2468, 1556, 1121, - 1237, 1601, 2795, 2131, 1649, 2090, 1128, 1122, 1129, 1124, - 1585, 1586, 2485, 2767, 2768, 2060, 2196, 1678, 2201, 2202, - 956, 1125, 1126, 1127, 1281, 519, 1544, 3437, 1323, 1157, - 1282, 2086, 766, 1034, 2014, 767, 1296, 1825, 768, 3189, - 2994, 1312, 1849, 2332, 548, 769, 770, 528, 85, 2286, - 917, 86, 87, 88, 885, 1350, 771, 1351, 1352, 967, - 89, 2686, 969, 970, 773, 842, 843, 1472, 1665, 1473, - 774, 818, 1470, 775, 1147, 857, 1148, 1150, 776, 1141, - 2538, 2157, 94, 95, 96, 114, 1235, 777, 829, 830, - 866, 99, 100, 1192, 831, 849, 779, 780, 3185, 781, - 2672, 1306, 529, 521, 522, 1546, 715, 1284, 716 + -1, 48, 49, 50, 750, 2596, 2597, 2598, 2236, 1205, + 3363, 2237, 1206, 1207, 2600, 751, 801, 1092, 803, 1093, + 1603, 905, 1239, 1240, 752, 1752, 753, 2819, 2160, 2544, + 3345, 55, 3090, 2163, 1165, 3093, 3310, 2812, 3088, 2545, + 3385, 3439, 3091, 2164, 2165, 3311, 2166, 754, 2657, 2658, + 755, 756, 1836, 59, 1301, 546, 1833, 757, 1334, 1335, + 960, 758, 1837, 1780, 2935, 1225, 1770, 1349, 62, 1854, + 759, 106, 64, 760, 2585, 2936, 3356, 2611, 3494, 2872, + 2873, 3353, 3354, 2588, 2239, 3422, 3423, 2672, 1761, 3417, + 2320, 3297, 2243, 2224, 2874, 2328, 3255, 2984, 2240, 2854, + 2321, 3349, 1849, 2322, 3350, 3109, 2323, 1811, 1840, 2589, + 3424, 2244, 1812, 2584, 2937, 1749, 2324, 3360, 2325, 547, + 2858, 761, 741, 742, 952, 1328, 743, 762, 936, 1846, + 763, 764, 2638, 2298, 3160, 2687, 3161, 2361, 2292, 1358, + 2354, 1874, 1814, 1359, 535, 1888, 2688, 2643, 1875, 765, + 1094, 72, 73, 1007, 74, 3103, 75, 76, 1726, 1727, + 1728, 848, 860, 861, 2156, 1442, 1958, 853, 1169, 1695, + 835, 836, 2282, 876, 1803, 1690, 1691, 2169, 2552, 1719, + 1720, 1178, 1179, 1946, 3325, 1947, 1948, 1435, 1436, 3201, + 1707, 1711, 1712, 2190, 2180, 1698, 2430, 3020, 3021, 3022, + 3023, 3024, 3025, 3026, 1095, 2726, 3212, 1715, 1716, 1181, + 1182, 1183, 1724, 2200, 78, 79, 2141, 2528, 2529, 807, + 3037, 1461, 1729, 2730, 2731, 2732, 3040, 3041, 3042, 808, + 1002, 1003, 1026, 1021, 1450, 1967, 809, 810, 1923, 1924, + 2399, 1028, 1960, 1978, 1979, 2738, 2454, 1530, 2225, 1531, + 1532, 1993, 1533, 1096, 1534, 1562, 1097, 1567, 1536, 1098, + 1099, 1100, 1539, 1101, 1102, 1103, 1104, 1555, 1105, 1106, + 1579, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, + 2004, 2005, 2006, 2007, 1152, 1730, 1108, 1109, 1110, 1111, + 1112, 1113, 1114, 1115, 812, 1116, 1117, 1652, 2135, 2527, + 3030, 3209, 3210, 2803, 3078, 3237, 3336, 3453, 3481, 3482, + 3508, 1118, 1119, 1595, 1596, 1597, 2028, 2029, 2030, 2031, + 2129, 1646, 1647, 1120, 2939, 1649, 2051, 3033, 3034, 1153, + 1428, 1590, 1280, 1281, 1544, 1402, 1403, 1409, 1898, 1417, + 1421, 1928, 1929, 1429, 2097, 1121, 2022, 2023, 2471, 1557, + 1122, 1238, 1602, 2798, 2132, 1650, 2091, 1129, 1123, 1130, + 1125, 1586, 1587, 2488, 2770, 2771, 2061, 2197, 1679, 2202, + 2203, 956, 1126, 1127, 1128, 1282, 519, 1545, 3440, 1324, + 1158, 1283, 2087, 766, 1034, 2015, 767, 1297, 1826, 768, + 3192, 2997, 1313, 1850, 2333, 548, 769, 770, 528, 85, + 2287, 917, 86, 87, 88, 885, 1351, 771, 1352, 1353, + 967, 89, 2689, 969, 970, 773, 842, 843, 1473, 1666, + 1474, 774, 818, 1471, 775, 1148, 857, 1149, 1151, 776, + 1142, 2541, 2158, 94, 95, 96, 114, 1236, 777, 829, + 830, 866, 99, 100, 1193, 831, 849, 779, 780, 3188, + 781, 2675, 1307, 529, 521, 522, 1547, 715, 1285, 716 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -2987 +#define YYPACT_NINF -3059 static const int yypact[] = { - 6315, -13, 722, -2987, -2987, 285, -13, 49878, 64713, 72, - -13, 172, 4065, 51858, -2987, -2987, 46413, 41312, -13, 54828, - 72049, 349, 300, 31840, 382, 55323, 55323, -2987, -2987, -2987, - 64713, 54828, 55818, -13, 340, 65208, -2987, -13, 34315, 52353, - -27, -2987, 54828, 34, 16, 56313, 54828, 2732, 576, 224, - -2987, -2987, -2987, -2987, -2987, 126, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, 144, -2987, 116, 147, 31840, 31840, 1267, 318, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 311, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - 33820, -2987, -2987, -2987, -2987, -2987, -2987, 56808, 54828, 57303, - 52848, 57798, -2987, 613, 819, -2987, 160, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 181, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 396, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, 188, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, 381, -2987, 402, -2987, - 189, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - 1569, -2987, -2987, 818, 2426, 54828, 20, 695, 580, -2987, - 58293, -2987, 591, 54828, -2987, -2987, 638, 856, 855, -2987, - -2987, 53343, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 46908, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, 815, -2987, -2987, - 594, -2987, 154, -2987, -2987, 605, 625, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, 820, -2987, -2987, -2987, - 835, 65703, 58788, 59283, -2987, 704, 3136, 7105, 72067, 30848, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, 311, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, 55323, 64713, 55323, 717, 729, 1083, 739, 32335, - 756, 34811, 772, 781, 1128, 795, 800, 824, 830, 16, - 31344, 822, 381, -2987, 59778, 59778, -10, 1763, -2987, 59778, - 60273, -2987, 852, -2987, 819, -2987, -2987, -2987, 1185, -2987, - 419, 853, -2987, 60768, 60768, 60768, 877, 1157, -2987, -2987, - -2987, 875, -2987, -2987, 1116, 20517, 20517, 66198, 66198, 819, - 66198, 925, -2987, -2987, 37, -2987, -2987, -2987, 1267, 911, - 381, -2987, -2987, 52353, -2987, -2987, 225, 1287, 20517, 54828, - 943, -2987, 957, 943, 967, 969, 978, -2987, 6315, 1298, - 1209, 52353, 343, 343, 1463, 343, 1056, 1084, 6398, 6686, - -2987, 1859, -2987, 1019, -2987, 54828, 1124, 1049, 1325, -2987, - 911, 1409, 185, 1213, 1419, 4415, 1428, 559, 1443, 985, - 1450, 1576, 20517, 47403, 381, -2987, 11660, 20517, -2987, -2987, - -2987, 1207, -2987, -2987, -2987, -2987, -2987, 54828, 64713, 1112, - 1125, -2987, -2987, -2987, -2987, 1358, 1367, -2987, 1603, 66693, - -2987, -2987, 1179, 61263, 61758, 62253, 62748, 1561, -2987, -2987, - 1504, -2987, -2987, -2987, 1186, -2987, -2987, -2987, 332, 67188, - 1518, 1164, 175, -2987, 1530, 212, -2987, 1533, 1407, 15307, - -2987, 1346, -2987, -2987, -2987, 16, -2987, 284, -2987, -2987, - 43357, -2987, -2987, 72067, 1272, 1195, -2987, 1558, 20517, 20517, - 1223, 7242, 59778, 60273, 20517, 54828, -2987, 20517, 25206, 1227, - 20517, 20517, 12702, 20517, 29858, 59778, 1763, 1231, -2987, 588, - 54828, 1242, -2987, 1334, 1334, 340, 31840, 1540, -2987, 219, - 1568, 1467, -2987, 31840, 1467, 916, 1280, 1580, 1467, -2987, - 598, 1583, 1334, 35306, 1301, -2987, 1334, 1505, -2987, -2987, - 55323, 20517, 15307, 69663, 1779, -2987, -2987, -2987, -2987, 1596, - 64713, 1308, -2987, -2987, -2987, -2987, -2987, -2987, 669, 1827, - 141, 1830, 20517, 141, 141, 1329, 190, 190, -2987, 1524, - 1336, -2987, 195, 1337, 1338, 1849, 1850, 167, 163, 353, - 141, 20517, -2987, 190, 1345, 1855, 1347, 1857, 156, 187, - -2987, 199, 20517, 20517, 20517, 1715, 20517, 10618, -2987, 54828, - 1858, 47403, 692, -2987, 381, 1352, 819, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, 1354, -2987, 180, 6820, -2987, -2987, - -2987, -2987, -2987, 1392, -2987, -2987, -2987, -2987, 1572, 20517, - -2987, -2987, 1356, 1540, -2987, 204, -2987, -2987, 1540, -2987, - -2987, -2987, -2987, -2987, 220, 1766, 20517, 20517, 64713, 381, - 67683, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 441, -2987, - 311, 45045, 1357, 1361, 943, 54828, 54828, 1837, -2987, -2987, - -2987, -2987, 52353, 142, 1660, 1492, -2987, -2987, 1267, 1267, - 15828, 737, 487, 1054, 16349, 21038, 1714, 1597, 227, 218, - 1719, -2987, 1600, 1829, 25206, 20517, 20517, 1056, 1084, 20517, - 957, -2987, -2987, -2987, 1655, 54828, 50373, 937, 941, 1377, - 1464, 1379, 81, 1808, -2987, 1384, -2987, 1485, 54828, 71598, - 192, -2987, 1856, 192, 192, 251, 1864, 1488, 272, 1652, - 362, 257, 1384, 202, -2987, 52353, 197, 761, 1384, 54828, - 1498, 788, 1384, 1820, 64713, 1195, 40944, 1406, -2987, -2987, - -2987, 164, 15307, -2987, 1156, 1311, 1320, 391, 153, 1373, - 1420, 15307, 1478, 1542, 168, 1577, 1587, 1601, 1659, 1665, - 1674, 1679, 1691, 149, 1710, 1712, 1718, 1720, 1726, 1730, - -2987, 1741, 170, 1760, 206, 15307, 1773, -2987, 45045, -1, - -2987, -2987, 1777, 174, -2987, 45134, -2987, 1713, 1508, 1509, - 64713, 1465, 54828, 1570, 865, 1793, 1846, 70143, 1675, -2987, - 1750, 54828, 1678, 202, 1680, 1439, 1916, 1684, 1125, 1685, - 1448, -2987, 68178, 47403, -2987, -2987, -2987, -2987, -2987, 1811, - 1794, 64713, 47403, 1452, -2987, -2987, 64713, -2987, 54828, 54828, - -2987, 54828, 64713, -2987, 526, 45045, 1957, 617, 72067, 48888, - -2987, -2987, -2987, -2987, 1143, 1201, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, 819, 47403, -2987, 3327, 55323, - 43975, 1459, 20517, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, 1461, 1807, -2987, -2987, 6597, 1466, 44015, 1468, 25206, - 25206, 381, 4715, -2987, -2987, 25206, 1469, 49383, 43888, 1462, - 1471, 44363, 16870, 20517, 16870, 16870, 44450, -2987, 1473, 44527, - 59778, 1475, 54828, 53838, -2987, -2987, -2987, 20517, 20517, 1763, - 54333, 1520, 31840, -2987, 31840, -2987, 1758, 31840, -2987, -2987, - 3920, -2987, 31840, 1770, 20517, 31840, -2987, 31840, 1717, 1721, - 1481, 31840, -2987, 54828, 1493, 54828, -2987, -2987, -2987, -2987, - -2987, 45045, -2987, 1491, 633, 1499, -2987, -2987, -2987, -2987, - -2987, 1551, -2987, 1551, 1551, -2987, -2987, -2987, -2987, 1502, - 1502, 1507, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, 1513, 353, -2987, 1551, -2987, - 1502, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 71598, -2987, - -2987, -2987, -2987, 621, 645, -2987, 1514, -2987, -2987, 1515, - -2987, 1503, 1979, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, 8492, 742, 1502, -2987, -2987, 4693, -2987, -2987, - 20517, 20517, -2987, -2987, 1516, 45045, 1550, -2987, -2987, 20517, - 20517, -2987, -2987, -2987, -2987, 2024, -2987, 20517, 1551, 1551, - -2987, 5276, -2987, 39763, 17391, 1610, 1611, 2024, -2987, 2024, - -2987, 5276, 2033, 2033, 37781, -2987, 1695, 44614, -2987, 1536, - 1877, 7400, 1538, 1527, -2987, 1544, 1543, -2987, -2987, 41872, - 137, 381, 381, 20517, -2987, 2024, 20517, 8530, 8530, -2987, - 294, 69663, 20517, 20517, 20517, 20517, 20517, 20517, 20517, 20517, - 45918, 1628, 171, 64713, 20517, 20517, 1549, 881, -2987, 20517, - 1786, -2987, 1553, 20517, 1641, 896, 20517, 20517, 20517, 20517, - 20517, 20517, 20517, 20517, 20517, -2987, -2987, 28853, 347, 740, - 1890, 1909, -26, 1212, 20517, 1901, 11660, -2987, 1901, -2987, - -2987, -2987, -2987, -2987, 205, -2987, -2987, 1491, 1491, -2987, - 64713, -2987, 54828, 225, 51363, 20517, -2987, -2987, 1562, 1563, - 546, 1619, -2987, -2987, 54828, 38276, 1862, -2987, 357, 1567, - -2987, 43849, 1816, 1862, 1267, -2987, -2987, 26248, 1697, 1863, - 1800, -2987, -2987, 1781, 1785, -2987, 1573, 45267, 21559, 21559, - -2987, 1411, 45045, 1433, -2987, -2987, -2987, -2987, -2987, -2987, - 547, -2987, 54828, 78, 35801, -2987, 1581, 102, -2987, 5415, - 1920, 1883, 1714, 218, 1590, -2987, -2987, 996, 1593, 68673, - 54828, 1882, 1835, 1884, -45, 69663, -2987, -2987, -2987, -2987, - 54828, 64713, 63243, 69168, 47898, 54828, 47403, -2987, -2987, -2987, - -2987, 54828, 1102, 54828, 6396, -2987, -2987, -2987, -2987, 192, - -2987, -2987, -2987, -2987, -2987, 64713, 54828, -2987, -2987, 192, - 64713, 54828, 192, -2987, 1082, 54828, 54828, 54828, 54828, 1208, - 54828, 54828, 819, -2987, -2987, -2987, 22080, 8, 8, 1817, - 13223, 131, -2987, 20517, 20517, 901, 273, 64713, 1778, -2987, - -2987, 770, 1826, 200, -2987, 64713, 1649, 54828, 54828, 54828, - 54828, 54828, 1363, -2987, -2987, -2987, -2987, -2987, 1604, -2987, - 1965, 2116, 1606, 1614, 1978, -2987, 202, 1983, 50868, 159, - 2595, 1986, 1663, 1989, 13744, 2091, 1868, -2987, -2987, 1866, - -2987, 64713, 2141, -2987, 175, -2987, 47403, -2987, 212, -2987, - 1869, 241, -2987, 15307, 20517, -2987, -2987, -2987, -2987, -2987, - -2987, 1195, 29359, -2987, 776, -2987, -2987, 2108, 819, 2108, - 672, -2987, -2987, 2108, -2987, 2094, 2108, -2987, -2987, 69663, - -2987, 7699, -2987, 20517, 20517, -2987, 20517, 1994, -2987, 2146, - 2146, 69663, 25206, 25206, 25206, 25206, 25206, 25206, 213, 1345, - 25206, 25206, 25206, 25206, 25206, 25206, 25206, 25206, 25206, 26769, - 230, -2987, -2987, 786, 2119, 20517, 20517, 2001, 1994, 20517, - -2987, 69663, 1645, -2987, 1653, 1654, 20517, -2987, 69663, -2987, - 54828, 1656, -2, 561, -2987, 1664, 1669, -2987, 1540, -2987, - 810, 847, 54828, 2652, 3454, 3760, -2987, -2987, 20517, 1990, - 3920, 3920, 31840, -2987, 20517, 1670, -2987, -2987, 31840, 2007, - -2987, 3920, -2987, -2987, 36296, 3920, 69663, 825, -2987, 54828, - 69663, 833, 20517, -2987, 15307, 2171, 69663, 2138, 64713, 64713, - 2182, 1677, 1681, 2024, 1764, -2987, 1767, 1769, 1772, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 69663, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, 1673, 1688, 20517, - 20517, 138, -2987, 7786, 1690, 1693, 5578, -2987, 1696, -2987, - 1682, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 1702, -2987, - 1694, -2987, 1698, 1709, 1722, 1706, 1707, 54828, -2987, 22601, - -2987, 64713, -2987, -2987, 20517, 20517, 54828, -2987, 1715, -2987, - 1708, 1716, 8076, -2987, -2987, -2987, 239, 769, 8382, 1212, - 2227, 2227, 2227, 5276, -2987, -2987, -2987, 1731, -2987, 25206, - 25206, -2987, 2509, 256, 10618, -2987, -2987, 2058, -2987, 954, - -2987, 1727, -2987, -2987, 1988, -2987, 39763, 45338, 20517, 173, - -2987, 20517, 1549, 20517, 1802, 2227, 2227, 2227, 282, 282, - 239, 239, 239, 769, 1212, -2987, -2987, -2987, 1735, 20517, - 47403, -2987, 1739, 1752, 2077, 1347, 20517, -2987, -2987, 31840, - 1520, -1, 1520, 2024, 8530, -2987, 957, -2987, 957, -2987, - 45045, 54828, -2987, -2987, 1985, 1757, 31840, 1771, 2196, 2181, - 64713, -2987, -2987, 1745, 1901, 1742, -2987, -2987, 1776, 20517, - 1749, 1776, -2987, 1862, 5, 1982, 1202, 1202, 1411, 1987, - -2987, -2987, 1831, -2987, -2987, -2987, 20517, 14265, 1444, -2987, - 1447, -2987, -2987, -2987, -2987, -2987, 1765, -2987, 2035, -2987, - 54828, -2987, -2987, 25206, 2217, 20517, 36791, 2222, 2019, -2987, - -2987, -2987, 1860, 1384, 20517, 2011, -2987, 240, 1775, 2135, - 293, 2089, 64713, -2987, 281, 334, -2987, 755, 2142, 241, - 2144, 241, 47403, 47403, 47403, 843, -2987, -2987, -2987, 819, - -2987, 331, 854, -2987, -2987, -2987, -2987, 1865, 806, 1384, - 202, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 198, 814, - 1384, 1870, -2987, 1872, -2987, 1874, 823, 1384, -2987, -2987, - 1576, 9053, 45045, 522, 131, 131, 131, 15307, -2987, 2016, - 2023, 1795, 45045, 45045, 135, -2987, -2987, -2987, -2987, 1801, - -2987, 210, -2987, 64713, -2987, -2987, -2987, 1778, 1846, 1750, - 54828, 202, 1803, 2268, 1125, 1448, -2987, 1962, 1043, 1676, - -2987, 64713, -2987, 47403, 64713, 54828, 54828, 54828, 63738, -2987, - -2987, -2987, 1804, 1805, -2987, 9, 2031, 2036, 54828, 1844, - 54828, 1379, 2282, 54828, -2987, 858, 17912, 2172, 54828, 1794, - -2987, -2987, -2987, -2987, 64713, -2987, -2987, 45045, -2987, -2987, - 48393, -2987, -2987, -2987, -2987, -2987, 47403, -2987, 819, -2987, - 819, 2057, 64713, 42367, 819, 42862, 819, 1822, -2987, 45045, - 8224, 45045, 2001, -2987, 148, 2146, 1825, 1825, 1825, 4327, - 2167, 215, 1828, 1825, 1825, 1825, 296, 296, 148, 148, - 148, 2146, 230, 852, 49383, 1832, -2987, 45045, 45045, -2987, - -2987, 1824, -2987, -2987, -2987, -2987, 1833, 1836, -2987, -2987, - -2987, -2987, -2987, -2987, 64713, 1238, 1520, -27, -27, -27, - -27, -2987, 54828, 54828, 54828, 45045, 2281, 2159, -2987, -2987, - 3920, 45045, 54828, -2987, 27811, -2987, 54828, -2987, 2179, -2987, - 2267, -2987, 54828, 863, -2987, -2987, -2987, 926, 1838, 1681, - 69663, 931, 955, -2987, 2024, 194, 1843, 1555, 1278, 492, - 1445, -2987, -2987, -2987, 1845, 44749, 20517, -2987, 2209, -2987, - -2987, -2987, 20517, 20517, -2987, 39763, -2987, -2987, -2987, -2987, - -50, -50, 1848, 10618, 44971, -2987, 2155, 8299, 45045, -2987, - 1695, -2987, -2987, 8530, 20517, 1205, 3014, 20517, 1851, 20517, - 2188, -2987, -2987, 1854, -2987, -2987, 69663, 20517, 1861, 2787, - 25206, 25206, 3657, -2987, 6043, 20517, 10618, -2987, 41030, 1840, - 1871, 1817, 18433, -2987, 2061, 1852, -2987, 1990, 131, 1990, - 1867, -2987, -2987, -2987, -2987, 4693, -2987, 20517, 2004, 64713, - 379, 2098, 961, -2987, 381, 38276, 1771, 20517, 247, -2987, - -2987, 1880, -2987, 1776, -2987, -2987, -2987, 2075, -2987, -2987, - -2987, 54828, -2987, 1873, -2987, 35801, 2189, 11139, -2987, 35801, - 54828, 54828, 40266, 2220, -2987, 64713, 64713, 64713, -2987, 64713, - 1878, 1876, 899, 1881, 752, -2987, 1847, 899, 2199, 651, - 1379, 272, 2556, 423, -2987, -2987, -2987, 1938, 54828, -2987, - 64713, -2987, -2987, -2987, -2987, -2987, 47898, -2987, -2987, 39267, - 47403, -2987, 47403, 54828, 54828, 54828, 54828, 54828, 54828, 54828, - 54828, 54828, 54828, 1195, 20517, -2987, 20517, 1887, 1891, 1892, - 1817, -2987, -2987, -2987, 223, -2987, 1889, -2987, -2987, -2987, - 257, -2987, 210, 1885, 1894, -2987, 50868, 2426, 1663, 2338, - 1846, 767, 64218, -2987, 1895, 1879, 1750, 963, 965, 202, - 1897, 2340, -2987, 159, 50868, -2987, -2987, -2987, 2297, -2987, - 704, 209, -2987, 1125, -2987, 2426, 1448, -2987, 2426, 45045, - 64713, 1932, -2987, 241, 971, -2987, -2987, -2987, -2987, -2987, - 64713, 1899, -2987, 1899, -2987, -2987, 1899, -2987, -2987, -2987, - -2987, 25206, 2238, 1905, 69663, -2987, -2987, 54828, -2987, -2987, - -2987, 1000, 1900, 1990, 54828, 54828, 54828, 54828, -2987, -2987, - -2987, 18954, 20517, 1946, -2987, 1907, 12181, 2225, -2987, 27290, - -2987, -2987, 1913, 36296, 64713, -2987, -2987, -2987, -2987, 2024, - -2987, -2987, 64713, -2987, 1922, -2987, 1923, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, 20517, 45045, -2987, 45045, - -2987, -2987, -2987, -2987, -2987, 7353, -2987, 1919, 1925, 64713, - 20517, -2987, -2987, -2987, 773, 20517, 20517, 2509, -2987, 45429, - 20517, 69663, 1002, 2509, 348, 20517, 5175, 5705, 20517, 20517, - 6302, 40305, -2987, 23122, 14786, -2987, 1926, 20517, 40344, 38771, - -2987, 31840, 2159, 1927, 2159, 819, 1931, 45045, 20517, -2987, - -2987, -2987, -2987, 1991, 67, 33325, 2149, -2987, 1944, 64713, - -2987, 2004, 45045, -2987, -2987, 39763, -2987, -2987, -2987, -2987, - -2987, 2389, 2000, 1935, 1937, -2987, 1365, -2987, -2987, 64713, - 1939, -2987, 1940, 899, -2987, 64713, 1980, -2987, 309, 2253, - 95, -2987, 20517, -2987, 2343, 2421, 1847, 1950, 64713, 54828, - 25206, -2987, 414, 246, -2987, 2241, 54828, 1980, 2380, -2987, - -2987, -2987, 752, -2987, 2279, 2194, -2987, 192, -2987, 20517, - 752, 2195, 222, 64713, -2987, -2987, 3395, -2987, 69663, 241, - 241, -2987, 1499, 1963, 1964, 1966, 1967, 1968, 1969, 1972, - 1973, 1975, 1997, -2987, 2003, 2005, 2006, 2010, 2012, 2013, - 2015, 2017, 1513, 2018, -2987, 2020, 1880, 2022, 2025, 2028, - 2030, 2032, 70623, 2034, 2045, 2047, 2048, 1514, 2050, 1143, - 1201, -2987, -2987, -2987, -2987, -2987, -2987, 1164, 2051, -2987, - 1998, -2987, -2987, -2987, 2053, -2987, 2074, -2987, -2987, -2987, - -2987, -2987, -2987, 1993, 2014, -2987, -2987, -2987, 131, 1992, - 1995, 64713, 1195, 113, 47403, 64713, 2055, 1844, 2438, 19475, - 1048, 2258, 2021, -2987, 819, 2037, -2987, 1663, -2987, 50868, - 2948, 245, 2036, -2987, 304, 1844, -2987, 2442, 1663, 2092, - 2533, -2987, 2286, 64713, 2065, -2987, -2987, 48393, 1899, 5624, - 25206, 69663, 1027, 1032, -2987, 2573, 2232, 2159, -2987, -2987, - -2987, -2987, -2987, 2072, -29, 2073, 10097, 2076, -2987, -2987, - -2987, -2987, -2987, -2987, 45045, 45045, 64713, 2255, -2987, -2987, - 2082, 2078, 37286, 2536, 2086, -2987, -2987, 2408, -2987, 30353, - -2987, 1681, 2095, 1681, 69663, 1681, -2987, -2987, 45045, 20517, - -2987, -2987, 41298, 2416, 2509, 2509, 45429, 1057, -2987, 2509, - 20517, 20517, 2509, 2509, 20517, -2987, 9575, 550, -2987, 1059, - -2987, 40391, -2987, 71103, -2987, -2987, 1946, 819, 1946, -2987, - -2987, 2093, -2987, -2987, -2987, 2150, -2987, -2987, 1061, 2519, - 2004, 20517, -2987, -2987, 2099, 35801, -2987, -2987, -2987, -2987, - 35801, 899, -2987, 2269, 1980, 2106, -2987, -2987, -2987, -2987, - -2987, -2987, 40430, -2987, 83, 20517, -2987, 184, 4327, -2987, - -2987, -2987, -2987, 1980, 1125, -2987, 54828, 2583, 2472, -2987, - -2987, 45045, -2987, -2987, 2024, 2024, -2987, -2987, 2267, -2987, - -2987, 2110, -2987, -2987, 1164, 375, 39267, 54828, 54828, -2987, - -2987, 2112, -2987, -2987, -2987, -2987, -2987, 257, 2504, 1069, - 1070, 159, -2987, 2426, 2426, 45045, 54828, 2478, 50868, -2987, - 47403, 2591, 2117, 54828, 1844, 437, 437, -2987, 2271, -2987, - 2273, -2987, -2987, 2593, 356, -2987, 19996, 54828, -2987, -2987, - 32830, -2987, 5624, 1071, -2987, -2987, 2120, 2127, -2987, 1946, - 20517, 2128, 20517, -2987, 23643, 2603, 2126, -2987, 20517, 2191, - 28332, -2987, 20517, -2987, 54828, 59778, 2133, 59778, -2987, -2987, - -2987, -2987, -2987, 20517, -2987, 2509, 2509, 2509, 20517, -2987, - 20517, -2987, -2987, -2987, 2339, 2255, -2987, 2255, 20517, 2426, - 381, 2758, 64713, 0, -2987, 45045, -2987, -2987, -2987, 54828, - -2987, 47403, -2987, 899, 12, 2136, 20517, 40780, 2379, -2987, - -2987, 2411, -2987, 2470, -2987, 2212, 640, 2228, -2987, -2987, - -2987, -2987, 1195, 819, -2987, 1663, 2036, 2092, -2987, 2154, - 54828, 1106, 2426, 159, 704, -2987, -2987, -2987, -2987, -2987, - -2987, -2987, -2987, -2987, -2987, -2987, -2987, -2987, 2426, 2596, - 2377, 2597, 2426, 45045, 1932, 20517, 91, -2987, 1110, 2592, - -2987, -2987, 2665, 2255, 2161, 23643, 2163, -2987, 2169, 64713, - 45045, 2313, -2987, -2987, 2173, -2987, -2987, 20517, -2987, 41380, - 2174, 2176, 2625, 1817, 2191, 2191, -2987, 67, -2987, -2987, - 2598, 32830, 2553, 1125, 899, 2187, 1137, -2987, -2987, -2987, - -2987, -2987, 202, -2987, 40866, 2420, 208, 2404, 2136, 20517, - -2987, 2256, -2987, -2987, -2987, 2656, -2987, -2987, 50868, 2184, - -2987, 2092, 2036, 1844, 2092, 2407, -2987, 2409, -2987, 2186, - 40905, 64713, 64713, 1663, 32830, 64713, 2190, 2191, -2987, 2197, - -2987, -2987, -2987, 53838, -2987, 2198, -2987, -2987, -2987, 20517, - 152, -2987, -2987, 2244, 54828, 1145, 40, 2411, 39267, -2987, - 47403, 1058, 12, 2500, -2987, -2987, -2987, -2987, 127, 2417, - -2987, 2422, -2987, 45045, -2987, 2426, 50868, -2987, -2987, -2987, - -2987, -2987, -2987, 32830, 2592, -2987, 357, -2987, 1520, -2987, - 357, -2987, -2987, -2987, -2987, -2987, 1462, 24164, 24164, 24164, - 2201, 2426, -2987, 1520, -2987, 2323, 2404, -2987, -2987, -2987, - -2987, -2987, 176, 176, 2588, -2987, 2266, -2987, 2092, 1146, - 64713, 1776, -2987, 1776, 25727, 2355, 177, 43927, 2575, -2987, - 2575, 2575, -2987, -2987, -2987, 38276, -2987, -2987, 2696, -2987, - 231, -2987, -2987, -2987, 1663, 357, -2987, -2987, 2688, -2987, - -2987, -2987, -2987, -2987, 196, -2987, -2987, -2987, 1520, 899, - -2987, -2987, -2987, 1520, 1776, 24685, 2361, -2987, 2430, -2987, - -2987, -2987, -2987, -2987, -2987, -2987 + 6375, 351, 1052, -3059, -3059, 657, 351, 50036, 64871, 293, + 351, 181, 3103, 52016, -3059, -3059, 46571, 4517, 351, 54986, + 72207, 328, 274, 31911, 355, 55481, 55481, -3059, -3059, -3059, + 64871, 54986, 55976, 351, 358, 65366, -3059, 351, 34386, 52511, + 198, -3059, 54986, 65, 257, 56471, 54986, 4726, 600, 263, + -3059, -3059, -3059, -3059, -3059, 178, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, 150, -3059, 189, 154, 31911, 31911, 1366, 118, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 442, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + 33891, -3059, -3059, -3059, -3059, -3059, -3059, 56966, 54986, 57461, + 53006, 57956, -3059, 645, 965, -3059, 165, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 170, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 481, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, 183, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, 376, -3059, 516, -3059, + 195, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + 1178, -3059, -3059, 957, 3143, 54986, 432, 665, 718, -3059, + 58451, -3059, 725, 54986, -3059, -3059, 731, 774, 916, -3059, + -3059, 53501, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 47066, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, 877, -3059, -3059, + 706, -3059, 194, -3059, -3059, 729, 686, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, 787, -3059, -3059, -3059, + 789, 65861, 58946, 59441, -3059, 667, 2978, 6731, 72225, 30919, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, 442, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, 55481, 64871, 55481, 709, 723, 1076, 734, 32406, + 737, 34882, 753, 769, 1117, 776, 778, 785, 796, 257, + 31415, 807, 376, -3059, 59936, 59936, -26, 2686, -3059, 59936, + 60431, -3059, 822, -3059, 965, -3059, -3059, -3059, 1157, -3059, + -61, 816, -3059, 60926, 60926, 60926, 842, 1124, -3059, -3059, + -3059, 866, -3059, -3059, 1095, 20588, 20588, 66356, 66356, 965, + 66356, 876, -3059, -3059, 91, -3059, -3059, -3059, 1366, 882, + 376, -3059, -3059, 52511, -3059, -3059, 237, 1219, 20588, 54986, + 884, -3059, 886, 884, 892, 906, 913, -3059, 6375, 1264, + 1145, 52511, 364, 364, 1386, 364, 212, 587, 4710, 2869, + -3059, 887, -3059, 944, -3059, 54986, 1048, 974, 1244, -3059, + 882, 1329, 1242, 1133, 1338, 5360, 1346, 1336, 1375, 1623, + 1382, 1523, 20588, 47561, 376, -3059, 11731, 20588, -3059, -3059, + -3059, 1149, -3059, -3059, -3059, -3059, -3059, 54986, 64871, 1072, + 1075, -3059, -3059, -3059, -3059, 1022, 1317, -3059, 1558, 66851, + -3059, -3059, 1160, 61421, 61916, 62411, 62906, 1514, -3059, -3059, + 1490, -3059, -3059, -3059, 1167, -3059, -3059, -3059, 176, 67346, + 1500, 1154, 110, -3059, 1509, 172, -3059, 1522, 1409, 15378, + -3059, 1353, -3059, -3059, -3059, 257, -3059, 403, -3059, -3059, + 43428, -3059, -3059, 72225, 1281, 1207, -3059, 1556, 20588, 20588, + 1221, 5787, 59936, 60431, 20588, 54986, -3059, 20588, 25277, 1235, + 20588, 20588, 12773, 20588, 29929, 59936, 2686, 1248, -3059, 582, + 54986, 1243, -3059, 1347, 1347, 358, 31911, 1548, -3059, 375, + 1545, 1479, -3059, 31911, 1479, 977, 1269, 1562, 1479, -3059, + 253, 1567, 1347, 35377, 1282, -3059, 1347, 1516, -3059, -3059, + 55481, 20588, 15378, 69821, 1776, -3059, -3059, -3059, -3059, 1585, + 64871, 1308, -3059, -3059, -3059, -3059, -3059, -3059, 615, 1818, + 158, 1819, 20588, 158, 158, 1311, 196, 196, -3059, 1503, + 1314, -3059, 200, 1315, 1316, 1827, 1831, 180, 134, 871, + 158, 20588, -3059, 196, 1326, 1839, 1334, 1846, 138, 173, + -3059, 201, 20588, 20588, 20588, 1704, 20588, 10689, -3059, 54986, + 1844, 47561, 545, -3059, 376, 1341, 965, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, 1356, -3059, 185, 7003, -3059, -3059, + -3059, -3059, -3059, -3059, 1377, -3059, -3059, -3059, -3059, 1559, + 20588, -3059, -3059, 1343, 1548, -3059, 202, -3059, -3059, 1548, + -3059, -3059, -3059, -3059, -3059, 217, 1768, 20588, 20588, 64871, + 376, 67841, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 628, + -3059, 442, 45116, 1355, 1359, 884, 54986, 54986, 1835, -3059, + -3059, -3059, -3059, 52511, 159, 1657, 1491, -3059, -3059, 1366, + 1366, 15899, 1027, 220, 70, 16420, 21109, 1713, 1592, 225, + 586, 1715, -3059, 1598, 1825, 25277, 20588, 20588, 212, 587, + 20588, 886, -3059, -3059, -3059, 1651, 54986, 50531, 482, 553, + 1371, 1461, 1378, 29, 1798, -3059, 1376, -3059, 1465, 54986, + 71756, 244, -3059, 1855, 244, 244, 235, 1856, 1493, 261, + 1659, 630, -32, 1376, 2912, -3059, 52511, 156, 643, 1376, + 54986, 1494, 688, 1376, 1820, 64871, 1207, 41015, 1403, -3059, + -3059, -3059, 147, 15378, -3059, 1292, 1339, 1364, 367, 184, + 1400, 1542, 15378, 1602, 1650, 163, 1652, 1663, 1671, 1679, + 1683, 1687, 1703, 1705, 144, 1710, 1712, 1716, 1718, 1720, + 1724, -3059, 1728, 169, 1730, 199, 15378, 1733, -3059, 45116, + 8, -3059, -3059, 1738, 182, -3059, 45205, -3059, 1708, 1505, + 1506, 64871, 1455, 54986, 1560, 823, 1783, 1836, 70301, 1664, + -3059, 1741, 54986, 1666, 2912, 1667, 1429, 1904, 1672, 1075, + 1674, 1431, -3059, 68336, 47561, -3059, -3059, -3059, -3059, -3059, + 1797, 1780, 64871, 47561, 1437, -3059, -3059, 64871, -3059, 54986, + 54986, -3059, 54986, 64871, -3059, 644, 45116, 1941, 865, 72225, + 49046, -3059, -3059, -3059, -3059, 428, 951, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, 965, 47561, -3059, 2564, + 55481, 44046, 1444, 20588, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, 1449, 1801, -3059, -3059, 6587, 1453, 44086, 1454, + 25277, 25277, 376, 530, -3059, -3059, 25277, 1460, 49541, 43959, + 1463, 1467, 44434, 16941, 20588, 16941, 16941, 44521, -3059, 1471, + 44598, 59936, 1473, 54986, 53996, -3059, -3059, -3059, 20588, 20588, + 2686, 54491, 1515, 31911, -3059, 31911, -3059, 1765, 31911, -3059, + -3059, 2074, -3059, 31911, 1766, 20588, 31911, -3059, 31911, 1714, + 1717, 1477, 31911, -3059, 54986, 1482, 54986, -3059, -3059, -3059, + -3059, -3059, 45116, -3059, 1481, 690, 1485, -3059, -3059, -3059, + -3059, -3059, 1534, -3059, 1534, 1534, -3059, -3059, -3059, -3059, + 1492, 1492, 1497, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, 1498, 871, -3059, 1534, + -3059, 1492, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 71756, + -3059, -3059, -3059, -3059, -50, 501, -3059, 1501, -3059, -3059, + 1507, -3059, 1489, 1978, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, 5696, 699, 1492, -3059, -3059, 5470, -3059, + -3059, 20588, 20588, -3059, -3059, 1508, 45116, 1547, -3059, -3059, + 20588, 20588, -3059, -3059, -3059, -3059, 2011, -3059, 20588, 1534, + 1534, -3059, 45587, -3059, 39834, 17462, 1597, 1599, 2011, -3059, + 2011, -3059, 45587, 2015, 2015, 37852, -3059, 1675, 44685, -3059, + 1518, 2122, 7670, 1510, 1511, -3059, 1519, 1513, -3059, -3059, + 41943, 166, 376, 376, 20588, -3059, 2011, 20588, 8642, 8642, + -3059, 295, 69821, 20588, 20588, 20588, 20588, 20588, 20588, 20588, + 20588, 46076, 1606, 127, 64871, 20588, 20588, 1524, 858, -3059, + 20588, 1754, -3059, 1525, 20588, 1608, 312, 20588, 20588, 20588, + 20588, 20588, 20588, 20588, 20588, 20588, -3059, -3059, 28924, 344, + 550, 1860, 1879, 46, 291, 20588, 1871, 11731, -3059, 1871, + -3059, -3059, -3059, -3059, -3059, 204, -3059, -3059, 1481, 1481, + -3059, 64871, -3059, 54986, 237, 51521, 20588, -3059, -3059, 1527, + 1531, 485, 1594, -3059, -3059, 54986, 38347, 1833, -3059, 350, + 1533, -3059, 43920, 1790, 1833, 1366, -3059, -3059, 26319, 1673, + 1830, 1770, -3059, -3059, 1749, 1751, -3059, 1546, 45338, 21630, + 21630, -3059, 646, 45116, 1293, -3059, -3059, -3059, -3059, -3059, + -3059, 733, -3059, 54986, 82, 35872, -3059, 1552, 111, -3059, + 3217, 1885, 1847, 1713, 586, 1557, -3059, -3059, 1781, 1563, + 68831, 54986, 1845, 1804, 1859, 308, 69821, -3059, -3059, -3059, + -3059, 54986, 64871, 63401, 69326, 48056, 54986, 47561, -3059, -3059, + -3059, -3059, 54986, 1218, 54986, 8381, -3059, -3059, -3059, -3059, + 244, -3059, -3059, -3059, -3059, -3059, 64871, 54986, -3059, -3059, + 244, 64871, 54986, 244, -3059, 1939, 54986, 54986, 54986, 54986, + 2069, 54986, 54986, 965, -3059, -3059, -3059, 22151, 24, 24, + 1786, 13294, 203, -3059, 20588, 20588, 306, 294, 64871, 1753, + -3059, -3059, 700, 1795, 103, -3059, 64871, 1621, 54986, 54986, + 54986, 54986, 54986, 2076, -3059, -3059, -3059, -3059, -3059, 1575, + -3059, 1940, 2090, 1582, 1586, 1947, -3059, 2912, 1951, 51026, + 698, 2699, 1952, 1630, 1956, 13815, 2072, 1840, -3059, -3059, + 1824, -3059, 64871, 2106, -3059, 110, -3059, 47561, -3059, 172, + -3059, 1829, 205, -3059, 15378, 20588, -3059, -3059, -3059, -3059, + -3059, -3059, 1207, 29430, -3059, 714, -3059, -3059, 2075, 965, + 2075, 565, -3059, -3059, 2075, -3059, 2060, 2075, -3059, -3059, + 69821, -3059, 7960, -3059, 20588, 20588, -3059, 20588, 1949, -3059, + 2110, 2110, 69821, 25277, 25277, 25277, 25277, 25277, 25277, 486, + 1326, 25277, 25277, 25277, 25277, 25277, 25277, 25277, 25277, 25277, + 26840, 301, -3059, -3059, 715, 2085, 20588, 20588, 1960, 1949, + 20588, -3059, 69821, 1613, -3059, 1614, 1617, 20588, -3059, 69821, + -3059, 54986, 1619, 9, -2, -3059, 1622, 1627, -3059, 1548, + -3059, 713, 775, 54986, 2465, 5151, 5636, -3059, -3059, 20588, + 1962, 2074, 2074, 31911, -3059, 20588, 1629, -3059, -3059, 31911, + 1979, -3059, 2074, -3059, -3059, 36367, 2074, 69821, 748, -3059, + 54986, 69821, 758, 20588, -3059, 15378, 2143, 69821, 2108, 64871, + 64871, 2145, 1637, 1639, 2011, 1725, -3059, 1727, 1729, 1731, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 69821, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 1643, 1647, + 20588, 20588, 80, -3059, 8114, 1646, 1653, 6163, -3059, 1644, + -3059, 1649, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 1655, + -3059, 1661, -3059, 1669, 1677, 1682, 1676, 1681, 54986, -3059, + 22672, -3059, 64871, -3059, -3059, 20588, 20588, 54986, -3059, 1704, + -3059, 1685, 1688, 8303, -3059, -3059, -3059, 153, 394, 45444, + 291, 3594, 3594, 3594, 45587, -3059, -3059, -3059, 1692, -3059, + 25277, 25277, -3059, 2523, 2753, 10689, -3059, -3059, 1995, -3059, + 891, -3059, 1658, -3059, -3059, 3090, -3059, 39834, 45547, 20588, + 179, -3059, 20588, 1524, 20588, 1762, 3594, 3594, 3594, 268, + 268, 153, 153, 153, 394, 291, -3059, -3059, -3059, 1668, + 20588, 47561, -3059, 1680, 1684, 2038, 1334, 20588, -3059, -3059, + 31911, 1515, 8, 1515, 2011, 8642, -3059, 886, -3059, 886, + -3059, 45116, 54986, -3059, -3059, 1953, 1690, 31911, 1732, 2167, + 2157, 64871, -3059, -3059, 1693, 1871, 1719, -3059, -3059, 1721, + 20588, 3753, 1721, -3059, 1833, -5, 1929, 998, 998, 646, + 1931, -3059, -3059, 1774, -3059, -3059, -3059, 20588, 14336, 1389, + -3059, 1407, -3059, -3059, -3059, -3059, -3059, 1699, -3059, 1986, + -3059, 54986, -3059, -3059, 25277, 2172, 20588, 36862, 2174, 1974, + -3059, -3059, -3059, 1812, 1376, 20588, 1971, -3059, 187, 1734, + 2097, 371, 2049, 64871, -3059, 318, 353, -3059, 978, 2100, + 205, 2105, 205, 47561, 47561, 47561, 760, -3059, -3059, -3059, + 965, -3059, 271, 762, -3059, -3059, -3059, -3059, 1834, 933, + 1376, 2912, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 222, + 948, 1376, 1842, -3059, 1849, -3059, 1851, 1015, 1376, -3059, + -3059, 1523, 9124, 45116, 336, 203, 203, 203, 15378, -3059, + 1982, 1983, 1758, 45116, 45116, 142, -3059, -3059, -3059, -3059, + 1760, -3059, 236, -3059, 64871, -3059, -3059, -3059, 1753, 1836, + 1741, 54986, 2912, 1767, 2236, 1075, 1431, -3059, 1928, 901, + 1678, -3059, 64871, -3059, 47561, 64871, 54986, 54986, 54986, 63896, + -3059, -3059, -3059, 1769, 1772, -3059, -11, 2004, 2005, 54986, + 1821, 54986, 1378, 2255, 54986, -3059, 766, 17983, 2144, 54986, + 1780, -3059, -3059, -3059, -3059, 64871, -3059, -3059, 45116, -3059, + -3059, 20588, 48551, -3059, -3059, -3059, -3059, -3059, -3059, 47561, + -3059, 965, -3059, 965, 2020, 64871, 42438, 965, 42933, 965, + 1785, -3059, 45116, 8353, 45116, 1960, -3059, 214, 2110, 1848, + 1848, 1848, 4127, 2130, 240, 1788, 1848, 1848, 1848, 282, + 282, 214, 214, 214, 2110, 301, 822, 49541, 1789, -3059, + 45116, 45116, -3059, -3059, 1794, -3059, -3059, -3059, -3059, 1802, + 1803, -3059, -3059, -3059, -3059, -3059, -3059, 64871, 1037, 1515, + 198, 198, 198, 198, -3059, 54986, 54986, 54986, 45116, 2245, + 2120, -3059, -3059, 2074, 45116, 54986, -3059, 27882, -3059, 54986, + -3059, 2153, -3059, 2240, -3059, 54986, 830, -3059, -3059, -3059, + 857, 1809, 1639, 69821, 873, 879, -3059, 2011, 136, 1807, + 1512, 1319, 750, 1413, -3059, -3059, -3059, 1808, 44820, 20588, + -3059, 2181, -3059, -3059, -3059, 20588, 20588, -3059, 39834, -3059, + -3059, -3059, -3059, -45, -45, 1811, 10689, 45042, -3059, 2139, + 8435, 45116, -3059, 1675, -3059, -3059, 8642, 20588, 1205, 1826, + 20588, 1823, 20588, 2169, -3059, -3059, 1832, -3059, -3059, 69821, + 20588, 1850, 5197, 25277, 25277, 6403, -3059, 7322, 20588, 10689, + -3059, 41101, 1817, 1852, 1786, 18504, -3059, 2047, 1843, -3059, + 1962, 203, 1962, 1854, -3059, -3059, -3059, -3059, 5470, -3059, + 20588, 1990, 64871, 518, 1927, 890, -3059, 376, 38347, 1732, + 20588, 252, -3059, -3059, 1857, -3059, 1721, -3059, -3059, -3059, + 2083, -3059, -3059, -3059, 54986, -3059, 1862, -3059, 35872, 2184, + 11210, -3059, 35872, 54986, 54986, 40337, 2223, -3059, 64871, 64871, + 64871, -3059, 64871, 1861, 1863, 653, 1866, 389, -3059, 1021, + 653, 2206, 296, 1378, 261, 1561, 521, -3059, -3059, -3059, + 1943, 54986, -3059, 64871, -3059, -3059, -3059, -3059, -3059, 48056, + -3059, -3059, 39338, 47561, -3059, 47561, 54986, 54986, 54986, 54986, + 54986, 54986, 54986, 54986, 54986, 54986, 1207, 20588, -3059, 20588, + 1868, 1869, 1874, 1786, -3059, -3059, -3059, 206, -3059, 1870, + -3059, -3059, -3059, -32, -3059, 236, 1877, 1878, -3059, 51026, + 3143, 1630, 2353, 1836, 850, 64376, -3059, 1882, 1876, 1741, + 897, 912, 2912, 1884, 2359, -3059, 698, 51026, -3059, -3059, + -3059, 2315, -3059, 667, 232, -3059, 1075, -3059, 3143, 1431, + -3059, 3143, 45116, 64871, 1948, -3059, 205, 922, -3059, -3059, + -3059, -3059, -3059, 64871, 1886, -3059, 1886, -3059, -3059, 1886, + -3059, -3059, -3059, -3059, 25277, 2234, 1892, 69821, -3059, -3059, + 54986, -3059, -3059, -3059, 942, 1894, 1962, 54986, 54986, 54986, + 54986, -3059, -3059, -3059, 19025, 20588, 1932, -3059, 1895, 12252, + 2213, -3059, 27361, -3059, -3059, 1899, 36367, 64871, -3059, -3059, + -3059, -3059, 2011, -3059, -3059, 64871, -3059, 1902, -3059, 1903, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, 20588, + 45116, -3059, 45116, -3059, -3059, -3059, -3059, -3059, 7369, -3059, + 1907, 1905, 64871, 20588, -3059, -3059, -3059, 747, 20588, 20588, + 2523, -3059, 6937, 20588, 69821, 962, 2523, 347, 20588, 2239, + 3853, 20588, 20588, 7350, 40376, -3059, 23193, 14857, -3059, 1906, + 20588, 40415, 38842, -3059, 31911, 2120, 1911, 2120, 965, 1913, + 45116, 20588, -3059, -3059, -3059, -3059, 1969, 349, 33396, 2142, + -3059, 1930, 64871, -3059, 1990, 45116, -3059, -3059, 39834, -3059, + -3059, -3059, -3059, -3059, 2373, 2635, 1923, 1924, -3059, 1340, + -3059, -3059, 64871, 1925, -3059, 1935, 653, -3059, 64871, 1968, + -3059, 272, 2241, 113, -3059, 20588, -3059, 2330, 2411, 1021, + 1942, 64871, 54986, 25277, -3059, 625, 243, -3059, 2227, 54986, + 1968, 2369, -3059, -3059, -3059, 389, -3059, 2268, 2185, -3059, + 244, -3059, 20588, 389, 2188, 137, 64871, -3059, -3059, 2738, + -3059, 69821, 205, 205, -3059, 1485, 1954, 1955, 1958, 1959, + 1961, 1965, 1967, 1972, 1973, 1976, -3059, 1988, 1989, 1992, + 1993, 1994, 1997, 1998, 1999, 1498, 2000, -3059, 2001, 1857, + 2006, 2013, 2016, 2019, 2021, 70781, 2026, 2028, 2031, 2033, + 1501, 2034, 428, 951, -3059, -3059, -3059, -3059, -3059, -3059, + 1154, 2035, -3059, 1975, -3059, -3059, -3059, 2044, -3059, 2056, + -3059, -3059, -3059, -3059, -3059, -3059, 1981, 2007, -3059, -3059, + -3059, 203, 1970, 1984, 64871, 1207, 151, 47561, 64871, 2037, + 1821, 2496, 19546, 1159, 2279, 2041, -3059, 965, 2053, -3059, + 1630, -3059, 51026, 3125, 669, 2005, -3059, 208, 1821, -3059, + 2451, 1630, 2094, 2521, -3059, 2282, 64871, 2059, -3059, -3059, + 48551, 1886, 4313, 25277, 69821, 964, 970, -3059, 2568, 2231, + 2120, -3059, -3059, -3059, -3059, -3059, 2064, -25, 2078, 10168, + 2065, -3059, -3059, -3059, -3059, -3059, -3059, 45116, 45116, 64871, + 2251, -3059, -3059, 2071, 2081, 37357, 2531, 2082, -3059, -3059, + 2395, -3059, 30424, -3059, 1639, 2086, 1639, 69821, 1639, -3059, + -3059, 45116, 20588, -3059, -3059, 41369, 2407, 2523, 2523, 6937, + 987, -3059, 2523, 20588, 20588, 2523, 2523, 20588, -3059, 9646, + 409, -3059, 995, -3059, 40462, -3059, 71261, -3059, -3059, 1932, + 965, 1932, -3059, -3059, 2089, -3059, -3059, -3059, 2141, -3059, + -3059, 1049, 2510, 1990, 20588, -3059, -3059, 2096, 35872, -3059, + -3059, -3059, -3059, 35872, 653, -3059, 2260, 1968, 2095, -3059, + -3059, -3059, -3059, -3059, -3059, 40501, -3059, 52, 20588, -3059, + 1046, 4127, -3059, -3059, -3059, -3059, 1968, 1075, -3059, 54986, + 2573, 2463, -3059, -3059, 45116, -3059, -3059, 2011, 2011, -3059, + -3059, 2240, -3059, -3059, 2101, -3059, -3059, 1154, 512, 39338, + 54986, 54986, -3059, -3059, 2103, -3059, -3059, -3059, -3059, -3059, + -32, 2497, 1064, 1065, 698, -3059, 3143, 3143, 45116, 54986, + 2471, 51026, -3059, 47561, 2587, 2113, 54986, 1821, 1137, 1137, + -3059, 2263, -3059, 2266, -3059, -3059, 2595, 276, -3059, 20067, + 54986, -3059, -3059, 32901, -3059, 4313, 1070, -3059, -3059, 2124, + 2126, -3059, 1932, 20588, 2127, 20588, -3059, 23714, 2602, 2125, + -3059, 20588, 2190, 28403, -3059, 20588, -3059, 54986, 59936, 2132, + 59936, -3059, -3059, -3059, -3059, -3059, 20588, -3059, 2523, 2523, + 2523, 20588, -3059, 20588, -3059, -3059, -3059, 2338, 2251, -3059, + 2251, 20588, 3143, 376, 2620, 64871, 20, -3059, 45116, -3059, + -3059, -3059, 54986, -3059, 47561, -3059, 653, 326, 2134, 20588, + 40851, 2372, -3059, -3059, 2405, -3059, 2464, -3059, 2201, 573, + 2222, -3059, -3059, -3059, -3059, 1207, 965, -3059, 1630, 2005, + 2094, -3059, 2148, 54986, 1084, 3143, 698, 667, -3059, -3059, + -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, -3059, + -3059, 3143, 2596, 2377, 2597, 3143, 45116, 1948, 20588, 79, + -3059, 1128, 2592, -3059, -3059, 2664, 2251, 2159, 23714, 2160, + -3059, 2162, 64871, 45116, 2309, -3059, -3059, 2166, -3059, -3059, + 20588, -3059, 41451, 2171, 2175, 2626, 1786, 2190, 2190, -3059, + 349, -3059, -3059, 2586, 32901, 2556, 1075, 653, 2187, 1136, + -3059, -3059, -3059, -3059, -3059, 2912, -3059, 40937, 2419, 122, + 2403, 2134, 20588, -3059, 2256, -3059, -3059, -3059, 2654, -3059, + -3059, 51026, 2182, -3059, 2094, 2005, 1821, 2094, 2406, -3059, + 2409, -3059, 2189, 40976, 64871, 64871, 1630, 32901, 64871, 2191, + 2190, -3059, 2192, -3059, -3059, -3059, 53996, -3059, 2193, -3059, + -3059, -3059, 20588, 135, -3059, -3059, 2252, 54986, 1138, 51, + 2405, 39338, -3059, 47561, 174, 326, 2500, -3059, -3059, -3059, + -3059, 209, 2421, -3059, 2423, -3059, 45116, -3059, 3143, 51026, + -3059, -3059, -3059, -3059, -3059, -3059, 32901, 2592, -3059, 350, + -3059, 1515, -3059, 350, -3059, -3059, -3059, -3059, -3059, 1463, + 24235, 24235, 24235, 2198, 3143, -3059, 1515, -3059, 2328, 2403, + -3059, -3059, -3059, -3059, -3059, 457, 457, 2598, -3059, 2273, + -3059, 2094, 1142, 64871, 1721, -3059, 1721, 25798, 2354, 238, + 43998, 2578, -3059, 2578, 2578, -3059, -3059, -3059, 38347, -3059, + -3059, 2702, -3059, 227, -3059, -3059, -3059, 1630, 350, -3059, + -3059, 2693, -3059, -3059, -3059, -3059, -3059, 343, -3059, -3059, + -3059, 1515, 653, -3059, -3059, -3059, 1515, 1721, 24756, 2365, + -3059, 2435, -3059, -3059, -3059, -3059, -3059, -3059, -3059 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -2987, -2987, -2987, 1875, 79, -2987, -2987, 146, -2987, 982, - -2987, 145, -814, 520, -2987, 86, 3842, 2546, 3549, 66, - -510, -886, -1210, 28, 87, -1138, 4, -2987, -2987, -2987, - -2987, -2987, -494, 211, -2987, -2987, -634, -2547, -583, -2987, - -2913, -2986, -2987, -2987, -727, -2954, -2059, 89, -2987, -2987, - 93, 1, -2096, -2987, -1645, 42, -2092, 94, 892, -2987, - -2555, 98, -883, -1185, -944, -1191, -2987, -123, -2987, 421, - 105, 1560, -2987, 11, -2163, -2858, -597, -2987, -701, -2987, - -353, -2987, -647, -2987, -929, -654, -686, -2783, -1130, -2987, - 1579, -400, -2987, 557, -2987, -2560, -2987, -2987, 551, -2987, - -1165, -2987, -2207, 115, -630, -2562, -2509, -2166, -885, 203, - -636, 179, -2079, -1212, -2987, 568, -2987, -615, -2987, -891, - -2026, 108, -2987, -2987, 1472, -947, -2987, 110, 1510, -2103, - 7, 10, -2987, -2987, -2987, -2987, -2987, -687, 500, -1211, - -2987, 451, -2987, -2987, -2987, -2987, -189, 169, -2252, 2, - 306, -44, -32, -2987, -25, -2987, -2987, -2987, 606, -2987, - -2987, 21, 29, 1657, -2987, -1033, -2987, -1587, 590, -2987, - 1809, 1810, -2136, -858, -68, -2987, 641, -1661, -2094, -643, - 1086, 1639, 1643, 406, -2325, -2987, -569, -2987, -62, -2987, - -2987, 639, 1129, -1560, -1556, -2987, -2175, -2987, -488, -375, - -2987, -2987, -2987, -2987, -2987, -2453, -2798, -642, 1099, -2987, - 1658, -2987, -2987, -2987, -2987, 43, -1510, 2811, 679, -48, - -2987, -2987, -2987, -2987, 107, -2987, 869, -200, -2987, 2046, - -696, -784, 1893, -153, 143, -1739, 41, 2059, 455, -2987, - -2987, 457, -2085, -1407, 409, -284, 866, -2987, -2987, -1221, - -2987, -1880, -1160, -2987, -2987, -673, 1107, -2987, -2987, -2987, - 1933, 2214, -2987, -2987, 2951, 3055, -2987, -896, 3102, 993, - -1029, 1896, -934, 1898, -930, -928, -933, 1902, 1903, 1904, - 1906, 1910, 1911, -1511, 4396, 2674, 2508, -2183, -2987, -2180, - 989, 55, -2987, -1374, 242, -2987, -2987, -2987, -2987, -2662, - -2987, -462, -2987, -456, -2987, -2987, -2987, -1622, -2703, -1652, - -2987, 2157, 797, -2987, -2987, 392, -2987, -2987, -2987, -2987, - -1527, -2987, 5650, 694, -2987, -2024, -2987, -2987, -970, -829, - -733, -999, -1208, -1916, -2987, -2987, -2987, -2987, -2987, -2987, - -1114, -1767, -161, 754, -2987, -2987, 849, -2987, -2987, -2987, - -1722, -2097, -2987, -2987, -2987, 759, 1436, 82, -822, -1600, - -2987, 812, -2357, -2987, -2987, 403, -2987, -620, -1119, -2424, - 2029, 77, -2987, -779, -2510, -2987, -2987, -702, -2617, -1134, - -894, -2987, 111, -2987, 360, 120, -1658, -2987, 14, -2987, - -408, -2987, -2987, -2575, -2987, 123, 124, 2114, -2987, 1092, - -2987, -2987, -2987, -2987, -575, -2987, -632, -628, -2987, -2987, - 18, -898, 1565, -2987, 125, 436, -2987, 917, -2987, 702, - 128, 80, 1546, 129, 1228, -2987, -2987, -2987, 17, -603, - 361, -2987, 1232, -2987, -2987, 1683, 643, 133, -2987, 302, - 22, -2987, -2987, -2987, 97, 2808, 134, 15, -2927, 136, - -2755, -1592, -7, -2987, -2987, -2987, -730, -2987, -2505 + -3059, -3059, -3059, 1865, 73, -3059, -3059, 139, -3059, 973, + -3059, 146, -787, 509, -3059, 77, 1252, 2549, 3668, 2713, + -515, -876, -1226, 1, 81, -1140, 3, -3059, -3059, -3059, + -3059, -3059, -502, 210, -3059, -3059, -634, -2561, -584, -3059, + -2881, -3004, -3059, -3059, -731, -2965, -2068, 86, -3059, -3059, + 88, 11, -2084, -3059, -1601, 36, -2072, 89, 898, -3059, + -2570, 90, -889, -1193, -933, -1200, -3059, -122, -3059, 425, + 96, 1228, -3059, 12, -2165, -2872, -594, -3059, -696, -3059, + -347, -3059, -641, -3059, -1047, -645, -679, -2818, -1139, -3059, + 1589, -396, -3059, 567, -3059, -2540, -3059, -3059, 558, -3059, + -1154, -3059, -2186, 140, -618, -2582, -2531, -2156, -912, 215, + -617, 193, -2122, -1331, -3059, 584, -3059, -600, -3059, -893, + -2019, 98, -3059, -3059, 1495, -909, -3059, 99, 1517, -2083, + 10, 22, -3059, -3059, -3059, -3059, -3059, -828, 513, -1206, + -3059, 454, -3059, -3059, -3059, -3059, -185, 171, -2234, 2, + 323, -43, -22, -3059, -16, -3059, -3059, -3059, 614, -3059, + -3059, 21, 32, 1665, -3059, -1020, -3059, -1587, 383, -3059, + 1814, 1841, -2144, -863, -66, -3059, 652, -1659, -2130, -629, + 1090, 1656, 1648, 407, -2525, -3059, -568, -3059, -88, -3059, + -3059, 647, 1132, -1544, -1559, -3059, -2203, -3059, -487, -375, + -3059, -3059, -3059, -3059, -3059, -2483, -2836, -620, 1103, -3059, + 1660, -3059, -3059, -3059, -3059, 61, -1497, 2814, 682, 41, + -3059, -3059, -3059, -3059, 108, -3059, 863, -195, -3059, 2054, + -675, -796, 1880, 34, 93, -1745, 31, 2068, 452, -3059, + -3059, 463, -2087, -1408, 408, -281, 872, -3059, -3059, -1246, + -3059, -1833, -1172, -3059, -3059, -806, 510, -3059, -3059, -3059, + 1645, 2152, -3059, -3059, 2178, 2764, -3059, -862, 2970, -781, + -1031, 1883, -924, 1887, -930, -946, -937, 1888, 1890, 1893, + 1896, 1897, 1898, -1534, 4692, 2325, 2519, -2179, -3059, -2178, + 993, 1003, 16, -3059, -1387, 128, -3059, -3059, -3059, -3059, + -2600, -3059, -442, -3059, -439, -3059, -3059, -3059, -1649, -3058, + -1674, -3059, 2641, 818, -3059, -3059, 410, -3059, -3059, -3059, + -3059, -1509, -3059, 5718, 712, -3059, -2024, -3059, -3059, -965, + -831, -638, -983, -1197, -1921, -3059, -3059, -3059, -3059, -3059, + -3059, -1488, -1772, -326, 777, -3059, -3059, 867, -3059, -3059, + -3059, -1703, -2098, -3059, -3059, -3059, 781, 1448, 84, -830, + -1621, -3059, 819, -2352, -3059, -3059, 399, -3059, -627, -1138, + -2428, 2164, 104, -3059, -925, -2536, -3059, -3059, -721, -2648, + -1131, -888, -3059, 100, -3059, 359, 105, -1650, -3059, 14, + -3059, -411, -3059, -3059, -2566, -3059, 106, 114, 2116, -3059, + 1094, -3059, -3059, -3059, -3059, -588, -3059, -635, -621, -3059, + -3059, 30, -898, 1564, -3059, 119, 372, -3059, 919, -3059, + 681, 120, 69, 1543, 121, 1231, -3059, -3059, -3059, 26, + -626, 363, -3059, 1240, -3059, -3059, 1694, 651, 124, -3059, + 43, 47, -3059, -3059, -3059, 72, 2816, 125, 15, -2904, + 129, -2759, -1672, -7, -3059, -3059, -3059, -713, -3059, -2530 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -2044 +#define YYTABLE_NINF -2046 static const yytype_int16 yytable[] = { - 520, 58, 70, 865, 54, 877, 904, 68, 1330, 714, - 69, 65, 1223, 1123, 82, 102, 520, 93, 1240, 972, - 1419, 77, 98, 1187, 1794, 1022, 1347, 878, 879, 1153, - 2171, 1747, 1783, 1474, 1294, 1291, 1782, 1679, 772, 953, - 847, 77, 778, 1924, 713, 881, 2049, 1390, 1394, 1766, - 1580, 1392, 882, 1393, 2138, 2527, 1735, 2529, 1981, 740, - 1753, 2657, 517, 2587, 2544, 1336, 805, 1799, 520, 520, - 2447, 1757, 1353, 2968, 2273, 863, 1829, 2554, 811, 51, - 851, 1222, 2508, 1228, 518, 1232, 52, 53, 1787, 56, - 1655, 817, 817, 57, 60, 1658, 2073, 2074, 61, 2937, - 518, 2543, 889, 2982, 2939, 63, 819, 2449, 66, 1004, - 67, 80, 1855, 1240, 1025, 2985, 963, 1592, 805, 805, - 81, 966, 955, 83, 84, 90, 2766, 2641, 91, 92, - 811, 811, 844, 97, 101, -1322, 103, 2966, 2627, 2628, - 2629, 2830, -1244, 2580, -511, 2835, -849, -515, 2142, 2191, - 1361, 897, 518, 518, -1891, 2194, 2298, 1557, 1558, 1901, - 2399, -857, -2031, -2031, 1903, -1263, -2017, -2017, -1891, -1263, - 2299, 3381, -854, -1882, 1570, -1899, -854, -1260, -1260, -1264, - 901, -2022, -2022, -2040, -2040, 815, -1882, -1261, -1261, 1046, - 1663, 1349, -857, -1899, -1264, -816, 1340, 973, 1403, 3177, - -829, 1046, 2649, 1046, -844, 2645, 855, 2643, 1135, 815, - 815, 1196, 3162, 2636, 3110, 815, 2088, 1197, 2088, -2042, - -2042, 2428, 2429, 1659, 1340, 815, 2303, 532, 1142, 1046, - 3181, 1046, 2435, 1176, 1179, 2658, 2439, -466, 1324, 3487, - 972, 1901, 1209, 1797, -511, 1902, 1903, -515, 869, 3462, - 1611, 2730, 1798, 1240, 2731, 1613, 1443, 1588, 2857, 3, - 4, 944, 1210, 872, 1610, 813, 1767, 1611, 1165, 1770, - 1771, 1612, 1613, 3255, 3093, 1324, -227, 2466, 815, 1749, - 1749, -227, 2204, 2691, 2693, 1621, 2696, 1025, 3268, 3340, - 1785, 2615, 999, 1611, 874, -648, 2665, 1612, 1613, 1004, - 3516, 2860, 1621, 874, 1324, 3125, 71, 1901, 1211, -2044, - 2409, 1902, 1903, 1941, 1738, 3454, 2986, 813, 813, 1623, - 3145, 2583, 1198, 2279, -1102, 1758, 71, 1608, 1621, 804, - 2959, 2713, -1102, 873, 1682, 3447, 1623, 1660, 870, 2135, - 1139, 1354, 3500, 533, 71, 2380, 1941, 2702, 3511, 3076, - 3367, 3078, 2802, 864, 2804, 1349, 2197, 1772, 1987, 3201, - 1734, 530, 1623, 1730, 1731, 3121, 2422, 2423, 2424, 1005, - 833, 2295, 2844, 1166, -786, 783, 3517, 2125, -1123, 1172, - 3415, 804, 804, 880, 1562, 2126, -1123, 3405, 1172, 852, - 2075, 1011, 2803, 112, 3175, 1143, 3385, 1144, 2166, 3440, - 1572, 2497, 3171, 1212, -2016, -2016, 71, 2519, 1741, 2221, - 2823, 874, 3144, 3183, 3235, 2843, 3237, 104, 3348, 3285, - 3299, 1801, 1315, 1842, 1568, 1569, 3178, 1012, 1575, 3107, - 3300, 1349, -2044, -511, 1349, 1349, -515, 3334, 1499, 3335, - 921, 3179, 922, 1444, 3427, 3176, 1294, 3430, 3488, -2044, - 1576, 2761, 1213, 1014, -2044, 1174, 2584, 782, 3258, 2826, - 1661, 1316, 1214, 2864, 1174, 1136, 105, 3286, 3518, 2222, - 3172, 2198, 834, 2992, 1215, 1167, 113, 2824, 1199, 3469, - 3349, 2987, 3083, 2167, 3495, -668, 2280, 2381, 2136, 3448, - 814, 3455, -2044, 3366, 1683, 1580, 2580, 2382, 2580, 2703, - 3501, 1773, -511, 3108, 1175, -515, 1216, 2410, 1006, -786, - 3512, 1774, 2865, 784, 3341, 3387, 3416, 1800, 3449, 1574, - 3084, 3470, 3287, 1756, 2225, 3122, 1984, 3266, 2866, 1759, - 858, 3288, 1325, 3489, 3119, 1200, 919, 3313, 3007, 1201, - 1137, 3493, 3250, 3244, 1732, 1733, 2730, 1632, 856, 2731, - 3457, 3111, 2287, 1040, 3199, 3289, 2205, 980, 1218, 1681, - 875, 3260, 3490, 2978, 2975, 1868, 1870, 3156, 1743, 1325, - 945, 1202, 2443, 2990, 2216, 1674, 867, 871, 3463, 2049, - 1018, 714, 1600, 1219, 2089, 1196, 2510, 1557, 1558, 3428, - 2782, 1197, 2278, 2960, 1933, 1756, 3301, 3256, 1325, 1445, - 3417, 3276, 1221, 902, 1553, 2700, 1758, 903, 3120, 972, - 2020, 2998, 1570, 2637, 2638, 1948, 941, 2191, 3429, 953, - -511, 3519, 2557, -515, 1857, 1786, 2616, 3290, 2296, 2867, - 1861, 3180, 1969, 2531, 1575, 2325, 2937, 2326, 2868, 1317, - 3291, 2939, 1203, 2552, 2811, 1783, 2342, -2044, 2650, 902, - 1695, -1244, -1322, 903, 2546, -849, 1576, 2141, 1918, -511, - 2348, -511, -515, -1891, -515, 1575, 2656, 1559, 2367, 1567, - 1577, 3247, 2031, 2032, -1263, 3101, 3248, -1891, -1263, 2641, - 2373, -854, -1882, 1567, -1899, 1744, 534, 1576, -1264, 1145, - -1102, 2724, 3221, 1326, 1606, -1882, 1198, 1344, 1345, 2812, - 3365, 1579, -1899, -1264, 1560, 865, 1865, 2745, 1858, 1565, - 2401, 966, 3159, -844, 1240, 2069, 1240, 2406, 1656, 2143, - 993, 2017, 1588, 3372, 2661, 1344, 1345, 3134, 3135, 3373, - 1329, 1588, 1781, 1777, 1939, 1913, 1914, 1915, 1916, 1917, - 1918, 868, 971, 2127, -1123, 2052, 1458, 2221, 1777, 1644, - 1378, 1379, 996, 1318, -2044, 2440, 865, 1778, 1696, 2440, - 3092, 1639, 1640, 1641, 1642, 1643, 1644, 968, 2873, 77, - 778, 3498, 1778, 1698, 2070, 884, 2278, -227, -227, 2591, - 1611, 2588, 520, 2372, 1611, 2853, 2025, 2461, 3002, 1641, - 1642, 1643, 1644, 520, 536, 2153, 1692, 1459, 2055, 1338, - 2056, 3094, 1339, 1915, 1916, 1917, 1918, 2577, 3438, 2886, - 1759, 2854, 3523, 1188, 2400, 1621, 881, 1562, 2018, 1699, - 2154, 2407, 3151, 882, 815, 2251, 2071, 2024, 520, 520, - 2714, 2715, 2716, 2717, 2609, 2254, 883, 1572, 2257, 3292, - 71, 2874, 3293, 995, 811, 2335, 3127, 2610, 975, 1623, - 817, 520, 1199, 1623, 3132, 811, 1446, 537, 3041, 2966, - 2407, 3043, 1453, 3045, 977, 3057, 518, 1382, 1383, 58, - 70, 2009, 54, 2411, 1146, 68, 1756, 518, 69, 65, - 1029, 2250, 82, 102, 3267, 93, 3160, 900, 1154, 77, - 98, 1856, 2589, 902, 1140, 520, 714, 903, 2937, 1283, - 520, 1600, 2953, 2939, 2954, 1132, 815, 2341, 23, 1226, - -1891, 2343, 1140, 1201, 2345, 2416, 906, 3172, 3281, 3513, - 2520, 2091, 1031, 2213, 107, 2875, 918, 2412, 2351, 2190, - 2190, 2308, 925, 1032, 844, 844, 1701, 844, 2482, 2274, - 2275, 2276, 1436, 3253, 536, 1227, 2361, 51, 2049, 2109, - 2249, 2362, 1283, 1443, 52, 53, 1672, 56, 1439, 1673, - 1462, 57, 60, 971, 1466, 1450, 61, 1293, -208, 1336, - 2260, 520, 520, 63, 2354, 2267, 66, 520, 67, 80, - 520, 520, 2773, 520, 520, 520, 520, 1292, 81, 3240, - 1349, 83, 84, 90, 77, 778, 91, 92, 1702, 520, - 1349, 97, 101, 1349, 103, 1758, 520, 537, 2363, 3401, - 3402, 1196, 2532, 2097, 2533, 929, 1203, 1197, 2847, 1749, - 1924, 946, 1196, 1749, 520, 1283, 1545, 943, 1197, 930, - 1750, 813, 1758, 2097, 1752, 2625, 1346, 541, 930, 962, - 2098, 1862, 813, 865, 1863, 520, 2626, 1388, 1199, 805, - 1758, 27, 28, 29, 71, 864, 805, 937, 1758, 1783, - 2098, 811, 3442, 3229, 520, 545, 942, 1758, 811, 2630, - 2413, 3067, 2110, 2252, 3230, 520, 520, 520, 2255, 520, - 520, 2563, 2552, 518, 714, 3193, 2500, 3344, 1011, 2111, - 518, 947, 108, 1349, 2112, 982, 1469, 2225, 1209, 1575, - 902, 931, -1244, 109, 903, 2848, 994, 2405, 1196, 2590, - 931, 2591, 520, 2501, 1197, 923, 34, 924, 1210, 1598, - 2617, 1576, 1198, 1575, 1012, 1035, 1036, 1037, 1196, 520, - 520, 1788, 2113, 1198, 1197, 1577, 1686, 1687, 110, 1693, - 1452, 2592, 972, 882, 882, 1576, 882, 1867, 1983, 3361, - 1014, 1984, 1046, 39, 880, 2099, 1856, 1451, 1791, 1579, - 2100, 1456, 1604, 520, 1211, 2101, 1592, 520, 520, -2013, - -2013, 2849, 1607, 2850, 71, 2099, 2614, 520, 520, 520, - 2284, 1551, 520, 47, 2618, 2101, 41, 541, 111, 962, - 2464, 1657, 2360, 2622, 948, 2666, 2364, 44, 932, 2366, - 1662, 2674, 1545, 1140, 902, 1869, 2555, 1816, 1599, 1759, - 1046, 1046, 949, 1045, 2456, 545, 1901, 1172, 959, 1198, - 1902, 1903, 1173, 1611, 1904, 1905, 1906, 1612, 1613, 2740, - 2417, 978, 2418, 2502, 1196, 1283, 1759, 933, 2503, 1198, - 1197, 2775, 1942, 979, 1283, -592, 1817, 1943, 813, 980, - -592, 47, 2129, 981, 1759, 813, 2130, 2007, 1621, 1212, - 2008, 1932, 1759, 1934, 1935, 2498, 1784, 2419, 1283, 2420, - 984, 1759, 934, 1130, 1131, 1756, 1133, 1018, 1199, 71, - 1698, 1818, 2599, 2528, 2601, 2292, 987, 2114, 2293, 1199, - 1545, 2355, 1623, 1174, 2356, 988, 1445, 1823, 2049, 989, - 3003, 2393, 1756, 2602, 2394, 2604, 714, 1824, 1213, 990, - 1826, 1827, 804, 2725, 991, 714, 2102, 2732, 1214, 804, - 1756, -592, 935, 3509, -2014, -2014, 1699, 2103, 1756, 998, - 1215, 1819, 971, -2015, -2015, 1230, 2102, 1756, 992, 1201, - 2441, 1850, 1175, 2442, 993, 1198, 2212, 2103, 2444, 714, - 1201, 2442, 1027, 3472, 1552, 520, 1030, 968, 2605, 77, - 778, 2606, 1216, 2840, 2530, 2842, 1564, 1033, 3484, 2611, - -592, 1231, 2612, 2677, 1038, 1199, 1984, 3496, 2737, 3497, - 1039, 2442, 1202, 2566, 1872, 932, -2018, -2018, 2935, 2504, - 1816, 1040, 1700, 1590, 1960, 1199, 1961, 2556, 2556, 1963, - 2505, 2884, 520, 520, 1967, 1041, 2877, 1970, 520, 1971, - 520, 2841, 2952, 1975, 1218, 520, 520, 520, 520, 2648, - 3522, 1871, 1134, 3520, 933, 1469, 1908, 1138, 3521, 1817, - 520, 520, 2258, -2019, -2019, 520, 1201, 520, 23, 1219, - 520, 2738, 1203, 1701, 2008, 520, 2741, 520, 520, 2742, - 520, 2762, 2763, 1203, 520, 2962, 1201, 1149, 1221, 2652, - 2876, 1155, 2885, 1169, 3166, 1171, 1370, 1371, 2259, 1162, - 2743, 1156, 811, 2742, 880, 880, 2818, 880, 2976, 2819, - 2977, 2356, 1158, 2293, 1159, 805, 2996, 805, 1202, 2997, - 805, -2020, -2020, 1160, 518, 805, 1909, 811, 805, 811, - 805, 1199, 811, 1163, 805, 1702, 3330, 811, 3331, 935, - 811, 1545, 811, 1592, 1819, 3004, 811, 3058, 3005, 518, - 2008, 518, 1170, 2748, 518, 2751, 2753, 2754, 2749, 518, - 2750, 2752, 518, 1189, 518, 536, 1378, 1379, 518, 1203, - 536, 1191, 3194, 520, 520, 2008, 1193, 3195, 1194, 2013, - 2442, 2010, 520, 520, 2011, -2021, -2021, 2012, 2265, 1203, - 520, 1195, 1201, 1207, 2015, -1308, 115, 520, 77, 2016, - 531, 1208, 3224, 3459, 3231, 2008, 3241, 1984, 744, 3242, - 1225, 27, 28, 29, 3274, 3275, 3310, 2356, 2293, 2008, - -2023, -2023, 714, 832, 2266, 1229, 520, 845, 537, 520, - -2024, -2024, 1233, 537, 1545, 520, 520, 520, 520, 520, - 520, 520, 520, 714, -2025, -2025, 1234, 520, 520, 2552, - 972, 3370, 520, 1286, 2356, 3383, 520, 1289, 3384, 520, - 520, 520, 520, 520, 520, 520, 520, 520, 2138, 1290, - 520, 1295, 2683, 1297, 71, 1301, 34, 520, 2085, 1283, - 1311, 907, 3409, 1382, 1383, 3410, 1313, 2307, 2069, 813, - 3453, 3494, 2173, 3384, 3384, 1203, 1314, 3138, 520, 882, - 1321, 539, -2026, -2026, 3102, 2744, 2746, 908, -2027, -2027, - 1322, 815, 1328, 39, 813, 1331, 813, -2028, -2028, 813, - 520, 1146, -2029, -2029, 813, 2884, 1332, 813, 1337, 813, - 1355, 520, 520, 813, -2030, -2030, 1910, 1911, 1912, 1356, - 1913, 1914, 1915, 1916, 1917, 1918, 41, 1639, 1640, 1641, - 1642, 1643, 1644, -2032, -2032, -2033, -2033, 44, 1292, 1359, - 2144, -2034, -2034, -2035, -2035, -207, 2995, 1362, 1545, -2036, - -2036, 1417, 909, -2037, -2037, 2834, 1430, 714, 804, 714, - 804, 3155, 1433, 804, -2039, -2039, 1432, 2033, 804, 1440, - 2970, 804, 1987, 804, 2034, 2035, 1448, 804, 2036, 2037, - 2038, 910, 2958, -2041, -2041, 3471, 2192, 2193, 541, 3473, - 542, 47, 2237, 541, 2241, 962, -2043, -2043, 2988, 520, - 1803, 1804, 1447, 1283, 1454, 3069, 520, 520, -643, -643, - 1008, 1467, 14, 15, 1455, 1009, 545, 1461, 544, -647, - -647, 545, -646, -646, 911, 1465, 3309, 1380, 1381, 1547, - 1382, 1383, 1550, 3220, 3098, 3099, 3480, 3481, 3506, 3507, - 1349, 1548, -820, 1045, 3514, -827, 1901, 1283, 1667, 1668, - 1902, 1903, 2329, 1559, -2044, -2044, -2044, 23, 1563, 714, - 47, -668, -669, 71, -817, -818, 1283, 520, 2270, 1573, - -821, 1574, -819, 1584, 1010, 971, 1603, 1597, 1605, 1650, - 1666, 2285, 2285, 1652, 1654, 1675, 1676, 1680, 1685, 1684, - 1173, 2552, 1545, 1175, 1722, 1720, 520, 520, 1724, 520, - 1736, 1754, 1755, 1756, 1545, 520, 520, 520, 520, 520, - 520, 1761, 1762, 520, 520, 520, 520, 520, 520, 520, - 520, 520, 520, 1763, 2430, 1768, 1776, 1780, 520, 520, - 2433, 2857, 520, 1775, 1545, 2935, 1790, 2858, 112, 520, - 1796, 1545, 2095, 3130, 1806, 1011, 1807, 1808, 1346, 912, - 2859, 1812, 3139, 3140, 2359, 1821, 1822, 1815, 1831, 1830, - 913, 520, 1834, 1838, 1837, 520, 1840, 520, 1841, 1843, - 3042, 520, 1844, 1851, 2860, 1852, 2861, 3309, 1856, 1545, - 1864, 1012, 3272, 1545, 1890, 520, 1892, 1283, 1893, 1545, - 1929, 1895, 1962, 1898, 1921, 914, 1930, 1013, 1937, 1940, - 27, 28, 29, 1958, 1968, 1974, 1610, 1014, 1972, 1611, - 880, 1545, 1973, 1612, 1613, 805, 872, 1979, 915, 1982, - 3309, 805, 520, 520, 1553, 1985, 1560, 811, 1991, 1990, - -593, 1565, 2020, 811, -524, -593, 1542, 1986, 1988, 1989, - 2019, 1015, 3040, 1046, 1621, 916, 2053, 2054, -524, 518, - 2551, -2044, 554, -524, 1611, 518, 1592, 2059, 745, 2062, - 865, 2065, 520, 2862, 2087, 34, 2064, 520, 520, 3309, - 821, 3363, 2066, 2094, 2067, 2105, 36, 2106, 1623, 2108, - 2132, 2133, 2139, 2156, 862, 862, 873, 1016, 2152, 873, - 2151, 2172, 520, 520, 1017, 2169, 2181, 520, 38, 2182, - 2183, 2186, 39, 2184, -524, 3325, -593, 2185, 1349, 2203, - 2207, 520, 2208, 1349, 520, 2211, 520, 2214, 2218, 2219, - 2220, 2290, 874, 2294, -524, 2300, 1909, 2311, 2309, 2312, - 2313, 2863, 520, 714, 1018, 41, 2864, 1664, 2314, 520, - 2315, 2336, 520, 2507, 2310, 2316, 44, 893, 2330, 2331, - 1534, 2333, 2337, 1019, 2340, -593, 71, -524, 2357, 520, - 1868, 1870, 45, 2365, 874, 2338, 3116, 1901, 2344, 2395, - 2402, -524, 520, -524, -2044, 1926, -524, 1925, 2403, 2404, - 2426, 2408, -524, 2434, 2446, 2865, 46, 2448, 2414, 520, - 520, -2044, 805, 2415, 2432, 2453, -2044, 2935, 2462, 2454, - 47, 2866, 2457, 2455, 811, 2458, 520, 2459, 520, 805, - 2460, 2463, 1542, 2474, 813, 2470, 2478, 520, 2471, 2476, - 813, 811, 1020, 2477, 2473, 2813, 518, -524, 2475, 2479, - 1783, 2480, 2481, 2491, -2044, 714, 714, 714, 2494, 2499, - 2515, 2492, 2523, 518, 2534, 1610, 2539, -524, 1611, 3261, - 2540, 2506, 1612, 1613, 2537, 2547, -2044, -2044, -2044, 2516, - 2039, 2040, 2041, 2521, 2042, 2043, 2044, 2045, 2046, 2047, - 2237, 2237, 2237, 2545, 520, 865, 2522, 972, 804, 23, - 1283, 2535, -649, 1621, 804, 2548, 2565, 2558, 2562, 1632, - 1622, 2569, 2559, 2561, 2570, 2573, -524, 2576, 2571, 2575, - 1542, 2579, 2867, 2613, 2598, -524, 2600, 2631, 2619, 1823, - 2620, 2868, 2621, 875, 2632, 2607, 714, 1623, 2647, 1824, - 2633, 1545, 1826, 1827, 2651, 2634, 1534, 2646, 2667, 2663, - 2671, -524, 2675, 2664, 2680, 2668, -2044, -2044, -2044, 520, - 1913, 1914, 1915, 1916, 1917, 1918, 2690, 2698, 2701, 2708, - 2721, 1872, 2704, 971, 2722, 2733, 2707, 2734, 2709, 714, - 2739, 2710, 2758, 2770, 2069, 1868, 1870, 2639, 2747, 2780, - 2755, 2799, 2808, 2764, 2793, 2827, 2778, 1349, 2781, 2831, - 2801, 3314, 2839, 3316, 2872, 2653, 2784, 2888, 2969, -2044, - 2980, 813, 2805, 2984, 1872, 2794, 2993, 520, 2829, 902, - 3324, 2846, 1158, 903, 2825, 2852, 2845, 2974, 813, 2964, - 1590, 2814, 2955, 1624, 1534, 2961, 2956, 2957, 2965, 3000, - 2973, 2979, 27, 28, 29, 3006, 1346, 2293, 2095, 3001, - 1625, 3026, 3028, 3032, 2688, 1626, 2689, 520, 3036, 3446, - 2694, 3326, 2697, 3328, 2517, 3046, 3047, 3049, 3089, 865, - 3050, 3070, 3077, 1545, -524, 804, 3080, 3091, 3095, 811, - 3096, 3082, 3097, 2796, 3103, 3104, 3105, 3109, 3407, 520, - 3113, 3114, 804, 1629, 3115, 520, 520, 3123, 3126, 3411, - 3128, 518, 865, 3129, 3133, 3400, 520, 34, 3163, -2012, - -2013, 3147, -2014, -2015, -2016, -2017, -2044, 520, -2018, -2019, - 520, -2020, 520, 1639, 1640, 1641, 1642, 1643, 1644, 1545, - 520, 3146, 3148, 520, 520, 3395, 3149, 3152, 520, 520, - 3153, 1542, 902, -2021, 39, 520, 903, 1610, 1632, -2023, - 1611, -2024, -2025, 2833, 1612, 1613, -2026, 3150, -2027, -2028, - 520, -2029, 3167, -2030, -2032, 3168, -2033, 2013, -2034, 2010, - 520, -2035, 2011, 2817, -2036, 2012, -2037, 41, -2038, 3182, - -2039, 3170, 2015, 516, 527, 1621, 77, 2016, 44, 552, - 520, -2040, -2044, -2041, -2042, 552, -2043, -1261, 3184, 802, - 3161, 816, 816, 3186, 45, 3187, 820, 552, 828, 3190, - 939, 828, 3196, 3197, 846, 850, 3200, 3202, 850, 1623, - 3208, 552, 552, 3211, 3204, 3214, 1209, 23, 46, 714, - 3210, 3215, 2938, 714, 1542, 714, 3216, 3223, 3219, 3239, - 3243, 3238, 2815, 3249, 3246, 864, 1210, 520, 1634, 520, - 3251, 802, 802, 3263, 3264, 1534, -1260, 3271, 3273, 1349, - 3280, 3282, 3283, 3298, 2237, 3311, 813, 3296, 2940, 3297, - 2241, 3312, 3315, 3318, 3319, 3321, 846, 3327, 3332, 2967, - 3352, 1823, -1774, 850, 552, 850, 850, 850, 3122, 3356, - 3358, 1824, 1211, 2878, 1826, 1827, 3359, 3362, 3368, 3376, - 3375, 3377, 3381, 2879, 3386, 2931, 3388, 2989, 3390, 3435, - 2991, 3393, 865, 3073, 3399, -2044, 3406, 3397, 3394, 3398, - 3408, 3404, 3413, 3418, 520, 3424, 3425, 1545, 3426, 3431, - 3433, 3432, -2044, 3451, 3461, 3441, 3464, -2044, 2639, 3485, - 3462, 3466, 3443, 3445, 520, 520, 3482, 3463, 1534, 520, - 3499, 3510, 520, 3504, 3515, 1635, 3524, 3525, -2044, -2044, - -2044, 2880, 1639, 1640, 1641, 1642, 1643, 1644, 1542, 2887, - 27, 28, 29, 1161, 2245, -2044, 2328, 2596, 3339, 520, - 3439, 2891, -1774, 1439, 3403, 2346, 2820, 1212, 3508, 3136, - 2682, 3422, 3492, 520, 3259, 3460, 23, 3467, 520, 520, - 3486, 865, 958, 520, 1545, 1746, 3295, 2578, 520, 2983, - 3458, 520, 520, 3465, 2603, 2574, 520, 1283, 2856, 1590, - 520, 2941, 3456, 1854, 520, 1610, 904, 2642, 1611, -1774, - 1632, 520, 1612, 1613, 1820, 34, 1213, 2687, 3191, 2564, - 2550, 2963, 1677, -1774, 1437, 1438, 1214, 1717, -1774, 2210, - 1716, 2712, 1590, -1774, 3444, 2560, 2178, 3389, 1215, 3317, - 2881, 2209, -1774, 1621, 806, 2536, 3035, -1774, 1721, 3218, - -2044, 71, 39, 2438, 805, 520, 997, 71, 983, 2706, - 2705, 2736, 1534, 520, 3265, 2452, 811, 3392, 14, 15, - 1216, 2353, 3391, 2489, 2553, 2760, 2513, 1623, 2511, -1774, - 2467, 3079, 520, 2832, 1949, 41, 1404, 1389, 518, 1391, - 2490, 1545, 1542, 1395, 1396, 1397, 44, 1398, 862, -1774, - 3081, 1399, 1400, 2772, 1542, 2806, 3379, 976, 2288, 2445, - -2044, 2147, 45, 23, 1866, 1888, 2149, 2821, 890, 27, - 28, 29, 1218, 2623, 0, 2938, 1792, 0, 0, 0, - 0, 0, 0, 0, 1542, 0, 46, 0, 0, 23, - 0, 1542, 2785, 0, 0, 0, 0, 1219, -1774, 0, - 47, -1774, 0, 0, 0, 0, 0, -1774, 0, 0, - 0, 0, 0, 71, 0, 0, 1221, 714, 2882, 0, - 0, 2883, 520, -2044, 0, 0, 1536, 0, 0, 1542, - 0, 0, 865, 1542, 34, 0, 0, 0, 0, 1542, - -2044, 71, 3174, 0, 71, -2044, 0, -1774, 0, 0, - 971, 0, 1872, 520, 1545, 0, 1534, 0, 0, 0, - 0, 1542, 0, 0, 0, 0, 0, -2044, 1534, 520, - -1774, 39, 0, 0, 1639, 1640, 1641, 1642, 1643, 1644, - 0, 0, 1045, -2044, 0, 1901, 0, 0, 0, 1902, - 1903, 0, 1590, 1904, 1905, 1906, 0, 1545, 1534, 0, - 3169, 0, 520, 813, 41, 1534, 27, 28, 29, 0, - 2776, 0, 0, 520, 520, 44, 0, 520, 0, 520, - 0, 3337, 0, 1346, 0, 0, 0, 0, 852, 0, - 1756, 45, 27, 28, 29, 0, 0, 0, 1632, 0, - 0, 850, 0, 1534, 520, 0, 850, 1534, 0, 850, - 0, 0, 0, 1534, 0, 46, -1774, 552, 0, 3173, - 0, 0, 0, 0, 0, 0, -1774, 804, 520, 47, - 0, 34, 0, 0, 0, 1534, 0, 0, 0, 23, - 0, 864, 36, 0, 0, -1774, 0, -1774, -1774, 0, - 0, 0, 0, 0, 0, 0, 0, 34, 0, 2938, - 0, 0, 1536, 3236, 38, 1414, 0, 0, 39, 0, + 520, 904, 70, 54, 865, 1124, 1224, 877, 1292, 714, + 68, 58, 65, 1022, 82, 102, 520, 713, 1188, 1680, + 953, 77, 69, 517, 1784, 1420, 93, 1154, 1241, 1783, + 1795, 1925, 1295, 2172, 2139, 1394, 972, 1348, 1767, 811, + 847, 77, 2557, 1748, 1395, 1350, 1331, 98, 1581, 1475, + 772, 1393, 1830, 740, 2530, 881, 2532, 1391, 1982, 1754, + 1736, 882, 2590, 1758, 2547, 2050, 2450, 778, 520, 520, + 851, 1337, 1354, 51, 2074, 2075, 2940, 52, 863, 1800, + 2660, 53, 2942, 2511, 805, 2971, 56, 1788, 57, 60, + 61, 811, 811, 2546, 2274, 819, 63, 1856, 66, 67, + 80, 2583, 889, 2988, 1656, 81, 83, 844, 1223, 1659, + 1229, 518, 1233, 963, 84, 955, 878, 879, 2969, 90, + 91, 92, 1593, 1241, 97, 101, 2985, 518, 966, 103, + 1004, 2630, 2631, 2632, 2769, 1025, 805, 805, 2644, -1893, + 2833, 897, -1324, -858, 2838, 1046, 1046, 2304, 1362, -1893, + -512, 813, -1265, 2195, -516, 2452, 2402, -2033, -2033, 3384, + -1262, -1262, 2143, -850, 1612, 2299, 2192, 3180, -1884, 1614, + -1265, -1246, 2089, 1325, -1901, -1884, -2024, -2024, -858, 518, + 518, 1609, -2042, -2042, 973, -855, 1404, -1266, -1901, -855, + 815, 1558, 1559, 2661, 1046, -1263, -1263, -2019, -2019, 1622, + -1266, -817, 1664, 813, 813, -830, -845, 815, 1571, 815, + 1350, 3165, -2044, -2044, 1210, 2300, 2431, 2432, 2648, 2469, + 1660, 1341, 815, 2652, 2089, 1902, 1046, 2438, 2646, 3184, + 1904, 2442, 3113, 1624, 1211, 1325, 532, 855, 1750, 2639, + 1143, 815, 3258, 2694, 2696, 1166, 2699, 1177, 1341, 1786, + -512, 1563, 1543, 1046, -516, 1589, 1180, 972, 2733, 2734, + 1798, 1739, 1136, 3096, 1241, -227, 1316, 1573, 1325, 1799, + -227, 3, 4, 1759, 2296, -466, 2668, 3271, 1768, 1612, + 1212, 1771, 1772, 1613, 1614, -649, 1350, 999, 3128, 1350, + 1350, 2205, 3148, 1902, 3418, 1942, 1699, 1903, 1904, 815, + 869, 944, 1612, 874, 1750, 1317, 1613, 1614, 1025, 3343, + 2414, 815, 1902, 2962, 1622, 2618, 1903, 1904, 3450, 874, + 1004, 2412, 3079, 71, 3081, -1104, 3457, 2805, 1942, 2807, + 3181, 3465, 2716, -1104, 1661, 1140, 872, 1622, 1355, 2989, + 3302, 1773, 1700, 71, 3514, 3182, 804, 1988, 1624, 783, + 3303, 1683, 533, 1005, 1665, 1742, 1731, 1732, 2586, 1735, + 2198, 71, 3124, 3204, 2415, 2110, 2076, 2425, 2426, 2427, + 864, 1624, 2705, 1173, 2126, 1213, 3370, -1125, 1174, 3408, + -2018, -2018, 2127, 1696, 3443, -1125, 1173, 2806, 833, 3147, + 870, 2167, 3110, -787, 1167, 2280, 2847, 1843, 804, 804, + 880, 1459, 3337, 3503, 3338, 1612, 873, 1144, 1701, 1145, + 2375, 2136, 1444, 2876, 3174, 2826, 2846, 1802, 3288, 3501, + 1869, 1871, 2856, 71, 1214, 3186, 2829, 2522, 1576, 1543, + 3419, 3388, 1868, 1576, 1215, 1500, 782, 1046, 2098, -512, + 1622, 2403, 1031, -516, 1778, 1295, 1216, 3519, 2857, 1175, + 1577, 3175, 1460, 1032, 2764, 1577, 2583, 1662, 2583, 1702, + 3526, 3369, 1175, 814, 1578, 2099, 3111, 1326, 1779, 3498, + 3430, 3472, 3451, 3433, 1624, 2199, 2168, 1760, 1217, 3238, + 3390, 3240, 2827, 1318, 874, 1774, 2877, 784, 2111, -669, + 834, 1697, 1006, 2587, 1581, 1775, 1168, 2995, 1176, 3269, + 2226, 3452, 3458, 1757, 2990, 2112, 3515, 2416, -512, 1575, + 2113, 1684, -516, 3010, 3420, 1744, 3304, 1543, 2413, 1137, + 3490, 1703, 3125, 3520, 2706, 3253, 1801, 3202, -787, 1326, + 1219, 2297, 3247, 980, 3344, 3183, 919, 1682, 1045, 3460, + 2090, 1902, 1985, 1757, 3263, 1903, 1904, 1011, 2114, 1905, + 1906, 1907, 2021, 2733, 2734, 1220, 3473, 3431, 2281, 1733, + 2137, 3504, 1326, 1675, 1750, 2206, 3259, 3496, 1734, 3114, + 2878, 3001, 2446, 2288, 1222, 1751, 2963, 1601, 2981, 856, + 2100, 714, 530, 1012, 1787, 2285, 2217, 2978, 2785, 941, + 2102, 902, 2513, 1934, 1138, 903, 2993, 1319, 2050, 1445, + 867, 953, 3316, 2703, 2279, 3159, 1858, 1040, 1949, 1014, + 945, 2534, 1862, 2940, 852, 3521, 1576, 3432, 2383, 2942, + 2560, 1554, 1558, 1559, 3279, 1970, -512, 972, 1327, 871, + -516, 2343, 1745, 875, 2192, 1750, 883, 1784, 1577, 2640, + 2641, 2026, 3137, 3138, 2370, 2664, 1753, 1571, -1893, 2748, + 2619, 1576, 1578, 2056, 1568, 2057, 2376, 2653, -1893, -1324, + 3466, -1265, 2555, 1645, 1568, -512, 2349, -512, 2549, -516, + 3250, -516, -850, 1577, 2142, 3251, 3104, -1884, 902, -1265, + -1246, 2072, 903, -1901, -1884, 1563, 2404, 1580, 2727, 3462, + 1330, -1104, 2644, 2409, -855, 534, -1266, -1901, 1560, 1607, + 3224, 1146, 1859, 2115, 1866, 1573, 865, 2032, 2033, -1266, + 1561, 2659, 3368, 993, 1566, -845, 1657, 3376, 2144, 966, + 2018, 1589, 1345, 1346, 1919, 1241, 2070, 1241, 1908, 3491, + 1589, 2443, 3351, 3162, 2154, 2443, 1018, 1778, 1543, 2010, + 2128, 2103, 971, -1125, 2053, 3122, 3375, 1173, -593, 1345, + 1346, 1909, 2104, -593, 3095, 1446, 1940, 865, 1612, 2155, + 2384, 1779, 2222, 2464, 3086, 112, -227, -227, 3522, 77, + 2385, 858, 2850, 2071, 2612, 1642, 1643, 1644, 1645, 968, + 868, 104, 520, 2814, 2191, 2191, 3005, 2613, 2279, 1916, + 1917, 1918, 1919, 520, 3352, 778, 1640, 1641, 1642, 1643, + 1644, 1645, 3087, 2410, 3097, 811, 1914, 1915, 1916, 1917, + 1918, 1919, 3404, 3405, 3492, 1189, 811, 3154, 3178, 3123, + 3441, 1910, 2223, 1175, -593, 2222, 881, 1624, 520, 520, + 105, 1543, 882, 2717, 2718, 2719, 2720, 2252, 2815, 2364, + 2969, 996, 2410, 3493, 2365, 1350, 3163, 2255, 113, 2628, + 2258, 520, 921, 977, 922, 1350, 3130, 71, 1350, 2851, + 2629, 995, 2336, 3060, 3135, 3445, 1035, 1036, 1037, 3179, + 70, 54, 1176, -593, 1759, 2940, 2251, 2594, 68, 58, + 65, 2942, 82, 102, 1141, 2580, 1147, 1759, 902, 77, + 69, 1155, 903, 518, 93, 520, 714, 1601, 3175, 1284, + 520, 2366, 1141, 2092, 518, 2523, 884, 2889, 3044, 844, + 844, 3046, 844, 3048, 2019, 98, 1437, 813, 1339, 900, + 2485, 1340, 3232, 2025, 2956, 2852, 2957, 2853, 813, 2419, + 2309, 3516, 1759, 3233, 1463, 2275, 2276, 2277, 1467, 3284, + 2353, 51, 1569, 1570, 3256, 52, 2342, 930, 1350, 53, + 2344, 2214, 1284, 2346, 56, 1870, 57, 60, 61, 1699, + 1046, 1294, 2776, 971, 63, 1543, 66, 67, 80, 2050, + 815, 520, 520, 81, 83, 2357, 1337, 520, 2250, 1576, + 520, 520, 84, 520, 520, 520, 520, 90, 91, 92, + 2098, 3243, 97, 101, 77, -1893, 930, 103, 2261, 520, + 1782, 1577, 2558, 2268, 2591, 1700, 520, 1046, 1379, 1380, + 1925, 2193, 2194, 1789, 1444, 1580, 2535, 2099, 2536, 931, + 778, 3270, 811, 2503, 520, 1284, 1546, 536, 1857, 811, + 906, 1911, 1912, 1913, 872, 1914, 1915, 1916, 1917, 1918, + 1919, 1943, 536, 1447, 865, 520, 1944, 1440, -594, 1454, + 2504, 1784, 2363, -594, 1451, 2253, 2367, 902, 1792, 2369, + 2256, 1600, 2130, 2566, 520, 918, 2131, 805, 931, 2459, + 925, 71, 864, 2226, 805, 520, 520, 520, 1760, 520, + 520, 2633, 3364, 3196, 714, 923, 1693, 924, 3347, 1857, + 537, 1760, 1599, 3070, 902, 2860, -1246, 1933, 903, 1935, + 1936, 2861, -208, 2555, 873, 537, 2408, 1452, 929, 1543, + 518, 1457, 982, 520, 2862, 2592, 932, 518, 937, 2620, + 2860, 1543, 1702, 994, -594, 1383, 1384, 1552, 942, 47, + 520, 520, 2100, 2420, 813, 2421, 1760, 2101, 2863, 943, + 2864, 813, 2102, 1673, 1757, 946, 1674, 1687, 1688, 1011, + 1694, 1543, 947, 882, 882, 933, 882, 1757, 1543, 1863, + 972, 948, 1864, 2863, 520, 1817, 949, 3289, 520, 520, + 2505, 880, 1593, -594, 2326, 2506, 2327, 1759, 520, 520, + 520, 959, 874, 520, 1703, 1012, 2605, 2669, 2607, 2467, + 934, 71, 1759, 2677, 1141, 2422, 1543, 2423, 23, 536, + 1543, 1453, 1757, 1546, 1818, 1984, 1543, 2743, 1985, 1131, + 1132, 1014, 1134, 1045, 2008, 2293, 1902, 2009, 2294, 2533, + 1903, 1904, 3290, 978, 1905, 1906, 1907, 2865, 1543, 2358, + 2396, 3291, 2359, 2397, 115, 1293, 1284, 979, 531, 1819, + 935, 2778, 980, 932, 1197, 1284, 744, 2843, 981, 2845, + 1198, 984, 2559, 2559, 107, 3292, 1170, 1785, 1172, 1759, + 907, 832, 537, 2444, 2501, 845, 2445, 987, 1197, 1284, + 541, 1200, 962, 2447, 1198, 2608, 2445, 2614, 2609, 2531, + 2615, 2680, 933, 988, 1985, 541, 908, 962, 989, 1820, + 990, 1546, 991, 2103, 854, 2866, 71, 2728, 545, 992, + 2867, 2735, 3006, 2617, 2104, -2015, -2015, 714, 1824, 1825, + 993, 1827, 1828, 545, 998, 1851, 714, 2655, 2621, 2050, + 3261, 2602, 1027, 2604, 3512, 2867, 2507, 3293, 1030, 804, + 1033, 875, 2593, 971, 2594, 539, 804, 2508, 1018, 1038, + 3294, 27, 28, 29, 3499, 2740, 3500, 1039, 2445, 2868, + 714, 909, -2016, -2016, 3475, 1199, 520, 1446, 1873, 892, + 77, 895, 1197, 899, 2595, 2869, 2938, 935, 1198, 3487, + 968, 1553, 2741, 1135, 2868, 2009, 2569, -2017, -2017, 1199, + 910, 1760, 1040, 1565, 1041, 2625, 778, 3525, 2744, 1150, + 2869, 2745, 1293, 2651, 2746, 2887, 1760, 2745, 1139, -207, + 1157, 2880, 1156, 520, 520, 2821, 34, 1159, 2822, 520, + 1591, 520, 2979, -2020, -2020, 2359, 520, 520, 520, 520, + 2955, 1160, 108, 911, 3523, 2844, 1909, 2980, 1161, 3524, + 2294, 520, 520, 109, 811, 1163, 520, 2999, 520, 1164, + 3000, 520, 541, 39, 542, 1171, 520, 1757, 520, 520, + 2965, 520, 2765, 2766, 2879, 520, 2888, 3007, 1190, 811, + 3008, 811, 1757, 1760, 811, 1192, 2870, 1195, 110, 811, + 545, 1194, 811, 1199, 811, 2871, 41, 3061, 811, 3197, + 2009, 1196, 2009, 1208, 1961, 3198, 1962, 44, 2445, 1964, + 1209, 2870, 880, 880, 1968, 880, 1910, 1971, 1226, 1972, + 2871, 1817, 3227, 1976, 805, 2009, 805, 1371, 1372, 805, + 3234, 1200, 1546, 1985, 805, 2753, 2755, 805, 111, 805, + 1589, 1593, 518, 805, 2754, 2756, 2757, 1230, 3333, 1757, + 3334, 2752, 2747, 2749, 1234, 1200, 2751, 23, 1543, 3295, + 1818, 47, 3296, 1535, 520, 520, 813, 518, 912, 518, + 2014, 2011, 518, 520, 520, -2021, -2021, 518, 2012, 913, + 518, 520, 518, 1235, 3244, 1287, 518, 3245, 520, 77, + 2013, 813, 1202, 813, 2016, 3169, 813, 1379, 1380, 3277, + 3278, 813, 2359, 2294, 813, 3313, 813, 1290, 2009, 1291, + 813, 1296, 1201, 714, 914, 2017, 1202, 520, 1298, 3373, + 520, 1210, 2359, 1312, 1203, 1546, 520, 520, 520, 520, + 520, 520, 520, 520, 714, -2022, -2022, 915, 520, 520, + 2139, 1211, 2086, 520, 2686, 1820, 1302, 520, 1203, 1200, + 520, 520, 520, 520, 520, 520, 520, 520, 520, 972, + 2555, 520, 1314, 3386, 916, 3141, 3387, 1315, 520, 1197, + 1284, 3412, 1322, 3456, 3413, 1198, 3387, 3497, -644, -644, + 3387, 1329, 71, -2023, -2023, -2025, -2025, 1212, 2881, 520, + 1323, 2070, 1543, 2174, 1332, 1204, -2026, -2026, 2882, 882, + 27, 28, 29, 815, -2027, -2027, 1227, 1350, 3105, 2887, + 1202, 520, -2028, -2028, 1383, 1384, -2029, -2029, 1333, 1204, + -2030, -2030, 520, 520, 1147, 1338, 1911, 1912, 1913, 1356, + 1914, 1915, 1916, 1917, 1918, 1919, -2031, -2031, -2032, -2032, + 1535, 1357, 1228, -2034, -2034, -2035, -2035, 1360, 1543, -2036, + -2036, -2037, -2037, -2038, -2038, 1363, 2883, -2039, -2039, 1546, + 2837, -2041, -2041, -2043, -2043, 34, -2045, -2045, 714, 1418, + 714, 1804, 1805, 1988, -648, -648, 2238, 1433, 2242, 3158, + 1199, 2973, 1213, 1431, 2991, 1434, 804, 1441, 804, 1448, + 2961, 804, -647, -647, 1381, 1382, 804, 2998, 1449, 804, + 3474, 804, 39, 1455, 3476, 804, 1456, 920, 1383, 1384, + 520, 1462, 927, 1204, 1284, 928, 1466, 520, 520, 3101, + 3102, 3223, 3483, 3484, 14, 15, 3312, 1197, 1535, 3509, + 3510, 1214, 1468, 1198, 3072, 41, 1548, 3045, 1668, 1669, + 1549, 1215, 1551, -821, -828, 1560, 44, 1564, 47, -669, + -670, 1543, -818, 1216, 1045, 2884, -819, 1902, 1284, 3517, + 1574, 1903, 1904, 2330, -822, 1905, 1906, 1907, 1575, 23, + 714, -820, 1585, 1598, 1651, 1604, 1045, 1284, 520, 1902, + 1653, 1655, 2779, 1903, 1904, 1217, 971, -2046, -2046, -2046, + 1606, 71, 1667, 1676, 1677, 1681, 1685, 1686, 1176, 1174, + 47, 1721, 1723, 1546, 1725, 1755, 1737, 520, 520, 1756, + 520, 1762, 1757, 1764, 1763, 1546, 520, 520, 520, 520, + 520, 520, 2555, 2938, 520, 520, 520, 520, 520, 520, + 520, 520, 520, 520, 1769, 1776, 1200, 1219, 1199, 520, + 520, 1777, 1791, 520, 1781, 1546, 1543, 1797, 112, 1807, + 520, 1813, 1546, 1808, 1809, 1822, 1823, 1816, 1831, 1832, + 1835, 1838, 1220, 1839, 1841, 1845, 1842, 3133, 1844, 1852, + 2096, 1853, 520, 1857, 1865, 1350, 520, 3312, 520, 1891, + 1350, 1222, 520, 2885, 1893, 1197, 2886, 3275, 1896, 1899, + 1546, 1198, 1894, 1231, 1546, 1922, 520, 1202, 1284, 811, + 1546, 1930, 1931, 3142, 3143, 811, 1938, 1941, 1959, 1963, + 1969, 1975, 27, 28, 29, 1973, 1980, 1554, 1974, 1983, + 3312, 1986, 1546, 1543, 2433, 1991, 1561, 1869, 1871, 1232, + 2436, 1566, 1987, 520, 520, 1989, 3043, 1992, 880, 2021, + 1046, 1990, 2020, 2054, 805, 2055, 1612, 2060, 2065, 1535, + 805, 2063, 2088, 2106, 2068, 2066, 2109, 2067, 2095, 2107, + 2133, 2134, 2140, 986, 2816, 2152, 2153, 1909, 2157, 3312, + 873, 2170, 865, 520, 1593, 2173, 2183, 34, 520, 520, + 2184, 2185, 2182, 2186, 2187, 2208, 2209, 518, 36, 3366, + 2204, 2219, 2212, 518, 1200, 1757, 1199, 2215, 2220, 3328, + 1204, 874, 2295, 520, 520, 2221, 2291, 2301, 520, 2310, + 38, 813, 2312, 2313, 39, 1197, 2314, 813, 23, 2316, + 2315, 1198, 520, 2317, 2331, 520, 2332, 520, 2334, 2341, + 1543, 1008, 2337, 2339, 2338, 2360, 1009, 1910, 2345, 2368, + 1927, 1902, 1535, 520, 714, 2398, 1926, 41, 2405, 2406, + 520, 2213, 2407, 520, 2411, 1202, 2417, 1191, 44, 1910, + 3119, 2418, 2429, 2435, 1543, 2437, 2449, 2451, 2456, 2457, + 520, 2458, 2311, 2460, 45, 2461, 811, 2462, 2465, 2463, + 2466, 2473, 2476, 520, 71, 2938, 2502, 1203, 2474, 1288, + 2477, 2478, 2509, 811, 2481, 1010, 2479, 554, 46, 2482, + 520, 520, 2519, 745, 2480, 1304, 1306, 1309, 1311, 2497, + 2518, 2483, 47, 2526, 2524, 821, 2484, 520, 2525, 520, + 2494, 805, 2537, 2495, 2538, 2540, 1199, 2542, 520, 862, + 862, 2548, 1869, 1871, 1784, 3264, 2543, 2564, 805, -650, + 2551, 2561, 2550, 1543, 1350, 2562, 714, 714, 714, 2565, + 2817, 2568, 1200, 2572, 2238, 2238, 2238, 1407, 1204, 2573, + 2574, 27, 28, 29, 518, 2576, 1011, 1045, 2578, 2579, + 1902, 2582, 2601, 536, 1903, 1904, 1535, 2603, 1905, 1906, + 1907, 518, 2616, 2634, 2635, 520, 1543, 865, 813, -525, + 2622, 1284, 893, 2636, 2637, 3063, 2650, 2623, -1310, 2624, + 2654, 2649, 1012, -525, 2666, 813, 804, 972, -525, 2259, + 2667, 2670, 804, 1202, 2671, 2678, 2683, 2674, 1013, 2693, + 2701, 2704, 2707, 2710, 2724, 2725, 34, 714, 1014, 2711, + 1824, 1825, 1546, 1827, 1828, 1873, 537, 2712, 2713, 2736, + 2737, 2742, 2750, 2758, 2761, 2260, 2767, 1911, 1912, 1913, + 520, 1914, 1915, 1916, 1917, 1918, 1919, 2773, 2781, -525, + 2783, 2796, 1015, 39, 520, 971, 2784, 2802, 2811, -2046, + -2046, -2046, 714, 1914, 1915, 1916, 1917, 1918, 1919, -525, + 1873, 2804, 1200, 1965, 2834, 2787, 2797, 2070, 1543, 2808, + 2308, 2828, 3317, 2830, 3319, 2842, 41, 2832, 2849, 2848, + 2855, 2875, 2891, 2958, 2959, 3327, 2964, 44, 1016, 2960, + 520, 2967, 2968, 2972, 2977, 1017, 1204, 2976, 2982, 2983, + 1535, 2987, 2996, 45, 2294, 3003, 3004, 3029, -525, 3009, + 3031, 3035, 1535, 811, 3039, 3049, 3050, -525, 1591, 2266, + 3053, 3073, 3329, 1202, 3331, 3052, 3080, 46, 3083, 3085, + 520, 3092, 3098, 3094, 3410, 1018, 2096, 3449, 3099, 3100, + 3106, 2818, 1535, 865, 3108, 3112, 1546, 3116, 1738, 1535, + 3107, 3117, 2520, 3126, 1019, 2267, 3118, 3129, 2799, 3131, + 1909, 1765, 520, 804, 3132, -1776, 3414, 3136, 520, 520, + -2014, -2015, 3150, 3403, -2016, -2017, 865, -2018, 3149, 520, + 804, -2019, 1790, -2020, 3151, 3155, 1350, 1535, -2021, -2022, + 520, 1535, -2023, 520, 3152, 520, 541, 1535, 962, 3156, + 3398, 518, 1546, 520, -2025, -2026, 520, 520, -2027, -2028, + -2029, 520, 520, -2030, -2031, -2032, -2034, -2035, 520, 1535, + 3153, 544, -2036, 1020, 545, 813, 1204, 2836, 1966, -2037, + 1910, 1611, -2038, 520, 1612, -2039, 3166, -2040, 1613, 1614, + 2014, 2011, -2041, 520, -2042, 1815, 2820, -2043, 2012, -2044, + -2045, -1263, 3164, 3170, 1834, 3171, 516, 527, 3185, 77, + 2013, 3189, 552, 520, 2016, -1776, -525, 3173, 552, 1622, + 3187, 3190, 802, 3193, 816, 816, -2046, 3199, 3203, 820, + 552, 828, 3200, 3207, 828, 2017, 3211, 846, 850, 3213, + 3217, 850, 3205, 3219, 552, 552, 3214, 3218, 3226, 3222, + 3242, 3246, 714, 1624, 3252, 2941, 714, 3241, 714, 3254, + 2238, 3249, -1776, 3266, 2943, 3267, 2242, -1262, 3274, 1876, + 520, 3276, 520, 3283, 802, 802, -1776, 3285, 3286, 3299, + 1543, -1776, 3300, 864, 902, 3301, -1776, 1159, 903, 3314, + 3315, 3318, 3321, 3322, 3324, -1776, 3330, 3335, 3355, 846, + -1776, 3125, 2970, 3359, 3361, 3362, 850, 552, 850, 850, + 850, 3365, 3371, 3438, 1824, 1825, 1877, 1827, 1828, 3379, + 3378, 3380, 3384, 3389, 3391, 3393, 3076, 3396, 1537, 3407, + 2992, 3397, -1776, 2994, 3400, 3402, 865, 1878, 3401, 3409, + 3411, 3416, 3421, 1957, 3428, 3427, 3429, 520, 3434, -2046, + 1546, 3435, -1776, 3436, 3464, 1879, 3444, 3446, 3448, 1880, + 3467, 3454, 3469, 3485, 3488, 939, -2046, 520, 520, 3502, + 3465, -2046, 520, 1008, 3466, 520, 3507, 3513, 1009, 3518, + 3527, 1881, 3528, 1162, 1882, 2890, 2246, 2599, 817, 817, + 1911, 1912, 1913, 3342, 1914, 1915, 1916, 1917, 1918, 1919, + 1883, -1776, 520, 3442, -1776, 2894, 3406, 3511, 2823, -2046, + -1776, 1611, 2347, 3139, 1612, 2685, 520, 3425, 1613, 1614, + 3495, 520, 520, 3262, 3463, 865, 520, 1546, 1210, 3470, + 3489, 520, -525, 3298, 520, 520, 1747, 1010, 2581, 520, + 1284, 23, 2606, 520, 904, 3461, -525, 520, 1211, 1622, + -1776, -525, 2577, 2859, 520, 3468, -2046, 2986, 2944, 1591, + 3459, 2645, 1821, 2690, 1633, 3194, 2966, 1855, 2567, 1438, + 811, 1678, 2553, -1776, 2211, 2715, 1717, 901, 3447, 1535, + 2179, 3392, 3320, 1624, 2563, 1718, 2210, 806, 2441, 2539, + 3038, 1722, 1591, 1884, 1212, 1440, 1439, 3221, 520, 2709, + 2329, 1885, -525, 2739, 997, 1537, 520, 983, 1011, 2708, + 3268, 71, 2455, 1405, 1390, 805, 2355, 71, 1392, 1396, + 23, 1397, -525, 1886, 1398, 520, 2356, 1399, 1400, 1401, + 3395, 852, 3394, 2556, 1546, 2492, 2763, 1950, 2493, 2470, + 2516, 2514, 2775, 2835, 1012, 3084, 3382, 2809, 2500, 976, + 1887, 2289, 2448, 1889, 1867, 2148, 1008, 958, 518, -1776, + 1013, 1009, 2824, 2883, -2046, 2150, 890, 0, 2941, -1776, + 1014, -525, 2626, 3340, 0, 2147, 0, 2149, 1793, -2046, + -525, 0, 813, 0, 27, 28, 29, 2159, -1776, 1213, + -1776, -1776, 0, 1537, 0, 0, -2046, 0, 0, 0, + 0, -2046, 1210, 0, 1015, 0, 0, 0, 0, 0, + 714, 0, 0, 1535, 0, 520, 0, 0, 1873, 0, + 1010, 0, 1211, 71, 0, 2196, 865, -1776, 0, 0, + -1776, -1776, -1776, 0, 0, 3177, 0, 0, 1214, -2046, + 0, 0, 0, 971, 0, 0, 520, 1546, 1215, 34, + 1016, 71, 0, 0, 71, 0, 0, 1017, 0, 0, + 1216, 0, 520, 27, 28, 29, 0, 0, 1212, 1535, + 0, -2046, 0, 862, 0, 0, 0, 0, 1640, 1641, + 1642, 1643, 1644, 1645, 0, 0, 39, 0, 0, 0, + 1546, 1011, 1217, 0, 1633, 520, 0, 1018, 0, 0, + 0, 0, 1591, 0, 0, 0, 520, 520, 0, 0, + 520, 0, 520, 0, 0, 0, 1019, 0, 0, 41, + 2302, 2303, 2305, 2306, 2307, 0, 0, 1012, 34, -525, + 44, 0, 0, 0, 850, 0, 0, 520, 0, 850, + 0, 0, 850, 1013, 1219, 0, 45, 0, 1611, 0, + 552, 1612, 0, 1014, 0, 1613, 1614, 0, 0, 0, + 0, 520, 0, 1213, 0, 39, 0, 0, 0, 1220, + 46, 0, 1535, 0, 0, 0, 0, 804, 0, 0, + 0, 0, 0, 0, 47, 1020, 1622, 1015, 1222, 0, + 0, 864, 2941, -2046, -2046, 0, 0, 902, 41, 0, + 0, 903, 0, 0, 0, 536, 0, 0, 1187, 44, + 0, 0, 1214, 0, 1537, 0, 714, 0, 3280, 3281, + 1624, 0, 1215, 0, 1873, 45, 0, 0, 0, 0, + -1310, 0, 520, 1016, 1216, 1538, 520, 0, 0, 0, + 1017, 0, 0, 0, 0, 0, 520, 0, 520, 46, + 520, 0, 0, 0, 520, 2424, 520, 0, 520, 811, + 0, 1540, 0, 47, 0, 0, 1217, 1535, 537, 520, + 0, 0, 0, 0, 520, 1045, 520, 0, 1902, 0, + 1018, 0, 1903, 1904, 520, 2510, 1905, 1906, 1907, 0, + 0, 0, 0, 0, 3339, 0, 3341, 714, 0, 1019, + 0, -2046, 520, 0, 0, 3348, 0, 1537, 1640, 1641, + 1642, 1643, 1644, 1645, 0, 0, -2046, 0, 1219, 0, + 0, 0, 961, 0, 0, 0, 3176, 0, 0, 0, + 536, 0, 0, -2046, 0, 0, 0, 3374, -2046, 0, + 951, 552, 552, 1220, 1535, 0, 23, 518, 0, 0, + 0, 520, 0, 3377, 0, -1310, 71, 3381, 0, 0, + 0, 520, 1222, 1413, 23, 0, 0, 0, 1020, 0, + 862, 813, 0, 520, 0, 0, -2046, 0, 0, 0, + 0, 974, 527, 816, 0, 0, 0, 520, 516, 0, + 850, 0, 1591, 537, 0, 0, 0, 0, 540, 802, + 0, 0, 0, 1001, 1001, 520, 0, 0, 1001, 1024, + 811, 0, 1538, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 828, 828, 828, 0, 0, 0, 0, 0, + 520, 1633, 0, 0, 0, 0, 828, 828, 1540, 828, + 0, 1537, 0, 0, 0, 520, 0, 538, 541, 0, + 962, 1535, 850, 811, 2941, 0, 714, 0, 552, 0, + 0, 0, 0, 0, 3348, 2207, 539, 543, 0, 0, + 850, 0, 0, 544, 0, 0, 545, 0, 0, 520, + 3471, 0, 0, 0, 850, 1535, 0, 0, 1909, 27, + 28, 29, 0, 520, 520, 520, 0, 0, 518, 0, + 1538, 0, 811, 0, 0, 0, 3486, 27, 28, 29, + 0, 0, 0, 0, 0, 0, 850, 1289, 0, 0, + 520, 0, 813, 540, 0, 0, 1540, 0, 1300, 0, + -207, -2046, 850, 850, 850, 850, 0, 0, 0, 71, + 71, 518, 0, 0, 1860, 975, 1861, 817, 1321, 0, + 0, 0, 0, 0, 34, 0, 0, 1414, 1910, 0, + 0, 520, 0, 0, 1535, 813, 0, 0, 0, 0, + 0, 0, 34, 541, 0, 542, 0, 1029, 0, 0, + 0, 1001, 1024, 0, 850, 1537, 0, 1412, 0, 0, + 518, 39, 543, 1001, 1001, 0, 0, 1537, 544, 552, + 0, 545, 1133, 2647, 0, 802, 0, 1535, 0, 39, + 0, 0, 802, 0, 813, 71, 0, 71, 2662, 2663, + 2665, 0, 552, 0, 41, 0, 0, 1537, 0, 1469, + 0, 0, 0, 2676, 1537, 44, 2679, 0, -2046, 1550, + 0, 2684, 41, 0, 0, 1640, 1641, 1642, 1643, 1644, + 1645, 45, 1611, 44, 0, 1612, 0, 0, 71, 1613, + 1614, 0, 0, -2046, -2046, -2046, 0, 0, 0, 45, + 0, 0, 1537, 0, 71, 46, 1537, 0, 71, 1415, + 0, 0, 1537, 0, 0, 0, 0, 0, 552, 47, + 1622, 0, 0, 46, 0, 0, 0, 1623, 0, 0, + 0, 0, 0, 0, 1537, 0, 0, 47, 0, 1535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 714, -1774, 3277, 3278, -1774, -1774, -1774, - 0, 0, 0, 0, 39, 0, 0, 0, -2044, 520, - 0, 41, 0, 520, 862, 0, 0, 0, 0, 0, - 0, 0, 44, 520, 0, 520, 0, 520, 1872, 0, - 0, 520, 0, 520, 0, 520, 0, 41, 45, 0, - 0, 0, 2931, 0, 0, 0, 520, 0, 44, 0, - 0, 520, 0, 520, 0, 0, 0, 0, 0, 0, - 1536, 520, 46, 0, 45, 1908, 0, 0, 0, 0, - 0, 3336, 0, 3338, 714, 811, 47, 1537, 0, 520, - 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, - 0, 0, 27, 28, 29, 0, 0, 518, 0, 0, - 0, 0, 47, 0, 0, 0, 0, 0, 0, 3345, - 0, 0, 0, 0, 3371, -2044, 71, 951, 552, 552, - 0, 0, 1639, 1640, 1641, 1642, 1643, 1644, 520, 0, - 3374, 0, 0, 0, 3378, 1909, 0, 0, 520, 0, - 0, 1542, 0, 536, 0, 0, 0, 0, 0, 0, - 520, 0, 1590, 0, 0, 0, 0, 34, 974, 527, - 816, 0, 0, 0, 520, 516, 0, 850, -1308, 3364, - 0, 1414, 0, 0, 0, 0, 802, 0, 0, 0, - 1001, 1001, 520, 0, 0, 1001, 1024, 0, 1859, 0, - 1860, 0, 0, 0, 39, 0, 0, 0, 0, 828, - 828, 828, 0, 0, 0, 0, 537, 520, 0, 0, - 0, 0, 1875, 828, 828, 0, 828, 0, 0, 0, - 0, 0, 520, 0, 0, 0, 811, 41, 0, 850, - 0, 2938, 0, 714, 0, 552, 0, 0, 44, 0, - 0, 0, 0, 0, 0, 0, 0, 850, 518, 0, - 0, 0, 0, 1537, 45, 1534, 520, 3468, 0, 1876, - 961, 850, 813, 0, 0, 1209, 0, 0, 3345, 811, - 520, 520, 520, 1542, 0, 0, 0, 0, 46, 0, - 1877, 1536, 0, 3483, -1776, 1210, 0, 0, 0, 0, - 0, 518, 47, 850, 1288, 0, 0, 520, 1878, 71, - 71, 0, 1879, 0, 2931, 1299, 0, 0, 0, 850, - 850, 850, 850, 0, 0, 0, 0, 0, 811, 0, - 0, 0, 0, 0, 1880, 1320, 1413, 1881, 0, 1542, - 0, 1211, 0, 0, 0, 0, 540, 0, 520, 0, - 518, 1537, 0, 1882, 0, 1910, 1911, 1912, 0, 1913, - 1914, 1915, 1916, 1917, 1918, 0, 0, 0, 1001, 1024, - 0, 850, 0, 0, 1411, 0, 0, 0, 0, 0, - 1001, 1001, 0, 0, 1536, 71, 552, 71, 0, 0, - 0, 0, 802, 0, -1776, 0, 541, 1534, 962, 802, - 0, 0, 553, 0, 0, 0, 1414, 1414, 553, 552, - 2880, 0, 1414, 0, 0, 543, 1468, 0, 0, 0, - 553, 544, 0, 813, 545, 0, 1549, 0, 71, 0, - 0, 0, 0, 0, 553, 553, 1212, 0, 0, 0, - 0, -1776, 1542, 0, 71, 0, 1883, 0, 71, 0, - 0, 0, 0, 1534, 1884, -1776, 0, 0, 0, 0, - -1776, 0, 0, 0, 0, -1776, 813, 0, 0, 0, - 0, 0, 0, 0, -1776, 552, 1885, 0, 0, -1776, - 0, 0, 0, 0, 0, 1213, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1214, 0, 553, 0, 0, - 0, 0, 1412, 1886, 0, 1610, 0, 1215, 1611, 0, - 0, -1776, 1612, 1613, 0, 813, 0, 0, 1536, 0, - 0, 0, 0, 1713, 1669, 0, 1671, 0, 0, 0, - 0, -1776, 1413, 0, 0, 0, 0, 1542, 0, 1216, - 0, 552, 552, 1621, 0, 0, 0, 0, 850, 0, - -2044, 0, 0, 0, 0, 0, 1534, 0, 0, 0, + 0, 1538, 0, 0, 1624, 0, 0, 2721, 2722, 2723, + 0, 553, 0, 1347, 0, 0, 0, 553, 1670, 0, + 1672, 0, 0, 0, 1389, 1714, 0, 1540, 0, 553, + 0, 0, 0, 0, 1414, 552, 552, 0, 0, 0, + 0, 0, 850, 553, 553, 0, 0, 0, 1911, 1912, + 1913, 0, 1914, 1915, 1916, 1917, 1918, 1919, 0, 0, + 0, 0, 0, 0, 1412, 1900, 1901, 0, 0, 0, + 0, 1921, 0, 1470, 0, 850, 1746, 0, 0, 0, + 0, 71, 0, 0, 0, 0, 0, 0, 850, 0, + 0, 2034, 0, 0, 1538, 0, 0, 0, 2035, 2036, + 1625, 0, 2037, 2038, 2039, 850, 553, 71, 0, 850, + 0, 0, 0, 0, 1794, 0, 0, 1626, 0, 0, + 1540, 0, 1627, 0, 0, 0, 0, 1541, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1605, + 0, 0, 0, 0, 0, 0, 2831, 0, 0, 1608, + 0, 0, 0, 0, 0, 0, 1415, 0, 0, 0, + 1630, 0, 0, 0, 0, 0, 0, 0, 0, 1658, + 1810, 0, 850, 0, 0, 0, 0, 0, 1663, 0, + 0, 850, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1045, 1848, 0, 1902, 0, 0, 0, 1903, 1904, + 0, 951, 1905, 1906, 1907, 0, 951, 0, 552, 552, + 0, 552, 951, 0, 0, 1633, 0, 0, 0, 3064, + 0, 0, 0, 0, 0, 0, 0, 0, 1538, 0, + 0, 0, 0, 0, 0, 2218, 0, 2975, 0, 1469, + 0, 0, 0, 0, 0, 2227, 0, 2230, 0, 0, + 2241, 1535, 0, 0, 1540, 0, 2245, 0, 2247, 1414, + 1414, 0, 0, 0, 0, 1414, 0, 0, 0, 0, + 0, 2254, 0, 0, 0, 0, 2257, 0, 0, 0, + 2262, 2263, 2264, 2265, 0, 2269, 2270, 0, 0, 1412, + 1412, 0, 0, 0, 1537, 1412, 0, 516, 0, 3011, + 3012, 3013, 3014, 0, 1541, 0, 0, 0, 0, 0, + 1001, 0, 552, 1945, 0, 1635, 0, 0, 0, 0, + 850, 0, 802, 0, 802, 0, 0, 802, 0, 0, + 0, 0, 802, 1542, 0, 802, 0, 802, 0, 0, + 0, 802, 0, 552, 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1411, 71, 1537, 0, 0, 0, 0, 1623, 0, 0, - -1776, 850, 1745, -1776, 0, 0, 0, 0, 0, -1776, - 0, 1218, 0, 0, 850, 0, 0, 71, 0, 0, - -1791, 0, 0, 0, 0, 0, 0, 0, 0, 2217, - 0, 850, 0, 0, 1542, 850, 1219, 0, 0, 2226, - 1793, 2229, 0, 0, 2240, 0, 0, 0, 0, -1776, - 2244, 0, 2246, 0, 0, 1221, 0, 0, 0, 0, - 0, 0, 2788, 0, 0, 2253, 0, 0, 0, 2137, - 2256, 1534, -1776, 0, 2261, 2262, 2263, 2264, 0, 2268, - 2269, 0, 1536, 0, 0, 1537, 0, 0, 0, 0, - 0, 0, 0, -2044, 1536, 0, 1809, 0, 850, 0, - 0, 0, 0, 0, 0, 0, 0, 850, 0, 0, - -2044, 0, 0, 0, 1414, -2044, 0, 0, 1847, 0, - -1791, 0, 0, 0, 1536, 0, 0, 951, 0, 0, - 852, 1536, 951, 0, 552, 552, 0, 552, 951, 0, - 0, 1542, 0, 0, 854, 0, 0, 0, 1534, 0, - 0, 0, 0, -2044, 0, 0, 0, 0, -1776, 0, - 0, 0, 0, 0, 0, 1468, 0, -1791, -1776, 1536, - 0, 0, 0, 1536, 0, 1542, 0, 1413, 1413, 1536, - 0, -1791, 0, 1413, 0, 0, -1791, -1776, 0, -1776, - -1776, -1791, 0, 0, 0, 0, 0, 0, 0, 0, - -1791, 1536, 0, 0, 0, -1791, 0, 0, 1632, 892, - 0, 895, 0, 899, 0, 1411, 1411, 1008, 0, 1537, - 0, 1411, 1009, 516, 0, 0, -1776, 0, 0, -1776, - -1776, -1776, 0, 0, 0, 0, 1001, -1791, 552, 1944, - 0, 0, 0, 0, 1539, 0, 850, 0, 802, 0, - 802, 0, 0, 802, 1542, 1534, 0, -1791, 802, 0, - 0, 802, 0, 802, 0, 0, 0, 802, 0, 552, - 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1010, 0, 0, 0, 0, 0, 0, 0, 1534, - 0, 0, 0, 0, 0, 0, 0, 1542, 0, 0, - 0, 0, 0, 0, 0, 0, -1791, 0, -2044, -1791, - 0, 0, 0, 0, 0, -1791, 0, 0, 0, 1414, - 1414, 1414, 1414, 1414, 1414, 0, 0, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 0, 0, 0, - 0, 0, 0, 1899, 1900, 0, 0, 0, 1540, 1920, - 0, 0, 1011, 0, 0, -1791, 0, 0, 0, 0, - 553, 0, 0, 1537, 0, 0, 0, 0, 1534, 0, - 0, 0, 0, 0, 0, 1537, 0, 0, -1791, 2048, - 0, 0, 0, 0, 0, 0, 0, 0, 1012, 0, - 2058, 0, 0, 0, 0, 1541, 0, 0, 0, 1542, - 0, 0, 0, 0, 1013, 1537, 0, 0, 0, 0, - 0, 1534, 1537, 0, 1014, -2044, 0, 0, 0, 0, - 1539, 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, 951, - 0, 0, 0, 0, 0, 0, 852, 0, 0, 0, - 1859, 0, 0, 0, 0, 0, 0, 0, 1015, 0, - 1537, 0, 0, 0, 1537, 0, 0, 0, 0, 0, - 1537, 0, 0, 0, -1791, 2180, 0, 0, 0, 1964, - 0, 0, 0, 0, -1791, 0, 2145, 0, 850, 0, - 850, 0, 1537, 0, 0, 0, 0, 0, 0, 0, - 850, 2161, 0, -1791, 1016, -1791, -1791, 0, 0, 0, - 0, 1017, 536, 1411, 0, 0, 1414, 1414, 1539, 0, - 0, 1536, 0, 1534, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1540, 0, 0, -1308, 850, 0, - 552, 0, -1791, 0, 0, -1791, -1791, -1791, 0, 0, - 0, 1018, 0, 0, 0, 1745, 552, 0, 0, 0, - 0, 553, 553, 0, 0, 0, 552, 2227, 552, 2231, - 1019, 552, 0, 0, 0, 537, 0, 552, 0, 552, - 0, 1541, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 951, 552, 0, 0, 0, 951, 552, 0, 0, - 0, 552, 552, 552, 552, 1045, 552, 552, 1901, 0, - 0, 0, 1902, 1903, 0, 0, 1904, 1905, 1906, 0, - 0, 0, 1540, 2289, 0, 0, 0, 2670, 0, 538, - 1414, 1299, 0, 850, 850, 850, 850, 850, 0, 1020, - 0, 0, 0, 0, 1965, 0, 0, 920, 539, 0, - 0, 0, 927, 1536, 2318, 928, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2339, 0, 1541, - 0, 1542, 0, 0, 0, 0, 0, 0, 553, 0, - 1413, 1413, 1413, 1413, 1413, 1413, 0, 0, 1413, 1413, - 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 0, 0, - 0, 0, 0, 0, 0, 540, 0, 0, 0, 1536, - 0, 1196, -207, 0, 0, 0, 0, 1197, 1411, 1411, - 1411, 1411, 1411, 1411, 0, 1209, 1411, 1411, 1411, 1411, - 1411, 1411, 1411, 1411, 1411, 1411, 0, 0, 0, 1539, - 0, 0, 0, 0, 0, 1210, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 541, 552, 542, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 850, 0, - 0, 0, 0, 0, 543, 0, 0, 0, 802, 0, - 544, 0, 0, 545, 802, 1534, 0, 0, 0, 0, - 552, 1211, 0, 0, 0, 552, 0, 0, 0, 0, - 0, 0, 1537, 0, 2450, 2450, 0, 0, 0, 0, - 0, 0, 1536, 0, 0, 0, 0, 0, 1908, 1431, - 0, 0, 1198, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1539, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1464, 1540, 0, 0, 2374, 2375, 2376, 2377, - 2378, 2379, 0, 0, 2383, 2384, 2385, 2386, 2387, 2388, - 2389, 2390, 2391, 2392, 0, 0, 0, 1413, 1413, 2836, - 2837, 0, 0, 552, 0, 0, 0, 2486, 0, 0, - 0, 0, 552, 0, 0, 0, 1212, 0, 1909, 0, - 1541, 0, 0, 0, 0, 0, 0, 2889, 0, 0, - 0, 0, 0, 986, 0, 1411, 1411, 1536, 1593, 0, - 0, 0, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949, - 2950, 2951, 2048, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1537, 1213, 1540, 1414, 1414, 0, - 0, 0, 0, 0, 0, 1214, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 802, 0, 1215, 0, 0, - 0, 0, 0, 0, 0, 0, 1539, 552, 0, 0, - 0, 0, 802, 0, 553, 553, 2161, 0, 1199, 0, - 0, 1413, 0, 1541, 1536, 0, 0, 0, 0, 1216, - 1537, 0, 0, 1045, 0, 0, 1901, 1190, 0, 0, - 1902, 1903, 0, 0, 1904, 1905, 1906, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 552, 0, 0, 1411, - 0, 0, 552, 0, 0, 0, 0, 0, 0, 1287, - 0, 0, 0, 2495, 2496, 1217, 0, 0, 1809, 1201, - 0, 1218, 0, 0, 0, 1303, 1305, 1308, 1310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11, 0, 0, 0, 0, 1219, 0, 0, 0, - 1540, 1220, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1221, 0, 0, 0, 14, - 15, 1536, 0, 1537, 0, 0, 0, 1406, 1910, 1911, - 1912, 0, 1913, 1914, 1915, 1916, 1917, 1918, 0, 1809, - 1539, 0, 0, 0, 0, 0, 850, 1541, 0, 0, - 0, 0, 1539, 0, 0, 1536, 0, 1299, 1414, 0, - 1809, 850, 850, 850, 23, 0, 0, 0, 0, 0, - 0, 0, 1203, 0, 552, 0, 850, 553, 553, 850, - 553, 0, 1539, 1414, 850, 0, 0, 0, 3117, 1539, - 951, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1809, 1809, - 0, 1809, 0, 1907, 0, 0, 0, 0, 1537, 0, - 0, 0, 0, 0, 0, 0, 0, 1539, 0, 0, - 0, 1539, 0, 0, 1536, 0, 1908, 1539, 0, 0, - 516, 0, 0, 0, 1540, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1540, 0, 0, 1539, - 2711, 0, 0, 0, 0, 0, 0, 0, 850, 850, - 850, 0, 0, 0, 0, 0, 0, 1536, 552, 0, - 1411, 553, 552, 0, 0, 0, 1540, 0, 552, 0, - 0, 1541, 0, 1540, 0, 1537, 0, 0, 0, 0, - 0, 0, 0, 1541, 0, 0, 1909, 27, 28, 29, - 0, 0, 1976, 0, 1980, 0, 0, 1414, 1413, 1413, - 0, 2048, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1540, 0, 1541, 0, 1540, 0, 1737, 0, 0, - 1541, 1540, 0, 0, 0, 0, 0, 0, 0, 0, - 1764, 0, 0, 0, 0, 0, 1411, 1411, 0, 0, - 0, 0, 0, 1540, 0, 0, 0, 0, 0, 0, - 0, 1789, 34, 0, 0, 0, 0, 0, 1541, 1536, - 0, 0, 1541, 36, 0, 2810, 0, 0, 1541, 0, - 0, 2161, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1537, 0, 0, 38, 0, 850, 0, 39, - 1541, 552, 0, 0, 0, 552, 552, 552, 0, 0, - 0, 1809, 1745, 1809, 0, 1847, 0, 0, 0, 40, - 0, 0, 0, 0, 1814, 0, 1537, 0, 0, 0, - 0, 0, 41, 1833, 552, 0, 2890, 0, 0, 0, - 0, 0, 0, 44, 0, 3262, 0, 1414, 0, 552, - 552, 552, 552, 552, 552, 552, 552, 552, 552, 45, - 0, 0, 0, 0, 0, 0, 3269, 3270, 0, 0, - 0, 0, 0, 1045, 2786, 2787, 1901, 0, 0, 0, - 1902, 1903, 2318, 46, 1904, 1905, 1906, 0, 850, 0, - 0, 0, 3284, 0, 0, 0, 0, 47, 0, 1413, - 1745, 3060, 0, 0, 0, 1537, 1910, 1911, 1912, 0, - 1913, 1914, 1915, 1916, 1917, 1918, 1847, 0, 0, 0, - 0, 1107, 1107, 0, 3029, 0, 1809, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1411, 0, 0, - 0, 0, 0, 552, 0, 0, 0, 0, 1537, 0, - 850, 850, 850, 850, 0, 0, 0, 0, 0, 1539, - 0, 0, 1411, 553, 0, 1411, 0, 0, 3053, 552, - 951, 0, 1956, 0, 1610, 0, 0, 1611, 3044, 553, - 0, 1612, 1613, 0, 0, 1616, 1617, 1618, 1236, 553, - 0, 553, 1278, 1285, 553, 0, 0, 0, 0, 0, - 553, 0, 553, 0, 0, 3051, 0, 0, 0, 0, - 0, 0, 1621, 0, 0, 553, 0, 0, 0, 1622, - 553, 0, 0, 0, 553, 553, 553, 553, 0, 553, - 553, 1536, 0, 0, 0, 3074, 0, 802, 0, 0, - 0, 0, 0, 0, 0, 1335, 1623, 0, 0, 0, - 1537, 3086, 0, 0, 0, 2161, 0, 1414, 1413, 0, - 0, 2048, 0, 1540, 1360, 2999, 0, 0, 0, 0, - 1405, 0, 0, 1407, 0, 1745, 1418, 1421, 1426, 1429, - 0, 1809, 0, 0, 0, 0, 1908, 0, 0, 0, - 0, 1539, 0, 0, 951, 552, 1411, 0, 0, 0, - 0, 0, 850, 0, 0, 0, 0, 0, 0, 0, - 1541, 0, 0, 1045, 0, 0, 1901, 1471, 1278, 3137, - 1902, 1903, 0, 3452, 1904, 1905, 1906, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1555, 0, - 0, 0, 1624, 0, 0, 0, 0, 1539, 0, 0, - 0, 0, 0, 0, 0, 0, 1909, 1571, 0, 1625, - 0, 0, 0, 0, 1626, 0, 0, 0, 1581, 1582, - 1583, 0, 1587, 1591, 0, 0, 0, 0, 0, 553, - 0, 0, 0, 0, 0, 0, 0, 1627, 1628, 0, - 0, 0, 0, 0, 0, 1540, 0, 3154, 1413, 0, - 0, 1809, 1629, 0, 2146, 1653, 2148, 0, 0, 0, - 0, 0, 0, 2437, 0, 2318, 2158, 0, 1980, 0, - 0, 0, 1471, 1471, 3118, 0, 0, 0, 0, 3188, - 0, 0, 0, 0, 0, 0, 1411, 0, 0, 0, - 1630, 0, 1541, 1631, 0, 0, 0, 0, 0, 0, - 1539, 1540, 0, 0, 2195, 0, 1691, 1632, 0, 0, - 1707, 1712, 3205, 0, 0, 0, 0, 0, 552, 0, - 0, 1107, 1107, 0, 0, 552, 1610, 0, 0, 1611, - 0, 0, 0, 1612, 1613, 1614, 1615, 1616, 1617, 1618, - 0, 0, 0, 0, 0, 0, 553, 0, 1541, 0, - 0, 0, 0, 2206, 1619, 1593, 0, 0, 0, 3233, - 0, 0, 1537, 0, 1621, 0, 0, 0, 0, 0, - 0, 1622, 1045, 0, 0, 1901, 1908, 0, 1278, 1902, - 1903, 552, 0, 1904, 1905, 1906, 552, 1278, 0, 0, - 0, 0, 0, 0, 0, 1539, 0, 0, 1623, 2301, - 2302, 2304, 2305, 2306, 1540, 0, 0, 1634, 0, 0, - 0, 1278, 552, 0, 3192, 0, 1910, 1911, 1912, 0, - 1913, 1914, 1915, 1916, 1917, 1918, 0, 0, 0, 0, - 0, 0, 0, 552, 552, 0, 0, 0, 0, 0, - 553, 0, 0, 0, 0, 0, 1909, 0, 0, 0, - 0, 1541, 850, 1045, 1745, 0, 1901, 0, 3323, 552, - 1902, 1903, 0, 0, 1904, 1905, 1906, 0, 0, 0, - 0, 0, 1539, 850, 0, 0, 3306, 0, 0, 0, - 0, 3061, 0, 0, 0, 0, 0, 0, 0, 553, - 0, 0, 0, 0, 1624, 2568, 1411, 0, 1891, 1540, - 552, 1001, 0, 1001, 0, 0, 0, 0, 0, 0, - 0, 1625, 0, 0, 1635, 0, 1626, 1636, 1637, 1638, - 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, 3086, 0, - 0, 0, 0, 0, 2421, 850, 0, 0, 0, 1627, - 1628, 0, 0, 0, 0, 0, 1541, 0, 0, 0, - 0, 0, 0, 0, 1629, 0, 0, 0, 1426, 0, - 1426, 1426, 0, 0, 0, 0, 850, 0, 0, 0, - 0, 0, 0, 1107, 1107, 0, 1540, 0, 0, 1539, - 0, 0, 0, 0, 0, -2044, 0, 0, 0, 0, - 1107, 0, 1630, 0, 0, 1631, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3205, 0, 0, 0, 1632, - 0, 0, 1633, 1539, 0, 0, 0, 553, 0, 0, - 0, 0, 0, 1541, 0, 0, 0, 3306, 0, 0, + 0, 0, 1538, 0, 2554, 0, 0, 0, 0, 0, + 0, 1415, 1415, 0, 1538, 0, 0, 1415, 0, 0, + 0, 0, 1541, 0, 0, 0, 0, 0, 1540, 1872, + 0, 0, 0, 1470, 1909, 0, 0, 0, 0, 0, + 1540, 0, 0, 0, 1538, 0, 0, 0, 0, 0, + 0, 1538, 1636, 0, 0, -2046, -2046, -2046, 1537, 1640, + 1641, 1642, 1643, 1644, 1645, 0, 0, 0, 0, 0, + 1540, 0, 0, 0, 0, 0, 0, 1540, 0, 0, + 0, 3127, 0, 2049, 0, 0, 0, 0, 0, 1538, + 0, 0, 0, 1538, 2059, 1045, 0, 0, 1902, 1538, + 0, 0, 1903, 1904, 1910, 0, 1905, 1906, 1907, 0, + 0, 0, 0, 0, 1537, 1540, 0, 0, 0, 1540, + 0, 1538, 0, 0, 0, 1540, 0, 0, 0, 0, + 0, 0, 0, 951, 0, 0, 0, 0, 0, 0, + 1542, 0, 0, 0, 0, 0, 0, 1540, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1745, 1909, 1910, 1911, 1912, 0, - 1913, 1914, 1915, 1916, 1917, 1918, 1908, 951, 951, 0, - 3306, 951, 0, 0, 0, 0, 0, 0, 0, 1944, - 0, 0, 0, 1540, 0, 0, 0, 0, 0, 0, - 552, 0, 1539, 0, 0, 2023, 0, 0, 0, 0, - 0, 0, 0, 2026, 0, 0, 0, 0, 0, 1634, - 0, 0, 1745, 0, 0, 0, 0, 1540, 0, 3306, - 0, 553, 0, 0, 0, 553, 0, 0, 0, 0, - 1541, 1976, 0, 0, 0, 1539, 1909, 0, 0, 0, - 0, 0, 2072, 0, 0, 0, 0, 0, 2076, 2077, - 2078, 2079, 2080, 2081, 2082, 2083, 951, 0, 0, 0, - 2092, 2093, 0, 0, 1541, 2104, 0, 0, 0, 2107, - 0, 2161, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, - 2123, 0, 0, 2124, 0, 0, 0, 0, 0, 0, - 1107, 1610, 1278, 0, 1611, 0, 1540, 0, 1612, 1613, + 0, 0, 0, 0, 0, 0, 0, 2181, 0, 553, + 2146, 0, 850, 0, 850, 0, 0, 0, 2377, 2378, + 2379, 2380, 2381, 2382, 850, 2162, 2386, 2387, 2388, 2389, + 2390, 2391, 2392, 2393, 2394, 2395, 0, 1412, 0, 0, + 0, 0, 0, 0, 2040, 2041, 2042, 1537, 2043, 2044, + 2045, 2046, 2047, 2048, 0, 0, 0, 0, 1542, 0, + 0, 0, 850, 0, 552, 0, 0, 0, 0, 0, + 0, 0, 0, 1541, 0, 0, 0, 0, 0, 1746, + 552, 0, 0, 0, 2138, 0, 0, 0, 0, 0, + 552, 2228, 552, 2232, 0, 552, 0, 0, 0, 0, + 0, 552, 0, 552, 0, 0, 1860, 0, 0, 0, + 0, 1045, 0, 0, 1902, 951, 552, 0, 1903, 1904, + 951, 552, 1905, 1906, 1907, 552, 552, 552, 552, 1415, + 552, 552, 0, 0, 0, 0, 0, 0, 1909, 0, + 0, 0, 1537, 0, 1911, 1912, 1913, 2290, 1914, 1915, + 1916, 1917, 1918, 1919, 0, 1300, 0, 850, 850, 850, + 850, 850, 0, 0, 0, 0, 1541, 0, 2145, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2150, 0, 0, 0, 0, 1635, 0, 0, 1636, - 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, 1621, - 0, 0, 0, 0, 0, 0, -2044, 1539, 0, 1540, - 0, 0, 2472, 1541, 1582, 1583, 0, 0, 0, 0, - 0, 0, 0, 0, 553, 0, 0, 0, 553, 553, - 553, 0, 0, 1623, 0, 1910, 1911, 1912, 0, 1913, - 1914, 1915, 1916, 1917, 1918, 0, 0, 0, 0, 0, - 0, 0, 2644, 0, 0, 0, 1541, 553, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2659, 2660, 2662, - 0, 0, 553, 553, 553, 553, 553, 553, 553, 553, - 553, 553, 2673, 0, 0, 2676, 0, 0, 0, 0, - 2681, 0, 0, 0, 0, 0, 0, 0, 2789, 0, - 0, 0, 2272, 0, 0, 0, 1278, 0, 0, 2282, - 2283, 1540, 0, 0, 0, 0, 1910, 1911, 1912, 0, - 1913, 1914, 1915, 1916, 1917, 1918, 0, 0, 0, -2044, + 0, 2340, 0, 0, 0, 0, 0, 0, 0, 0, + 553, 553, 0, 0, 0, 2498, 2499, 0, 1910, 0, + 0, 3282, 1414, 1414, 1414, 1414, 1414, 1414, 0, 1537, + 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, + 0, 0, 3307, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1412, 1412, 1412, 1412, 1412, 1412, 0, 0, + 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, + 0, 1538, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1542, + 552, 0, 0, 2673, 0, 0, 0, 1540, 0, 0, + 0, 0, 850, 0, 3346, 0, 2271, 0, 0, 0, + 1541, 0, 802, 0, 0, 0, 0, 0, 802, 2286, + 2286, 0, 0, 0, 552, 0, 0, 553, 0, 552, + 0, 0, 0, 0, -2046, 3372, 1537, 0, 2453, 2453, + 0, 717, 0, 0, 1415, 1415, 1415, 1415, 1415, 1415, + 0, 0, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, + 1415, 1415, 0, 0, 0, 0, 0, 0, 0, 0, + 1537, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1542, 0, 0, 0, 1347, 0, 0, 0, + 0, 0, 2362, 0, 0, 0, 0, 0, 718, 0, + 0, 0, 0, 0, 1910, 1538, 0, 552, 0, 1414, + 1414, 2489, 0, 0, 719, 0, 552, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1911, 1912, + 1913, 1540, 1914, 1915, 1916, 1917, 1918, 1919, 0, 1412, + 1412, 0, 0, 0, 0, 0, 0, 0, 0, 1537, + 0, 0, 0, 0, 1541, 0, 2049, 0, 0, 0, + 0, 1538, 0, 720, 0, 0, 1541, 0, 1432, 0, + 0, 0, 0, 721, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 722, 0, 1540, 0, 802, + 723, 1465, 1537, 0, 0, 0, 1541, 0, 0, 0, + 0, 552, 0, 1541, 0, 0, 802, 0, 0, 0, + 2162, 0, 0, 0, 0, 0, 1542, 0, 0, 724, + 0, 0, 0, 1414, 0, 0, 0, 0, 0, 0, + 0, 1415, 1415, 0, 0, 0, 0, 2839, 2840, 0, + 0, 1541, 0, 0, 0, 1541, 0, 1008, 0, 0, + 552, 1541, 1009, 1412, 0, 0, 552, 1594, 0, 0, + 0, 0, 725, 0, 1538, 2892, 726, 0, 0, 0, + 0, 0, 1810, 1541, 0, 0, 0, 0, 0, 0, + 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, + 1540, 0, 0, 0, 1537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2044, 0, 0, 0, - 1278, -2044, 0, 0, 0, 0, 0, 0, 1541, 0, - 0, 0, 0, 0, 0, 0, 1976, 0, 0, 1335, - 2347, 0, 0, 0, 2718, 2719, 2720, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -2044, - 0, 0, 2437, 0, 0, 0, 0, 0, 0, 2369, - 2370, 0, 2371, 0, 0, 0, 0, 0, 0, 0, + 0, 1010, 0, 0, 1911, 1912, 1913, 0, 1914, 1915, + 1916, 1917, 1918, 1919, 553, 553, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 0, 727, 0, 2789, 2790, + 0, 0, 0, 1810, 0, 1415, 0, 0, 0, 0, + 850, 728, 14, 15, 0, 0, 0, 0, 0, 1538, + 1542, 1300, 0, 0, 1810, 850, 850, 850, 0, 0, + 0, 0, 1542, 0, 0, 0, 0, 0, 552, 0, + 850, 0, 1011, 850, 729, 1540, 0, 730, 850, 0, + 1184, 0, 0, 0, 951, 0, 0, 23, 731, 0, + 0, 732, 1542, 0, 0, 0, 0, 0, 0, 1542, + 0, 0, 0, 0, 1810, 1810, 0, 1810, 1012, 733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1610, 0, 0, 1611, 0, -45, 0, 1612, 1613, 0, - 0, 2397, 2398, 0, 0, 2150, 0, 0, 0, 0, - 0, 0, 0, 0, 1632, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 1621, 3, - 4, 0, 0, 0, 2425, -2044, 0, 0, 0, 1539, - 2431, 0, 5, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 0, 1471, 0, - 1278, 0, 1623, 0, 0, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 0, 10, 0, 2828, 0, 0, 0, 0, 553, 0, - 0, 0, 0, 11, 0, 12, 2465, 0, 0, 0, - 0, 0, 1196, 0, 0, 0, 13, 0, 1197, 0, - 0, 0, 0, 0, -2044, 1008, 1209, 0, 0, 0, - 1009, 14, 15, 16, 0, 0, 0, 3064, 0, 0, - 0, 0, 17, 0, 0, 2484, 1210, 0, 18, 0, - 2487, 2488, 0, 1540, 0, 0, 19, 0, 20, 21, - 0, 0, 0, 0, 0, 0, 0, 0, -2044, 0, - 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, - 0, 0, 0, 0, 2972, -2044, 0, 0, 0, 1010, - -2044, 0, 1211, 0, 2509, 0, 0, 2512, 0, 2514, - 1541, 0, 24, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2518, 0, 0, 25, 0, - 0, 0, 0, 1198, 0, 0, 0, 0, -2044, 0, - 0, -2044, 0, 0, 0, 0, 0, 0, 1639, 1640, - 1641, 1642, 1643, 1644, 26, 0, 3008, 3009, 3010, 3011, - 0, 0, 0, 0, 0, 1691, 0, 0, 0, 0, - 1011, 0, 0, 0, 0, 0, 0, 0, 1183, 0, - 0, 3213, 1712, 2122, 0, 0, 0, 0, 2437, 0, - 0, 0, 0, 1632, 0, 0, 0, 1212, 0, 0, - 0, 1107, 0, 0, 0, 1610, 1012, 0, 1611, 0, - 2572, 0, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, - 0, 0, 1013, 0, 0, 0, 0, 0, 0, 27, - 28, 29, 1014, 1619, 0, 0, 0, 30, 1415, 0, - 31, 0, 0, 1621, 553, 0, 1213, 0, 0, 553, - 1622, 0, 0, 0, 0, 0, 1214, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1015, 1583, 1215, 32, - 0, 0, 0, 1278, 0, 553, 0, 1623, 33, 0, - 0, 0, 0, 0, 0, 0, 0, 1184, 0, 1199, - 0, 0, 0, -2044, 34, 0, 553, 553, 0, 0, - 1216, 35, 0, 0, 0, 36, 0, 0, 3124, 0, - 0, 0, 1016, 0, 0, 37, 0, 0, 0, 1017, - 0, 0, 553, 1008, 0, 0, 0, 38, 1009, 0, - 0, 39, 2679, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2247, 0, 0, 0, - 1201, 40, 1218, 0, 0, 0, 0, 1647, 0, 1018, - 0, 0, 0, 553, 41, 0, 0, 42, 0, 0, - 43, 0, 0, 1624, 0, 44, 0, 1219, 1019, 0, - 0, 0, 2248, 0, 0, 0, 0, 1010, 0, 0, - 1625, 45, 0, 0, 0, 1626, 1221, 0, 0, 0, - -2044, 1647, 0, 0, 0, 0, 0, 1639, 1640, 1641, - 1642, 1643, 1644, 0, 0, 46, 0, 0, 1627, 1628, - 0, 0, 0, 1609, 0, 0, 0, 0, 1610, 47, - 0, 1611, -45, 1629, 1415, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 0, 0, 0, 0, 0, 1020, 0, 0, - 0, 0, 1185, 1203, 0, 0, 1619, 0, 1011, 0, - 1620, 0, 2757, 0, 0, 0, 1621, 0, 2759, 2026, - 0, 1630, 0, 1622, 1631, 0, 0, 0, 0, 2765, - 0, 0, 0, 0, 0, 0, 1647, 0, 1632, 0, - 2774, 1633, 0, 2777, 1012, 2779, 0, 0, 0, 0, - 1623, 0, 0, 2783, 0, 0, 0, 0, 0, 0, - 1013, 2790, 2791, 0, 0, 0, 0, 0, 2798, 0, - 1014, 0, 0, 0, 0, 0, 0, 0, 1647, 0, - 0, 0, 0, 2807, 0, 1647, 0, 0, 0, 0, - 0, 0, 0, 2822, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 553, 1015, 0, 0, 0, 0, 0, - 0, 0, 0, 1107, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1186, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1647, 0, 0, 1634, 0, - 0, 0, 0, 0, 0, 0, 1624, 0, 0, 0, - 1016, 0, 0, 0, 0, 0, 0, 1017, 3279, 0, - 1647, 0, 0, 1625, 0, 0, 0, 0, 1626, 0, - 2272, 0, 2272, 0, 0, 0, 0, 0, 0, 3304, + 0, 0, 0, 734, 1013, 0, 1538, 0, 0, 735, + 736, 0, 0, 0, 1014, 0, 516, 1542, 0, 0, + 737, 1542, 0, 2610, 0, 0, 738, 1542, 0, 0, + 0, 0, 1540, 0, 0, 0, 2714, 0, 0, 0, + 0, 0, 0, 0, 850, 850, 850, 0, 1015, 1542, + 0, 0, 0, 739, 552, 0, 1412, 0, 552, 0, + 0, 0, 0, 0, 552, 0, 0, 553, 553, 1185, + 553, 0, 0, 0, 0, 2642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1627, 1628, 0, 0, 0, 0, 1018, 0, 0, - 0, 0, 0, 0, 0, 1647, 1629, 1647, 0, 1415, - 1415, 0, 1919, 0, 0, 1415, 1019, 0, 1647, 0, - 0, 1647, 0, 0, 0, 0, 1647, 0, 0, 1647, + 0, 0, 0, 2656, 1016, 0, 3120, 2049, 0, 3002, + 0, 1017, 1414, 1414, 0, 0, 0, 0, 0, 0, + 27, 28, 29, 1538, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1537, 0, 0, 0, + 0, 0, 1412, 1412, 0, 1347, 0, 0, 0, 1540, + 0, 1018, 0, 0, 2691, 0, 2692, 1538, 0, 0, + 2697, 0, 2700, 1541, 0, 0, 0, 0, 0, 0, + 1019, 2813, 0, 0, 0, 0, 0, 2162, 0, 0, + 0, 553, 0, 1540, 0, 34, 0, 0, 0, 0, + 0, 0, 0, 850, 0, 0, 36, 552, 0, 0, + 0, 552, 552, 552, 0, 0, 0, 1810, 1746, 1810, + 0, 1848, 1977, 0, 1981, 0, 0, 0, 38, 0, + 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, + 552, -1778, 2893, 0, 1415, 1415, 1538, 0, 0, 1020, + 0, 0, 0, 0, 1186, 552, 552, 552, 552, 552, + 552, 552, 552, 552, 552, 41, 0, 0, 0, 0, + 0, 0, 1540, 0, 0, 0, 44, 0, 3121, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2319, 1538, + 0, 0, 45, 0, 850, 1611, 0, 0, 1612, 0, + 0, 0, 1613, 1614, 0, 0, 1746, 1541, 0, 0, + 0, 0, 0, 1414, 0, 1540, 46, 0, 0, 0, + 0, 0, 1848, 0, 0, 0, 0, 0, 0, 0, + 47, 0, 1810, 1622, 0, 0, 0, 0, 3032, 0, + -2046, -1778, 0, 1412, 0, 0, 0, 0, 0, 552, + 0, 0, 0, 0, 0, 0, 850, 850, 850, 850, + 0, 0, 0, 1541, 0, 0, 0, 1624, 1412, 0, + 0, 1412, 0, 0, 0, 552, 951, 0, 0, 1542, + 0, 0, 3056, 3265, 3047, 0, 0, 0, -1778, 0, + 0, 1538, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1778, 0, 3272, 3273, 0, -1778, 0, 0, + 0, 3054, -1778, 0, 0, 2934, 0, 1540, 3195, 0, + 0, -1778, 0, 0, 0, 0, -1778, 0, 0, 0, + 3287, 0, 2788, 0, 0, 1415, 0, 0, 0, 0, + 0, 3077, 0, 802, 0, 0, 0, 0, 2642, 0, + 0, 0, 0, 0, 0, 0, 0, 3089, -1778, 0, + 1415, 2162, 0, -2046, 0, 0, 1541, 2049, 0, 0, + 0, 0, 1414, 0, 0, 0, 1197, 0, -1778, 0, + -2046, 1746, 1198, 553, 0, -2046, 0, 1810, 0, 0, + 1210, 0, 0, 0, 0, 0, 0, 0, 0, 553, + 951, 552, 1412, 0, 0, 0, 0, 0, 850, 553, + 1211, 553, 0, 1542, 553, 0, 0, 0, 0, 0, + 553, 0, 553, -2046, 0, 3140, 0, -1778, 0, 0, + -1778, 0, 0, 0, 0, 553, -1778, 0, 0, 0, + 553, 0, 0, 0, 553, 553, 553, 553, 0, 553, + 553, 0, 0, 0, 0, 0, 1212, 0, 0, 0, + 0, 1541, 0, 0, 0, 0, 0, 0, 0, 1542, + 0, 0, 0, 0, 0, 0, -1778, 0, 1633, 0, + 0, 0, 0, 0, 0, 0, 0, 1199, 0, 0, + 0, 0, 0, 0, 1415, 0, 0, 0, 0, -1778, + 0, 0, 0, 3157, 0, 0, 0, 1810, 0, 0, + 0, 3082, 1414, 0, 0, 0, 0, 1107, 1107, 0, + 0, 2319, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3191, 0, 0, 1541, 0, + 0, 0, 1412, 0, 0, 0, 0, 0, 0, 0, + 0, 1213, 0, 1538, 0, 0, 0, 852, 11, 0, + 0, 3455, 0, 0, 0, 0, 0, 0, 3208, 0, + 0, 0, 1542, 0, 552, 0, 0, 0, -2046, 1540, + 0, 552, 0, 0, 1237, -1778, 14, 15, 1279, 1286, + 0, 0, 0, 0, 0, -1778, 0, 0, 0, 553, + 1214, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1215, 0, 0, 0, -1778, 3236, -1778, -1778, 0, 0, + 0, 0, 1216, 0, 0, 0, -1793, 0, 0, 0, + 0, 23, 0, 2440, 1415, 0, 0, 552, 1981, 0, + 0, 1336, 552, 1200, 0, 1541, 0, 0, 0, 0, + 0, 0, 0, -1778, 1217, 0, -1778, -1778, -1778, 0, + 1361, 0, 0, 0, 0, 0, 1406, 1542, 552, 1408, + 0, 0, 1419, 1422, 1427, 1430, 0, 0, 0, 1541, + 3172, 0, 0, 0, 0, -2046, 0, 0, 0, 552, + 552, 0, 1640, 1641, 1642, 1643, 1644, 1645, 0, 0, + 1218, 0, 0, 1347, 1202, 0, 1219, 0, 850, 0, + 1746, 0, 0, 1472, 1279, 552, 553, 0, 0, 0, + 0, 0, 3326, 0, 0, 1594, -1793, 0, 0, 850, + 0, 1220, 3309, 0, 1556, 0, 1221, 0, 0, 0, + 0, 0, 0, 0, 1542, 0, 0, 0, 0, 0, + 1222, 0, 1412, 1572, 1365, 1366, 552, 1001, 1541, 1001, + 0, 0, 0, 0, 1582, 1583, 1584, 0, 1588, 1592, + 0, 0, 0, -1793, 27, 28, 29, 0, 0, 0, + 1364, 0, 815, 3239, 3089, 0, 0, -1793, 0, 0, + 0, 850, -1793, 0, 0, 1367, 1368, -1793, 0, 1369, + 1370, 1541, 1654, 0, 0, 0, -1793, 1204, 0, 0, + 553, -1793, 0, 0, 0, 0, 0, 0, 0, 1472, + 1472, 0, 850, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 0, 0, 0, -1793, 1415, 1365, 1366, 0, 0, 0, + 36, 1542, 2934, 1692, 0, 0, 0, 1708, 1713, 553, + 0, 3208, 0, -1793, 0, 2571, 0, 0, 1107, 1107, + 0, 0, 38, 0, 1371, 1372, 39, 0, 0, 0, + 0, 0, 0, 3309, 0, 1542, 1367, 1368, 0, 0, + 1369, 1370, 0, 0, 0, 0, 40, 0, 0, 0, + 0, 0, 0, 1541, 0, 0, 0, 0, 0, 41, + 1746, 0, -1793, 0, 0, -1793, 0, 0, 0, 0, + 44, -1793, 0, 951, 951, 1279, 3309, 951, 0, 0, + 0, 0, 0, 0, 1279, 1945, 45, 0, 1373, 1374, + 1375, 1376, 1377, 1378, 1379, 1380, 552, 0, 1381, 1382, + 0, 0, 0, 0, 0, 0, 0, 0, 1279, 0, + 46, -1793, 0, 0, 1542, 1371, 1372, 0, 1746, 0, + 0, 0, 0, 0, 47, 3309, 0, 0, 0, 3367, + 0, 0, 0, 0, -1793, 0, 0, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3343, 0, 0, 1630, 1635, 0, 1631, 1636, 1637, - 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, 0, - 0, 1632, 0, 0, 1633, 1894, 0, 3024, 3025, 0, - 0, 1647, 3369, 0, 0, 0, 0, 0, 0, 717, - 0, 0, 0, 0, 0, 1020, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1542, 0, 0, + 0, 0, 951, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2162, 0, 1373, + 1374, 1375, 1376, 1377, 1378, 1379, 1380, 0, 0, 1381, + 1382, 0, 852, 0, 0, 1892, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3048, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3052, 0, 0, 0, - 0, 3054, 3055, 0, 0, 0, 3056, 0, 0, 0, - 0, 3059, 0, 0, 3062, 3063, 718, 0, 0, 2272, - 1278, 0, 0, 3071, 0, 0, 0, 0, 0, 0, - 0, 0, 719, 0, 1107, 1647, 0, 0, 0, 0, - 0, 1634, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1647, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1647, 1647, 1647, 0, 0, 0, 1647, 0, 0, - 0, 1647, 0, 0, 0, 1363, 0, 815, 3112, 0, - 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 721, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 722, 0, 3131, 0, 0, 723, 0, + 0, 1383, 1384, 0, 0, 0, 0, 0, 0, 0, + -1793, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -1793, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 553, 0, 0, 0, 553, 0, -1793, + 0, -1793, -1793, 1977, 0, 1427, 0, 1427, 1427, 1542, + 0, 0, 0, 0, 2934, 0, 0, 0, 0, 0, + 1107, 1107, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1107, -1793, 0, + 0, -1793, -1793, -1793, 0, 0, 0, 0, 0, 0, + 0, 0, 1383, 1384, 0, 0, 1385, 1386, 0, 0, + 0, 1611, 0, 0, 1612, 1541, 0, 0, 1613, 1614, + 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, + 1387, 1388, 0, 0, 0, 0, 0, 0, 0, 1620, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1622, + 1994, 0, 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 553, 0, 0, 0, + 553, 553, 553, 1624, 0, 0, 0, 0, 0, 0, + 0, 0, 2024, 0, 0, 0, 0, 1385, 1386, 0, + 2027, 0, 0, 0, 0, 0, 0, 0, 0, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1647, 0, 0, 0, 724, 0, 0, - 1364, 1365, 0, 0, 0, 0, 0, 0, 1635, 0, - 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, - 1644, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1647, 0, 0, 0, 0, 0, 0, 0, 0, - 725, 1366, 1367, 0, 726, 1368, 1369, 1647, 0, 0, - 0, 1610, 1647, 0, 1611, 3165, 0, 0, 1612, 1613, - 1614, 1615, 1616, 1617, 1618, 0, 0, 0, 0, 1919, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1619, - 0, 0, 0, 2769, 0, 0, 0, 0, 0, 1621, - 0, 0, 0, 0, 0, 0, 1622, 0, 1610, 0, - 0, 1611, 1591, 0, 0, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 0, 0, 727, 0, 0, 0, 0, 0, - 1370, 1371, 0, 1623, 0, 0, 1619, 0, 0, 728, - 0, 0, 0, 0, 0, 2484, 1621, 0, 0, 0, - 0, 0, 0, 1622, 0, 0, 3225, 3226, 0, 0, - 3227, 0, 1583, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 729, 0, 0, 730, 0, 0, 0, 0, - 1623, 0, 0, 0, 0, 0, 731, 3245, 0, 732, - 0, 0, 0, 0, 1372, 1373, 1374, 1375, 1376, 1377, - 1378, 1379, 0, 0, 1380, 1381, 0, 733, 0, 0, - 0, 3257, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 734, 0, 0, 0, 0, 0, 0, 736, 1624, - 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, - 0, 1647, 0, 0, 738, 0, 1625, 0, 0, 1919, - 1919, 1626, 1415, 1415, 1415, 1415, 1415, 1415, 0, 0, - 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, - 1919, 739, 0, 0, 1627, 1628, 1624, 0, 0, 0, - 0, 0, 3303, 0, 0, 0, 0, 0, 0, 1629, - 0, 0, 0, 1625, 0, 0, 0, 0, 1626, 0, - 3024, 0, 0, 0, 3320, 0, 0, 0, 1107, 0, - 0, 0, 0, 0, 0, 0, 0, 1382, 1383, 3329, - 0, 1627, 1628, 0, 2272, 0, 2272, 1630, 0, 0, - 1631, 0, 0, 0, 1107, 0, 1629, 0, 0, 0, - 0, 0, 0, 0, 1632, 0, 0, 1633, 0, 0, - 0, 0, 3354, 0, 0, 0, 0, 0, 0, 0, + 0, 1387, 1388, 0, 553, 553, 553, 553, 553, 553, + 553, 553, 553, 553, 0, 0, 0, 0, 0, 2073, + 0, 0, 0, 0, 0, 2077, 2078, 2079, 2080, 2081, + 2082, 2083, 2084, 0, 0, 0, 0, 2093, 2094, 0, + 0, 0, 2105, 0, 0, 0, 2108, 0, 0, 2116, + 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 0, 1625, + 2125, 0, 0, 0, 0, 0, 0, 1107, 0, 1279, + 0, 0, 0, 0, 0, 0, 1626, 0, 0, 0, + 0, 1627, 0, 0, 0, 0, 0, 0, 2151, 0, + 0, 0, 0, 0, 0, -45, 0, 0, 1977, 0, + 0, 1542, 0, 0, 1628, 1629, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 1630, + 0, 1583, 1584, 0, 2440, 0, 0, 2, 0, 3, + 4, 1611, 0, 0, 1612, 0, 0, 0, 1613, 1614, + 0, 0, 5, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 1631, 0, 0, + 1632, 0, 0, 0, 0, 0, 0, 0, 0, 1622, + 8, 0, 0, 0, 1633, 0, -2046, 1634, 0, 9, + 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 1624, 0, 0, 13, 0, 0, 2273, + 0, 0, 0, 1279, 0, 0, 2283, 2284, 0, 0, + 0, 14, 15, 16, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 20, 21, + 553, 0, 0, 0, 0, 0, 0, 1279, 0, 0, + 0, 0, 22, 0, 0, 0, 23, 0, 2791, 0, + 0, 0, 0, 0, 1635, 0, 1336, 2348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1647, 1630, 0, 1647, 1631, 0, 0, + 0, 0, 24, 0, 0, 0, 0, 0, 0, -2046, + 0, 0, 0, 0, 0, 0, 2372, 2373, 25, 2374, + 0, 0, 0, 0, 0, 1611, -2046, 0, 1612, 0, + 0, -2046, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, + 0, 0, 0, 0, 26, 0, 0, 0, 2400, 2401, + 0, 0, 2151, 1620, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1622, 0, 0, 0, 0, 0, -2046, + 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2428, 0, 0, 0, 0, 0, 2434, 0, 0, + 0, 1636, 0, 0, 1637, 1638, 1639, 1624, 1640, 1641, + 1642, 1643, 1644, 1645, 0, 1472, 0, 1279, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2475, 0, 27, + 28, 29, 0, 0, 1633, 0, 0, 30, 0, 0, + 31, 0, 0, 3216, 0, 0, 1416, 0, 0, 0, + 2440, 0, 0, 2468, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1632, 0, 0, 1633, 0, 0, 0, 0, 0, - 0, 3380, 0, 0, 0, 0, 0, 1610, 0, 0, - 1611, 3024, 1384, 1385, 1612, 1613, 1614, 1615, 1616, 1617, - 1618, 0, 1647, 1107, 0, 0, 1647, 1647, 1647, 1647, - 1647, 1647, 1647, 1647, 0, 1619, 1386, 1387, 0, 1415, - 1415, 0, 1647, 1647, 1634, 1621, 0, 0, 0, 0, - 0, 0, 1622, 0, 1647, 3423, 0, 1647, 0, 0, - 0, 0, 0, 0, 0, 1647, 1647, 1647, 1647, 1647, - 1647, 1647, 1647, 1647, 1647, 0, 0, 0, 0, 1623, + 0, 0, 2487, 0, 34, 717, 0, 2490, 2491, 0, + 0, 35, 0, 1625, 0, 36, 553, 0, 0, 0, + 0, 553, 0, 0, 0, 37, 0, 0, 0, 0, + 1626, 0, 0, 0, 0, 1627, 0, 38, 0, 0, + 0, 39, 0, 0, -2046, 0, 0, 553, 0, 0, + 0, 2512, 0, 0, 2515, 0, 2517, 0, 1628, 1629, + 0, 40, 718, 0, 0, 0, 0, 0, 553, 553, + 0, 0, 2521, 1630, 41, 1648, 0, 42, 719, 0, + 43, 0, 0, 0, 0, 44, 0, 0, 0, 0, + 0, 0, 0, 0, 553, 0, 0, 0, 0, 0, + 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1631, 1692, 0, 1632, 0, 0, 0, 0, 0, + 1648, 0, 0, 0, 0, 46, 0, 720, 1633, 1713, + 2123, 1634, 0, 0, 0, 553, 0, 721, 0, 47, + 0, 0, -45, 0, 0, 0, 0, 0, 1107, 722, + 0, -2046, 0, 1416, 723, 0, 0, 2575, 1640, 1641, + 1642, 1643, 1644, 1645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1634, 0, 0, 1610, 0, 0, 1611, 0, 0, - 1647, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, + 0, 0, 0, 724, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1611, 0, 0, 1612, 0, + 0, 0, 1613, 1614, 0, 1648, 1617, 1618, 1619, 0, + 0, 0, 0, 0, 1584, 0, 0, 0, 0, 0, + 1279, 0, 0, 0, 0, 0, 725, 0, 1635, 0, + 726, 0, 0, 1622, 0, 0, 0, 0, 0, 0, + 1623, 0, 0, 0, 0, 0, 0, 1648, 0, 0, + 0, 0, 0, 0, 1648, 0, 1610, 0, 0, 0, + 0, 1611, 0, 0, 1612, 0, 0, 1624, 1613, 1614, + 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 2682, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1620, + 0, 0, 0, 1621, 0, 0, 0, 0, 0, 1622, + 727, 0, 0, 0, 1648, 0, 1623, 0, 0, 0, + 0, 0, 0, 0, 0, 728, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 553, 0, 0, 0, 1648, + 0, 0, 0, 1624, 0, 1636, 0, 0, 1637, 1638, + 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 729, 0, + 0, 730, 0, 0, 0, 1895, 0, 0, 0, 0, + 0, 0, 731, 1625, 0, 732, 0, 0, 0, 0, + 0, 0, 0, 0, 1648, 0, 1648, 0, 1416, 1416, + 1626, 1920, 0, 733, 1416, 1627, 0, 1648, 0, 0, + 1648, 0, 0, 0, 0, 1648, 0, 734, 1648, 0, + 0, 0, 0, 0, 736, 0, 0, 0, -2046, -2046, + 0, 2760, 0, 0, 737, 0, 0, 2762, 2027, 0, + 738, 0, 0, 1630, 0, 0, 0, 0, 2768, 1625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2777, + 1648, 0, 2780, 0, 2782, 0, 1626, 739, 0, 0, + 0, 1627, 2786, 0, 0, 0, 0, 0, 0, 0, + 2793, 2794, 0, 0, -2046, 0, 0, 2801, 0, 0, + 0, 0, 0, 0, 1628, 1629, 0, 0, 1633, 0, + 0, 0, 2810, 0, 0, 0, 0, 0, 0, 1630, + 0, 0, 2825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1619, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1621, 0, 0, 0, 0, 0, 0, 1622, - 0, 0, 0, 3477, 3477, 3477, 0, 0, 0, 0, - 0, 1635, 0, 1415, 1636, 1637, 1638, 0, 1639, 1640, - 1641, 1642, 1643, 1644, 0, 0, 1623, 0, 2063, 0, - 3477, 0, 0, 0, 0, 1624, 0, 0, 0, 0, + 0, 0, 1107, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1648, 0, 0, 1631, 0, 0, + 1632, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1648, 0, 0, 0, 1633, 0, 0, 1634, 0, 0, + 1648, 1648, 1648, 0, 0, 0, 1648, 0, 0, 0, + 1648, 0, 0, 0, 0, 0, 0, 0, 0, 2273, + 0, 2273, 0, 0, 0, 0, 0, 0, 1635, 0, + 1611, 0, 0, 1612, 0, 0, 0, 1613, 1614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1625, 0, 0, 0, 0, 1626, 1635, 0, - 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, - 1644, 3477, 0, 0, 0, 2063, 0, 0, 0, 0, - 1627, 1628, 1647, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1647, 1647, 0, 1629, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1611, 0, + 0, 1612, 0, 0, 0, 1613, 1614, 0, 1622, 0, + 0, 0, 1648, 0, 0, -2046, 0, 1611, 0, 0, + 1612, 0, 0, 0, 1613, 1614, 1615, 1616, 1617, 1618, + 1619, 0, 0, 0, 1635, 0, 1622, 0, 0, 0, + 0, 0, 1624, -2046, 0, 1620, 0, 0, 0, 2772, + 1648, 0, 0, 0, 0, 1622, 3027, 3028, 0, 0, + 0, 0, 1623, 0, 0, 0, 1648, 0, 0, 0, + 1624, 1648, 0, 0, 0, 1636, 0, 0, 1637, 1638, + 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 1920, 1624, + 0, 3051, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3055, 0, 2792, 0, 0, + 3057, 3058, 0, 0, 0, 3059, 0, 0, 0, 0, + 3062, 0, 0, 3065, 3066, 0, 0, 0, 2273, 1279, + 0, 0, 3074, 0, 0, 3067, 0, 0, -2046, 0, + 0, 1636, 0, 1107, 1637, 1638, 1639, 0, 1640, 1641, + 1642, 1643, 1644, 1645, 0, -2046, 0, 0, 0, 0, + -2046, 0, 0, 0, 0, 0, -2046, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2046, 0, 1625, 0, 3115, -2046, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -2046, 0, + 0, 0, 1626, 0, 0, 0, 0, 1627, 0, 0, + 0, 0, 0, 0, 3134, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2046, 0, 0, 0, + 1628, 1629, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1630, 0, 0, 0, 0, + 1648, 0, 0, 1633, 0, 0, 0, 0, 1920, 1920, + 0, 1416, 1416, 1416, 1416, 1416, 1416, 0, 0, 1416, + 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1920, + 0, 1633, 0, 1631, 0, 0, 1632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1624, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1630, 0, 0, 1631, 0, 0, 1625, - 0, 0, 0, 0, 1626, 0, 0, 0, 0, 0, - 1632, 0, 0, 1633, 0, 0, 0, 1647, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1627, 1628, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1647, - 1647, 1647, 1629, 0, 1919, 1919, 1919, 1919, 1919, 1919, - 0, 0, 0, 1919, 1919, 1919, 1919, 1919, 1919, 1919, - 1919, 1919, 1919, 0, 0, 0, 0, 1647, 1647, 0, + 1633, 0, 0, 1634, 3168, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1611, 0, + 0, 1612, 0, 0, 0, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1620, 0, 0, 0, + 0, 1592, 0, -2046, 0, 0, 1622, 0, 0, 0, + 0, 0, 0, 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1630, 0, 0, 1631, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1647, 0, 1632, 0, 0, - 1633, 1647, 0, 0, 1610, 0, 0, 1611, 0, 0, - 1634, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, + 0, -2046, 1648, 0, 2487, 1648, 0, 0, 0, 0, + 1624, 0, 0, 0, 0, 3228, 3229, 0, 0, 3230, + 1635, 1584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1619, 0, 0, 1647, 0, 0, 0, 0, - 0, 0, 1621, 0, 0, 0, 0, 0, 0, 1622, - 0, 0, 0, 0, 1647, 0, 0, 1647, 1647, 0, - 0, 0, 0, 0, 0, 1919, 1919, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1623, 0, 0, 1647, - 1415, 1415, 1647, 0, 1647, 0, 0, 0, 1647, 0, - 0, 0, 0, 0, 0, 0, 0, 1634, 0, 0, + 0, 0, 0, 0, 0, 0, 3248, 0, 0, 0, + 0, 1648, 0, 0, 0, 1648, 1648, 1648, 1648, 1648, + 1648, 1648, 1648, 0, 0, 0, 0, 0, 1416, 1416, + 3260, 1648, 1648, 0, 0, 0, 0, 0, 0, 0, + -2046, 0, 0, 1648, 0, 0, 1648, 1640, 1641, 1642, + 1643, 1644, 1645, 0, 1648, 1648, 1648, 1648, 1648, 1648, + 1648, 1648, 1648, 1648, 0, 0, 1625, 0, -2046, 0, + 0, 0, 0, 0, 0, 1640, 1641, 1642, 1643, 1644, + 1645, 0, 0, 1626, 0, 0, 0, 1636, 1627, 1648, + 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, + 0, 3306, 0, 0, 2064, 0, 0, 0, 0, 0, + 0, 1628, 1629, 0, 0, 0, 0, 0, 0, 3027, + 0, 0, 0, 3323, 0, 0, 1630, 1107, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3332, 0, + 0, 0, 1416, 2273, 0, 2273, 0, 0, 0, 0, + 0, 0, 0, 1107, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1631, 0, 0, 1632, 0, 0, + 0, 3357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1633, 0, 0, 1634, 0, 0, 0, 1611, 0, + 0, 1612, 0, 0, 0, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1648, 0, 0, 0, 0, 1620, 0, 0, 0, + 3383, 1648, 1648, 0, 0, 0, 1622, 0, 0, 0, + 3027, 0, 0, 1623, 0, 0, 0, 0, 0, 0, + 0, 0, 1107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1635, 0, 0, - 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, - 0, 0, 0, 0, 2368, 0, 0, 0, 0, 0, - 0, 0, 1647, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1610, 0, 0, 1611, 0, 0, 0, 1612, - 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, 0, - 0, 0, 1624, 0, 0, 0, 0, 0, 0, 0, - 1619, 0, 0, 0, 0, 0, 0, 0, 0, 1625, - 1621, 0, 0, 0, 1626, 0, 0, 1622, 0, 0, - 0, 0, 0, 0, 1635, 0, 0, 1636, 1637, 1638, - 0, 1639, 1640, 1641, 1642, 1643, 1644, 1627, 1628, 0, - 0, 2469, 0, 0, 1623, 0, 0, 1610, 0, 0, - 1611, 0, 1629, 0, 1612, 1613, 1614, 1615, 1616, 1617, - 1618, 0, 0, 0, 0, 0, 0, 0, 0, 1647, - 0, 0, 0, 0, 0, 1619, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1621, 0, 0, 0, 0, - 1630, 1415, 1622, 1631, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1632, 0, 0, - 1633, 0, 0, 0, 0, 0, 0, 0, 0, 1623, + 1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3426, 0, 0, 0, 0, 0, + 0, 1635, 0, 0, 0, 0, 1648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1610, 0, 0, 1611, 0, 0, 0, 1612, 1613, 0, - 1624, 1616, 1617, 1618, 0, 0, 0, 1647, 0, 1647, - 0, 0, 0, 0, 0, 1647, 0, 1625, 1619, 0, - 0, 0, 1626, 0, 1647, 0, 0, 1647, 1621, 1647, - 0, 0, 0, 1647, 0, 1622, 1919, 1919, 0, 0, - 1647, 1647, 0, 0, 0, 1627, 1628, 0, 1647, 0, - 0, 0, 0, 0, 0, 0, 0, 1647, 0, 0, - 1629, 0, 1623, 0, 0, 0, 0, 1634, 0, 0, - 0, 0, 1647, 0, 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1625, 0, 0, 0, 0, 1626, 1630, 0, - 0, 1631, 0, 0, 0, 0, 0, 0, 0, 0, - 1415, 0, 0, 0, 0, 1632, 0, 0, 1633, 0, - 1627, 1628, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1629, 0, 0, 0, 0, + 1648, 1648, 1648, 0, 0, 1920, 1920, 1920, 1920, 1920, + 1920, 0, 0, 0, 1920, 1920, 1920, 1920, 1920, 1920, + 1920, 1920, 1920, 1920, 0, 0, 0, 0, 1648, 1648, + 0, 0, 1611, 0, 0, 1612, 0, 0, 0, 1613, + 1614, 1615, 1616, 1617, 1618, 1619, 1625, 0, 0, 0, + 0, 0, 3480, 3480, 3480, 0, 1648, 0, 0, 0, + 1620, 0, 1648, 1626, 0, 0, 0, 0, 1627, 0, + 1622, 0, 0, 0, 0, 0, 0, 1623, 1636, 3480, + 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, + 1645, 1628, 1629, 0, 0, 2064, 1648, 0, 0, 0, + 0, 0, 0, 0, 1624, 0, 1630, 0, 0, 0, + 0, 0, 0, 0, 0, 1648, 0, 0, 1648, 1648, + 3480, 0, 0, 0, 0, 0, 1920, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1624, 0, - 1364, 1365, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1630, 1635, 1625, 1631, 1636, 1637, 1638, - 1626, 1639, 1640, 1641, 1642, 1643, 1644, 0, 0, 0, - 1632, 2493, 0, 1633, 0, 0, 0, 0, 1364, 1365, - 0, 1366, 1367, 1627, 1628, 1368, 1369, 0, 0, 0, - 0, 0, 0, 0, 0, 1634, 0, 0, 1629, 0, + 1648, 1416, 1416, 1648, 1631, 1648, 0, 1632, 0, 1648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1366, - 1367, 0, 0, 1368, 1369, 0, 0, 0, 0, 1919, - 1415, 0, 0, 0, 0, 0, 1630, 0, 0, 1631, + 0, 1633, 0, 0, 1634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1632, 1647, 1647, 1633, 0, 0, 0, - 1370, 1371, 0, 0, 0, 0, 0, 0, 0, 0, - 1634, 0, 0, 0, 0, 0, 0, 0, 1647, 0, - 0, 0, 1647, 0, 1647, 1647, 1647, 0, 0, 1647, - 0, 0, 1647, 1647, 0, 0, 0, 0, 1370, 1371, - 0, 1647, 1635, 0, 0, 1636, 1637, 1638, 0, 1639, - 1640, 1641, 1642, 1643, 1644, 0, 0, 0, 0, 2699, - 0, 0, 0, 0, 1372, 1373, 1374, 1375, 1376, 1377, - 1378, 1379, 0, 0, 1380, 1381, 0, 0, 0, 0, - 0, 0, 1647, 0, 0, 0, 0, 0, 1919, 0, - 0, 0, 0, 1634, 0, 0, 0, 0, 0, 0, - 0, 1647, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, - 0, 0, 1380, 1381, 0, 0, 0, 1635, 0, 0, - 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, - 0, 0, 0, 0, 2771, 1647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1919, 0, 0, 0, 0, 0, 0, 0, + 1625, 0, 0, 1648, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1626, 0, 0, + 0, 1611, 1627, 0, 1612, 0, 0, 0, 1613, 1614, + 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1628, 1629, 0, 0, 1620, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1622, + 1630, 1635, 0, 0, 0, 0, 1623, 0, 0, 0, + 0, 1611, 0, 0, 1612, 0, 0, 0, 1613, 1614, + 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, + 0, 0, 0, 1624, 0, 0, 0, 0, 1631, 1620, + 0, 1632, 0, 0, 0, 0, 0, 0, 0, 1622, + 1648, 0, 0, 0, 0, 1633, 1623, 1197, 1634, 0, + 0, 0, 0, 1198, 0, 0, 0, 0, 0, 0, + 0, 1210, 1416, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1624, 0, 0, 0, 0, 0, 0, + 0, 1211, 0, 1611, 0, 0, 1612, 0, 0, 0, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 1636, 0, + 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, + 1645, 1620, 0, 0, 0, 2371, 0, 0, 1648, 1625, + 1648, 1622, 0, 0, 0, 0, 1648, 1212, 1623, 0, + 0, 0, 0, 0, 0, 1648, 1626, 0, 1648, 0, + 1648, 1627, 0, 0, 1648, 1635, 0, 1920, 1920, 0, + 0, 1648, 1648, 0, 0, 1624, 0, 0, 1199, 1648, + 0, 0, 0, 0, 1628, 1629, 0, 0, 1648, 1625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1630, + 0, 0, 0, 1648, 0, 0, 1626, 0, 0, 0, + 0, 1627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1382, 1383, 0, - 0, 0, 0, 0, 0, 1647, 1647, 1647, 0, 0, - 1635, 0, 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, - 1642, 1643, 1644, 0, 0, 1647, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1382, 1383, 1647, 0, 0, + 0, 0, 0, 0, 1628, 1629, 0, 1631, 0, 0, + 1632, 1416, 1213, 0, 0, 0, 0, 0, 0, 1630, + 0, 0, 0, 0, 1633, 0, 0, 1634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1625, 1636, 0, 0, 1637, 1638, 1639, 0, 1640, + 1641, 1642, 1643, 1644, 1645, 0, 0, 1631, 1626, 2472, + 1632, 1214, 0, 1627, 0, 0, 0, 0, 0, 0, + 0, 1215, 0, 0, 1633, 0, 0, 1634, 0, 0, + 0, 0, 0, 1216, 0, 0, 1628, 1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1630, 0, 0, 1200, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1217, 0, 0, 0, 0, + 0, 0, 0, 0, 1635, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1631, + 1365, 1366, 1632, 0, 0, 0, 0, 0, 0, 0, + 1920, 1416, 0, 0, 0, 0, 1633, 0, 0, 1634, + 0, 2248, 0, 0, 0, 1202, 0, 1219, 0, 0, + 0, 0, 0, 0, 1635, 1648, 1648, 0, 0, 0, + 0, 1367, 1368, 0, 0, 1369, 1370, 0, 0, 0, + 0, 0, 1220, 0, 0, 0, 0, 2249, 0, 1648, + 0, 0, 0, 1648, 0, 1648, 1648, 1648, 0, 0, + 1648, 1222, 0, 1648, 1648, 0, 0, 0, 0, 0, + 0, 0, 1648, 0, 0, 0, 0, 0, 0, 0, + 0, 1636, 0, 0, 1637, 1638, 1639, 0, 1640, 1641, + 1642, 1643, 1644, 1645, 0, 0, 0, 0, 2496, 0, + 0, 0, 0, 0, 0, 0, 1635, 0, 0, 0, + 1371, 1372, 0, 1648, 0, 0, 0, 0, 1204, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1636, 1648, 0, 1637, 1638, 1639, 0, 1640, 1641, + 1642, 1643, 1644, 1645, 0, 0, 0, 0, 2702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1647, 0, 0, 0, 0, 0, 0, - 0, 0, 1384, 1385, 0, 0, 0, 0, 0, 0, - 1647, 0, 0, 0, 0, 0, 0, 0, 0, 1647, - 0, 0, 0, 0, 0, 0, 1386, 1387, 0, 0, + 0, 0, 0, 0, 0, 0, 1648, 0, 0, 0, + 0, 0, 0, 0, 1373, 1374, 1375, 1376, 1377, 1378, + 1379, 1380, 0, 0, 1381, 1382, 0, 0, 0, 0, + 0, 0, 0, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1384, 1385, 0, 0, 1647, 0, 1993, 0, 0, 0, + 0, 0, 0, 1636, 0, 0, 1637, 1638, 1639, 0, + 1640, 1641, 1642, 1643, 1644, 1645, 1648, 1648, 1648, 0, + 2774, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1648, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1386, 1387, 0, 0, 0, 0, - 1647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 116, 1042, 815, 1043, - 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1647, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, - 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, - 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, - 149, 150, 151, 152, 1053, 1054, 155, 1647, 156, 157, - 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, - 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, - 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, - 232, 0, 233, 234, 0, 235, 236, 237, 238, 239, - 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, - 0, 1067, 0, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 288, 289, 290, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 1069, 321, 1070, 323, 324, 325, 326, 1071, 327, 328, - 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, - 337, 338, 0, 0, 1074, 340, 341, 0, 0, 342, - 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, - 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, - 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, - 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, - 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, - 0, 0, 1088, 1089, 0, 1090, 1091, 2624, 116, 1042, - 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, - 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, - 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, - 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, - 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, - 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, - 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, - 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, - 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, - 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, - 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, - 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, - 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, - 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, - 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, - 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, - 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, - 1065, 1066, 0, 1067, 0, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 0, 0, 287, 288, - 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, - 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 1069, 321, 1070, 323, 324, 325, 326, 1071, - 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, - 336, 0, 337, 338, 0, 0, 1074, 340, 341, 0, - 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, - 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, - 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, - 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, - 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, - 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, - 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, - 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, - 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, - 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, - 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, - 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, - 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, - 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, - 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, - 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 3228, - 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, - 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, - 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, - 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, - 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, - 155, 0, 156, 157, 158, 159, 786, 0, 787, 0, - 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 0, 172, 173, 174, 175, 176, 177, 0, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, - 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, - 198, 199, 200, 14, 15, 201, 202, 203, 204, 0, - 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, - 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, - 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, - 229, 1062, 231, 0, 232, 0, 233, 234, 23, 235, - 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, - 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, - 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, - 271, 272, 1065, 1066, 0, 1067, 0, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 0, 0, - 287, 288, 289, 290, 0, 291, 292, 293, 294, 295, - 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 1069, 321, 1070, 323, 324, 325, - 326, 1071, 327, 328, 329, 330, 1072, 790, 332, 1073, - 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, - 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 27, 28, 29, 0, 360, 361, 793, 363, 364, - 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, - 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, - 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 397, 398, 399, 400, - 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, - 411, 412, 413, 414, 415, 416, 34, 0, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 36, 426, 427, - 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, 444, 795, 38, - 0, 446, 447, 39, 448, 449, 450, 451, 452, 453, - 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, - 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, - 470, 0, 0, 471, 472, 473, 41, 474, 475, 476, - 477, 0, 478, 479, 480, 481, 482, 799, 1081, 0, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, - 0, 494, 0, 45, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 1082, 0, 46, 0, 0, - 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, - 0, 1087, 3203, 0, 0, 0, 1088, 1089, 0, 1090, - 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, - 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, - 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, - 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, - 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, - 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, - 197, 198, 199, 200, 14, 15, 201, 202, 203, 204, - 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, - 228, 229, 1062, 231, 0, 232, 0, 233, 234, 23, - 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, - 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, - 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, - 325, 326, 1071, 327, 328, 329, 330, 1072, 790, 332, - 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, - 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, - 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 27, 28, 29, 0, 360, 361, 793, 363, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 399, - 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 34, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 36, 426, - 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, - 38, 0, 446, 447, 39, 448, 449, 450, 451, 452, - 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, - 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 41, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 799, 1081, - 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 45, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 0, 0, 0, 0, 0, 0, 0, 1383, 1384, 0, + 0, 0, 0, 0, 1648, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1648, 0, 0, 0, 0, 0, 0, 0, 0, + 1648, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1648, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1648, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1385, 1386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 116, 1042, 815, + 1043, 1044, 1045, 1046, 1047, 0, 1387, 1388, 0, 0, + 0, 0, 0, 0, 1648, 0, 117, 118, 119, 120, + 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, + 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, + 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, + 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, + 785, 149, 150, 151, 152, 1053, 1054, 155, 1648, 156, + 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, + 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, + 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, + 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, + 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, + 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, + 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, + 0, 232, 0, 233, 234, 0, 235, 236, 237, 238, + 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, + 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, + 1066, 0, 1067, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 0, 0, 287, 288, 289, + 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, + 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 1069, 321, 1070, 323, 324, 325, 326, 1071, 327, + 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, + 0, 337, 338, 0, 0, 1074, 340, 341, 0, 0, + 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, + 0, 0, 360, 361, 793, 363, 364, 365, 366, 367, + 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, + 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, + 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, + 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, + 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, + 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, + 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, + 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, + 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, + 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, + 0, 0, 0, 1088, 1089, 0, 1090, 1091, 2627, 116, + 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, + 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, + 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, + 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, + 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, + 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, + 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, + 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, + 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, + 272, 1065, 1066, 0, 1067, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 1069, 321, 1070, 323, 324, 325, 326, + 1071, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, + 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, + 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 793, 363, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, + 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, + 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, + 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, + 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, + 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, + 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, + 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, + 3231, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, + 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, + 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, + 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, + 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, + 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, + 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, + 197, 198, 199, 200, 14, 15, 201, 202, 203, 204, + 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, + 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, + 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, + 228, 229, 1062, 231, 0, 232, 0, 233, 234, 23, + 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, + 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, + 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, + 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 0, + 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, + 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, + 325, 326, 1071, 327, 328, 329, 330, 1072, 790, 332, + 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, + 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, + 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 27, 28, 29, 0, 360, 361, 793, 363, + 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, + 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, + 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 0, 397, 398, 399, + 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 34, 0, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 36, 426, + 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, + 38, 0, 446, 447, 39, 448, 449, 450, 451, 452, + 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, + 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, + 469, 470, 0, 0, 471, 472, 473, 41, 474, 475, + 476, 477, 0, 478, 479, 480, 481, 482, 799, 1081, + 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 0, 0, 494, 0, 45, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 46, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, - 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, + 1086, 0, 1087, 3206, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, @@ -5407,7 +5367,7 @@ static const yytype_int16 yytable[] = 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, - 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, + 196, 197, 198, 199, 200, 14, 15, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, @@ -5433,10 +5393,10 @@ static const yytype_int16 yytable[] = 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 34, 0, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 36, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 795, 0, 0, 446, 447, 39, 448, 449, 450, 451, + 795, 38, 0, 446, 447, 39, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 41, 474, @@ -5447,478 +5407,478 @@ static const yytype_int16 yytable[] = 509, 510, 511, 512, 513, 514, 515, 1082, 0, 46, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, - 0, 1090, 1091, 1241, 1042, 815, 1043, 1044, 1045, 1046, + 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, - 1242, 125, 126, 127, 0, 0, 0, 1243, 0, 1048, - 0, 0, 1244, 129, 130, 0, 131, 132, 133, 1245, - 135, 136, 137, 138, 1049, 1246, 1050, 1051, 0, 143, + 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, + 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, + 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, - 0, 1247, 0, 1248, 163, 164, 165, 166, 167, 1249, + 0, 787, 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, - 0, 1250, 179, 180, 181, 182, 183, 184, 185, 186, + 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, - 203, 204, 1251, 0, 205, 206, 1059, 208, 209, 0, + 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, - 1252, 0, 1253, 236, 237, 1254, 1255, 240, 0, 241, + 234, 23, 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, - 250, 251, 252, 1256, 254, 255, 256, 257, 0, 258, - 259, 260, 261, 262, 263, 264, 0, 265, 1257, 267, + 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, + 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, 0, 1067, 0, - 276, 1258, 1259, 279, 1260, 281, 282, 283, 284, 285, - 286, 0, 0, 287, 1261, 289, 1262, 0, 291, 292, - 293, 294, 295, 296, 297, 298, 1263, 300, 301, 302, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 0, 0, 287, 288, 289, 290, 0, 291, 292, + 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 1069, 1264, 1070, - 323, 324, 325, 326, 1071, 327, 328, 1265, 330, 1072, + 313, 314, 315, 316, 317, 318, 319, 1069, 321, 1070, + 323, 324, 325, 326, 1071, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, - 0, 1074, 340, 341, 0, 0, 342, 343, 344, 1266, - 346, 1267, 792, 349, 350, 351, 352, 353, 354, 355, - 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, - 793, 1268, 364, 365, 366, 367, 368, 369, 0, 370, + 0, 1074, 340, 341, 0, 0, 342, 343, 344, 345, + 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 27, 28, 29, 0, 360, 361, + 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, - 398, 1269, 400, 401, 402, 1076, 404, 405, 406, 407, - 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, - 1270, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 0, 1271, 427, 428, 1077, 430, 0, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 1272, - 444, 795, 0, 0, 446, 447, 0, 448, 1273, 450, + 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 34, + 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 795, 0, 0, 446, 447, 39, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, - 458, 459, 796, 461, 797, 1080, 463, 464, 1274, 466, - 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, + 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, + 467, 468, 469, 470, 0, 0, 471, 472, 473, 41, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, - 483, 1081, 1275, 485, 1276, 487, 488, 489, 490, 491, - 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, + 799, 1081, 0, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 0, 0, 494, 0, 45, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, - 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, - 0, 0, 1086, 0, 1087, 1277, 0, 0, 0, 1088, - 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 0, + 46, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, + 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, + 1089, 0, 1090, 1091, 1242, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, - 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, - 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, + 124, 1243, 125, 126, 127, 0, 0, 0, 1244, 0, + 1048, 0, 0, 1245, 129, 130, 0, 131, 132, 133, + 1246, 135, 136, 137, 138, 1049, 1247, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, - 786, 0, 787, 0, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, - 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 1056, 190, 191, 1057, 193, 0, 194, - 0, 195, 196, 197, 198, 199, 200, 14, 15, 201, - 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, + 786, 0, 1248, 0, 1249, 163, 164, 165, 166, 167, + 1250, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 1251, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 1252, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, - 233, 234, 23, 235, 236, 237, 238, 239, 240, 0, + 233, 1253, 0, 1254, 236, 237, 1255, 1256, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, - 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, + 249, 250, 251, 252, 1257, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 1258, 267, 268, 269, 270, 271, 272, 1065, 1066, 0, 1067, - 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 0, 0, 287, 288, 289, 290, 0, 291, - 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, + 0, 276, 1259, 1260, 279, 1261, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 1262, 289, 1263, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 1264, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 1069, 321, - 1070, 323, 324, 325, 326, 0, 327, 328, 329, 330, + 312, 313, 314, 315, 316, 317, 318, 319, 1069, 1265, + 1070, 323, 324, 325, 326, 1071, 327, 328, 1266, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, - 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, - 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 27, 28, 29, 0, 360, - 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, + 0, 0, 1074, 340, 341, 0, 0, 342, 343, 344, + 1267, 346, 1268, 792, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 793, 1269, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, - 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, + 397, 398, 1270, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 34, 0, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 36, 426, 427, 428, 1077, 430, 0, 431, 432, + 0, 1271, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 1272, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, 444, 795, 38, 0, 446, 447, 39, 448, 449, + 1273, 444, 795, 0, 0, 446, 447, 0, 448, 1274, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, - 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, + 0, 458, 459, 796, 461, 797, 1080, 463, 464, 1275, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, - 41, 474, 475, 476, 477, 0, 478, 479, 480, 481, - 482, 799, 1081, 0, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 0, 0, 494, 0, 45, 495, 496, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 1081, 1276, 485, 1277, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, - 507, 508, 509, 510, 511, 512, 513, 514, 515, 0, - 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, + 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, + 0, 0, 0, 1086, 0, 1087, 1278, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, - 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, + 0, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, - 1422, 143, 144, 145, 146, 147, 148, 1052, 785, 149, + 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, - 159, 786, 0, 787, 0, 1055, 163, 164, 165, 166, + 159, 786, 0, 787, 0, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, - 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, + 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 0, + 194, 0, 195, 196, 197, 198, 199, 200, 14, 15, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, - 0, 233, 234, 1423, 235, 236, 237, 238, 239, 240, + 0, 233, 234, 23, 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, 277, 278, 279, 280, 281, 282, 283, - 284, 285, 286, 0, 1424, 287, 288, 289, 290, 0, + 284, 285, 286, 0, 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 1069, - 321, 1070, 323, 324, 325, 326, 1071, 327, 328, 329, + 321, 1070, 323, 324, 325, 326, 0, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, - 338, 0, 0, 1074, 340, 341, 0, 0, 342, 343, + 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, - 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, + 354, 355, 356, 357, 358, 359, 27, 28, 29, 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, - 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, - 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, + 416, 34, 0, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 36, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, + 442, 443, 444, 795, 38, 0, 446, 447, 39, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, - 0, 1425, 458, 459, 796, 461, 797, 1080, 463, 464, + 0, 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, - 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, - 481, 482, 483, 1081, 0, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, + 473, 41, 474, 475, 476, 477, 0, 478, 479, 480, + 481, 482, 799, 1081, 0, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 0, 0, 494, 0, 45, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, - 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, + 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, - 0, 1088, 1089, 0, 1090, 1091, 1241, 1042, 815, 1043, + 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 1243, 0, 1048, 0, 0, 1244, 129, 130, 0, 131, - 132, 133, 1245, 135, 136, 137, 138, 1049, 1246, 1050, - 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, + 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, + 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, + 1051, 1423, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, - 158, 159, 786, 0, 1247, 0, 1248, 163, 164, 165, - 166, 167, 1249, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 1250, 179, 180, 181, 182, 183, + 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, + 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, - 232, 0, 233, 1252, 0, 1253, 236, 237, 1254, 1255, + 232, 0, 233, 234, 1424, 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 1256, 254, 255, 256, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 1257, 267, 268, 269, 270, 271, 272, 1065, 1066, - 0, 1067, 0, 276, 1258, 1259, 279, 1260, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 1261, 289, 1262, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 1263, + 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, + 0, 1067, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 0, 1425, 287, 288, 289, 290, + 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 1069, 1264, 1070, 323, 324, 325, 326, 1071, 327, 328, - 1265, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, + 1069, 321, 1070, 323, 324, 325, 326, 1071, 327, 328, + 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, 0, 0, 342, - 343, 344, 1266, 346, 1267, 792, 349, 350, 351, 352, + 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 793, 1268, 364, 365, 366, 367, 368, + 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 1269, 400, 401, 402, 1076, 404, + 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 1270, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 1271, 427, 428, 1077, 430, 0, + 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 1272, 444, 795, 0, 0, 446, 447, 0, - 448, 1273, 450, 451, 452, 453, 454, 0, 455, 1078, - 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, - 464, 1274, 466, 467, 468, 469, 470, 0, 0, 471, + 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, + 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, + 1079, 0, 1426, 458, 459, 796, 461, 797, 1080, 463, + 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 1081, 2277, 485, 1276, 487, 488, + 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, - 0, 0, 1088, 1089, 0, 1090, 1091, 1241, 1042, 815, + 0, 0, 1088, 1089, 0, 1090, 1091, 1242, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, - 0, 1243, 0, 1048, 0, 0, 1244, 129, 130, 0, - 131, 132, 133, 1245, 135, 136, 137, 138, 1049, 1246, + 0, 1244, 0, 1048, 0, 0, 1245, 129, 130, 0, + 131, 132, 133, 1246, 135, 136, 137, 138, 1049, 1247, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, - 157, 158, 159, 786, 0, 1247, 0, 1248, 163, 164, - 165, 166, 167, 1249, 169, 170, 171, 0, 172, 173, - 174, 175, 176, 177, 0, 1250, 179, 180, 181, 182, + 157, 158, 159, 786, 0, 1248, 0, 1249, 163, 164, + 165, 166, 167, 1250, 169, 170, 171, 0, 172, 173, + 174, 175, 176, 177, 0, 1251, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, - 0, 232, 0, 233, 1252, 0, 1253, 236, 237, 1254, - 1255, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, - 246, 247, 248, 249, 250, 251, 252, 1256, 254, 255, + 0, 232, 0, 233, 1253, 0, 1254, 236, 237, 1255, + 1256, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, + 246, 247, 248, 249, 250, 251, 252, 1257, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, - 0, 265, 1257, 267, 268, 269, 270, 271, 272, 1065, - 1066, 0, 1067, 0, 276, 1258, 1259, 279, 1260, 281, - 282, 283, 284, 285, 286, 0, 0, 287, 1261, 289, - 1262, 0, 291, 292, 293, 294, 295, 296, 297, 298, - 1263, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 0, 265, 1258, 267, 268, 269, 270, 271, 272, 1065, + 1066, 0, 1067, 0, 276, 1259, 1260, 279, 1261, 281, + 282, 283, 284, 285, 286, 0, 0, 287, 1262, 289, + 1263, 0, 291, 292, 293, 294, 295, 296, 297, 298, + 1264, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 1069, 1264, 1070, 323, 324, 325, 326, 1071, 327, - 328, 1265, 330, 1072, 790, 332, 1073, 334, 335, 336, + 319, 1069, 1265, 1070, 323, 324, 325, 326, 1071, 327, + 328, 1266, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, 0, 0, - 342, 343, 344, 1266, 346, 1267, 792, 349, 350, 351, + 342, 343, 344, 1267, 346, 1268, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, - 0, 0, 360, 361, 793, 1268, 364, 365, 366, 367, + 0, 0, 360, 361, 793, 1269, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 397, 398, 1269, 400, 401, 402, 1076, + 395, 396, 0, 397, 398, 1270, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 0, 1270, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 0, 1271, 427, 428, 1077, 430, + 414, 415, 416, 0, 1271, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 0, 1272, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 1272, 444, 795, 0, 0, 446, 447, - 0, 448, 1273, 450, 451, 452, 453, 454, 0, 455, + 440, 441, 442, 1273, 444, 795, 0, 0, 446, 447, + 0, 448, 1274, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, - 463, 464, 1274, 466, 467, 468, 469, 470, 0, 0, + 463, 464, 1275, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, - 479, 480, 481, 482, 483, 1081, 0, 485, 1276, 487, + 479, 480, 481, 482, 483, 1081, 2278, 485, 1277, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, - 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 2334, - 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, + 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, + 0, 0, 0, 1088, 1089, 0, 1090, 1091, 1242, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 124, -1109, 125, 126, 127, 0, - 0, 0, 0, -1109, 1048, 0, 0, 128, 129, 130, - 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, - 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, + 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, + 0, 0, 1244, 0, 1048, 0, 0, 1245, 129, 130, + 0, 131, 132, 133, 1246, 135, 136, 137, 138, 1049, + 1247, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, - 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, - 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, - 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, + 156, 157, 158, 159, 786, 0, 1248, 0, 1249, 163, + 164, 165, 166, 167, 1250, 169, 170, 171, 0, 172, + 173, 174, 175, 176, 177, 0, 1251, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, - 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, - 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, - 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 231, 0, 232, 0, 233, 1253, 0, 1254, 236, 237, + 1255, 1256, 240, 0, 241, 0, 1063, 1064, 244, 245, + 0, 246, 247, 248, 249, 250, 251, 252, 1257, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, - 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, - 1065, 1066, 0, 1067, 0, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 0, 0, 287, 288, - 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, - 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, + 264, 0, 265, 1258, 267, 268, 269, 270, 271, 272, + 1065, 1066, 0, 1067, 0, 276, 1259, 1260, 279, 1261, + 281, 282, 283, 284, 285, 286, 0, 0, 287, 1262, + 289, 1263, 0, 291, 292, 293, 294, 295, 296, 297, + 298, 1264, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 1069, 321, 1070, 323, 324, 325, 326, 1071, - 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, + 318, 319, 1069, 1265, 1070, 323, 324, 325, 326, 1071, + 327, 328, 1266, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, 0, - 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, + 0, 342, 343, 344, 1267, 346, 1268, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, - 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, + 0, 0, 0, 360, 361, 793, 1269, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, + 394, 395, 396, 0, 397, 398, 1270, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, - 430, -1109, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, - 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, + 413, 414, 415, 416, 0, 1271, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 0, 1272, 427, 428, 1077, + 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 1273, 444, 795, 0, 0, 446, + 447, 0, 448, 1274, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, - 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, + 1080, 463, 464, 1275, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, - 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, + 478, 479, 480, 481, 482, 483, 1081, 0, 485, 1277, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, - 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 1241, + 2335, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, - 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, - 0, 0, 0, 1243, 0, 1048, 0, 0, 1244, 129, - 130, 0, 131, 132, 133, 1245, 135, 136, 137, 138, - 1049, 1246, 1050, 1051, 0, 143, 144, 145, 146, 147, + 119, 120, 121, 122, 123, 124, -1111, 125, 126, 127, + 0, 0, 0, 0, -1111, 1048, 0, 0, 128, 129, + 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, + 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, - 0, 156, 157, 158, 159, 786, 0, 1247, 0, 1248, - 163, 164, 165, 166, 167, 1249, 169, 170, 171, 0, - 172, 173, 174, 175, 176, 177, 0, 1250, 179, 180, + 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, - 1062, 231, 0, 232, 0, 233, 1252, 0, 1253, 236, - 237, 1254, 1255, 240, 0, 241, 0, 1063, 1064, 244, - 245, 0, 246, 247, 248, 249, 250, 251, 252, 1256, + 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, + 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, - 263, 264, 0, 265, 1257, 267, 268, 269, 270, 271, - 272, 1065, 1066, 0, 1067, 0, 276, 1258, 1259, 279, - 1260, 281, 282, 283, 284, 285, 286, 0, 0, 287, - 1261, 289, 1262, 0, 291, 292, 293, 294, 295, 296, - 297, 298, 1263, 300, 301, 302, 303, 304, 305, 306, + 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, + 272, 1065, 1066, 0, 1067, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 1069, 1264, 1070, 323, 324, 325, 326, - 1071, 327, 328, 1265, 330, 1072, 790, 332, 1073, 334, + 317, 318, 319, 1069, 321, 1070, 323, 324, 325, 326, + 1071, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, - 0, 0, 342, 343, 344, 1266, 346, 1267, 792, 349, + 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, - 0, 0, 0, 0, 360, 361, 793, 1268, 364, 365, + 0, 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 0, 397, 398, 1269, 400, 401, + 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 0, 1270, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 0, 1271, 427, 428, - 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 1272, 444, 795, 0, 0, - 446, 447, 0, 448, 1273, 450, 451, 452, 453, 454, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, + 1077, 430, -1111, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, + 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, - 797, 1080, 463, 464, 1274, 466, 467, 468, 469, 470, + 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, - 1276, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, - 1087, 3068, 0, 0, 0, 1088, 1089, 0, 1090, 1091, - 1241, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, + 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, + 1242, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, - 127, 0, 0, 0, 1243, 0, 1048, 0, 0, 1244, - 129, 130, 0, 131, 132, 133, 1245, 135, 136, 137, - 138, 1049, 1246, 1050, 1051, 0, 143, 144, 145, 146, + 127, 0, 0, 0, 1244, 0, 1048, 0, 0, 1245, + 129, 130, 0, 131, 132, 133, 1246, 135, 136, 137, + 138, 1049, 1247, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, - 155, 0, 156, 157, 158, 159, 786, 0, 1247, 0, - 1248, 163, 164, 165, 166, 167, 1249, 169, 170, 171, - 0, 172, 173, 174, 175, 176, 177, 0, 1250, 179, + 155, 0, 156, 157, 158, 159, 786, 0, 1248, 0, + 1249, 163, 164, 165, 166, 167, 1250, 169, 170, 171, + 0, 172, 173, 174, 175, 176, 177, 0, 1251, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, - 229, 1062, 231, 0, 232, 0, 233, 1252, 0, 1253, - 236, 237, 1254, 1255, 240, 0, 241, 0, 1063, 1064, + 229, 1062, 231, 0, 232, 0, 233, 1253, 0, 1254, + 236, 237, 1255, 1256, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, - 1256, 254, 255, 256, 257, 0, 258, 259, 260, 261, - 262, 263, 264, 0, 265, 1257, 267, 268, 269, 270, - 271, 272, 1065, 1066, 0, 1067, 0, 276, 1258, 1259, - 279, 1260, 281, 282, 283, 284, 285, 286, 0, 0, - 287, 1261, 289, 1262, 0, 291, 292, 293, 294, 295, - 296, 297, 298, 1263, 300, 301, 302, 303, 304, 305, + 1257, 254, 255, 256, 257, 0, 258, 259, 260, 261, + 262, 263, 264, 0, 265, 1258, 267, 268, 269, 270, + 271, 272, 1065, 1066, 0, 1067, 0, 276, 1259, 1260, + 279, 1261, 281, 282, 283, 284, 285, 286, 0, 0, + 287, 1262, 289, 1263, 0, 291, 292, 293, 294, 295, + 296, 297, 298, 1264, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 1069, 1264, 1070, 323, 324, 325, - 326, 1071, 327, 328, 1265, 330, 1072, 790, 332, 1073, + 316, 317, 318, 319, 1069, 1265, 1070, 323, 324, 325, + 326, 1071, 327, 328, 1266, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, - 341, 0, 0, 342, 343, 344, 1266, 346, 1267, 792, + 341, 0, 0, 342, 343, 344, 1267, 346, 1268, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 0, 0, 0, 0, 360, 361, 793, 1268, 364, + 359, 0, 0, 0, 0, 360, 361, 793, 1269, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 397, 398, 1269, 400, + 392, 393, 394, 395, 396, 0, 397, 398, 1270, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, - 411, 412, 413, 414, 415, 416, 0, 1270, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 0, 1271, 427, + 411, 412, 413, 414, 415, 416, 0, 1271, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 0, 1272, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 1272, 444, 795, 0, - 0, 446, 447, 0, 448, 1273, 450, 451, 452, 453, + 437, 438, 439, 440, 441, 442, 1273, 444, 795, 0, + 0, 446, 447, 0, 448, 1274, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, - 461, 797, 1080, 463, 464, 1274, 466, 467, 468, 469, + 461, 797, 1080, 463, 464, 1275, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, - 485, 1276, 487, 488, 489, 490, 491, 492, 493, 0, + 485, 1277, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, - 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, - 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, + 0, 1087, 3071, 0, 0, 0, 1088, 1089, 0, 1090, + 1091, 1242, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 1688, 125, - 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, - 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, - 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, + 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, + 126, 127, 0, 0, 0, 1244, 0, 1048, 0, 0, + 1245, 129, 130, 0, 131, 132, 133, 1246, 135, 136, + 137, 138, 1049, 1247, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, - 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, - 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, + 1054, 155, 0, 156, 157, 158, 159, 786, 0, 1248, + 0, 1249, 163, 164, 165, 166, 167, 1250, 169, 170, + 171, 0, 172, 173, 174, 175, 176, 177, 0, 1251, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, - 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, - 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, + 228, 229, 1062, 231, 0, 232, 0, 233, 1253, 0, + 1254, 236, 237, 1255, 1256, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, - 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, + 252, 1257, 254, 255, 256, 257, 0, 258, 259, 260, + 261, 262, 263, 264, 0, 265, 1258, 267, 268, 269, + 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, 1259, + 1260, 279, 1261, 281, 282, 283, 284, 285, 286, 0, + 0, 287, 1262, 289, 1263, 0, 291, 292, 293, 294, + 295, 296, 297, 298, 1264, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, - 325, 326, 1071, 327, 328, 329, 330, 1072, 790, 332, + 315, 316, 317, 318, 319, 1069, 1265, 1070, 323, 324, + 325, 326, 1071, 327, 328, 1266, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, - 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, + 340, 341, 0, 0, 342, 343, 344, 1267, 346, 1268, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 793, 363, + 358, 359, 0, 0, 0, 0, 360, 361, 793, 1269, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 399, + 391, 392, 393, 394, 395, 396, 0, 397, 398, 1270, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, + 410, 411, 412, 413, 414, 415, 416, 0, 1271, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 0, 1272, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, - 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, + 436, 437, 438, 439, 440, 441, 442, 1273, 444, 795, + 0, 0, 446, 447, 0, 448, 1274, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, - 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, + 796, 461, 797, 1080, 463, 464, 1275, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, - 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 0, 485, 1277, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, - 1090, 1091, 116, 1703, 815, 1043, 1044, 1045, 1704, 1047, + 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 124, 1705, + 0, 117, 118, 119, 120, 121, 122, 123, 124, 1689, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, @@ -5968,10 +5928,10 @@ static const yytype_int16 yytable[] = 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, - 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, + 0, 1090, 1091, 116, 1704, 815, 1043, 1044, 1045, 1705, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, - 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, + 1706, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, @@ -5985,7 +5945,7 @@ static const yytype_int16 yytable[] = 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, - 234, 1423, 235, 236, 237, 238, 239, 240, 0, 241, + 234, 0, 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, @@ -6037,7 +5997,7 @@ static const yytype_int16 yytable[] = 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, - 233, 234, 0, 235, 236, 237, 238, 239, 240, 0, + 233, 234, 1424, 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, @@ -6071,7 +6031,7 @@ static const yytype_int16 yytable[] = 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, - 0, 0, 0, 1086, 0, 1087, 2051, 0, 0, 0, + 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, @@ -6113,7 +6073,7 @@ static const yytype_int16 yytable[] = 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 795, 0, 0, 446, 447, 2678, 448, + 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, @@ -6123,7 +6083,7 @@ static const yytype_int16 yytable[] = 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, - 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, + 0, 0, 0, 0, 1086, 0, 1087, 2052, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, @@ -6165,13 +6125,13 @@ static const yytype_int16 yytable[] = 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, + 441, 442, 443, 444, 795, 0, 0, 446, 447, 2681, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 0, 2797, 494, 0, 0, + 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, @@ -6179,14 +6139,14 @@ static const yytype_int16 yytable[] = 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, - 121, 122, 123, 124, 3012, 125, 126, 127, 0, 0, + 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, - 174, 175, 176, 177, 0, 178, 179, 3013, 181, 182, + 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, @@ -6194,7 +6154,7 @@ static const yytype_int16 yytable[] = 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, 238, - 239, 240, 0, 241, 0, 3014, 1064, 244, 245, 0, + 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, @@ -6212,7 +6172,7 @@ static const yytype_int16 yytable[] = 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 397, 398, 399, 400, 401, 3015, 1076, + 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, @@ -6223,22 +6183,22 @@ static const yytype_int16 yytable[] = 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, + 488, 489, 490, 491, 492, 493, 0, 2800, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, - 1084, 1085, 0, 0, 0, 0, 1086, 0, 3016, 0, + 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, + 120, 121, 122, 123, 124, 3015, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, - 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, + 173, 174, 175, 176, 177, 0, 178, 179, 3016, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, @@ -6246,7 +6206,7 @@ static const yytype_int16 yytable[] = 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, - 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, + 238, 239, 240, 0, 241, 0, 3017, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, @@ -6264,13 +6224,13 @@ static const yytype_int16 yytable[] = 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, + 394, 395, 396, 0, 397, 398, 399, 400, 401, 3018, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, - 447, 3164, 448, 449, 450, 451, 452, 453, 454, 0, + 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, @@ -6279,7 +6239,7 @@ static const yytype_int16 yytable[] = 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, - 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, + 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 3019, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, @@ -6322,7 +6282,7 @@ static const yytype_int16 yytable[] = 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, - 446, 447, 3302, 448, 449, 450, 451, 452, 453, 454, + 446, 447, 3167, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, @@ -6374,7 +6334,7 @@ static const yytype_int16 yytable[] = 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, 0, - 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, + 0, 446, 447, 3305, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, @@ -6435,9 +6395,9 @@ static const yytype_int16 yytable[] = 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, - 0, 0, 0, 1708, 1709, 1085, 0, 0, 0, 0, + 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, - 1090, 1091, 116, 2188, 815, 1043, 1044, 1045, 1046, 1047, + 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, @@ -6487,9 +6447,9 @@ static const yytype_int16 yytable[] = 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, - 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, + 0, 0, 0, 0, 1709, 1710, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, - 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, + 0, 1090, 1091, 116, 2189, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, @@ -6539,7 +6499,7 @@ static const yytype_int16 yytable[] = 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, - 0, 0, 0, 0, 0, 1083, 2271, 1085, 0, 0, + 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6591,8 +6551,8 @@ static const yytype_int16 yytable[] = 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, - 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, 0, - 0, 0, 0, 1086, 0, 2483, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1083, 2272, 1085, 0, + 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, @@ -6643,8 +6603,8 @@ static const yytype_int16 yytable[] = 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, - 1082, 0, 0, 0, 0, 0, 0, 1083, 3066, 1085, - 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, + 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, 1085, + 0, 0, 0, 0, 1086, 0, 2486, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, @@ -6655,7 +6615,7 @@ static const yytype_int16 yytable[] = 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 178, 179, 3013, 181, 182, 183, + 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, @@ -6663,7 +6623,7 @@ static const yytype_int16 yytable[] = 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, 238, 239, - 240, 0, 241, 0, 3014, 1064, 244, 245, 0, 246, + 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, @@ -6681,7 +6641,7 @@ static const yytype_int16 yytable[] = 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 399, 400, 401, 3015, 1076, 404, + 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, @@ -6695,19 +6655,19 @@ static const yytype_int16 yytable[] = 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 1084, - 1085, 0, 0, 0, 0, 1086, 0, 3016, 0, 0, + 515, 1082, 0, 0, 0, 0, 0, 0, 1083, 3069, + 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, - 131, 132, 133, 134, 135, 136, 137, 3474, 1049, 140, + 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, - 174, 175, 176, 177, 0, 178, 179, 180, 3475, 182, + 174, 175, 176, 177, 0, 178, 179, 3016, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, @@ -6715,7 +6675,7 @@ static const yytype_int16 yytable[] = 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, 238, - 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, + 239, 240, 0, 241, 0, 3017, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, @@ -6733,7 +6693,7 @@ static const yytype_int16 yytable[] = 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, + 395, 396, 0, 397, 398, 399, 400, 401, 3018, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, @@ -6741,25 +6701,25 @@ static const yytype_int16 yytable[] = 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, - 463, 464, 798, 466, 467, 3476, 469, 470, 0, 0, + 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, 0, 1083, - 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, + 1084, 1085, 0, 0, 0, 0, 1086, 0, 3019, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, - 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, + 0, 131, 132, 133, 134, 135, 136, 137, 3477, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, - 173, 174, 175, 176, 177, 0, 178, 179, 180, 3475, + 173, 174, 175, 176, 177, 0, 178, 179, 180, 3478, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, @@ -6793,7 +6753,7 @@ static const yytype_int16 yytable[] = 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, 797, - 1080, 463, 464, 798, 466, 467, 3476, 469, 470, 0, + 1080, 463, 464, 798, 466, 467, 3479, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, @@ -6809,11 +6769,11 @@ static const yytype_int16 yytable[] = 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, - 0, 156, 157, 158, 159, 786, 0, 787, 0, 162, + 0, 156, 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, - 191, 1057, 193, 0, 194, 0, 195, 196, 197, 198, + 3478, 182, 183, 184, 185, 186, 187, 188, 1056, 190, + 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, @@ -6829,7 +6789,7 @@ static const yytype_int16 yytable[] = 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, 325, 326, - 0, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, + 1071, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, @@ -6845,43 +6805,43 @@ static const yytype_int16 yytable[] = 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, 461, - 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, + 797, 1080, 463, 464, 798, 466, 467, 3479, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 0, 0, 0, 0, 0, 0, - 0, 1409, 1410, 0, 0, 0, 0, 0, 1086, 0, + 512, 513, 514, 515, 1082, 0, 0, 0, 0, 0, + 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, - -2044, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, + 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, 0, - 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, 179, - 180, 3475, 182, 183, 184, 185, 186, 187, 188, 1056, - 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, + 190, 191, 1057, 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, 235, - 236, 237, 238, -2044, 240, 0, 241, 0, 1063, 1064, + 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, - -2044, 254, 255, 256, 257, 0, 258, 259, 260, 261, + 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, - 271, 272, 1065, 1066, 0, 1067, 0, 276, 0, 0, + 271, 272, 1065, 1066, 0, 1067, 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 0, 0, - 287, 288, 289, -2044, 0, 291, 292, 293, 294, 295, + 287, 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, 325, - 326, 0, 327, 328, 0, 330, 1072, 790, 332, 1073, + 326, 0, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, @@ -6892,49 +6852,49 @@ static const yytype_int16 yytable[] = 392, 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 0, -2044, 427, + 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, 796, - 461, 797, 1080, 463, 464, 798, 466, 467, 3476, 469, + 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, -2044, 0, 0, 0, 0, - 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, + 511, 512, 513, 514, 515, 0, 0, 0, 0, 0, + 0, 0, 1410, 1411, 0, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, - 1091, 116, 1042, 815, 1043, 1044, 0, 1046, 1047, 0, + 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, - 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, + 137, -2046, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, 158, 159, 786, 0, 787, - 0, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 1056, 190, 191, 1057, 193, 0, 194, 0, 195, 196, + 179, 180, 3478, 182, 183, 184, 185, 186, 187, 188, + 1056, 190, 191, 1057, 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, - 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, + 235, 236, 237, 238, -2046, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, + 252, -2046, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, - 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, + 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, 0, + 0, 279, 280, 281, 282, 283, 284, 285, 286, 0, + 0, 287, 288, 289, -2046, 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, - 325, 326, 0, 327, 328, 329, 330, 1072, 790, 332, - 1073, 334, 335, 336, 0, 337, 338, 0, 0, 339, + 325, 326, 0, 327, 328, 0, 330, 1072, 790, 332, + 1073, 334, 335, 336, 0, 337, 338, 0, 0, 1074, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, 793, 363, @@ -6942,23 +6902,23 @@ static const yytype_int16 yytable[] = 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 399, - 400, 401, 402, 2174, 2175, 405, 406, 407, 408, 409, + 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, + 418, 419, 420, 421, 422, 423, 424, 425, 0, -2046, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, 1079, 0, 0, 458, 459, - 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, + 796, 461, 797, 1080, 463, 464, 798, 466, 467, 3479, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 0, 0, 0, 0, - 0, 0, 0, 2176, 2177, 0, 0, 0, 0, 0, + 510, 511, 512, 513, 514, 515, -2046, 0, 0, 0, + 0, 0, 0, 1083, 1084, 1085, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, - 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, + 1090, 1091, 116, 1042, 815, 1043, 1044, 0, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, @@ -6980,21 +6940,21 @@ static const yytype_int16 yytable[] = 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, - 0, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 0, 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, 325, 326, 0, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, 0, - 1074, 340, 341, 0, 0, 342, 343, 344, 345, 346, + 339, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, - 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, + 399, 400, 401, 402, 2175, 2176, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, @@ -7008,9 +6968,9 @@ static const yytype_int16 yytable[] = 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 0, 0, 0, - 0, 0, 0, 0, 1409, 1410, 0, 0, 0, 0, + 0, 0, 0, 0, 2177, 2178, 0, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, - 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 0, 1046, + 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, @@ -7028,25 +6988,25 @@ static const yytype_int16 yytable[] = 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, 238, 239, 240, 0, 241, - 3033, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, -717, 258, + 0, 1063, 1064, 244, 245, 0, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, 0, 1067, 0, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 276, 0, 278, 279, 280, 281, 282, 283, 284, 285, 286, 0, 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, 325, 326, 0, 327, 328, 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, 337, 338, 0, - 0, 339, 340, 341, 0, 0, 342, 343, 344, 345, + 0, 1074, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, @@ -7060,8 +7020,8 @@ static const yytype_int16 yytable[] = 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1086, 0, 2726, 0, 0, 0, 0, 1088, + 0, 0, 0, 0, 0, 1410, 1411, 0, 0, 0, + 0, 0, 1086, 0, 1087, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 0, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, @@ -7080,8 +7040,8 @@ static const yytype_int16 yytable[] = 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, 238, 239, 240, 0, - 241, 0, 1063, 1064, 244, 245, 0, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, + 241, 3036, 1063, 1064, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, -718, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, 0, 1067, 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, @@ -7113,7 +7073,7 @@ static const yytype_int16 yytable[] = 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1086, 0, 2726, 0, 0, 0, 0, + 0, 0, 0, 1086, 0, 2729, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, 1044, 0, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, @@ -7150,7 +7110,7 @@ static const yytype_int16 yytable[] = 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, + 0, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, @@ -7165,37 +7125,37 @@ static const yytype_int16 yytable[] = 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1086, 0, 1087, 0, 0, 0, + 0, 0, 0, 0, 1086, 0, 2729, 0, 0, 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, 1043, - 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, 0, + 1044, 0, 1046, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, 131, - 132, 133, 134, 135, 136, 137, 0, 1049, 140, 1050, + 132, 133, 134, 135, 136, 137, 138, 1049, 140, 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, 157, - 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, + 158, 159, 786, 0, 787, 0, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, 193, - 1058, 194, 0, 195, 196, 197, 198, 199, 200, 0, + 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, - 208, 209, 0, 210, 211, 212, 0, 213, 0, 215, + 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, 0, - 232, 0, 233, 234, 0, 235, 236, 237, 238, 0, + 232, 0, 233, 234, 0, 235, 236, 237, 238, 239, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, 1066, - 0, 1067, 0, 276, 0, 0, 279, 280, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 288, 289, 0, + 0, 1067, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 0, 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 1069, 321, 1070, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, - 337, 338, 0, 0, 1074, 340, 341, 0, 0, 342, + 329, 330, 1072, 790, 332, 1073, 334, 335, 336, 0, + 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, @@ -7205,7 +7165,7 @@ static const yytype_int16 yytable[] = 396, 0, 397, 398, 399, 400, 401, 402, 1076, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 1077, 430, 0, + 423, 424, 425, 0, 426, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 1078, @@ -7216,307 +7176,260 @@ static const yytype_int16 yytable[] = 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 0, 0, 0, 0, 0, 0, 0, 1083, 1084, - 1085, 0, 964, 1340, 815, 1086, 0, 1087, 1046, 0, - 0, 0, 1088, 1089, 0, 1090, 1091, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, - 125, 126, 127, 0, 0, 0, 560, 0, 0, 0, - 0, 565, 129, 130, 0, 131, 132, 133, 567, 135, - 136, 137, 568, 569, 570, 571, 572, 0, 143, 144, - 145, 146, 147, 148, 0, 0, 149, 150, 151, 152, - 576, 577, 155, 0, 156, 157, 158, 159, 579, 0, - 581, 0, 583, 163, 164, 165, 166, 167, 584, 169, - 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, - 587, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 589, 190, 191, 590, 193, 0, 194, 0, 195, - 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, - 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, - 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, - 219, 600, 221, 222, 223, 224, 225, 601, 1341, 227, - 0, 228, 229, 604, 231, 0, 232, 0, 233, 607, - 0, 609, 236, 237, 610, 611, 240, 0, 241, 0, - 614, 615, 244, 245, 0, 246, 247, 248, 249, 250, - 251, 252, 617, 254, 255, 256, 257, 0, 258, 259, - 260, 261, 262, 263, 264, 0, 265, 620, 621, 268, - 269, 270, 271, 272, 622, 623, 0, 625, 0, 276, - 627, 628, 279, 629, 281, 282, 283, 284, 285, 286, - 0, 0, 287, 632, 289, 633, 0, 291, 292, 293, - 294, 295, 296, 297, 298, 635, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 636, 637, 638, 323, - 324, 325, 639, 0, 327, 328, 641, 330, 0, 643, - 332, 644, 334, 335, 336, 0, 337, 338, 1342, 0, - 339, 340, 341, 0, 0, 342, 343, 650, 651, 346, - 652, 653, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 0, 0, 0, 0, 360, 361, 658, - 659, 364, 365, 660, 367, 368, 369, 0, 370, 371, - 372, 373, 374, 375, 0, 376, 377, 378, 663, 380, - 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, - 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, - 666, 400, 401, 402, 667, 404, 405, 406, 407, 408, - 409, 410, 411, 412, 413, 414, 415, 416, 0, 669, - 417, 418, 419, 420, 421, 422, 670, 424, 425, 0, - 672, 427, 428, 673, 430, 0, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 675, 444, - 676, 0, 0, 446, 447, 0, 448, 680, 450, 451, - 452, 453, 454, 0, 455, 682, 683, 0, 0, 458, - 459, 686, 461, 687, 1343, 463, 464, 689, 466, 467, - 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, - 475, 476, 477, 0, 478, 479, 480, 481, 482, 694, - 695, 0, 485, 697, 487, 488, 489, 490, 491, 492, - 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, - 499, 500, 702, 703, 704, 705, 706, 707, 708, 709, - 710, 711, 712, 512, 513, 514, 515, 0, 0, 0, - 0, 523, 0, 0, 1344, 1345, 2349, 0, 0, 0, - 0, 0, 0, 2350, 0, 0, 0, 0, 0, 1089, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 1000, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, -524, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, -524, - 228, 229, 230, 231, -524, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, -524, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, -524, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, -524, 337, 338, 0, 0, 339, - 340, 341, 0, -524, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, -524, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1158, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 964, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2436, 3217, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 3, 4, 0, 560, 0, 0, 0, 0, - 565, 129, 130, 0, 131, 132, 133, 567, 135, 136, - 137, 568, 569, 570, 571, 572, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 576, - 577, 155, 0, 156, 157, 158, 159, 579, 0, 581, - 0, 583, 163, 164, 165, 166, 167, 584, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 587, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 589, 190, 191, 590, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 14, 15, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 600, 221, 222, 223, 224, 225, 601, 0, 227, 0, - 228, 229, 604, 231, 0, 232, 0, 233, 607, 23, - 609, 236, 237, 610, 611, 240, 0, 241, 0, 614, - 615, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 617, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 620, 621, 268, 269, - 270, 271, 272, 622, 623, 0, 625, 0, 276, 627, - 628, 279, 629, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 632, 289, 633, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 635, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 636, 637, 638, 323, 324, - 325, 639, 0, 327, 328, 641, 330, 0, 643, 332, - 644, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 650, 651, 346, 652, - 653, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 27, 28, 29, 0, 360, 361, 658, 659, - 364, 365, 660, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 663, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 666, - 400, 401, 402, 667, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 34, 669, 417, - 418, 419, 420, 421, 422, 670, 424, 425, 36, 672, - 427, 428, 673, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 675, 444, 676, - 38, 0, 446, 447, 39, 448, 680, 450, 451, 452, - 453, 454, 0, 455, 682, 683, 0, 0, 458, 459, - 686, 461, 687, 0, 463, 464, 689, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 41, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 965, 695, - 0, 485, 697, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 45, 495, 496, 497, 498, 499, - 500, 702, 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 512, 513, 514, 515, 0, 116, 46, 549, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 47, 0, 0, 0, 117, 118, 119, 120, + 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1086, 0, 1087, 0, 0, + 0, 0, 1088, 1089, 0, 1090, 1091, 116, 1042, 815, + 1043, 1044, 1045, 1046, 1047, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, - 0, 0, 0, 0, 0, 0, 128, 129, 130, 0, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 0, 143, 144, 145, 146, 147, 148, 0, - 785, 149, 150, 151, 152, 153, 154, 155, 0, 156, - 157, 158, 159, 786, 0, 787, 0, 162, 163, 164, + 0, 0, 0, 1048, 0, 0, 128, 129, 130, 0, + 131, 132, 133, 134, 135, 136, 137, 0, 1049, 140, + 1050, 1051, 0, 143, 144, 145, 146, 147, 148, 1052, + 785, 149, 150, 151, 152, 1053, 1054, 155, 0, 156, + 157, 158, 159, 786, 0, 787, 0, 1055, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, - 14, 15, 201, 202, 203, 204, 0, 0, 205, 206, - 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, - 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 788, 0, 227, 0, 228, 229, 230, 231, - 0, 232, 0, 233, 234, 23, 235, 236, 237, 238, - 239, 240, 0, 241, 0, 242, 243, 244, 245, 0, - 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 183, 184, 185, 186, 187, 188, 1056, 190, 191, 1057, + 193, 1058, 194, 0, 195, 196, 197, 198, 199, 200, + 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, + 1059, 208, 209, 0, 210, 211, 212, 0, 213, 0, + 215, 0, 216, 217, 218, 219, 1060, 221, 222, 223, + 224, 225, 788, 1061, 227, 0, 228, 229, 1062, 231, + 0, 232, 0, 233, 234, 0, 235, 236, 237, 238, + 0, 240, 0, 241, 0, 1063, 1064, 244, 245, 0, + 246, 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, - 0, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 0, 275, 0, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 789, 0, 287, 288, 289, - 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 0, 265, 266, 267, 268, 269, 270, 271, 272, 1065, + 1066, 0, 1067, 0, 276, 0, 0, 279, 280, 281, + 282, 283, 284, 285, 286, 0, 0, 287, 288, 289, + 0, 0, 291, 292, 293, 294, 295, 296, 297, 298, + 1068, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 0, 327, - 328, 329, 330, 0, 790, 332, 333, 334, 335, 336, - 0, 337, 338, 0, 791, 339, 340, 341, 0, 0, + 319, 1069, 321, 1070, 323, 324, 325, 326, 0, 327, + 328, 0, 330, 1072, 790, 332, 1073, 334, 335, 336, + 0, 337, 338, 0, 0, 1074, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 27, 28, - 29, 0, 360, 361, 793, 363, 364, 365, 366, 367, + 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, + 0, 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, - 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, + 376, 377, 378, 1075, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 397, 398, 399, 400, 401, 402, 403, - 794, 405, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 34, 0, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 36, 426, 427, 428, 429, 430, + 395, 396, 0, 397, 398, 399, 400, 401, 402, 1076, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 0, 0, 427, 428, 1077, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 795, 38, 0, 446, 447, - 39, 448, 449, 450, 451, 452, 453, 454, 0, 455, - 456, 457, 0, 0, 458, 459, 796, 461, 797, 0, + 440, 441, 442, 443, 444, 795, 0, 0, 446, 447, + 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, + 1078, 1079, 0, 0, 458, 459, 796, 461, 797, 1080, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, - 471, 472, 473, 41, 474, 475, 476, 477, 0, 478, - 479, 480, 481, 482, 799, 484, 0, 485, 486, 487, + 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, + 479, 480, 481, 482, 483, 1081, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, - 45, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, - 514, 515, 0, 116, 46, 549, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 800, 0, + 514, 515, 0, 0, 0, 0, 0, 0, 0, 1083, + 1084, 1085, 0, 964, 1341, 815, 1086, 0, 1087, 1046, + 0, 0, 0, 1088, 1089, 0, 1090, 1091, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, - 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, - 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 0, 143, - 144, 145, 146, 147, 148, 0, 785, 149, 150, 151, - 152, 153, 154, 155, 0, 156, 157, 158, 159, 786, - 0, 787, 0, 162, 163, 164, 165, 166, 167, 168, + 0, 125, 126, 127, 0, 0, 0, 560, 0, 0, + 0, 0, 565, 129, 130, 0, 131, 132, 133, 567, + 135, 136, 137, 568, 569, 570, 571, 572, 0, 143, + 144, 145, 146, 147, 148, 0, 0, 149, 150, 151, + 152, 576, 577, 155, 0, 156, 157, 158, 159, 579, + 0, 581, 0, 583, 163, 164, 165, 166, 167, 584, 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, - 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, + 0, 587, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 589, 190, 191, 590, 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 788, 0, - 227, 0, 228, 229, 230, 231, 0, 232, 0, 233, - 234, 0, 235, 236, 237, 238, 239, 240, 0, 241, - 0, 242, 243, 244, 245, 0, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, - 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 0, 275, 0, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, - 286, 789, 0, 287, 288, 289, 290, 0, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 218, 219, 600, 221, 222, 223, 224, 225, 601, 1342, + 227, 0, 228, 229, 604, 231, 0, 232, 0, 233, + 607, 0, 609, 236, 237, 610, 611, 240, 0, 241, + 0, 614, 615, 244, 245, 0, 246, 247, 248, 249, + 250, 251, 252, 617, 254, 255, 256, 257, 0, 258, + 259, 260, 261, 262, 263, 264, 0, 265, 620, 621, + 268, 269, 270, 271, 272, 622, 623, 0, 625, 0, + 276, 627, 628, 279, 629, 281, 282, 283, 284, 285, + 286, 0, 0, 287, 632, 289, 633, 0, 291, 292, + 293, 294, 295, 296, 297, 298, 635, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 0, 327, 328, 329, 330, 0, - 790, 332, 333, 334, 335, 336, 0, 337, 338, 0, - 791, 339, 340, 341, 0, 0, 342, 343, 344, 345, - 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, + 313, 314, 315, 316, 317, 318, 319, 636, 637, 638, + 323, 324, 325, 639, 0, 327, 328, 641, 330, 0, + 643, 332, 644, 334, 335, 336, 0, 337, 338, 1343, + 0, 339, 340, 341, 0, 0, 342, 343, 650, 651, + 346, 652, 653, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, - 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, - 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, + 658, 659, 364, 365, 660, 367, 368, 369, 0, 370, + 371, 372, 373, 374, 375, 0, 376, 377, 378, 663, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, - 398, 399, 400, 401, 402, 403, 794, 405, 406, 407, + 398, 666, 400, 401, 402, 667, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, - 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 0, 426, 427, 428, 429, 430, 0, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, - 451, 452, 453, 454, 0, 455, 456, 457, 0, 0, - 458, 459, 796, 461, 797, 0, 463, 464, 798, 466, + 669, 417, 418, 419, 420, 421, 422, 670, 424, 425, + 0, 672, 427, 428, 673, 430, 0, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 675, + 444, 676, 0, 0, 446, 447, 0, 448, 680, 450, + 451, 452, 453, 454, 0, 455, 682, 683, 0, 0, + 458, 459, 686, 461, 687, 1344, 463, 464, 689, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, - 799, 484, 0, 485, 486, 487, 488, 489, 490, 491, + 694, 695, 0, 485, 697, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, 512, 513, 514, 515, 116, 0, + 498, 499, 500, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 512, 513, 514, 515, 0, 0, + 0, 0, 523, 0, 0, 1345, 1346, 2350, 0, 0, + 0, 0, 2351, 0, 2352, 0, 0, 0, 0, 0, + 1089, 117, 118, 119, 120, 121, 122, 123, 124, 0, + 125, 126, 127, 0, 0, 0, 0, 0, 0, 1000, + 0, 0, 129, 130, 0, 131, 132, 133, 0, 135, + 136, 137, 138, 139, 0, 141, 142, 0, 143, 144, + 145, 146, 147, 148, 0, 0, 149, 150, 151, 152, + 153, 154, 155, 0, 156, 157, 158, 159, 160, 0, + 0, 0, 162, 163, 164, 165, 166, 167, 0, 169, + 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, + 0, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 0, 194, 0, 195, + 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, + 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, + 211, 212, 0, 213, 214, 215, -525, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 0, 227, + -525, 228, 229, 230, 231, -525, 232, 0, 233, 0, + 0, 0, 236, 237, 524, 0, 240, 0, 241, 0, + 242, 243, 244, 245, 0, 246, 247, 248, 249, 250, + 251, 252, 0, 254, 255, 256, 257, 0, 258, 259, + 260, 261, 262, 263, 264, 0, 265, 0, 267, 268, + 269, 270, 271, 272, 273, 274, -525, 275, 0, 276, + 0, 0, 279, 0, 281, 282, 283, 284, 285, 286, + 0, 0, 287, 0, 289, 0, -525, 291, 292, 293, + 294, 295, 296, 297, 298, 525, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 0, 322, 323, + 324, 325, 326, 0, 327, 328, 0, 330, 0, 331, + 332, 333, 334, 335, 336, -525, 337, 338, 0, 0, + 339, 340, 341, 0, -525, 342, 343, 344, 0, 346, + 0, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 0, 0, 0, 0, 360, 361, 362, + 0, 364, 365, 366, 367, 368, 369, 0, 370, 371, + 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, + 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, + 0, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, + 0, 427, 428, 429, 430, 0, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 526, 444, + 445, 0, 0, 446, 447, 0, 448, 0, 450, 451, + 452, 453, 454, 0, 455, 456, 457, 0, 0, 458, + 459, 460, 461, 462, 0, 463, 464, 465, 466, 467, + 468, 469, 470, -525, 0, 471, 472, 473, 0, 474, + 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, + 484, 0, 485, 0, 487, 488, 489, 490, 491, 492, + 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 800, 0, 0, 117, 118, 119, + 0, 0, 0, 0, 1159, 0, 117, 118, 119, 120, + 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, + 131, 132, 133, 0, 135, 136, 137, 138, 139, 0, + 141, 142, 0, 143, 144, 145, 146, 147, 148, 0, + 0, 149, 150, 151, 152, 153, 154, 155, 0, 156, + 157, 158, 159, 160, 0, 0, 0, 162, 163, 164, + 165, 166, 167, 0, 169, 170, 171, 0, 172, 173, + 174, 175, 176, 177, 0, 0, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, + 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, + 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 0, 227, 0, 228, 229, 230, 231, + 0, 232, 0, 233, 0, 0, 0, 236, 237, 524, + 0, 240, 0, 241, 0, 242, 243, 244, 245, 0, + 246, 247, 248, 249, 250, 251, 252, 0, 254, 255, + 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, + 0, 265, 0, 267, 268, 269, 270, 271, 272, 273, + 274, 0, 275, 0, 276, 0, 0, 279, 0, 281, + 282, 283, 284, 285, 286, 0, 0, 287, 0, 289, + 0, 0, 291, 292, 293, 294, 295, 296, 297, 298, + 525, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 0, 322, 323, 324, 325, 326, 0, 327, + 328, 0, 330, 0, 331, 332, 333, 334, 335, 336, + 0, 337, 338, 0, 0, 339, 340, 341, 0, 0, + 342, 343, 344, 0, 346, 0, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, + 0, 0, 360, 361, 362, 0, 364, 365, 366, 367, + 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, + 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 397, 398, 0, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 0, 0, 427, 428, 429, 430, + 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 526, 444, 445, 0, 0, 446, 447, + 0, 448, 0, 450, 451, 452, 453, 454, 0, 455, + 456, 457, 0, 0, 458, 459, 460, 461, 462, 0, + 463, 464, 465, 466, 467, 468, 469, 470, 0, 0, + 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, + 479, 480, 481, 482, 483, 484, 0, 485, 0, 487, + 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, + 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 964, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2439, 3220, + 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, + 125, 126, 127, 3, 4, 0, 560, 0, 0, 0, + 0, 565, 129, 130, 0, 131, 132, 133, 567, 135, + 136, 137, 568, 569, 570, 571, 572, 0, 143, 144, + 145, 146, 147, 148, 0, 0, 149, 150, 151, 152, + 576, 577, 155, 0, 156, 157, 158, 159, 579, 0, + 581, 0, 583, 163, 164, 165, 166, 167, 584, 169, + 170, 171, 0, 172, 173, 174, 175, 176, 177, 0, + 587, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 589, 190, 191, 590, 193, 0, 194, 0, 195, + 196, 197, 198, 199, 200, 14, 15, 201, 202, 203, + 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, + 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, + 219, 600, 221, 222, 223, 224, 225, 601, 0, 227, + 0, 228, 229, 604, 231, 0, 232, 0, 233, 607, + 23, 609, 236, 237, 610, 611, 240, 0, 241, 0, + 614, 615, 244, 245, 0, 246, 247, 248, 249, 250, + 251, 252, 617, 254, 255, 256, 257, 0, 258, 259, + 260, 261, 262, 263, 264, 0, 265, 620, 621, 268, + 269, 270, 271, 272, 622, 623, 0, 625, 0, 276, + 627, 628, 279, 629, 281, 282, 283, 284, 285, 286, + 0, 0, 287, 632, 289, 633, 0, 291, 292, 293, + 294, 295, 296, 297, 298, 635, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 636, 637, 638, 323, + 324, 325, 639, 0, 327, 328, 641, 330, 0, 643, + 332, 644, 334, 335, 336, 0, 337, 338, 0, 0, + 339, 340, 341, 0, 0, 342, 343, 650, 651, 346, + 652, 653, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 27, 28, 29, 0, 360, 361, 658, + 659, 364, 365, 660, 367, 368, 369, 0, 370, 371, + 372, 373, 374, 375, 0, 376, 377, 378, 663, 380, + 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, + 666, 400, 401, 402, 667, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 34, 669, + 417, 418, 419, 420, 421, 422, 670, 424, 425, 36, + 672, 427, 428, 673, 430, 0, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 675, 444, + 676, 38, 0, 446, 447, 39, 448, 680, 450, 451, + 452, 453, 454, 0, 455, 682, 683, 0, 0, 458, + 459, 686, 461, 687, 0, 463, 464, 689, 466, 467, + 468, 469, 470, 0, 0, 471, 472, 473, 41, 474, + 475, 476, 477, 0, 478, 479, 480, 481, 482, 965, + 695, 0, 485, 697, 487, 488, 489, 490, 491, 492, + 493, 0, 0, 494, 0, 45, 495, 496, 497, 498, + 499, 500, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 512, 513, 514, 515, 0, 116, 46, + 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 47, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, 139, @@ -7527,392 +7440,194 @@ static const yytype_int16 yytable[] = 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, 199, - 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, + 200, 14, 15, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 788, 0, 227, 0, 228, 229, 230, - 231, 0, 232, 0, 233, 234, 0, 235, 236, 237, + 231, 0, 232, 0, 233, 234, 23, 235, 236, 237, 238, 239, 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, 0, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 0, 0, 287, 288, + 281, 282, 283, 284, 285, 286, 789, 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 0, 327, 328, 329, 330, 0, 790, 332, 333, 334, 335, - 336, 0, 337, 338, 0, 0, 339, 340, 341, 0, + 336, 0, 337, 338, 0, 791, 339, 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, - 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 27, + 28, 29, 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, 402, 403, 794, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 0, 426, 427, 428, 429, + 413, 414, 415, 416, 34, 0, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 36, 426, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 795, 0, 0, 446, - 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, + 439, 440, 441, 442, 443, 444, 795, 38, 0, 446, + 447, 39, 448, 449, 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, 796, 461, 797, 0, 463, 464, 798, 466, 467, 468, 469, 470, 0, - 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, - 478, 479, 480, 481, 482, 483, 484, 0, 485, 486, + 0, 471, 472, 473, 41, 474, 475, 476, 477, 0, + 478, 479, 480, 481, 482, 799, 484, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, - 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, + 0, 45, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, - 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, - 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, - 0, 0, 128, 129, 130, 0, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 0, 143, - 144, 145, 146, 147, 148, 0, 785, 149, 150, 151, - 152, 153, 154, 155, 0, 156, 157, 158, 159, 786, - 0, 787, 0, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, - 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, - 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, - 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, - 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 788, 0, - 227, 0, 228, 229, 230, 231, 0, 232, 0, 233, - 234, 0, 235, 236, 237, 238, 239, 240, 0, 241, - 0, 242, 243, 244, 245, 0, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, - 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 0, 275, 0, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, - 286, 0, 0, 287, 288, 289, 290, 0, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 0, 327, 328, 329, 330, 0, - 790, 332, 333, 334, 335, 336, 0, 337, 338, 0, - 0, 339, 340, 341, 0, 0, 342, 343, 344, 345, - 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, - 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, - 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, - 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, - 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, - 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, - 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 0, 426, 427, 428, 429, 430, 0, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, - 451, 452, 453, 454, 0, 455, 456, 457, 0, 0, - 458, 459, 796, 461, 797, 0, 463, 464, 798, 466, - 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, - 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, - 483, 484, 0, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, 512, 513, 514, 515, 523, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3305, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, - 0, 131, 132, 133, 0, 135, 136, 137, 138, 139, - 0, 141, 142, 0, 143, 144, 145, 146, 147, 148, - 0, 0, 149, 150, 151, 152, 153, 154, 155, 0, - 156, 157, 158, 159, 160, 0, 0, 0, 162, 163, - 164, 165, 166, 167, 0, 169, 170, 171, 0, 172, - 173, 174, 175, 176, 177, 0, 0, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 0, 194, 0, 195, 196, 197, 198, 199, - 200, 14, 15, 201, 202, 203, 204, 0, 0, 205, - 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, - 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 0, 227, 0, 228, 229, 230, - 231, 0, 232, 0, 233, 0, 23, 0, 236, 237, - 524, 0, 240, 0, 241, 0, 242, 243, 244, 245, - 0, 246, 247, 248, 249, 250, 251, 252, 0, 254, - 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, - 264, 0, 265, 0, 267, 268, 269, 270, 271, 272, - 273, 274, 0, 275, 0, 276, 0, 0, 279, 0, - 281, 282, 283, 284, 285, 286, 0, 0, 287, 0, - 289, 0, 0, 291, 292, 293, 294, 295, 296, 297, - 298, 525, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 0, 322, 323, 324, 325, 326, 0, - 327, 328, 0, 330, 0, 331, 332, 333, 334, 335, - 336, 0, 337, 338, 0, 0, 339, 340, 341, 0, - 0, 342, 343, 344, 0, 346, 0, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 359, 27, - 28, 29, 0, 360, 361, 362, 0, 364, 365, 366, - 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, - 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, - 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 0, 397, 398, 0, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 34, 0, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 36, 0, 427, 428, 429, - 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 526, 444, 445, 38, 0, 446, - 447, 39, 448, 0, 450, 451, 452, 453, 454, 0, - 455, 456, 457, 0, 0, 458, 459, 460, 461, 462, - 0, 463, 464, 465, 466, 467, 468, 469, 470, 0, - 0, 471, 472, 473, 41, 474, 475, 476, 477, 0, - 478, 479, 480, 481, 482, 799, 484, 0, 485, 0, - 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, - 0, 45, 495, 496, 497, 498, 499, 500, 501, 502, - 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 523, 0, 46, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, - 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, - 886, 125, 126, 127, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 129, 130, 0, 131, 132, 133, 0, - 135, 136, 137, 138, 139, 0, 141, 142, 0, 143, - 144, 145, 146, 147, 148, 0, 0, 149, 150, 151, - 152, 153, 154, 155, 0, 156, 157, 158, 159, 160, - 0, 0, 0, 162, 163, 164, 165, 166, 167, 0, - 169, 170, 171, 0, 172, 173, 174, 175, 176, 177, - 0, 0, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, - 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, - 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, - 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 0, - 227, 0, 228, 229, 230, 231, 0, 232, 0, 233, - 0, 23, 0, 236, 237, 524, 0, 240, 0, 241, - 0, 242, 243, 244, 245, 0, 246, 247, 248, 249, - 250, 251, 252, 0, 254, 255, 256, 257, 0, 258, - 259, 260, 261, 262, 263, 264, 0, 265, 0, 267, - 268, 269, 270, 271, 272, 273, 274, 0, 275, 0, - 276, 0, 0, 279, 0, 281, 282, 283, 284, 285, - 286, 0, 0, 287, 0, 289, 0, 0, 291, 292, - 293, 294, 295, 296, 297, 298, 525, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 0, 322, - 323, 324, 325, 326, 0, 327, 328, 0, 330, 0, - 331, 332, 333, 334, 335, 336, 0, 337, 338, 0, - 0, 339, 340, 341, 0, 0, 342, 343, 344, 0, - 346, 0, 348, 349, 350, 351, 352, 353, 354, 355, - 356, 357, 358, 359, 27, 28, 29, 0, 360, 361, - 362, 0, 364, 365, 366, 367, 368, 369, 0, 370, - 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, - 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, - 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, - 398, 0, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, 412, 413, 414, 415, 416, 34, - 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 0, 0, 427, 428, 429, 430, 0, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 526, - 444, 445, 0, 0, 446, 447, 39, 448, 0, 450, - 451, 452, 453, 454, 0, 455, 887, 457, 0, 0, - 888, 459, 460, 461, 462, 0, 463, 464, 465, 466, - 467, 468, 469, 470, 0, 0, 471, 472, 473, 41, - 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, - 799, 484, 0, 485, 0, 487, 488, 489, 490, 491, - 492, 493, 0, 0, 494, 0, 45, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, 512, 513, 514, 515, 523, 0, - 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 47, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, - 0, 131, 132, 133, 0, 135, 136, 137, 138, 139, - 0, 141, 142, 0, 143, 144, 145, 146, 147, 148, - 0, 0, 149, 150, 151, 152, 153, 154, 155, 0, - 156, 157, 158, 159, 160, 0, 0, 0, 162, 163, - 164, 165, 166, 167, 0, 169, 170, 171, 0, 172, - 173, 174, 175, 176, 177, 0, 0, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 0, 194, 0, 195, 196, 197, 198, 199, - 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, - 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, - 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 0, 227, 0, 228, 229, 230, - 231, 0, 232, 0, 233, 0, 23, 0, 236, 237, - 524, 0, 240, 0, 241, 0, 242, 243, 244, 245, - 0, 246, 247, 248, 249, 250, 251, 252, 0, 254, - 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, - 264, 0, 265, 0, 267, 268, 269, 270, 271, 272, - 273, 274, 0, 275, 0, 276, 0, 0, 279, 0, - 281, 282, 283, 284, 285, 286, 0, 0, 287, 0, - 289, 0, 0, 291, 292, 293, 294, 295, 296, 297, - 298, 525, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 0, 322, 323, 324, 325, 326, 0, - 327, 328, 0, 330, 0, 331, 332, 333, 334, 335, - 336, 0, 337, 338, 0, 0, 339, 340, 341, 0, - 0, 342, 343, 344, 0, 346, 0, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 359, 27, - 28, 29, 0, 360, 361, 362, 0, 364, 365, 366, - 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, - 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, - 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 0, 397, 398, 0, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 34, 0, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 0, 0, 427, 428, 429, - 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 526, 444, 445, 0, 0, 446, - 447, 39, 448, 0, 450, 451, 452, 453, 454, 0, - 455, 456, 457, 0, 0, 458, 459, 460, 461, 462, - 0, 463, 464, 465, 466, 467, 468, 469, 470, 0, - 0, 471, 472, 473, 41, 474, 475, 476, 477, 0, - 478, 479, 480, 481, 482, 799, 484, 0, 485, 0, - 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, - 0, 45, 495, 496, 497, 498, 499, 500, 501, 502, - 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 0, 523, 46, 549, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, + 513, 514, 515, 0, 116, 46, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 800, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, - 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, - 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 0, 0, 0, 128, 129, 130, 0, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 785, 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, - 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, - 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, - 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 786, 0, 787, 0, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 788, 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, - 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 233, 234, 0, 235, 236, 237, 238, 239, 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, - 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, - 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, - 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, - 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, - 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 789, 0, 287, 288, 289, 290, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, - 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, - 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, - 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, - 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 0, 327, 328, 329, 330, + 0, 790, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 791, 339, 340, 341, 0, 0, 342, 343, 344, + 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, - 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, - 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 397, 398, 399, 400, 401, 402, 403, 794, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 425, 0, 426, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, - 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 0, 458, 459, 796, 461, 797, 0, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, - 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 482, 799, 484, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, - 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, - 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 985, 0, 0, 117, 118, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 800, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, - 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, - 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, - 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, - 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, - 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, - 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, + 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 785, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 786, 0, 787, 0, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, - 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, - 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, - 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 222, 223, 224, 225, 788, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 234, 0, 235, 236, + 237, 238, 239, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, - 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, - 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, - 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, - 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, - 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, - 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 0, 327, 328, 329, 330, 0, 790, 332, 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, - 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 0, 0, 342, 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, - 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 0, 0, 0, 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, + 402, 403, 794, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, - 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, - 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, - 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 438, 439, 440, 441, 442, 443, 444, 795, 0, 0, + 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 796, 461, + 797, 0, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, - 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 512, 513, 514, 515, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1463, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 47, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, - 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, - 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 0, 0, 0, 128, 129, 130, 0, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 785, 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, - 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, - 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, - 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 786, 0, 787, 0, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 788, 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, - 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 233, 234, 0, 235, 236, 237, 238, 239, 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, - 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, - 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, - 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, - 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, - 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 288, 289, 290, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, - 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, - 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 0, 327, 328, 329, 330, + 0, 790, 332, 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, - 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, - 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, - 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 425, 0, 426, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, - 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 0, 458, 459, 796, 461, 797, 0, 463, 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, - 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 482, 483, 484, 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, - 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2200, 0, 0, 117, 118, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3308, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, @@ -7923,11 +7638,11 @@ static const yytype_int16 yytable[] = 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, - 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 199, 200, 14, 15, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, - 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 230, 231, 0, 232, 0, 233, 0, 23, 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, @@ -7942,28 +7657,28 @@ static const yytype_int16 yytable[] = 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, - 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 27, 28, 29, 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 412, 413, 414, 415, 416, 34, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 36, 0, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, - 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 438, 439, 440, 441, 442, 526, 444, 445, 38, 0, + 446, 447, 39, 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, - 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, - 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 0, 471, 472, 473, 41, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 799, 484, 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, - 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 494, 0, 45, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 512, 513, 514, 515, 523, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2436, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 47, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 886, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, @@ -7977,7 +7692,7 @@ static const yytype_int16 yytable[] = 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, - 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 233, 0, 23, 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, @@ -7991,27 +7706,27 @@ static const yytype_int16 yytable[] = 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 355, 356, 357, 358, 359, 27, 28, 29, 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 34, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, - 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, - 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 526, 444, 445, 0, 0, 446, 447, 39, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 887, 457, 0, + 0, 888, 459, 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, - 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, - 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, - 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 41, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 799, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 45, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, - 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2567, 0, 0, 117, 118, + 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 47, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, @@ -8026,7 +7741,7 @@ static const yytype_int16 yytable[] = 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, - 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 230, 231, 0, 232, 0, 233, 0, 23, 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, @@ -8041,485 +7756,76 @@ static const yytype_int16 yytable[] = 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, - 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 27, 28, 29, 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 412, 413, 414, 415, 416, 34, 0, 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, - 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 446, 447, 39, 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, - 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, - 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 0, 471, 472, 473, 41, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 799, 484, 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, - 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 494, 0, 45, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, + 512, 513, 514, 515, 0, 523, 46, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3212, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, - 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, - 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, - 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, - 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, - 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, - 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, - 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, - 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, - 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, - 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, - 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, - 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, - 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, - 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, - 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, - 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, - 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, - 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, - 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, - 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, - 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, - 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, - 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, - 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, - 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, - 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, - 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, - 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, - 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, - 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, - 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, - 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, - 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, - 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2057, 0, 0, 117, 118, - 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, - 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, - 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, - 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, - 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, - 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, - 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, - 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, - 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, - 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, - 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, - 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, - 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, - 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, - 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, - 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, - 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, - 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, - 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, - 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, - 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, - 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, - 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, - 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, - 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, - 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, - 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, - 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, - 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, - 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, - 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, - 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, - 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, - 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, - 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2160, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, - 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, - 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, - 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, - 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, - 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, - 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, - 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, - 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, - 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, - 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, - 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, - 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, - 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, - 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, - 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, - 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, - 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, - 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, - 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, - 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, - 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, - 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, - 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, - 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, - 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, - 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, - 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, - 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, - 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, - 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, - 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, - 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, - 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, - 507, 508, 509, 510, 511, 512, 513, 514, 515, 0, - 2892, 1340, 815, 0, 0, 2033, 1046, 0, 0, 0, - 0, 0, 2034, 2035, 0, 3073, 2036, 2037, 2038, 117, - 118, 119, 120, 121, 122, 123, 124, 556, 125, 126, - 127, 557, 558, 559, 2893, 561, 562, 563, 564, 2894, - 129, 130, 566, 131, 132, 133, 2895, 135, 136, 137, - 0, 1479, 2896, 1481, 1482, 573, 143, 144, 145, 146, - 147, 148, 574, 575, 149, 150, 151, 152, 1483, 1484, - 155, 578, 156, 157, 158, 159, 0, 580, 2897, 582, - 2898, 163, 164, 165, 166, 167, 2899, 169, 170, 171, - 585, 172, 173, 174, 175, 176, 177, 586, 2900, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 1489, - 190, 191, 1490, 193, 591, 194, 592, 195, 196, 197, - 198, 199, 200, 593, 594, 201, 202, 203, 204, 595, - 596, 205, 206, 1059, 208, 209, 597, 210, 211, 212, - 598, 213, 214, 215, 599, 216, 217, 218, 219, 0, - 221, 222, 223, 224, 225, 0, 602, 227, 603, 228, - 229, 1491, 231, 605, 232, 606, 233, 2901, 608, 2902, - 236, 237, 2903, 2904, 240, 612, 241, 613, 0, 0, - 244, 245, 616, 246, 247, 248, 249, 250, 251, 252, - 2905, 254, 255, 256, 257, 618, 258, 259, 260, 261, - 262, 263, 264, 619, 265, 2906, 0, 268, 269, 270, - 271, 272, 1497, 1498, 624, 1499, 626, 276, 2907, 2908, - 279, 2909, 281, 282, 283, 284, 285, 286, 630, 631, - 287, 2910, 289, 2911, 634, 291, 292, 293, 294, 295, - 296, 297, 298, 2912, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 1506, 2913, 1508, 323, 324, 325, - 2914, 640, 327, 328, 2915, 330, 642, 0, 332, 1510, - 334, 335, 336, 645, 337, 338, 646, 647, 2916, 340, - 341, 648, 649, 342, 343, 0, 2917, 346, 2918, 0, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 654, 655, 656, 657, 360, 361, 0, 2919, 364, - 365, 0, 367, 368, 369, 661, 370, 371, 372, 373, - 374, 375, 662, 376, 377, 378, 1514, 380, 381, 382, - 383, 664, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 665, 397, 398, 2920, 400, - 401, 402, 1516, 404, 405, 406, 407, 408, 409, 410, - 411, 412, 413, 414, 415, 416, 668, 2921, 417, 418, - 419, 420, 421, 422, 2922, 424, 425, 671, 2923, 427, - 428, 1520, 430, 674, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 2924, 444, 0, 677, - 678, 446, 447, 679, 448, 2925, 450, 451, 452, 453, - 454, 681, 455, 1523, 1524, 684, 685, 458, 459, 0, - 461, 0, 688, 463, 464, 2926, 466, 467, 468, 469, - 470, 2927, 691, 471, 472, 473, 692, 474, 475, 476, - 477, 693, 478, 479, 480, 481, 482, 0, 1527, 696, - 485, 2928, 487, 488, 489, 490, 491, 492, 493, 698, - 699, 494, 700, 701, 495, 496, 497, 498, 499, 500, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 512, 513, 514, 515, 0, 523, 0, 2039, 2040, - 2041, 2033, 2929, 2930, 2044, 2045, 2046, 2047, 2034, 2035, - 0, 0, 2036, 2037, 2038, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 0, 0, 0, 2039, 2040, 2041, 0, 2042, 2043, - 2044, 2045, 2046, 2047, 1610, 0, 0, 1611, 0, 0, - 0, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1619, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1621, 1610, 0, 0, 1611, 0, 0, 1622, - 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1619, 0, 0, 0, 0, 1623, 0, 0, 0, - 0, 1621, 1610, 0, 0, 1611, 0, 0, 1622, 1612, - 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1619, 0, 0, 0, 0, 1623, 0, 0, 0, 0, - 1621, 0, 0, 0, 0, 0, 0, 1622, 0, 1610, - 0, 0, 1611, 0, 0, 0, 1612, 1613, 1614, 1615, - 1616, 1617, 1618, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1623, 0, 0, 1619, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1621, 1610, 0, - 0, 1611, 1624, 0, 1622, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 0, 0, 0, 0, 0, 0, 0, 1625, - 0, 0, 0, 0, 1626, 0, 1619, 0, 0, 0, - 0, 1623, 0, 0, 0, 0, 1621, 0, 0, 0, - 0, 1624, 0, 1622, 0, 0, 0, 1627, 1628, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1625, 0, - 0, 0, 1629, 1626, 0, 0, 0, 0, 0, 0, - 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1624, 0, 0, 0, 0, 0, 1627, 1628, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1625, 0, 0, - 1630, 1629, 1626, 1631, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1632, 0, 0, - 1633, 0, 0, 0, 0, 1627, 1628, 1624, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1630, - 1629, 0, 1631, 0, 1625, 0, 0, 0, 0, 1626, - 0, 0, 0, 0, 0, 0, 1632, 0, 0, 1633, - 0, 0, 0, 0, 0, 0, 1624, 0, 0, 0, - 0, 0, 1627, 1628, 0, 0, 0, 0, 1630, 0, - 0, 1631, 0, 1625, 0, 0, 0, 1629, 1626, 0, - 0, 0, 0, 0, 0, 1632, 0, 0, 1633, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1627, 1628, 0, 0, 0, 0, 1634, 0, 0, - 0, 0, 0, 0, 0, 1630, 1629, 0, 1631, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1632, 0, 0, 1633, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1634, 0, 0, 0, - 0, 0, 0, 0, 1630, 0, 0, 1631, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1632, 0, 0, 1633, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1634, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1635, 0, 0, 1636, 1637, 1638, - 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, 0, 0, - 0, 2838, 1634, 0, 0, 0, 0, 0, 1610, 0, - 0, 1611, 0, 0, 0, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 0, 1635, 0, 0, 1636, 1637, 1638, 0, - 1639, 1640, 1641, 1642, 1643, 1644, 1619, 0, 0, 0, - 3065, 1634, 0, 0, 0, 0, 1621, 0, 0, 0, - 0, 0, 0, 1622, 0, 0, 0, 0, 0, 0, - 0, 0, 1635, 0, 0, 1636, 1637, 1638, 0, 1639, - 1640, 1641, 1642, 1643, 1644, 0, 0, 0, 0, 3072, - 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1610, 0, 0, 1611, 0, 0, - 0, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 1635, - 0, 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, - 1643, 1644, 1619, 0, 0, 0, 3232, 0, 0, 0, - 0, 0, 1621, 1610, 0, 0, 1611, 0, 0, 1622, - 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 1635, 0, - 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, - 1644, 1619, 0, 0, 0, 3254, 1623, 0, 0, 0, - 0, 1621, 1610, 0, 0, 1611, 1624, 0, 1622, 1612, - 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, 0, - 0, 0, 0, 1625, 0, 0, 0, 0, 1626, 0, - 1619, 0, 0, 0, 0, 1623, 0, 0, 0, 0, - 1621, 0, 0, 0, 0, 0, 0, 1622, 0, 0, - 0, 1627, 1628, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1629, 0, 0, 0, - 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1610, 0, - 0, 1611, 1624, 0, 0, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 0, 0, 1630, 0, 0, 1631, 0, 1625, - 0, 0, 0, 0, 1626, 0, 1619, 0, 0, 0, - 0, 1632, 0, 0, 1633, 0, 1621, 0, 0, 0, - 0, 1624, 0, 1622, 0, 0, 0, 1627, 1628, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1625, 0, - 0, 0, 1629, 1626, 0, 0, 0, 0, 0, 0, - 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1624, 0, 0, 0, 0, 0, 1627, 1628, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1625, 0, 0, - 1630, 1629, 1626, 1631, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1632, 0, 0, - 1633, 0, 0, 0, 0, 1627, 1628, 0, 0, 0, - 0, 1634, 0, 0, 0, 0, 0, 0, 0, 1630, - 1629, 0, 1631, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1632, 0, 0, 1633, - 0, 0, 0, 0, 0, 0, 1624, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1630, 0, - 0, 1631, 0, 1625, 0, 0, 0, 0, 1626, 0, - 0, 0, 0, 0, 0, 1632, 0, 0, 1633, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1627, 1628, 0, 0, 0, 0, 1634, 0, 0, - 0, 0, 0, 0, 0, 0, 1629, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1635, 0, - 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, - 1644, 0, 0, 0, 0, 3355, 1634, 0, 0, 0, - 0, 0, 0, 0, 1630, 0, 1610, 1631, 0, 1611, - 0, 0, 0, 1612, 1613, 1614, 1615, 1616, 1617, 1618, - 0, 1632, 0, 0, 1633, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1619, 1634, 717, 0, 0, 0, - 0, 0, 0, 0, 1621, 0, 0, 0, 0, 0, - 0, 1622, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1635, 0, 0, 1636, 1637, 1638, - 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, 1623, 0, - 0, 3412, 0, 0, 0, 0, 0, 0, 1610, 0, - 0, 1611, 0, 718, 0, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 0, 1635, 0, 0, 1636, 1637, 1638, 719, - 1639, 1640, 1641, 1642, 1643, 1644, 1619, 0, 0, 0, - 3434, 1634, 0, 0, 0, 0, 1621, 0, 0, 0, - 0, 0, 0, 1622, 0, 0, 0, 0, 0, 0, - 0, 0, 1635, 0, 0, 1636, 1637, 1638, 0, 1639, - 1640, 1641, 1642, 1643, 1644, 0, 0, 1795, 720, 0, - 1623, 0, 0, 0, 0, 0, 0, 0, 721, 0, - 0, 0, 0, 0, 1624, 0, 0, 0, 0, 0, - 722, 0, 0, 0, 0, 723, 0, 0, 0, 0, - 0, 1625, 0, 0, 0, 0, 1626, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 724, 0, 0, 0, 0, 1627, - 1628, 0, 0, 0, 0, 0, 0, 0, 1635, 0, - 0, 1636, 1637, 1638, 1629, 1639, 1640, 1641, 1642, 1643, - 1644, 0, 0, 2792, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1624, 725, 0, 0, - 0, 726, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1630, 1625, 0, 1631, 0, 0, 1626, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1632, - 0, 0, 1633, 0, 0, 0, 0, 0, 0, 0, - 0, 1627, 1628, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1629, 0, 0, 0, - 0, 0, 0, 0, 0, 539, 0, 0, 0, 0, - 0, 727, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 728, 0, 0, 0, - 0, 0, 0, 0, 1630, 0, 0, 1631, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1632, 0, 0, 1633, 0, 0, 0, 0, 729, - 0, 0, 730, 0, 0, 0, 0, 0, 0, 1634, - 0, 0, 0, 731, 0, 0, 732, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 733, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 734, 0, - 0, 0, 0, 0, 735, 736, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, - 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1634, 0, 0, 0, 0, 0, 0, 739, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1635, 0, 0, 1636, - 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, - 0, 3222, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 555, 0, 0, 1635, 0, - 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, - 1644, 0, 0, 3396, 117, 118, 119, 120, 121, 122, - 123, 124, 556, 125, 126, 127, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 129, 130, 566, 131, 132, - 133, 567, 135, 136, 137, 568, 569, 570, 571, 572, - 573, 143, 144, 145, 146, 147, 148, 574, 575, 149, - 150, 151, 152, 576, 577, 155, 578, 156, 157, 158, - 159, 579, 580, 581, 582, 583, 163, 164, 165, 166, - 167, 584, 169, 170, 171, 585, 172, 173, 174, 175, - 176, 177, 586, 587, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 589, 190, 191, 590, 193, 591, - 194, 592, 195, 196, 197, 198, 199, 200, 593, 594, - 201, 202, 203, 204, 595, 596, 205, 206, 207, 208, - 209, 597, 210, 211, 212, 598, 213, 214, 215, 599, - 216, 217, 218, 219, 600, 221, 222, 223, 224, 225, - 601, 602, 227, 603, 228, 229, 604, 231, 605, 232, - 606, 233, 607, 608, 609, 236, 237, 610, 611, 240, - 612, 241, 613, 614, 615, 244, 245, 616, 246, 247, - 248, 249, 250, 251, 252, 617, 254, 255, 256, 257, - 618, 258, 259, 260, 261, 262, 263, 264, 619, 265, - 620, 621, 268, 269, 270, 271, 272, 622, 623, 624, - 625, 626, 276, 627, 628, 279, 629, 281, 282, 283, - 284, 285, 286, 630, 631, 287, 632, 289, 633, 634, - 291, 292, 293, 294, 295, 296, 297, 298, 635, 300, + 47, 0, 0, 0, 117, 118, 119, 120, 121, 122, + 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, + 133, 0, 135, 136, 137, 138, 139, 0, 141, 142, + 0, 143, 144, 145, 146, 147, 148, 0, 0, 149, + 150, 151, 152, 153, 154, 155, 0, 156, 157, 158, + 159, 160, 0, 0, 0, 162, 163, 164, 165, 166, + 167, 0, 169, 170, 171, 0, 172, 173, 174, 175, + 176, 177, 0, 0, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, + 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, + 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, + 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 0, 227, 0, 228, 229, 230, 231, 0, 232, + 0, 233, 0, 0, 0, 236, 237, 524, 0, 240, + 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, + 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, + 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, + 0, 267, 268, 269, 270, 271, 272, 273, 274, 0, + 275, 0, 276, 0, 0, 279, 0, 281, 282, 283, + 284, 285, 286, 0, 0, 287, 0, 289, 0, 0, + 291, 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, 319, 636, - 637, 638, 323, 324, 325, 639, 640, 327, 328, 641, - 330, 642, 643, 332, 644, 334, 335, 336, 645, 337, - 338, 646, 647, 339, 340, 341, 648, 649, 342, 343, - 650, 651, 346, 652, 653, 349, 350, 351, 352, 353, - 354, 355, 356, 357, 358, 359, 654, 655, 656, 657, - 360, 361, 658, 659, 364, 365, 660, 367, 368, 369, - 661, 370, 371, 372, 373, 374, 375, 662, 376, 377, - 378, 663, 380, 381, 382, 383, 664, 384, 385, 386, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 0, 322, 323, 324, 325, 326, 0, 327, 328, 0, + 330, 0, 331, 332, 333, 334, 335, 336, 0, 337, + 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, + 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, + 360, 361, 362, 0, 364, 365, 366, 367, 368, 369, + 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, + 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 665, 397, 398, 666, 400, 401, 402, 667, 404, 405, + 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, - 416, 668, 669, 417, 418, 419, 420, 421, 422, 670, - 424, 425, 671, 672, 427, 428, 673, 430, 674, 431, + 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 675, 444, 676, 677, 678, 446, 447, 679, 448, - 680, 450, 451, 452, 453, 454, 681, 455, 682, 683, - 684, 685, 458, 459, 686, 461, 687, 688, 463, 464, - 689, 466, 467, 468, 469, 470, 690, 691, 471, 472, - 473, 692, 474, 475, 476, 477, 693, 478, 479, 480, - 481, 482, 694, 695, 696, 485, 697, 487, 488, 489, - 490, 491, 492, 493, 698, 699, 494, 700, 701, 495, - 496, 497, 498, 499, 500, 702, 703, 704, 705, 706, - 707, 708, 709, 710, 711, 712, 512, 513, 514, 515, - 523, 0, 0, 0, 0, 0, 0, 0, 0, 2068, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, + 442, 526, 444, 445, 0, 0, 446, 447, 0, 448, + 0, 450, 451, 452, 453, 454, 0, 455, 456, 457, + 0, 0, 458, 459, 460, 461, 462, 0, 463, 464, + 465, 466, 467, 468, 469, 470, 0, 0, 471, 472, + 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, + 481, 482, 483, 484, 0, 485, 0, 487, 488, 489, + 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 985, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, @@ -8567,9 +7873,9 @@ static const yytype_int16 yytable[] = 485, 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 523, 0, 0, 0, 0, - 0, 0, 0, 0, 2692, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, + 511, 512, 513, 514, 515, 523, 0, 549, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1464, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, 142, @@ -8617,413 +7923,566 @@ static const yytype_int16 yytable[] = 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, - 964, 1340, 815, 0, 0, 0, 1046, 0, 0, 2695, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, + 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2201, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, - 127, 0, 0, 0, 560, 0, 0, 0, 0, 565, - 129, 130, 0, 131, 132, 133, 567, 135, 136, 137, - 568, 569, 570, 571, 572, 0, 143, 144, 145, 146, - 147, 148, 0, 0, 149, 150, 151, 152, 576, 577, - 155, 0, 156, 157, 158, 159, 579, 0, 581, 0, - 583, 163, 164, 165, 166, 167, 584, 169, 170, 171, - 0, 172, 173, 174, 175, 176, 177, 0, 587, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 589, - 190, 191, 590, 193, 0, 194, 0, 195, 196, 197, + 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, + 138, 139, 0, 141, 142, 0, 143, 144, 145, 146, + 147, 148, 0, 0, 149, 150, 151, 152, 153, 154, + 155, 0, 156, 157, 158, 159, 160, 0, 0, 0, + 162, 163, 164, 165, 166, 167, 0, 169, 170, 171, + 0, 172, 173, 174, 175, 176, 177, 0, 0, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, - 0, 213, 214, 215, 0, 216, 217, 218, 219, 600, - 221, 222, 223, 224, 225, 601, 1341, 227, 0, 228, - 229, 604, 231, 0, 232, 0, 233, 607, 0, 609, - 236, 237, 610, 611, 240, 0, 241, 0, 614, 615, - 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, - 617, 254, 255, 256, 257, 0, 258, 259, 260, 261, - 262, 263, 264, 0, 265, 620, 621, 268, 269, 270, - 271, 272, 622, 623, 0, 625, 0, 276, 627, 628, - 279, 629, 281, 282, 283, 284, 285, 286, 0, 0, - 287, 632, 289, 633, 0, 291, 292, 293, 294, 295, - 296, 297, 298, 635, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 636, 637, 638, 323, 324, 325, - 639, 0, 327, 328, 641, 330, 0, 643, 332, 644, - 334, 335, 336, 0, 337, 338, 1342, 0, 339, 340, - 341, 0, 0, 342, 343, 650, 651, 346, 652, 653, + 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 0, 227, 0, 228, + 229, 230, 231, 0, 232, 0, 233, 0, 0, 0, + 236, 237, 524, 0, 240, 0, 241, 0, 242, 243, + 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, + 0, 254, 255, 256, 257, 0, 258, 259, 260, 261, + 262, 263, 264, 0, 265, 0, 267, 268, 269, 270, + 271, 272, 273, 274, 0, 275, 0, 276, 0, 0, + 279, 0, 281, 282, 283, 284, 285, 286, 0, 0, + 287, 0, 289, 0, 0, 291, 292, 293, 294, 295, + 296, 297, 298, 525, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 0, 322, 323, 324, 325, + 326, 0, 327, 328, 0, 330, 0, 331, 332, 333, + 334, 335, 336, 0, 337, 338, 0, 0, 339, 340, + 341, 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 0, 0, 0, 0, 360, 361, 658, 659, 364, - 365, 660, 367, 368, 369, 0, 370, 371, 372, 373, - 374, 375, 0, 376, 377, 378, 663, 380, 381, 382, + 359, 0, 0, 0, 0, 360, 361, 362, 0, 364, + 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, + 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 397, 398, 666, 400, - 401, 402, 667, 404, 405, 406, 407, 408, 409, 410, - 411, 412, 413, 414, 415, 416, 0, 669, 417, 418, - 419, 420, 421, 422, 670, 424, 425, 0, 672, 427, - 428, 673, 430, 0, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 675, 444, 676, 0, - 0, 446, 447, 0, 448, 680, 450, 451, 452, 453, - 454, 0, 455, 682, 683, 0, 0, 458, 459, 686, - 461, 687, 1343, 463, 464, 689, 466, 467, 468, 469, + 392, 393, 394, 395, 396, 0, 397, 398, 0, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 0, 0, 427, + 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 526, 444, 445, 0, + 0, 446, 447, 0, 448, 0, 450, 451, 452, 453, + 454, 0, 455, 456, 457, 0, 0, 458, 459, 460, + 461, 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, - 477, 0, 478, 479, 480, 481, 482, 694, 695, 0, - 485, 697, 487, 488, 489, 490, 491, 492, 493, 0, + 477, 0, 478, 479, 480, 481, 482, 483, 484, 0, + 485, 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, - 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, - 712, 512, 513, 514, 515, 0, 0, 1610, 0, 0, - 1611, 0, 1344, 1345, 1612, 1613, 1614, 1615, 1616, 1617, - 1618, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1619, 0, 0, 0, 0, - 2166, 0, 0, 0, 0, 1621, 1610, 0, 0, 1611, - 0, 0, 1622, 1612, 1613, 1614, 1615, 1616, 1617, 1618, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1619, 0, 0, 0, 0, 1623, - 0, 0, 0, 0, 1621, 1610, 0, 0, 1611, 0, - 0, 1622, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1619, 0, 0, 0, 0, 1623, 0, - 0, 0, 0, 1621, 0, 2167, 0, 0, 0, 0, - 1622, 0, 0, 1610, 0, 0, 1611, 0, 0, 0, - 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1623, 0, 0, - 0, 1619, 0, 0, 0, 1889, 0, 0, 0, 0, - 0, 1621, 0, 1610, 0, 1624, 1611, 0, 1622, 0, - 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, - 0, 0, 1625, 0, 0, 0, 0, 1626, 0, 0, - 0, 1619, 0, 0, 1925, 1623, 0, 0, 0, 1926, - 0, 1621, 0, 0, 1624, 0, 0, 0, 1622, 0, - 1627, 1628, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1625, 0, 0, 0, 1629, 1626, 0, 0, 0, - 0, 0, 3502, 0, 0, 1623, 0, 0, 0, 0, - 0, 0, 0, 1624, 0, 0, 0, 0, 0, 1627, - 1628, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1625, 0, 0, 1630, 1629, 1626, 1631, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1632, 0, 0, 1633, 0, 0, 0, 0, 1627, 1628, - 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1630, 1629, 0, 1631, 0, 0, 1625, 0, - 0, 0, 0, 1626, 0, 0, 0, 0, 0, 1632, - 0, 0, 1633, 0, 0, 0, 0, 0, 0, 0, - 0, 1624, 0, 0, 0, 0, 1627, 1628, 0, 0, - 0, 1630, 0, 0, 1631, 0, 0, 0, 1625, 0, - 0, 1629, 0, 1626, 0, 0, 0, 0, 1632, 0, - 0, 1633, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1627, 1628, 0, 0, - 1634, 0, 0, 0, 0, 0, 0, 0, 0, 1630, - 3503, 1629, 1631, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1632, 0, 0, 1633, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1634, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1630, - 0, 0, 1631, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2170, 0, 0, 1632, 0, 0, 1633, - 0, 0, 0, 0, 0, 0, 0, 0, 1634, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1896, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1635, 0, 0, - 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, - 0, 0, 0, 0, 0, 0, 1634, 0, 0, 0, - 0, 1610, 0, 0, 1611, 0, 0, 0, 1612, 1613, - 1614, 1615, 1616, 1617, 1618, 0, 1635, 0, 0, 1636, - 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, 1619, - 0, 0, 0, 1931, 0, 0, 1634, 0, 0, 1621, - 0, 0, 0, 0, 0, 0, 1622, 0, 0, 0, - 0, 0, 0, 0, 0, 1635, 0, 0, 1636, 1637, - 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, 0, - 0, 0, 0, 1623, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1610, 0, - 0, 1611, 0, 0, 0, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 0, 1635, 0, 0, 1636, 1637, 1638, 0, - 1639, 1640, 1641, 1642, 1643, 1644, 1619, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1621, 0, 0, 0, - 0, 0, 0, 1622, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1635, 0, 0, 1636, 1637, 1638, 0, - 1639, 1640, 1641, 1642, 1643, 1644, 0, 0, 0, 0, - 1623, 0, 0, 0, 0, 1610, 0, 0, 1611, 1624, - 0, 0, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, - 0, 0, 0, 0, 0, 0, 1625, 0, 0, 0, - 0, 1626, 0, 1619, 0, 0, 0, 1938, 0, 0, - 0, 0, 0, 1621, 0, 0, 0, 0, 0, 0, - 1622, 0, 0, 0, 1627, 1628, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1629, - 0, 0, 0, 0, 0, 0, 0, 1623, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1936, 1610, 0, 0, 1611, 1624, 0, 0, 1612, - 1613, 1614, 1615, 1616, 1617, 1618, 0, 1630, 0, 0, - 1631, 0, 0, 1625, 0, 0, 0, 0, 1626, 0, - 1619, 0, 0, 0, 1632, 0, 0, 1633, 0, 0, - 1621, 0, 0, 0, 0, 0, 0, 1622, 0, 0, - 0, 1627, 1628, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1629, 0, 0, 0, - 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, - 0, 0, 0, 1624, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1625, 0, 0, 0, 1630, 1626, 0, 1631, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1632, 0, 0, 1633, 0, 0, 0, 1627, 1628, - 0, 0, 0, 0, 1634, 0, 0, 1610, 0, 0, - 1611, 0, 0, 1629, 1612, 1613, 1614, 1615, 1616, 1617, - 1618, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2061, 0, 0, 0, 0, 1619, 0, 0, 0, 0, - 1624, 0, 0, 0, 0, 1621, 0, 0, 0, 0, - 0, 1630, 1622, 0, 1631, 0, 0, 1625, 0, 0, - 0, 0, 1626, 0, 0, 0, 0, 0, 1632, 0, - 0, 1633, 0, 0, 0, 0, 0, 0, 0, 1623, - 0, 0, 0, 0, 0, 1627, 1628, 0, 0, 0, - 0, 1634, 0, 0, 0, 0, 0, 0, 0, 0, - 1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1635, 0, 0, 1636, 1637, 1638, 0, 1639, 1640, - 1641, 1642, 1643, 1644, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1630, 0, - 0, 1631, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1632, 0, 0, 1633, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1634, 0, - 0, 0, 0, 0, 0, 1624, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1625, 0, 0, 0, 0, 1626, 1635, 0, - 0, 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, - 1644, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1627, 1628, 0, 0, 0, 0, 0, 0, 0, 1610, - 0, 0, 1611, 0, 0, 1629, 1612, 1613, 1614, 1615, - 1616, 1617, 1618, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1634, 0, 1619, 0, 0, - 0, 2769, 0, 0, 0, 0, 0, 1621, 0, 0, - 0, 0, 0, 1630, 1622, 1635, 1631, 0, 1636, 1637, - 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, 0, - 1632, 0, 0, 1633, 0, 0, 0, 0, 0, 0, - 0, 1623, 0, 1610, 0, 0, 1611, 0, 0, 0, - 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1619, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1621, 0, 0, 0, 0, 0, 0, 1622, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1635, 0, 0, 1636, 1637, 1638, 0, 1639, - 1640, 1641, 1642, 1643, 1644, 1623, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1634, 0, 1610, 0, 0, 1611, 0, 1624, 0, 1612, - 1613, 1614, 1615, 1616, 1617, 1618, 0, 0, 0, 0, - 0, 0, 0, 0, 1625, 0, 0, 0, 0, 1626, - 1619, 0, 0, 2756, 0, 0, 0, 0, 0, 0, - 1621, 0, 0, 0, 0, 0, 0, 1622, 0, 0, - 0, 0, 1627, 1628, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1629, 0, 0, - 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, - 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1625, 0, - 0, 0, 0, 1626, 0, 1630, 0, 1635, 1631, 0, - 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, - 0, 0, 1632, 0, 0, 1633, 1627, 1628, 0, 0, - 0, 0, 0, 0, 0, 1610, 0, 0, 1611, 0, - 0, 1629, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1619, 0, 0, 0, 0, 0, 0, - 1624, 0, 0, 1621, 0, 0, 0, 0, 0, 1630, - 1622, 0, 1631, 0, 0, 0, 0, 1625, 0, 0, - 0, 0, 1626, 0, 0, 0, 1632, 0, 0, 1633, - 0, 0, 0, 0, 0, 0, 1610, 1623, 0, 1611, - 0, 0, 0, 1612, 1613, 1805, 1628, 1616, 1617, 1618, - 0, 0, 1634, 0, 0, 0, 0, 0, 0, 0, - 1629, 0, 0, 0, 1619, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1621, 0, 0, 0, 0, 0, - 0, 1622, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1630, 0, - 0, 1631, 0, 0, 0, 0, 0, 0, 1623, 0, - 0, 0, 0, 0, 0, 1632, 0, 0, 1633, 0, - 0, 0, 0, 0, 0, 0, 1634, 1610, 0, 0, - 1611, 0, 0, 1624, 1612, 1613, 0, 0, 1616, 1617, - 1618, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1625, 0, 0, 0, 0, 1626, 0, 0, 0, 1635, - 0, 0, 1636, 1637, 1638, 1621, 1639, 1640, 1641, 1642, - 1643, 1644, 1622, 0, 0, 0, 0, 0, 1627, 1628, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1629, 0, 0, 0, 0, 0, 1623, - 0, 0, 0, 0, 1624, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1634, 0, 0, 0, 0, - 0, 1625, 0, 0, 0, 0, 1626, 0, 0, 0, - 0, 1630, 0, 1635, 1631, 0, 1636, 1637, 1638, 0, - 1639, 1640, 1641, 1642, 1643, 1644, 0, 0, 1632, 1627, - 1628, 1633, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1629, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1624, 0, 0, 0, 0, - 0, 0, 1630, 0, 0, 1631, 0, 0, 0, 0, - 0, 0, 1625, 0, 0, 0, 0, 1626, 0, 1632, - 0, 0, 1635, 0, 0, 1636, 1637, 1638, 0, 1639, - 1640, 1641, 1642, 1643, 1644, 0, 0, 0, 0, 0, - -2044, -2044, 0, 0, 0, 0, 0, 0, 1634, 0, - 0, 0, 0, 0, 0, 1629, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2044, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1632, 0, 0, 0, 0, 0, 0, 0, 0, 1634, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2439, 0, 0, 117, 118, 119, 120, 121, 122, + 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, + 133, 0, 135, 136, 137, 138, 139, 0, 141, 142, + 0, 143, 144, 145, 146, 147, 148, 0, 0, 149, + 150, 151, 152, 153, 154, 155, 0, 156, 157, 158, + 159, 160, 0, 0, 0, 162, 163, 164, 165, 166, + 167, 0, 169, 170, 171, 0, 172, 173, 174, 175, + 176, 177, 0, 0, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, + 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, + 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, + 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 0, 227, 0, 228, 229, 230, 231, 0, 232, + 0, 233, 0, 0, 0, 236, 237, 524, 0, 240, + 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, + 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, + 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, + 0, 267, 268, 269, 270, 271, 272, 273, 274, 0, + 275, 0, 276, 0, 0, 279, 0, 281, 282, 283, + 284, 285, 286, 0, 0, 287, 0, 289, 0, 0, + 291, 292, 293, 294, 295, 296, 297, 298, 525, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 0, 322, 323, 324, 325, 326, 0, 327, 328, 0, + 330, 0, 331, 332, 333, 334, 335, 336, 0, 337, + 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, + 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, + 360, 361, 362, 0, 364, 365, 366, 367, 368, 369, + 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, + 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 0, 0, 427, 428, 429, 430, 0, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 526, 444, 445, 0, 0, 446, 447, 0, 448, + 0, 450, 451, 452, 453, 454, 0, 455, 456, 457, + 0, 0, 458, 459, 460, 461, 462, 0, 463, 464, + 465, 466, 467, 468, 469, 470, 0, 0, 471, 472, + 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, + 481, 482, 483, 484, 0, 485, 0, 487, 488, 489, + 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2570, 0, 0, 117, + 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, + 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, + 138, 139, 0, 141, 142, 0, 143, 144, 145, 146, + 147, 148, 0, 0, 149, 150, 151, 152, 153, 154, + 155, 0, 156, 157, 158, 159, 160, 0, 0, 0, + 162, 163, 164, 165, 166, 167, 0, 169, 170, 171, + 0, 172, 173, 174, 175, 176, 177, 0, 0, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, + 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, + 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, + 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 0, 227, 0, 228, + 229, 230, 231, 0, 232, 0, 233, 0, 0, 0, + 236, 237, 524, 0, 240, 0, 241, 0, 242, 243, + 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, + 0, 254, 255, 256, 257, 0, 258, 259, 260, 261, + 262, 263, 264, 0, 265, 0, 267, 268, 269, 270, + 271, 272, 273, 274, 0, 275, 0, 276, 0, 0, + 279, 0, 281, 282, 283, 284, 285, 286, 0, 0, + 287, 0, 289, 0, 0, 291, 292, 293, 294, 295, + 296, 297, 298, 525, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 0, 322, 323, 324, 325, + 326, 0, 327, 328, 0, 330, 0, 331, 332, 333, + 334, 335, 336, 0, 337, 338, 0, 0, 339, 340, + 341, 0, 0, 342, 343, 344, 0, 346, 0, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 0, 0, 0, 0, 360, 361, 362, 0, 364, + 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, + 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, + 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 0, 397, 398, 0, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 0, 0, 427, + 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 526, 444, 445, 0, + 0, 446, 447, 0, 448, 0, 450, 451, 452, 453, + 454, 0, 455, 456, 457, 0, 0, 458, 459, 460, + 461, 462, 0, 463, 464, 465, 466, 467, 468, 469, + 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, + 477, 0, 478, 479, 480, 481, 482, 483, 484, 0, + 485, 0, 487, 488, 489, 490, 491, 492, 493, 0, + 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1635, 0, 0, 1636, 1637, - 1638, 0, 1639, 1640, 1641, 1642, 2187, 1644, 0, 0, + 0, 3215, 0, 0, 117, 118, 119, 120, 121, 122, + 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, + 133, 0, 135, 136, 137, 138, 139, 0, 141, 142, + 0, 143, 144, 145, 146, 147, 148, 0, 0, 149, + 150, 151, 152, 153, 154, 155, 0, 156, 157, 158, + 159, 160, 0, 0, 0, 162, 163, 164, 165, 166, + 167, 0, 169, 170, 171, 0, 172, 173, 174, 175, + 176, 177, 0, 0, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, + 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, + 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, + 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 0, 227, 0, 228, 229, 230, 231, 0, 232, + 0, 233, 0, 0, 0, 236, 237, 524, 0, 240, + 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, + 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, + 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, + 0, 267, 268, 269, 270, 271, 272, 273, 274, 0, + 275, 0, 276, 0, 0, 279, 0, 281, 282, 283, + 284, 285, 286, 0, 0, 287, 0, 289, 0, 0, + 291, 292, 293, 294, 295, 296, 297, 298, 525, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 0, 322, 323, 324, 325, 326, 0, 327, 328, 0, + 330, 0, 331, 332, 333, 334, 335, 336, 0, 337, + 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, + 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, + 360, 361, 362, 0, 364, 365, 366, 367, 368, 369, + 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, + 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 0, 0, 427, 428, 429, 430, 0, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 526, 444, 445, 0, 0, 446, 447, 0, 448, + 0, 450, 451, 452, 453, 454, 0, 455, 456, 457, + 0, 0, 458, 459, 460, 461, 462, 0, 463, 464, + 465, 466, 467, 468, 469, 470, 0, 0, 471, 472, + 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, + 481, 482, 483, 484, 0, 485, 0, 487, 488, 489, + 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2058, 0, 0, 117, + 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, + 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 129, 130, 0, 131, 132, 133, 0, 135, 136, 137, + 138, 139, 0, 141, 142, 0, 143, 144, 145, 146, + 147, 148, 0, 0, 149, 150, 151, 152, 153, 154, + 155, 0, 156, 157, 158, 159, 160, 0, 0, 0, + 162, 163, 164, 165, 166, 167, 0, 169, 170, 171, + 0, 172, 173, 174, 175, 176, 177, 0, 0, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, + 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, + 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, + 0, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 0, 227, 0, 228, + 229, 230, 231, 0, 232, 0, 233, 0, 0, 0, + 236, 237, 524, 0, 240, 0, 241, 0, 242, 243, + 244, 245, 0, 246, 247, 248, 249, 250, 251, 252, + 0, 254, 255, 256, 257, 0, 258, 259, 260, 261, + 262, 263, 264, 0, 265, 0, 267, 268, 269, 270, + 271, 272, 273, 274, 0, 275, 0, 276, 0, 0, + 279, 0, 281, 282, 283, 284, 285, 286, 0, 0, + 287, 0, 289, 0, 0, 291, 292, 293, 294, 295, + 296, 297, 298, 525, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 0, 322, 323, 324, 325, + 326, 0, 327, 328, 0, 330, 0, 331, 332, 333, + 334, 335, 336, 0, 337, 338, 0, 0, 339, 340, + 341, 0, 0, 342, 343, 344, 0, 346, 0, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 0, 0, 0, 0, 360, 361, 362, 0, 364, + 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, + 374, 375, 0, 376, 377, 378, 379, 380, 381, 382, + 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 0, 397, 398, 0, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 0, 0, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 0, 0, 427, + 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 526, 444, 445, 0, + 0, 446, 447, 0, 448, 0, 450, 451, 452, 453, + 454, 0, 455, 456, 457, 0, 0, 458, 459, 460, + 461, 462, 0, 463, 464, 465, 466, 467, 468, 469, + 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, + 477, 0, 478, 479, 480, 481, 482, 483, 484, 0, + 485, 0, 487, 488, 489, 490, 491, 492, 493, 0, + 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2161, 0, 0, 117, 118, 119, 120, 121, 122, + 123, 124, 0, 125, 126, 127, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 129, 130, 0, 131, 132, + 133, 0, 135, 136, 137, 138, 139, 0, 141, 142, + 0, 143, 144, 145, 146, 147, 148, 0, 0, 149, + 150, 151, 152, 153, 154, 155, 0, 156, 157, 158, + 159, 160, 0, 0, 0, 162, 163, 164, 165, 166, + 167, 0, 169, 170, 171, 0, 172, 173, 174, 175, + 176, 177, 0, 0, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, + 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, + 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, + 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 0, 227, 0, 228, 229, 230, 231, 0, 232, + 0, 233, 0, 0, 0, 236, 237, 524, 0, 240, + 0, 241, 0, 242, 243, 244, 245, 0, 246, 247, + 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, + 0, 258, 259, 260, 261, 262, 263, 264, 0, 265, + 0, 267, 268, 269, 270, 271, 272, 273, 274, 0, + 275, 0, 276, 0, 0, 279, 0, 281, 282, 283, + 284, 285, 286, 0, 0, 287, 0, 289, 0, 0, + 291, 292, 293, 294, 295, 296, 297, 298, 525, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 0, 322, 323, 324, 325, 326, 0, 327, 328, 0, + 330, 0, 331, 332, 333, 334, 335, 336, 0, 337, + 338, 0, 0, 339, 340, 341, 0, 0, 342, 343, + 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, + 360, 361, 362, 0, 364, 365, 366, 367, 368, 369, + 0, 370, 371, 372, 373, 374, 375, 0, 376, 377, + 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 0, 0, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 0, 0, 427, 428, 429, 430, 0, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 526, 444, 445, 0, 0, 446, 447, 0, 448, + 0, 450, 451, 452, 453, 454, 0, 455, 456, 457, + 0, 0, 458, 459, 460, 461, 462, 0, 463, 464, + 465, 466, 467, 468, 469, 470, 0, 0, 471, 472, + 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, + 481, 482, 483, 484, 0, 485, 0, 487, 488, 489, + 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 0, 2895, 1341, 815, 0, 0, 2034, 1046, 0, 0, + 0, 0, 0, 2035, 2036, 0, 3076, 2037, 2038, 2039, + 117, 118, 119, 120, 121, 122, 123, 124, 556, 125, + 126, 127, 557, 558, 559, 2896, 561, 562, 563, 564, + 2897, 129, 130, 566, 131, 132, 133, 2898, 135, 136, + 137, 0, 1480, 2899, 1482, 1483, 573, 143, 144, 145, + 146, 147, 148, 574, 575, 149, 150, 151, 152, 1484, + 1485, 155, 578, 156, 157, 158, 159, 0, 580, 2900, + 582, 2901, 163, 164, 165, 166, 167, 2902, 169, 170, + 171, 585, 172, 173, 174, 175, 176, 177, 586, 2903, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 1490, 190, 191, 1491, 193, 591, 194, 592, 195, 196, + 197, 198, 199, 200, 593, 594, 201, 202, 203, 204, + 595, 596, 205, 206, 1059, 208, 209, 597, 210, 211, + 212, 598, 213, 214, 215, 599, 216, 217, 218, 219, + 0, 221, 222, 223, 224, 225, 0, 602, 227, 603, + 228, 229, 1492, 231, 605, 232, 606, 233, 2904, 608, + 2905, 236, 237, 2906, 2907, 240, 612, 241, 613, 0, + 0, 244, 245, 616, 246, 247, 248, 249, 250, 251, + 252, 2908, 254, 255, 256, 257, 618, 258, 259, 260, + 261, 262, 263, 264, 619, 265, 2909, 0, 268, 269, + 270, 271, 272, 1498, 1499, 624, 1500, 626, 276, 2910, + 2911, 279, 2912, 281, 282, 283, 284, 285, 286, 630, + 631, 287, 2913, 289, 2914, 634, 291, 292, 293, 294, + 295, 296, 297, 298, 2915, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 1507, 2916, 1509, 323, 324, + 325, 2917, 640, 327, 328, 2918, 330, 642, 0, 332, + 1511, 334, 335, 336, 645, 337, 338, 646, 647, 2919, + 340, 341, 648, 649, 342, 343, 0, 2920, 346, 2921, + 0, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 654, 655, 656, 657, 360, 361, 0, 2922, + 364, 365, 0, 367, 368, 369, 661, 370, 371, 372, + 373, 374, 375, 662, 376, 377, 378, 1515, 380, 381, + 382, 383, 664, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 665, 397, 398, 2923, + 400, 401, 402, 1517, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 668, 2924, 417, + 418, 419, 420, 421, 422, 2925, 424, 425, 671, 2926, + 427, 428, 1521, 430, 674, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 2927, 444, 0, + 677, 678, 446, 447, 679, 448, 2928, 450, 451, 452, + 453, 454, 681, 455, 1524, 1525, 684, 685, 458, 459, + 0, 461, 0, 688, 463, 464, 2929, 466, 467, 468, + 469, 470, 2930, 691, 471, 472, 473, 692, 474, 475, + 476, 477, 693, 478, 479, 480, 481, 482, 0, 1528, + 696, 485, 2931, 487, 488, 489, 490, 491, 492, 493, + 698, 699, 494, 700, 701, 495, 496, 497, 498, 499, + 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 512, 513, 514, 515, 0, 523, 0, 2040, + 2041, 2042, 2034, 2932, 2933, 2045, 2046, 2047, 2048, 2035, + 2036, 0, 0, 2037, 2038, 2039, 117, 118, 119, 120, + 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, + 131, 132, 133, 0, 135, 136, 137, 138, 139, 0, + 141, 142, 0, 143, 144, 145, 146, 147, 148, 0, + 0, 149, 150, 151, 152, 153, 154, 155, 0, 156, + 157, 158, 159, 160, 0, 0, 0, 162, 163, 164, + 165, 166, 167, 0, 169, 170, 171, 0, 172, 173, + 174, 175, 176, 177, 0, 0, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, + 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, + 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 0, 227, 0, 228, 229, 230, 231, + 0, 232, 0, 233, 0, 0, 0, 236, 237, 524, + 0, 240, 0, 241, 0, 242, 243, 244, 245, 0, + 246, 247, 248, 249, 250, 251, 252, 0, 254, 255, + 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, + 0, 265, 0, 267, 268, 269, 270, 271, 272, 273, + 274, 0, 275, 0, 276, 0, 0, 279, 0, 281, + 282, 283, 284, 285, 286, 0, 0, 287, 0, 289, + 0, 0, 291, 292, 293, 294, 295, 296, 297, 298, + 525, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 0, 322, 323, 324, 325, 326, 0, 327, + 328, 0, 330, 0, 331, 332, 333, 334, 335, 336, + 0, 337, 338, 0, 0, 339, 340, 341, 0, 0, + 342, 343, 344, 0, 346, 0, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, + 0, 0, 360, 361, 362, 0, 364, 365, 366, 367, + 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, + 376, 377, 378, 379, 380, 381, 382, 383, 0, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 397, 398, 0, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 0, 0, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 0, 0, 427, 428, 429, 430, + 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 526, 444, 445, 0, 0, 446, 447, + 0, 448, 0, 450, 451, 452, 453, 454, 0, 455, + 456, 457, 0, 0, 458, 459, 460, 461, 462, 0, + 463, 464, 465, 466, 467, 468, 469, 470, 0, 0, + 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, + 479, 480, 481, 482, 483, 484, 0, 485, 0, 487, + 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, + 0, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 0, 0, 0, 2040, 2041, 2042, 0, 2043, + 2044, 2045, 2046, 2047, 2048, 1611, 0, 0, 1612, 0, + 0, 0, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1620, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1622, 1611, 0, 0, 1612, 0, 0, + 1623, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1620, 0, 0, 0, 0, 1624, 0, 0, + 0, 0, 1622, 1611, 0, 0, 1612, 0, 0, 1623, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1634, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1635, 0, 0, 1636, - 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, 0, + 0, 1620, 0, 0, 0, 0, 1624, 0, 0, 0, + 0, 1622, 0, 0, 0, 0, 0, 0, 1623, 0, + 1611, 0, 0, 1612, 0, 0, 0, 1613, 1614, 1615, + 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1624, 0, 0, 1620, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1622, 1611, + 0, 0, 1612, 1625, 0, 1623, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, 0, + 1626, 0, 0, 0, 0, 1627, 0, 1620, 0, 0, + 0, 0, 1624, 0, 0, 0, 0, 1622, 0, 0, + 0, 0, 1625, 0, 1623, 0, 0, 0, 1628, 1629, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1626, + 0, 0, 0, 1630, 1627, 0, 0, 0, 0, 0, + 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1625, 0, 0, 0, 0, 0, 1628, 1629, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1626, 0, + 0, 1631, 1630, 1627, 1632, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1633, 0, + 0, 1634, 0, 0, 0, 0, 1628, 1629, 1625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1631, 1630, 0, 1632, 0, 1626, 0, 0, 0, 0, + 1627, 0, 0, 0, 0, 0, 0, 1633, 0, 0, + 1634, 0, 0, 0, 0, 0, 0, 1625, 0, 0, + 0, 0, 0, 1628, 1629, 0, 0, 0, 0, 1631, + 0, 0, 1632, 0, 1626, 0, 0, 0, 1630, 1627, + 0, 0, 0, 0, 0, 0, 1633, 0, 0, 1634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1628, 1629, 0, 0, 0, 0, 1635, 0, + 0, 0, 0, 0, 0, 0, 1631, 1630, 0, 1632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1633, 0, 0, 1634, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1635, 0, 0, + 0, 0, 0, 0, 0, 1631, 0, 0, 1632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1633, 0, 0, 1634, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1636, 0, 0, 1637, 1638, + 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 0, 0, + 0, 0, 2841, 1635, 0, 0, 0, 0, 0, 1611, + 0, 0, 1612, 0, 0, 0, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 0, 1636, 0, 0, 1637, 1638, 1639, + 0, 1640, 1641, 1642, 1643, 1644, 1645, 1620, 0, 0, + 0, 3068, 1635, 0, 0, 0, 0, 1622, 0, 0, + 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, + 0, 0, 0, 1636, 0, 0, 1637, 1638, 1639, 0, + 1640, 1641, 1642, 1643, 1644, 1645, 0, 0, 0, 0, + 3075, 1624, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1611, 0, 0, 1612, 0, + 0, 0, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, + 1636, 0, 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, + 1643, 1644, 1645, 1620, 0, 0, 0, 3235, 0, 0, + 0, 0, 0, 1622, 1611, 0, 0, 1612, 0, 0, + 1623, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 1636, + 0, 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, + 1644, 1645, 1620, 0, 0, 0, 3257, 1624, 0, 0, + 0, 0, 1622, 1611, 0, 0, 1612, 1625, 0, 1623, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, 0, + 0, 0, 0, 0, 1626, 0, 0, 0, 0, 1627, + 0, 1620, 0, 0, 0, 0, 1624, 0, 0, 0, + 0, 1622, 0, 0, 0, 0, 0, 0, 1623, 0, + 0, 0, 1628, 1629, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1630, 0, 0, + 0, 0, 0, 0, 0, 1624, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1611, + 0, 0, 1612, 1625, 0, 0, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 0, 0, 1631, 0, 0, 1632, 0, + 1626, 0, 0, 0, 0, 1627, 0, 1620, 0, 0, + 0, 0, 1633, 0, 0, 1634, 0, 1622, 0, 0, + 0, 0, 1625, 0, 1623, 0, 0, 0, 1628, 1629, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1626, + 0, 0, 0, 1630, 1627, 0, 0, 0, 0, 0, + 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1625, 0, 0, 0, 0, 0, 1628, 1629, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1626, 0, + 0, 1631, 1630, 1627, 1632, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1633, 0, + 0, 1634, 0, 0, 0, 0, 1628, 1629, 0, 0, + 0, 0, 1635, 0, 0, 0, 0, 0, 0, 0, + 1631, 1630, 0, 1632, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1633, 0, 0, + 1634, 0, 0, 0, 0, 0, 0, 1625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1631, + 0, 0, 1632, 0, 1626, 0, 0, 0, 0, 1627, + 0, 0, 0, 0, 0, 0, 1633, 0, 0, 1634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 555, 0, 2084, 0, 0, 0, 1635, 0, 0, - 1636, 1637, 1638, 0, 1639, 1640, 1641, 1642, 1643, 1644, - 117, 118, 119, 120, 121, 122, 123, 124, 556, 125, - 126, 127, 557, 558, 559, 560, 561, 562, 563, 564, - 565, 129, 130, 566, 131, 132, 133, 567, 135, 136, - 137, 568, 569, 570, 571, 572, 573, 143, 144, 145, - 146, 147, 148, 574, 575, 149, 150, 151, 152, 576, - 577, 155, 578, 156, 157, 158, 159, 579, 580, 581, - 582, 583, 163, 164, 165, 166, 167, 584, 169, 170, - 171, 585, 172, 173, 174, 175, 176, 177, 586, 587, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 589, 190, 191, 590, 193, 591, 194, 592, 195, 196, - 197, 198, 199, 200, 593, 594, 201, 202, 203, 204, - 595, 596, 205, 206, 207, 208, 209, 597, 210, 211, - 212, 598, 213, 214, 215, 599, 216, 217, 218, 219, - 600, 221, 222, 223, 224, 225, 601, 602, 227, 603, - 228, 229, 604, 231, 605, 232, 606, 233, 607, 608, - 609, 236, 237, 610, 611, 240, 612, 241, 613, 614, - 615, 244, 245, 616, 246, 247, 248, 249, 250, 251, - 252, 617, 254, 255, 256, 257, 618, 258, 259, 260, - 261, 262, 263, 264, 619, 265, 620, 621, 268, 269, - 270, 271, 272, 622, 623, 624, 625, 626, 276, 627, - 628, 279, 629, 281, 282, 283, 284, 285, 286, 630, - 631, 287, 632, 289, 633, 634, 291, 292, 293, 294, - 295, 296, 297, 298, 635, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 636, 637, 638, 323, 324, - 325, 639, 640, 327, 328, 641, 330, 642, 643, 332, - 644, 334, 335, 336, 645, 337, 338, 646, 647, 339, - 340, 341, 648, 649, 342, 343, 650, 651, 346, 652, - 653, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 654, 655, 656, 657, 360, 361, 658, 659, - 364, 365, 660, 367, 368, 369, 661, 370, 371, 372, - 373, 374, 375, 662, 376, 377, 378, 663, 380, 381, - 382, 383, 664, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 665, 397, 398, 666, - 400, 401, 402, 667, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 668, 669, 417, - 418, 419, 420, 421, 422, 670, 424, 425, 671, 672, - 427, 428, 673, 430, 674, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 675, 444, 676, - 677, 678, 446, 447, 679, 448, 680, 450, 451, 452, - 453, 454, 681, 455, 682, 683, 684, 685, 458, 459, - 686, 461, 687, 688, 463, 464, 689, 466, 467, 468, - 469, 470, 690, 691, 471, 472, 473, 692, 474, 475, - 476, 477, 693, 478, 479, 480, 481, 482, 694, 695, - 696, 485, 697, 487, 488, 489, 490, 491, 492, 493, - 698, 699, 494, 700, 701, 495, 496, 497, 498, 499, - 500, 702, 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 512, 513, 514, 515, 555, 0, 0, 0, + 0, 0, 1628, 1629, 0, 0, 0, 0, 1635, 0, + 0, 0, 0, 0, 0, 0, 0, 1630, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1636, + 0, 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, + 1644, 1645, 0, 0, 0, 0, 3358, 1635, 0, 0, + 0, 0, 0, 0, 0, 1631, 0, 1611, 1632, 0, + 1612, 0, 0, 0, 1613, 1614, 1615, 1616, 1617, 1618, + 1619, 0, 1633, 0, 0, 1634, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1620, 1635, 0, 0, 0, + 0, 0, 0, 0, 0, 1622, 0, 0, 0, 0, + 0, 0, 1623, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1636, 0, 0, 1637, 1638, + 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 0, 1624, + 0, 0, 3415, 0, 0, 0, 0, 0, 0, 1611, + 0, 0, 1612, 0, 0, 0, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 0, 1636, 0, 0, 1637, 1638, 1639, + 0, 1640, 1641, 1642, 1643, 1644, 1645, 1620, 0, 0, + 0, 3437, 1635, 0, 0, 0, 0, 1622, 0, 0, + 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, + 0, 0, 0, 1636, 0, 0, 1637, 1638, 1639, 0, + 1640, 1641, 1642, 1643, 1644, 1645, 0, 0, 1796, 0, + 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 556, 125, 126, 127, 557, 558, 559, - 560, 561, 562, 563, 564, 565, 129, 130, 566, 131, - 132, 133, 567, 135, 136, 137, 568, 569, 570, 571, - 572, 573, 143, 144, 145, 146, 147, 148, 574, 575, - 149, 150, 151, 152, 576, 577, 155, 578, 156, 157, - 158, 159, 579, 580, 581, 582, 583, 163, 164, 165, - 166, 167, 584, 169, 170, 171, 585, 172, 173, 174, - 175, 176, 177, 586, 587, 179, 180, 181, 182, 183, - 184, 588, 186, 187, 188, 589, 190, 191, 590, 193, - 591, 194, 592, 195, 196, 197, 198, 199, 200, 593, - 594, 201, 202, 203, 204, 595, 596, 205, 206, 207, - 208, 209, 597, 210, 211, 212, 598, 213, 214, 215, - 599, 216, 217, 218, 219, 600, 221, 222, 223, 224, - 225, 601, 602, 227, 603, 228, 229, 604, 231, 605, - 232, 606, 233, 607, 608, 609, 236, 237, 610, 611, - 240, 612, 241, 613, 614, 615, 244, 245, 616, 246, - 247, 248, 249, 250, 251, 252, 617, 254, 255, 256, - 257, 618, 258, 259, 260, 261, 262, 263, 264, 619, - 265, 620, 621, 268, 269, 270, 271, 272, 622, 623, - 624, 625, 626, 276, 627, 628, 279, 629, 281, 282, - 283, 284, 285, 286, 630, 631, 287, 632, 289, 633, - 634, 291, 292, 293, 294, 295, 296, 297, 298, 635, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 636, 637, 638, 323, 324, 325, 639, 640, 327, 328, - 641, 330, 642, 643, 332, 644, 334, 335, 336, 645, - 337, 338, 646, 647, 339, 340, 341, 648, 649, 342, - 343, 650, 651, 346, 652, 653, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 654, 655, 656, - 657, 360, 361, 658, 659, 364, 365, 660, 367, 368, - 369, 661, 370, 371, 372, 373, 374, 375, 662, 376, - 377, 378, 663, 380, 381, 382, 383, 664, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 665, 397, 398, 666, 400, 401, 402, 667, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 668, 669, 417, 418, 419, 420, 421, 422, - 670, 424, 425, 671, 672, 427, 428, 673, 430, 674, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 675, 444, 676, 677, 678, 446, 447, 679, - 448, 680, 450, 451, 452, 453, 454, 681, 455, 682, - 683, 684, 685, 458, 459, 686, 461, 687, 688, 463, - 464, 689, 466, 467, 468, 469, 470, 690, 691, 471, - 472, 473, 692, 474, 475, 476, 477, 693, 478, 479, - 480, 481, 482, 694, 695, 696, 485, 697, 487, 488, - 489, 490, 491, 492, 493, 698, 699, 494, 700, 701, - 495, 496, 497, 498, 499, 500, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 512, 513, 514, - 515, 555, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1626, 0, 0, 0, 0, 1627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 556, 125, - 126, 127, 557, 558, 559, 560, 561, 562, 563, 564, - 565, 129, 130, 566, 131, 132, 133, 567, 135, 136, - 137, 568, 569, 570, 571, 572, 573, 143, 144, 145, - 146, 147, 148, 574, 575, 149, 150, 151, 152, 576, - 577, 155, 578, 156, 157, 158, 159, 579, 580, 581, - 582, 583, 163, 164, 165, 166, 167, 584, 169, 170, - 171, 585, 172, 173, 174, 175, 176, 177, 586, 587, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 589, 190, 191, 590, 193, 591, 194, 592, 195, 196, - 197, 198, 199, 200, 593, 594, 201, 202, 203, 204, - 595, 596, 205, 206, 207, 208, 209, 597, 210, 211, - 212, 598, 213, 214, 215, 599, 216, 217, 218, 219, - 600, 221, 222, 223, 224, 225, 601, 602, 227, 603, - 228, 229, 604, 231, 605, 232, 606, 233, 607, 608, - 609, 236, 237, 610, 611, 240, 612, 241, 613, 614, - 615, 244, 245, 616, 246, 247, 248, 249, 250, 940, - 252, 617, 254, 255, 256, 257, 618, 258, 259, 260, - 261, 262, 263, 264, 619, 265, 620, 621, 268, 269, - 270, 271, 272, 622, 623, 624, 625, 626, 276, 627, - 628, 279, 629, 281, 282, 283, 284, 285, 286, 630, - 631, 287, 632, 289, 633, 634, 291, 292, 293, 294, - 295, 296, 297, 298, 635, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 636, 637, 638, 323, 324, - 325, 639, 640, 327, 328, 641, 330, 642, 643, 332, - 644, 334, 335, 336, 645, 337, 338, 646, 647, 339, - 340, 341, 648, 649, 342, 343, 650, 651, 346, 652, - 653, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 654, 655, 656, 657, 360, 361, 658, 659, - 364, 365, 660, 367, 368, 369, 661, 370, 371, 372, - 373, 374, 375, 662, 376, 377, 378, 663, 380, 381, - 382, 383, 664, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 665, 397, 398, 666, - 400, 401, 402, 667, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 668, 669, 417, - 418, 419, 420, 421, 422, 670, 424, 425, 671, 672, - 427, 428, 673, 430, 674, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 675, 444, 676, - 677, 678, 446, 447, 679, 448, 680, 450, 451, 452, - 453, 454, 681, 455, 682, 683, 684, 685, 458, 459, - 686, 461, 687, 688, 463, 464, 689, 466, 467, 468, - 469, 470, 690, 691, 471, 472, 473, 692, 474, 475, - 476, 477, 693, 478, 479, 480, 481, 482, 694, 695, - 696, 485, 697, 487, 488, 489, 490, 491, 492, 493, - 698, 699, 494, 700, 701, 495, 496, 497, 498, 499, - 500, 702, 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 512, 513, 514, 515, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, + 1628, 1629, 0, 0, 0, 0, 0, 0, 0, 1636, + 0, 0, 1637, 1638, 1639, 1630, 1640, 1641, 1642, 1643, + 1644, 1645, 0, 0, 2795, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1631, 1626, 0, 1632, 0, 0, 1627, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1633, 0, 0, 1634, 0, 0, 0, 0, 0, 0, + 0, 0, 1628, 1629, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1630, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1631, 0, 0, 1632, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1633, 0, 0, 1634, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1635, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1636, 0, 0, + 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, + 0, 0, 3225, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 555, 0, 0, 1636, + 0, 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, + 1644, 1645, 0, 0, 3399, 117, 118, 119, 120, 121, 122, 123, 124, 556, 125, 126, 127, 557, 558, 559, 560, 561, 562, 563, 564, 565, 129, 130, 566, 131, 132, 133, 567, 135, 136, 137, 568, 569, 570, 571, @@ -9071,109 +8530,109 @@ static const yytype_int16 yytable[] = 489, 490, 491, 492, 493, 698, 699, 494, 700, 701, 495, 496, 497, 498, 499, 500, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 512, 513, 514, - 515, 555, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 2232, 122, 123, 124, 556, 125, - 126, 127, 557, 558, 559, 560, 561, 562, 563, 564, - 565, 129, 130, 566, 131, 132, 133, 567, 135, 136, - 137, 568, 569, 570, 571, 572, 573, 143, 144, 145, - 146, 147, 148, 574, 575, 149, 150, 151, 152, 576, - 577, 155, 578, 156, 157, 158, 159, 579, 580, 581, - 582, 583, 163, 164, 165, 166, 167, 584, 169, 170, - 171, 585, 172, 173, 174, 175, 176, 177, 586, 587, + 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, + 2069, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, + 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, + 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, + 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, + 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, + 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, + 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 589, 190, 191, 590, 193, 591, 194, 592, 195, 196, - 197, 198, 199, 200, 593, 594, 201, 202, 203, 204, - 595, 596, 205, 206, 207, 2233, 209, 597, 210, 211, - 212, 598, 213, 214, 215, 599, 216, 217, 218, 219, - 600, 221, 222, 223, 224, 225, 601, 602, 227, 603, - 228, 229, 604, 231, 605, 232, 606, 233, 607, 608, - 609, 236, 237, 610, 611, 240, 612, 241, 613, 614, - 615, 244, 245, 616, 246, 247, 248, 249, 250, 251, - 252, 617, 254, 255, 256, 257, 618, 258, 259, 260, - 261, 262, 263, 264, 619, 265, 620, 621, 268, 269, - 270, 271, 272, 622, 623, 624, 625, 626, 276, 627, - 628, 279, 629, 281, 282, 283, 284, 285, 286, 630, - 631, 287, 632, 289, 633, 634, 291, 292, 293, 294, - 295, 296, 297, 298, 635, 300, 301, 302, 303, 304, + 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, + 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, + 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, + 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, + 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, + 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, + 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, + 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, + 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, + 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, + 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, + 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, + 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 636, 637, 638, 323, 324, - 325, 639, 640, 327, 328, 641, 330, 642, 643, 332, - 644, 334, 335, 336, 645, 337, 338, 646, 647, 339, - 340, 341, 648, 649, 342, 343, 650, 651, 346, 652, - 653, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 654, 655, 656, 657, 360, 361, 658, 659, - 364, 365, 660, 367, 368, 369, 661, 370, 371, 372, - 373, 374, 375, 662, 376, 377, 378, 663, 380, 381, - 382, 383, 664, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 665, 397, 398, 666, - 400, 401, 402, 667, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 668, 669, 417, - 418, 419, 420, 421, 2234, 670, 424, 425, 671, 672, - 427, 428, 673, 430, 674, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 675, 444, 676, - 677, 678, 446, 447, 679, 448, 680, 450, 451, 452, - 453, 454, 681, 455, 682, 683, 684, 685, 458, 459, - 686, 461, 687, 688, 463, 464, 689, 466, 467, 468, - 469, 470, 690, 691, 471, 472, 473, 692, 474, 475, - 476, 477, 693, 478, 479, 480, 481, 482, 694, 695, - 696, 485, 697, 487, 488, 489, 490, 491, 492, 493, - 698, 699, 494, 700, 701, 495, 496, 497, 498, 499, - 500, 702, 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 512, 513, 514, 515, 964, 0, 815, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, + 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, + 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, + 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, + 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, + 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, + 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, + 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, + 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, + 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, + 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, + 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, + 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, + 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, + 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, + 0, 0, 0, 0, 0, 2695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 560, 0, 0, 0, 0, 565, 129, 130, 0, 131, - 132, 133, 567, 135, 136, 137, 568, 569, 570, 571, - 572, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 576, 577, 155, 0, 156, 157, - 158, 159, 579, 0, 581, 0, 583, 163, 164, 165, - 166, 167, 584, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 587, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 589, 190, 191, 590, 193, + 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, + 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, + 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, + 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, + 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, + 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, + 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 600, 221, 222, 223, 224, - 225, 601, 1341, 227, 0, 228, 229, 604, 231, 0, - 232, 0, 233, 607, 0, 609, 236, 237, 610, 611, - 240, 0, 241, 0, 614, 615, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 617, 254, 255, 256, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, + 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, + 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, + 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 620, 621, 268, 269, 270, 271, 272, 622, 623, - 0, 625, 0, 276, 627, 628, 279, 629, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 632, 289, 633, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 635, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 636, 637, 638, 323, 324, 325, 639, 0, 327, 328, - 641, 330, 0, 643, 332, 644, 334, 335, 336, 0, - 337, 338, 1342, 0, 339, 340, 341, 0, 0, 342, - 343, 650, 651, 346, 652, 653, 349, 350, 351, 352, + 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, + 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, + 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, + 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, + 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, + 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, + 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 658, 659, 364, 365, 660, 367, 368, + 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 663, 380, 381, 382, 383, 0, 384, 385, + 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 666, 400, 401, 402, 667, 404, + 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 669, 417, 418, 419, 420, 421, 422, - 670, 424, 425, 0, 672, 427, 428, 673, 430, 0, + 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 675, 444, 676, 0, 0, 446, 447, 0, - 448, 680, 450, 451, 452, 453, 454, 0, 455, 682, - 683, 0, 0, 458, 459, 686, 461, 687, 1343, 463, - 464, 689, 466, 467, 468, 469, 470, 0, 0, 471, + 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, + 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, + 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, + 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 694, 695, 0, 485, 697, 487, 488, + 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 512, 513, 514, - 515, 964, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 964, 1341, 815, 0, 0, 0, 1046, 0, 0, + 2698, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 3, 4, 0, 560, 0, 0, 0, 0, + 126, 127, 0, 0, 0, 560, 0, 0, 0, 0, 565, 129, 130, 0, 131, 132, 133, 567, 135, 136, 137, 568, 569, 570, 571, 572, 0, 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, 151, 152, 576, @@ -9185,7 +8644,7 @@ static const yytype_int16 yytable[] = 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 600, 221, 222, 223, 224, 225, 601, 0, 227, 0, + 600, 221, 222, 223, 224, 225, 601, 1342, 227, 0, 228, 229, 604, 231, 0, 232, 0, 233, 607, 0, 609, 236, 237, 610, 611, 240, 0, 241, 0, 614, 615, 244, 245, 0, 246, 247, 248, 249, 250, 251, @@ -9198,7 +8657,7 @@ static const yytype_int16 yytable[] = 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 636, 637, 638, 323, 324, 325, 639, 0, 327, 328, 641, 330, 0, 643, 332, - 644, 334, 335, 336, 0, 337, 338, 0, 0, 339, + 644, 334, 335, 336, 0, 337, 338, 1343, 0, 339, 340, 341, 0, 0, 342, 343, 650, 651, 346, 652, 653, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, 361, 658, 659, @@ -9213,7243 +8672,3932 @@ static const yytype_int16 yytable[] = 436, 437, 438, 439, 440, 441, 442, 675, 444, 676, 0, 0, 446, 447, 0, 448, 680, 450, 451, 452, 453, 454, 0, 455, 682, 683, 0, 0, 458, 459, - 686, 461, 687, 0, 463, 464, 689, 466, 467, 468, + 686, 461, 687, 1344, 463, 464, 689, 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, 482, 694, 695, 0, 485, 697, 487, 488, 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, 500, 702, 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 512, 513, 514, 515, 116, 0, 0, 0, + 711, 712, 512, 513, 514, 515, 0, 0, 1611, 0, + 0, 1612, 0, 1345, 1346, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1620, 0, 0, 0, + 0, 2167, 0, 0, 0, 0, 1622, 1611, 0, 0, + 1612, 0, 0, 1623, 1613, 1614, 1615, 1616, 1617, 1618, + 1619, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1620, 0, 0, 0, 0, + 1624, 0, 0, 0, 0, 1622, 1611, 0, 0, 1612, + 0, 0, 1623, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 129, 130, 0, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 785, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 786, 0, 787, 0, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 788, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 234, 0, 235, 236, 237, 238, 239, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 288, 289, 290, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 0, 327, 328, - 329, 330, 0, 790, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 345, 346, 347, 792, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 793, 363, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 426, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 795, 0, 0, 446, 447, 0, - 448, 449, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 796, 461, 797, 0, 463, - 464, 798, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 116, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1620, 0, 0, 0, 0, 1624, + 0, 0, 0, 0, 1622, 0, 2168, 0, 0, 0, + 0, 1623, 0, 0, 1611, 0, 0, 1612, 0, 0, + 0, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1624, 0, + 0, 0, 1620, 0, 0, 0, 1890, 0, 0, 0, + 0, 0, 1622, 0, 1611, 0, 1625, 1612, 0, 1623, + 0, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, + 0, 0, 0, 1626, 0, 0, 0, 0, 1627, 0, + 0, 0, 1620, 0, 0, 1926, 1624, 0, 0, 0, + 1927, 0, 1622, 0, 0, 1625, 0, 0, 0, 1623, + 0, 1628, 1629, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1626, 0, 0, 0, 1630, 1627, 0, 0, + 0, 0, 0, 3505, 0, 0, 1624, 0, 0, 0, + 0, 0, 0, 0, 1625, 0, 0, 0, 0, 0, + 1628, 1629, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1626, 0, 0, 1631, 1630, 1627, 1632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 128, 129, 130, 0, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 161, - 0, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 234, 0, - 235, 236, 237, 238, 239, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 288, 289, 290, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 0, 327, 328, 329, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 363, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 426, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 0, 0, 446, 447, 0, 448, 449, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, + 0, 1633, 0, 0, 1634, 0, 0, 0, 0, 1628, + 1629, 0, 1625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1631, 1630, 0, 1632, 0, 0, 1626, + 0, 0, 0, 0, 1627, 0, 0, 0, 0, 0, + 1633, 0, 0, 1634, 0, 0, 0, 0, 0, 0, + 0, 0, 1625, 0, 0, 0, 0, 1628, 1629, 0, + 0, 0, 1631, 0, 0, 1632, 0, 0, 0, 1626, + 0, 0, 1630, 0, 1627, 0, 0, 0, 0, 1633, + 0, 0, 1634, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1628, 1629, 0, + 0, 1635, 0, 0, 0, 0, 0, 0, 0, 0, + 1631, 3506, 1630, 1632, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1633, 0, 0, + 1634, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1631, 0, 0, 1632, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2171, 0, 0, 1633, 0, 0, + 1634, 0, 0, 0, 0, 0, 0, 0, 0, 1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 1738, 156, 157, - 158, 159, 160, 0, 0, 1739, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 1740, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 1741, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 1742, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 1743, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 1744, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1897, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1636, 0, + 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, + 1645, 0, 0, 0, 0, 0, 0, 1635, 0, 0, + 0, 0, 1611, 0, 0, 1612, 0, 0, 0, 1613, + 1614, 1615, 1616, 1617, 1618, 1619, 0, 1636, 0, 0, + 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, + 1620, 0, 0, 0, 1932, 0, 0, 1635, 0, 0, + 1622, 0, 0, 0, 0, 0, 0, 1623, 0, 0, + 0, 0, 0, 0, 0, 0, 1636, 0, 0, 1637, + 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 0, + 0, 0, 0, 0, 1624, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1611, + 0, 0, 1612, 0, 0, 0, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 0, 1636, 0, 0, 1637, 1638, 1639, + 0, 1640, 1641, 1642, 1643, 1644, 1645, 1620, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1622, 0, 0, + 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1636, 0, 0, 1637, 1638, 1639, + 0, 1640, 1641, 1642, 1643, 1644, 1645, 0, 0, 0, + 0, 1624, 0, 0, 0, 0, 1611, 0, 0, 1612, + 1625, 0, 0, 1613, 1614, 1615, 1616, 1617, 1618, 1619, + 0, 0, 0, 0, 0, 0, 0, 1626, 0, 0, + 0, 0, 1627, 0, 1620, 0, 0, 0, 1939, 0, + 0, 0, 0, 0, 1622, 0, 0, 0, 0, 0, + 0, 1623, 0, 0, 0, 1628, 1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 1738, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 1740, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 1741, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 2317, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 1743, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 1744, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 1630, 0, 0, 0, 0, 0, 0, 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 3, 4, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, + 0, 0, 1937, 1611, 0, 0, 1612, 1625, 0, 0, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 1631, 0, + 0, 1632, 0, 0, 1626, 0, 0, 0, 0, 1627, + 0, 1620, 0, 0, 0, 1633, 0, 0, 1634, 0, + 0, 1622, 0, 0, 0, 0, 0, 0, 1623, 0, + 0, 0, 1628, 1629, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1630, 0, 0, + 0, 0, 0, 0, 0, 1624, 0, 0, 0, 0, + 0, 0, 0, 0, 1625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 550, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 551, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 0, 1626, 0, 0, 0, 1631, 1627, 0, 1632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 791, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, + 0, 0, 1633, 0, 0, 1634, 0, 0, 0, 1628, + 1629, 0, 0, 0, 0, 1635, 0, 0, 1611, 0, + 0, 1612, 0, 0, 1630, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2062, 0, 0, 0, 0, 1620, 0, 0, 0, + 0, 1625, 0, 0, 0, 0, 1622, 0, 0, 0, + 0, 0, 1631, 1623, 0, 1632, 0, 0, 1626, 0, + 0, 0, 0, 1627, 0, 0, 0, 0, 0, 1633, + 0, 0, 1634, 0, 0, 0, 0, 0, 0, 0, + 1624, 0, 0, 0, 0, 0, 1628, 1629, 0, 0, + 0, 0, 1635, 0, 0, 0, 0, 0, 0, 0, + 0, 1630, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1636, 0, 0, 1637, 1638, 1639, 0, 1640, + 1641, 1642, 1643, 1644, 1645, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1631, + 0, 0, 1632, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1633, 0, 0, 1634, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1635, + 0, 0, 0, 0, 0, 0, 1625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 896, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 791, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 0, 0, 0, 1626, 0, 0, 0, 0, 1627, 1636, + 0, 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, + 1644, 1645, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1628, 1629, 0, 0, 0, 0, 0, 0, 0, + 1611, 0, 0, 1612, 0, 0, 1630, 1613, 1614, 1615, + 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1635, 0, 1620, 0, + 0, 0, 2772, 0, 0, 0, 0, 0, 1622, 0, + 0, 0, 0, 0, 1631, 1623, 1636, 1632, 0, 1637, + 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 0, + 0, 1633, 0, 0, 1634, 0, 0, 0, 0, 0, + 0, 0, 1624, 0, 1611, 0, 0, 1612, 0, 0, + 0, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 938, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 1942, 0, 0, 0, 0, 1943, 0, 0, + 0, 0, 1620, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1622, 0, 0, 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 0, 0, 0, 1636, 0, 0, 1637, 1638, 1639, 0, + 1640, 1641, 1642, 1643, 1644, 1645, 1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 1950, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 1951, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 1952, - 448, 0, 450, 1953, 452, 1954, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 1955, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, + 0, 1635, 0, 1611, 0, 0, 1612, 0, 1625, 0, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, 0, + 0, 0, 0, 0, 0, 1626, 0, 0, 0, 0, + 1627, 1620, 0, 0, 2759, 0, 0, 0, 0, 0, + 0, 1622, 0, 0, 0, 0, 0, 0, 1623, 0, + 0, 0, 0, 1628, 1629, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1630, 0, + 0, 0, 0, 0, 0, 1624, 0, 0, 0, 0, + 0, 0, 1625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1626, + 0, 0, 0, 0, 1627, 0, 1631, 0, 1636, 1632, + 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, 1643, 1644, + 1645, 0, 0, 1633, 0, 0, 1634, 1628, 1629, 0, + 0, 0, 0, 0, 0, 0, 1611, 0, 0, 1612, + 0, 0, 1630, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 815, 0, + 0, 0, 0, 0, 1620, 0, 0, 0, 0, 0, + 0, 1625, 0, 0, 1622, 0, 0, 0, 0, 0, + 1631, 1623, 0, 1632, 0, 0, 0, 0, 1626, 0, + 0, 0, 0, 1627, 0, 0, 0, 1633, 0, 0, + 1634, 0, 0, 0, 0, 0, 0, 0, 1624, 0, + 0, 0, 0, 0, 0, 0, 1806, 1629, 0, 0, + 0, 0, 0, 1635, 0, 0, 0, 0, 0, 0, + 0, 1630, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1611, 0, 0, 1612, 0, 0, 0, 1613, + 1614, 0, 0, 1617, 1618, 1619, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1631, + 1620, 0, 1632, 0, 0, 0, 0, 0, 0, 0, + 1622, 0, 0, 0, 0, 0, 1633, 1623, 0, 1634, + 0, 0, 0, 0, 0, 0, 0, 1635, 0, 0, + 0, 0, 0, 0, 1625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1624, 0, 0, 0, 0, 0, + 0, 1626, 0, 0, 0, 0, 1627, 0, 0, 0, + 1636, 0, 0, 1637, 1638, 1639, 0, 1640, 1641, 1642, + 1643, 1644, 1645, 0, 0, 1611, 0, 0, 1612, 1628, + 1629, 0, 1613, 1614, 0, 0, 1617, 1618, 1619, 0, + 0, 0, 0, 0, 1630, 0, 0, 0, 0, 0, + 0, 0, 0, 1620, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1622, 0, 1611, 1635, 0, 1612, 0, + 1623, 0, 1613, 1614, 0, 0, 1617, 1618, 1619, 0, + 0, 0, 1631, 0, 1636, 1632, 0, 1637, 1638, 1639, + 1625, 1640, 1641, 1642, 1643, 1644, 1645, 1624, 0, 1633, + 0, 0, 1634, 1622, 0, 0, 0, 1626, 0, 0, + 1623, 0, 1627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1628, 1629, 1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 822, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 823, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 824, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 825, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 826, 457, 0, 0, 827, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 1630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 859, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1636, 0, 0, 1637, 1638, 1639, 0, + 1640, 1641, 1642, 1643, 1644, 1645, 0, 0, 1631, 0, + 0, 1632, 0, 1625, 0, 0, 0, 0, 0, 1635, + 0, 0, 0, 0, 0, 1633, 0, 0, 1634, 0, + 1626, 0, 0, 0, 0, 1627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 891, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 0, 0, 0, 1625, 0, 0, 0, 0, 1628, 1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 894, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, + 1626, 0, 0, 1630, 0, 1627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 898, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1628, 1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 926, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, + 0, 1631, 0, 1630, 1632, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1635, 1636, 0, 1633, 1637, + 1638, 1639, 0, 1640, 1641, 1642, 1643, 2188, 1645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 954, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 0, 1631, 0, 0, 1632, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 957, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 1000, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 1023, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 822, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 826, 457, 0, 0, 827, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 1302, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1635, 0, + 0, 0, 1636, 0, 0, 1637, 1638, 1639, 0, 1640, + 1641, 1642, 1643, 1644, 1645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 1304, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 1307, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 1309, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 2228, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 1475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 1476, 0, 0, -787, 0, - 1477, 129, 130, 0, 131, 132, 133, 1478, 135, 136, - 137, 0, 1479, 1480, 1481, 1482, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 1483, - 1484, 155, 0, 156, 157, 158, 159, 0, 0, 1485, - 0, 1486, 163, 164, 165, 166, 167, 1487, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 1488, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 1489, 190, 191, 1490, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 0, 221, 222, 223, 224, 225, 0, 0, 227, 0, - 228, 229, 1491, 231, 0, 232, 0, 233, 1492, 0, - 1493, 236, 237, -787, 1494, 240, 0, 241, 0, 0, - 0, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 1495, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 1496, 0, 268, 269, - 270, 271, 272, 1497, 1498, 0, 1499, 0, 276, 1500, - 1501, 279, 1502, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 1503, 289, 1504, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 1505, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 1506, 1507, 1508, 323, 324, - 325, 0, 0, 327, 328, 1509, 330, 0, 0, 332, - 1510, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 0, 1511, 346, 1512, - 0, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 0, 1513, - 364, 365, 0, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 1514, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 1515, - 400, 401, 402, 1516, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 1517, 417, - 418, 419, 420, 421, 422, 1518, 424, 425, 0, 1519, - 427, 428, 1520, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 1521, 444, 0, - 0, 0, 446, 447, 0, 448, 1522, 450, 451, 452, - 453, 454, 0, 455, 1523, 1524, 0, 0, 458, 459, - 0, 461, 0, 0, 463, 464, 1525, 466, 467, 468, - 469, 470, 1526, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 0, 1527, - 0, 485, 1528, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 523, 0, 549, 0, 0, 0, 0, 0, 0, - 0, 0, 512, 513, 514, 515, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 2971, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 837, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 838, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 839, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 840, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 841, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, + 0, 0, 0, 0, 0, 1636, 0, 0, 1637, 1638, + 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 950, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 555, + 0, 2085, 0, 0, 0, 1636, 0, 0, 1637, 1638, + 1639, 0, 1640, 1641, 1642, 1643, 1644, 1645, 117, 118, + 119, 120, 121, 122, 123, 124, 556, 125, 126, 127, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 129, + 130, 566, 131, 132, 133, 567, 135, 136, 137, 568, + 569, 570, 571, 572, 573, 143, 144, 145, 146, 147, + 148, 574, 575, 149, 150, 151, 152, 576, 577, 155, + 578, 156, 157, 158, 159, 579, 580, 581, 582, 583, + 163, 164, 165, 166, 167, 584, 169, 170, 171, 585, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 589, 190, + 191, 590, 193, 591, 194, 592, 195, 196, 197, 198, + 199, 200, 593, 594, 201, 202, 203, 204, 595, 596, + 205, 206, 207, 208, 209, 597, 210, 211, 212, 598, + 213, 214, 215, 599, 216, 217, 218, 219, 600, 221, + 222, 223, 224, 225, 601, 602, 227, 603, 228, 229, + 604, 231, 605, 232, 606, 233, 607, 608, 609, 236, + 237, 610, 611, 240, 612, 241, 613, 614, 615, 244, + 245, 616, 246, 247, 248, 249, 250, 251, 252, 617, + 254, 255, 256, 257, 618, 258, 259, 260, 261, 262, + 263, 264, 619, 265, 620, 621, 268, 269, 270, 271, + 272, 622, 623, 624, 625, 626, 276, 627, 628, 279, + 629, 281, 282, 283, 284, 285, 286, 630, 631, 287, + 632, 289, 633, 634, 291, 292, 293, 294, 295, 296, + 297, 298, 635, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 636, 637, 638, 323, 324, 325, 639, + 640, 327, 328, 641, 330, 642, 643, 332, 644, 334, + 335, 336, 645, 337, 338, 646, 647, 339, 340, 341, + 648, 649, 342, 343, 650, 651, 346, 652, 653, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 654, 655, 656, 657, 360, 361, 658, 659, 364, 365, + 660, 367, 368, 369, 661, 370, 371, 372, 373, 374, + 375, 662, 376, 377, 378, 663, 380, 381, 382, 383, + 664, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 665, 397, 398, 666, 400, 401, + 402, 667, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 668, 669, 417, 418, 419, + 420, 421, 422, 670, 424, 425, 671, 672, 427, 428, + 673, 430, 674, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 675, 444, 676, 677, 678, + 446, 447, 679, 448, 680, 450, 451, 452, 453, 454, + 681, 455, 682, 683, 684, 685, 458, 459, 686, 461, + 687, 688, 463, 464, 689, 466, 467, 468, 469, 470, + 690, 691, 471, 472, 473, 692, 474, 475, 476, 477, + 693, 478, 479, 480, 481, 482, 694, 695, 696, 485, + 697, 487, 488, 489, 490, 491, 492, 493, 698, 699, + 494, 700, 701, 495, 496, 497, 498, 499, 500, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 512, 513, 514, 515, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 839, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 841, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 556, 125, 126, 127, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 129, 130, 566, 131, 132, 133, + 567, 135, 136, 137, 568, 569, 570, 571, 572, 573, + 143, 144, 145, 146, 147, 148, 574, 575, 149, 150, + 151, 152, 576, 577, 155, 578, 156, 157, 158, 159, + 579, 580, 581, 582, 583, 163, 164, 165, 166, 167, + 584, 169, 170, 171, 585, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 180, 181, 182, 183, 184, 588, + 186, 187, 188, 589, 190, 191, 590, 193, 591, 194, + 592, 195, 196, 197, 198, 199, 200, 593, 594, 201, + 202, 203, 204, 595, 596, 205, 206, 207, 208, 209, + 597, 210, 211, 212, 598, 213, 214, 215, 599, 216, + 217, 218, 219, 600, 221, 222, 223, 224, 225, 601, + 602, 227, 603, 228, 229, 604, 231, 605, 232, 606, + 233, 607, 608, 609, 236, 237, 610, 611, 240, 612, + 241, 613, 614, 615, 244, 245, 616, 246, 247, 248, + 249, 250, 251, 252, 617, 254, 255, 256, 257, 618, + 258, 259, 260, 261, 262, 263, 264, 619, 265, 620, + 621, 268, 269, 270, 271, 272, 622, 623, 624, 625, + 626, 276, 627, 628, 279, 629, 281, 282, 283, 284, + 285, 286, 630, 631, 287, 632, 289, 633, 634, 291, + 292, 293, 294, 295, 296, 297, 298, 635, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 636, 637, + 638, 323, 324, 325, 639, 640, 327, 328, 641, 330, + 642, 643, 332, 644, 334, 335, 336, 645, 337, 338, + 646, 647, 339, 340, 341, 648, 649, 342, 343, 650, + 651, 346, 652, 653, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 654, 655, 656, 657, 360, + 361, 658, 659, 364, 365, 660, 367, 368, 369, 661, + 370, 371, 372, 373, 374, 375, 662, 376, 377, 378, + 663, 380, 381, 382, 383, 664, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 665, + 397, 398, 666, 400, 401, 402, 667, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 668, 669, 417, 418, 419, 420, 421, 422, 670, 424, + 425, 671, 672, 427, 428, 673, 430, 674, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 675, 444, 676, 677, 678, 446, 447, 679, 448, 680, + 450, 451, 452, 453, 454, 681, 455, 682, 683, 684, + 685, 458, 459, 686, 461, 687, 688, 463, 464, 689, + 466, 467, 468, 469, 470, 690, 691, 471, 472, 473, + 692, 474, 475, 476, 477, 693, 478, 479, 480, 481, + 482, 694, 695, 696, 485, 697, 487, 488, 489, 490, + 491, 492, 493, 698, 699, 494, 700, 701, 495, 496, + 497, 498, 499, 500, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 512, 513, 514, 515, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 1298, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 556, 125, 126, 127, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 129, + 130, 566, 131, 132, 133, 567, 135, 136, 137, 568, + 569, 570, 571, 572, 573, 143, 144, 145, 146, 147, + 148, 574, 575, 149, 150, 151, 152, 576, 577, 155, + 578, 156, 157, 158, 159, 579, 580, 581, 582, 583, + 163, 164, 165, 166, 167, 584, 169, 170, 171, 585, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 589, 190, + 191, 590, 193, 591, 194, 592, 195, 196, 197, 198, + 199, 200, 593, 594, 201, 202, 203, 204, 595, 596, + 205, 206, 207, 208, 209, 597, 210, 211, 212, 598, + 213, 214, 215, 599, 216, 217, 218, 219, 600, 221, + 222, 223, 224, 225, 601, 602, 227, 603, 228, 229, + 604, 231, 605, 232, 606, 233, 607, 608, 609, 236, + 237, 610, 611, 240, 612, 241, 613, 614, 615, 244, + 245, 616, 246, 247, 248, 249, 250, 940, 252, 617, + 254, 255, 256, 257, 618, 258, 259, 260, 261, 262, + 263, 264, 619, 265, 620, 621, 268, 269, 270, 271, + 272, 622, 623, 624, 625, 626, 276, 627, 628, 279, + 629, 281, 282, 283, 284, 285, 286, 630, 631, 287, + 632, 289, 633, 634, 291, 292, 293, 294, 295, 296, + 297, 298, 635, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 636, 637, 638, 323, 324, 325, 639, + 640, 327, 328, 641, 330, 642, 643, 332, 644, 334, + 335, 336, 645, 337, 338, 646, 647, 339, 340, 341, + 648, 649, 342, 343, 650, 651, 346, 652, 653, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 654, 655, 656, 657, 360, 361, 658, 659, 364, 365, + 660, 367, 368, 369, 661, 370, 371, 372, 373, 374, + 375, 662, 376, 377, 378, 663, 380, 381, 382, 383, + 664, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 665, 397, 398, 666, 400, 401, + 402, 667, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 668, 669, 417, 418, 419, + 420, 421, 422, 670, 424, 425, 671, 672, 427, 428, + 673, 430, 674, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 675, 444, 676, 677, 678, + 446, 447, 679, 448, 680, 450, 451, 452, 453, 454, + 681, 455, 682, 683, 684, 685, 458, 459, 686, 461, + 687, 688, 463, 464, 689, 466, 467, 468, 469, 470, + 690, 691, 471, 472, 473, 692, 474, 475, 476, 477, + 693, 478, 479, 480, 481, 482, 694, 695, 696, 485, + 697, 487, 488, 489, 490, 491, 492, 493, 698, 699, + 494, 700, 701, 495, 496, 497, 498, 499, 500, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 512, 513, 514, 515, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 1319, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 556, 125, 126, 127, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 129, 130, 566, 131, 132, 133, + 567, 135, 136, 137, 568, 569, 570, 571, 572, 573, + 143, 144, 145, 146, 147, 148, 574, 575, 149, 150, + 151, 152, 576, 577, 155, 578, 156, 157, 158, 159, + 579, 580, 581, 582, 583, 163, 164, 165, 166, 167, + 584, 169, 170, 171, 585, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 589, 190, 191, 590, 193, 591, 194, + 592, 195, 196, 197, 198, 199, 200, 593, 594, 201, + 202, 203, 204, 595, 596, 205, 206, 207, 208, 209, + 597, 210, 211, 212, 598, 213, 214, 215, 599, 216, + 217, 218, 219, 600, 221, 222, 223, 224, 225, 601, + 602, 227, 603, 228, 229, 604, 231, 605, 232, 606, + 233, 607, 608, 609, 236, 237, 610, 611, 240, 612, + 241, 613, 614, 615, 244, 245, 616, 246, 247, 248, + 249, 250, 251, 252, 617, 254, 255, 256, 257, 618, + 258, 259, 260, 261, 262, 263, 264, 619, 265, 620, + 621, 268, 269, 270, 271, 272, 622, 623, 624, 625, + 626, 276, 627, 628, 279, 629, 281, 282, 283, 284, + 285, 286, 630, 631, 287, 632, 289, 633, 634, 291, + 292, 293, 294, 295, 296, 297, 298, 635, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 636, 637, + 638, 323, 324, 325, 639, 640, 327, 328, 641, 330, + 642, 643, 332, 644, 334, 335, 336, 645, 337, 338, + 646, 647, 339, 340, 341, 648, 649, 342, 343, 650, + 651, 346, 652, 653, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 654, 655, 656, 657, 360, + 361, 658, 659, 364, 365, 660, 367, 368, 369, 661, + 370, 371, 372, 373, 374, 375, 662, 376, 377, 378, + 663, 380, 381, 382, 383, 664, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 665, + 397, 398, 666, 400, 401, 402, 667, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 668, 669, 417, 418, 419, 420, 421, 422, 670, 424, + 425, 671, 672, 427, 428, 673, 430, 674, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 675, 444, 676, 677, 678, 446, 447, 679, 448, 680, + 450, 451, 452, 453, 454, 681, 455, 682, 683, 684, + 685, 458, 459, 686, 461, 687, 688, 463, 464, 689, + 466, 467, 468, 469, 470, 690, 691, 471, 472, 473, + 692, 474, 475, 476, 477, 693, 478, 479, 480, 481, + 482, 694, 695, 696, 485, 697, 487, 488, 489, 490, + 491, 492, 493, 698, 699, 494, 700, 701, 495, 496, + 497, 498, 499, 500, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 512, 513, 514, 515, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 1670, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 0, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 1846, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 244, 245, 0, 246, - 247, 248, 249, 250, 2215, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 130, 0, 131, 132, 133, 0, 135, 136, - 137, 138, 139, 0, 141, 142, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 153, - 154, 155, 0, 156, 157, 158, 159, 160, 0, 0, - 0, 162, 163, 164, 165, 166, 167, 0, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 0, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 207, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 0, 227, 0, - 228, 229, 230, 231, 0, 232, 0, 233, 0, 0, - 0, 236, 237, 524, 0, 240, 0, 241, 0, 242, - 243, 244, 245, 0, 246, 247, 248, 249, 250, 2230, - 252, 0, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 0, 267, 268, 269, - 270, 271, 272, 273, 274, 0, 275, 0, 276, 0, - 0, 279, 0, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 0, 289, 0, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 0, 322, 323, 324, - 325, 326, 0, 327, 328, 0, 330, 0, 331, 332, - 333, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 344, 0, 346, 0, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 362, 0, - 364, 365, 366, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 0, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 0, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 0, 0, - 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 526, 444, 445, - 0, 0, 446, 447, 0, 448, 0, 450, 451, 452, - 453, 454, 0, 455, 456, 457, 0, 0, 458, 459, - 460, 461, 462, 0, 463, 464, 465, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 483, 484, - 0, 485, 0, 487, 488, 489, 490, 491, 492, 493, - 0, 0, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 1475, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 1476, 0, 0, 0, 0, 1477, 129, 130, 0, 131, - 132, 133, 1478, 135, 136, 137, 0, 1479, 1480, 1481, - 1482, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 1483, 1484, 155, 0, 156, 157, - 158, 159, 0, 0, 1485, 0, 1486, 163, 164, 165, - 166, 167, 1487, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 1488, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 1489, 190, 191, 1490, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 0, 221, 222, 223, 224, - 225, 0, 0, 227, 0, 228, 229, 1491, 231, 0, - 232, 0, 233, 1492, 0, 1493, 236, 237, 0, 1494, - 240, 0, 241, 0, 0, 0, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 1495, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 1496, 0, 268, 269, 270, 271, 272, 1497, 1498, - 0, 1499, 0, 276, 1500, 1501, 279, 1502, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 1503, 289, 1504, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 1505, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 1506, 1507, 1508, 323, 324, 325, 0, 0, 327, 328, - 1509, 330, 0, 0, 332, 1510, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 0, 1511, 346, 1512, 0, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 0, 1513, 364, 365, 0, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 1514, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 1515, 400, 401, 402, 1516, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 1517, 417, 418, 419, 420, 421, 422, - 1518, 424, 425, 0, 1519, 427, 428, 1520, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 1521, 444, 0, 0, 0, 446, 447, 0, - 448, 1522, 450, 451, 452, 453, 454, 0, 455, 1523, - 1524, 0, 0, 458, 459, 0, 461, 0, 0, 463, - 464, 1525, 466, 467, 468, 469, 470, 1526, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 0, 1527, 0, 485, 1528, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 1475, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 512, 513, 514, - 515, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 1476, 0, 0, 0, 0, 1477, 129, 130, 0, 131, - 132, 133, 1478, 135, 136, 137, 0, 1479, 1480, 1481, - 1482, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 1483, 1484, 155, 0, 156, 157, - 158, 159, 0, 0, 1485, 0, 1486, 163, 164, 165, - 166, 167, 1487, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 1488, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 1489, 190, 191, 1490, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, - 208, 209, 0, 210, 211, 212, 0, 1828, 214, 215, - 0, 216, 217, 218, 219, 0, 221, 222, 223, 224, - 225, 0, 0, 227, 0, 228, 229, 1491, 231, 0, - 232, 0, 233, 1492, 0, 1493, 236, 237, 0, 1494, - 240, 0, 241, 0, 0, 0, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 1495, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 1496, 0, 268, 269, 270, 271, 272, 1497, 1498, - 0, 1499, 0, 276, 1500, 1501, 279, 1502, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 1503, 289, 1504, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 1505, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 1506, 1507, 1508, 323, 324, 325, 0, 0, 327, 328, - 1509, 330, 0, 0, 332, 1510, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 0, 1511, 346, 1512, 0, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 0, 1513, 364, 365, 0, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 1514, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 1515, 400, 401, 402, 1516, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 1517, 417, 418, 419, 420, 421, 422, - 1518, 424, 425, 0, 1519, 427, 428, 1520, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 1521, 444, 0, 0, 0, 446, 447, 0, - 448, 1522, 450, 451, 452, 453, 454, 0, 455, 1523, - 1524, 0, 0, 458, 459, 0, 461, 0, 0, 463, - 464, 1525, 466, 467, 468, 469, 470, 1526, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 0, 1527, 0, 485, 1528, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 3141, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 512, 513, 514, - 515, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 2893, 0, 0, 0, 0, 2894, 129, 130, 0, 131, - 132, 133, 2895, 135, 136, 137, 0, 1479, 2896, 1481, - 1482, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 1483, 1484, 155, 0, 156, 157, - 158, 159, 0, 0, 2897, 0, 2898, 163, 164, 165, - 166, 167, 2899, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 2900, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 1489, 190, 191, 1490, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 1059, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 0, 221, 222, 223, 224, - 225, 0, 0, 227, 0, 228, 229, 1491, 231, 0, - 232, 0, 233, 2901, 0, 2902, 236, 237, 2903, 2904, - 240, 0, 241, 0, 0, 0, 244, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 2905, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 2906, 0, 268, 269, 270, 271, 272, 1497, 1498, - 0, 1499, 0, 276, 2907, 2908, 279, 2909, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 2910, 289, 2911, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 3142, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 1506, 2913, 1508, 323, 324, 325, 0, 0, 327, 328, - 2915, 330, 0, 0, 332, 1510, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 0, 2917, 346, 2918, 0, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 0, 2919, 364, 365, 0, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 377, 378, 1514, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 2920, 400, 401, 402, 0, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 2921, 417, 418, 419, 420, 421, 422, - 0, 424, 425, 0, 2923, 427, 428, 1520, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 3143, 444, 0, 0, 0, 446, 447, 0, - 448, 2925, 450, 451, 452, 453, 454, 0, 455, 1523, - 1524, 0, 0, 458, 459, 0, 461, 0, 0, 463, - 464, 2926, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 0, 1527, 0, 485, 2928, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 523, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 512, 513, 514, - 515, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 124, 0, 125, 126, 127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 129, 130, 0, 131, - 132, 133, 0, 135, 136, 137, 138, 139, 0, 141, - 142, 0, 143, 144, 145, 146, 147, 148, 0, 0, - 149, 150, 151, 152, 153, 154, 155, 0, 156, 157, - 158, 159, 160, 0, 0, 0, 162, 163, 164, 165, - 166, 167, 0, 169, 170, 171, 0, 172, 173, 174, - 175, 176, 177, 0, 0, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 0, 194, 0, 195, 196, 197, 198, 199, 200, 0, - 0, 201, 202, 203, 204, 0, 0, 205, 206, 207, - 208, 209, 0, 210, 211, 212, 0, 213, 214, 215, - 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 0, 227, 0, 228, 229, 230, 231, 0, - 232, 0, 233, 0, 0, 0, 236, 237, 524, 0, - 240, 0, 241, 0, 242, 243, 0, 245, 0, 246, - 247, 248, 249, 250, 251, 252, 0, 254, 255, 256, - 257, 0, 258, 259, 260, 261, 262, 263, 264, 0, - 265, 0, 267, 268, 269, 270, 271, 272, 273, 274, - 0, 275, 0, 276, 0, 0, 279, 0, 281, 282, - 283, 284, 285, 286, 0, 0, 287, 0, 289, 0, - 0, 291, 292, 293, 294, 295, 296, 297, 298, 525, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 0, 322, 323, 324, 325, 326, 0, 327, 328, - 0, 330, 0, 331, 332, 333, 334, 335, 336, 0, - 337, 338, 0, 0, 339, 340, 341, 0, 0, 342, - 343, 344, 0, 346, 0, 348, 349, 350, 351, 352, - 353, 354, 0, 356, 357, 358, 359, 0, 0, 0, - 0, 360, 361, 362, 0, 364, 365, 366, 367, 368, - 369, 0, 370, 371, 372, 373, 374, 375, 0, 376, - 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 397, 398, 0, 400, 401, 402, 403, 0, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 0, 0, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 0, 0, 427, 428, 429, 430, 0, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 526, 444, 445, 0, 0, 446, 447, 0, - 448, 0, 450, 451, 452, 453, 454, 0, 455, 456, - 457, 0, 0, 458, 459, 460, 461, 462, 0, 463, - 464, 465, 466, 467, 468, 469, 470, 0, 0, 471, - 472, 473, 0, 474, 475, 476, 477, 0, 478, 479, - 480, 481, 482, 483, 484, 0, 485, 0, 487, 488, - 489, 490, 491, 492, 493, 0, 0, 494, 0, 0, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 1765, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 118, 119, 120, 121, 122, 123, 124, 0, 125, - 126, 127, 0, 0, 0, 1476, 0, 0, 0, 0, - 1477, 129, 130, 0, 131, 132, 133, 1478, 135, 136, - 137, 0, 1479, 1480, 1481, 1482, 0, 143, 144, 145, - 146, 147, 148, 0, 0, 149, 150, 151, 152, 1483, - 1484, 155, 0, 156, 157, 158, 159, 0, 0, 1485, - 0, 1486, 163, 164, 165, 166, 167, 1487, 169, 170, - 171, 0, 172, 173, 174, 175, 176, 177, 0, 1488, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 1489, 190, 191, 1490, 193, 0, 194, 0, 195, 196, - 197, 198, 199, 200, 0, 0, 201, 202, 203, 204, - 0, 0, 205, 206, 1059, 208, 209, 0, 210, 211, - 212, 0, 213, 214, 215, 0, 216, 217, 218, 219, - 0, 221, 222, 223, 224, 225, 0, 0, 227, 0, - 228, 229, 1491, 231, 0, 232, 0, 233, 1492, 0, - 1493, 236, 237, 0, 1494, 240, 0, 241, 0, 0, - 0, 244, 245, 0, 246, 247, 248, 249, 250, 251, - 252, 1495, 254, 255, 256, 257, 0, 258, 259, 260, - 261, 262, 263, 264, 0, 265, 1496, 0, 268, 269, - 270, 271, 272, 1497, 1498, 0, 1499, 0, 276, 1500, - 1501, 279, 1502, 281, 282, 283, 284, 285, 286, 0, - 0, 287, 1503, 289, 1504, 0, 291, 292, 293, 294, - 295, 296, 297, 298, 0, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 1506, 1507, 1508, 323, 324, - 325, 0, 0, 327, 328, 1509, 330, 0, 0, 332, - 1510, 334, 335, 336, 0, 337, 338, 0, 0, 339, - 340, 341, 0, 0, 342, 343, 0, 1511, 346, 1512, - 0, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 0, 0, 0, 0, 360, 361, 0, 1513, - 364, 365, 0, 367, 368, 369, 0, 370, 371, 372, - 373, 374, 375, 0, 376, 377, 378, 1514, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 397, 398, 1515, - 400, 401, 402, 0, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 0, 1517, 417, - 418, 419, 420, 421, 422, 0, 424, 425, 0, 1519, - 427, 428, 1520, 430, 0, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 0, 444, 0, - 0, 0, 446, 447, 0, 448, 1522, 450, 451, 452, - 453, 454, 0, 455, 1523, 1524, 0, 0, 458, 459, - 0, 461, 0, 0, 463, 464, 1525, 466, 467, 468, - 469, 470, 0, 0, 471, 472, 473, 0, 474, 475, - 476, 477, 0, 478, 479, 480, 481, 482, 0, 1527, - 0, 485, 1528, 487, 488, 489, 490, 491, 492, 493, - 0, 1, 494, 0, 0, 495, 496, 497, 498, 499, - 500, 2, 0, 3, 4, 0, 0, 0, 0, 1, - 0, 0, 512, 513, 514, 515, 0, 0, 0, 2, - 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 0, 8, 0, 0, 0, 7, 0, - 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 11, 0, 746, - 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 0, 11, 0, 746, 0, 0, - 0, 0, 0, 0, 0, 14, 15, 0, 13, 0, - 0, 0, 0, 0, 0, 0, 747, 0, 0, 0, - 0, 0, 18, 14, 15, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 747, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 0, 0, 22, 0, 19, 0, - 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 22, 0, 0, 0, 23, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, 26, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 2233, 122, 123, 124, 556, 125, 126, 127, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 129, + 130, 566, 131, 132, 133, 567, 135, 136, 137, 568, + 569, 570, 571, 572, 573, 143, 144, 145, 146, 147, + 148, 574, 575, 149, 150, 151, 152, 576, 577, 155, + 578, 156, 157, 158, 159, 579, 580, 581, 582, 583, + 163, 164, 165, 166, 167, 584, 169, 170, 171, 585, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 589, 190, + 191, 590, 193, 591, 194, 592, 195, 196, 197, 198, + 199, 200, 593, 594, 201, 202, 203, 204, 595, 596, + 205, 206, 207, 2234, 209, 597, 210, 211, 212, 598, + 213, 214, 215, 599, 216, 217, 218, 219, 600, 221, + 222, 223, 224, 225, 601, 602, 227, 603, 228, 229, + 604, 231, 605, 232, 606, 233, 607, 608, 609, 236, + 237, 610, 611, 240, 612, 241, 613, 614, 615, 244, + 245, 616, 246, 247, 248, 249, 250, 251, 252, 617, + 254, 255, 256, 257, 618, 258, 259, 260, 261, 262, + 263, 264, 619, 265, 620, 621, 268, 269, 270, 271, + 272, 622, 623, 624, 625, 626, 276, 627, 628, 279, + 629, 281, 282, 283, 284, 285, 286, 630, 631, 287, + 632, 289, 633, 634, 291, 292, 293, 294, 295, 296, + 297, 298, 635, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 636, 637, 638, 323, 324, 325, 639, + 640, 327, 328, 641, 330, 642, 643, 332, 644, 334, + 335, 336, 645, 337, 338, 646, 647, 339, 340, 341, + 648, 649, 342, 343, 650, 651, 346, 652, 653, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 654, 655, 656, 657, 360, 361, 658, 659, 364, 365, + 660, 367, 368, 369, 661, 370, 371, 372, 373, 374, + 375, 662, 376, 377, 378, 663, 380, 381, 382, 383, + 664, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 665, 397, 398, 666, 400, 401, + 402, 667, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 668, 669, 417, 418, 419, + 420, 421, 2235, 670, 424, 425, 671, 672, 427, 428, + 673, 430, 674, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 675, 444, 676, 677, 678, + 446, 447, 679, 448, 680, 450, 451, 452, 453, 454, + 681, 455, 682, 683, 684, 685, 458, 459, 686, 461, + 687, 688, 463, 464, 689, 466, 467, 468, 469, 470, + 690, 691, 471, 472, 473, 692, 474, 475, 476, 477, + 693, 478, 479, 480, 481, 482, 694, 695, 696, 485, + 697, 487, 488, 489, 490, 491, 492, 493, 698, 699, + 494, 700, 701, 495, 496, 497, 498, 499, 500, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 512, 513, 514, 515, 964, 0, 815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 560, 0, + 0, 0, 0, 565, 129, 130, 0, 131, 132, 133, + 567, 135, 136, 137, 568, 569, 570, 571, 572, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 576, 577, 155, 0, 156, 157, 158, 159, + 579, 0, 581, 0, 583, 163, 164, 165, 166, 167, + 584, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 587, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 589, 190, 191, 590, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 600, 221, 222, 223, 224, 225, 601, + 1342, 227, 0, 228, 229, 604, 231, 0, 232, 0, + 233, 607, 0, 609, 236, 237, 610, 611, 240, 0, + 241, 0, 614, 615, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 617, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 620, + 621, 268, 269, 270, 271, 272, 622, 623, 0, 625, + 0, 276, 627, 628, 279, 629, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 632, 289, 633, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 635, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 636, 637, + 638, 323, 324, 325, 639, 0, 327, 328, 641, 330, + 0, 643, 332, 644, 334, 335, 336, 0, 337, 338, + 1343, 0, 339, 340, 341, 0, 0, 342, 343, 650, + 651, 346, 652, 653, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 658, 659, 364, 365, 660, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 663, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 666, 400, 401, 402, 667, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 669, 417, 418, 419, 420, 421, 422, 670, 424, + 425, 0, 672, 427, 428, 673, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 675, 444, 676, 0, 0, 446, 447, 0, 448, 680, + 450, 451, 452, 453, 454, 0, 455, 682, 683, 0, + 0, 458, 459, 686, 461, 687, 1344, 463, 464, 689, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 694, 695, 0, 485, 697, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 512, 513, 514, 515, 964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 3, 4, 0, 560, 0, 0, 0, 0, 565, 129, + 130, 0, 131, 132, 133, 567, 135, 136, 137, 568, + 569, 570, 571, 572, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 576, 577, 155, + 0, 156, 157, 158, 159, 579, 0, 581, 0, 583, + 163, 164, 165, 166, 167, 584, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 587, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 589, 190, + 191, 590, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 600, 221, + 222, 223, 224, 225, 601, 0, 227, 0, 228, 229, + 604, 231, 0, 232, 0, 233, 607, 0, 609, 236, + 237, 610, 611, 240, 0, 241, 0, 614, 615, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 617, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 620, 621, 268, 269, 270, 271, + 272, 622, 623, 0, 625, 0, 276, 627, 628, 279, + 629, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 632, 289, 633, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 635, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 636, 637, 638, 323, 324, 325, 639, + 0, 327, 328, 641, 330, 0, 643, 332, 644, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 650, 651, 346, 652, 653, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 658, 659, 364, 365, + 660, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 663, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 666, 400, 401, + 402, 667, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 669, 417, 418, 419, + 420, 421, 422, 670, 424, 425, 0, 672, 427, 428, + 673, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 675, 444, 676, 0, 0, + 446, 447, 0, 448, 680, 450, 451, 452, 453, 454, + 0, 455, 682, 683, 0, 0, 458, 459, 686, 461, + 687, 0, 463, 464, 689, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 694, 695, 0, 485, + 697, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 512, 513, 514, 515, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 128, 129, 130, 0, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 785, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 786, 0, 787, 0, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 788, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 234, 0, 235, 236, 237, 238, 239, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 288, 289, 290, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 0, 327, 328, 329, 330, + 0, 790, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 345, 346, 347, 792, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 793, 363, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 426, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 795, 0, 0, 446, 447, 0, 448, 449, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 796, 461, 797, 0, 463, 464, 798, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, + 130, 0, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 161, 0, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 234, 0, 235, 236, + 237, 238, 239, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 288, 289, 290, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 0, 327, 328, 329, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 426, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 0, 0, + 446, 447, 0, 448, 449, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 27, 28, 29, 0, 0, 0, 0, - 0, 30, 0, 0, 31, 0, 0, 0, 0, 0, - 0, 27, 28, 29, 0, 0, 0, 0, 0, 30, - 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, - 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 0, 0, 0, 0, 0, 0, 34, 0, - 33, 0, 0, 0, 0, 35, 0, 0, 0, 36, - 0, 0, 0, 0, 0, 0, 34, 0, 0, 37, - 0, 0, 0, 35, 0, 0, 0, 36, 0, 0, - 0, 38, 0, 0, 0, 39, 0, 37, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, - 0, 0, 0, 39, 0, 40, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, - 0, 0, 0, 40, 43, 0, 0, 0, 0, 44, - 0, 0, 0, 748, 0, 0, 41, 0, 0, 0, - 0, 0, 43, 0, 0, 45, 0, 44, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 1739, 156, 157, 158, 159, + 160, 0, 0, 1740, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 1741, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 1742, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 1743, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 1744, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 1745, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 45, 0, 0, 0, 0, 0, 46, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 1739, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 1741, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 1742, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 2318, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 1744, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 1745, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 749, 0, 0, 0, 46, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 3, 4, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 550, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 551, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 47 -}; - -static const yytype_int16 yycheck[] = -{ - 7, 0, 0, 47, 0, 73, 516, 0, 955, 16, - 0, 0, 895, 835, 0, 0, 23, 0, 904, 749, - 990, 0, 0, 881, 1235, 809, 970, 75, 76, 858, - 1691, 1196, 1223, 1032, 925, 920, 1221, 1156, 20, 741, - 38, 20, 20, 1417, 16, 77, 1573, 981, 981, 1209, - 1079, 981, 77, 981, 1654, 2140, 1190, 2142, 1465, 17, - 1198, 2313, 7, 2226, 2161, 959, 23, 1275, 75, 76, - 1986, 1201, 970, 2648, 1796, 46, 1297, 2171, 23, 0, - 39, 895, 2106, 897, 7, 899, 0, 0, 1226, 0, - 1123, 25, 26, 0, 0, 1128, 1607, 1608, 0, 2609, - 23, 2160, 100, 2663, 2609, 0, 26, 1987, 0, 805, - 0, 0, 1322, 999, 810, 2670, 748, 1087, 75, 76, - 0, 749, 742, 0, 0, 0, 2483, 2293, 0, 0, - 75, 76, 35, 0, 0, 0, 0, 2646, 2274, 2275, - 2276, 2565, 5, 2222, 0, 2569, 5, 0, 1658, 1709, - 979, 110, 75, 76, 5, 1711, 1814, 1053, 1054, 11, - 1927, 5, 13, 14, 16, 5, 13, 14, 5, 5, - 1815, 80, 5, 5, 1070, 5, 9, 13, 14, 5, - 114, 13, 14, 13, 14, 5, 5, 13, 14, 9, - 1134, 970, 5, 5, 5, 5, 4, 772, 982, 2982, - 5, 9, 2305, 9, 5, 2301, 172, 2299, 171, 5, - 5, 26, 2967, 3, 119, 5, 45, 32, 45, 13, - 14, 1960, 1961, 3, 4, 5, 1818, 55, 3, 9, - 2985, 9, 1971, 876, 876, 2314, 1975, 124, 63, 63, - 970, 11, 40, 1242, 100, 15, 16, 100, 122, 122, - 11, 2434, 1251, 1139, 2434, 16, 37, 1086, 74, 34, - 35, 107, 60, 147, 8, 23, 1210, 11, 871, 1213, - 1214, 15, 16, 190, 2821, 63, 4, 139, 5, 82, - 82, 9, 180, 2362, 2363, 46, 2365, 983, 3146, 289, - 93, 93, 802, 11, 295, 290, 287, 15, 16, 995, - 104, 117, 46, 295, 63, 2867, 0, 11, 106, 53, - 312, 15, 16, 1432, 74, 275, 107, 75, 76, 80, - 2937, 40, 137, 192, 30, 244, 20, 1106, 46, 23, - 107, 2416, 38, 217, 192, 183, 80, 117, 212, 365, - 850, 973, 165, 171, 38, 132, 1465, 132, 117, 2802, - 3277, 2804, 2527, 47, 2529, 1134, 278, 106, 1518, 388, - 1189, 289, 80, 1185, 1186, 119, 1953, 1954, 1955, 379, - 30, 171, 2579, 30, 40, 75, 180, 30, 30, 161, - 172, 75, 76, 77, 1057, 38, 38, 3341, 161, 416, - 1611, 172, 2528, 108, 149, 170, 3309, 172, 41, 3385, - 1073, 145, 2977, 201, 13, 14, 100, 2129, 168, 454, - 163, 295, 2922, 2988, 3076, 2578, 3078, 430, 406, 3174, - 64, 1279, 90, 1308, 71, 72, 122, 208, 478, 120, - 74, 1210, 176, 289, 1213, 1214, 289, 3235, 218, 3237, - 420, 137, 422, 224, 3371, 200, 1337, 3374, 272, 193, - 500, 2475, 250, 234, 198, 237, 175, 108, 274, 2553, - 240, 129, 260, 279, 237, 428, 479, 30, 272, 514, - 2979, 393, 132, 2680, 272, 132, 191, 230, 293, 3433, - 468, 272, 415, 126, 3470, 514, 355, 274, 514, 337, - 108, 451, 236, 3276, 352, 1524, 2575, 284, 2577, 284, - 323, 250, 358, 194, 286, 358, 304, 509, 518, 175, - 279, 260, 328, 213, 514, 3313, 308, 518, 366, 514, - 453, 3434, 85, 514, 1745, 279, 518, 3144, 344, 448, - 514, 94, 357, 357, 120, 350, 534, 3199, 2713, 354, - 503, 3468, 3104, 3090, 1187, 1187, 2729, 291, 514, 2729, - 3408, 456, 279, 516, 3007, 118, 454, 166, 356, 1162, - 444, 3123, 386, 2659, 2656, 1344, 1345, 454, 328, 357, - 416, 386, 1979, 2676, 1739, 1150, 0, 451, 451, 2106, - 361, 588, 1092, 381, 413, 26, 413, 1483, 1484, 3372, - 2506, 32, 1800, 370, 1423, 514, 240, 514, 357, 380, - 392, 3161, 400, 512, 463, 2372, 244, 516, 194, 1339, - 472, 2690, 1508, 403, 404, 1437, 588, 2177, 3373, 1321, - 476, 425, 2178, 476, 1326, 428, 428, 190, 428, 445, - 1332, 327, 1454, 2144, 478, 476, 3146, 478, 454, 307, - 203, 3146, 457, 2170, 265, 1836, 1856, 391, 2306, 512, - 163, 514, 517, 516, 2164, 514, 500, 1656, 510, 515, - 1871, 517, 515, 514, 517, 478, 2311, 514, 1889, 520, - 514, 3095, 1568, 1569, 514, 2838, 3100, 514, 514, 2845, - 1901, 514, 514, 520, 514, 445, 514, 500, 514, 464, - 396, 2430, 3049, 518, 514, 514, 137, 505, 506, 320, - 3275, 514, 514, 514, 514, 749, 1338, 513, 1328, 514, - 1931, 1339, 2964, 514, 1600, 1601, 1602, 1938, 514, 514, - 514, 1550, 1551, 3283, 2316, 505, 506, 505, 506, 3284, - 518, 1560, 370, 476, 1430, 505, 506, 507, 508, 509, - 510, 517, 749, 396, 396, 1574, 148, 454, 476, 510, - 258, 259, 800, 421, 498, 1976, 800, 500, 271, 1980, - 2819, 505, 506, 507, 508, 509, 510, 749, 117, 748, - 748, 3474, 500, 226, 1603, 464, 1984, 505, 506, 356, - 11, 26, 789, 1897, 11, 33, 1565, 2008, 2704, 507, - 508, 509, 510, 800, 177, 249, 59, 199, 1577, 515, - 1579, 2825, 518, 507, 508, 509, 510, 514, 3383, 386, - 448, 59, 3515, 881, 1928, 46, 848, 1490, 1551, 272, - 274, 1940, 2958, 848, 5, 1769, 1605, 1560, 835, 836, - 2417, 2418, 2419, 2420, 503, 1779, 518, 1510, 1782, 402, - 534, 190, 405, 800, 789, 1844, 2872, 516, 782, 80, - 784, 858, 293, 80, 2880, 800, 1009, 240, 2738, 3368, - 1979, 2741, 1015, 2743, 784, 2781, 789, 375, 376, 868, - 868, 1544, 868, 312, 856, 868, 514, 800, 868, 868, - 814, 1764, 868, 868, 509, 868, 2965, 274, 859, 868, - 868, 516, 137, 512, 853, 902, 903, 516, 3408, 906, - 907, 1411, 2624, 3408, 2626, 839, 5, 1854, 171, 350, - 514, 1858, 871, 354, 1861, 1948, 514, 3426, 3170, 3494, - 2130, 1623, 503, 1737, 202, 274, 108, 366, 1872, 1708, - 1709, 1822, 352, 514, 837, 838, 389, 840, 2057, 1797, - 1798, 1799, 1004, 3106, 177, 386, 274, 868, 2475, 53, - 1764, 279, 959, 37, 868, 868, 515, 868, 1006, 518, - 1022, 868, 868, 970, 1026, 1013, 868, 925, 377, 1863, - 1784, 978, 979, 868, 1872, 1789, 868, 984, 868, 868, - 987, 988, 2493, 990, 991, 992, 993, 370, 868, 3086, - 1769, 868, 868, 868, 973, 973, 868, 868, 451, 1006, - 1779, 868, 868, 1782, 868, 244, 1013, 240, 336, 3334, - 3335, 26, 2146, 132, 2148, 377, 457, 32, 119, 82, - 2394, 416, 26, 82, 1031, 1032, 1033, 433, 32, 173, - 93, 789, 244, 132, 93, 513, 970, 420, 173, 422, - 159, 515, 800, 1087, 518, 1052, 524, 981, 293, 1006, - 244, 314, 315, 316, 748, 749, 1013, 202, 244, 2250, - 159, 1006, 3387, 513, 1071, 448, 251, 244, 1013, 2277, - 509, 2793, 176, 1775, 524, 1082, 1083, 1084, 1780, 1086, - 1087, 2200, 2609, 1006, 1091, 3001, 132, 3250, 172, 193, - 1013, 466, 370, 1872, 198, 789, 1030, 2318, 40, 478, - 512, 245, 514, 381, 516, 206, 800, 1936, 26, 354, - 245, 356, 1119, 159, 32, 420, 379, 422, 60, 1091, - 2258, 500, 137, 478, 208, 823, 824, 825, 26, 1136, - 1137, 370, 236, 137, 32, 514, 1168, 1169, 416, 1171, - 224, 386, 1872, 1168, 1169, 500, 1171, 4, 515, 509, - 234, 518, 9, 416, 848, 274, 516, 1014, 370, 514, - 279, 1018, 1096, 1170, 106, 284, 2136, 1174, 1175, 13, - 14, 272, 1106, 274, 868, 274, 370, 1184, 1185, 1186, - 279, 512, 1189, 514, 370, 284, 449, 420, 466, 422, - 2019, 1125, 1879, 370, 374, 2325, 1883, 460, 342, 1886, - 1134, 2331, 1209, 1162, 512, 4, 4, 342, 516, 448, - 9, 9, 377, 8, 1993, 448, 11, 161, 514, 137, - 15, 16, 166, 11, 19, 20, 21, 15, 16, 2450, - 420, 514, 422, 279, 26, 1242, 448, 381, 284, 137, - 32, 36, 4, 514, 1251, 161, 381, 9, 1006, 166, - 166, 514, 512, 514, 448, 1013, 516, 515, 46, 201, - 518, 1422, 448, 1424, 1425, 2094, 1225, 420, 1275, 422, - 514, 448, 416, 837, 838, 514, 840, 361, 293, 973, - 226, 416, 2229, 2141, 2231, 515, 514, 391, 518, 293, - 1297, 515, 80, 237, 518, 514, 380, 1296, 2825, 171, - 2707, 515, 514, 2232, 518, 2234, 1313, 1296, 250, 514, - 1296, 1296, 1006, 2432, 514, 1322, 435, 2436, 260, 1013, - 514, 237, 466, 3486, 13, 14, 272, 446, 514, 507, - 272, 466, 1339, 13, 14, 350, 435, 514, 514, 354, - 515, 1313, 286, 518, 514, 137, 350, 446, 515, 1356, - 354, 518, 500, 3438, 1048, 1362, 171, 1339, 515, 1338, - 1338, 518, 304, 2575, 2143, 2577, 1060, 514, 3453, 515, - 286, 386, 518, 515, 497, 293, 518, 3471, 515, 3473, - 223, 518, 386, 2205, 1356, 342, 13, 14, 2609, 435, - 342, 516, 338, 1087, 1442, 293, 1444, 2176, 2177, 1447, - 446, 2592, 1409, 1410, 1452, 289, 2591, 1455, 1415, 1457, - 1417, 2576, 2623, 1461, 356, 1422, 1423, 1424, 1425, 2304, - 3514, 1355, 497, 3508, 381, 1359, 221, 516, 3513, 381, - 1437, 1438, 350, 13, 14, 1442, 354, 1444, 171, 381, - 1447, 515, 457, 389, 518, 1452, 515, 1454, 1455, 518, - 1457, 2480, 2481, 457, 1461, 2640, 354, 170, 400, 416, - 2590, 518, 2592, 873, 416, 875, 188, 189, 386, 171, - 515, 514, 1417, 518, 1168, 1169, 515, 1171, 515, 518, - 515, 518, 515, 518, 515, 1442, 515, 1444, 386, 518, - 1447, 13, 14, 515, 1417, 1452, 291, 1442, 1455, 1444, - 1457, 293, 1447, 294, 1461, 451, 3228, 1452, 3230, 466, - 1455, 1518, 1457, 2483, 466, 515, 1461, 515, 518, 1442, - 518, 1444, 59, 2457, 1447, 2458, 2459, 2460, 2458, 1452, - 2458, 2459, 1455, 514, 1457, 177, 258, 259, 1461, 457, - 177, 417, 515, 1550, 1551, 518, 497, 515, 223, 1547, - 518, 1547, 1559, 1560, 1547, 13, 14, 1547, 350, 457, - 1567, 152, 354, 350, 1547, 202, 6, 1574, 1547, 1547, - 10, 152, 515, 515, 515, 518, 515, 518, 18, 518, - 152, 314, 315, 316, 515, 515, 515, 518, 518, 518, - 13, 14, 1599, 33, 386, 152, 1603, 37, 240, 1606, - 13, 14, 152, 240, 1611, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 1619, 1620, 13, 14, 40, 1624, 1625, 3146, - 2350, 515, 1629, 416, 518, 515, 1633, 515, 518, 1636, - 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 3238, 514, - 1647, 274, 2344, 40, 1338, 466, 379, 1654, 1620, 1656, - 89, 82, 515, 375, 376, 518, 152, 294, 2544, 1417, - 515, 515, 1694, 518, 518, 457, 480, 2888, 1675, 1694, - 152, 313, 13, 14, 2839, 2454, 2455, 108, 13, 14, - 516, 5, 152, 416, 1442, 152, 1444, 13, 14, 1447, - 1697, 1673, 13, 14, 1452, 2886, 289, 1455, 352, 1457, - 428, 1708, 1709, 1461, 13, 14, 501, 502, 503, 514, - 505, 506, 507, 508, 509, 510, 449, 505, 506, 507, - 508, 509, 510, 13, 14, 13, 14, 460, 370, 171, - 1664, 13, 14, 13, 14, 377, 2683, 514, 1745, 13, - 14, 514, 173, 13, 14, 2567, 515, 1754, 1442, 1756, - 1444, 2962, 418, 1447, 13, 14, 514, 8, 1452, 219, - 2651, 1455, 2922, 1457, 15, 16, 299, 1461, 19, 20, - 21, 202, 2630, 13, 14, 3436, 365, 366, 420, 3440, - 422, 514, 1754, 420, 1756, 422, 13, 14, 2673, 1796, - 13, 14, 224, 1800, 514, 2794, 1803, 1804, 365, 366, - 37, 296, 126, 127, 224, 42, 448, 224, 445, 365, - 366, 448, 365, 366, 245, 514, 3190, 262, 263, 40, - 375, 376, 514, 3044, 459, 460, 3448, 3449, 3480, 3481, - 2609, 235, 5, 8, 3495, 5, 11, 1844, 1136, 1137, - 15, 16, 1840, 514, 19, 20, 21, 171, 324, 1856, - 514, 514, 514, 1547, 5, 5, 1863, 1864, 1792, 514, - 5, 514, 5, 148, 101, 1872, 514, 9, 514, 477, - 104, 1805, 1806, 301, 518, 518, 515, 40, 386, 219, - 166, 3408, 1889, 286, 284, 166, 1893, 1894, 59, 1896, - 235, 514, 428, 514, 1901, 1902, 1903, 1904, 1905, 1906, - 1907, 93, 518, 1910, 1911, 1912, 1913, 1914, 1915, 1916, - 1917, 1918, 1919, 428, 1962, 59, 428, 265, 1925, 1926, - 1968, 74, 1929, 59, 1931, 3146, 428, 80, 108, 1936, - 524, 1938, 1626, 2877, 221, 172, 428, 428, 1872, 370, - 93, 476, 2889, 2890, 1878, 152, 100, 377, 198, 274, - 381, 1958, 274, 514, 274, 1962, 40, 1964, 274, 274, - 2739, 1968, 514, 152, 117, 171, 119, 3341, 516, 1976, - 13, 208, 3157, 1980, 515, 1982, 515, 1984, 171, 1986, - 518, 515, 224, 515, 515, 416, 515, 224, 515, 514, - 314, 315, 316, 473, 224, 514, 8, 234, 281, 11, - 1694, 2008, 281, 15, 16, 1962, 147, 514, 439, 518, - 3384, 1968, 2019, 2020, 463, 516, 514, 1962, 39, 516, - 161, 514, 472, 1968, 147, 166, 1033, 514, 514, 514, - 514, 268, 2734, 9, 46, 466, 426, 426, 161, 1962, - 291, 53, 13, 166, 11, 1968, 3016, 352, 19, 513, - 2094, 524, 2059, 206, 426, 379, 518, 2064, 2065, 3433, - 31, 3272, 518, 514, 521, 279, 390, 514, 80, 428, - 180, 162, 171, 454, 45, 46, 217, 314, 515, 217, - 518, 265, 2089, 2090, 321, 518, 389, 2094, 412, 226, - 290, 518, 416, 312, 217, 3214, 237, 312, 2877, 518, - 180, 2108, 219, 2882, 2111, 515, 2113, 514, 226, 274, - 226, 333, 295, 287, 237, 466, 291, 152, 514, 3, - 514, 274, 2129, 2130, 361, 449, 279, 1134, 514, 2136, - 152, 40, 2139, 145, 1828, 152, 460, 108, 152, 476, - 1033, 152, 274, 380, 3, 286, 1840, 147, 40, 2156, - 2929, 2930, 476, 59, 295, 289, 2858, 11, 289, 40, - 515, 161, 2169, 286, 176, 171, 166, 166, 515, 515, - 180, 515, 295, 166, 3, 328, 500, 39, 514, 2186, - 2187, 193, 2139, 514, 514, 3, 198, 3408, 515, 512, - 514, 344, 428, 512, 2139, 428, 2203, 428, 2205, 2156, - 428, 513, 1209, 521, 1962, 515, 497, 2214, 515, 515, - 1968, 2156, 449, 515, 518, 117, 2139, 217, 516, 497, - 3411, 515, 515, 515, 236, 2232, 2233, 2234, 497, 171, - 428, 515, 155, 2156, 249, 8, 40, 237, 11, 3124, - 59, 514, 15, 16, 473, 503, 19, 20, 21, 514, - 501, 502, 503, 514, 505, 506, 507, 508, 509, 510, - 2232, 2233, 2234, 518, 2271, 2309, 514, 2997, 1962, 171, - 2277, 514, 290, 46, 1968, 499, 59, 290, 243, 291, - 53, 59, 451, 518, 265, 274, 286, 152, 428, 514, - 1297, 202, 445, 428, 152, 295, 152, 281, 428, 2298, - 428, 454, 428, 444, 281, 2239, 2313, 80, 40, 2298, - 515, 2318, 2298, 2298, 352, 514, 1209, 514, 287, 515, - 476, 444, 40, 518, 152, 289, 501, 502, 503, 2336, - 505, 506, 507, 508, 509, 510, 279, 515, 171, 515, - 59, 2313, 514, 2350, 185, 166, 514, 80, 515, 2356, - 512, 515, 143, 198, 3240, 3134, 3135, 2291, 515, 171, - 515, 300, 358, 515, 524, 290, 515, 3146, 514, 180, - 518, 3200, 152, 3202, 175, 2309, 515, 439, 40, 391, - 40, 2139, 515, 86, 2356, 514, 454, 2394, 515, 512, - 3212, 515, 515, 516, 514, 514, 518, 518, 2156, 514, - 2094, 303, 515, 176, 1297, 516, 515, 515, 514, 171, - 515, 514, 314, 315, 316, 515, 2350, 518, 2112, 514, - 193, 475, 515, 198, 2358, 198, 2360, 2434, 515, 3399, - 2364, 3215, 2366, 3217, 2128, 513, 513, 518, 289, 2483, - 515, 515, 515, 2450, 444, 2139, 515, 503, 59, 2394, - 515, 460, 515, 2521, 515, 515, 476, 204, 3343, 2466, - 117, 40, 2156, 236, 514, 2472, 2473, 226, 88, 3352, - 191, 2394, 2516, 279, 279, 3333, 2483, 379, 40, 516, - 516, 428, 516, 516, 516, 516, 498, 2494, 516, 516, - 2497, 516, 2499, 505, 506, 507, 508, 509, 510, 2506, - 2507, 503, 428, 2510, 2511, 3327, 513, 515, 2515, 2516, - 515, 1518, 512, 516, 416, 2522, 516, 8, 291, 516, - 11, 516, 516, 2567, 15, 16, 516, 513, 516, 516, - 2537, 516, 274, 516, 516, 514, 516, 2535, 516, 2535, - 2547, 516, 2535, 2541, 516, 2535, 516, 449, 516, 107, - 516, 514, 2535, 7, 8, 46, 2535, 2535, 460, 13, - 2567, 516, 53, 516, 516, 19, 516, 516, 476, 23, - 515, 25, 26, 40, 476, 289, 30, 31, 32, 514, - 551, 35, 9, 351, 38, 39, 514, 514, 42, 80, - 335, 45, 46, 515, 518, 59, 40, 171, 500, 2606, - 518, 515, 2609, 2610, 1611, 2612, 198, 191, 513, 459, - 91, 518, 514, 344, 515, 2309, 60, 2624, 391, 2626, - 514, 75, 76, 40, 152, 1518, 516, 515, 124, 3408, - 152, 40, 515, 40, 2606, 515, 2394, 366, 2610, 366, - 2612, 514, 514, 40, 518, 454, 100, 514, 309, 2647, - 514, 2650, 0, 107, 108, 109, 110, 111, 279, 248, - 190, 2650, 106, 107, 2650, 2650, 454, 439, 514, 292, - 74, 74, 80, 117, 9, 2609, 515, 2675, 515, 3381, - 2678, 368, 2726, 514, 59, 176, 133, 513, 515, 513, - 503, 93, 272, 289, 2701, 439, 40, 2704, 514, 292, - 514, 292, 193, 459, 204, 515, 289, 198, 2642, 386, - 122, 289, 515, 515, 2721, 2722, 515, 451, 1611, 2726, - 365, 25, 2729, 148, 36, 498, 365, 297, 501, 502, - 503, 175, 505, 506, 507, 508, 509, 510, 1745, 2593, - 314, 315, 316, 868, 1762, 236, 151, 2227, 3242, 2756, - 3384, 2606, 100, 2801, 3337, 1863, 2545, 201, 3485, 2882, - 2339, 3358, 3463, 2770, 3117, 3412, 171, 3421, 2775, 2776, - 3456, 2815, 743, 2780, 2781, 1196, 3176, 2220, 2785, 2664, - 3410, 2788, 2789, 3419, 2233, 2217, 2793, 2794, 2585, 2483, - 2797, 2612, 3407, 1321, 2801, 8, 3306, 2297, 11, 147, - 291, 2808, 15, 16, 1294, 379, 250, 2356, 2997, 2203, - 2169, 2642, 1155, 161, 1005, 1005, 260, 1178, 166, 1733, - 1177, 2415, 2516, 171, 3393, 2186, 1697, 3315, 272, 3204, - 274, 1732, 180, 46, 23, 2156, 2729, 185, 1180, 3039, - 53, 2535, 416, 1974, 2801, 2852, 800, 2541, 789, 2394, - 2393, 2442, 1745, 2860, 3138, 1989, 2801, 3319, 126, 127, - 304, 1872, 3318, 2066, 2170, 2473, 2112, 80, 2109, 217, - 2021, 2805, 2879, 2567, 1438, 449, 983, 981, 2801, 981, - 2068, 2888, 1889, 981, 981, 981, 460, 981, 859, 237, - 2808, 981, 981, 2490, 1901, 2535, 3304, 783, 1806, 1982, - 391, 1673, 476, 171, 1339, 1359, 1674, 2546, 100, 314, - 315, 316, 356, 2270, -1, 2922, 1233, -1, -1, -1, - -1, -1, -1, -1, 1931, -1, 500, -1, -1, 171, - -1, 1938, 145, -1, -1, -1, -1, 381, 286, -1, - 514, 289, -1, -1, -1, -1, -1, 295, -1, -1, - -1, -1, -1, 2647, -1, -1, 400, 2964, 402, -1, - -1, 405, 2969, 176, -1, -1, 1033, -1, -1, 1976, - -1, -1, 3016, 1980, 379, -1, -1, -1, -1, 1986, - 193, 2675, 2980, -1, 2678, 198, -1, 335, -1, -1, - 2997, -1, 2964, 3000, 3001, -1, 1889, -1, -1, -1, - -1, 2008, -1, -1, -1, -1, -1, 498, 1901, 3016, - 358, 416, -1, -1, 505, 506, 507, 508, 509, 510, - -1, -1, 8, 236, -1, 11, -1, -1, -1, 15, - 16, -1, 2726, 19, 20, 21, -1, 3044, 1931, -1, - 2974, -1, 3049, 2801, 449, 1938, 314, 315, 316, -1, - 36, -1, -1, 3060, 3061, 460, -1, 3064, -1, 3066, - -1, 303, -1, 2997, -1, -1, -1, -1, 416, -1, - 514, 476, 314, 315, 316, -1, -1, -1, 291, -1, - -1, 535, -1, 1976, 3091, -1, 540, 1980, -1, 543, - -1, -1, -1, 1986, -1, 500, 444, 551, -1, 151, - -1, -1, -1, -1, -1, -1, 454, 2801, 3115, 514, - -1, 379, -1, -1, -1, 2008, -1, -1, -1, 171, - -1, 2815, 390, -1, -1, 473, -1, 475, 476, -1, - -1, -1, -1, -1, -1, -1, -1, 379, -1, 3146, - -1, -1, 1209, 3077, 412, 988, -1, -1, 416, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3170, 512, 3163, 3164, 515, 516, 517, - -1, -1, -1, -1, 416, -1, -1, -1, 391, 3186, - -1, 449, -1, 3190, 1155, -1, -1, -1, -1, -1, - -1, -1, 460, 3200, -1, 3202, -1, 3204, 3170, -1, - -1, 3208, -1, 3210, -1, 3212, -1, 449, 476, -1, - -1, -1, 3146, -1, -1, -1, 3223, -1, 460, -1, - -1, 3228, -1, 3230, -1, -1, -1, -1, -1, -1, - 1297, 3238, 500, -1, 476, 221, -1, -1, -1, -1, - -1, 3239, -1, 3241, 3251, 3190, 514, 1033, -1, 3256, - -1, -1, -1, -1, -1, -1, -1, -1, 500, -1, - -1, -1, 314, 315, 316, -1, -1, 3190, -1, -1, - -1, -1, 514, -1, -1, -1, -1, -1, -1, 3251, - -1, -1, -1, -1, 3282, 498, 2980, 741, 742, 743, - -1, -1, 505, 506, 507, 508, 509, 510, 3305, -1, - 3298, -1, -1, -1, 3302, 291, -1, -1, 3315, -1, - -1, 2318, -1, 177, -1, -1, -1, -1, -1, -1, - 3327, -1, 3016, -1, -1, -1, -1, 379, 782, 783, - 784, -1, -1, -1, 3341, 789, -1, 791, 202, 3273, - -1, 1184, -1, -1, -1, -1, 800, -1, -1, -1, - 804, 805, 3359, -1, -1, 809, 810, -1, 1329, -1, - 1331, -1, -1, -1, 416, -1, -1, -1, -1, 823, - 824, 825, -1, -1, -1, -1, 240, 3384, -1, -1, - -1, -1, 55, 837, 838, -1, 840, -1, -1, -1, - -1, -1, 3399, -1, -1, -1, 3341, 449, -1, 853, - -1, 3408, -1, 3410, -1, 859, -1, -1, 460, -1, - -1, -1, -1, -1, -1, -1, -1, 871, 3341, -1, - -1, -1, -1, 1209, 476, 2318, 3433, 3425, -1, 102, - 294, 885, 3190, -1, -1, 40, -1, -1, 3410, 3384, - 3447, 3448, 3449, 2450, -1, -1, -1, -1, 500, -1, - 123, 1518, -1, 3451, 0, 60, -1, -1, -1, -1, - -1, 3384, 514, 917, 918, -1, -1, 3474, 141, 3163, - 3164, -1, 145, -1, 3408, 929, -1, -1, -1, 933, - 934, 935, 936, -1, -1, -1, -1, -1, 3433, -1, - -1, -1, -1, -1, 167, 949, 988, 170, -1, 2506, - -1, 106, -1, -1, -1, -1, 370, -1, 3515, -1, - 3433, 1297, -1, 186, -1, 501, 502, 503, -1, 505, - 506, 507, 508, 509, 510, -1, -1, -1, 982, 983, - -1, 985, -1, -1, 988, -1, -1, -1, -1, -1, - 994, 995, -1, -1, 1611, 3239, 1000, 3241, -1, -1, - -1, -1, 1006, -1, 100, -1, 420, 2450, 422, 1013, - -1, -1, 13, -1, -1, -1, 1409, 1410, 19, 1023, - 175, -1, 1415, -1, -1, 439, 1030, -1, -1, -1, - 31, 445, -1, 3341, 448, -1, 1040, -1, 3282, -1, - -1, -1, -1, -1, 45, 46, 201, -1, -1, -1, - -1, 147, 2609, -1, 3298, -1, 279, -1, 3302, -1, - -1, -1, -1, 2506, 287, 161, -1, -1, -1, -1, - 166, -1, -1, -1, -1, 171, 3384, -1, -1, -1, - -1, -1, -1, -1, 180, 1089, 309, -1, -1, 185, - -1, -1, -1, -1, -1, 250, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 260, -1, 108, -1, -1, - -1, -1, 988, 336, -1, 8, -1, 272, 11, -1, - -1, 217, 15, 16, -1, 3433, -1, -1, 1745, -1, - -1, -1, -1, 1175, 1138, -1, 1140, -1, -1, -1, - -1, 237, 1184, -1, -1, -1, -1, 2704, -1, 304, - -1, 1155, 1156, 46, -1, -1, -1, -1, 1162, -1, - 53, -1, -1, -1, -1, -1, 2609, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1184, 3425, 1518, -1, -1, -1, -1, 80, -1, -1, - 286, 1195, 1196, 289, -1, -1, -1, -1, -1, 295, - -1, 356, -1, -1, 1208, -1, -1, 3451, -1, -1, - 0, -1, -1, -1, -1, -1, -1, -1, -1, 1740, - -1, 1225, -1, -1, 2781, 1229, 381, -1, -1, 1750, - 1234, 1752, -1, -1, 1755, -1, -1, -1, -1, 335, - 1761, -1, 1763, -1, -1, 400, -1, -1, -1, -1, - -1, -1, 145, -1, -1, 1776, -1, -1, -1, 1652, - 1781, 2704, 358, -1, 1785, 1786, 1787, 1788, -1, 1790, - 1791, -1, 1889, -1, -1, 1611, -1, -1, -1, -1, - -1, -1, -1, 176, 1901, -1, 1290, -1, 1292, -1, - -1, -1, -1, -1, -1, -1, -1, 1301, -1, -1, - 193, -1, -1, -1, 1697, 198, -1, -1, 1312, -1, - 100, -1, -1, -1, 1931, -1, -1, 1321, -1, -1, - 416, 1938, 1326, -1, 1328, 1329, -1, 1331, 1332, -1, - -1, 2888, -1, -1, 42, -1, -1, -1, 2781, -1, - -1, -1, -1, 236, -1, -1, -1, -1, 444, -1, - -1, -1, -1, -1, -1, 1359, -1, 147, 454, 1976, - -1, -1, -1, 1980, -1, 2922, -1, 1409, 1410, 1986, - -1, 161, -1, 1415, -1, -1, 166, 473, -1, 475, - 476, 171, -1, -1, -1, -1, -1, -1, -1, -1, - 180, 2008, -1, -1, -1, 185, -1, -1, 291, 107, - -1, 109, -1, 111, -1, 1409, 1410, 37, -1, 1745, - -1, 1415, 42, 1417, -1, -1, 512, -1, -1, 515, - 516, 517, -1, -1, -1, -1, 1430, 217, 1432, 1433, - -1, -1, -1, -1, 1033, -1, 1440, -1, 1442, -1, - 1444, -1, -1, 1447, 3001, 2888, -1, 237, 1452, -1, - -1, 1455, -1, 1457, -1, -1, -1, 1461, -1, 1463, - -1, 1465, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 101, -1, -1, -1, -1, -1, -1, -1, 2922, - -1, -1, -1, -1, -1, -1, -1, 3044, -1, -1, - -1, -1, -1, -1, -1, -1, 286, -1, 391, 289, - -1, -1, -1, -1, -1, 295, -1, -1, -1, 1902, - 1903, 1904, 1905, 1906, 1907, -1, -1, 1910, 1911, 1912, - 1913, 1914, 1915, 1916, 1917, 1918, 1919, -1, -1, -1, - -1, -1, -1, 1409, 1410, -1, -1, -1, 1033, 1415, - -1, -1, 172, -1, -1, 335, -1, -1, -1, -1, - 551, -1, -1, 1889, -1, -1, -1, -1, 3001, -1, - -1, -1, -1, -1, -1, 1901, -1, -1, 358, 1573, - -1, -1, -1, -1, -1, -1, -1, -1, 208, -1, - 1584, -1, -1, -1, -1, 1033, -1, -1, -1, 3146, - -1, -1, -1, -1, 224, 1931, -1, -1, -1, -1, - -1, 3044, 1938, -1, 234, 498, -1, -1, -1, -1, - 1209, -1, 505, 506, 507, 508, 509, 510, -1, 1623, - -1, -1, -1, -1, -1, -1, 416, -1, -1, -1, - 2151, -1, -1, -1, -1, -1, -1, -1, 268, -1, - 1976, -1, -1, -1, 1980, -1, -1, -1, -1, -1, - 1986, -1, -1, -1, 444, 1697, -1, -1, -1, 289, - -1, -1, -1, -1, 454, -1, 1670, -1, 1672, -1, - 1674, -1, 2008, -1, -1, -1, -1, -1, -1, -1, - 1684, 1685, -1, 473, 314, 475, 476, -1, -1, -1, - -1, 321, 177, 1697, -1, -1, 2089, 2090, 1297, -1, - -1, 2318, -1, 3146, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 1209, -1, -1, 202, 1722, -1, - 1724, -1, 512, -1, -1, 515, 516, 517, -1, -1, - -1, 361, -1, -1, -1, 1739, 1740, -1, -1, -1, - -1, 742, 743, -1, -1, -1, 1750, 1751, 1752, 1753, - 380, 1755, -1, -1, -1, 240, -1, 1761, -1, 1763, - -1, 1209, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1775, 1776, -1, -1, -1, 1780, 1781, -1, -1, - -1, 1785, 1786, 1787, 1788, 8, 1790, 1791, 11, -1, - -1, -1, 15, 16, -1, -1, 19, 20, 21, -1, - -1, -1, 1297, 1807, -1, -1, -1, 2328, -1, 294, - 2203, 1815, -1, 1817, 1818, 1819, 1820, 1821, -1, 449, - -1, -1, -1, -1, 454, -1, -1, 535, 313, -1, - -1, -1, 540, 2450, 1838, 543, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1851, -1, 1297, - -1, 3408, -1, -1, -1, -1, -1, -1, 859, -1, - 1902, 1903, 1904, 1905, 1906, 1907, -1, -1, 1910, 1911, - 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, -1, -1, - -1, -1, -1, -1, -1, 370, -1, -1, -1, 2506, - -1, 26, 377, -1, -1, -1, -1, 32, 1902, 1903, - 1904, 1905, 1906, 1907, -1, 40, 1910, 1911, 1912, 1913, - 1914, 1915, 1916, 1917, 1918, 1919, -1, -1, -1, 1518, - -1, -1, -1, -1, -1, 60, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 420, 1940, 422, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1952, -1, - -1, -1, -1, -1, 439, -1, -1, -1, 1962, -1, - 445, -1, -1, 448, 1968, 3408, -1, -1, -1, -1, - 1974, 106, -1, -1, -1, 1979, -1, -1, -1, -1, - -1, -1, 2318, -1, 1988, 1989, -1, -1, -1, -1, - -1, -1, 2609, -1, -1, -1, -1, -1, 221, 1000, - -1, -1, 137, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1611, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1023, 1518, -1, -1, 1902, 1903, 1904, 1905, - 1906, 1907, -1, -1, 1910, 1911, 1912, 1913, 1914, 1915, - 1916, 1917, 1918, 1919, -1, -1, -1, 2089, 2090, 2570, - 2571, -1, -1, 2057, -1, -1, -1, 2061, -1, -1, - -1, -1, 2066, -1, -1, -1, 201, -1, 291, -1, - 1518, -1, -1, -1, -1, -1, -1, 2598, -1, -1, - -1, -1, -1, 791, -1, 2089, 2090, 2704, 1089, -1, - -1, -1, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, - 2621, 2622, 2106, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 2450, 250, 1611, 2510, 2511, -1, - -1, -1, -1, -1, -1, 260, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 2139, -1, 272, -1, -1, - -1, -1, -1, -1, -1, -1, 1745, 2151, -1, -1, - -1, -1, 2156, -1, 1155, 1156, 2160, -1, 293, -1, - -1, 2203, -1, 1611, 2781, -1, -1, -1, -1, 304, - 2506, -1, -1, 8, -1, -1, 11, 885, -1, -1, - 15, 16, -1, -1, 19, 20, 21, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2200, -1, -1, 2203, - -1, -1, 2206, -1, -1, -1, -1, -1, -1, 917, - -1, -1, -1, 2089, 2090, 350, -1, -1, 2222, 354, - -1, 356, -1, -1, -1, 933, 934, 935, 936, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 98, -1, -1, -1, -1, 381, -1, -1, -1, - 1745, 386, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 400, -1, -1, -1, 126, - 127, 2888, -1, 2609, -1, -1, -1, 985, 501, 502, - 503, -1, 505, 506, 507, 508, 509, 510, -1, 2293, - 1889, -1, -1, -1, -1, -1, 2300, 1745, -1, -1, - -1, -1, 1901, -1, -1, 2922, -1, 2311, 2701, -1, - 2314, 2315, 2316, 2317, 171, -1, -1, -1, -1, -1, - -1, -1, 457, -1, 2328, -1, 2330, 1328, 1329, 2333, - 1331, -1, 1931, 2726, 2338, -1, -1, -1, 2859, 1938, - 2344, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 2362, 2363, - -1, 2365, -1, 198, -1, -1, -1, -1, 2704, -1, - -1, -1, -1, -1, -1, -1, -1, 1976, -1, -1, - -1, 1980, -1, -1, 3001, -1, 221, 1986, -1, -1, - 2394, -1, -1, -1, 1889, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1901, -1, -1, 2008, - 2414, -1, -1, -1, -1, -1, -1, -1, 2422, 2423, - 2424, -1, -1, -1, -1, -1, -1, 3044, 2432, -1, - 2434, 1432, 2436, -1, -1, -1, 1931, -1, 2442, -1, - -1, 1889, -1, 1938, -1, 2781, -1, -1, -1, -1, - -1, -1, -1, 1901, -1, -1, 291, 314, 315, 316, - -1, -1, 1463, -1, 1465, -1, -1, 2860, 2510, 2511, - -1, 2475, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1976, -1, 1931, -1, 1980, -1, 1195, -1, -1, - 1938, 1986, -1, -1, -1, -1, -1, -1, -1, -1, - 1208, -1, -1, -1, -1, -1, 2510, 2511, -1, -1, - -1, -1, -1, 2008, -1, -1, -1, -1, -1, -1, - -1, 1229, 379, -1, -1, -1, -1, -1, 1976, 3146, - -1, -1, 1980, 390, -1, 2539, -1, -1, 1986, -1, - -1, 2545, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 2888, -1, -1, 412, -1, 2561, -1, 416, - 2008, 2565, -1, -1, -1, 2569, 2570, 2571, -1, -1, - -1, 2575, 2576, 2577, -1, 2579, -1, -1, -1, 436, - -1, -1, -1, -1, 1292, -1, 2922, -1, -1, -1, - -1, -1, 449, 1301, 2598, -1, 2600, -1, -1, -1, - -1, -1, -1, 460, -1, 3126, -1, 3000, -1, 2613, - 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 476, - -1, -1, -1, -1, -1, -1, 3147, 3148, -1, -1, - -1, -1, -1, 8, 2510, 2511, 11, -1, -1, -1, - 15, 16, 2646, 500, 19, 20, 21, -1, 2652, -1, - -1, -1, 3173, -1, -1, -1, -1, 514, -1, 2701, - 2664, 36, -1, -1, -1, 3001, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, 2680, -1, -1, -1, - -1, 835, 836, -1, 2726, -1, 2690, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 2701, -1, -1, - -1, -1, -1, 2707, -1, -1, -1, -1, 3044, -1, - 2714, 2715, 2716, 2717, -1, -1, -1, -1, -1, 2318, - -1, -1, 2726, 1724, -1, 2729, -1, -1, 2770, 2733, - 2734, -1, 1440, -1, 8, -1, -1, 11, 2742, 1740, - -1, 15, 16, -1, -1, 19, 20, 21, 902, 1750, - -1, 1752, 906, 907, 1755, -1, -1, -1, -1, -1, - 1761, -1, 1763, -1, -1, 2769, -1, -1, -1, -1, - -1, -1, 46, -1, -1, 1776, -1, -1, -1, 53, - 1781, -1, -1, -1, 1785, 1786, 1787, 1788, -1, 1790, - 1791, 3408, -1, -1, -1, 2799, -1, 2801, -1, -1, - -1, -1, -1, -1, -1, 959, 80, -1, -1, -1, - 3146, 2815, -1, -1, -1, 2819, -1, 3210, 2860, -1, - -1, 2825, -1, 2318, 978, 2701, -1, -1, -1, -1, - 984, -1, -1, 987, -1, 2839, 990, 991, 992, 993, - -1, 2845, -1, -1, -1, -1, 221, -1, -1, -1, - -1, 2450, -1, -1, 2858, 2859, 2860, -1, -1, -1, - -1, -1, 2866, -1, -1, -1, -1, -1, -1, -1, - 2318, -1, -1, 8, -1, -1, 11, 1031, 1032, 2883, - 15, 16, -1, 3404, 19, 20, 21, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1052, -1, - -1, -1, 176, -1, -1, -1, -1, 2506, -1, -1, - -1, -1, -1, -1, -1, -1, 291, 1071, -1, 193, - -1, -1, -1, -1, 198, -1, -1, -1, 1082, 1083, - 1084, -1, 1086, 1087, -1, -1, -1, -1, -1, 1940, - -1, -1, -1, -1, -1, -1, -1, 221, 222, -1, - -1, -1, -1, -1, -1, 2450, -1, 2961, 3000, -1, - -1, 2965, 236, -1, 1672, 1119, 1674, -1, -1, -1, - -1, -1, -1, 1974, -1, 2979, 1684, -1, 1979, -1, - -1, -1, 1136, 1137, 2860, -1, -1, -1, -1, 2993, - -1, -1, -1, -1, -1, -1, 3000, -1, -1, -1, - 274, -1, 2450, 277, -1, -1, -1, -1, -1, -1, - 2609, 2506, -1, -1, 1722, -1, 1170, 291, -1, -1, - 1174, 1175, 3026, -1, -1, -1, -1, -1, 3032, -1, - -1, 1185, 1186, -1, -1, 3039, 8, -1, -1, 11, - -1, -1, -1, 15, 16, 17, 18, 19, 20, 21, - -1, -1, -1, -1, -1, -1, 2057, -1, 2506, -1, - -1, -1, -1, 198, 36, 2066, -1, -1, -1, 3073, - -1, -1, 3408, -1, 46, -1, -1, -1, -1, -1, - -1, 53, 8, -1, -1, 11, 221, -1, 1242, 15, - 16, 3095, -1, 19, 20, 21, 3100, 1251, -1, -1, - -1, -1, -1, -1, -1, 2704, -1, -1, 80, 1817, - 1818, 1819, 1820, 1821, 2609, -1, -1, 391, -1, -1, - -1, 1275, 3126, -1, 3000, -1, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, -1, -1, -1, -1, - -1, -1, -1, 3147, 3148, -1, -1, -1, -1, -1, - 2151, -1, -1, -1, -1, -1, 291, -1, -1, -1, - -1, 2609, 3166, 8, 3168, -1, 11, -1, 3210, 3173, - 15, 16, -1, -1, 19, 20, 21, -1, -1, -1, - -1, -1, 2781, 3187, -1, -1, 3190, -1, -1, -1, - -1, 36, -1, -1, -1, -1, -1, -1, -1, 2200, - -1, -1, -1, -1, 176, 2206, 3210, -1, 1362, 2704, - 3214, 3215, -1, 3217, -1, -1, -1, -1, -1, -1, - -1, 193, -1, -1, 498, -1, 198, 501, 502, 503, - -1, 505, 506, 507, 508, 509, 510, -1, 3242, -1, - -1, -1, -1, -1, 1952, 3249, -1, -1, -1, 221, - 222, -1, -1, -1, -1, -1, 2704, -1, -1, -1, - -1, -1, -1, -1, 236, -1, -1, -1, 1422, -1, - 1424, 1425, -1, -1, -1, -1, 3280, -1, -1, -1, - -1, -1, -1, 1437, 1438, -1, 2781, -1, -1, 2888, - -1, -1, -1, -1, -1, 221, -1, -1, -1, -1, - 1454, -1, 274, -1, -1, 277, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 3319, -1, -1, -1, 291, - -1, -1, 294, 2922, -1, -1, -1, 2328, -1, -1, - -1, -1, -1, 2781, -1, -1, -1, 3341, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 3368, 291, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, 221, 3381, 3382, -1, - 3384, 3385, -1, -1, -1, -1, -1, -1, -1, 3393, - -1, -1, -1, 2888, -1, -1, -1, -1, -1, -1, - 3404, -1, 3001, -1, -1, 1559, -1, -1, -1, -1, - -1, -1, -1, 1567, -1, -1, -1, -1, -1, 391, - -1, -1, 3426, -1, -1, -1, -1, 2922, -1, 3433, - -1, 2432, -1, -1, -1, 2436, -1, -1, -1, -1, - 2888, 2442, -1, -1, -1, 3044, 291, -1, -1, -1, - -1, -1, 1606, -1, -1, -1, -1, -1, 1612, 1613, - 1614, 1615, 1616, 1617, 1618, 1619, 3470, -1, -1, -1, - 1624, 1625, -1, -1, 2922, 1629, -1, -1, -1, 1633, - -1, 3485, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, - 1644, -1, -1, 1647, -1, -1, -1, -1, -1, -1, - 1654, 8, 1656, -1, 11, -1, 3001, -1, 15, 16, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1675, -1, -1, -1, -1, 498, -1, -1, 501, - 502, 503, -1, 505, 506, 507, 508, 509, 510, 46, - -1, -1, -1, -1, -1, -1, 53, 3146, -1, 3044, - -1, -1, 524, 3001, 1708, 1709, -1, -1, -1, -1, - -1, -1, -1, -1, 2565, -1, -1, -1, 2569, 2570, - 2571, -1, -1, 80, -1, 501, 502, 503, -1, 505, - 506, 507, 508, 509, 510, -1, -1, -1, -1, -1, - -1, -1, 2300, -1, -1, -1, 3044, 2598, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 2315, 2316, 2317, - -1, -1, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, - 2621, 2622, 2330, -1, -1, 2333, -1, -1, -1, -1, - 2338, -1, -1, -1, -1, -1, -1, -1, 145, -1, - -1, -1, 1796, -1, -1, -1, 1800, -1, -1, 1803, - 1804, 3146, -1, -1, -1, -1, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, -1, -1, -1, 176, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 193, -1, -1, -1, - 1844, 198, -1, -1, -1, -1, -1, -1, 3146, -1, - -1, -1, -1, -1, -1, -1, 2707, -1, -1, 1863, - 1864, -1, -1, -1, 2422, 2423, 2424, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 236, - -1, -1, 2733, -1, -1, -1, -1, -1, -1, 1893, - 1894, -1, 1896, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 8, -1, -1, 11, -1, 0, -1, 15, 16, -1, - -1, 1925, 1926, -1, -1, 1929, -1, -1, -1, -1, - -1, -1, -1, -1, 291, -1, -1, 22, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 32, 46, 34, - 35, -1, -1, -1, 1958, 53, -1, -1, -1, 3408, - 1964, -1, 47, -1, -1, -1, -1, 52, -1, -1, - -1, -1, -1, -1, -1, -1, 61, -1, 1982, -1, - 1984, -1, 80, -1, -1, -1, -1, -1, -1, -1, - 75, -1, -1, -1, -1, -1, -1, -1, -1, 84, - -1, 86, -1, 2561, -1, -1, -1, -1, 2859, -1, - -1, -1, -1, 98, -1, 100, 2020, -1, -1, -1, - -1, -1, 26, -1, -1, -1, 111, -1, 32, -1, - -1, -1, -1, -1, 391, 37, 40, -1, -1, -1, - 42, 126, 127, 128, -1, -1, -1, 145, -1, -1, - -1, -1, 137, -1, -1, 2059, 60, -1, 143, -1, - 2064, 2065, -1, 3408, -1, -1, 151, -1, 153, 154, - -1, -1, -1, -1, -1, -1, -1, -1, 176, -1, - -1, -1, 167, -1, -1, -1, 171, -1, -1, -1, - -1, -1, -1, -1, 2652, 193, -1, -1, -1, 101, - 198, -1, 106, -1, 2108, -1, -1, 2111, -1, 2113, - 3408, -1, 197, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 2129, -1, -1, 213, -1, - -1, -1, -1, 137, -1, -1, -1, -1, 236, -1, - -1, 498, -1, -1, -1, -1, -1, -1, 505, 506, - 507, 508, 509, 510, 239, -1, 2714, 2715, 2716, 2717, - -1, -1, -1, -1, -1, 2169, -1, -1, -1, -1, - 172, -1, -1, -1, -1, -1, -1, -1, 180, -1, - -1, 3032, 2186, 2187, -1, -1, -1, -1, 3039, -1, - -1, -1, -1, 291, -1, -1, -1, 201, -1, -1, - -1, 2205, -1, -1, -1, 8, 208, -1, 11, -1, - 2214, -1, 15, 16, 17, 18, 19, 20, 21, -1, - -1, -1, 224, -1, -1, -1, -1, -1, -1, 314, - 315, 316, 234, 36, -1, -1, -1, 322, 988, -1, - 325, -1, -1, 46, 3095, -1, 250, -1, -1, 3100, - 53, -1, -1, -1, -1, -1, 260, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 268, 2271, 272, 354, - -1, -1, -1, 2277, -1, 3126, -1, 80, 363, -1, - -1, -1, -1, -1, -1, -1, -1, 289, -1, 293, - -1, -1, -1, 391, 379, -1, 3147, 3148, -1, -1, - 304, 386, -1, -1, -1, 390, -1, -1, 2866, -1, - -1, -1, 314, -1, -1, 400, -1, -1, -1, 321, - -1, -1, 3173, 37, -1, -1, -1, 412, 42, -1, - -1, 416, 2336, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 350, -1, -1, -1, - 354, 436, 356, -1, -1, -1, -1, 1107, -1, 361, - -1, -1, -1, 3214, 449, -1, -1, 452, -1, -1, - 455, -1, -1, 176, -1, 460, -1, 381, 380, -1, - -1, -1, 386, -1, -1, -1, -1, 101, -1, -1, - 193, 476, -1, -1, -1, 198, 400, -1, -1, -1, - 498, 1151, -1, -1, -1, -1, -1, 505, 506, 507, - 508, 509, 510, -1, -1, 500, -1, -1, 221, 222, - -1, -1, -1, 3, -1, -1, -1, -1, 8, 514, - -1, 11, 517, 236, 1184, 15, 16, 17, 18, 19, - 20, 21, -1, -1, -1, -1, -1, 449, -1, -1, - -1, -1, 454, 457, -1, -1, 36, -1, 172, -1, - 40, -1, 2466, -1, -1, -1, 46, -1, 2472, 2473, - -1, 274, -1, 53, 277, -1, -1, -1, -1, 2483, - -1, -1, -1, -1, -1, -1, 1236, -1, 291, -1, - 2494, 294, -1, 2497, 208, 2499, -1, -1, -1, -1, - 80, -1, -1, 2507, -1, -1, -1, -1, -1, -1, - 224, 2515, 2516, -1, -1, -1, -1, -1, 2522, -1, - 234, -1, -1, -1, -1, -1, -1, -1, 1278, -1, - -1, -1, -1, 2537, -1, 1285, -1, -1, -1, -1, - -1, -1, -1, 2547, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3404, 268, -1, -1, -1, -1, -1, - -1, -1, -1, 2567, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 289, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1335, -1, -1, 391, -1, - -1, -1, -1, -1, -1, -1, 176, -1, -1, -1, - 314, -1, -1, -1, -1, -1, -1, 321, 3166, -1, - 1360, -1, -1, 193, -1, -1, -1, -1, 198, -1, - 2624, -1, 2626, -1, -1, -1, -1, -1, -1, 3187, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 221, 222, -1, -1, -1, -1, 361, -1, -1, - -1, -1, -1, -1, -1, 1405, 236, 1407, -1, 1409, - 1410, -1, 1412, -1, -1, 1415, 380, -1, 1418, -1, - -1, 1421, -1, -1, -1, -1, 1426, -1, -1, 1429, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 3249, -1, -1, 274, 498, -1, 277, 501, 502, - 503, -1, 505, 506, 507, 508, 509, 510, -1, -1, - -1, 291, -1, -1, 294, 518, -1, 2721, 2722, -1, - -1, 1471, 3280, -1, -1, -1, -1, -1, -1, 24, - -1, -1, -1, -1, -1, 449, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 2756, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2770, -1, -1, -1, - -1, 2775, 2776, -1, -1, -1, 2780, -1, -1, -1, - -1, 2785, -1, -1, 2788, 2789, 81, -1, -1, 2793, - 2794, -1, -1, 2797, -1, -1, -1, -1, -1, -1, - -1, -1, 97, -1, 2808, 1555, -1, -1, -1, -1, - -1, 391, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1571, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1581, 1582, 1583, -1, -1, -1, 1587, -1, -1, - -1, 1591, -1, -1, -1, 3, -1, 5, 2852, -1, - -1, 146, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 156, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 168, -1, 2879, -1, -1, 173, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1653, -1, -1, -1, 202, -1, -1, - 68, 69, -1, -1, -1, -1, -1, -1, 498, -1, - -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, - 510, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1691, -1, -1, -1, -1, -1, -1, -1, -1, - 245, 109, 110, -1, 249, 113, 114, 1707, -1, -1, - -1, 8, 1712, -1, 11, 2969, -1, -1, 15, 16, - 17, 18, 19, 20, 21, -1, -1, -1, -1, 1729, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, - -1, -1, -1, 40, -1, -1, -1, -1, -1, 46, - -1, -1, -1, -1, -1, -1, 53, -1, 8, -1, - -1, 11, 3016, -1, -1, 15, 16, 17, 18, 19, - 20, 21, -1, -1, 319, -1, -1, -1, -1, -1, - 188, 189, -1, 80, -1, -1, 36, -1, -1, 334, - -1, -1, -1, -1, -1, 3049, 46, -1, -1, -1, - -1, -1, -1, 53, -1, -1, 3060, 3061, -1, -1, - 3064, -1, 3066, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 367, -1, -1, 370, -1, -1, -1, -1, - 80, -1, -1, -1, -1, -1, 381, 3091, -1, 384, - -1, -1, -1, -1, 252, 253, 254, 255, 256, 257, - 258, 259, -1, -1, 262, 263, -1, 402, -1, -1, - -1, 3115, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 416, -1, -1, -1, -1, -1, -1, 423, 176, - -1, -1, -1, -1, -1, -1, -1, -1, 433, -1, - -1, 1891, -1, -1, 439, -1, 193, -1, -1, 1899, - 1900, 198, 1902, 1903, 1904, 1905, 1906, 1907, -1, -1, - 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, - 1920, 466, -1, -1, 221, 222, 176, -1, -1, -1, - -1, -1, 3186, -1, -1, -1, -1, -1, -1, 236, - -1, -1, -1, 193, -1, -1, -1, -1, 198, -1, - 3204, -1, -1, -1, 3208, -1, -1, -1, 3212, -1, - -1, -1, -1, -1, -1, -1, -1, 375, 376, 3223, - -1, 221, 222, -1, 3228, -1, 3230, 274, -1, -1, - 277, -1, -1, -1, 3238, -1, 236, -1, -1, -1, - -1, -1, -1, -1, 291, -1, -1, 294, -1, -1, - -1, -1, 3256, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 2023, 274, -1, 2026, 277, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 291, -1, -1, 294, -1, -1, -1, -1, -1, - -1, 3305, -1, -1, -1, -1, -1, 8, -1, -1, - 11, 3315, 470, 471, 15, 16, 17, 18, 19, 20, - 21, -1, 2072, 3327, -1, -1, 2076, 2077, 2078, 2079, - 2080, 2081, 2082, 2083, -1, 36, 494, 495, -1, 2089, - 2090, -1, 2092, 2093, 391, 46, -1, -1, -1, -1, - -1, -1, 53, -1, 2104, 3359, -1, 2107, -1, -1, - -1, -1, -1, -1, -1, 2115, 2116, 2117, 2118, 2119, - 2120, 2121, 2122, 2123, 2124, -1, -1, -1, -1, 80, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 391, -1, -1, 8, -1, -1, 11, -1, -1, - 2150, 15, 16, 17, 18, 19, 20, 21, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 36, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 46, -1, -1, -1, -1, -1, -1, 53, - -1, -1, -1, 3447, 3448, 3449, -1, -1, -1, -1, - -1, 498, -1, 2203, 501, 502, 503, -1, 505, 506, - 507, 508, 509, 510, -1, -1, 80, -1, 515, -1, - 3474, -1, -1, -1, -1, 176, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 193, -1, -1, -1, -1, 198, 498, -1, - -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, - 510, 3515, -1, -1, -1, 515, -1, -1, -1, -1, - 221, 222, 2272, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 2282, 2283, -1, 236, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 176, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 274, -1, -1, 277, -1, -1, 193, - -1, -1, -1, -1, 198, -1, -1, -1, -1, -1, - 291, -1, -1, 294, -1, -1, -1, 2347, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 221, 222, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 2369, - 2370, 2371, 236, -1, 2374, 2375, 2376, 2377, 2378, 2379, - -1, -1, -1, 2383, 2384, 2385, 2386, 2387, 2388, 2389, - 2390, 2391, 2392, -1, -1, -1, -1, 2397, 2398, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 274, -1, -1, 277, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 2425, -1, 291, -1, -1, - 294, 2431, -1, -1, 8, -1, -1, 11, -1, -1, - 391, 15, 16, 17, 18, 19, 20, 21, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 36, -1, -1, 2465, -1, -1, -1, -1, - -1, -1, 46, -1, -1, -1, -1, -1, -1, 53, - -1, -1, -1, -1, 2484, -1, -1, 2487, 2488, -1, - -1, -1, -1, -1, -1, 2495, 2496, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 80, -1, -1, 2509, - 2510, 2511, 2512, -1, 2514, -1, -1, -1, 2518, -1, - -1, -1, -1, -1, -1, -1, -1, 391, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 498, -1, -1, - 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, - -1, -1, -1, -1, 515, -1, -1, -1, -1, -1, - -1, -1, 2572, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 8, -1, -1, 11, -1, -1, -1, 15, - 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, - -1, -1, 176, -1, -1, -1, -1, -1, -1, -1, - 36, -1, -1, -1, -1, -1, -1, -1, -1, 193, - 46, -1, -1, -1, 198, -1, -1, 53, -1, -1, - -1, -1, -1, -1, 498, -1, -1, 501, 502, 503, - -1, 505, 506, 507, 508, 509, 510, 221, 222, -1, - -1, 515, -1, -1, 80, -1, -1, 8, -1, -1, - 11, -1, 236, -1, 15, 16, 17, 18, 19, 20, - 21, -1, -1, -1, -1, -1, -1, -1, -1, 2679, - -1, -1, -1, -1, -1, 36, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 46, -1, -1, -1, -1, - 274, 2701, 53, 277, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 291, -1, -1, - 294, -1, -1, -1, -1, -1, -1, -1, -1, 80, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 8, -1, -1, 11, -1, -1, -1, 15, 16, -1, - 176, 19, 20, 21, -1, -1, -1, 2757, -1, 2759, - -1, -1, -1, -1, -1, 2765, -1, 193, 36, -1, - -1, -1, 198, -1, 2774, -1, -1, 2777, 46, 2779, - -1, -1, -1, 2783, -1, 53, 2786, 2787, -1, -1, - 2790, 2791, -1, -1, -1, 221, 222, -1, 2798, -1, - -1, -1, -1, -1, -1, -1, -1, 2807, -1, -1, - 236, -1, 80, -1, -1, -1, -1, 391, -1, -1, - -1, -1, 2822, -1, -1, 176, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 193, -1, -1, -1, -1, 198, 274, -1, - -1, 277, -1, -1, -1, -1, -1, -1, -1, -1, - 2860, -1, -1, -1, -1, 291, -1, -1, 294, -1, - 221, 222, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 236, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 176, -1, - 68, 69, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 274, 498, 193, 277, 501, 502, 503, - 198, 505, 506, 507, 508, 509, 510, -1, -1, -1, - 291, 515, -1, 294, -1, -1, -1, -1, 68, 69, - -1, 109, 110, 221, 222, 113, 114, -1, -1, -1, - -1, -1, -1, -1, -1, 391, -1, -1, 236, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 109, - 110, -1, -1, 113, 114, -1, -1, -1, -1, 2999, - 3000, -1, -1, -1, -1, -1, 274, -1, -1, 277, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 291, 3024, 3025, 294, -1, -1, -1, - 188, 189, -1, -1, -1, -1, -1, -1, -1, -1, - 391, -1, -1, -1, -1, -1, -1, -1, 3048, -1, - -1, -1, 3052, -1, 3054, 3055, 3056, -1, -1, 3059, - -1, -1, 3062, 3063, -1, -1, -1, -1, 188, 189, - -1, 3071, 498, -1, -1, 501, 502, 503, -1, 505, - 506, 507, 508, 509, 510, -1, -1, -1, -1, 515, - -1, -1, -1, -1, 252, 253, 254, 255, 256, 257, - 258, 259, -1, -1, 262, 263, -1, -1, -1, -1, - -1, -1, 3112, -1, -1, -1, -1, -1, 3118, -1, - -1, -1, -1, 391, -1, -1, -1, -1, -1, -1, - -1, 3131, 252, 253, 254, 255, 256, 257, 258, 259, - -1, -1, 262, 263, -1, -1, -1, 498, -1, -1, - 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, - -1, -1, -1, -1, 515, 3165, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 3192, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 375, 376, -1, - -1, -1, -1, -1, -1, 3225, 3226, 3227, -1, -1, - 498, -1, -1, 501, 502, 503, -1, 505, 506, 507, - 508, 509, 510, -1, -1, 3245, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 375, 376, 3257, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3303, -1, -1, -1, -1, -1, -1, - -1, -1, 470, 471, -1, -1, -1, -1, -1, -1, - 3320, -1, -1, -1, -1, -1, -1, -1, -1, 3329, - -1, -1, -1, -1, -1, -1, 494, 495, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 470, 471, -1, -1, 3354, -1, 514, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 494, 495, -1, -1, -1, -1, - 3380, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 3, 4, 5, 6, - 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3423, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 3477, 75, 76, - 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 498, -1, -1, -1, -1, -1, -1, 505, 506, - 507, -1, -1, -1, -1, 512, -1, 514, -1, -1, - -1, -1, 519, 520, -1, 522, 523, 524, 3, 4, - 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, - 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, - -1, -1, -1, -1, 39, -1, -1, 42, 43, 44, - -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, - 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, - 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, -1, 120, 121, 122, 123, 124, - 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, - 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, - 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, - 165, -1, 167, -1, 169, 170, -1, 172, 173, 174, - 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, - -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, - 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, -1, -1, 233, 234, - 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, - -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, - -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, - -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, - 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, - 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, - 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, - -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, - 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, - 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, - -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, - 505, 506, 507, -1, -1, -1, -1, 512, -1, 514, - -1, -1, -1, -1, 519, 520, -1, 522, 523, 524, - 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, - 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, - 33, -1, -1, -1, -1, -1, 39, -1, -1, 42, - 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, -1, - -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, - -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, - 163, 164, 165, -1, 167, -1, 169, 170, 171, 172, - 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, - 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, - 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, -1, -1, - 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, - 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, -1, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, - 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, - 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378, 379, -1, 381, 382, - 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - -1, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 791, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, -1, -1, 446, 447, 448, 449, 450, 451, 452, - 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, - 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, - -1, 474, -1, 476, 477, 478, 479, 480, 481, 482, - 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, - 493, 494, 495, 496, 497, 498, -1, 500, -1, -1, - -1, -1, 505, 506, 507, -1, -1, -1, -1, 512, - -1, 514, 515, -1, -1, -1, 519, 520, -1, 522, - 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, - 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, - -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, -1, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, 170, 171, - 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, - -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 896, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 791, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 938, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, -1, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 1943, 0, 0, 0, 0, 1944, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, -1, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, 449, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 498, -1, 500, -1, - -1, -1, -1, 505, 506, 507, -1, -1, -1, -1, - 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, - 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, - 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, - -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, - 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, -1, 120, - 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, - 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, - 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, - 171, 172, 173, 174, 175, 176, 177, -1, 179, -1, - 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, - 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, - 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, -1, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, - 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, - 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 377, 378, 379, -1, - 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, - 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, -1, -1, 414, 415, 416, 417, 418, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, -1, -1, 446, 447, 448, 449, 450, - 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, - 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, - 471, -1, -1, 474, -1, 476, 477, 478, 479, 480, - 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, 498, -1, 500, - -1, -1, -1, -1, 505, 506, 507, -1, -1, -1, - -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, - -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, - 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, -1, -1, -1, 37, -1, 39, - -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, - -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, - -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, -1, - 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, - 130, 131, 132, -1, 134, 135, 136, 137, 138, -1, - 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, - 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, - -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, - 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, - -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, -1, -1, -1, -1, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, - 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, - 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, - 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, - 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, - -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, - 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, - 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, - 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 494, 495, 496, 497, 498, -1, - -1, -1, -1, -1, -1, 505, 506, 507, -1, -1, - -1, -1, 512, -1, 514, 515, -1, -1, -1, 519, - 520, -1, 522, 523, 3, 4, 5, 6, 7, -1, - 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, - 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, - 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, - 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, - 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, - -1, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, - -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, 170, 171, 172, 173, 174, 175, 176, 177, -1, - 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, - 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, - -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, - -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, -1, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, - 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, - 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, - 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, 390, 391, 392, 393, 394, 395, -1, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, 412, -1, 414, 415, 416, 417, 418, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, - 449, 450, 451, 452, 453, -1, 455, 456, 457, 458, - 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, - 469, 470, 471, -1, -1, 474, -1, 476, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, -1, - -1, 500, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, - 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, - 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, - 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, - -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, - 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, - 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, - 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, - 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, - -1, 169, 170, 171, 172, 173, 174, 175, 176, 177, - -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, - 218, -1, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, -1, 232, 233, 234, 235, 236, -1, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, - 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, - 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, - 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, - 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, - 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, - -1, 429, 430, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, - 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, - 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, - 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, -1, -1, -1, -1, -1, -1, 505, 506, 507, - -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, - -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, - 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - 37, -1, 39, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 498, -1, -1, -1, -1, -1, -1, 505, 506, - 507, -1, -1, -1, -1, 512, -1, 514, -1, -1, - -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, - 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, - 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, - -1, 37, -1, 39, -1, -1, 42, 43, 44, -1, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, - 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, - 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, - -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, - 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, - 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, - -1, 167, -1, 169, 170, -1, 172, 173, 174, 175, - 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, - 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, - -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, -1, -1, 233, 234, 235, - 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, - -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, - -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, - 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, - 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, - 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, - 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, - 376, 377, 378, -1, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, - -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, - -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, - 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, - 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, - 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, - -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, - 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, - 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, - 506, 507, -1, -1, -1, -1, 512, -1, 514, 515, - -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, - 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, - -1, -1, -1, 38, 39, -1, -1, 42, 43, 44, - -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, - 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, - 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, -1, 120, 121, 122, 123, 124, - 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, - 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, - 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, - 165, -1, 167, -1, 169, 170, -1, 172, 173, 174, - 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, - -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, - 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, -1, -1, 233, 234, - 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, - -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, - -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, - -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, - 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, - 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, - -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, - 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, - 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, - -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, - 505, 506, 507, -1, -1, -1, -1, 512, -1, 514, - -1, -1, -1, -1, 519, 520, -1, 522, 523, 3, - 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, - 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, - -1, -1, -1, 37, -1, 39, -1, -1, 42, 43, - 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, - 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, -1, 120, 121, 122, 123, - 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, - 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, - 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, - 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, - 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, - 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, - 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, - 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, - 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, - -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, - 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, - -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, - 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, -1, 380, 381, 382, 383, - 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, - 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, - 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, - -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, - -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, - 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, - 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, - -1, 505, 506, 507, -1, -1, -1, -1, 512, -1, - 514, 515, -1, -1, -1, 519, 520, -1, 522, 523, - 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, - 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, - 33, -1, -1, -1, 37, -1, 39, -1, -1, 42, - 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, - 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, - -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, - -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, - 163, 164, 165, -1, 167, -1, 169, 170, -1, 172, - 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, - 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, - 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, -1, -1, - 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, - 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, -1, -1, -1, -1, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, - 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, - 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378, -1, 380, 381, 382, - 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, - 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, - -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, - 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, - 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, - 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, - -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, - 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, - 493, 494, 495, 496, 497, 498, -1, -1, -1, -1, - -1, -1, 505, 506, 507, -1, -1, -1, -1, 512, - -1, 514, -1, -1, -1, -1, 519, 520, -1, 522, - 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, - 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, - -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, - 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, - -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 498, -1, -1, -1, - -1, -1, -1, 505, 506, 507, -1, -1, -1, -1, - 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, - 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, - -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, - 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, -1, 120, - 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, - 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, - 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, - -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, - 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, - 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, - 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, -1, -1, -1, -1, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, - 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, - 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, - 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, - 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, - 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, - 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, - 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, - 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, 498, -1, -1, - -1, -1, -1, -1, 505, 506, 507, -1, -1, -1, - -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, - -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, - 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, - -1, 31, 32, 33, -1, -1, -1, -1, -1, 39, - -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, - -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, - -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, -1, - 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, - 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, - 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, - 170, 171, 172, 173, 174, 175, 176, 177, -1, 179, - -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, - 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, - -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, -1, -1, -1, -1, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, - 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, - 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, - 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, - -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, - -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, - 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, - 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, - 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, - 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 494, 495, 496, 497, 498, -1, - -1, -1, -1, -1, -1, 505, 506, 507, -1, -1, - -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, - 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, - 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, - 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, - 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, - 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, - 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, - 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, - -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, - 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, - 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, - -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, - -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, - 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, - 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, - 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, - -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, - 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, - 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - -1, -1, -1, -1, -1, -1, 505, 506, 507, -1, - -1, -1, -1, 512, -1, 514, 515, -1, -1, -1, - 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, - 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, - 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, - -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, - 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, - 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, - 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, - 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, - -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, - -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, - 218, -1, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, - 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, - 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, - 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, - 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, -1, -1, 414, 415, 416, 417, - 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, - -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, - 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, - 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, - 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, -1, -1, -1, -1, -1, -1, 505, 506, 507, - -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, - -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, - 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, 473, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 498, -1, -1, -1, -1, -1, -1, 505, 506, - 507, -1, -1, -1, -1, 512, -1, 514, -1, -1, - -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, - 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, -1, -1, - -1, -1, -1, 39, -1, -1, 42, 43, 44, -1, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, - 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, - 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, - -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, - 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, - 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, - -1, 167, -1, 169, 170, -1, 172, 173, 174, 175, - 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, - 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, - -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, -1, -1, 233, 234, 235, - 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, - -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, - -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, - 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, - 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, - 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, - 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, - 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, - 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, - -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, - -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, - 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, - 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, - 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, - -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, - 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, - 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, - 506, 507, -1, -1, -1, -1, 512, -1, 514, -1, - -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, - 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, - 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, - -1, -1, -1, -1, 39, -1, -1, 42, 43, 44, - -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, - 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, - 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, -1, 120, 121, 122, 123, 124, - 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, - 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, - 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, - 165, -1, 167, -1, 169, 170, -1, 172, 173, 174, - 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, - -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, - 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, -1, -1, 233, 234, - 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, - -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, - -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, - -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, - 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, -1, - 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, - -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, - 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, - 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, - -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, - 505, 506, 507, -1, -1, -1, -1, 512, -1, 514, - -1, -1, -1, -1, 519, 520, -1, 522, 523, 3, - 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, - 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, - -1, -1, -1, -1, -1, 39, -1, -1, 42, 43, - 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, - 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, -1, 120, 121, 122, 123, - 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, - 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, - 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, - 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, - 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, - 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, - 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, - 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, - 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, - -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, - 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, - -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, - 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, - 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, - 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, - 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, - -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, - -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, - 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, - 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, - -1, 505, 506, 507, -1, -1, -1, -1, 512, -1, - 514, -1, -1, -1, -1, 519, 520, -1, 522, 523, - 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, - 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, - 33, -1, -1, -1, -1, -1, 39, -1, -1, 42, - 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, - 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, - -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, - -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, - 163, 164, 165, -1, 167, -1, 169, 170, -1, 172, - 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, - 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, - 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, -1, -1, - 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, - 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, -1, -1, -1, -1, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, - 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, - 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, - 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, - 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, - -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, - 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, - 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, - 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, - -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, - 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, - 493, 494, 495, 496, 497, 498, -1, -1, -1, -1, - -1, -1, 505, 506, 507, -1, -1, -1, -1, 512, - -1, 514, -1, -1, -1, -1, 519, 520, -1, 522, - 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, - 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, - -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, - 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, - -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 498, -1, -1, -1, - -1, -1, -1, 505, 506, 507, -1, -1, -1, -1, - 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, - 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, - 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, - -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, - 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, -1, 120, - 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, - 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, - 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, - -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, - 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, - 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, - 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, -1, -1, -1, -1, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, - 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, - 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, - 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, - 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, - 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, - 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, - 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, - 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, 498, -1, -1, - -1, -1, -1, -1, 505, 506, 507, -1, -1, -1, - -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, - -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, - 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, - -1, 31, 32, 33, -1, -1, -1, -1, -1, 39, - -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, - -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, - -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, -1, - 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, - 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, - 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, - 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, - -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, - 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, - -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, -1, -1, -1, -1, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, - 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, - 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, - 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, - -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, - -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, - 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, - 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, - 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, - 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 494, 495, 496, 497, 498, -1, - -1, -1, -1, -1, -1, 505, 506, 507, -1, -1, - -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, - 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, - 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, - 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, - 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, - 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, - 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, - 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, - -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, - 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, - 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, - -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, - -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, - 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, - 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, - 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, - -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, - 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, - 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - -1, -1, -1, -1, -1, -1, 505, 506, 507, -1, - -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, - 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, - 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, - 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, - -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, - 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, - 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, - 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, - 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, - -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, - -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, - 218, -1, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, - 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, - 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, - 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, - 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, - 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, - -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, - 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, - 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, - 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, -1, -1, -1, -1, -1, -1, 505, 506, 507, - -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, - -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, - 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 498, -1, -1, -1, -1, -1, -1, 505, 506, - 507, -1, -1, -1, -1, 512, -1, 514, -1, -1, - -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, - 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, - 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, - -1, -1, -1, 39, -1, -1, 42, 43, 44, -1, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, - 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, - 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, - -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, - 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, - 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, - -1, 167, -1, 169, 170, -1, 172, 173, 174, 175, - 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, - 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, - -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, -1, -1, 233, 234, 235, - 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, - -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, - -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, - 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, - 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, - 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, - 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, - 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, - 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, - -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, - -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, - 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, - 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, - 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, - -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, - 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, - 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, - 506, 507, -1, -1, -1, -1, 512, -1, 514, -1, - -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, - 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, - 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, - -1, -1, -1, -1, 39, -1, -1, 42, 43, 44, - -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, - 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, - 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, -1, 120, 121, 122, 123, 124, - 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, - 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, - 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, - 165, -1, 167, -1, 169, 170, -1, 172, 173, 174, - 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, - -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, - 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, -1, -1, 233, 234, - 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, - -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, - -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, - -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, - 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, - 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, - 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, - -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, - 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, - 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, - -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, - 505, 506, 507, -1, -1, -1, -1, 512, -1, 514, - -1, -1, -1, -1, 519, 520, -1, 522, 523, 3, - 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, - 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, - -1, -1, -1, -1, -1, 39, -1, -1, 42, 43, - 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, - 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, - 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, - 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, - 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, - 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, - 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, - 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, - 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, - 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - -1, 275, 276, 277, 278, 279, 280, 281, 282, 283, - 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, - -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, - 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, - -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, - 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, - 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, - 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, - 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, - -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, - -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, - 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, - 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, -1, -1, -1, -1, -1, -1, - -1, 505, 506, -1, -1, -1, -1, -1, 512, -1, - 514, -1, -1, -1, -1, 519, 520, -1, 522, 523, - 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, - 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, - 33, -1, -1, -1, -1, -1, 39, -1, -1, 42, - 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, - 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, - -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, - -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, - 163, 164, 165, -1, 167, -1, 169, 170, -1, 172, - 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, - 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, - 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, -1, 218, -1, 220, -1, -1, - 223, 224, 225, 226, 227, 228, 229, 230, -1, -1, - 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, -1, 275, 276, -1, 278, 279, 280, 281, 282, - 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, - 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, -1, -1, -1, -1, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, - 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, - 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, - 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, - 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, - -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, - 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, - 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, - 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, - -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, - 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, - 493, 494, 495, 496, 497, 498, -1, -1, -1, -1, - -1, -1, 505, 506, 507, -1, -1, -1, -1, 512, - -1, 514, -1, -1, -1, -1, 519, 520, -1, 522, - 523, 3, 4, 5, 6, 7, -1, 9, 10, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, - 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, - -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, - 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, - -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, -1, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, -1, -1, -1, -1, - -1, -1, -1, 505, 506, -1, -1, -1, -1, -1, - 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, - 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, - 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, - -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, - 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, - 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, - 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, - 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, - -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, - 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, - 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, - -1, 222, 223, 224, 225, 226, 227, 228, 229, 230, - -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, -1, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, - 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, -1, -1, -1, -1, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, - 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, - 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, - 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, - 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, - 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, - 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, - 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, - 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, -1, -1, -1, - -1, -1, -1, -1, 505, 506, -1, -1, -1, -1, - -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, - -1, 522, 523, 3, 4, 5, 6, 7, -1, 9, - 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, - -1, 31, 32, 33, -1, -1, -1, -1, -1, 39, - -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, - -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, - -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, - 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, - 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, - 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, - 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, - 180, 181, 182, 183, 184, -1, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, -1, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, - -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, -1, -1, -1, -1, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, - 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, - 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, - 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, - -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, - -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, - 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, - 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, - 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, - 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 494, 495, 496, 497, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, - 520, -1, 522, 523, 3, 4, 5, 6, 7, -1, - 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, - 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, - 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, - 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, - 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, - -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, - 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, - -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, - 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, - 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, - -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, - -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, - 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, - 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, - 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, - -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, - 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, - 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, - 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, - -1, 9, 10, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, - 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, - -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, - 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, - 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, - 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, - 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, - 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, - -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, - -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, - 218, -1, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, -1, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, - 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, - 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, - 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, - 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, - 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, - -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, - 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, - 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, - 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, - -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, - 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, -1, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, -1, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, 279, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, -1, -1, -1, -1, -1, -1, -1, 505, 506, - 507, -1, 3, 4, 5, 512, -1, 514, 9, -1, - -1, -1, 519, 520, -1, 522, 523, -1, -1, -1, - -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, - 31, 32, 33, -1, -1, -1, 37, -1, -1, -1, - -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, - 61, 62, 63, 64, -1, -1, 67, 68, 69, 70, - 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, - 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, - 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, - 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, - 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, - -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, - 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, - 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, -1, 275, 276, 277, 278, -1, 280, - 281, 282, 283, 284, 285, -1, 287, 288, 289, -1, - 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, -1, -1, -1, -1, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, - 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, - 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 377, 378, -1, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, - 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, - 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, - 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, - 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, - 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, -1, -1, -1, - -1, 3, -1, -1, 505, 506, 507, -1, -1, -1, - -1, -1, -1, 514, -1, -1, -1, -1, -1, 520, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, 40, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, 161, - 162, 163, 164, 165, 166, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, 286, 287, 288, -1, -1, 291, - 292, 293, -1, 295, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, 444, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 515, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 514, 515, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, 34, 35, -1, 37, -1, -1, -1, -1, - 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, - -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, 170, 171, - 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, - -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, -1, 275, 276, 277, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, -1, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, -1, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, 449, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, -1, 3, 500, 5, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 514, -1, -1, -1, 22, 23, 24, 25, - 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, - -1, -1, -1, -1, -1, -1, 42, 43, 44, -1, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, -1, 59, 60, 61, 62, 63, 64, -1, - 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, - 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, - 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, -1, 118, -1, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, -1, -1, 134, 135, - 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, - 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, 160, -1, 162, 163, 164, 165, - -1, 167, -1, 169, 170, 171, 172, 173, 174, 175, - 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, - 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, - -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, -1, 233, 234, 235, - 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, - 276, 277, 278, -1, 280, 281, 282, 283, 284, 285, - -1, 287, 288, -1, 290, 291, 292, 293, -1, -1, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, -1, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, - 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, - 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, - 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, - 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, - 376, 377, 378, 379, -1, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, 411, 412, -1, 414, 415, - 416, 417, 418, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, 431, 432, 433, 434, -1, - 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, - 446, 447, 448, 449, 450, 451, 452, 453, -1, 455, - 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, - 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, - 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, - 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, - 496, 497, -1, 3, 500, 5, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 514, -1, - -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, - -1, 31, 32, 33, -1, -1, -1, -1, -1, -1, - -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, - 60, 61, 62, 63, 64, -1, 66, 67, 68, 69, - 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, - -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, - -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, - 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, - 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, - 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, - 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, - -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, - 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, -1, 233, 234, 235, 236, -1, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, -1, 275, 276, 277, 278, -1, - 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, - 290, 291, 292, 293, -1, -1, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, -1, -1, -1, -1, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, - 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, - 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, - 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, - -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, - -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, - 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, - 430, 431, 432, 433, 434, -1, 436, 437, 438, 439, - 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, - 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, - 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, - 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 514, -1, -1, 22, 23, 24, - 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, - -1, -1, -1, -1, -1, -1, -1, 42, 43, 44, - -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, - -1, 66, 67, 68, 69, 70, 71, 72, 73, -1, - 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, - 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, -1, 118, -1, 120, 121, 122, 123, 124, - 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, - 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, - 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, -1, 160, -1, 162, 163, 164, - 165, -1, 167, -1, 169, 170, -1, 172, 173, 174, - 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, - -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, - 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, -1, -1, 233, 234, - 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, -1, - 275, 276, 277, 278, -1, 280, 281, 282, 283, 284, - 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, - -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, - -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, - -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, - 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, - 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, - 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, - -1, 436, 437, 438, 439, 440, 441, 442, 443, -1, - -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, - 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, - 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, - -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 514, - -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, - -1, 31, 32, 33, -1, -1, -1, -1, -1, -1, - -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, - 60, 61, 62, 63, 64, -1, 66, 67, 68, 69, - 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, - -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, - -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, - 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, - 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, - 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, - 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, - -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, - 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, -1, 275, 276, 277, 278, -1, - 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, - -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, -1, -1, -1, -1, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, - 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, - 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, - 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, - -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, - -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, - 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, - 430, 431, 432, 433, 434, -1, 436, 437, 438, 439, - 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, - 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, - 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, - 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 514, -1, -1, 22, 23, 24, - 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, - -1, 46, 47, 48, -1, 50, 51, 52, 53, 54, - -1, 56, 57, -1, 59, 60, 61, 62, 63, 64, - -1, -1, 67, 68, 69, 70, 71, 72, 73, -1, - 75, 76, 77, 78, 79, -1, -1, -1, 83, 84, - 85, 86, 87, 88, -1, 90, 91, 92, -1, 94, - 95, 96, 97, 98, 99, -1, -1, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, -1, 118, -1, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, -1, -1, 134, - 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, - 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, -1, 160, -1, 162, 163, 164, - 165, -1, 167, -1, 169, -1, 171, -1, 173, 174, - 175, -1, 177, -1, 179, -1, 181, 182, 183, 184, - -1, 186, 187, 188, 189, 190, 191, 192, -1, 194, - 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, - 205, -1, 207, -1, 209, 210, 211, 212, 213, 214, - 215, 216, -1, 218, -1, 220, -1, -1, 223, -1, - 225, 226, 227, 228, 229, 230, -1, -1, 233, -1, - 235, -1, -1, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, -1, 269, 270, 271, 272, 273, -1, - 275, 276, -1, 278, -1, 280, 281, 282, 283, 284, - 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, - -1, 296, 297, 298, -1, 300, -1, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, 318, 319, 320, -1, 322, 323, 324, - 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, - -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, -1, 359, 360, -1, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, 379, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, 390, -1, 392, 393, 394, - 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, -1, 414, - 415, 416, 417, -1, 419, 420, 421, 422, 423, -1, - 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, - -1, 436, 437, 438, 439, 440, 441, 442, 443, -1, - -1, 446, 447, 448, 449, 450, 451, 452, 453, -1, - 455, 456, 457, 458, 459, 460, 461, -1, 463, -1, - 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, - -1, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, 497, 3, -1, 500, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 514, - -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 43, 44, -1, 46, 47, 48, -1, - 50, 51, 52, 53, 54, -1, 56, 57, -1, 59, - 60, 61, 62, 63, 64, -1, -1, 67, 68, 69, - 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, - -1, -1, -1, 83, 84, 85, 86, 87, 88, -1, - 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, - -1, -1, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, - 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, - 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, - 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, - -1, 171, -1, 173, 174, 175, -1, 177, -1, 179, - -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, - 190, 191, 192, -1, 194, 195, 196, 197, -1, 199, - 200, 201, 202, 203, 204, 205, -1, 207, -1, 209, - 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, - 220, -1, -1, 223, -1, 225, 226, 227, 228, 229, - 230, -1, -1, 233, -1, 235, -1, -1, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, -1, 269, - 270, 271, 272, 273, -1, 275, 276, -1, 278, -1, - 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, - -1, 291, 292, 293, -1, -1, 296, 297, 298, -1, - 300, -1, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, -1, 318, 319, - 320, -1, 322, 323, 324, 325, 326, 327, -1, 329, - 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, - 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, - 360, -1, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, - -1, -1, 392, 393, 394, 395, -1, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, -1, -1, 414, 415, 416, 417, -1, 419, - 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, - 430, 431, 432, 433, 434, -1, 436, 437, 438, 439, - 440, 441, 442, 443, -1, -1, 446, 447, 448, 449, - 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, - 460, 461, -1, 463, -1, 465, 466, 467, 468, 469, - 470, 471, -1, -1, 474, -1, 476, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, - 500, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 514, -1, -1, 22, 23, 24, - 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, - -1, 46, 47, 48, -1, 50, 51, 52, 53, 54, - -1, 56, 57, -1, 59, 60, 61, 62, 63, 64, - -1, -1, 67, 68, 69, 70, 71, 72, 73, -1, - 75, 76, 77, 78, 79, -1, -1, -1, 83, 84, - 85, 86, 87, 88, -1, 90, 91, 92, -1, 94, - 95, 96, 97, 98, 99, -1, -1, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, -1, 118, -1, 120, 121, 122, 123, 124, - 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, - 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, - 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, -1, 160, -1, 162, 163, 164, - 165, -1, 167, -1, 169, -1, 171, -1, 173, 174, - 175, -1, 177, -1, 179, -1, 181, 182, 183, 184, - -1, 186, 187, 188, 189, 190, 191, 192, -1, 194, - 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, - 205, -1, 207, -1, 209, 210, 211, 212, 213, 214, - 215, 216, -1, 218, -1, 220, -1, -1, 223, -1, - 225, 226, 227, 228, 229, 230, -1, -1, 233, -1, - 235, -1, -1, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, -1, 269, 270, 271, 272, 273, -1, - 275, 276, -1, 278, -1, 280, 281, 282, 283, 284, - 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, - -1, 296, 297, 298, -1, 300, -1, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, 318, 319, 320, -1, 322, 323, 324, - 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, - -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, -1, 359, 360, -1, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, 379, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, -1, -1, 392, 393, 394, - 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, - 415, 416, 417, -1, 419, 420, 421, 422, 423, -1, - 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, - -1, 436, 437, 438, 439, 440, 441, 442, 443, -1, - -1, 446, 447, 448, 449, 450, 451, 452, 453, -1, - 455, 456, 457, 458, 459, 460, 461, -1, 463, -1, - 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, - -1, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, 497, -1, 3, 500, 5, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 514, - -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, - 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, - -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, - 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, - 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, - 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, - -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, - 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, - -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, - 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, - -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, - 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, - 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, - 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, - 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, - -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, - 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, - 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, - -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, - -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, - -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, - 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, - 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, - 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, - 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, - 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, - -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, - 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, - 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, - -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 514, -1, -1, 22, 23, - 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, - 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, - 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, - 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, - -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, - 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, - 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, - 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, - 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, - 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, - 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, - 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, - 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, - 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, - 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, - 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, - -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, - -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, - -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, - 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, - -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, - 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, - 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, - -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, - 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, - 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, - 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, - 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, - -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, - 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, - -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, - -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, - -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, - 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 514, -1, -1, 22, 23, 24, 25, 26, 27, 28, - 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, - -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, - 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, - 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, - 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, - -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, - 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, - -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, - 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, - -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, - 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, - 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, - 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, - 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, - -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, - 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, - 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, - -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, - -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, - -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, - 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, - 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, - 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, - 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, - 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, - -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, - 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, - 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, - -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 514, -1, -1, 22, 23, - 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, - 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, - 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, - 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, - -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, - 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, - 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, - 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, - 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, - 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, - 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, - 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, - 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, - 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, - 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, - 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, - -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, - -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, - -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, - 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, - -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, - 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, - 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, - -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, - 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, - 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, - 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, - 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, - -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, - 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, - -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, - -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, - -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, - 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 514, -1, -1, 22, 23, 24, 25, 26, 27, 28, - 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, - -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, - 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, - 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, - 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, - -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, - 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, - -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, - 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, - -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, - 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, - 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, - 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, - 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, - -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, - 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, - 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, - -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, - -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, - -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, - 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, - 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, - 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, - 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, - 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, - -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, - 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, - 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, - -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 514, -1, -1, 22, 23, - 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, - 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, - 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, - 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, - -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, - 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, - 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, - 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, - 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, - 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, - 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, - 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, - 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, - 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, - 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, - 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, - -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, - -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, - -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, - 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, - -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, - 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, - 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, - -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, - 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, - 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, - 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, - 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, - -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, - 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, - -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, - -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, - -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, - 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 514, -1, -1, 22, 23, 24, 25, 26, 27, 28, - 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, - -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, - 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, - 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, - 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, - -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, - 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, - -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, - 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, - -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, - 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, - 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, - 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, - 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, - -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, - 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, - 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, - -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, - -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, - -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, - 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, - 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, - 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, - 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, - 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, - -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, - 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, - 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 514, -1, -1, 22, 23, - 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, - 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, - 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, - 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, - -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, - 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, - 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, - 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, - 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, - 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, - 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, - 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, - 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, - 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, - 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, - 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, - -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, - -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, - -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, - 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, - -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, - 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, - 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, - -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, - 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, - 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, - 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, - 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, - -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, - 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, - -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, - -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, - -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, - 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 514, -1, -1, 22, 23, 24, 25, 26, 27, 28, - 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, - -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, - 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, - 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, - 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, - -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, - 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, - -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, - 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, - -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, - 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, - 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, - 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, - 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, - 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, - -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, - 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, - 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, - -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, - -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, - -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, - 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, - 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, - 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, - 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, - 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, - -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, - 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, - 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, -1, - 3, 4, 5, -1, -1, 8, 9, -1, -1, -1, - -1, -1, 15, 16, -1, 514, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - -1, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, -1, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 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, -1, - 153, 154, 155, 156, 157, -1, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, -1, -1, - 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, -1, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, -1, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, -1, 299, 300, 301, -1, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, -1, 321, 322, - 323, -1, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, -1, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 427, 428, 429, 430, 431, -1, - 433, -1, 435, 436, 437, 438, 439, 440, 441, 442, - 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, -1, 461, 462, - 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, - 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 494, 495, 496, 497, -1, 3, -1, 501, 502, - 503, 8, 505, 506, 507, 508, 509, 510, 15, 16, - -1, -1, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, -1, -1, -1, 501, 502, 503, -1, 505, 506, - 507, 508, 509, 510, 8, -1, -1, 11, -1, -1, - -1, 15, 16, 17, 18, 19, 20, 21, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 36, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 46, 8, -1, -1, 11, -1, -1, 53, - 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 36, -1, -1, -1, -1, 80, -1, -1, -1, - -1, 46, 8, -1, -1, 11, -1, -1, 53, 15, - 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 36, -1, -1, -1, -1, 80, -1, -1, -1, -1, - 46, -1, -1, -1, -1, -1, -1, 53, -1, 8, - -1, -1, 11, -1, -1, -1, 15, 16, 17, 18, - 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 80, -1, -1, 36, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 46, 8, -1, - -1, 11, 176, -1, 53, 15, 16, 17, 18, 19, - 20, 21, -1, -1, -1, -1, -1, -1, -1, 193, - -1, -1, -1, -1, 198, -1, 36, -1, -1, -1, - -1, 80, -1, -1, -1, -1, 46, -1, -1, -1, - -1, 176, -1, 53, -1, -1, -1, 221, 222, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 193, -1, - -1, -1, 236, 198, -1, -1, -1, -1, -1, -1, - 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 176, -1, -1, -1, -1, -1, 221, 222, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 193, -1, -1, - 274, 236, 198, 277, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 291, -1, -1, - 294, -1, -1, -1, -1, 221, 222, 176, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 274, - 236, -1, 277, -1, 193, -1, -1, -1, -1, 198, - -1, -1, -1, -1, -1, -1, 291, -1, -1, 294, - -1, -1, -1, -1, -1, -1, 176, -1, -1, -1, - -1, -1, 221, 222, -1, -1, -1, -1, 274, -1, - -1, 277, -1, 193, -1, -1, -1, 236, 198, -1, - -1, -1, -1, -1, -1, 291, -1, -1, 294, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 221, 222, -1, -1, -1, -1, 391, -1, -1, - -1, -1, -1, -1, -1, 274, 236, -1, 277, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 291, -1, -1, 294, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 391, -1, -1, -1, - -1, -1, -1, -1, 274, -1, -1, 277, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 291, -1, -1, 294, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 391, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 498, -1, -1, 501, 502, 503, - -1, 505, 506, 507, 508, 509, 510, -1, -1, -1, - -1, 515, 391, -1, -1, -1, -1, -1, 8, -1, - -1, 11, -1, -1, -1, 15, 16, 17, 18, 19, - 20, 21, -1, 498, -1, -1, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, 36, -1, -1, -1, - 515, 391, -1, -1, -1, -1, 46, -1, -1, -1, - -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, - -1, -1, 498, -1, -1, 501, 502, 503, -1, 505, - 506, 507, 508, 509, 510, -1, -1, -1, -1, 515, - 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 8, -1, -1, 11, -1, -1, - -1, 15, 16, 17, 18, 19, 20, 21, -1, 498, - -1, -1, 501, 502, 503, -1, 505, 506, 507, 508, - 509, 510, 36, -1, -1, -1, 515, -1, -1, -1, - -1, -1, 46, 8, -1, -1, 11, -1, -1, 53, - 15, 16, 17, 18, 19, 20, 21, -1, 498, -1, - -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, - 510, 36, -1, -1, -1, 515, 80, -1, -1, -1, - -1, 46, 8, -1, -1, 11, 176, -1, 53, 15, - 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, - -1, -1, -1, 193, -1, -1, -1, -1, 198, -1, - 36, -1, -1, -1, -1, 80, -1, -1, -1, -1, - 46, -1, -1, -1, -1, -1, -1, 53, -1, -1, - -1, 221, 222, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 236, -1, -1, -1, - -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, - -1, 11, 176, -1, -1, 15, 16, 17, 18, 19, - 20, 21, -1, -1, 274, -1, -1, 277, -1, 193, - -1, -1, -1, -1, 198, -1, 36, -1, -1, -1, - -1, 291, -1, -1, 294, -1, 46, -1, -1, -1, - -1, 176, -1, 53, -1, -1, -1, 221, 222, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 193, -1, - -1, -1, 236, 198, -1, -1, -1, -1, -1, -1, - 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 176, -1, -1, -1, -1, -1, 221, 222, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 193, -1, -1, - 274, 236, 198, 277, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 291, -1, -1, - 294, -1, -1, -1, -1, 221, 222, -1, -1, -1, - -1, 391, -1, -1, -1, -1, -1, -1, -1, 274, - 236, -1, 277, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 291, -1, -1, 294, - -1, -1, -1, -1, -1, -1, 176, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 274, -1, - -1, 277, -1, 193, -1, -1, -1, -1, 198, -1, - -1, -1, -1, -1, -1, 291, -1, -1, 294, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 221, 222, -1, -1, -1, -1, 391, -1, -1, - -1, -1, -1, -1, -1, -1, 236, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 498, -1, - -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, - 510, -1, -1, -1, -1, 515, 391, -1, -1, -1, - -1, -1, -1, -1, 274, -1, 8, 277, -1, 11, - -1, -1, -1, 15, 16, 17, 18, 19, 20, 21, - -1, 291, -1, -1, 294, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 36, 391, 24, -1, -1, -1, - -1, -1, -1, -1, 46, -1, -1, -1, -1, -1, - -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 498, -1, -1, 501, 502, 503, - -1, 505, 506, 507, 508, 509, 510, -1, 80, -1, - -1, 515, -1, -1, -1, -1, -1, -1, 8, -1, - -1, 11, -1, 81, -1, 15, 16, 17, 18, 19, - 20, 21, -1, 498, -1, -1, 501, 502, 503, 97, - 505, 506, 507, 508, 509, 510, 36, -1, -1, -1, - 515, 391, -1, -1, -1, -1, 46, -1, -1, -1, - -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, - -1, -1, 498, -1, -1, 501, 502, 503, -1, 505, - 506, 507, 508, 509, 510, -1, -1, 513, 146, -1, - 80, -1, -1, -1, -1, -1, -1, -1, 156, -1, - -1, -1, -1, -1, 176, -1, -1, -1, -1, -1, - 168, -1, -1, -1, -1, 173, -1, -1, -1, -1, - -1, 193, -1, -1, -1, -1, 198, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 202, -1, -1, -1, -1, 221, - 222, -1, -1, -1, -1, -1, -1, -1, 498, -1, - -1, 501, 502, 503, 236, 505, 506, 507, 508, 509, - 510, -1, -1, 513, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 176, 245, -1, -1, - -1, 249, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 274, 193, -1, 277, -1, -1, 198, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 291, - -1, -1, 294, -1, -1, -1, -1, -1, -1, -1, - -1, 221, 222, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 236, -1, -1, -1, - -1, -1, -1, -1, -1, 313, -1, -1, -1, -1, - -1, 319, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 334, -1, -1, -1, - -1, -1, -1, -1, 274, -1, -1, 277, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 291, -1, -1, 294, -1, -1, -1, -1, 367, - -1, -1, 370, -1, -1, -1, -1, -1, -1, 391, - -1, -1, -1, 381, -1, -1, 384, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 402, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 416, -1, - -1, -1, -1, -1, 422, 423, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 433, -1, -1, -1, -1, - -1, 439, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 391, -1, -1, -1, -1, -1, -1, 466, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 498, -1, -1, 501, - 502, 503, -1, 505, 506, 507, 508, 509, 510, -1, - -1, 513, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 3, -1, -1, 498, -1, - -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, - 510, -1, -1, 513, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 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, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, - 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 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, 426, 427, - 428, 429, 430, 431, 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, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, - 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 3, -1, -1, -1, -1, -1, -1, -1, -1, 507, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, - 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, - 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 43, 44, -1, 46, 47, 48, -1, 50, 51, 52, - 53, 54, -1, 56, 57, -1, 59, 60, 61, 62, - 63, 64, -1, -1, 67, 68, 69, 70, 71, 72, - 73, -1, 75, 76, 77, 78, 79, -1, -1, -1, - 83, 84, 85, 86, 87, 88, -1, 90, 91, 92, - -1, 94, 95, 96, 97, 98, 99, -1, -1, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, - 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, - -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, - -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, -1, 160, -1, 162, - 163, 164, 165, -1, 167, -1, 169, -1, -1, -1, - 173, 174, 175, -1, 177, -1, 179, -1, 181, 182, - 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, - -1, 194, 195, 196, 197, -1, 199, 200, 201, 202, - 203, 204, 205, -1, 207, -1, 209, 210, 211, 212, - 213, 214, 215, 216, -1, 218, -1, 220, -1, -1, - 223, -1, 225, 226, 227, 228, 229, 230, -1, -1, - 233, -1, 235, -1, -1, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, -1, 269, 270, 271, 272, - 273, -1, 275, 276, -1, 278, -1, 280, 281, 282, - 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, - 293, -1, -1, 296, 297, 298, -1, 300, -1, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, -1, -1, -1, -1, 318, 319, 320, -1, 322, - 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, - 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, - 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, -1, 359, 360, -1, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, - 383, 384, 385, 386, 387, 388, 389, -1, -1, 392, - 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, - -1, 414, 415, -1, 417, -1, 419, 420, 421, 422, - 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, - 433, 434, -1, 436, 437, 438, 439, 440, 441, 442, - 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, - 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, - 463, -1, 465, 466, 467, 468, 469, 470, 471, -1, - -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, - 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, - 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, - -1, -1, -1, -1, 507, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, - 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 43, 44, -1, 46, 47, - 48, -1, 50, 51, 52, 53, 54, -1, 56, 57, - -1, 59, 60, 61, 62, 63, 64, -1, -1, 67, - 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, - 78, 79, -1, -1, -1, 83, 84, 85, 86, 87, - 88, -1, 90, 91, 92, -1, 94, 95, 96, 97, - 98, 99, -1, -1, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, - 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, - 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, - 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, 160, -1, 162, 163, 164, 165, -1, 167, - -1, 169, -1, -1, -1, 173, 174, 175, -1, 177, - -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, - 188, 189, 190, 191, 192, -1, 194, 195, 196, 197, - -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, - -1, 209, 210, 211, 212, 213, 214, 215, 216, -1, - 218, -1, 220, -1, -1, 223, -1, 225, 226, 227, - 228, 229, 230, -1, -1, 233, -1, 235, -1, -1, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - -1, 269, 270, 271, 272, 273, -1, 275, 276, -1, - 278, -1, 280, 281, 282, 283, 284, 285, -1, 287, - 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, - 298, -1, 300, -1, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, - 318, 319, 320, -1, 322, 323, 324, 325, 326, 327, - -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, - 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - -1, 359, 360, -1, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, - 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, - 388, 389, -1, -1, 392, 393, 394, 395, -1, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, - -1, 419, 420, 421, 422, 423, -1, 425, 426, 427, - -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, - 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, - 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, - 458, 459, 460, 461, -1, 463, -1, 465, 466, 467, - 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 3, 4, 5, -1, -1, -1, 9, -1, -1, 507, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, - 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, - 33, -1, -1, -1, 37, -1, -1, -1, -1, 42, - 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, - 63, 64, -1, -1, 67, 68, 69, 70, 71, 72, - 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, - 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, - -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, - -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, - 163, 164, 165, -1, 167, -1, 169, 170, -1, 172, - 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, - 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, - 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, -1, -1, - 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, -1, 275, 276, 277, 278, -1, 280, 281, 282, - 283, 284, 285, -1, 287, 288, 289, -1, 291, 292, - 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, -1, -1, -1, -1, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, - 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, - 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378, -1, 380, 381, 382, - 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, - 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, - -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, - 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 1951, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 1952, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 1953, 448, 0, + 450, 1954, 452, 1955, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 1956, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 815, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 822, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 823, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 824, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 825, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 826, 457, 0, 0, 827, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 859, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 891, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 894, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 898, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 926, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 954, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 957, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 1000, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 1023, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 822, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 826, 457, 0, 0, 827, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 1303, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 1305, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 1308, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 1310, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 2229, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 1476, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 1477, 0, 0, -788, 0, 1478, 129, + 130, 0, 131, 132, 133, 1479, 135, 136, 137, 0, + 1480, 1481, 1482, 1483, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 1484, 1485, 155, + 0, 156, 157, 158, 159, 0, 0, 1486, 0, 1487, + 163, 164, 165, 166, 167, 1488, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 1489, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 1490, 190, + 191, 1491, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 0, 221, + 222, 223, 224, 225, 0, 0, 227, 0, 228, 229, + 1492, 231, 0, 232, 0, 233, 1493, 0, 1494, 236, + 237, -788, 1495, 240, 0, 241, 0, 0, 0, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 1496, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 1497, 0, 268, 269, 270, 271, + 272, 1498, 1499, 0, 1500, 0, 276, 1501, 1502, 279, + 1503, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 1504, 289, 1505, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 1506, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 1507, 1508, 1509, 323, 324, 325, 0, + 0, 327, 328, 1510, 330, 0, 0, 332, 1511, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 0, 1512, 346, 1513, 0, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 0, 1514, 364, 365, + 0, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 1515, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 1516, 400, 401, + 402, 1517, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 1518, 417, 418, 419, + 420, 421, 422, 1519, 424, 425, 0, 1520, 427, 428, + 1521, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 1522, 444, 0, 0, 0, + 446, 447, 0, 448, 1523, 450, 451, 452, 453, 454, + 0, 455, 1524, 1525, 0, 0, 458, 459, 0, 461, + 0, 0, 463, 464, 1526, 466, 467, 468, 469, 470, + 1527, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 0, 1528, 0, 485, + 1529, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 523, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, + 512, 513, 514, 515, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 2974, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 837, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 838, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 839, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 840, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 841, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 950, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 839, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 841, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 1299, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 1320, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 1671, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 0, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 1847, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 523, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 244, 245, 0, 246, 247, 248, + 249, 250, 2216, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 523, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, + 130, 0, 131, 132, 133, 0, 135, 136, 137, 138, + 139, 0, 141, 142, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 153, 154, 155, + 0, 156, 157, 158, 159, 160, 0, 0, 0, 162, + 163, 164, 165, 166, 167, 0, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 0, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 207, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 0, 227, 0, 228, 229, + 230, 231, 0, 232, 0, 233, 0, 0, 0, 236, + 237, 524, 0, 240, 0, 241, 0, 242, 243, 244, + 245, 0, 246, 247, 248, 249, 250, 2231, 252, 0, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 0, 267, 268, 269, 270, 271, + 272, 273, 274, 0, 275, 0, 276, 0, 0, 279, + 0, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 0, 289, 0, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 525, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 0, 322, 323, 324, 325, 326, + 0, 327, 328, 0, 330, 0, 331, 332, 333, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 344, 0, 346, 0, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 362, 0, 364, 365, + 366, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 0, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 0, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 427, 428, + 429, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 526, 444, 445, 0, 0, + 446, 447, 0, 448, 0, 450, 451, 452, 453, 454, + 0, 455, 456, 457, 0, 0, 458, 459, 460, 461, + 462, 0, 463, 464, 465, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 483, 484, 0, 485, + 0, 487, 488, 489, 490, 491, 492, 493, 0, 0, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 1476, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 1477, 0, + 0, 0, 0, 1478, 129, 130, 0, 131, 132, 133, + 1479, 135, 136, 137, 0, 1480, 1481, 1482, 1483, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 1484, 1485, 155, 0, 156, 157, 158, 159, + 0, 0, 1486, 0, 1487, 163, 164, 165, 166, 167, + 1488, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 1489, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 1490, 190, 191, 1491, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 0, 221, 222, 223, 224, 225, 0, + 0, 227, 0, 228, 229, 1492, 231, 0, 232, 0, + 233, 1493, 0, 1494, 236, 237, 0, 1495, 240, 0, + 241, 0, 0, 0, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 1496, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 1497, + 0, 268, 269, 270, 271, 272, 1498, 1499, 0, 1500, + 0, 276, 1501, 1502, 279, 1503, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 1504, 289, 1505, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 1506, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 1507, 1508, + 1509, 323, 324, 325, 0, 0, 327, 328, 1510, 330, + 0, 0, 332, 1511, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 0, + 1512, 346, 1513, 0, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 0, 1514, 364, 365, 0, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 1515, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 1516, 400, 401, 402, 1517, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 1518, 417, 418, 419, 420, 421, 422, 1519, 424, + 425, 0, 1520, 427, 428, 1521, 430, 0, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, - 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, - 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, - -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, - 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, - 493, 494, 495, 496, 497, -1, -1, 8, -1, -1, - 11, -1, 505, 506, 15, 16, 17, 18, 19, 20, - 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 36, -1, -1, -1, -1, - 41, -1, -1, -1, -1, 46, 8, -1, -1, 11, - -1, -1, 53, 15, 16, 17, 18, 19, 20, 21, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 36, -1, -1, -1, -1, 80, - -1, -1, -1, -1, 46, 8, -1, -1, 11, -1, - -1, 53, 15, 16, 17, 18, 19, 20, 21, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 36, -1, -1, -1, -1, 80, -1, - -1, -1, -1, 46, -1, 126, -1, -1, -1, -1, - 53, -1, -1, 8, -1, -1, 11, -1, -1, -1, - 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, - -1, 36, -1, -1, -1, 40, -1, -1, -1, -1, - -1, 46, -1, 8, -1, 176, 11, -1, 53, -1, - 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, - -1, -1, 193, -1, -1, -1, -1, 198, -1, -1, - -1, 36, -1, -1, 166, 80, -1, -1, -1, 171, - -1, 46, -1, -1, 176, -1, -1, -1, 53, -1, - 221, 222, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 193, -1, -1, -1, 236, 198, -1, -1, -1, - -1, -1, 165, -1, -1, 80, -1, -1, -1, -1, - -1, -1, -1, 176, -1, -1, -1, -1, -1, 221, - 222, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 193, -1, -1, 274, 236, 198, 277, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 291, -1, -1, 294, -1, -1, -1, -1, 221, 222, - -1, 176, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 274, 236, -1, 277, -1, -1, 193, -1, - -1, -1, -1, 198, -1, -1, -1, -1, -1, 291, - -1, -1, 294, -1, -1, -1, -1, -1, -1, -1, - -1, 176, -1, -1, -1, -1, 221, 222, -1, -1, - -1, 274, -1, -1, 277, -1, -1, -1, 193, -1, - -1, 236, -1, 198, -1, -1, -1, -1, 291, -1, - -1, 294, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 221, 222, -1, -1, - 391, -1, -1, -1, -1, -1, -1, -1, -1, 274, - 323, 236, 277, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 291, -1, -1, 294, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 391, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 274, - -1, -1, 277, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 454, -1, -1, 291, -1, -1, 294, - -1, -1, -1, -1, -1, -1, -1, -1, 391, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 317, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 498, -1, -1, - 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, - -1, -1, -1, -1, -1, -1, 391, -1, -1, -1, - -1, 8, -1, -1, 11, -1, -1, -1, 15, 16, - 17, 18, 19, 20, 21, -1, 498, -1, -1, 501, - 502, 503, -1, 505, 506, 507, 508, 509, 510, 36, - -1, -1, -1, 40, -1, -1, 391, -1, -1, 46, - -1, -1, -1, -1, -1, -1, 53, -1, -1, -1, - -1, -1, -1, -1, -1, 498, -1, -1, 501, 502, - 503, -1, 505, 506, 507, 508, 509, 510, -1, -1, - -1, -1, -1, 80, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, - -1, 11, -1, -1, -1, 15, 16, 17, 18, 19, - 20, 21, -1, 498, -1, -1, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, 36, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 46, -1, -1, -1, - -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 498, -1, -1, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, -1, -1, -1, -1, - 80, -1, -1, -1, -1, 8, -1, -1, 11, 176, - -1, -1, 15, 16, 17, 18, 19, 20, 21, -1, - -1, -1, -1, -1, -1, -1, 193, -1, -1, -1, - -1, 198, -1, 36, -1, -1, -1, 40, -1, -1, - -1, -1, -1, 46, -1, -1, -1, -1, -1, -1, - 53, -1, -1, -1, 221, 222, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 236, - -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 171, 8, -1, -1, 11, 176, -1, -1, 15, - 16, 17, 18, 19, 20, 21, -1, 274, -1, -1, - 277, -1, -1, 193, -1, -1, -1, -1, 198, -1, - 36, -1, -1, -1, 291, -1, -1, 294, -1, -1, - 46, -1, -1, -1, -1, -1, -1, 53, -1, -1, - -1, 221, 222, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 236, -1, -1, -1, - -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, - -1, -1, -1, 176, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 193, -1, -1, -1, 274, 198, -1, 277, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 291, -1, -1, 294, -1, -1, -1, 221, 222, - -1, -1, -1, -1, 391, -1, -1, 8, -1, -1, - 11, -1, -1, 236, 15, 16, 17, 18, 19, 20, - 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 166, -1, -1, -1, -1, 36, -1, -1, -1, -1, - 176, -1, -1, -1, -1, 46, -1, -1, -1, -1, - -1, 274, 53, -1, 277, -1, -1, 193, -1, -1, - -1, -1, 198, -1, -1, -1, -1, -1, 291, -1, - -1, 294, -1, -1, -1, -1, -1, -1, -1, 80, - -1, -1, -1, -1, -1, 221, 222, -1, -1, -1, - -1, 391, -1, -1, -1, -1, -1, -1, -1, -1, - 236, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 498, -1, -1, 501, 502, 503, -1, 505, 506, - 507, 508, 509, 510, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 274, -1, - -1, 277, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 291, -1, -1, 294, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 391, -1, - -1, -1, -1, -1, -1, 176, -1, -1, -1, -1, + 1522, 444, 0, 0, 0, 446, 447, 0, 448, 1523, + 450, 451, 452, 453, 454, 0, 455, 1524, 1525, 0, + 0, 458, 459, 0, 461, 0, 0, 463, 464, 1526, + 466, 467, 468, 469, 470, 1527, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 0, 1528, 0, 485, 1529, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 1476, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 512, 513, 514, 515, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 1477, 0, + 0, 0, 0, 1478, 129, 130, 0, 131, 132, 133, + 1479, 135, 136, 137, 0, 1480, 1481, 1482, 1483, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 1484, 1485, 155, 0, 156, 157, 158, 159, + 0, 0, 1486, 0, 1487, 163, 164, 165, 166, 167, + 1488, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 1489, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 1490, 190, 191, 1491, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, + 0, 210, 211, 212, 0, 1829, 214, 215, 0, 216, + 217, 218, 219, 0, 221, 222, 223, 224, 225, 0, + 0, 227, 0, 228, 229, 1492, 231, 0, 232, 0, + 233, 1493, 0, 1494, 236, 237, 0, 1495, 240, 0, + 241, 0, 0, 0, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 1496, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 1497, + 0, 268, 269, 270, 271, 272, 1498, 1499, 0, 1500, + 0, 276, 1501, 1502, 279, 1503, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 1504, 289, 1505, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 1506, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 1507, 1508, + 1509, 323, 324, 325, 0, 0, 327, 328, 1510, 330, + 0, 0, 332, 1511, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 0, + 1512, 346, 1513, 0, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 0, 1514, 364, 365, 0, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 1515, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 1516, 400, 401, 402, 1517, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 1518, 417, 418, 419, 420, 421, 422, 1519, 424, + 425, 0, 1520, 427, 428, 1521, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 1522, 444, 0, 0, 0, 446, 447, 0, 448, 1523, + 450, 451, 452, 453, 454, 0, 455, 1524, 1525, 0, + 0, 458, 459, 0, 461, 0, 0, 463, 464, 1526, + 466, 467, 468, 469, 470, 1527, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 0, 1528, 0, 485, 1529, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 3144, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 512, 513, 514, 515, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 2896, 0, + 0, 0, 0, 2897, 129, 130, 0, 131, 132, 133, + 2898, 135, 136, 137, 0, 1480, 2899, 1482, 1483, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 1484, 1485, 155, 0, 156, 157, 158, 159, + 0, 0, 2900, 0, 2901, 163, 164, 165, 166, 167, + 2902, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 2903, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 1490, 190, 191, 1491, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 1059, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 0, 221, 222, 223, 224, 225, 0, + 0, 227, 0, 228, 229, 1492, 231, 0, 232, 0, + 233, 2904, 0, 2905, 236, 237, 2906, 2907, 240, 0, + 241, 0, 0, 0, 244, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 2908, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 2909, + 0, 268, 269, 270, 271, 272, 1498, 1499, 0, 1500, + 0, 276, 2910, 2911, 279, 2912, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 2913, 289, 2914, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 3145, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 1507, 2916, + 1509, 323, 324, 325, 0, 0, 327, 328, 2918, 330, + 0, 0, 332, 1511, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 0, + 2920, 346, 2921, 0, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 0, 2922, 364, 365, 0, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 377, 378, + 1515, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 2923, 400, 401, 402, 0, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 2924, 417, 418, 419, 420, 421, 422, 0, 424, + 425, 0, 2926, 427, 428, 1521, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 3146, 444, 0, 0, 0, 446, 447, 0, 448, 2928, + 450, 451, 452, 453, 454, 0, 455, 1524, 1525, 0, + 0, 458, 459, 0, 461, 0, 0, 463, 464, 2929, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 0, 1528, 0, 485, 2931, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 523, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 512, 513, 514, 515, 0, + 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, + 0, 135, 136, 137, 138, 139, 0, 141, 142, 0, + 143, 144, 145, 146, 147, 148, 0, 0, 149, 150, + 151, 152, 153, 154, 155, 0, 156, 157, 158, 159, + 160, 0, 0, 0, 162, 163, 164, 165, 166, 167, + 0, 169, 170, 171, 0, 172, 173, 174, 175, 176, + 177, 0, 0, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 0, 194, + 0, 195, 196, 197, 198, 199, 200, 0, 0, 201, + 202, 203, 204, 0, 0, 205, 206, 207, 208, 209, + 0, 210, 211, 212, 0, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 236, 237, 524, 0, 240, 0, + 241, 0, 242, 243, 0, 245, 0, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 256, 257, 0, + 258, 259, 260, 261, 262, 263, 264, 0, 265, 0, + 267, 268, 269, 270, 271, 272, 273, 274, 0, 275, + 0, 276, 0, 0, 279, 0, 281, 282, 283, 284, + 285, 286, 0, 0, 287, 0, 289, 0, 0, 291, + 292, 293, 294, 295, 296, 297, 298, 525, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 0, 327, 328, 0, 330, + 0, 331, 332, 333, 334, 335, 336, 0, 337, 338, + 0, 0, 339, 340, 341, 0, 0, 342, 343, 344, + 0, 346, 0, 348, 349, 350, 351, 352, 353, 354, + 0, 356, 357, 358, 359, 0, 0, 0, 0, 360, + 361, 362, 0, 364, 365, 366, 367, 368, 369, 0, + 370, 371, 372, 373, 374, 375, 0, 376, 0, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 397, 398, 0, 400, 401, 402, 403, 0, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 0, 0, 427, 428, 429, 430, 0, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 526, 444, 445, 0, 0, 446, 447, 0, 448, 0, + 450, 451, 452, 453, 454, 0, 455, 456, 457, 0, + 0, 458, 459, 460, 461, 462, 0, 463, 464, 465, + 466, 467, 468, 469, 470, 0, 0, 471, 472, 473, + 0, 474, 475, 476, 477, 0, 478, 479, 480, 481, + 482, 483, 484, 0, 485, 0, 487, 488, 489, 490, + 491, 492, 493, 0, 0, 494, 0, 0, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 1766, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 125, 126, 127, + 0, 0, 0, 1477, 0, 0, 0, 0, 1478, 129, + 130, 0, 131, 132, 133, 1479, 135, 136, 137, 0, + 1480, 1481, 1482, 1483, 0, 143, 144, 145, 146, 147, + 148, 0, 0, 149, 150, 151, 152, 1484, 1485, 155, + 0, 156, 157, 158, 159, 0, 0, 1486, 0, 1487, + 163, 164, 165, 166, 167, 1488, 169, 170, 171, 0, + 172, 173, 174, 175, 176, 177, 0, 1489, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 1490, 190, + 191, 1491, 193, 0, 194, 0, 195, 196, 197, 198, + 199, 200, 0, 0, 201, 202, 203, 204, 0, 0, + 205, 206, 1059, 208, 209, 0, 210, 211, 212, 0, + 213, 214, 215, 0, 216, 217, 218, 219, 0, 221, + 222, 223, 224, 225, 0, 0, 227, 0, 228, 229, + 1492, 231, 0, 232, 0, 233, 1493, 0, 1494, 236, + 237, 0, 1495, 240, 0, 241, 0, 0, 0, 244, + 245, 0, 246, 247, 248, 249, 250, 251, 252, 1496, + 254, 255, 256, 257, 0, 258, 259, 260, 261, 262, + 263, 264, 0, 265, 1497, 0, 268, 269, 270, 271, + 272, 1498, 1499, 0, 1500, 0, 276, 1501, 1502, 279, + 1503, 281, 282, 283, 284, 285, 286, 0, 0, 287, + 1504, 289, 1505, 0, 291, 292, 293, 294, 295, 296, + 297, 298, 0, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 1507, 1508, 1509, 323, 324, 325, 0, + 0, 327, 328, 1510, 330, 0, 0, 332, 1511, 334, + 335, 336, 0, 337, 338, 0, 0, 339, 340, 341, + 0, 0, 342, 343, 0, 1512, 346, 1513, 0, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 0, 0, 0, 0, 360, 361, 0, 1514, 364, 365, + 0, 367, 368, 369, 0, 370, 371, 372, 373, 374, + 375, 0, 376, 377, 378, 1515, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 397, 398, 1516, 400, 401, + 402, 0, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 0, 1518, 417, 418, 419, + 420, 421, 422, 0, 424, 425, 0, 1520, 427, 428, + 1521, 430, 0, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 0, 444, 0, 0, 0, + 446, 447, 0, 448, 1523, 450, 451, 452, 453, 454, + 0, 455, 1524, 1525, 0, 0, 458, 459, 0, 461, + 0, 0, 463, 464, 1526, 466, 467, 468, 469, 470, + 0, 0, 471, 472, 473, 0, 474, 475, 476, 477, + 0, 478, 479, 480, 481, 482, 0, 1528, 0, 485, + 1529, 487, 488, 489, 490, 491, 492, 493, 0, 1, + 494, 0, 0, 495, 496, 497, 498, 499, 500, 2, + 0, 3, 4, 0, 0, 0, 0, 1, 0, 0, + 512, 513, 514, 515, 0, 0, 0, 2, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 11, 0, 746, 0, 0, + 0, 10, 0, 0, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 11, 0, 746, 0, 0, 0, 0, + 0, 0, 0, 14, 15, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 747, 0, 0, 0, 0, 0, + 18, 14, 15, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 747, 0, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 22, 0, 19, 0, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 27, 28, 29, 0, 0, 0, 0, 0, 30, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 27, + 28, 29, 0, 0, 0, 0, 0, 30, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, + 33, 0, 0, 0, 0, 0, 0, 0, 0, 32, + 0, 0, 0, 0, 0, 0, 34, 0, 33, 0, + 0, 0, 0, 35, 0, 0, 0, 36, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 37, 0, 0, + 0, 35, 0, 0, 0, 36, 0, 0, 0, 38, + 0, 0, 0, 39, 0, 37, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, + 0, 39, 0, 40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, + 0, 40, 43, 0, 0, 0, 0, 44, 0, 0, + 0, 748, 0, 0, 41, 0, 0, 0, 0, 0, + 43, 0, 0, 45, 0, 44, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 749, 0, 0, 0, 46, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 47 +}; + +static const yytype_int16 yycheck[] = +{ + 7, 516, 0, 0, 47, 835, 895, 73, 920, 16, + 0, 0, 0, 809, 0, 0, 23, 16, 881, 1157, + 741, 0, 0, 7, 1224, 990, 0, 858, 904, 1222, + 1236, 1418, 925, 1692, 1655, 981, 749, 970, 1210, 23, + 38, 20, 2172, 1197, 981, 970, 955, 0, 1079, 1032, + 20, 981, 1298, 17, 2141, 77, 2143, 981, 1466, 1199, + 1191, 77, 2227, 1202, 2162, 1574, 1987, 20, 75, 76, + 39, 959, 970, 0, 1608, 1609, 2612, 0, 46, 1276, + 2314, 0, 2612, 2107, 23, 2651, 0, 1227, 0, 0, + 0, 75, 76, 2161, 1797, 26, 0, 1323, 0, 0, + 0, 2223, 100, 2673, 1124, 0, 0, 35, 895, 1129, + 897, 7, 899, 748, 0, 742, 75, 76, 2649, 0, + 0, 0, 1087, 999, 0, 0, 2666, 23, 749, 0, + 805, 2275, 2276, 2277, 2486, 810, 75, 76, 2294, 5, + 2568, 110, 0, 5, 2572, 9, 9, 1819, 979, 5, + 0, 23, 5, 1712, 0, 1988, 1928, 13, 14, 80, + 13, 14, 1659, 5, 11, 1815, 1710, 2985, 5, 16, + 5, 5, 45, 63, 5, 5, 13, 14, 5, 75, + 76, 1106, 13, 14, 772, 5, 982, 5, 5, 9, + 5, 1053, 1054, 2315, 9, 13, 14, 13, 14, 46, + 5, 5, 1135, 75, 76, 5, 5, 5, 1070, 5, + 1135, 2970, 13, 14, 40, 1816, 1961, 1962, 2302, 139, + 3, 4, 5, 2306, 45, 11, 9, 1972, 2300, 2988, + 16, 1976, 119, 80, 60, 63, 55, 172, 82, 3, + 3, 5, 190, 2365, 2366, 871, 2368, 876, 4, 93, + 100, 1057, 1033, 9, 100, 1086, 876, 970, 2437, 2437, + 1243, 74, 171, 2824, 1140, 4, 90, 1073, 63, 1252, + 9, 34, 35, 244, 171, 124, 287, 3149, 1211, 11, + 106, 1214, 1215, 15, 16, 290, 1211, 802, 2870, 1214, + 1215, 180, 2940, 11, 172, 1433, 226, 15, 16, 5, + 122, 107, 11, 295, 82, 129, 15, 16, 983, 289, + 312, 5, 11, 107, 46, 93, 15, 16, 183, 295, + 995, 312, 2805, 0, 2807, 30, 275, 2530, 1466, 2532, + 122, 122, 2419, 38, 117, 850, 147, 46, 973, 107, + 64, 106, 272, 20, 117, 137, 23, 1519, 80, 75, + 74, 192, 171, 379, 1135, 168, 1186, 1187, 40, 1190, + 278, 38, 119, 388, 366, 53, 1612, 1954, 1955, 1956, + 47, 80, 132, 161, 30, 201, 3280, 30, 166, 3344, + 13, 14, 38, 163, 3388, 38, 161, 2531, 30, 2925, + 212, 41, 120, 40, 30, 192, 2582, 1309, 75, 76, + 77, 148, 3238, 165, 3240, 11, 217, 170, 338, 172, + 1898, 365, 37, 117, 2980, 163, 2581, 1280, 3177, 3477, + 1345, 1346, 33, 100, 250, 2991, 2556, 2130, 478, 1210, + 308, 3312, 4, 478, 260, 218, 108, 9, 132, 289, + 46, 1929, 503, 289, 476, 1338, 272, 104, 59, 237, + 500, 2982, 199, 514, 2478, 500, 2578, 240, 2580, 389, + 3518, 3279, 237, 108, 514, 159, 194, 357, 500, 3473, + 3374, 3436, 337, 3377, 80, 393, 126, 448, 304, 3079, + 3316, 3081, 230, 307, 295, 250, 190, 213, 176, 514, + 132, 271, 518, 175, 1525, 260, 132, 2683, 286, 3147, + 1746, 366, 451, 514, 272, 193, 279, 509, 358, 514, + 198, 352, 358, 2716, 392, 328, 240, 1298, 509, 428, + 63, 451, 279, 180, 284, 3107, 518, 3010, 175, 357, + 356, 428, 3093, 166, 514, 327, 534, 1163, 8, 3411, + 413, 11, 518, 514, 3126, 15, 16, 172, 236, 19, + 20, 21, 472, 2732, 2732, 381, 3437, 3375, 355, 1188, + 514, 323, 357, 1151, 82, 454, 514, 3471, 1188, 456, + 274, 2693, 1980, 279, 400, 93, 370, 1092, 2662, 514, + 274, 588, 289, 208, 428, 279, 1740, 2659, 2509, 588, + 284, 512, 413, 1424, 503, 516, 2679, 421, 2107, 224, + 0, 1322, 3202, 2375, 1801, 454, 1327, 516, 1438, 234, + 416, 2145, 1333, 3149, 416, 272, 478, 3376, 132, 3149, + 2179, 463, 1484, 1485, 3164, 1455, 476, 1340, 518, 451, + 476, 1857, 445, 444, 2178, 82, 518, 1837, 500, 403, + 404, 1566, 505, 506, 1890, 2317, 93, 1509, 514, 513, + 428, 478, 514, 1578, 520, 1580, 1902, 2307, 514, 517, + 451, 514, 2171, 510, 520, 515, 1872, 517, 2165, 515, + 3098, 517, 514, 500, 1657, 3103, 2841, 514, 512, 514, + 514, 1606, 516, 514, 514, 1491, 1932, 514, 2433, 515, + 518, 396, 2848, 1939, 514, 514, 514, 514, 514, 514, + 3052, 464, 1329, 391, 1339, 1511, 749, 1569, 1570, 514, + 514, 2312, 3278, 514, 514, 514, 514, 3287, 514, 1340, + 1551, 1552, 505, 506, 510, 1601, 1602, 1603, 198, 272, + 1561, 1977, 406, 2967, 249, 1981, 361, 476, 1519, 1545, + 396, 435, 749, 396, 1575, 120, 3286, 161, 161, 505, + 506, 221, 446, 166, 2822, 380, 1431, 800, 11, 274, + 274, 500, 454, 2009, 415, 108, 505, 506, 425, 748, + 284, 514, 119, 1604, 503, 507, 508, 509, 510, 749, + 517, 430, 789, 265, 1709, 1710, 2707, 516, 1985, 507, + 508, 509, 510, 800, 468, 748, 505, 506, 507, 508, + 509, 510, 453, 1941, 2828, 789, 505, 506, 507, 508, + 509, 510, 3337, 3338, 357, 881, 800, 2961, 149, 194, + 3386, 291, 514, 237, 237, 454, 848, 80, 835, 836, + 479, 1612, 848, 2420, 2421, 2422, 2423, 1770, 320, 274, + 3371, 800, 1980, 386, 279, 1770, 2968, 1780, 191, 513, + 1783, 858, 420, 784, 422, 1780, 2875, 534, 1783, 206, + 524, 800, 1845, 2784, 2883, 3390, 823, 824, 825, 200, + 868, 868, 286, 286, 244, 3411, 1765, 356, 868, 868, + 868, 3411, 868, 868, 853, 514, 856, 244, 512, 868, + 868, 859, 516, 789, 868, 902, 903, 1412, 3429, 906, + 907, 336, 871, 1624, 800, 2131, 464, 386, 2741, 837, + 838, 2744, 840, 2746, 1552, 868, 1004, 789, 515, 274, + 2058, 518, 513, 1561, 2627, 272, 2629, 274, 800, 1949, + 1823, 3497, 244, 524, 1022, 1798, 1799, 1800, 1026, 3173, + 1873, 868, 71, 72, 3109, 868, 1855, 173, 1873, 868, + 1859, 1738, 959, 1862, 868, 4, 868, 868, 868, 226, + 9, 925, 2496, 970, 868, 1746, 868, 868, 868, 2478, + 5, 978, 979, 868, 868, 1873, 1864, 984, 1765, 478, + 987, 988, 868, 990, 991, 992, 993, 868, 868, 868, + 132, 3089, 868, 868, 973, 514, 173, 868, 1785, 1006, + 370, 500, 4, 1790, 26, 272, 1013, 9, 258, 259, + 2397, 365, 366, 370, 37, 514, 2147, 159, 2149, 245, + 973, 509, 1006, 132, 1031, 1032, 1033, 177, 516, 1013, + 514, 501, 502, 503, 147, 505, 506, 507, 508, 509, + 510, 4, 177, 1009, 1087, 1052, 9, 1006, 161, 1015, + 159, 2251, 1880, 166, 1013, 1776, 1884, 512, 370, 1887, + 1781, 516, 512, 2201, 1071, 108, 516, 1006, 245, 1994, + 352, 748, 749, 2319, 1013, 1082, 1083, 1084, 448, 1086, + 1087, 2278, 509, 3004, 1091, 420, 59, 422, 3253, 516, + 240, 448, 1091, 2796, 512, 74, 514, 1423, 516, 1425, + 1426, 80, 377, 2612, 217, 240, 1937, 1014, 377, 1890, + 1006, 1018, 789, 1120, 93, 137, 342, 1013, 202, 2259, + 74, 1902, 389, 800, 237, 375, 376, 512, 251, 514, + 1137, 1138, 274, 420, 1006, 422, 448, 279, 117, 433, + 119, 1013, 284, 515, 514, 416, 518, 1169, 1170, 172, + 1172, 1932, 466, 1169, 1170, 381, 1172, 514, 1939, 515, + 1873, 374, 518, 117, 1171, 342, 377, 30, 1175, 1176, + 279, 848, 2137, 286, 476, 284, 478, 244, 1185, 1186, + 1187, 514, 295, 1190, 451, 208, 2233, 2326, 2235, 2020, + 416, 868, 244, 2332, 1163, 420, 1977, 422, 171, 177, + 1981, 224, 514, 1210, 381, 515, 1987, 2453, 518, 837, + 838, 234, 840, 8, 515, 515, 11, 518, 518, 2144, + 15, 16, 85, 514, 19, 20, 21, 206, 2009, 515, + 515, 94, 518, 518, 6, 370, 1243, 514, 10, 416, + 466, 36, 166, 342, 26, 1252, 18, 2578, 514, 2580, + 32, 514, 2177, 2178, 202, 118, 873, 1226, 875, 244, + 82, 33, 240, 515, 2095, 37, 518, 514, 26, 1276, + 420, 293, 422, 515, 32, 515, 518, 515, 518, 2142, + 518, 515, 381, 514, 518, 420, 108, 422, 171, 466, + 514, 1298, 514, 435, 42, 274, 973, 2435, 448, 514, + 279, 2439, 2710, 370, 446, 13, 14, 1314, 1297, 1297, + 514, 1297, 1297, 448, 507, 1314, 1323, 416, 370, 2828, + 274, 2230, 500, 2232, 3489, 279, 435, 190, 171, 1006, + 514, 444, 354, 1340, 356, 313, 1013, 446, 361, 497, + 203, 314, 315, 316, 3474, 515, 3476, 223, 518, 328, + 1357, 173, 13, 14, 3441, 137, 1363, 380, 1357, 107, + 1339, 109, 26, 111, 386, 344, 2612, 466, 32, 3456, + 1340, 1048, 515, 497, 328, 518, 2206, 13, 14, 137, + 202, 448, 516, 1060, 289, 370, 1339, 3517, 515, 170, + 344, 518, 370, 2305, 515, 2595, 448, 518, 516, 377, + 514, 2594, 518, 1410, 1411, 515, 379, 515, 518, 1416, + 1087, 1418, 515, 13, 14, 518, 1423, 1424, 1425, 1426, + 2626, 515, 370, 245, 3511, 2579, 221, 515, 515, 3516, + 518, 1438, 1439, 381, 1418, 171, 1443, 515, 1445, 294, + 518, 1448, 420, 416, 422, 59, 1453, 514, 1455, 1456, + 2643, 1458, 2483, 2484, 2593, 1462, 2595, 515, 514, 1443, + 518, 1445, 514, 448, 1448, 417, 445, 223, 416, 1453, + 448, 497, 1456, 137, 1458, 454, 449, 515, 1462, 515, + 518, 152, 518, 350, 1443, 515, 1445, 460, 518, 1448, + 152, 445, 1169, 1170, 1453, 1172, 291, 1456, 152, 1458, + 454, 342, 515, 1462, 1443, 518, 1445, 188, 189, 1448, + 515, 293, 1519, 518, 1453, 2461, 2462, 1456, 466, 1458, + 2351, 2486, 1418, 1462, 2461, 2462, 2463, 152, 3231, 514, + 3233, 2461, 2457, 2458, 152, 293, 2460, 171, 2319, 402, + 381, 514, 405, 1033, 1551, 1552, 1418, 1443, 370, 1445, + 1548, 1548, 1448, 1560, 1561, 13, 14, 1453, 1548, 381, + 1456, 1568, 1458, 40, 515, 416, 1462, 518, 1575, 1548, + 1548, 1443, 354, 1445, 1548, 416, 1448, 258, 259, 515, + 515, 1453, 518, 518, 1456, 515, 1458, 515, 518, 514, + 1462, 274, 350, 1600, 416, 1548, 354, 1604, 40, 515, + 1607, 40, 518, 89, 386, 1612, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 1620, 1621, 13, 14, 439, 1625, 1626, + 3241, 60, 1621, 1630, 2345, 466, 466, 1634, 386, 293, + 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 2352, + 3149, 1648, 152, 515, 466, 2891, 518, 480, 1655, 26, + 1657, 515, 152, 515, 518, 32, 518, 515, 365, 366, + 518, 152, 1339, 13, 14, 13, 14, 106, 107, 1676, + 516, 2547, 2453, 1695, 152, 457, 13, 14, 117, 1695, + 314, 315, 316, 5, 13, 14, 350, 2612, 2842, 2889, + 354, 1698, 13, 14, 375, 376, 13, 14, 289, 457, + 13, 14, 1709, 1710, 1674, 352, 501, 502, 503, 428, + 505, 506, 507, 508, 509, 510, 13, 14, 13, 14, + 1210, 514, 386, 13, 14, 13, 14, 171, 2509, 13, + 14, 13, 14, 13, 14, 514, 175, 13, 14, 1746, + 2570, 13, 14, 13, 14, 379, 13, 14, 1755, 514, + 1757, 13, 14, 2925, 365, 366, 1755, 514, 1757, 2965, + 137, 2654, 201, 515, 2676, 418, 1443, 219, 1445, 224, + 2633, 1448, 365, 366, 262, 263, 1453, 2686, 299, 1456, + 3439, 1458, 416, 514, 3443, 1462, 224, 535, 375, 376, + 1797, 224, 540, 457, 1801, 543, 514, 1804, 1805, 459, + 460, 3047, 3451, 3452, 126, 127, 3193, 26, 1298, 3483, + 3484, 250, 296, 32, 2797, 449, 40, 2742, 1137, 1138, + 235, 260, 514, 5, 5, 514, 460, 324, 514, 514, + 514, 2612, 5, 272, 8, 274, 5, 11, 1845, 3498, + 514, 15, 16, 1841, 5, 19, 20, 21, 514, 171, + 1857, 5, 148, 9, 477, 514, 8, 1864, 1865, 11, + 301, 518, 36, 15, 16, 304, 1873, 19, 20, 21, + 514, 1548, 104, 518, 515, 40, 219, 386, 286, 166, + 514, 166, 284, 1890, 59, 514, 235, 1894, 1895, 428, + 1897, 93, 514, 428, 518, 1902, 1903, 1904, 1905, 1906, + 1907, 1908, 3411, 3149, 1911, 1912, 1913, 1914, 1915, 1916, + 1917, 1918, 1919, 1920, 59, 59, 293, 356, 137, 1926, + 1927, 428, 428, 1930, 265, 1932, 2707, 524, 108, 221, + 1937, 476, 1939, 428, 428, 152, 100, 377, 274, 198, + 274, 274, 381, 514, 40, 514, 274, 2880, 274, 152, + 1627, 171, 1959, 516, 13, 2880, 1963, 3344, 1965, 515, + 2885, 400, 1969, 402, 515, 26, 405, 3160, 515, 515, + 1977, 32, 171, 350, 1981, 515, 1983, 354, 1985, 1963, + 1987, 518, 515, 2892, 2893, 1969, 515, 514, 473, 224, + 224, 514, 314, 315, 316, 281, 514, 463, 281, 518, + 3387, 516, 2009, 2784, 1963, 516, 514, 2932, 2933, 386, + 1969, 514, 514, 2020, 2021, 514, 2737, 39, 1695, 472, + 9, 514, 514, 426, 1963, 426, 11, 352, 518, 1519, + 1969, 513, 426, 279, 521, 524, 428, 518, 514, 514, + 180, 162, 171, 791, 117, 518, 515, 221, 454, 3436, + 217, 518, 2095, 2060, 3019, 265, 226, 379, 2065, 2066, + 290, 312, 389, 312, 518, 180, 219, 1963, 390, 3275, + 518, 226, 515, 1969, 293, 514, 137, 514, 274, 3217, + 457, 295, 287, 2090, 2091, 226, 333, 466, 2095, 514, + 412, 1963, 152, 3, 416, 26, 514, 1969, 171, 152, + 514, 32, 2109, 152, 152, 2112, 476, 2114, 152, 3, + 2891, 37, 40, 289, 274, 40, 42, 291, 289, 59, + 171, 11, 1612, 2130, 2131, 40, 166, 449, 515, 515, + 2137, 350, 515, 2140, 515, 354, 514, 885, 460, 291, + 2861, 514, 180, 514, 2925, 166, 3, 39, 3, 512, + 2157, 512, 1829, 428, 476, 428, 2140, 428, 515, 428, + 513, 515, 518, 2170, 1841, 3411, 171, 386, 515, 917, + 521, 516, 514, 2157, 497, 101, 515, 13, 500, 497, + 2187, 2188, 514, 19, 515, 933, 934, 935, 936, 497, + 428, 515, 514, 155, 514, 31, 515, 2204, 514, 2206, + 515, 2140, 249, 515, 514, 473, 137, 40, 2215, 45, + 46, 518, 3137, 3138, 3414, 3127, 59, 518, 2157, 290, + 499, 290, 503, 3004, 3149, 451, 2233, 2234, 2235, 243, + 303, 59, 293, 59, 2233, 2234, 2235, 985, 457, 265, + 428, 314, 315, 316, 2140, 274, 172, 8, 514, 152, + 11, 202, 152, 177, 15, 16, 1746, 152, 19, 20, + 21, 2157, 428, 281, 281, 2272, 3047, 2310, 2140, 147, + 428, 2278, 108, 515, 514, 36, 40, 428, 202, 428, + 352, 514, 208, 161, 515, 2157, 1963, 3000, 166, 350, + 518, 287, 1969, 354, 289, 40, 152, 476, 224, 279, + 515, 171, 514, 514, 59, 185, 379, 2314, 234, 515, + 2299, 2299, 2319, 2299, 2299, 2314, 240, 515, 515, 166, + 80, 512, 515, 515, 143, 386, 515, 501, 502, 503, + 2337, 505, 506, 507, 508, 509, 510, 198, 515, 217, + 171, 524, 268, 416, 2351, 2352, 514, 300, 358, 501, + 502, 503, 2359, 505, 506, 507, 508, 509, 510, 237, + 2359, 518, 293, 289, 180, 515, 514, 3243, 3149, 515, + 294, 514, 3203, 290, 3205, 152, 449, 515, 515, 518, + 514, 175, 439, 515, 515, 3215, 516, 460, 314, 515, + 2397, 514, 514, 40, 518, 321, 457, 515, 514, 40, + 1890, 86, 454, 476, 518, 171, 514, 475, 286, 515, + 515, 198, 1902, 2397, 515, 513, 513, 295, 2095, 350, + 515, 515, 3218, 354, 3220, 518, 515, 500, 515, 460, + 2437, 289, 59, 503, 3346, 361, 2113, 3402, 515, 515, + 515, 514, 1932, 2486, 476, 204, 2453, 117, 1196, 1939, + 515, 40, 2129, 226, 380, 386, 514, 88, 2524, 191, + 221, 1209, 2469, 2140, 279, 0, 3355, 279, 2475, 2476, + 516, 516, 428, 3336, 516, 516, 2519, 516, 503, 2486, + 2157, 516, 1230, 516, 428, 515, 3411, 1977, 516, 516, + 2497, 1981, 516, 2500, 513, 2502, 420, 1987, 422, 515, + 3330, 2397, 2509, 2510, 516, 516, 2513, 2514, 516, 516, + 516, 2518, 2519, 516, 516, 516, 516, 516, 2525, 2009, + 513, 445, 516, 449, 448, 2397, 457, 2570, 454, 516, + 291, 8, 516, 2540, 11, 516, 40, 516, 15, 16, + 2538, 2538, 516, 2550, 516, 1293, 2544, 516, 2538, 516, + 516, 516, 515, 274, 1302, 514, 7, 8, 107, 2538, + 2538, 40, 13, 2570, 2538, 100, 444, 514, 19, 46, + 476, 289, 23, 514, 25, 26, 53, 9, 514, 30, + 31, 32, 351, 518, 35, 2538, 335, 38, 39, 518, + 59, 42, 514, 198, 45, 46, 515, 515, 191, 513, + 459, 91, 2609, 80, 344, 2612, 2613, 518, 2615, 514, + 2609, 515, 147, 40, 2613, 152, 2615, 516, 515, 55, + 2627, 124, 2629, 152, 75, 76, 161, 40, 515, 366, + 3411, 166, 366, 2310, 512, 40, 171, 515, 516, 515, + 514, 514, 40, 518, 454, 180, 514, 309, 514, 100, + 185, 279, 2650, 248, 190, 454, 107, 108, 109, 110, + 111, 439, 514, 3384, 2653, 2653, 102, 2653, 2653, 292, + 74, 74, 80, 9, 515, 515, 514, 368, 1033, 93, + 2678, 515, 217, 2681, 513, 59, 2729, 123, 513, 133, + 503, 272, 289, 1441, 40, 439, 514, 2704, 292, 176, + 2707, 292, 237, 514, 204, 141, 515, 515, 515, 145, + 289, 459, 289, 515, 386, 551, 193, 2724, 2725, 365, + 122, 198, 2729, 37, 451, 2732, 148, 25, 42, 36, + 365, 167, 297, 868, 170, 2596, 1763, 2228, 25, 26, + 501, 502, 503, 3245, 505, 506, 507, 508, 509, 510, + 186, 286, 2759, 3387, 289, 2609, 3340, 3488, 2548, 236, + 295, 8, 1864, 2885, 11, 2340, 2773, 3361, 15, 16, + 3466, 2778, 2779, 3120, 3415, 2818, 2783, 2784, 40, 3424, + 3459, 2788, 147, 3179, 2791, 2792, 1197, 101, 2221, 2796, + 2797, 171, 2234, 2800, 3309, 3413, 161, 2804, 60, 46, + 335, 166, 2218, 2588, 2811, 3422, 53, 2667, 2615, 2486, + 3410, 2298, 1295, 2359, 291, 3000, 2645, 1322, 2204, 1005, + 2804, 1156, 2170, 358, 1734, 2418, 1178, 114, 3396, 2319, + 1698, 3318, 3207, 80, 2187, 1179, 1733, 23, 1975, 2157, + 2732, 1181, 2519, 279, 106, 2804, 1005, 3042, 2855, 2397, + 151, 287, 217, 2445, 800, 1210, 2863, 789, 172, 2396, + 3141, 2538, 1990, 983, 981, 2804, 1873, 2544, 981, 981, + 171, 981, 237, 309, 981, 2882, 1873, 981, 981, 981, + 3322, 416, 3321, 2171, 2891, 2067, 2476, 1439, 2069, 2022, + 2113, 2110, 2493, 2570, 208, 2811, 3307, 2538, 145, 783, + 336, 1807, 1983, 1360, 1340, 1674, 37, 743, 2804, 444, + 224, 42, 2549, 175, 391, 1675, 100, -1, 2925, 454, + 234, 286, 2271, 303, -1, 1673, -1, 1675, 1234, 176, + 295, -1, 2804, -1, 314, 315, 316, 1685, 473, 201, + 475, 476, -1, 1298, -1, -1, 193, -1, -1, -1, + -1, 198, 40, -1, 268, -1, -1, -1, -1, -1, + 2967, -1, -1, 2453, -1, 2972, -1, -1, 2967, -1, + 101, -1, 60, 2650, -1, 1723, 3019, 512, -1, -1, + 515, 516, 517, -1, -1, 2983, -1, -1, 250, 236, + -1, -1, -1, 3000, -1, -1, 3003, 3004, 260, 379, + 314, 2678, -1, -1, 2681, -1, -1, 321, -1, -1, + 272, -1, 3019, 314, 315, 316, -1, -1, 106, 2509, + -1, 498, -1, 859, -1, -1, -1, -1, 505, 506, + 507, 508, 509, 510, -1, -1, 416, -1, -1, -1, + 3047, 172, 304, -1, 291, 3052, -1, 361, -1, -1, + -1, -1, 2729, -1, -1, -1, 3063, 3064, -1, -1, + 3067, -1, 3069, -1, -1, -1, 380, -1, -1, 449, + 1818, 1819, 1820, 1821, 1822, -1, -1, 208, 379, 444, + 460, -1, -1, -1, 535, -1, -1, 3094, -1, 540, + -1, -1, 543, 224, 356, -1, 476, -1, 8, -1, + 551, 11, -1, 234, -1, 15, 16, -1, -1, -1, + -1, 3118, -1, 201, -1, 416, -1, -1, -1, 381, + 500, -1, 2612, -1, -1, -1, -1, 2804, -1, -1, + -1, -1, -1, -1, 514, 449, 46, 268, 400, -1, + -1, 2818, 3149, 53, 391, -1, -1, 512, 449, -1, + -1, 516, -1, -1, -1, 177, -1, -1, 289, 460, + -1, -1, 250, -1, 1519, -1, 3173, -1, 3166, 3167, + 80, -1, 260, -1, 3173, 476, -1, -1, -1, -1, + 202, -1, 3189, 314, 272, 1033, 3193, -1, -1, -1, + 321, -1, -1, -1, -1, -1, 3203, -1, 3205, 500, + 3207, -1, -1, -1, 3211, 1953, 3213, -1, 3215, 3193, + -1, 1033, -1, 514, -1, -1, 304, 2707, 240, 3226, + -1, -1, -1, -1, 3231, 8, 3233, -1, 11, -1, + 361, -1, 15, 16, 3241, 145, 19, 20, 21, -1, + -1, -1, -1, -1, 3242, -1, 3244, 3254, -1, 380, + -1, 498, 3259, -1, -1, 3254, -1, 1612, 505, 506, + 507, 508, 509, 510, -1, -1, 176, -1, 356, -1, + -1, -1, 294, -1, -1, -1, 151, -1, -1, -1, + 177, -1, -1, 193, -1, -1, -1, 3285, 198, -1, + 741, 742, 743, 381, 2784, -1, 171, 3193, -1, -1, + -1, 3308, -1, 3301, -1, 202, 2983, 3305, -1, -1, + -1, 3318, 400, 988, 171, -1, -1, -1, 449, -1, + 1156, 3193, -1, 3330, -1, -1, 236, -1, -1, -1, + -1, 782, 783, 784, -1, -1, -1, 3344, 789, -1, + 791, -1, 3019, 240, -1, -1, -1, -1, 370, 800, + -1, -1, -1, 804, 805, 3362, -1, -1, 809, 810, + 3344, -1, 1210, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 823, 824, 825, -1, -1, -1, -1, -1, + 3387, 291, -1, -1, -1, -1, 837, 838, 1210, 840, + -1, 1746, -1, -1, -1, 3402, -1, 294, 420, -1, + 422, 2891, 853, 3387, 3411, -1, 3413, -1, 859, -1, + -1, -1, -1, -1, 3413, 198, 313, 439, -1, -1, + 871, -1, -1, 445, -1, -1, 448, -1, -1, 3436, + 3428, -1, -1, -1, 885, 2925, -1, -1, 221, 314, + 315, 316, -1, 3450, 3451, 3452, -1, -1, 3344, -1, + 1298, -1, 3436, -1, -1, -1, 3454, 314, 315, 316, + -1, -1, -1, -1, -1, -1, 917, 918, -1, -1, + 3477, -1, 3344, 370, -1, -1, 1298, -1, 929, -1, + 377, 391, 933, 934, 935, 936, -1, -1, -1, 3166, + 3167, 3387, -1, -1, 1330, 782, 1332, 784, 949, -1, + -1, -1, -1, -1, 379, -1, -1, 988, 291, -1, + -1, 3518, -1, -1, 3004, 3387, -1, -1, -1, -1, + -1, -1, 379, 420, -1, 422, -1, 814, -1, -1, + -1, 982, 983, -1, 985, 1890, -1, 988, -1, -1, + 3436, 416, 439, 994, 995, -1, -1, 1902, 445, 1000, + -1, 448, 839, 2301, -1, 1006, -1, 3047, -1, 416, + -1, -1, 1013, -1, 3436, 3242, -1, 3244, 2316, 2317, + 2318, -1, 1023, -1, 449, -1, -1, 1932, -1, 1030, + -1, -1, -1, 2331, 1939, 460, 2334, -1, 498, 1040, + -1, 2339, 449, -1, -1, 505, 506, 507, 508, 509, + 510, 476, 8, 460, -1, 11, -1, -1, 3285, 15, + 16, -1, -1, 19, 20, 21, -1, -1, -1, 476, + -1, -1, 1977, -1, 3301, 500, 1981, -1, 3305, 988, + -1, -1, 1987, -1, -1, -1, -1, -1, 1089, 514, + 46, -1, -1, 500, -1, -1, -1, 53, -1, -1, + -1, -1, -1, -1, 2009, -1, -1, 514, -1, 3149, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 193, -1, -1, -1, -1, 198, 498, -1, - -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, - 510, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 221, 222, -1, -1, -1, -1, -1, -1, -1, 8, - -1, -1, 11, -1, -1, 236, 15, 16, 17, 18, - 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 391, -1, 36, -1, -1, - -1, 40, -1, -1, -1, -1, -1, 46, -1, -1, - -1, -1, -1, 274, 53, 498, 277, -1, 501, 502, + -1, 1519, -1, -1, 80, -1, -1, 2425, 2426, 2427, + -1, 13, -1, 970, -1, -1, -1, 19, 1139, -1, + 1141, -1, -1, -1, 981, 1176, -1, 1519, -1, 31, + -1, -1, -1, -1, 1185, 1156, 1157, -1, -1, -1, + -1, -1, 1163, 45, 46, -1, -1, -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, -1, -1, - 291, -1, -1, 294, -1, -1, -1, -1, -1, -1, - -1, 80, -1, 8, -1, -1, 11, -1, -1, -1, - 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 36, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 46, -1, -1, -1, -1, -1, -1, 53, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 498, -1, -1, 501, 502, 503, -1, 505, - 506, 507, 508, 509, 510, 80, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 391, -1, 8, -1, -1, 11, -1, 176, -1, 15, - 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, - -1, -1, -1, -1, 193, -1, -1, -1, -1, 198, - 36, -1, -1, 424, -1, -1, -1, -1, -1, -1, - 46, -1, -1, -1, -1, -1, -1, 53, -1, -1, - -1, -1, 221, 222, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 236, -1, -1, - -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, - -1, 176, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 193, -1, - -1, -1, -1, 198, -1, 274, -1, 498, 277, -1, - 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, - -1, -1, 291, -1, -1, 294, 221, 222, -1, -1, - -1, -1, -1, -1, -1, 8, -1, -1, 11, -1, - -1, 236, 15, 16, 17, 18, 19, 20, 21, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 36, -1, -1, -1, -1, -1, -1, - 176, -1, -1, 46, -1, -1, -1, -1, -1, 274, - 53, -1, 277, -1, -1, -1, -1, 193, -1, -1, - -1, -1, 198, -1, -1, -1, 291, -1, -1, 294, - -1, -1, -1, -1, -1, -1, 8, 80, -1, 11, - -1, -1, -1, 15, 16, 221, 222, 19, 20, 21, - -1, -1, 391, -1, -1, -1, -1, -1, -1, -1, - 236, -1, -1, -1, 36, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 46, -1, -1, -1, -1, -1, - -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 274, -1, - -1, 277, -1, -1, -1, -1, -1, -1, 80, -1, - -1, -1, -1, -1, -1, 291, -1, -1, 294, -1, - -1, -1, -1, -1, -1, -1, 391, 8, -1, -1, - 11, -1, -1, 176, 15, 16, -1, -1, 19, 20, - 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 193, -1, -1, -1, -1, 198, -1, -1, -1, 498, - -1, -1, 501, 502, 503, 46, 505, 506, 507, 508, - 509, 510, 53, -1, -1, -1, -1, -1, 221, 222, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 236, -1, -1, -1, -1, -1, 80, - -1, -1, -1, -1, 176, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 391, -1, -1, -1, -1, - -1, 193, -1, -1, -1, -1, 198, -1, -1, -1, - -1, 274, -1, 498, 277, -1, 501, 502, 503, -1, - 505, 506, 507, 508, 509, 510, -1, -1, 291, 221, - 222, 294, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 236, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1185, 1410, 1411, -1, -1, -1, + -1, 1416, -1, 1030, -1, 1196, 1197, -1, -1, -1, + -1, 3428, -1, -1, -1, -1, -1, -1, 1209, -1, + -1, 8, -1, -1, 1612, -1, -1, -1, 15, 16, + 176, -1, 19, 20, 21, 1226, 108, 3454, -1, 1230, + -1, -1, -1, -1, 1235, -1, -1, 193, -1, -1, + 1612, -1, 198, -1, -1, -1, -1, 1033, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1096, + -1, -1, -1, -1, -1, -1, 2564, -1, -1, 1106, + -1, -1, -1, -1, -1, -1, 1185, -1, -1, -1, + 236, -1, -1, -1, -1, -1, -1, -1, -1, 1126, + 1291, -1, 1293, -1, -1, -1, -1, -1, 1135, -1, + -1, 1302, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8, 1313, -1, 11, -1, -1, -1, 15, 16, + -1, 1322, 19, 20, 21, -1, 1327, -1, 1329, 1330, + -1, 1332, 1333, -1, -1, 291, -1, -1, -1, 36, + -1, -1, -1, -1, -1, -1, -1, -1, 1746, -1, + -1, -1, -1, -1, -1, 1741, -1, 2655, -1, 1360, + -1, -1, -1, -1, -1, 1751, -1, 1753, -1, -1, + 1756, 3411, -1, -1, 1746, -1, 1762, -1, 1764, 1410, + 1411, -1, -1, -1, -1, 1416, -1, -1, -1, -1, + -1, 1777, -1, -1, -1, -1, 1782, -1, -1, -1, + 1786, 1787, 1788, 1789, -1, 1791, 1792, -1, -1, 1410, + 1411, -1, -1, -1, 2319, 1416, -1, 1418, -1, 2717, + 2718, 2719, 2720, -1, 1210, -1, -1, -1, -1, -1, + 1431, -1, 1433, 1434, -1, 391, -1, -1, -1, -1, + 1441, -1, 1443, -1, 1445, -1, -1, 1448, -1, -1, + -1, -1, 1453, 1033, -1, 1456, -1, 1458, -1, -1, + -1, 1462, -1, 1464, -1, 1466, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 176, -1, -1, -1, -1, - -1, -1, 274, -1, -1, 277, -1, -1, -1, -1, - -1, -1, 193, -1, -1, -1, -1, 198, -1, 291, - -1, -1, 498, -1, -1, 501, 502, 503, -1, 505, + -1, -1, 1890, -1, 291, -1, -1, -1, -1, -1, + -1, 1410, 1411, -1, 1902, -1, -1, 1416, -1, -1, + -1, -1, 1298, -1, -1, -1, -1, -1, 1890, 1356, + -1, -1, -1, 1360, 221, -1, -1, -1, -1, -1, + 1902, -1, -1, -1, 1932, -1, -1, -1, -1, -1, + -1, 1939, 498, -1, -1, 501, 502, 503, 2453, 505, 506, 507, 508, 509, 510, -1, -1, -1, -1, -1, - 221, 222, -1, -1, -1, -1, -1, -1, 391, -1, - -1, -1, -1, -1, -1, 236, -1, -1, -1, -1, + 1932, -1, -1, -1, -1, -1, -1, 1939, -1, -1, + -1, 2869, -1, 1574, -1, -1, -1, -1, -1, 1977, + -1, -1, -1, 1981, 1585, 8, -1, -1, 11, 1987, + -1, -1, 15, 16, 291, -1, 19, 20, 21, -1, + -1, -1, -1, -1, 2509, 1977, -1, -1, -1, 1981, + -1, 2009, -1, -1, -1, 1987, -1, -1, -1, -1, + -1, -1, -1, 1624, -1, -1, -1, -1, -1, -1, + 1210, -1, -1, -1, -1, -1, -1, 2009, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1698, -1, 551, + 1671, -1, 1673, -1, 1675, -1, -1, -1, 1903, 1904, + 1905, 1906, 1907, 1908, 1685, 1686, 1911, 1912, 1913, 1914, + 1915, 1916, 1917, 1918, 1919, 1920, -1, 1698, -1, -1, + -1, -1, -1, -1, 501, 502, 503, 2612, 505, 506, + 507, 508, 509, 510, -1, -1, -1, -1, 1298, -1, + -1, -1, 1723, -1, 1725, -1, -1, -1, -1, -1, + -1, -1, -1, 1519, -1, -1, -1, -1, -1, 1740, + 1741, -1, -1, -1, 1653, -1, -1, -1, -1, -1, + 1751, 1752, 1753, 1754, -1, 1756, -1, -1, -1, -1, + -1, 1762, -1, 1764, -1, -1, 2152, -1, -1, -1, + -1, 8, -1, -1, 11, 1776, 1777, -1, 15, 16, + 1781, 1782, 19, 20, 21, 1786, 1787, 1788, 1789, 1698, + 1791, 1792, -1, -1, -1, -1, -1, -1, 221, -1, + -1, -1, 2707, -1, 501, 502, 503, 1808, 505, 506, + 507, 508, 509, 510, -1, 1816, -1, 1818, 1819, 1820, + 1821, 1822, -1, -1, -1, -1, 1612, -1, 1665, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1839, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 277, -1, -1, -1, + -1, 1852, -1, -1, -1, -1, -1, -1, -1, -1, + 742, 743, -1, -1, -1, 2090, 2091, -1, 291, -1, + -1, 3169, 1903, 1904, 1905, 1906, 1907, 1908, -1, 2784, + 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, + -1, -1, 3190, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1903, 1904, 1905, 1906, 1907, 1908, -1, -1, + 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, + -1, 2319, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1519, + 1941, -1, -1, 2329, -1, -1, -1, 2319, -1, -1, + -1, -1, 1953, -1, 3252, -1, 1793, -1, -1, -1, + 1746, -1, 1963, -1, -1, -1, -1, -1, 1969, 1806, + 1807, -1, -1, -1, 1975, -1, -1, 859, -1, 1980, + -1, -1, -1, -1, 221, 3283, 2891, -1, 1989, 1990, + -1, 24, -1, -1, 1903, 1904, 1905, 1906, 1907, 1908, + -1, -1, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, + 1919, 1920, -1, -1, -1, -1, -1, -1, -1, -1, + 2925, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1612, -1, -1, -1, 1873, -1, -1, -1, + -1, -1, 1879, -1, -1, -1, -1, -1, 81, -1, + -1, -1, -1, -1, 291, 2453, -1, 2058, -1, 2090, + 2091, 2062, -1, -1, 97, -1, 2067, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 501, 502, + 503, 2453, 505, 506, 507, 508, 509, 510, -1, 2090, + 2091, -1, -1, -1, -1, -1, -1, -1, -1, 3004, + -1, -1, -1, -1, 1890, -1, 2107, -1, -1, -1, + -1, 2509, -1, 146, -1, -1, 1902, -1, 1000, -1, + -1, -1, -1, 156, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 168, -1, 2509, -1, 2140, + 173, 1023, 3047, -1, -1, -1, 1932, -1, -1, -1, + -1, 2152, -1, 1939, -1, -1, 2157, -1, -1, -1, + 2161, -1, -1, -1, -1, -1, 1746, -1, -1, 202, + -1, -1, -1, 2204, -1, -1, -1, -1, -1, -1, + -1, 2090, 2091, -1, -1, -1, -1, 2573, 2574, -1, + -1, 1977, -1, -1, -1, 1981, -1, 37, -1, -1, + 2201, 1987, 42, 2204, -1, -1, 2207, 1089, -1, -1, + -1, -1, 245, -1, 2612, 2601, 249, -1, -1, -1, + -1, -1, 2223, 2009, -1, -1, -1, -1, -1, -1, + 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, + 2612, -1, -1, -1, 3149, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 291, -1, -1, -1, -1, -1, -1, -1, -1, 391, + -1, 101, -1, -1, 501, 502, 503, -1, 505, 506, + 507, 508, 509, 510, 1156, 1157, -1, -1, -1, -1, + 313, -1, -1, -1, -1, -1, 319, -1, 2513, 2514, + -1, -1, -1, 2294, -1, 2204, -1, -1, -1, -1, + 2301, 334, 126, 127, -1, -1, -1, -1, -1, 2707, + 1890, 2312, -1, -1, 2315, 2316, 2317, 2318, -1, -1, + -1, -1, 1902, -1, -1, -1, -1, -1, 2329, -1, + 2331, -1, 172, 2334, 367, 2707, -1, 370, 2339, -1, + 180, -1, -1, -1, 2345, -1, -1, 171, 381, -1, + -1, 384, 1932, -1, -1, -1, -1, -1, -1, 1939, + -1, -1, -1, -1, 2365, 2366, -1, 2368, 208, 402, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 416, 224, -1, 2784, -1, -1, 422, + 423, -1, -1, -1, 234, -1, 2397, 1977, -1, -1, + 433, 1981, -1, 2240, -1, -1, 439, 1987, -1, -1, + -1, -1, 2784, -1, -1, -1, 2417, -1, -1, -1, + -1, -1, -1, -1, 2425, 2426, 2427, -1, 268, 2009, + -1, -1, -1, 466, 2435, -1, 2437, -1, 2439, -1, + -1, -1, -1, -1, 2445, -1, -1, 1329, 1330, 289, + 1332, -1, -1, -1, -1, 2292, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2310, 314, -1, 2862, 2478, -1, 2704, + -1, 321, 2513, 2514, -1, -1, -1, -1, -1, -1, + 314, 315, 316, 2891, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3411, -1, -1, -1, + -1, -1, 2513, 2514, -1, 2352, -1, -1, -1, 2891, + -1, 361, -1, -1, 2361, -1, 2363, 2925, -1, -1, + 2367, -1, 2369, 2319, -1, -1, -1, -1, -1, -1, + 380, 2542, -1, -1, -1, -1, -1, 2548, -1, -1, + -1, 1433, -1, 2925, -1, 379, -1, -1, -1, -1, + -1, -1, -1, 2564, -1, -1, 390, 2568, -1, -1, + -1, 2572, 2573, 2574, -1, -1, -1, 2578, 2579, 2580, + -1, 2582, 1464, -1, 1466, -1, -1, -1, 412, -1, + -1, -1, 416, -1, -1, -1, -1, -1, -1, -1, + 2601, 0, 2603, -1, 2513, 2514, 3004, -1, -1, 449, + -1, -1, -1, -1, 454, 2616, 2617, 2618, 2619, 2620, + 2621, 2622, 2623, 2624, 2625, 449, -1, -1, -1, -1, + -1, -1, 3004, -1, -1, -1, 460, -1, 2863, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2649, 3047, + -1, -1, 476, -1, 2655, 8, -1, -1, 11, -1, + -1, -1, 15, 16, -1, -1, 2667, 2453, -1, -1, + -1, -1, -1, 2704, -1, 3047, 500, -1, -1, -1, + -1, -1, 2683, -1, -1, -1, -1, -1, -1, -1, + 514, -1, 2693, 46, -1, -1, -1, -1, 2729, -1, + 53, 100, -1, 2704, -1, -1, -1, -1, -1, 2710, + -1, -1, -1, -1, -1, -1, 2717, 2718, 2719, 2720, + -1, -1, -1, 2509, -1, -1, -1, 80, 2729, -1, + -1, 2732, -1, -1, -1, 2736, 2737, -1, -1, 2319, + -1, -1, 2773, 3129, 2745, -1, -1, -1, 147, -1, + -1, 3149, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 161, -1, 3150, 3151, -1, 166, -1, -1, + -1, 2772, 171, -1, -1, 2612, -1, 3149, 3003, -1, + -1, 180, -1, -1, -1, -1, 185, -1, -1, -1, + 3176, -1, 145, -1, -1, 2704, -1, -1, -1, -1, + -1, 2802, -1, 2804, -1, -1, -1, -1, 2645, -1, + -1, -1, -1, -1, -1, -1, -1, 2818, 217, -1, + 2729, 2822, -1, 176, -1, -1, 2612, 2828, -1, -1, + -1, -1, 2863, -1, -1, -1, 26, -1, 237, -1, + 193, 2842, 32, 1725, -1, 198, -1, 2848, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, 1741, + 2861, 2862, 2863, -1, -1, -1, -1, -1, 2869, 1751, + 60, 1753, -1, 2453, 1756, -1, -1, -1, -1, -1, + 1762, -1, 1764, 236, -1, 2886, -1, 286, -1, -1, + 289, -1, -1, -1, -1, 1777, 295, -1, -1, -1, + 1782, -1, -1, -1, 1786, 1787, 1788, 1789, -1, 1791, + 1792, -1, -1, -1, -1, -1, 106, -1, -1, -1, + -1, 2707, -1, -1, -1, -1, -1, -1, -1, 2509, + -1, -1, -1, -1, -1, -1, 335, -1, 291, -1, + -1, -1, -1, -1, -1, -1, -1, 137, -1, -1, + -1, -1, -1, -1, 2863, -1, -1, -1, -1, 358, + -1, -1, -1, 2964, -1, -1, -1, 2968, -1, -1, + -1, 2808, 3003, -1, -1, -1, -1, 835, 836, -1, + -1, 2982, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2996, -1, -1, 2784, -1, + -1, -1, 3003, -1, -1, -1, -1, -1, -1, -1, + -1, 201, -1, 3411, -1, -1, -1, 416, 98, -1, + -1, 3407, -1, -1, -1, -1, -1, -1, 3029, -1, + -1, -1, 2612, -1, 3035, -1, -1, -1, 391, 3411, + -1, 3042, -1, -1, 902, 444, 126, 127, 906, 907, + -1, -1, -1, -1, -1, 454, -1, -1, -1, 1941, + 250, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 260, -1, -1, -1, 473, 3076, 475, 476, -1, -1, + -1, -1, 272, -1, -1, -1, 0, -1, -1, -1, + -1, 171, -1, 1975, 3003, -1, -1, 3098, 1980, -1, + -1, 959, 3103, 293, -1, 2891, -1, -1, -1, -1, + -1, -1, -1, 512, 304, -1, 515, 516, 517, -1, + 978, -1, -1, -1, -1, -1, 984, 2707, 3129, 987, + -1, -1, 990, 991, 992, 993, -1, -1, -1, 2925, + 2977, -1, -1, -1, -1, 498, -1, -1, -1, 3150, + 3151, -1, 505, 506, 507, 508, 509, 510, -1, -1, + 350, -1, -1, 3000, 354, -1, 356, -1, 3169, -1, + 3171, -1, -1, 1031, 1032, 3176, 2058, -1, -1, -1, + -1, -1, 3213, -1, -1, 2067, 100, -1, -1, 3190, + -1, 381, 3193, -1, 1052, -1, 386, -1, -1, -1, + -1, -1, -1, -1, 2784, -1, -1, -1, -1, -1, + 400, -1, 3213, 1071, 68, 69, 3217, 3218, 3004, 3220, + -1, -1, -1, -1, 1082, 1083, 1084, -1, 1086, 1087, + -1, -1, -1, 147, 314, 315, 316, -1, -1, -1, + 3, -1, 5, 3080, 3245, -1, -1, 161, -1, -1, + -1, 3252, 166, -1, -1, 109, 110, 171, -1, 113, + 114, 3047, 1120, -1, -1, -1, 180, 457, -1, -1, + 2152, 185, -1, -1, -1, -1, -1, -1, -1, 1137, + 1138, -1, 3283, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 379, + -1, -1, -1, 217, 3213, 68, 69, -1, -1, -1, + 390, 2891, 3149, 1171, -1, -1, -1, 1175, 1176, 2201, + -1, 3322, -1, 237, -1, 2207, -1, -1, 1186, 1187, + -1, -1, 412, -1, 188, 189, 416, -1, -1, -1, + -1, -1, -1, 3344, -1, 2925, 109, 110, -1, -1, + 113, 114, -1, -1, -1, -1, 436, -1, -1, -1, + -1, -1, -1, 3149, -1, -1, -1, -1, -1, 449, + 3371, -1, 286, -1, -1, 289, -1, -1, -1, -1, + 460, 295, -1, 3384, 3385, 1243, 3387, 3388, -1, -1, + -1, -1, -1, -1, 1252, 3396, 476, -1, 252, 253, + 254, 255, 256, 257, 258, 259, 3407, -1, 262, 263, + -1, -1, -1, -1, -1, -1, -1, -1, 1276, -1, + 500, 335, -1, -1, 3004, 188, 189, -1, 3429, -1, + -1, -1, -1, -1, 514, 3436, -1, -1, -1, 3276, + -1, -1, -1, -1, 358, -1, -1, 2329, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 498, -1, -1, 501, 502, - 503, -1, 505, 506, 507, 508, 509, 510, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 391, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 498, -1, -1, 501, - 502, 503, -1, 505, 506, 507, 508, 509, 510, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3047, -1, -1, + -1, -1, 3473, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3488, -1, 252, + 253, 254, 255, 256, 257, 258, 259, -1, -1, 262, + 263, -1, 416, -1, -1, 1363, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 375, 376, -1, -1, -1, -1, -1, -1, -1, + 444, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 454, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2435, -1, -1, -1, 2439, -1, 473, + -1, 475, 476, 2445, -1, 1423, -1, 1425, 1426, 3149, + -1, -1, -1, -1, 3411, -1, -1, -1, -1, -1, + 1438, 1439, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1455, 512, -1, + -1, 515, 516, 517, -1, -1, -1, -1, -1, -1, + -1, -1, 375, 376, -1, -1, 470, 471, -1, -1, + -1, 8, -1, -1, 11, 3411, -1, -1, 15, 16, + 17, 18, 19, 20, 21, -1, -1, -1, -1, -1, + 494, 495, -1, -1, -1, -1, -1, -1, -1, 36, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, + 514, -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2568, -1, -1, -1, + 2572, 2573, 2574, 80, -1, -1, -1, -1, -1, -1, + -1, -1, 1560, -1, -1, -1, -1, 470, 471, -1, + 1568, -1, -1, -1, -1, -1, -1, -1, -1, 2601, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 494, 495, -1, 2616, 2617, 2618, 2619, 2620, 2621, + 2622, 2623, 2624, 2625, -1, -1, -1, -1, -1, 1607, + -1, -1, -1, -1, -1, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 1620, -1, -1, -1, -1, 1625, 1626, -1, + -1, -1, 1630, -1, -1, -1, 1634, -1, -1, 1637, + 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, -1, 176, + 1648, -1, -1, -1, -1, -1, -1, 1655, -1, 1657, + -1, -1, -1, -1, -1, -1, 193, -1, -1, -1, + -1, 198, -1, -1, -1, -1, -1, -1, 1676, -1, + -1, -1, -1, -1, -1, 0, -1, -1, 2710, -1, + -1, 3411, -1, -1, 221, 222, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 22, -1, 236, + -1, 1709, 1710, -1, 2736, -1, -1, 32, -1, 34, + 35, 8, -1, -1, 11, -1, -1, -1, 15, 16, + -1, -1, 47, -1, -1, -1, -1, 52, -1, -1, + -1, -1, -1, -1, -1, -1, 61, 274, -1, -1, + 277, -1, -1, -1, -1, -1, -1, -1, -1, 46, + 75, -1, -1, -1, 291, -1, 53, 294, -1, 84, + -1, 86, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 98, -1, 100, -1, -1, -1, -1, + -1, -1, -1, 80, -1, -1, 111, -1, -1, 1797, + -1, -1, -1, 1801, -1, -1, 1804, 1805, -1, -1, + -1, 126, 127, 128, -1, -1, -1, -1, -1, -1, + -1, -1, 137, -1, -1, -1, -1, -1, 143, -1, + -1, -1, -1, -1, -1, -1, 151, -1, 153, 154, + 2862, -1, -1, -1, -1, -1, -1, 1845, -1, -1, + -1, -1, 167, -1, -1, -1, 171, -1, 145, -1, + -1, -1, -1, -1, 391, -1, 1864, 1865, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 197, -1, -1, -1, -1, -1, -1, 176, + -1, -1, -1, -1, -1, -1, 1894, 1895, 213, 1897, + -1, -1, -1, -1, -1, 8, 193, -1, 11, -1, + -1, 198, 15, 16, 17, 18, 19, 20, 21, -1, + -1, -1, -1, -1, 239, -1, -1, -1, 1926, 1927, + -1, -1, 1930, 36, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 46, -1, -1, -1, -1, -1, 236, + 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1959, -1, -1, -1, -1, -1, 1965, -1, -1, + -1, 498, -1, -1, 501, 502, 503, 80, 505, 506, + 507, 508, 509, 510, -1, 1983, -1, 1985, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 524, -1, 314, + 315, 316, -1, -1, 291, -1, -1, 322, -1, -1, + 325, -1, -1, 3035, -1, -1, 988, -1, -1, -1, + 3042, -1, -1, 2021, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, + -1, -1, -1, -1, -1, -1, -1, -1, 363, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2060, -1, 379, 24, -1, 2065, 2066, -1, + -1, 386, -1, 176, -1, 390, 3098, -1, -1, -1, + -1, 3103, -1, -1, -1, 400, -1, -1, -1, -1, + 193, -1, -1, -1, -1, 198, -1, 412, -1, -1, + -1, 416, -1, -1, 391, -1, -1, 3129, -1, -1, + -1, 2109, -1, -1, 2112, -1, 2114, -1, 221, 222, + -1, 436, 81, -1, -1, -1, -1, -1, 3150, 3151, + -1, -1, 2130, 236, 449, 1107, -1, 452, 97, -1, + 455, -1, -1, -1, -1, 460, -1, -1, -1, -1, + -1, -1, -1, -1, 3176, -1, -1, -1, -1, -1, + -1, 476, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 274, 2170, -1, 277, -1, -1, -1, -1, -1, + 1152, -1, -1, -1, -1, 500, -1, 146, 291, 2187, + 2188, 294, -1, -1, -1, 3217, -1, 156, -1, 514, + -1, -1, 517, -1, -1, -1, -1, -1, 2206, 168, + -1, 498, -1, 1185, 173, -1, -1, 2215, 505, 506, + 507, 508, 509, 510, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 3, -1, 5, -1, -1, -1, 498, -1, -1, - 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 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, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 397, 398, 399, 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, 426, 427, 428, 429, 430, 431, - 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, 458, 459, 460, 461, - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, 202, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8, -1, -1, 11, -1, + -1, -1, 15, 16, -1, 1237, 19, 20, 21, -1, + -1, -1, -1, -1, 2272, -1, -1, -1, -1, -1, + 2278, -1, -1, -1, -1, -1, 245, -1, 391, -1, + 249, -1, -1, 46, -1, -1, -1, -1, -1, -1, + 53, -1, -1, -1, -1, -1, -1, 1279, -1, -1, + -1, -1, -1, -1, 1286, -1, 3, -1, -1, -1, + -1, 8, -1, -1, 11, -1, -1, 80, 15, 16, + 17, 18, 19, 20, 21, -1, -1, -1, -1, 2337, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, + -1, -1, -1, 40, -1, -1, -1, -1, -1, 46, + 319, -1, -1, -1, 1336, -1, 53, -1, -1, -1, + -1, -1, -1, -1, -1, 334, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3407, -1, -1, -1, 1361, + -1, -1, -1, 80, -1, 498, -1, -1, 501, 502, + 503, -1, 505, 506, 507, 508, 509, 510, 367, -1, + -1, 370, -1, -1, -1, 518, -1, -1, -1, -1, + -1, -1, 381, 176, -1, 384, -1, -1, -1, -1, + -1, -1, -1, -1, 1406, -1, 1408, -1, 1410, 1411, + 193, 1413, -1, 402, 1416, 198, -1, 1419, -1, -1, + 1422, -1, -1, -1, -1, 1427, -1, 416, 1430, -1, + -1, -1, -1, -1, 423, -1, -1, -1, 221, 222, + -1, 2469, -1, -1, 433, -1, -1, 2475, 2476, -1, + 439, -1, -1, 236, -1, -1, -1, -1, 2486, 176, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2497, + 1472, -1, 2500, -1, 2502, -1, 193, 466, -1, -1, + -1, 198, 2510, -1, -1, -1, -1, -1, -1, -1, + 2518, 2519, -1, -1, 277, -1, -1, 2525, -1, -1, + -1, -1, -1, -1, 221, 222, -1, -1, 291, -1, + -1, -1, 2540, -1, -1, -1, -1, -1, -1, 236, + -1, -1, 2550, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 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, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, - 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 397, 398, 399, 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, 426, - 427, 428, 429, 430, 431, 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, 458, 459, 460, 461, 462, 463, 464, 465, 466, - 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2570, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1556, -1, -1, 274, -1, -1, + 277, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1572, -1, -1, -1, 291, -1, -1, 294, -1, -1, + 1582, 1583, 1584, -1, -1, -1, 1588, -1, -1, -1, + 1592, -1, -1, -1, -1, -1, -1, -1, -1, 2627, + -1, 2629, -1, -1, -1, -1, -1, -1, 391, -1, + 8, -1, -1, 11, -1, -1, -1, 15, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 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, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 397, 398, 399, 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, 426, 427, 428, 429, 430, 431, - 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, 458, 459, 460, 461, - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, + -1, 11, -1, -1, -1, 15, 16, -1, 46, -1, + -1, -1, 1654, -1, -1, 53, -1, 8, -1, -1, + 11, -1, -1, -1, 15, 16, 17, 18, 19, 20, + 21, -1, -1, -1, 391, -1, 46, -1, -1, -1, + -1, -1, 80, 53, -1, 36, -1, -1, -1, 40, + 1692, -1, -1, -1, -1, 46, 2724, 2725, -1, -1, + -1, -1, 53, -1, -1, -1, 1708, -1, -1, -1, + 80, 1713, -1, -1, -1, 498, -1, -1, 501, 502, + 503, -1, 505, 506, 507, 508, 509, 510, 1730, 80, + -1, 2759, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2773, -1, 145, -1, -1, + 2778, 2779, -1, -1, -1, 2783, -1, -1, -1, -1, + 2788, -1, -1, 2791, 2792, -1, -1, -1, 2796, 2797, + -1, -1, 2800, -1, -1, 145, -1, -1, 176, -1, + -1, 498, -1, 2811, 501, 502, 503, -1, 505, 506, + 507, 508, 509, 510, -1, 193, -1, -1, -1, -1, + 198, -1, -1, -1, -1, -1, 176, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 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, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, - 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 397, 398, 399, 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, 426, - 427, 428, 429, 430, 431, 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, 458, 459, 460, 461, 462, 463, 464, 465, 466, - 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 193, -1, 176, -1, 2855, 198, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 236, -1, + -1, -1, 193, -1, -1, -1, -1, 198, -1, -1, + -1, -1, -1, -1, 2882, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 236, -1, -1, -1, + 221, 222, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 236, -1, -1, -1, -1, + 1892, -1, -1, 291, -1, -1, -1, -1, 1900, 1901, + -1, 1903, 1904, 1905, 1906, 1907, 1908, -1, -1, 1911, + 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, + -1, 291, -1, 274, -1, -1, 277, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 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, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 397, 398, 399, 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, 426, 427, 428, 429, 430, 431, - 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, 458, 459, 460, 461, - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + 291, -1, -1, 294, 2972, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, + -1, 11, -1, -1, -1, 15, 16, 17, 18, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, + -1, 3019, -1, 391, -1, -1, 46, -1, -1, -1, + -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - 37, -1, -1, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, - 277, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, 289, -1, 291, 292, 293, -1, -1, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 391, 2024, -1, 3052, 2027, -1, -1, -1, -1, + 80, -1, -1, -1, -1, 3063, 3064, -1, -1, 3067, + 391, 3069, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3094, -1, -1, -1, + -1, 2073, -1, -1, -1, 2077, 2078, 2079, 2080, 2081, + 2082, 2083, 2084, -1, -1, -1, -1, -1, 2090, 2091, + 3118, 2093, 2094, -1, -1, -1, -1, -1, -1, -1, + 498, -1, -1, 2105, -1, -1, 2108, 505, 506, 507, + 508, 509, 510, -1, 2116, 2117, 2118, 2119, 2120, 2121, + 2122, 2123, 2124, 2125, -1, -1, 176, -1, 498, -1, + -1, -1, -1, -1, -1, 505, 506, 507, 508, 509, + 510, -1, -1, 193, -1, -1, -1, 498, 198, 2151, + 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, + -1, 3189, -1, -1, 515, -1, -1, -1, -1, -1, + -1, 221, 222, -1, -1, -1, -1, -1, -1, 3207, + -1, -1, -1, 3211, -1, -1, 236, 3215, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3226, -1, + -1, -1, 2204, 3231, -1, 3233, -1, -1, -1, -1, + -1, -1, -1, 3241, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 274, -1, -1, 277, -1, -1, + -1, 3259, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 291, -1, -1, 294, -1, -1, -1, 8, -1, + -1, 11, -1, -1, -1, 15, 16, 17, 18, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2273, -1, -1, -1, -1, 36, -1, -1, -1, + 3308, 2283, 2284, -1, -1, -1, 46, -1, -1, -1, + 3318, -1, -1, 53, -1, -1, -1, -1, -1, -1, + -1, -1, 3330, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3362, -1, -1, -1, -1, -1, + -1, 391, -1, -1, -1, -1, 2348, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2372, 2373, 2374, -1, -1, 2377, 2378, 2379, 2380, 2381, + 2382, -1, -1, -1, 2386, 2387, 2388, 2389, 2390, 2391, + 2392, 2393, 2394, 2395, -1, -1, -1, -1, 2400, 2401, + -1, -1, 8, -1, -1, 11, -1, -1, -1, 15, + 16, 17, 18, 19, 20, 21, 176, -1, -1, -1, + -1, -1, 3450, 3451, 3452, -1, 2428, -1, -1, -1, + 36, -1, 2434, 193, -1, -1, -1, -1, 198, -1, + 46, -1, -1, -1, -1, -1, -1, 53, 498, 3477, + -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, + 510, 221, 222, -1, -1, 515, 2468, -1, -1, -1, + -1, -1, -1, -1, 80, -1, 236, -1, -1, -1, + -1, -1, -1, -1, -1, 2487, -1, -1, 2490, 2491, + 3518, -1, -1, -1, -1, -1, 2498, 2499, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2512, 2513, 2514, 2515, 274, 2517, -1, 277, -1, 2521, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 291, -1, -1, 294, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 176, -1, -1, 2575, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 193, -1, -1, + -1, 8, 198, -1, 11, -1, -1, -1, 15, 16, + 17, 18, 19, 20, 21, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 221, 222, -1, -1, 36, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, + 236, 391, -1, -1, -1, -1, 53, -1, -1, -1, + -1, 8, -1, -1, 11, -1, -1, -1, 15, 16, + 17, 18, 19, 20, 21, -1, -1, -1, -1, -1, + -1, -1, -1, 80, -1, -1, -1, -1, 274, 36, + -1, 277, -1, -1, -1, -1, -1, -1, -1, 46, + 2682, -1, -1, -1, -1, 291, 53, 26, 294, -1, + -1, -1, -1, 32, -1, -1, -1, -1, -1, -1, + -1, 40, 2704, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 80, -1, -1, -1, -1, -1, -1, + -1, 60, -1, 8, -1, -1, 11, -1, -1, -1, + 15, 16, 17, 18, 19, 20, 21, -1, 498, -1, + -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, + 510, 36, -1, -1, -1, 515, -1, -1, 2760, 176, + 2762, 46, -1, -1, -1, -1, 2768, 106, 53, -1, + -1, -1, -1, -1, -1, 2777, 193, -1, 2780, -1, + 2782, 198, -1, -1, 2786, 391, -1, 2789, 2790, -1, + -1, 2793, 2794, -1, -1, 80, -1, -1, 137, 2801, + -1, -1, -1, -1, 221, 222, -1, -1, 2810, 176, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 236, + -1, -1, -1, 2825, -1, -1, 193, -1, -1, -1, + -1, 198, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 221, 222, -1, 274, -1, -1, + 277, 2863, 201, -1, -1, -1, -1, -1, -1, 236, + -1, -1, -1, -1, 291, -1, -1, 294, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 176, 498, -1, -1, 501, 502, 503, -1, 505, + 506, 507, 508, 509, 510, -1, -1, 274, 193, 515, + 277, 250, -1, 198, -1, -1, -1, -1, -1, -1, + -1, 260, -1, -1, 291, -1, -1, 294, -1, -1, + -1, -1, -1, 272, -1, -1, 221, 222, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 236, -1, -1, 293, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 304, -1, -1, -1, -1, + -1, -1, -1, -1, 391, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 274, + 68, 69, 277, -1, -1, -1, -1, -1, -1, -1, + 3002, 3003, -1, -1, -1, -1, 291, -1, -1, 294, + -1, 350, -1, -1, -1, 354, -1, 356, -1, -1, + -1, -1, -1, -1, 391, 3027, 3028, -1, -1, -1, + -1, 109, 110, -1, -1, 113, 114, -1, -1, -1, + -1, -1, 381, -1, -1, -1, -1, 386, -1, 3051, + -1, -1, -1, 3055, -1, 3057, 3058, 3059, -1, -1, + 3062, 400, -1, 3065, 3066, -1, -1, -1, -1, -1, + -1, -1, 3074, -1, -1, -1, -1, -1, -1, -1, + -1, 498, -1, -1, 501, 502, 503, -1, 505, 506, + 507, 508, 509, 510, -1, -1, -1, -1, 515, -1, + -1, -1, -1, -1, -1, -1, 391, -1, -1, -1, + 188, 189, -1, 3115, -1, -1, -1, -1, 457, 3121, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 498, 3134, -1, 501, 502, 503, -1, 505, 506, + 507, 508, 509, 510, -1, -1, -1, -1, 515, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3168, -1, -1, -1, + -1, -1, -1, -1, 252, 253, 254, 255, 256, 257, + 258, 259, -1, -1, 262, 263, -1, -1, -1, -1, + -1, -1, -1, 3195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 498, -1, -1, 501, 502, 503, -1, + 505, 506, 507, 508, 509, 510, 3228, 3229, 3230, -1, + 515, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3248, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3260, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 375, 376, -1, + -1, -1, -1, -1, 3306, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3323, -1, -1, -1, -1, -1, -1, -1, -1, + 3332, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3357, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3383, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 470, 471, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3, 4, 5, + 6, 7, 8, 9, 10, -1, 494, 495, -1, -1, + -1, -1, -1, -1, 3426, -1, 22, 23, 24, 25, + 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, + -1, -1, -1, 39, -1, -1, 42, 43, 44, -1, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 3480, 75, + 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, + 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, + -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, + 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, + 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, + -1, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, + -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, -1, -1, 233, 234, 235, + 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, + 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, + -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, + 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, + 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, + 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, + 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, + 506, 507, -1, -1, -1, -1, 512, -1, 514, -1, + -1, -1, -1, 519, 520, -1, 522, 523, 524, 3, + 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, 39, -1, -1, 42, 43, + 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, + 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, + -1, 505, 506, 507, -1, -1, -1, -1, 512, -1, + 514, -1, -1, -1, -1, 519, 520, -1, 522, 523, + 524, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, 34, 35, -1, 37, -1, -1, -1, -1, + 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, + 112, 113, 114, 115, 116, 117, 118, -1, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, + 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, + 162, 163, 164, 165, -1, 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, @@ -16460,57 +12608,268 @@ static const yytype_int16 yycheck[] = 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, -1, 275, 276, 277, 278, -1, 280, 281, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, 321, + 312, 313, 314, 315, 316, -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, 380, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, + 372, 373, 374, 375, 376, 377, 378, 379, -1, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, + 412, -1, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, -1, -1, 446, 447, 448, 449, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, + -1, -1, 474, -1, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + 492, 493, 494, 495, 496, 497, 498, -1, 500, -1, + -1, -1, -1, 505, 506, 507, -1, -1, -1, -1, + 512, -1, 514, 515, -1, -1, -1, 519, 520, -1, + 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, + 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, + -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, + 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, -1, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, + 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, + 171, 172, 173, 174, 175, 176, 177, -1, 179, -1, + 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, + 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, + 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, + 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, + 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, -1, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, -1, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, -1, -1, 446, 447, 448, 449, 450, + 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, + 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, + 471, -1, -1, 474, -1, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, -1, 500, + -1, -1, -1, -1, 505, 506, 507, -1, -1, -1, + -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, + -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, + 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, + -1, 31, 32, 33, -1, -1, -1, -1, -1, 39, + -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, + -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, + -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, -1, + 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, + 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, + 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, + 170, 171, 172, 173, 174, 175, 176, 177, -1, 179, + -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, + 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, + -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, + 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, + 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, + -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, -1, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, -1, -1, 446, 447, 448, 449, + 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, + 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, + 470, 471, -1, -1, 474, -1, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, -1, + 500, -1, -1, -1, -1, 505, 506, 507, -1, -1, + -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, + 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, + 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, -1, -1, -1, 37, -1, + 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, 132, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + -1, -1, -1, -1, -1, -1, 505, 506, 507, -1, + -1, -1, -1, 512, -1, 514, 515, -1, -1, -1, + 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, + -1, 9, 10, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, + 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, + -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, + 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, + 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, + 118, -1, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, + 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, + -1, 169, 170, 171, 172, 173, 174, 175, 176, 177, + -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, + 218, -1, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, -1, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, + 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, -1, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, -1, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, -1, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, + -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, + 448, 449, 450, 451, 452, 453, -1, 455, 456, 457, + 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, + 468, 469, 470, 471, -1, -1, 474, -1, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + -1, -1, 500, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, + -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, + 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, 42, 43, 44, -1, 46, + -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, 66, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, + 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, + 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, + 227, 228, 229, 230, -1, 232, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, - 277, 278, -1, 280, 281, 282, 283, 284, 285, -1, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, @@ -16525,29 +12884,240 @@ static const yytype_int16 yycheck[] = 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, + 427, -1, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + 497, 498, -1, -1, -1, -1, -1, -1, 505, 506, + 507, -1, -1, -1, -1, 512, -1, 514, -1, -1, + -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, + 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, + 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, + -1, 37, -1, 39, -1, -1, 42, 43, 44, -1, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, + 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, + 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, + -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, + 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, + 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, + -1, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, + -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, -1, -1, 233, 234, 235, + 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, -1, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, + -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, + 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, + 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, + 506, 507, -1, -1, -1, -1, 512, -1, 514, -1, + -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, + 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, + 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, + -1, -1, 37, -1, 39, -1, -1, 42, 43, 44, + -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, + 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, + 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, -1, 120, 121, 122, 123, 124, + 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, + 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, + 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, + 165, -1, 167, -1, 169, 170, -1, 172, 173, 174, + 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, + -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, + 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, -1, -1, 233, 234, + 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, + -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, + -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, -1, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, + 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, + 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, + 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, + -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, + 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, + 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, + -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, + 505, 506, 507, -1, -1, -1, -1, 512, -1, 514, + 515, -1, -1, -1, 519, 520, -1, 522, 523, 3, + 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + -1, -1, -1, -1, 38, 39, -1, -1, 42, 43, + 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, + 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, + -1, 505, 506, 507, -1, -1, -1, -1, 512, -1, + 514, -1, -1, -1, -1, 519, 520, -1, 522, 523, + 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, + 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, + 33, -1, -1, -1, 37, -1, 39, -1, -1, 42, + 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, + 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, + -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, + -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, + 163, 164, 165, -1, 167, -1, 169, 170, -1, 172, + 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, + 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, + 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, -1, -1, + 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, + 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, + 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, + 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, -1, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, + 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, + -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, + 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, + 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, + 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, + -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, -1, -1, -1, -1, + -1, -1, 505, 506, 507, -1, -1, -1, -1, 512, + -1, 514, 515, -1, -1, -1, 519, 520, -1, 522, + 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, + 32, 33, -1, -1, -1, 37, -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, + 112, 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, + 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, @@ -16559,7 +13129,7 @@ static const yytype_int16 yycheck[] = 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, -1, 275, 276, 277, 278, -1, 280, 281, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, @@ -16569,664 +13139,2677 @@ static const yytype_int16 yycheck[] = 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, + 372, 373, 374, 375, 376, 377, 378, -1, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + 492, 493, 494, 495, 496, 497, 498, -1, -1, -1, + -1, -1, -1, 505, 506, 507, -1, -1, -1, -1, + 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, + 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, + -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, + 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, -1, 120, + 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, + 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, + 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, + -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, + 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, + 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, + 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, + 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, + 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, + 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, + 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, + 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, + 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, + 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, + 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, -1, -1, + -1, -1, -1, -1, 505, 506, 507, -1, -1, -1, + -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, + -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, + 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, -1, -1, -1, -1, -1, 39, + -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, + -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, + -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, -1, + 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, + 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, + 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, + -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, + 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, + -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, + 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, + 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, + -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, + -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, + 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, + 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, + 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, + 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, -1, + -1, -1, -1, -1, -1, 505, 506, 507, -1, -1, + -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, + 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, + 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, 171, 172, 173, 174, 175, 176, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + -1, -1, -1, -1, -1, -1, 505, 506, 507, -1, + -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, + 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, + 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, + 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, + -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, + 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, + 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, + 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, + 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, + -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, + 218, -1, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, + 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, + 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, + 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, + -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, + 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, + 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, + 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, -1, -1, -1, -1, -1, -1, 505, 506, 507, + -1, -1, -1, -1, 512, -1, 514, 515, -1, -1, + -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, + 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, -1, -1, 82, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, + -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, + 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, + 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, + 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, 168, 169, -1, -1, -1, 173, 174, 175, -1, + 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, + 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 334, -1, 336, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, + 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, + 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, 445, 446, + 407, 408, 409, 410, 411, -1, -1, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, + 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, + 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + 497, 498, -1, -1, -1, -1, -1, -1, 505, 506, + 507, -1, -1, -1, -1, 512, -1, 514, -1, -1, + -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, + 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, + 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, + -1, -1, -1, 39, -1, -1, 42, 43, 44, -1, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, + 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, + 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, + -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, + 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, + 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, + -1, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, + -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, -1, -1, 233, 234, 235, + 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, + 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, + -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, + 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, + 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, + 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, + 466, 467, 468, 469, 470, 471, -1, 473, 474, -1, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, + 506, 507, -1, -1, -1, -1, 512, -1, 514, -1, + -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, + 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, + -1, -1, -1, -1, 39, -1, -1, 42, 43, 44, + -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, + 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, + 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, -1, 120, 121, 122, 123, 124, + 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, + 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, + 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, + 165, -1, 167, -1, 169, 170, -1, 172, 173, 174, + 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, + -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, + 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, -1, -1, 233, 234, + 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, + -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, + -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, + 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, + 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, + 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, + 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, + -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, + 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, + 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, + -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, + 505, 506, 507, -1, -1, -1, -1, 512, -1, 514, + -1, -1, -1, -1, 519, 520, -1, 522, 523, 3, + 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, 39, -1, -1, 42, 43, + 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, + 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, + -1, 505, 506, 507, -1, -1, -1, -1, 512, -1, + 514, -1, -1, -1, -1, 519, 520, -1, 522, 523, + 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, + 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, + 33, -1, -1, -1, -1, -1, 39, -1, -1, 42, + 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, + 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, + -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, + -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, + 163, 164, 165, -1, 167, -1, 169, 170, -1, 172, + 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, + 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, + 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, -1, -1, + 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, + 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, + 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, + 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, + 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, + 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, + -1, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, + 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, + 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, + -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, -1, -1, -1, -1, + -1, -1, 505, 506, 507, -1, -1, -1, -1, 512, + -1, 514, -1, -1, -1, -1, 519, 520, -1, 522, + 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, -1, -1, + 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, + 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, + -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, + 112, 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, 168, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, + 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, + 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, 236, -1, 238, 239, 240, 241, + 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, + 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, + -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, + 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 312, 313, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, + 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, + 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, + -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, 445, 446, 447, 448, -1, 450, 451, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, + -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + 492, 493, 494, 495, 496, 497, 498, -1, -1, -1, + -1, -1, -1, 505, 506, 507, -1, -1, -1, -1, + 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, + 522, 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, + 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, + -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, + 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, -1, 120, + 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, + 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, + 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, + -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, + 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, + 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, + 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, + 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, + 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, + 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, + 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, + 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, + 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, + 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, + 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, -1, -1, + -1, -1, -1, -1, 505, 506, 507, -1, -1, -1, + -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, + -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, + 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, + -1, 31, 32, 33, -1, -1, -1, -1, -1, 39, + -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, + -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, + -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, -1, + 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, + 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, + 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, + -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, + 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, + -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, + 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, + 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, + -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, + -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, + 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, + 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, + 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, + 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, -1, + -1, -1, -1, -1, -1, 505, 506, 507, -1, -1, + -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, + 520, -1, 522, 523, 3, 4, 5, 6, 7, 8, + 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + -1, -1, -1, -1, -1, -1, 505, 506, 507, -1, + -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, + 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, + 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, + 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, + -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, + 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, + 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, + 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, + 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, + -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, + 218, -1, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, + 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, + 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, + 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, + -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, + 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, + 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, + 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, -1, -1, -1, -1, -1, -1, 505, 506, 507, + -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, + -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, + 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, 34, 35, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, + 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, + -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, + 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, + 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, + 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, + 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, + 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, + 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, + 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, + 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, + 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, + 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, + 497, 498, -1, -1, -1, -1, -1, -1, 505, 506, + 507, -1, -1, -1, -1, 512, -1, 514, -1, -1, + -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, + 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, + 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, + -1, -1, -1, 39, -1, -1, 42, 43, 44, -1, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, + 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, + 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, + -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, + 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, + 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, + -1, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, + -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, -1, 218, -1, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, -1, -1, 233, 234, 235, + 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, + 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, + -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, + 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, + 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, + 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, + 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, -1, -1, -1, -1, -1, -1, 505, + 506, 507, -1, -1, -1, -1, 512, -1, 514, -1, + -1, -1, -1, 519, 520, -1, 522, 523, 3, 4, + 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, + 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, + -1, -1, -1, -1, 39, -1, -1, 42, 43, 44, + -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, + 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, + 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, -1, 120, 121, 122, 123, 124, + 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, + 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, + 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, + 165, -1, 167, -1, 169, 170, -1, 172, 173, 174, + 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, + -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, + 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, -1, -1, 233, 234, + 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, -1, 287, 288, -1, -1, 291, 292, 293, -1, + -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, + -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, + 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, + 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, + 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, + 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, + -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, + 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, + 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, + -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, -1, -1, -1, -1, -1, -1, + 505, 506, 507, -1, -1, -1, -1, 512, -1, 514, + -1, -1, -1, -1, 519, 520, -1, 522, 523, 3, + 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, 39, -1, -1, 42, 43, + 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, + 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, -1, -1, -1, -1, -1, + -1, 505, 506, 507, -1, -1, -1, -1, 512, -1, + 514, -1, -1, -1, -1, 519, 520, -1, 522, 523, + 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, + 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, + 33, -1, -1, -1, -1, -1, 39, -1, -1, 42, + 43, 44, -1, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, -1, 75, 76, 77, 78, 79, -1, 81, -1, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, + 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, + -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, + -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, -1, 162, + 163, 164, 165, -1, 167, -1, 169, 170, -1, 172, + 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, + 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, + 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, -1, 218, -1, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, -1, -1, + 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, -1, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, + 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, + 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, + 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, + 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, + 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, + -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, + 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, + 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, + 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, + -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, -1, -1, -1, -1, -1, + -1, -1, 505, 506, -1, -1, -1, -1, -1, 512, + -1, 514, -1, -1, -1, -1, 519, 520, -1, 522, + 523, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, + 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, + 32, 33, -1, -1, -1, -1, -1, 39, -1, -1, + 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, + -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, + 112, 113, 114, 115, 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, + 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, + 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, + 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, + 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, + -1, 223, 224, 225, 226, 227, 228, 229, 230, -1, + -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, -1, 275, 276, -1, 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, + 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, + 312, 313, -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, + 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, + 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, + -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, + -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + 492, 493, 494, 495, 496, 497, 498, -1, -1, -1, + -1, -1, -1, 505, 506, 507, -1, -1, -1, -1, + 512, -1, 514, -1, -1, -1, -1, 519, 520, -1, + 522, 523, 3, 4, 5, 6, 7, -1, 9, 10, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, + 31, 32, 33, -1, -1, -1, -1, -1, 39, -1, + -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, + 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, + 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, + 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, + 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, + -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, + 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, + 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, -1, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, + 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, + 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, + 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, + 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, + 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, -1, -1, 414, 415, -1, 417, 418, 419, 420, + 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, + 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, + 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, + 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, -1, -1, -1, + -1, -1, -1, -1, 505, 506, -1, -1, -1, -1, + -1, 512, -1, 514, -1, -1, -1, -1, 519, 520, + -1, 522, 523, 3, 4, 5, 6, 7, 8, 9, + 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, + -1, 31, 32, 33, -1, -1, -1, -1, -1, 39, + -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, + -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, + -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, + 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, + 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, + 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, + -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, + 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, + 220, -1, 222, 223, 224, 225, 226, 227, 228, 229, + 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, -1, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, -1, 287, 288, -1, + -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, + 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, + 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, + -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, + -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, + 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, + 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, + 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, + 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, -1, -1, + -1, -1, -1, -1, -1, 505, 506, -1, -1, -1, + -1, -1, 512, -1, 514, -1, -1, -1, -1, 519, + 520, -1, 522, 523, 3, 4, 5, 6, 7, -1, + 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + 39, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, + 179, 180, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 512, -1, 514, -1, -1, -1, -1, + 519, 520, -1, 522, 523, 3, 4, 5, 6, 7, + -1, 9, 10, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, + 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, + -1, 39, -1, -1, 42, 43, 44, -1, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, + 78, 79, -1, 81, -1, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, -1, 94, 95, 96, 97, + 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, + 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, + 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, + 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, -1, 162, 163, 164, 165, -1, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, + -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, -1, + 218, -1, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, -1, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, -1, 287, + 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, + 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, + 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, + -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, + 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, + 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, + 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 512, -1, 514, -1, -1, -1, + -1, 519, 520, -1, 522, 523, 3, 4, 5, 6, + 7, -1, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, + -1, -1, 39, -1, -1, 42, 43, 44, -1, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, + 77, 78, 79, -1, 81, -1, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, + 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, + 157, 158, 159, 160, -1, 162, 163, 164, 165, -1, + 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, 290, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, + 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, + 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, + 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, + 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, + 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, + 427, -1, -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, + 457, 458, 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, + 497, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 512, -1, 514, -1, -1, + -1, -1, 519, 520, -1, 522, 523, 3, 4, 5, + 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, + 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, + -1, -1, -1, 39, -1, -1, 42, 43, 44, -1, + 46, 47, 48, 49, 50, 51, 52, -1, 54, 55, + 56, 57, -1, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, + 76, 77, 78, 79, -1, 81, -1, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, -1, 94, 95, + 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, -1, 120, 121, 122, 123, 124, 125, + -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, + 136, 137, 138, -1, 140, 141, 142, -1, 144, -1, + 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, -1, 162, 163, 164, 165, + -1, 167, -1, 169, 170, -1, 172, 173, 174, 175, + -1, 177, -1, 179, -1, 181, 182, 183, 184, -1, + 186, 187, 188, 189, 190, 191, 192, -1, 194, 195, + 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, + -1, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, -1, 218, -1, 220, -1, -1, 223, 224, 225, + 226, 227, 228, 229, 230, -1, -1, 233, 234, 235, + -1, -1, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, + 276, -1, 278, 279, 280, 281, 282, 283, 284, 285, + -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, + 386, 387, 388, 389, -1, -1, 392, 393, 394, 395, + -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, + 426, 427, -1, -1, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, + 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, + 456, 457, 458, 459, 460, 461, -1, 463, 464, 465, + 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, -1, -1, -1, -1, -1, -1, -1, 505, + 506, 507, -1, 3, 4, 5, 512, -1, 514, 9, + -1, -1, -1, 519, 520, -1, 522, 523, -1, -1, + -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, + -1, 31, 32, 33, -1, -1, -1, 37, -1, -1, + -1, -1, 42, 43, 44, -1, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, + 60, 61, 62, 63, 64, -1, -1, 67, 68, 69, + 70, 71, 72, 73, -1, 75, 76, 77, 78, 79, + -1, 81, -1, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, -1, 94, 95, 96, 97, 98, 99, + -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, + 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, + 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, + 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, -1, 162, 163, 164, 165, -1, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, -1, 179, + -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, -1, 199, + 200, 201, 202, 203, 204, 205, -1, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, -1, 218, -1, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, -1, -1, 233, 234, 235, 236, -1, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, -1, 275, 276, 277, 278, -1, + 280, 281, 282, 283, 284, 285, -1, 287, 288, 289, + -1, 291, 292, 293, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, + 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, + 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, -1, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, -1, 414, 415, -1, 417, 418, 419, + 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, + 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, + 460, 461, -1, 463, 464, 465, 466, 467, 468, 469, + 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, -1, -1, + -1, -1, 3, -1, -1, 505, 506, 507, -1, -1, + -1, -1, 512, -1, 514, -1, -1, -1, -1, -1, + 520, 22, 23, 24, 25, 26, 27, 28, 29, -1, + 31, 32, 33, -1, -1, -1, -1, -1, -1, 40, + -1, -1, 43, 44, -1, 46, 47, 48, -1, 50, + 51, 52, 53, 54, -1, 56, 57, -1, 59, 60, + 61, 62, 63, 64, -1, -1, 67, 68, 69, 70, + 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, + -1, -1, 83, 84, 85, 86, 87, 88, -1, 90, + 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, + -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, + 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, + 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, + 141, 142, -1, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, -1, 160, + 161, 162, 163, 164, 165, 166, 167, -1, 169, -1, + -1, -1, 173, 174, 175, -1, 177, -1, 179, -1, + 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, + 191, 192, -1, 194, 195, 196, 197, -1, 199, 200, + 201, 202, 203, 204, 205, -1, 207, -1, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, -1, 220, + -1, -1, 223, -1, 225, 226, 227, 228, 229, 230, + -1, -1, 233, -1, 235, -1, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, -1, 269, 270, + 271, 272, 273, -1, 275, 276, -1, 278, -1, 280, + 281, 282, 283, 284, 285, 286, 287, 288, -1, -1, + 291, 292, 293, -1, 295, 296, 297, 298, -1, 300, + -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, -1, -1, -1, -1, 318, 319, 320, + -1, 322, 323, 324, 325, 326, 327, -1, 329, 330, + 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, + 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, + -1, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, + 381, 382, 383, 384, 385, 386, 387, 388, 389, -1, + -1, 392, 393, 394, 395, -1, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, -1, -1, 414, 415, -1, 417, -1, 419, 420, + 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, + 431, 432, 433, 434, -1, 436, 437, 438, 439, 440, + 441, 442, 443, 444, -1, 446, 447, 448, -1, 450, + 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, + 461, -1, 463, -1, 465, 466, 467, 468, 469, 470, + 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 3, -1, 5, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 515, -1, 22, 23, 24, 25, + 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 43, 44, -1, + 46, 47, 48, -1, 50, 51, 52, 53, 54, -1, + 56, 57, -1, 59, 60, 61, 62, 63, 64, -1, + -1, 67, 68, 69, 70, 71, 72, 73, -1, 75, + 76, 77, 78, 79, -1, -1, -1, 83, 84, 85, + 86, 87, 88, -1, 90, 91, 92, -1, 94, 95, + 96, 97, 98, 99, -1, -1, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, -1, 118, -1, 120, 121, 122, 123, 124, 125, + -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, + 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, + 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, -1, 160, -1, 162, 163, 164, 165, + -1, 167, -1, 169, -1, -1, -1, 173, 174, 175, + -1, 177, -1, 179, -1, 181, 182, 183, 184, -1, + 186, 187, 188, 189, 190, 191, 192, -1, 194, 195, + 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, + -1, 207, -1, 209, 210, 211, 212, 213, 214, 215, + 216, -1, 218, -1, 220, -1, -1, 223, -1, 225, + 226, 227, 228, 229, 230, -1, -1, 233, -1, 235, + -1, -1, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, -1, 269, 270, 271, 272, 273, -1, 275, + 276, -1, 278, -1, 280, 281, 282, 283, 284, 285, + -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, + 296, 297, 298, -1, 300, -1, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, + -1, -1, 318, 319, 320, -1, 322, 323, 324, 325, + 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, -1, 359, 360, -1, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, + 386, 387, 388, 389, -1, -1, 392, 393, 394, 395, + -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, + 426, 427, -1, -1, 430, 431, 432, 433, 434, -1, + 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, + 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, + 456, 457, 458, 459, 460, 461, -1, 463, -1, 465, + 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 514, 515, + -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, + 31, 32, 33, 34, 35, -1, 37, -1, -1, -1, + -1, 42, 43, 44, -1, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, + 61, 62, 63, 64, -1, -1, 67, 68, 69, 70, + 71, 72, 73, -1, 75, 76, 77, 78, 79, -1, + 81, -1, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, -1, 94, 95, 96, 97, 98, 99, -1, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, + 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, -1, 160, + -1, 162, 163, 164, 165, -1, 167, -1, 169, 170, + 171, 172, 173, 174, 175, 176, 177, -1, 179, -1, + 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, -1, 199, 200, + 201, 202, 203, 204, 205, -1, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, -1, 218, -1, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + -1, -1, 233, 234, 235, 236, -1, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, -1, 275, 276, 277, 278, -1, 280, + 281, 282, 283, 284, 285, -1, 287, 288, -1, -1, + 291, 292, 293, -1, -1, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, + 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, + 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, -1, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, -1, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, + 431, 432, 433, 434, -1, 436, 437, 438, 439, 440, + 441, 442, 443, -1, -1, 446, 447, 448, 449, 450, + 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, + 461, -1, 463, 464, 465, 466, 467, 468, 469, 470, + 471, -1, -1, 474, -1, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, -1, 3, 500, + 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 514, -1, -1, -1, 22, 23, 24, + 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, + -1, -1, -1, -1, -1, -1, -1, 42, 43, 44, + -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, + -1, 66, 67, 68, 69, 70, 71, 72, 73, -1, + 75, 76, 77, 78, 79, -1, 81, -1, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, + 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, -1, 118, -1, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, -1, -1, 134, + 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, + 145, 146, -1, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, -1, 160, -1, 162, 163, 164, + 165, -1, 167, -1, 169, 170, 171, 172, 173, 174, + 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, + -1, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, -1, 199, 200, 201, 202, 203, 204, + 205, -1, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, -1, 218, -1, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, -1, 233, 234, + 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, -1, + 275, 276, 277, 278, -1, 280, 281, 282, 283, 284, + 285, -1, 287, 288, -1, 290, 291, 292, 293, -1, + -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, + -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, -1, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, -1, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, -1, + 425, 426, 427, -1, -1, 430, 431, 432, 433, 434, + -1, 436, 437, 438, 439, 440, 441, 442, 443, -1, + -1, 446, 447, 448, 449, 450, 451, 452, 453, -1, + 455, 456, 457, 458, 459, 460, 461, -1, 463, 464, + 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, + -1, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, -1, 3, 500, 5, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 514, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, 66, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, 290, 291, 292, 293, -1, -1, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, 290, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + -1, -1, -1, -1, -1, 514, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, 42, 43, + 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, 66, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, + 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + -1, 275, 276, 277, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, 4, -1, -1, -1, -1, 9, -1, -1, + 514, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, 66, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + -1, -1, -1, -1, -1, 514, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, 171, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, -1, + 414, 415, 416, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, 449, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 500, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 514, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, 171, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, 416, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + 449, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 500, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 514, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, 171, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, 416, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, 449, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, -1, 3, 500, 5, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 514, -1, -1, -1, 22, 23, 24, 25, 26, 27, + 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 43, 44, -1, 46, 47, + 48, -1, 50, 51, 52, 53, 54, -1, 56, 57, + -1, 59, 60, 61, 62, 63, 64, -1, -1, 67, + 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, + 78, 79, -1, -1, -1, 83, 84, 85, 86, 87, + 88, -1, 90, 91, 92, -1, 94, 95, 96, 97, + 98, 99, -1, -1, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, + 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, + 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, + 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, -1, 160, -1, 162, 163, 164, 165, -1, 167, + -1, 169, -1, -1, -1, 173, 174, 175, -1, 177, + -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, + 188, 189, 190, 191, 192, -1, 194, 195, 196, 197, + -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, + -1, 209, 210, 211, 212, 213, 214, 215, 216, -1, + 218, -1, 220, -1, -1, 223, -1, 225, 226, 227, + 228, 229, 230, -1, -1, 233, -1, 235, -1, -1, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + -1, 269, 270, 271, 272, 273, -1, 275, 276, -1, + 278, -1, 280, 281, 282, 283, 284, 285, -1, 287, + 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, + 298, -1, 300, -1, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, + 318, 319, 320, -1, 322, 323, 324, 325, 326, 327, + -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + -1, 359, 360, -1, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, + 388, 389, -1, -1, 392, 393, 394, 395, -1, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, + -1, 419, 420, 421, 422, 423, -1, 425, 426, 427, + -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, + 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, + 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, + 458, 459, 460, 461, -1, 463, -1, 465, 466, 467, + 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 514, -1, -1, 22, + 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, + 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 43, 44, -1, 46, 47, 48, -1, 50, 51, 52, + 53, 54, -1, 56, 57, -1, 59, 60, 61, 62, + 63, 64, -1, -1, 67, 68, 69, 70, 71, 72, + 73, -1, 75, 76, 77, 78, 79, -1, -1, -1, + 83, 84, 85, 86, 87, 88, -1, 90, 91, 92, + -1, 94, 95, 96, 97, 98, 99, -1, -1, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, + 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, + -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, + -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, -1, 160, -1, 162, + 163, 164, 165, -1, 167, -1, 169, -1, -1, -1, + 173, 174, 175, -1, 177, -1, 179, -1, 181, 182, + 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, + -1, 194, 195, 196, 197, -1, 199, 200, 201, 202, + 203, 204, 205, -1, 207, -1, 209, 210, 211, 212, + 213, 214, 215, 216, -1, 218, -1, 220, -1, -1, + 223, -1, 225, 226, 227, 228, 229, 230, -1, -1, + 233, -1, 235, -1, -1, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, -1, 269, 270, 271, 272, + 273, -1, 275, 276, -1, 278, -1, 280, 281, 282, + 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, + 293, -1, -1, 296, 297, 298, -1, 300, -1, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, -1, -1, -1, -1, 318, 319, 320, -1, 322, + 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, + 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, + 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, -1, 359, 360, -1, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, + 383, 384, 385, 386, 387, 388, 389, -1, -1, 392, + 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, + -1, 414, 415, -1, 417, -1, 419, 420, 421, 422, + 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, + 433, 434, -1, 436, 437, 438, 439, 440, 441, 442, + 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, + 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, + 463, -1, 465, 466, 467, 468, 469, 470, 471, -1, + -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, 416, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, + -1, 514, -1, -1, 22, 23, 24, 25, 26, 27, + 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 43, 44, -1, 46, 47, + 48, -1, 50, 51, 52, 53, 54, -1, 56, 57, + -1, 59, 60, 61, 62, 63, 64, -1, -1, 67, + 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, + 78, 79, -1, -1, -1, 83, 84, 85, 86, 87, + 88, -1, 90, 91, 92, -1, 94, 95, 96, 97, + 98, 99, -1, -1, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, + 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, + 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, + 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, -1, 160, -1, 162, 163, 164, 165, -1, 167, + -1, 169, -1, -1, -1, 173, 174, 175, -1, 177, + -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, + 188, 189, 190, 191, 192, -1, 194, 195, 196, 197, + -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, + -1, 209, 210, 211, 212, 213, 214, 215, 216, -1, + 218, -1, 220, -1, -1, 223, -1, 225, 226, 227, + 228, 229, 230, -1, -1, 233, -1, 235, -1, -1, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + -1, 269, 270, 271, 272, 273, -1, 275, 276, -1, + 278, -1, 280, 281, 282, 283, 284, 285, -1, 287, + 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, + 298, -1, 300, -1, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, + 318, 319, 320, -1, 322, 323, 324, 325, 326, 327, + -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + -1, 359, 360, -1, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, + 388, 389, -1, -1, 392, 393, 394, 395, -1, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, + -1, 419, 420, 421, 422, 423, -1, 425, 426, 427, + -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, + 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, + 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, + 458, 459, 460, 461, -1, 463, -1, 465, 466, 467, + 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 514, -1, -1, 22, + 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, + 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 43, 44, -1, 46, 47, 48, -1, 50, 51, 52, + 53, 54, -1, 56, 57, -1, 59, 60, 61, 62, + 63, 64, -1, -1, 67, 68, 69, 70, 71, 72, + 73, -1, 75, 76, 77, 78, 79, -1, -1, -1, + 83, 84, 85, 86, 87, 88, -1, 90, 91, 92, + -1, 94, 95, 96, 97, 98, 99, -1, -1, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, + 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, + -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, + -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, -1, 160, -1, 162, + 163, 164, 165, -1, 167, -1, 169, -1, -1, -1, + 173, 174, 175, -1, 177, -1, 179, -1, 181, 182, + 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, + -1, 194, 195, 196, 197, -1, 199, 200, 201, 202, + 203, 204, 205, -1, 207, -1, 209, 210, 211, 212, + 213, 214, 215, 216, -1, 218, -1, 220, -1, -1, + 223, -1, 225, 226, 227, 228, 229, 230, -1, -1, + 233, -1, 235, -1, -1, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, -1, 269, 270, 271, 272, + 273, -1, 275, 276, -1, 278, -1, 280, 281, 282, + 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, + 293, -1, -1, 296, 297, 298, -1, 300, -1, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, -1, -1, -1, -1, 318, 319, 320, -1, 322, + 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, + 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, + 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, -1, 359, 360, -1, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, + 383, 384, 385, 386, 387, 388, 389, -1, -1, 392, + 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, + -1, 414, 415, -1, 417, -1, 419, 420, 421, 422, + 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, + 433, 434, -1, 436, 437, 438, 439, 440, 441, 442, + 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, + 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, + 463, -1, 465, 466, 467, 468, 469, 470, 471, -1, + -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + -1, 514, -1, -1, 22, 23, 24, 25, 26, 27, + 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 43, 44, -1, 46, 47, + 48, -1, 50, 51, 52, 53, 54, -1, 56, 57, + -1, 59, 60, 61, 62, 63, 64, -1, -1, 67, + 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, + 78, 79, -1, -1, -1, 83, 84, 85, 86, 87, + 88, -1, 90, 91, 92, -1, 94, 95, 96, 97, + 98, 99, -1, -1, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, + 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, + 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, + 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, -1, 160, -1, 162, 163, 164, 165, -1, 167, + -1, 169, -1, -1, -1, 173, 174, 175, -1, 177, + -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, + 188, 189, 190, 191, 192, -1, 194, 195, 196, 197, + -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, + -1, 209, 210, 211, 212, 213, 214, 215, 216, -1, + 218, -1, 220, -1, -1, 223, -1, 225, 226, 227, + 228, 229, 230, -1, -1, 233, -1, 235, -1, -1, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + -1, 269, 270, 271, 272, 273, -1, 275, 276, -1, + 278, -1, 280, 281, 282, 283, 284, 285, -1, 287, + 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, + 298, -1, 300, -1, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, + 318, 319, 320, -1, 322, 323, 324, 325, 326, 327, + -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + -1, 359, 360, -1, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, + 388, 389, -1, -1, 392, 393, 394, 395, -1, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, + -1, 419, 420, 421, 422, 423, -1, 425, 426, 427, + -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, + 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, + 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, + 458, 459, 460, 461, -1, 463, -1, 465, 466, 467, + 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 514, -1, -1, 22, + 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, + 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 43, 44, -1, 46, 47, 48, -1, 50, 51, 52, + 53, 54, -1, 56, 57, -1, 59, 60, 61, 62, + 63, 64, -1, -1, 67, 68, 69, 70, 71, 72, + 73, -1, 75, 76, 77, 78, 79, -1, -1, -1, + 83, 84, 85, 86, 87, 88, -1, 90, 91, 92, + -1, 94, 95, 96, 97, 98, 99, -1, -1, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, + 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, + -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, + -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, -1, 160, -1, 162, + 163, 164, 165, -1, 167, -1, 169, -1, -1, -1, + 173, 174, 175, -1, 177, -1, 179, -1, 181, 182, + 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, + -1, 194, 195, 196, 197, -1, 199, 200, 201, 202, + 203, 204, 205, -1, 207, -1, 209, 210, 211, 212, + 213, 214, 215, 216, -1, 218, -1, 220, -1, -1, + 223, -1, 225, 226, 227, 228, 229, 230, -1, -1, + 233, -1, 235, -1, -1, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, -1, 269, 270, 271, 272, + 273, -1, 275, 276, -1, 278, -1, 280, 281, 282, + 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, + 293, -1, -1, 296, 297, 298, -1, 300, -1, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, -1, -1, -1, -1, 318, 319, 320, -1, 322, + 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, + 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, + 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, -1, 359, 360, -1, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, + 383, 384, 385, 386, 387, 388, 389, -1, -1, 392, + 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, + -1, 414, 415, -1, 417, -1, 419, 420, 421, 422, + 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, + 433, 434, -1, 436, 437, 438, 439, 440, 441, 442, + 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, + 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, + 463, -1, 465, 466, 467, 468, 469, 470, 471, -1, + -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 514, -1, -1, 22, 23, 24, 25, 26, 27, + 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 43, 44, -1, 46, 47, + 48, -1, 50, 51, 52, 53, 54, -1, 56, 57, + -1, 59, 60, 61, 62, 63, 64, -1, -1, 67, + 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, + 78, 79, -1, -1, -1, 83, 84, 85, 86, 87, + 88, -1, 90, 91, 92, -1, 94, 95, 96, 97, + 98, 99, -1, -1, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, + 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, + 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, + 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, -1, 160, -1, 162, 163, 164, 165, -1, 167, + -1, 169, -1, -1, -1, 173, 174, 175, -1, 177, + -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, + 188, 189, 190, 191, 192, -1, 194, 195, 196, 197, + -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, + -1, 209, 210, 211, 212, 213, 214, 215, 216, -1, + 218, -1, 220, -1, -1, 223, -1, 225, 226, 227, + 228, 229, 230, -1, -1, 233, -1, 235, -1, -1, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + -1, 269, 270, 271, 272, 273, -1, 275, 276, -1, + 278, -1, 280, 281, 282, 283, 284, 285, -1, 287, + 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, + 298, -1, 300, -1, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, + 318, 319, 320, -1, 322, 323, 324, 325, 326, 327, + -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + -1, 359, 360, -1, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, + 388, 389, -1, -1, 392, 393, 394, 395, -1, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, + -1, 419, 420, 421, 422, 423, -1, 425, 426, 427, + -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, + 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, + 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, + 458, 459, 460, 461, -1, 463, -1, 465, 466, 467, + 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 514, -1, -1, 22, + 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, + 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 43, 44, -1, 46, 47, 48, -1, 50, 51, 52, + 53, 54, -1, 56, 57, -1, 59, 60, 61, 62, + 63, 64, -1, -1, 67, 68, 69, 70, 71, 72, + 73, -1, 75, 76, 77, 78, 79, -1, -1, -1, + 83, 84, 85, 86, 87, 88, -1, 90, 91, 92, + -1, 94, 95, 96, 97, 98, 99, -1, -1, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, + 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, + -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, + -1, 144, 145, 146, -1, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, -1, 160, -1, 162, + 163, 164, 165, -1, 167, -1, 169, -1, -1, -1, + 173, 174, 175, -1, 177, -1, 179, -1, 181, 182, + 183, 184, -1, 186, 187, 188, 189, 190, 191, 192, + -1, 194, 195, 196, 197, -1, 199, 200, 201, 202, + 203, 204, 205, -1, 207, -1, 209, 210, 211, 212, + 213, 214, 215, 216, -1, 218, -1, 220, -1, -1, + 223, -1, 225, 226, 227, 228, 229, 230, -1, -1, + 233, -1, 235, -1, -1, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, -1, 269, 270, 271, 272, + 273, -1, 275, 276, -1, 278, -1, 280, 281, 282, + 283, 284, 285, -1, 287, 288, -1, -1, 291, 292, + 293, -1, -1, 296, 297, 298, -1, 300, -1, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, -1, -1, -1, -1, 318, 319, 320, -1, 322, + 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, + 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, + 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, -1, 359, 360, -1, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, -1, -1, 381, 382, + 383, 384, 385, 386, 387, 388, 389, -1, -1, 392, + 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, + -1, 414, 415, -1, 417, -1, 419, 420, 421, 422, + 423, -1, 425, 426, 427, -1, -1, 430, 431, 432, + 433, 434, -1, 436, 437, 438, 439, 440, 441, 442, + 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, + 453, -1, 455, 456, 457, 458, 459, 460, 461, -1, + 463, -1, 465, 466, 467, 468, 469, 470, 471, -1, + -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, + -1, 514, -1, -1, 22, 23, 24, 25, 26, 27, + 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 43, 44, -1, 46, 47, + 48, -1, 50, 51, 52, 53, 54, -1, 56, 57, + -1, 59, 60, 61, 62, 63, 64, -1, -1, 67, + 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, + 78, 79, -1, -1, -1, 83, 84, 85, 86, 87, + 88, -1, 90, 91, 92, -1, 94, 95, 96, 97, + 98, 99, -1, -1, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, + 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, + 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, + 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, -1, 160, -1, 162, 163, 164, 165, -1, 167, + -1, 169, -1, -1, -1, 173, 174, 175, -1, 177, + -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, + 188, 189, 190, 191, 192, -1, 194, 195, 196, 197, + -1, 199, 200, 201, 202, 203, 204, 205, -1, 207, + -1, 209, 210, 211, 212, 213, 214, 215, 216, -1, + 218, -1, 220, -1, -1, 223, -1, 225, 226, 227, + 228, 229, 230, -1, -1, 233, -1, 235, -1, -1, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + -1, 269, 270, 271, 272, 273, -1, 275, 276, -1, + 278, -1, 280, 281, 282, 283, 284, 285, -1, 287, + 288, -1, -1, 291, 292, 293, -1, -1, 296, 297, + 298, -1, 300, -1, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, -1, -1, -1, -1, + 318, 319, 320, -1, 322, 323, 324, 325, 326, 327, + -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + -1, 359, 360, -1, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, -1, -1, 381, 382, 383, 384, 385, 386, 387, + 388, 389, -1, -1, 392, 393, 394, 395, -1, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, -1, 417, + -1, 419, 420, 421, 422, 423, -1, 425, 426, 427, + -1, -1, 430, 431, 432, 433, 434, -1, 436, 437, + 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, + 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, + 458, 459, 460, 461, -1, 463, -1, 465, 466, 467, + 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + -1, 3, 4, 5, -1, -1, 8, 9, -1, -1, + -1, -1, -1, 15, 16, -1, 514, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, -1, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, -1, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 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, + -1, 153, 154, 155, 156, 157, -1, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, -1, + -1, 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, -1, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, -1, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, -1, 299, 300, 301, + -1, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, -1, 321, + 322, 323, -1, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, -1, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + -1, 433, -1, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, -1, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 494, 495, 496, 497, -1, 3, -1, 501, + 502, 503, 8, 505, 506, 507, 508, 509, 510, 15, + 16, -1, -1, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 43, 44, -1, + 46, 47, 48, -1, 50, 51, 52, 53, 54, -1, + 56, 57, -1, 59, 60, 61, 62, 63, 64, -1, + -1, 67, 68, 69, 70, 71, 72, 73, -1, 75, + 76, 77, 78, 79, -1, -1, -1, 83, 84, 85, + 86, 87, 88, -1, 90, 91, 92, -1, 94, 95, + 96, 97, 98, 99, -1, -1, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, -1, 118, -1, 120, 121, 122, 123, 124, 125, + -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, + 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, + 146, -1, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, -1, 160, -1, 162, 163, 164, 165, + -1, 167, -1, 169, -1, -1, -1, 173, 174, 175, + -1, 177, -1, 179, -1, 181, 182, 183, 184, -1, + 186, 187, 188, 189, 190, 191, 192, -1, 194, 195, + 196, 197, -1, 199, 200, 201, 202, 203, 204, 205, + -1, 207, -1, 209, 210, 211, 212, 213, 214, 215, + 216, -1, 218, -1, 220, -1, -1, 223, -1, 225, + 226, 227, 228, 229, 230, -1, -1, 233, -1, 235, + -1, -1, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, -1, 269, 270, 271, 272, 273, -1, 275, + 276, -1, 278, -1, 280, 281, 282, 283, 284, 285, + -1, 287, 288, -1, -1, 291, 292, 293, -1, -1, + 296, 297, 298, -1, 300, -1, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, -1, -1, + -1, -1, 318, 319, 320, -1, 322, 323, 324, 325, + 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, -1, 359, 360, -1, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, -1, -1, 381, 382, 383, 384, 385, + 386, 387, 388, 389, -1, -1, 392, 393, 394, 395, + -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, + 426, 427, -1, -1, 430, 431, 432, 433, 434, -1, + 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, + 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, + 456, 457, 458, 459, 460, 461, -1, 463, -1, 465, + 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, -1, -1, -1, 501, 502, 503, -1, 505, + 506, 507, 508, 509, 510, 8, -1, -1, 11, -1, + -1, -1, 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, + -1, -1, -1, 36, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 46, 8, -1, -1, 11, -1, -1, + 53, 15, 16, 17, 18, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 36, -1, -1, -1, -1, 80, -1, -1, + -1, -1, 46, 8, -1, -1, 11, -1, -1, 53, + 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 36, -1, -1, -1, -1, 80, -1, -1, -1, + -1, 46, -1, -1, -1, -1, -1, -1, 53, -1, + 8, -1, -1, 11, -1, -1, -1, 15, 16, 17, + 18, 19, 20, 21, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 80, -1, -1, 36, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 46, 8, + -1, -1, 11, 176, -1, 53, 15, 16, 17, 18, + 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, + 193, -1, -1, -1, -1, 198, -1, 36, -1, -1, + -1, -1, 80, -1, -1, -1, -1, 46, -1, -1, + -1, -1, 176, -1, 53, -1, -1, -1, 221, 222, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 193, + -1, -1, -1, 236, 198, -1, -1, -1, -1, -1, + -1, 80, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 176, -1, -1, -1, -1, -1, 221, 222, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 193, -1, + -1, 274, 236, 198, 277, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 291, -1, + -1, 294, -1, -1, -1, -1, 221, 222, 176, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 274, 236, -1, 277, -1, 193, -1, -1, -1, -1, + 198, -1, -1, -1, -1, -1, -1, 291, -1, -1, + 294, -1, -1, -1, -1, -1, -1, 176, -1, -1, + -1, -1, -1, 221, 222, -1, -1, -1, -1, 274, + -1, -1, 277, -1, 193, -1, -1, -1, 236, 198, + -1, -1, -1, -1, -1, -1, 291, -1, -1, 294, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 221, 222, -1, -1, -1, -1, 391, -1, + -1, -1, -1, -1, -1, -1, 274, 236, -1, 277, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 291, -1, -1, 294, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 391, -1, -1, + -1, -1, -1, -1, -1, 274, -1, -1, 277, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 291, -1, -1, 294, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 391, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 498, -1, -1, 501, 502, + 503, -1, 505, 506, 507, 508, 509, 510, -1, -1, + -1, -1, 515, 391, -1, -1, -1, -1, -1, 8, + -1, -1, 11, -1, -1, -1, 15, 16, 17, 18, + 19, 20, 21, -1, 498, -1, -1, 501, 502, 503, + -1, 505, 506, 507, 508, 509, 510, 36, -1, -1, + -1, 515, 391, -1, -1, -1, -1, 46, -1, -1, + -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, + -1, -1, -1, 498, -1, -1, 501, 502, 503, -1, + 505, 506, 507, 508, 509, 510, -1, -1, -1, -1, + 515, 80, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8, -1, -1, 11, -1, + -1, -1, 15, 16, 17, 18, 19, 20, 21, -1, + 498, -1, -1, 501, 502, 503, -1, 505, 506, 507, + 508, 509, 510, 36, -1, -1, -1, 515, -1, -1, + -1, -1, -1, 46, 8, -1, -1, 11, -1, -1, + 53, 15, 16, 17, 18, 19, 20, 21, -1, 498, + -1, -1, 501, 502, 503, -1, 505, 506, 507, 508, + 509, 510, 36, -1, -1, -1, 515, 80, -1, -1, + -1, -1, 46, 8, -1, -1, 11, 176, -1, 53, + 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, + -1, -1, -1, -1, 193, -1, -1, -1, -1, 198, + -1, 36, -1, -1, -1, -1, 80, -1, -1, -1, + -1, 46, -1, -1, -1, -1, -1, -1, 53, -1, + -1, -1, 221, 222, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 236, -1, -1, + -1, -1, -1, -1, -1, 80, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, + -1, -1, 11, 176, -1, -1, 15, 16, 17, 18, + 19, 20, 21, -1, -1, 274, -1, -1, 277, -1, + 193, -1, -1, -1, -1, 198, -1, 36, -1, -1, + -1, -1, 291, -1, -1, 294, -1, 46, -1, -1, + -1, -1, 176, -1, 53, -1, -1, -1, 221, 222, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 193, + -1, -1, -1, 236, 198, -1, -1, -1, -1, -1, + -1, 80, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 176, -1, -1, -1, -1, -1, 221, 222, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 193, -1, + -1, 274, 236, 198, 277, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 291, -1, + -1, 294, -1, -1, -1, -1, 221, 222, -1, -1, + -1, -1, 391, -1, -1, -1, -1, -1, -1, -1, + 274, 236, -1, 277, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 291, -1, -1, + 294, -1, -1, -1, -1, -1, -1, 176, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 274, + -1, -1, 277, -1, 193, -1, -1, -1, -1, 198, + -1, -1, -1, -1, -1, -1, 291, -1, -1, 294, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 221, 222, -1, -1, -1, -1, 391, -1, + -1, -1, -1, -1, -1, -1, -1, 236, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 498, + -1, -1, 501, 502, 503, -1, 505, 506, 507, 508, + 509, 510, -1, -1, -1, -1, 515, 391, -1, -1, + -1, -1, -1, -1, -1, 274, -1, 8, 277, -1, + 11, -1, -1, -1, 15, 16, 17, 18, 19, 20, + 21, -1, 291, -1, -1, 294, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 36, 391, -1, -1, -1, + -1, -1, -1, -1, -1, 46, -1, -1, -1, -1, + -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 498, -1, -1, 501, 502, + 503, -1, 505, 506, 507, 508, 509, 510, -1, 80, + -1, -1, 515, -1, -1, -1, -1, -1, -1, 8, + -1, -1, 11, -1, -1, -1, 15, 16, 17, 18, + 19, 20, 21, -1, 498, -1, -1, 501, 502, 503, + -1, 505, 506, 507, 508, 509, 510, 36, -1, -1, + -1, 515, 391, -1, -1, -1, -1, 46, -1, -1, + -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, + -1, -1, -1, 498, -1, -1, 501, 502, 503, -1, + 505, 506, 507, 508, 509, 510, -1, -1, 513, -1, + -1, 80, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 176, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 193, -1, -1, -1, -1, 198, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 221, 222, -1, -1, -1, -1, -1, -1, -1, 498, + -1, -1, 501, 502, 503, 236, 505, 506, 507, 508, + 509, 510, -1, -1, 513, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 176, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 274, 193, -1, 277, -1, -1, 198, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 291, -1, -1, 294, -1, -1, -1, -1, -1, -1, + -1, -1, 221, 222, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 236, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 274, -1, -1, 277, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 291, -1, -1, 294, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 391, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 391, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 498, -1, -1, + 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, + -1, -1, 513, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3, -1, -1, 498, + -1, -1, 501, 502, 503, -1, 505, 506, 507, 508, + 509, 510, -1, -1, 513, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 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, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 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, 446, + 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, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + 507, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, @@ -17274,8 +15857,8 @@ static const yytype_int16 yycheck[] = -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, -1, -1, 507, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, @@ -17324,1485 +15907,2937 @@ static const yytype_int16 yycheck[] = 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 497, 3, 4, 5, -1, -1, -1, 9, -1, -1, + 507, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, + 32, 33, -1, -1, -1, 37, -1, -1, -1, -1, + 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, + 72, 73, -1, 75, 76, 77, 78, 79, -1, 81, + -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, + 152, 153, 154, 155, 156, 157, 158, 159, 160, -1, + 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, + 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, + 202, 203, 204, 205, -1, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, + -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, -1, 275, 276, 277, 278, -1, 280, 281, + 282, 283, 284, 285, -1, 287, 288, 289, -1, 291, + 292, 293, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, + 312, 313, -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, + 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, + 372, 373, 374, 375, 376, 377, 378, -1, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, + -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, + -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + 492, 493, 494, 495, 496, 497, -1, -1, 8, -1, + -1, 11, -1, 505, 506, 15, 16, 17, 18, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, + -1, 41, -1, -1, -1, -1, 46, 8, -1, -1, + 11, -1, -1, 53, 15, 16, 17, 18, 19, 20, + 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 36, -1, -1, -1, -1, + 80, -1, -1, -1, -1, 46, 8, -1, -1, 11, + -1, -1, 53, 15, 16, 17, 18, 19, 20, 21, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 36, -1, -1, -1, -1, 80, + -1, -1, -1, -1, 46, -1, 126, -1, -1, -1, + -1, 53, -1, -1, 8, -1, -1, 11, -1, -1, + -1, 15, 16, 17, 18, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 80, -1, + -1, -1, 36, -1, -1, -1, 40, -1, -1, -1, + -1, -1, 46, -1, 8, -1, 176, 11, -1, 53, + -1, 15, 16, 17, 18, 19, 20, 21, -1, -1, + -1, -1, -1, 193, -1, -1, -1, -1, 198, -1, + -1, -1, 36, -1, -1, 166, 80, -1, -1, -1, + 171, -1, 46, -1, -1, 176, -1, -1, -1, 53, + -1, 221, 222, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 193, -1, -1, -1, 236, 198, -1, -1, + -1, -1, -1, 165, -1, -1, 80, -1, -1, -1, + -1, -1, -1, -1, 176, -1, -1, -1, -1, -1, + 221, 222, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 193, -1, -1, 274, 236, 198, 277, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 291, -1, -1, 294, -1, -1, -1, -1, 221, + 222, -1, 176, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 274, 236, -1, 277, -1, -1, 193, + -1, -1, -1, -1, 198, -1, -1, -1, -1, -1, + 291, -1, -1, 294, -1, -1, -1, -1, -1, -1, + -1, -1, 176, -1, -1, -1, -1, 221, 222, -1, + -1, -1, 274, -1, -1, 277, -1, -1, -1, 193, + -1, -1, 236, -1, 198, -1, -1, -1, -1, 291, + -1, -1, 294, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 221, 222, -1, + -1, 391, -1, -1, -1, -1, -1, -1, -1, -1, + 274, 323, 236, 277, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 291, -1, -1, + 294, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 391, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 274, -1, -1, 277, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 454, -1, -1, 291, -1, -1, + 294, -1, -1, -1, -1, -1, -1, -1, -1, 391, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 317, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 498, -1, + -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, + 510, -1, -1, -1, -1, -1, -1, 391, -1, -1, + -1, -1, 8, -1, -1, 11, -1, -1, -1, 15, + 16, 17, 18, 19, 20, 21, -1, 498, -1, -1, + 501, 502, 503, -1, 505, 506, 507, 508, 509, 510, + 36, -1, -1, -1, 40, -1, -1, 391, -1, -1, + 46, -1, -1, -1, -1, -1, -1, 53, -1, -1, + -1, -1, -1, -1, -1, -1, 498, -1, -1, 501, + 502, 503, -1, 505, 506, 507, 508, 509, 510, -1, + -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, + -1, -1, 11, -1, -1, -1, 15, 16, 17, 18, + 19, 20, 21, -1, 498, -1, -1, 501, 502, 503, + -1, 505, 506, 507, 508, 509, 510, 36, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 46, -1, -1, + -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 498, -1, -1, 501, 502, 503, + -1, 505, 506, 507, 508, 509, 510, -1, -1, -1, + -1, 80, -1, -1, -1, -1, 8, -1, -1, 11, + 176, -1, -1, 15, 16, 17, 18, 19, 20, 21, + -1, -1, -1, -1, -1, -1, -1, 193, -1, -1, + -1, -1, 198, -1, 36, -1, -1, -1, 40, -1, + -1, -1, -1, -1, 46, -1, -1, -1, -1, -1, + -1, 53, -1, -1, -1, 221, 222, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 236, -1, -1, -1, -1, -1, -1, -1, 80, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 171, 8, -1, -1, 11, 176, -1, -1, + 15, 16, 17, 18, 19, 20, 21, -1, 274, -1, + -1, 277, -1, -1, 193, -1, -1, -1, -1, 198, + -1, 36, -1, -1, -1, 291, -1, -1, 294, -1, + -1, 46, -1, -1, -1, -1, -1, -1, 53, -1, + -1, -1, 221, 222, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 236, -1, -1, + -1, -1, -1, -1, -1, 80, -1, -1, -1, -1, + -1, -1, -1, -1, 176, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 193, -1, -1, -1, 274, 198, -1, 277, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 291, -1, -1, 294, -1, -1, -1, 221, + 222, -1, -1, -1, -1, 391, -1, -1, 8, -1, + -1, 11, -1, -1, 236, 15, 16, 17, 18, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 166, -1, -1, -1, -1, 36, -1, -1, -1, + -1, 176, -1, -1, -1, -1, 46, -1, -1, -1, + -1, -1, 274, 53, -1, 277, -1, -1, 193, -1, + -1, -1, -1, 198, -1, -1, -1, -1, -1, 291, + -1, -1, 294, -1, -1, -1, -1, -1, -1, -1, + 80, -1, -1, -1, -1, -1, 221, 222, -1, -1, + -1, -1, 391, -1, -1, -1, -1, -1, -1, -1, + -1, 236, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 498, -1, -1, 501, 502, 503, -1, 505, + 506, 507, 508, 509, 510, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 274, + -1, -1, 277, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 291, -1, -1, 294, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 391, + -1, -1, -1, -1, -1, -1, 176, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 193, -1, -1, -1, -1, 198, 498, + -1, -1, 501, 502, 503, -1, 505, 506, 507, 508, + 509, 510, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 221, 222, -1, -1, -1, -1, -1, -1, -1, + 8, -1, -1, 11, -1, -1, 236, 15, 16, 17, + 18, 19, 20, 21, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 391, -1, 36, -1, + -1, -1, 40, -1, -1, -1, -1, -1, 46, -1, + -1, -1, -1, -1, 274, 53, 498, 277, -1, 501, + 502, 503, -1, 505, 506, 507, 508, 509, 510, -1, + -1, 291, -1, -1, 294, -1, -1, -1, -1, -1, + -1, -1, 80, -1, 8, -1, -1, 11, -1, -1, + -1, 15, 16, 17, 18, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 36, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 46, -1, -1, -1, -1, -1, -1, 53, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 498, -1, -1, 501, 502, 503, -1, + 505, 506, 507, 508, 509, 510, 80, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 391, -1, 8, -1, -1, 11, -1, 176, -1, + 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, + -1, -1, -1, -1, -1, 193, -1, -1, -1, -1, + 198, 36, -1, -1, 424, -1, -1, -1, -1, -1, + -1, 46, -1, -1, -1, -1, -1, -1, 53, -1, + -1, -1, -1, 221, 222, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 236, -1, + -1, -1, -1, -1, -1, 80, -1, -1, -1, -1, + -1, -1, 176, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 193, + -1, -1, -1, -1, 198, -1, 274, -1, 498, 277, + -1, 501, 502, 503, -1, 505, 506, 507, 508, 509, + 510, -1, -1, 291, -1, -1, 294, 221, 222, -1, + -1, -1, -1, -1, -1, -1, 8, -1, -1, 11, + -1, -1, 236, 15, 16, 17, 18, 19, 20, 21, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 36, -1, -1, -1, -1, -1, + -1, 176, -1, -1, 46, -1, -1, -1, -1, -1, + 274, 53, -1, 277, -1, -1, -1, -1, 193, -1, + -1, -1, -1, 198, -1, -1, -1, 291, -1, -1, + 294, -1, -1, -1, -1, -1, -1, -1, 80, -1, + -1, -1, -1, -1, -1, -1, 221, 222, -1, -1, + -1, -1, -1, 391, -1, -1, -1, -1, -1, -1, + -1, 236, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 8, -1, -1, 11, -1, -1, -1, 15, + 16, -1, -1, 19, 20, 21, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 274, + 36, -1, 277, -1, -1, -1, -1, -1, -1, -1, + 46, -1, -1, -1, -1, -1, 291, 53, -1, 294, + -1, -1, -1, -1, -1, -1, -1, 391, -1, -1, + -1, -1, -1, -1, 176, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, + -1, 193, -1, -1, -1, -1, 198, -1, -1, -1, + 498, -1, -1, 501, 502, 503, -1, 505, 506, 507, + 508, 509, 510, -1, -1, 8, -1, -1, 11, 221, + 222, -1, 15, 16, -1, -1, 19, 20, 21, -1, + -1, -1, -1, -1, 236, -1, -1, -1, -1, -1, + -1, -1, -1, 36, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 46, -1, 8, 391, -1, 11, -1, + 53, -1, 15, 16, -1, -1, 19, 20, 21, -1, + -1, -1, 274, -1, 498, 277, -1, 501, 502, 503, + 176, 505, 506, 507, 508, 509, 510, 80, -1, 291, + -1, -1, 294, 46, -1, -1, -1, 193, -1, -1, + 53, -1, 198, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 221, 222, 80, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 236, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 498, -1, -1, 501, 502, 503, -1, + 505, 506, 507, 508, 509, 510, -1, -1, 274, -1, + -1, 277, -1, 176, -1, -1, -1, -1, -1, 391, + -1, -1, -1, -1, -1, 291, -1, -1, 294, -1, + 193, -1, -1, -1, -1, 198, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 176, -1, -1, -1, -1, 221, 222, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 193, -1, -1, 236, -1, 198, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 221, 222, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 274, -1, 236, 277, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 391, 498, -1, 291, 501, + 502, 503, -1, 505, 506, 507, 508, 509, 510, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 274, -1, -1, 277, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 291, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 391, -1, + -1, -1, 498, -1, -1, 501, 502, 503, -1, 505, + 506, 507, 508, 509, 510, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 391, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 498, -1, -1, 501, 502, + 503, -1, 505, 506, 507, 508, 509, 510, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, + -1, 5, -1, -1, -1, 498, -1, -1, 501, 502, + 503, -1, 505, 506, 507, 508, 509, 510, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 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, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 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, 426, 427, 428, 429, 430, 431, 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, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 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, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 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, 426, 427, 428, + 429, 430, 431, 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, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 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, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 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, 426, 427, 428, 429, 430, 431, 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, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 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, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 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, 426, 427, 428, + 429, 430, 431, 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, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 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, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 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, 426, 427, 428, 429, 430, 431, 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, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, 37, -1, + -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + 289, -1, 291, 292, 293, -1, -1, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + 34, 35, -1, 37, -1, -1, -1, -1, 42, 43, + 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, + 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + -1, 275, 276, 277, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, 66, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, 42, 43, + 44, -1, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, 81, -1, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, + 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + -1, 275, 276, 277, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, -1, -1, 82, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, 168, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, 445, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, 40, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, 168, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, 445, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, 34, 35, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, 40, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, 290, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, 290, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + 4, -1, -1, -1, -1, 9, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, 416, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, 5, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, 40, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, 37, -1, -1, 40, -1, - 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, - 52, -1, 54, 55, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, -1, -1, 81, - -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - -1, 153, 154, 155, 156, 157, -1, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, - 172, 173, 174, 175, 176, 177, -1, 179, -1, -1, - -1, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, 208, -1, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, - -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, -1, -1, 275, 276, 277, 278, -1, -1, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, -1, 299, 300, 301, - -1, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, -1, 321, - 322, 323, -1, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, 380, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, 391, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, -1, - -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - -1, 433, -1, -1, 436, 437, 438, 439, 440, 441, - 442, 443, 444, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, -1, 461, - -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 3, -1, 5, -1, -1, -1, -1, -1, -1, - -1, -1, 494, 495, 496, 497, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, 40, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, 37, -1, -1, 40, -1, 42, 43, + 44, -1, 46, 47, 48, 49, 50, 51, 52, -1, + 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, -1, -1, 81, -1, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, -1, 153, + 154, 155, 156, 157, -1, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, -1, 179, -1, -1, -1, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, 208, -1, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, + 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, -1, + -1, 275, 276, 277, 278, -1, -1, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, -1, 299, 300, 301, -1, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, -1, 321, 322, 323, + -1, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, 391, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, -1, -1, -1, + 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, -1, 433, + -1, -1, 436, 437, 438, 439, 440, 441, 442, 443, + 444, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, -1, 461, -1, 463, + 464, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 3, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + 494, 495, 496, 497, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, 40, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, -1, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, 40, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, -1, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 46, 47, 48, -1, 50, 51, - 52, 53, 54, -1, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, 79, -1, -1, - -1, 83, 84, 85, 86, 87, 88, -1, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, -1, -1, - -1, 173, 174, 175, -1, 177, -1, 179, -1, 181, - 182, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, -1, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, -1, 209, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, -1, - -1, 223, -1, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, 235, -1, -1, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, - 272, 273, -1, 275, 276, -1, 278, -1, 280, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, 298, -1, 300, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, 320, -1, - 322, 323, 324, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, -1, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, -1, 381, - 382, 383, 384, 385, 386, 387, 388, 389, -1, -1, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - -1, -1, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - 432, 433, 434, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, 460, 461, - -1, 463, -1, 465, 466, 467, 468, 469, 470, 471, - -1, -1, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, -1, 46, 47, 48, -1, 50, 51, 52, 53, + 54, -1, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, -1, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, -1, -1, -1, 173, + 174, 175, -1, 177, -1, 179, -1, 181, 182, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, -1, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, -1, 209, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, -1, -1, 223, + -1, 225, 226, 227, 228, 229, 230, -1, -1, 233, + -1, 235, -1, -1, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, -1, 269, 270, 271, 272, 273, + -1, 275, 276, -1, 278, -1, 280, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, 298, -1, 300, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, -1, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, 381, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, 432, 433, + 434, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, 460, 461, -1, 463, + -1, 465, 466, 467, 468, 469, 470, 471, -1, -1, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - 37, -1, -1, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, -1, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, -1, -1, 81, -1, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, -1, 153, 154, 155, 156, - 157, -1, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, -1, 176, - 177, -1, 179, -1, -1, -1, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, -1, -1, 275, 276, - 277, 278, -1, -1, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, -1, 299, 300, 301, -1, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, -1, 321, 322, 323, -1, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, -1, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, -1, 433, -1, -1, 436, - 437, 438, 439, 440, 441, 442, 443, 444, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, -1, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 3, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 494, 495, 496, - 497, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - 37, -1, -1, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, -1, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, -1, -1, 81, -1, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, -1, 153, 154, 155, 156, - 157, -1, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, -1, 176, - 177, -1, 179, -1, -1, -1, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, -1, -1, 275, 276, - 277, 278, -1, -1, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, -1, 299, 300, 301, -1, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, -1, 321, 322, 323, -1, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, 391, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, -1, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, -1, 433, -1, -1, 436, - 437, 438, 439, 440, 441, 442, 443, 444, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, -1, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 3, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 494, 495, 496, - 497, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - 37, -1, -1, -1, -1, 42, 43, 44, -1, 46, - 47, 48, 49, 50, 51, 52, -1, 54, 55, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, -1, -1, 81, -1, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, -1, 153, 154, 155, 156, - 157, -1, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, - 177, -1, 179, -1, -1, -1, 183, 184, -1, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, 234, 235, 236, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, -1, -1, 275, 276, - 277, 278, -1, -1, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, -1, 299, 300, 301, -1, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, -1, 321, 322, 323, -1, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, 361, 362, 363, 364, -1, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, 380, 381, 382, 383, 384, 385, 386, - -1, 388, 389, -1, 391, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, -1, -1, -1, 414, 415, -1, - 417, 418, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, -1, 433, -1, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, -1, 461, -1, 463, 464, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 3, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 494, 495, 496, - 497, -1, -1, -1, -1, 22, 23, 24, 25, 26, - 27, 28, 29, -1, 31, 32, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 43, 44, -1, 46, - 47, 48, -1, 50, 51, 52, 53, 54, -1, 56, - 57, -1, 59, 60, 61, 62, 63, 64, -1, -1, - 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, - 77, 78, 79, -1, -1, -1, 83, 84, 85, 86, - 87, 88, -1, 90, 91, 92, -1, 94, 95, 96, - 97, 98, 99, -1, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, -1, - -1, 128, 129, 130, 131, -1, -1, 134, 135, 136, - 137, 138, -1, 140, 141, 142, -1, 144, 145, 146, - -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, 160, -1, 162, 163, 164, 165, -1, - 167, -1, 169, -1, -1, -1, 173, 174, 175, -1, - 177, -1, 179, -1, 181, 182, -1, 184, -1, 186, - 187, 188, 189, 190, 191, 192, -1, 194, 195, 196, - 197, -1, 199, 200, 201, 202, 203, 204, 205, -1, - 207, -1, 209, 210, 211, 212, 213, 214, 215, 216, - -1, 218, -1, 220, -1, -1, 223, -1, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, 235, -1, - -1, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, -1, 269, 270, 271, 272, 273, -1, 275, 276, - -1, 278, -1, 280, 281, 282, 283, 284, 285, -1, - 287, 288, -1, -1, 291, 292, 293, -1, -1, 296, - 297, 298, -1, 300, -1, 302, 303, 304, 305, 306, - 307, 308, -1, 310, 311, 312, 313, -1, -1, -1, - -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, - -1, 338, 339, 340, 341, 342, 343, -1, 345, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, -1, 359, 360, -1, 362, 363, 364, 365, -1, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, -1, -1, 392, 393, 394, 395, -1, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, -1, -1, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, 431, 432, 433, 434, -1, 436, - 437, 438, 439, 440, 441, 442, 443, -1, -1, 446, - 447, 448, -1, 450, 451, 452, 453, -1, 455, 456, - 457, 458, 459, 460, 461, -1, 463, -1, 465, 466, - 467, 468, 469, 470, 471, -1, -1, 474, -1, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, 37, -1, + -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, -1, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + -1, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, -1, 153, 154, 155, 156, 157, -1, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, -1, 172, 173, 174, -1, 176, 177, -1, + 179, -1, -1, -1, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + -1, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, -1, -1, 275, 276, 277, 278, + -1, -1, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, -1, + 299, 300, 301, -1, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, -1, 321, 322, 323, -1, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, -1, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, -1, 433, -1, -1, 436, 437, 438, + 439, 440, 441, 442, 443, 444, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, -1, 461, -1, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 494, 495, 496, 497, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, 37, -1, + -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, -1, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + -1, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, -1, 153, 154, 155, 156, 157, -1, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, -1, 172, 173, 174, -1, 176, 177, -1, + 179, -1, -1, -1, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + -1, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, -1, -1, 275, 276, 277, 278, + -1, -1, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, -1, + 299, 300, 301, -1, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, -1, 321, 322, 323, -1, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, -1, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, -1, 433, -1, -1, 436, 437, 438, + 439, 440, 441, 442, 443, 444, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, -1, 461, -1, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 494, 495, 496, 497, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, 37, -1, + -1, -1, -1, 42, 43, 44, -1, 46, 47, 48, + 49, 50, 51, 52, -1, 54, 55, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + -1, -1, 81, -1, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, -1, 153, 154, 155, 156, 157, -1, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, -1, + 179, -1, -1, -1, 183, 184, -1, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, 208, + -1, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, -1, -1, 233, 234, 235, 236, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, -1, -1, 275, 276, 277, 278, + -1, -1, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, -1, + 299, 300, 301, -1, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, -1, 321, 322, 323, -1, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, 361, 362, 363, 364, -1, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, 380, 381, 382, 383, 384, 385, 386, -1, 388, + 389, -1, 391, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, -1, -1, -1, 414, 415, -1, 417, 418, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, -1, 433, -1, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, -1, 461, -1, 463, 464, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 494, 495, 496, 497, -1, + -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, + 29, -1, 31, 32, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, -1, 46, 47, 48, + -1, 50, 51, 52, 53, 54, -1, 56, 57, -1, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, 70, 71, 72, 73, -1, 75, 76, 77, 78, + 79, -1, -1, -1, 83, 84, 85, 86, 87, 88, + -1, 90, 91, 92, -1, 94, 95, 96, 97, 98, + 99, -1, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, 118, + -1, 120, 121, 122, 123, 124, 125, -1, -1, 128, + 129, 130, 131, -1, -1, 134, 135, 136, 137, 138, + -1, 140, 141, 142, -1, 144, 145, 146, -1, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + -1, 160, -1, 162, 163, 164, 165, -1, 167, -1, + 169, -1, -1, -1, 173, 174, 175, -1, 177, -1, + 179, -1, 181, 182, -1, 184, -1, 186, 187, 188, + 189, 190, 191, 192, -1, 194, 195, 196, 197, -1, + 199, 200, 201, 202, 203, 204, 205, -1, 207, -1, + 209, 210, 211, 212, 213, 214, 215, 216, -1, 218, + -1, 220, -1, -1, 223, -1, 225, 226, 227, 228, + 229, 230, -1, -1, 233, -1, 235, -1, -1, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, + 269, 270, 271, 272, 273, -1, 275, 276, -1, 278, + -1, 280, 281, 282, 283, 284, 285, -1, 287, 288, + -1, -1, 291, 292, 293, -1, -1, 296, 297, 298, + -1, 300, -1, 302, 303, 304, 305, 306, 307, 308, + -1, 310, 311, 312, 313, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, -1, 338, + 339, 340, 341, 342, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, -1, + 359, 360, -1, 362, 363, 364, 365, -1, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, + 389, -1, -1, 392, 393, 394, 395, -1, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, -1, 417, -1, + 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, + -1, 430, 431, 432, 433, 434, -1, 436, 437, 438, + 439, 440, 441, 442, 443, -1, -1, 446, 447, 448, + -1, 450, 451, 452, 453, -1, 455, 456, 457, 458, + 459, 460, 461, -1, 463, -1, 465, 466, 467, 468, + 469, 470, 471, -1, -1, 474, -1, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, 24, 25, 26, 27, 28, 29, -1, 31, - 32, 33, -1, -1, -1, 37, -1, -1, -1, -1, - 42, 43, 44, -1, 46, 47, 48, 49, 50, 51, - 52, -1, 54, 55, 56, 57, -1, 59, 60, 61, - 62, 63, 64, -1, -1, 67, 68, 69, 70, 71, - 72, 73, -1, 75, 76, 77, 78, -1, -1, 81, - -1, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, -1, 94, 95, 96, 97, 98, 99, -1, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, -1, -1, 128, 129, 130, 131, - -1, -1, 134, 135, 136, 137, 138, -1, 140, 141, - 142, -1, 144, 145, 146, -1, 148, 149, 150, 151, - -1, 153, 154, 155, 156, 157, -1, -1, 160, -1, - 162, 163, 164, 165, -1, 167, -1, 169, 170, -1, - 172, 173, 174, -1, 176, 177, -1, 179, -1, -1, - -1, 183, 184, -1, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, -1, 199, 200, 201, - 202, 203, 204, 205, -1, 207, 208, -1, 210, 211, - 212, 213, 214, 215, 216, -1, 218, -1, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, - -1, 233, 234, 235, 236, -1, 238, 239, 240, 241, - 242, 243, 244, 245, -1, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, -1, -1, 275, 276, 277, 278, -1, -1, 281, - 282, 283, 284, 285, -1, 287, 288, -1, -1, 291, - 292, 293, -1, -1, 296, 297, -1, 299, 300, 301, - -1, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, -1, -1, -1, -1, 318, 319, -1, 321, - 322, 323, -1, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - 342, 343, -1, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, -1, 359, 360, 361, - 362, 363, 364, -1, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, -1, 380, 381, - 382, 383, 384, 385, 386, -1, 388, 389, -1, 391, - 392, 393, 394, 395, -1, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, -1, 410, -1, - -1, -1, 414, 415, -1, 417, 418, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, 431, - -1, 433, -1, -1, 436, 437, 438, 439, 440, 441, - 442, 443, -1, -1, 446, 447, 448, -1, 450, 451, - 452, 453, -1, 455, 456, 457, 458, 459, -1, 461, - -1, 463, 464, 465, 466, 467, 468, 469, 470, 471, - -1, 22, 474, -1, -1, 477, 478, 479, 480, 481, - 482, 32, -1, 34, 35, -1, -1, -1, -1, 22, - -1, -1, 494, 495, 496, 497, -1, -1, -1, 32, - -1, 52, -1, -1, -1, -1, -1, -1, -1, -1, - 61, -1, -1, -1, -1, -1, -1, -1, -1, 52, - -1, -1, -1, -1, 75, -1, -1, -1, 61, -1, - -1, -1, -1, -1, -1, 86, -1, -1, -1, -1, - -1, -1, 75, -1, -1, -1, -1, 98, -1, 100, + -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + 24, 25, 26, 27, 28, 29, -1, 31, 32, 33, + -1, -1, -1, 37, -1, -1, -1, -1, 42, 43, + 44, -1, 46, 47, 48, 49, 50, 51, 52, -1, + 54, 55, 56, 57, -1, 59, 60, 61, 62, 63, + 64, -1, -1, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, -1, -1, 81, -1, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, -1, + 94, 95, 96, 97, 98, 99, -1, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, -1, 118, -1, 120, 121, 122, 123, + 124, 125, -1, -1, 128, 129, 130, 131, -1, -1, + 134, 135, 136, 137, 138, -1, 140, 141, 142, -1, + 144, 145, 146, -1, 148, 149, 150, 151, -1, 153, + 154, 155, 156, 157, -1, -1, 160, -1, 162, 163, + 164, 165, -1, 167, -1, 169, 170, -1, 172, 173, + 174, -1, 176, 177, -1, 179, -1, -1, -1, 183, + 184, -1, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, -1, 199, 200, 201, 202, 203, + 204, 205, -1, 207, 208, -1, 210, 211, 212, 213, + 214, 215, 216, -1, 218, -1, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, -1, -1, 233, + 234, 235, 236, -1, 238, 239, 240, 241, 242, 243, + 244, 245, -1, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, -1, + -1, 275, 276, 277, 278, -1, -1, 281, 282, 283, + 284, 285, -1, 287, 288, -1, -1, 291, 292, 293, + -1, -1, 296, 297, -1, 299, 300, 301, -1, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + -1, -1, -1, -1, 318, 319, -1, 321, 322, 323, + -1, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, 342, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, -1, 359, 360, 361, 362, 363, + 364, -1, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, 380, 381, 382, 383, + 384, 385, 386, -1, 388, 389, -1, 391, 392, 393, + 394, 395, -1, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, -1, 410, -1, -1, -1, + 414, 415, -1, 417, 418, 419, 420, 421, 422, 423, + -1, 425, 426, 427, -1, -1, 430, 431, -1, 433, + -1, -1, 436, 437, 438, 439, 440, 441, 442, 443, + -1, -1, 446, 447, 448, -1, 450, 451, 452, 453, + -1, 455, 456, 457, 458, 459, -1, 461, -1, 463, + 464, 465, 466, 467, 468, 469, 470, 471, -1, 22, + 474, -1, -1, 477, 478, 479, 480, 481, 482, 32, + -1, 34, 35, -1, -1, -1, -1, 22, -1, -1, + 494, 495, 496, 497, -1, -1, -1, 32, -1, 52, + -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, + -1, -1, -1, -1, -1, -1, -1, 52, -1, -1, + -1, -1, 75, -1, -1, -1, 61, -1, -1, -1, -1, -1, -1, 86, -1, -1, -1, -1, -1, -1, - 111, -1, -1, -1, -1, 98, -1, 100, -1, -1, - -1, -1, -1, -1, -1, 126, 127, -1, 111, -1, - -1, -1, -1, -1, -1, -1, 137, -1, -1, -1, - -1, -1, 143, 126, 127, -1, -1, -1, -1, -1, - 151, -1, -1, -1, 137, -1, -1, -1, -1, -1, - 143, -1, -1, -1, -1, -1, 167, -1, 151, -1, - 171, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 167, -1, -1, -1, 171, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 75, -1, -1, -1, -1, 98, -1, 100, -1, -1, + -1, 86, -1, -1, -1, -1, -1, -1, 111, -1, + -1, -1, -1, 98, -1, 100, -1, -1, -1, -1, + -1, -1, -1, 126, 127, -1, 111, -1, -1, -1, + -1, -1, -1, -1, 137, -1, -1, -1, -1, -1, + 143, 126, 127, -1, -1, -1, -1, -1, 151, -1, + -1, -1, 137, -1, -1, -1, -1, -1, 143, -1, + -1, -1, -1, -1, 167, -1, 151, -1, 171, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 167, -1, -1, -1, 171, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 213, -1, -1, -1, -1, -1, -1, -1, 239, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 213, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, 239, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 239, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 314, 315, 316, -1, -1, -1, -1, - -1, 322, -1, -1, 325, -1, -1, -1, -1, -1, -1, 314, 315, 316, -1, -1, -1, -1, -1, 322, - -1, -1, 325, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 354, -1, -1, -1, -1, -1, -1, - -1, -1, 363, -1, -1, -1, -1, -1, -1, -1, - -1, 354, -1, -1, -1, -1, -1, -1, 379, -1, - 363, -1, -1, -1, -1, 386, -1, -1, -1, 390, - -1, -1, -1, -1, -1, -1, 379, -1, -1, 400, + -1, -1, 325, -1, -1, -1, -1, -1, -1, 314, + 315, 316, -1, -1, -1, -1, -1, 322, -1, -1, + 325, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 354, -1, -1, -1, -1, -1, -1, -1, -1, + 363, -1, -1, -1, -1, -1, -1, -1, -1, 354, + -1, -1, -1, -1, -1, -1, 379, -1, 363, -1, -1, -1, -1, 386, -1, -1, -1, 390, -1, -1, - -1, 412, -1, -1, -1, 416, -1, 400, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 412, - -1, -1, -1, 416, -1, 436, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 449, -1, - -1, -1, -1, 436, 455, -1, -1, -1, -1, 460, - -1, -1, -1, 464, -1, -1, 449, -1, -1, -1, - -1, -1, 455, -1, -1, 476, -1, 460, -1, -1, + -1, -1, -1, -1, 379, -1, -1, 400, -1, -1, + -1, 386, -1, -1, -1, 390, -1, -1, -1, 412, + -1, -1, -1, 416, -1, 400, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 412, -1, -1, + -1, 416, -1, 436, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 449, -1, -1, -1, + -1, 436, 455, -1, -1, -1, -1, 460, -1, -1, + -1, 464, -1, -1, 449, -1, -1, -1, -1, -1, + 455, -1, -1, 476, -1, 460, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 476, -1, -1, -1, -1, -1, 500, + -1, 476, -1, -1, -1, -1, -1, 500, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 514, -1, -1, -1, 500, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 514 + -1, 514, -1, -1, -1, 500, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 514 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -18817,10 +18852,10 @@ static const yytype_uint16 yystos[] = 528, 529, 540, 549, 551, 556, 572, 575, 576, 578, 582, 586, 593, 595, 597, 598, 646, 652, 655, 656, 674, 675, 676, 677, 679, 681, 682, 686, 739, 740, - 907, 910, 913, 920, 921, 923, 926, 927, 928, 935, - 939, 945, 948, 953, 957, 958, 959, 962, 965, 966, - 967, 971, 972, 974, 430, 479, 596, 202, 370, 381, - 416, 466, 108, 191, 960, 596, 3, 22, 23, 24, + 908, 911, 914, 921, 922, 924, 927, 928, 929, 936, + 940, 946, 949, 954, 958, 959, 960, 963, 966, 967, + 968, 972, 973, 975, 430, 479, 596, 202, 370, 381, + 416, 466, 108, 191, 961, 596, 3, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32, 33, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 59, 60, 61, 62, 63, 64, 67, @@ -18860,11 +18895,11 @@ static const yytype_uint16 yystos[] = 457, 458, 459, 460, 461, 463, 464, 465, 466, 467, 468, 469, 470, 471, 474, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 542, 816, 896, 900, - 977, 978, 979, 3, 175, 246, 409, 542, 922, 977, + 492, 493, 494, 495, 496, 497, 542, 817, 897, 901, + 978, 979, 980, 3, 175, 246, 409, 542, 923, 978, 289, 596, 55, 171, 514, 669, 177, 240, 294, 313, - 370, 420, 422, 439, 445, 448, 580, 644, 919, 5, - 30, 325, 542, 543, 895, 3, 30, 34, 35, 36, + 370, 420, 422, 439, 445, 448, 580, 644, 920, 5, + 30, 325, 542, 543, 896, 3, 30, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 49, 53, 54, 55, 56, 57, 58, 65, 66, 71, 72, 74, 79, 80, 81, 82, 83, 89, 93, 100, 101, 108, 112, @@ -18880,39 +18915,39 @@ static const yytype_uint16 yystos[] = 418, 424, 426, 427, 428, 429, 432, 434, 435, 438, 444, 445, 449, 454, 460, 461, 462, 464, 472, 473, 475, 476, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 548, 977, 981, 983, 24, 81, 97, + 491, 492, 493, 548, 978, 982, 984, 24, 81, 97, 146, 156, 168, 173, 202, 245, 249, 319, 334, 367, 370, 381, 384, 402, 416, 422, 423, 433, 439, 466, - 580, 647, 648, 651, 596, 895, 100, 137, 464, 514, + 580, 647, 648, 651, 596, 896, 100, 137, 464, 514, 529, 540, 549, 551, 572, 575, 576, 582, 586, 595, - 598, 646, 652, 655, 656, 674, 907, 910, 913, 920, - 921, 931, 935, 939, 945, 948, 953, 962, 965, 971, - 972, 974, 108, 75, 213, 66, 79, 81, 158, 231, + 598, 646, 652, 655, 656, 674, 908, 911, 914, 921, + 922, 932, 936, 940, 946, 949, 954, 963, 966, 972, + 973, 975, 108, 75, 213, 66, 79, 81, 158, 231, 280, 290, 302, 320, 366, 411, 432, 434, 438, 460, 514, 541, 542, 543, 675, 740, 742, 744, 754, 761, - 762, 816, 818, 819, 108, 5, 542, 544, 946, 946, - 542, 895, 30, 177, 240, 385, 426, 430, 542, 963, - 964, 969, 596, 30, 132, 695, 696, 177, 240, 370, - 385, 426, 940, 941, 969, 596, 542, 674, 686, 970, - 542, 761, 416, 692, 541, 172, 514, 950, 514, 342, - 687, 688, 895, 687, 675, 676, 965, 0, 517, 122, + 762, 817, 819, 820, 108, 5, 542, 544, 947, 947, + 542, 896, 30, 177, 240, 385, 426, 430, 542, 964, + 965, 970, 596, 30, 132, 695, 696, 177, 240, 370, + 385, 426, 941, 942, 970, 596, 542, 674, 686, 971, + 542, 761, 416, 692, 541, 172, 514, 951, 514, 342, + 687, 688, 896, 687, 675, 676, 966, 0, 517, 122, 212, 451, 147, 217, 295, 444, 698, 699, 744, 744, - 675, 677, 679, 518, 464, 929, 30, 426, 430, 674, - 970, 191, 541, 895, 191, 541, 191, 761, 191, 541, + 675, 677, 679, 518, 464, 930, 30, 426, 430, 674, + 971, 191, 541, 896, 191, 541, 191, 761, 191, 541, 274, 544, 512, 516, 545, 546, 514, 82, 108, 173, - 202, 245, 370, 381, 416, 439, 466, 925, 108, 674, + 202, 245, 370, 381, 416, 439, 466, 926, 108, 674, 541, 420, 422, 420, 422, 352, 191, 541, 541, 377, - 173, 245, 342, 381, 416, 466, 653, 202, 30, 895, + 173, 245, 342, 381, 416, 466, 653, 202, 30, 896, 191, 548, 251, 433, 107, 416, 416, 466, 374, 377, - 191, 542, 649, 902, 191, 892, 895, 191, 895, 514, - 585, 294, 422, 931, 3, 460, 932, 934, 935, 937, - 938, 977, 981, 929, 542, 544, 922, 946, 514, 514, + 191, 542, 649, 903, 191, 893, 896, 191, 896, 514, + 585, 294, 422, 932, 3, 460, 933, 935, 936, 938, + 939, 978, 982, 930, 542, 544, 923, 947, 514, 514, 166, 514, 675, 762, 514, 514, 541, 514, 514, 171, 514, 514, 514, 514, 675, 740, 744, 754, 507, 545, 40, 542, 755, 756, 755, 379, 518, 678, 37, 42, 101, 172, 208, 224, 234, 268, 314, 321, 361, 380, 449, 758, 756, 40, 542, 755, 757, 500, 766, 544, - 171, 503, 514, 514, 908, 964, 964, 964, 497, 223, + 171, 503, 514, 514, 909, 965, 965, 965, 497, 223, 516, 289, 4, 6, 7, 8, 9, 10, 39, 54, 56, 57, 65, 71, 72, 83, 112, 115, 117, 136, 152, 159, 164, 181, 182, 215, 216, 218, 246, 267, @@ -18920,248 +18955,248 @@ static const yytype_uint16 yystos[] = 435, 461, 498, 505, 506, 507, 512, 514, 519, 520, 522, 523, 542, 544, 675, 729, 778, 781, 784, 785, 786, 788, 789, 790, 791, 793, 794, 809, 811, 812, - 813, 814, 815, 816, 817, 819, 820, 835, 836, 847, - 869, 874, 882, 883, 884, 896, 897, 898, 881, 883, - 940, 940, 544, 940, 497, 171, 428, 503, 516, 545, - 761, 954, 3, 170, 172, 464, 935, 949, 951, 170, - 952, 809, 853, 854, 687, 518, 514, 904, 515, 515, - 515, 528, 171, 294, 559, 954, 30, 132, 693, 693, - 59, 693, 161, 166, 237, 286, 704, 706, 707, 732, - 734, 735, 736, 180, 289, 454, 289, 698, 699, 514, - 541, 417, 968, 497, 223, 152, 26, 32, 137, 293, - 350, 354, 386, 457, 534, 537, 538, 350, 152, 40, - 60, 106, 201, 250, 260, 272, 304, 350, 356, 381, - 386, 400, 537, 587, 590, 152, 350, 386, 537, 152, - 350, 386, 537, 152, 40, 961, 809, 875, 547, 548, - 546, 3, 30, 37, 42, 49, 55, 81, 83, 89, - 101, 132, 170, 172, 175, 176, 193, 208, 221, 222, - 224, 234, 236, 246, 268, 277, 299, 301, 321, 361, - 380, 391, 409, 418, 438, 462, 464, 515, 809, 856, - 857, 899, 905, 977, 982, 809, 416, 541, 542, 515, - 514, 633, 370, 580, 644, 274, 911, 40, 191, 542, - 579, 466, 191, 541, 191, 541, 976, 191, 541, 191, - 541, 89, 916, 152, 480, 90, 129, 307, 421, 191, - 542, 152, 516, 903, 63, 357, 518, 650, 152, 518, - 650, 152, 289, 583, 584, 809, 905, 352, 515, 518, - 4, 159, 289, 435, 505, 506, 544, 589, 592, 898, - 930, 932, 933, 936, 931, 428, 514, 664, 668, 171, - 809, 854, 514, 3, 68, 69, 109, 110, 113, 114, - 188, 189, 252, 253, 254, 255, 256, 257, 258, 259, - 262, 263, 375, 376, 470, 471, 494, 495, 544, 796, - 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, - 807, 859, 860, 756, 757, 809, 541, 809, 861, 505, - 506, 542, 810, 811, 836, 847, 863, 514, 809, 853, - 864, 809, 58, 171, 232, 429, 809, 854, 867, 809, - 515, 543, 514, 418, 712, 713, 713, 695, 696, 744, - 219, 690, 224, 37, 224, 380, 758, 224, 299, 759, - 744, 759, 224, 758, 514, 224, 759, 224, 148, 199, - 746, 224, 713, 514, 543, 514, 713, 296, 542, 544, - 947, 809, 942, 944, 856, 3, 37, 42, 49, 54, - 55, 56, 57, 71, 72, 81, 83, 89, 101, 112, - 115, 164, 170, 172, 176, 193, 208, 215, 216, 218, - 221, 222, 224, 234, 236, 246, 267, 268, 269, 277, - 282, 299, 301, 321, 339, 361, 365, 380, 387, 391, - 394, 409, 418, 426, 427, 438, 444, 461, 464, 772, - 774, 775, 777, 779, 781, 783, 785, 786, 787, 789, - 790, 793, 794, 858, 901, 977, 980, 40, 235, 542, - 514, 512, 675, 463, 792, 809, 873, 792, 792, 514, - 514, 780, 780, 324, 675, 514, 782, 520, 71, 72, - 792, 809, 780, 514, 514, 478, 500, 514, 795, 514, - 795, 809, 809, 809, 148, 885, 886, 809, 854, 855, - 675, 809, 853, 543, 837, 838, 839, 9, 548, 516, - 545, 876, 545, 514, 544, 514, 514, 544, 898, 3, - 8, 11, 15, 16, 17, 18, 19, 20, 21, 36, - 40, 46, 53, 80, 176, 193, 198, 221, 222, 236, - 274, 277, 291, 294, 391, 498, 501, 502, 503, 505, - 506, 507, 508, 509, 510, 845, 846, 847, 849, 879, - 477, 821, 301, 809, 518, 690, 514, 544, 690, 3, - 117, 240, 544, 589, 794, 943, 104, 944, 944, 542, - 40, 542, 515, 518, 929, 518, 515, 688, 892, 893, - 40, 954, 192, 352, 219, 386, 677, 677, 30, 700, - 701, 809, 59, 677, 694, 163, 271, 720, 226, 272, - 338, 389, 451, 4, 9, 30, 715, 809, 505, 506, - 716, 717, 809, 811, 732, 733, 707, 706, 704, 705, - 166, 735, 284, 737, 59, 683, 684, 685, 747, 810, - 883, 883, 704, 732, 854, 904, 235, 541, 74, 82, - 93, 168, 191, 328, 445, 542, 615, 625, 640, 82, - 93, 550, 93, 550, 514, 428, 514, 613, 244, 448, - 613, 93, 518, 428, 541, 3, 777, 589, 59, 591, - 589, 589, 106, 250, 260, 59, 428, 476, 500, 588, - 265, 370, 588, 590, 761, 93, 428, 550, 370, 541, - 428, 370, 960, 542, 664, 513, 524, 856, 856, 857, - 518, 698, 699, 13, 14, 221, 221, 428, 428, 542, - 632, 637, 476, 667, 541, 377, 342, 381, 416, 466, - 653, 152, 100, 576, 598, 912, 913, 972, 144, 774, - 274, 198, 581, 541, 274, 577, 587, 274, 514, 633, - 40, 274, 633, 274, 514, 654, 191, 542, 627, 917, - 548, 152, 171, 594, 649, 547, 516, 902, 892, 895, - 895, 902, 515, 518, 13, 931, 937, 4, 898, 4, - 898, 544, 548, 666, 673, 55, 102, 123, 141, 145, - 167, 170, 186, 279, 287, 309, 336, 670, 947, 40, - 515, 809, 515, 171, 518, 515, 317, 862, 515, 810, - 810, 11, 15, 16, 19, 20, 21, 198, 221, 291, - 501, 502, 503, 505, 506, 507, 508, 509, 510, 847, - 810, 515, 763, 764, 818, 166, 171, 865, 866, 518, - 515, 40, 867, 854, 867, 867, 171, 515, 40, 755, - 514, 893, 4, 9, 542, 708, 710, 711, 883, 881, - 177, 240, 416, 420, 422, 448, 541, 691, 473, 767, - 744, 744, 224, 744, 289, 454, 760, 744, 224, 883, - 744, 744, 281, 281, 514, 744, 543, 768, 769, 514, - 543, 768, 518, 515, 518, 516, 514, 777, 514, 514, - 516, 39, 776, 514, 796, 797, 798, 799, 800, 801, - 802, 803, 804, 805, 806, 807, 808, 515, 518, 780, - 551, 655, 656, 674, 909, 953, 965, 854, 855, 514, - 472, 870, 871, 809, 855, 898, 809, 840, 841, 842, - 843, 792, 792, 8, 15, 16, 19, 20, 21, 501, - 502, 503, 505, 506, 507, 508, 509, 510, 542, 845, - 850, 515, 854, 426, 426, 898, 898, 514, 542, 352, - 890, 166, 513, 515, 518, 524, 518, 521, 507, 546, - 854, 898, 809, 808, 808, 774, 809, 809, 809, 809, - 809, 809, 809, 809, 5, 548, 906, 426, 45, 413, - 880, 902, 809, 809, 514, 675, 868, 132, 159, 274, - 279, 284, 435, 446, 809, 279, 514, 809, 428, 53, - 176, 193, 198, 236, 391, 809, 809, 809, 809, 809, - 809, 809, 809, 809, 809, 30, 38, 396, 844, 512, - 516, 878, 180, 162, 822, 365, 514, 836, 884, 171, - 741, 856, 741, 514, 544, 542, 541, 949, 541, 957, - 809, 518, 515, 249, 274, 689, 454, 956, 541, 553, - 514, 542, 558, 568, 569, 571, 41, 126, 702, 518, - 454, 702, 265, 677, 365, 366, 505, 506, 717, 719, - 811, 389, 226, 290, 312, 312, 518, 509, 4, 718, - 898, 718, 365, 366, 719, 541, 891, 278, 393, 738, - 514, 893, 894, 518, 180, 454, 198, 180, 219, 733, - 705, 515, 350, 537, 514, 191, 625, 895, 226, 274, - 226, 454, 514, 618, 773, 774, 895, 542, 191, 895, - 191, 542, 26, 137, 386, 533, 536, 548, 609, 623, - 895, 548, 617, 636, 895, 534, 895, 350, 386, 537, - 587, 589, 902, 895, 589, 902, 895, 589, 350, 386, - 537, 895, 895, 895, 895, 350, 386, 537, 895, 895, - 544, 506, 809, 875, 698, 698, 698, 462, 857, 192, - 355, 697, 809, 809, 279, 544, 924, 279, 924, 542, - 333, 663, 515, 518, 287, 171, 428, 658, 911, 579, - 466, 541, 541, 976, 541, 541, 541, 294, 644, 514, - 675, 152, 3, 514, 514, 152, 152, 236, 542, 615, - 625, 628, 631, 641, 643, 476, 478, 620, 151, 674, - 152, 476, 918, 152, 515, 856, 40, 274, 289, 542, - 3, 650, 547, 650, 289, 650, 583, 809, 664, 507, - 514, 589, 665, 815, 936, 515, 518, 40, 662, 544, - 662, 274, 279, 336, 662, 59, 662, 774, 515, 809, - 809, 809, 865, 774, 810, 810, 810, 810, 810, 810, - 132, 274, 284, 810, 810, 810, 810, 810, 810, 810, - 810, 810, 810, 515, 518, 40, 765, 809, 809, 866, - 865, 774, 515, 515, 515, 854, 774, 893, 515, 312, - 509, 312, 366, 509, 514, 514, 690, 420, 422, 420, - 422, 541, 692, 692, 692, 809, 180, 721, 760, 760, - 744, 809, 514, 744, 166, 760, 514, 543, 751, 760, - 774, 515, 518, 768, 515, 942, 3, 858, 39, 776, - 542, 771, 771, 3, 512, 512, 898, 428, 428, 428, - 428, 774, 515, 513, 854, 809, 139, 871, 872, 515, - 515, 515, 524, 518, 521, 516, 515, 515, 497, 497, - 515, 515, 893, 514, 809, 887, 542, 809, 809, 837, - 886, 515, 515, 515, 497, 810, 810, 145, 854, 171, - 132, 159, 279, 284, 435, 446, 514, 145, 850, 809, - 413, 880, 809, 868, 809, 428, 514, 675, 809, 875, - 547, 514, 514, 155, 823, 742, 743, 767, 698, 767, - 898, 808, 904, 904, 249, 514, 743, 473, 955, 40, - 59, 554, 564, 571, 876, 518, 741, 503, 499, 703, - 701, 291, 845, 848, 703, 4, 898, 719, 290, 451, - 716, 518, 243, 893, 683, 59, 883, 514, 543, 59, - 265, 428, 809, 274, 640, 514, 152, 514, 618, 202, - 637, 638, 599, 40, 175, 608, 634, 599, 26, 137, - 354, 356, 386, 530, 531, 532, 538, 539, 152, 650, - 152, 650, 609, 623, 609, 515, 518, 544, 602, 503, - 516, 515, 518, 428, 370, 93, 428, 550, 370, 428, - 428, 428, 370, 961, 524, 513, 524, 697, 697, 697, - 857, 281, 281, 515, 514, 657, 3, 403, 404, 544, - 672, 632, 663, 581, 541, 577, 514, 40, 633, 654, - 911, 352, 416, 544, 573, 574, 579, 673, 637, 541, - 541, 976, 541, 515, 518, 287, 613, 287, 289, 612, - 895, 476, 975, 541, 613, 40, 541, 515, 416, 809, - 152, 541, 594, 902, 660, 671, 936, 666, 544, 544, - 279, 637, 507, 637, 544, 507, 637, 544, 515, 515, - 866, 171, 132, 284, 514, 766, 763, 514, 515, 515, - 515, 542, 708, 767, 692, 692, 692, 692, 541, 541, - 541, 59, 185, 730, 760, 893, 514, 748, 749, 750, - 812, 814, 893, 166, 80, 770, 769, 515, 515, 512, - 774, 515, 518, 515, 898, 513, 898, 515, 797, 799, - 800, 801, 800, 801, 801, 515, 424, 809, 143, 809, - 840, 850, 795, 795, 515, 809, 887, 888, 889, 40, - 198, 515, 890, 808, 809, 36, 36, 809, 515, 809, - 171, 514, 858, 809, 515, 145, 810, 810, 145, 145, - 809, 809, 513, 524, 514, 877, 699, 473, 809, 300, - 827, 518, 721, 697, 721, 515, 909, 809, 358, 562, - 542, 265, 320, 117, 303, 514, 552, 674, 515, 518, - 558, 955, 809, 163, 230, 514, 703, 290, 541, 515, - 894, 180, 675, 676, 883, 894, 895, 895, 515, 152, - 638, 625, 638, 599, 627, 518, 515, 119, 206, 272, - 274, 624, 514, 33, 59, 645, 634, 74, 80, 93, - 117, 119, 206, 274, 279, 328, 344, 445, 454, 604, - 605, 619, 175, 117, 190, 274, 613, 588, 107, 117, - 175, 274, 402, 405, 590, 613, 386, 532, 439, 895, - 542, 536, 3, 37, 42, 49, 55, 81, 83, 89, - 101, 170, 172, 175, 176, 193, 208, 221, 222, 224, - 234, 236, 246, 268, 273, 277, 291, 299, 301, 321, - 361, 380, 387, 391, 409, 418, 438, 444, 464, 505, - 506, 544, 589, 600, 639, 774, 848, 899, 977, 983, - 548, 636, 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 664, 875, 875, 515, 515, 515, 698, 107, - 370, 516, 588, 672, 514, 514, 631, 674, 918, 40, - 644, 191, 541, 515, 518, 581, 515, 515, 577, 514, - 40, 622, 620, 628, 86, 585, 107, 272, 633, 674, - 654, 674, 627, 454, 915, 650, 515, 518, 637, 810, - 171, 514, 858, 768, 515, 518, 515, 721, 541, 541, - 541, 541, 30, 103, 181, 364, 514, 722, 723, 724, - 725, 726, 727, 728, 809, 809, 475, 824, 515, 811, - 851, 852, 198, 180, 745, 749, 515, 751, 752, 753, - 902, 776, 898, 776, 542, 776, 513, 513, 809, 518, - 515, 542, 809, 811, 809, 809, 809, 858, 515, 809, - 36, 36, 809, 809, 145, 515, 506, 875, 515, 856, - 515, 809, 515, 514, 542, 828, 730, 515, 730, 544, - 515, 882, 460, 415, 453, 563, 542, 557, 567, 289, - 560, 503, 571, 562, 850, 59, 515, 515, 459, 460, - 680, 599, 625, 515, 515, 476, 630, 120, 194, 204, - 119, 456, 809, 117, 40, 514, 902, 895, 810, 120, - 194, 119, 279, 226, 541, 630, 88, 645, 191, 279, - 589, 809, 645, 279, 505, 506, 592, 542, 774, 650, - 650, 3, 246, 409, 899, 903, 503, 428, 428, 513, - 513, 697, 515, 515, 542, 664, 454, 659, 661, 673, - 637, 515, 975, 40, 416, 809, 416, 274, 514, 544, - 514, 918, 631, 151, 674, 149, 200, 612, 122, 137, - 327, 975, 107, 918, 476, 973, 40, 289, 542, 914, - 514, 671, 810, 858, 515, 515, 9, 351, 714, 730, - 514, 388, 514, 515, 518, 542, 825, 826, 335, 731, - 518, 515, 514, 543, 59, 515, 198, 515, 752, 513, - 774, 887, 513, 191, 515, 809, 809, 809, 524, 513, - 524, 515, 515, 542, 829, 824, 544, 824, 518, 459, - 876, 515, 518, 91, 562, 809, 515, 894, 894, 344, - 630, 514, 621, 599, 515, 190, 514, 809, 274, 605, - 630, 633, 895, 40, 152, 770, 903, 509, 600, 895, - 895, 515, 588, 124, 515, 515, 620, 674, 674, 541, - 152, 673, 40, 515, 895, 975, 30, 85, 94, 118, - 190, 203, 402, 405, 616, 616, 366, 366, 40, 64, - 74, 240, 416, 809, 541, 514, 542, 561, 570, 818, - 515, 515, 514, 824, 854, 514, 854, 724, 40, 518, - 809, 454, 709, 811, 883, 893, 756, 514, 756, 809, - 875, 875, 309, 830, 731, 731, 674, 303, 674, 557, - 289, 514, 555, 541, 599, 548, 626, 629, 406, 468, - 606, 607, 514, 601, 809, 515, 248, 642, 190, 454, - 535, 509, 439, 664, 544, 918, 612, 973, 514, 541, - 515, 674, 620, 585, 674, 74, 292, 74, 674, 915, - 809, 80, 565, 515, 518, 565, 9, 731, 515, 723, - 515, 828, 826, 368, 515, 883, 513, 513, 513, 59, - 698, 709, 709, 563, 93, 570, 133, 633, 503, 515, - 518, 587, 515, 272, 614, 172, 308, 392, 289, 610, - 611, 635, 601, 809, 439, 40, 514, 973, 612, 975, - 973, 292, 292, 514, 515, 902, 566, 902, 918, 561, - 566, 515, 709, 515, 711, 515, 853, 183, 337, 366, - 831, 459, 895, 515, 275, 451, 642, 600, 629, 515, - 607, 204, 122, 451, 289, 635, 289, 610, 674, 570, - 565, 702, 767, 702, 53, 104, 441, 809, 832, 833, - 832, 832, 515, 674, 767, 386, 611, 63, 272, 357, - 386, 603, 603, 973, 515, 566, 703, 703, 833, 365, - 165, 323, 165, 323, 148, 834, 834, 834, 569, 599, - 25, 117, 279, 918, 702, 36, 104, 180, 272, 425, - 767, 767, 703, 833, 365, 297 + 813, 814, 815, 816, 817, 818, 820, 821, 836, 837, + 848, 870, 875, 883, 884, 885, 897, 898, 899, 882, + 884, 941, 941, 544, 941, 497, 171, 428, 503, 516, + 545, 761, 955, 3, 170, 172, 464, 936, 950, 952, + 170, 953, 809, 854, 855, 687, 518, 514, 905, 515, + 515, 515, 528, 171, 294, 559, 955, 30, 132, 693, + 693, 59, 693, 161, 166, 237, 286, 704, 706, 707, + 732, 734, 735, 736, 180, 289, 454, 289, 698, 699, + 514, 541, 417, 969, 497, 223, 152, 26, 32, 137, + 293, 350, 354, 386, 457, 534, 537, 538, 350, 152, + 40, 60, 106, 201, 250, 260, 272, 304, 350, 356, + 381, 386, 400, 537, 587, 590, 152, 350, 386, 537, + 152, 350, 386, 537, 152, 40, 962, 809, 876, 547, + 548, 546, 3, 30, 37, 42, 49, 55, 81, 83, + 89, 101, 132, 170, 172, 175, 176, 193, 208, 221, + 222, 224, 234, 236, 246, 268, 277, 299, 301, 321, + 361, 380, 391, 409, 418, 438, 462, 464, 515, 809, + 857, 858, 900, 906, 978, 983, 809, 416, 541, 542, + 515, 514, 633, 370, 580, 644, 274, 912, 40, 191, + 542, 579, 466, 191, 541, 191, 541, 977, 191, 541, + 191, 541, 89, 917, 152, 480, 90, 129, 307, 421, + 191, 542, 152, 516, 904, 63, 357, 518, 650, 152, + 518, 650, 152, 289, 583, 584, 809, 906, 352, 515, + 518, 4, 159, 289, 435, 505, 506, 544, 589, 592, + 899, 931, 933, 934, 937, 932, 428, 514, 664, 668, + 171, 809, 855, 514, 3, 68, 69, 109, 110, 113, + 114, 188, 189, 252, 253, 254, 255, 256, 257, 258, + 259, 262, 263, 375, 376, 470, 471, 494, 495, 544, + 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, + 806, 807, 860, 861, 756, 757, 809, 541, 809, 862, + 505, 506, 542, 810, 811, 837, 848, 864, 514, 809, + 854, 865, 809, 58, 171, 232, 429, 809, 855, 868, + 809, 515, 543, 514, 418, 712, 713, 713, 695, 696, + 744, 219, 690, 224, 37, 224, 380, 758, 224, 299, + 759, 744, 759, 224, 758, 514, 224, 759, 224, 148, + 199, 746, 224, 713, 514, 543, 514, 713, 296, 542, + 544, 948, 809, 943, 945, 857, 3, 37, 42, 49, + 54, 55, 56, 57, 71, 72, 81, 83, 89, 101, + 112, 115, 164, 170, 172, 176, 193, 208, 215, 216, + 218, 221, 222, 224, 234, 236, 246, 267, 268, 269, + 277, 282, 299, 301, 321, 339, 361, 365, 380, 387, + 391, 394, 409, 418, 426, 427, 438, 444, 461, 464, + 772, 774, 775, 777, 779, 781, 783, 785, 786, 787, + 789, 790, 793, 794, 859, 902, 978, 981, 40, 235, + 542, 514, 512, 675, 463, 792, 809, 874, 792, 792, + 514, 514, 780, 780, 324, 675, 514, 782, 520, 71, + 72, 792, 809, 780, 514, 514, 478, 500, 514, 795, + 514, 795, 809, 809, 809, 148, 886, 887, 809, 855, + 856, 675, 809, 854, 543, 838, 839, 840, 9, 548, + 516, 545, 877, 545, 514, 544, 514, 514, 544, 899, + 3, 8, 11, 15, 16, 17, 18, 19, 20, 21, + 36, 40, 46, 53, 80, 176, 193, 198, 221, 222, + 236, 274, 277, 291, 294, 391, 498, 501, 502, 503, + 505, 506, 507, 508, 509, 510, 846, 847, 848, 850, + 880, 477, 822, 301, 809, 518, 690, 514, 544, 690, + 3, 117, 240, 544, 589, 794, 944, 104, 945, 945, + 542, 40, 542, 515, 518, 930, 518, 515, 688, 893, + 894, 40, 955, 192, 352, 219, 386, 677, 677, 30, + 700, 701, 809, 59, 677, 694, 163, 271, 720, 226, + 272, 338, 389, 451, 4, 9, 30, 715, 809, 505, + 506, 716, 717, 809, 811, 732, 733, 707, 706, 704, + 705, 166, 735, 284, 737, 59, 683, 684, 685, 747, + 810, 884, 884, 704, 732, 855, 905, 235, 541, 74, + 82, 93, 168, 191, 328, 445, 542, 615, 625, 640, + 82, 93, 550, 93, 550, 514, 428, 514, 613, 244, + 448, 613, 93, 518, 428, 541, 3, 777, 589, 59, + 591, 589, 589, 106, 250, 260, 59, 428, 476, 500, + 588, 265, 370, 588, 590, 761, 93, 428, 550, 370, + 541, 428, 370, 961, 542, 664, 513, 524, 857, 857, + 858, 518, 698, 699, 13, 14, 221, 221, 428, 428, + 542, 632, 637, 476, 667, 541, 377, 342, 381, 416, + 466, 653, 152, 100, 576, 598, 913, 914, 973, 144, + 774, 274, 198, 581, 541, 274, 577, 587, 274, 514, + 633, 40, 274, 633, 274, 514, 654, 191, 542, 627, + 918, 548, 152, 171, 594, 649, 547, 516, 903, 893, + 896, 896, 903, 515, 518, 13, 932, 938, 4, 899, + 4, 899, 544, 548, 666, 673, 55, 102, 123, 141, + 145, 167, 170, 186, 279, 287, 309, 336, 670, 948, + 40, 515, 809, 515, 171, 518, 515, 317, 863, 515, + 810, 810, 11, 15, 16, 19, 20, 21, 198, 221, + 291, 501, 502, 503, 505, 506, 507, 508, 509, 510, + 848, 810, 515, 763, 764, 819, 166, 171, 866, 867, + 518, 515, 40, 868, 855, 868, 868, 171, 515, 40, + 755, 514, 894, 4, 9, 542, 708, 710, 711, 884, + 882, 177, 240, 416, 420, 422, 448, 541, 691, 473, + 767, 744, 744, 224, 744, 289, 454, 760, 744, 224, + 884, 744, 744, 281, 281, 514, 744, 543, 768, 769, + 514, 543, 768, 518, 515, 518, 516, 514, 777, 514, + 514, 516, 39, 776, 514, 796, 797, 798, 799, 800, + 801, 802, 803, 804, 805, 806, 807, 808, 515, 518, + 780, 551, 655, 656, 674, 910, 954, 966, 855, 856, + 514, 472, 871, 872, 809, 856, 899, 809, 841, 842, + 843, 844, 792, 792, 8, 15, 16, 19, 20, 21, + 501, 502, 503, 505, 506, 507, 508, 509, 510, 542, + 846, 851, 515, 855, 426, 426, 899, 899, 514, 542, + 352, 891, 166, 513, 515, 518, 524, 518, 521, 507, + 546, 855, 899, 809, 808, 808, 774, 809, 809, 809, + 809, 809, 809, 809, 809, 5, 548, 907, 426, 45, + 413, 881, 903, 809, 809, 514, 675, 869, 132, 159, + 274, 279, 284, 435, 446, 809, 279, 514, 809, 428, + 53, 176, 193, 198, 236, 391, 809, 809, 809, 809, + 809, 809, 809, 809, 809, 809, 30, 38, 396, 845, + 512, 516, 879, 180, 162, 823, 365, 514, 837, 885, + 171, 741, 857, 741, 514, 544, 542, 541, 950, 541, + 958, 809, 518, 515, 249, 274, 689, 454, 957, 541, + 553, 514, 542, 558, 568, 569, 571, 41, 126, 702, + 518, 454, 702, 265, 677, 365, 366, 505, 506, 717, + 719, 811, 389, 226, 290, 312, 312, 518, 509, 4, + 718, 899, 718, 365, 366, 719, 541, 892, 278, 393, + 738, 514, 894, 895, 518, 180, 454, 198, 180, 219, + 733, 705, 515, 350, 537, 514, 191, 625, 896, 226, + 274, 226, 454, 514, 618, 773, 774, 896, 542, 191, + 896, 191, 542, 26, 137, 386, 533, 536, 548, 609, + 623, 896, 548, 617, 636, 896, 534, 896, 350, 386, + 537, 587, 589, 903, 896, 589, 903, 896, 589, 350, + 386, 537, 896, 896, 896, 896, 350, 386, 537, 896, + 896, 544, 506, 809, 876, 698, 698, 698, 462, 858, + 192, 355, 697, 809, 809, 279, 544, 925, 279, 925, + 542, 333, 663, 515, 518, 287, 171, 428, 658, 912, + 579, 466, 541, 541, 977, 541, 541, 541, 294, 644, + 514, 675, 152, 3, 514, 514, 152, 152, 236, 542, + 615, 625, 628, 631, 641, 643, 476, 478, 620, 151, + 674, 152, 476, 919, 152, 515, 857, 40, 274, 289, + 542, 3, 650, 547, 650, 289, 650, 583, 809, 664, + 507, 512, 514, 589, 665, 815, 816, 937, 515, 518, + 40, 662, 544, 662, 274, 279, 336, 662, 59, 662, + 774, 515, 809, 809, 809, 866, 774, 810, 810, 810, + 810, 810, 810, 132, 274, 284, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 515, 518, 40, 765, + 809, 809, 867, 866, 774, 515, 515, 515, 855, 774, + 894, 515, 312, 509, 312, 366, 509, 514, 514, 690, + 420, 422, 420, 422, 541, 692, 692, 692, 809, 180, + 721, 760, 760, 744, 809, 514, 744, 166, 760, 514, + 543, 751, 760, 774, 515, 518, 768, 515, 943, 3, + 859, 39, 776, 542, 771, 771, 3, 512, 512, 899, + 428, 428, 428, 428, 774, 515, 513, 855, 809, 139, + 872, 873, 515, 515, 515, 524, 518, 521, 516, 515, + 515, 497, 497, 515, 515, 894, 514, 809, 888, 542, + 809, 809, 838, 887, 515, 515, 515, 497, 810, 810, + 145, 855, 171, 132, 159, 279, 284, 435, 446, 514, + 145, 851, 809, 413, 881, 809, 869, 809, 428, 514, + 675, 809, 876, 547, 514, 514, 155, 824, 742, 743, + 767, 698, 767, 899, 808, 905, 905, 249, 514, 743, + 473, 956, 40, 59, 554, 564, 571, 877, 518, 741, + 503, 499, 703, 701, 291, 846, 849, 703, 4, 899, + 719, 290, 451, 716, 518, 243, 894, 683, 59, 884, + 514, 543, 59, 265, 428, 809, 274, 640, 514, 152, + 514, 618, 202, 637, 638, 599, 40, 175, 608, 634, + 599, 26, 137, 354, 356, 386, 530, 531, 532, 538, + 539, 152, 650, 152, 650, 609, 623, 609, 515, 518, + 544, 602, 503, 516, 515, 518, 428, 370, 93, 428, + 550, 370, 428, 428, 428, 370, 962, 524, 513, 524, + 697, 697, 697, 858, 281, 281, 515, 514, 657, 3, + 403, 404, 544, 672, 632, 663, 581, 541, 577, 514, + 40, 633, 654, 912, 352, 416, 544, 573, 574, 579, + 673, 637, 541, 541, 977, 541, 515, 518, 287, 613, + 287, 289, 612, 896, 476, 976, 541, 613, 40, 541, + 515, 416, 809, 152, 541, 594, 903, 660, 671, 937, + 666, 544, 544, 279, 637, 507, 637, 544, 507, 637, + 544, 515, 515, 867, 171, 132, 284, 514, 766, 763, + 514, 515, 515, 515, 542, 708, 767, 692, 692, 692, + 692, 541, 541, 541, 59, 185, 730, 760, 894, 514, + 748, 749, 750, 812, 814, 894, 166, 80, 770, 769, + 515, 515, 512, 774, 515, 518, 515, 899, 513, 899, + 515, 797, 799, 800, 801, 800, 801, 801, 515, 424, + 809, 143, 809, 841, 851, 795, 795, 515, 809, 888, + 889, 890, 40, 198, 515, 891, 808, 809, 36, 36, + 809, 515, 809, 171, 514, 859, 809, 515, 145, 810, + 810, 145, 145, 809, 809, 513, 524, 514, 878, 699, + 473, 809, 300, 828, 518, 721, 697, 721, 515, 910, + 809, 358, 562, 542, 265, 320, 117, 303, 514, 552, + 674, 515, 518, 558, 956, 809, 163, 230, 514, 703, + 290, 541, 515, 895, 180, 675, 676, 884, 895, 896, + 896, 515, 152, 638, 625, 638, 599, 627, 518, 515, + 119, 206, 272, 274, 624, 514, 33, 59, 645, 634, + 74, 80, 93, 117, 119, 206, 274, 279, 328, 344, + 445, 454, 604, 605, 619, 175, 117, 190, 274, 613, + 588, 107, 117, 175, 274, 402, 405, 590, 613, 386, + 532, 439, 896, 542, 536, 3, 37, 42, 49, 55, + 81, 83, 89, 101, 170, 172, 175, 176, 193, 208, + 221, 222, 224, 234, 236, 246, 268, 273, 277, 291, + 299, 301, 321, 361, 380, 387, 391, 409, 418, 438, + 444, 464, 505, 506, 544, 589, 600, 639, 774, 849, + 900, 978, 984, 548, 636, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 664, 876, 876, 515, 515, + 515, 698, 107, 370, 516, 588, 672, 514, 514, 631, + 674, 919, 40, 644, 191, 541, 515, 518, 581, 515, + 515, 577, 514, 40, 622, 620, 628, 86, 585, 107, + 272, 633, 674, 654, 674, 627, 454, 916, 650, 515, + 518, 637, 810, 171, 514, 859, 768, 515, 518, 515, + 721, 541, 541, 541, 541, 30, 103, 181, 364, 514, + 722, 723, 724, 725, 726, 727, 728, 809, 809, 475, + 825, 515, 811, 852, 853, 198, 180, 745, 749, 515, + 751, 752, 753, 903, 776, 899, 776, 542, 776, 513, + 513, 809, 518, 515, 542, 809, 811, 809, 809, 809, + 859, 515, 809, 36, 36, 809, 809, 145, 515, 506, + 876, 515, 857, 515, 809, 515, 514, 542, 829, 730, + 515, 730, 544, 515, 883, 460, 415, 453, 563, 542, + 557, 567, 289, 560, 503, 571, 562, 851, 59, 515, + 515, 459, 460, 680, 599, 625, 515, 515, 476, 630, + 120, 194, 204, 119, 456, 809, 117, 40, 514, 903, + 896, 810, 120, 194, 119, 279, 226, 541, 630, 88, + 645, 191, 279, 589, 809, 645, 279, 505, 506, 592, + 542, 774, 650, 650, 3, 246, 409, 900, 904, 503, + 428, 428, 513, 513, 697, 515, 515, 542, 664, 454, + 659, 661, 673, 637, 515, 976, 40, 416, 809, 416, + 274, 514, 544, 514, 919, 631, 151, 674, 149, 200, + 612, 122, 137, 327, 976, 107, 919, 476, 974, 40, + 289, 542, 915, 514, 671, 810, 859, 515, 515, 9, + 351, 714, 730, 514, 388, 514, 515, 518, 542, 826, + 827, 335, 731, 518, 515, 514, 543, 59, 515, 198, + 515, 752, 513, 774, 888, 513, 191, 515, 809, 809, + 809, 524, 513, 524, 515, 515, 542, 830, 825, 544, + 825, 518, 459, 877, 515, 518, 91, 562, 809, 515, + 895, 895, 344, 630, 514, 621, 599, 515, 190, 514, + 809, 274, 605, 630, 633, 896, 40, 152, 770, 904, + 509, 600, 896, 896, 515, 588, 124, 515, 515, 620, + 674, 674, 541, 152, 673, 40, 515, 896, 976, 30, + 85, 94, 118, 190, 203, 402, 405, 616, 616, 366, + 366, 40, 64, 74, 240, 416, 809, 541, 514, 542, + 561, 570, 819, 515, 515, 514, 825, 855, 514, 855, + 724, 40, 518, 809, 454, 709, 811, 884, 894, 756, + 514, 756, 809, 876, 876, 309, 831, 731, 731, 674, + 303, 674, 557, 289, 514, 555, 541, 599, 548, 626, + 629, 406, 468, 606, 607, 514, 601, 809, 515, 248, + 642, 190, 454, 535, 509, 439, 664, 544, 919, 612, + 974, 514, 541, 515, 674, 620, 585, 674, 74, 292, + 74, 674, 916, 809, 80, 565, 515, 518, 565, 9, + 731, 515, 723, 515, 829, 827, 368, 515, 884, 513, + 513, 513, 59, 698, 709, 709, 563, 93, 570, 133, + 633, 503, 515, 518, 587, 515, 272, 614, 172, 308, + 392, 289, 610, 611, 635, 601, 809, 439, 40, 514, + 974, 612, 976, 974, 292, 292, 514, 515, 903, 566, + 903, 919, 561, 566, 515, 709, 515, 711, 515, 854, + 183, 337, 366, 832, 459, 896, 515, 275, 451, 642, + 600, 629, 515, 607, 204, 122, 451, 289, 635, 289, + 610, 674, 570, 565, 702, 767, 702, 53, 104, 441, + 809, 833, 834, 833, 833, 515, 674, 767, 386, 611, + 63, 272, 357, 386, 603, 603, 974, 515, 566, 703, + 703, 834, 365, 165, 323, 165, 323, 148, 835, 835, + 835, 569, 599, 25, 117, 279, 919, 702, 36, 104, + 180, 272, 425, 767, 767, 703, 834, 365, 297 }; #define yyerrok (yyerrstatus = 0) @@ -20004,14 +20039,14 @@ YYLTYPE yylloc; switch (yyn) { case 2: -#line 501 "third_party/libpg_query/grammar/grammar.y" +#line 503 "third_party/libpg_query/grammar/grammar.y" { pg_yyget_extra(yyscanner)->parsetree = (yyvsp[(1) - (1)].list); ;} break; case 3: -#line 517 "third_party/libpg_query/grammar/grammar.y" +#line 519 "third_party/libpg_query/grammar/grammar.y" { if ((yyvsp[(1) - (3)].list) != NIL) { @@ -20026,7 +20061,7 @@ YYLTYPE yylloc; break; case 4: -#line 529 "third_party/libpg_query/grammar/grammar.y" +#line 531 "third_party/libpg_query/grammar/grammar.y" { if ((yyvsp[(1) - (1)].node) != NULL) (yyval.list) = list_make1(makeRawStmt((yyvsp[(1) - (1)].node), 0)); @@ -20036,7 +20071,7 @@ YYLTYPE yylloc; break; case 45: -#line 578 "third_party/libpg_query/grammar/grammar.y" +#line 580 "third_party/libpg_query/grammar/grammar.y" { (yyval.node) = NULL; ;} break; @@ -23499,190 +23534,190 @@ YYLTYPE yylloc; case 475: #line 118 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.node) = (PGNode *) makeNode(PGAStar); ;} + { (yyval.node) = (PGNode *) (yyvsp[(1) - (1)].node); ;} break; case 476: #line 119 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.node) = (PGNode *) (yyvsp[(2) - (3)].list); ;} + { (yyval.node) = (PGNode *) makeNode(PGAStar); ;} break; case 477: #line 120 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.node) = (PGNode *) (yyvsp[(1) - (1)].node); ;} + { (yyval.node) = (PGNode *) (yyvsp[(2) - (3)].list); ;} break; case 478: #line 121 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.node) = NULL; ;} + { (yyval.node) = (PGNode *) (yyvsp[(1) - (1)].node); ;} break; case 479: -#line 127 "third_party/libpg_query/grammar/statements/copy.y" +#line 122 "third_party/libpg_query/grammar/statements/copy.y" + { (yyval.node) = NULL; ;} + break; + + case 480: +#line 128 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem((yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 480: -#line 135 "third_party/libpg_query/grammar/statements/copy.y" + case 481: +#line 136 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("oids", (PGNode *)makeInteger(true), (yylsp[(1) - (2)])); ;} break; - case 481: -#line 138 "third_party/libpg_query/grammar/statements/copy.y" + case 482: +#line 139 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = NULL; ;} break; - case 482: -#line 143 "third_party/libpg_query/grammar/statements/copy.y" + case 483: +#line 144 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].defelt)); ;} break; - case 483: -#line 144 "third_party/libpg_query/grammar/statements/copy.y" + case 484: +#line 145 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.list) = NIL; ;} break; - case 484: -#line 150 "third_party/libpg_query/grammar/statements/copy.y" + case 485: +#line 151 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("format", (PGNode *)makeString("binary"), (yylsp[(1) - (1)])); ;} break; - case 485: -#line 153 "third_party/libpg_query/grammar/statements/copy.y" + case 486: +#line 154 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = NULL; ;} break; - case 486: -#line 159 "third_party/libpg_query/grammar/statements/copy.y" + case 487: +#line 160 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("format", (PGNode *)makeString("binary"), (yylsp[(1) - (1)])); ;} break; - case 487: -#line 163 "third_party/libpg_query/grammar/statements/copy.y" + case 488: +#line 164 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("oids", (PGNode *)makeInteger(true), (yylsp[(1) - (1)])); ;} break; - case 488: -#line 167 "third_party/libpg_query/grammar/statements/copy.y" + case 489: +#line 168 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("freeze", (PGNode *)makeInteger(true), (yylsp[(1) - (1)])); ;} break; - case 489: -#line 171 "third_party/libpg_query/grammar/statements/copy.y" + case 490: +#line 172 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("delimiter", (PGNode *)makeString((yyvsp[(3) - (3)].str)), (yylsp[(1) - (3)])); ;} break; - case 490: -#line 175 "third_party/libpg_query/grammar/statements/copy.y" + case 491: +#line 176 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("null", (PGNode *)makeString((yyvsp[(3) - (3)].str)), (yylsp[(1) - (3)])); ;} break; - case 491: -#line 179 "third_party/libpg_query/grammar/statements/copy.y" + case 492: +#line 180 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("format", (PGNode *)makeString("csv"), (yylsp[(1) - (1)])); ;} break; - case 492: -#line 183 "third_party/libpg_query/grammar/statements/copy.y" + case 493: +#line 184 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("header", (PGNode *)makeInteger(true), (yylsp[(1) - (1)])); ;} break; - case 493: -#line 187 "third_party/libpg_query/grammar/statements/copy.y" + case 494: +#line 188 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("quote", (PGNode *)makeString((yyvsp[(3) - (3)].str)), (yylsp[(1) - (3)])); ;} break; - case 494: -#line 191 "third_party/libpg_query/grammar/statements/copy.y" + case 495: +#line 192 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("escape", (PGNode *)makeString((yyvsp[(3) - (3)].str)), (yylsp[(1) - (3)])); ;} break; - case 495: -#line 195 "third_party/libpg_query/grammar/statements/copy.y" + case 496: +#line 196 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("force_quote", (PGNode *)(yyvsp[(3) - (3)].list), (yylsp[(1) - (3)])); ;} break; - case 496: -#line 199 "third_party/libpg_query/grammar/statements/copy.y" + case 497: +#line 200 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("force_quote", (PGNode *)makeNode(PGAStar), (yylsp[(1) - (3)])); ;} break; - case 497: -#line 203 "third_party/libpg_query/grammar/statements/copy.y" + case 498: +#line 204 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("partition_by", (PGNode *)(yyvsp[(3) - (3)].list), (yylsp[(1) - (3)])); ;} break; - case 498: -#line 207 "third_party/libpg_query/grammar/statements/copy.y" + case 499: +#line 208 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("partition_by", (PGNode *)makeNode(PGAStar), (yylsp[(1) - (3)])); ;} break; - case 499: -#line 211 "third_party/libpg_query/grammar/statements/copy.y" + case 500: +#line 212 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("force_not_null", (PGNode *)(yyvsp[(4) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 500: -#line 215 "third_party/libpg_query/grammar/statements/copy.y" + case 501: +#line 216 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("force_null", (PGNode *)(yyvsp[(3) - (3)].list), (yylsp[(1) - (3)])); ;} break; - case 501: -#line 219 "third_party/libpg_query/grammar/statements/copy.y" + case 502: +#line 220 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("encoding", (PGNode *)makeString((yyvsp[(2) - (2)].str)), (yylsp[(1) - (2)])); ;} break; - case 502: -#line 226 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.node) = (PGNode *) makeString((yyvsp[(1) - (1)].str)); ;} - break; - case 503: -#line 231 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.str) = (yyvsp[(1) - (1)].str); ;} +#line 227 "third_party/libpg_query/grammar/statements/copy.y" + { (yyval.node) = (PGNode *) makeString((yyvsp[(1) - (1)].str)); ;} break; case 504: #line 232 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.str) = NULL; ;} + { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; case 505: @@ -23692,51 +23727,56 @@ YYLTYPE yylloc; case 506: #line 234 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.str) = psprintf("%s.%s", (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str)); ;} + { (yyval.str) = NULL; ;} break; case 507: #line 235 "third_party/libpg_query/grammar/statements/copy.y" - { (yyval.str) = (yyvsp[(1) - (1)].str); ;} + { (yyval.str) = psprintf("%s.%s", (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str)); ;} break; case 508: -#line 242 "third_party/libpg_query/grammar/statements/copy.y" +#line 236 "third_party/libpg_query/grammar/statements/copy.y" + { (yyval.str) = (yyvsp[(1) - (1)].str); ;} + break; + + case 509: +#line 243 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].defelt)); ;} break; - case 509: -#line 246 "third_party/libpg_query/grammar/statements/copy.y" + case 510: +#line 247 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].defelt)); ;} break; - case 512: + case 513: #line 52 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 513: + case 514: #line 53 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 514: + case 515: #line 55 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 515: + case 516: #line 72 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 516: + case 517: #line 74 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].list), NIL, @@ -23746,7 +23786,7 @@ YYLTYPE yylloc; ;} break; - case 517: + case 518: #line 81 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(1) - (4)].node), (yyvsp[(2) - (4)].list), (yyvsp[(3) - (4)].list), @@ -23757,7 +23797,7 @@ YYLTYPE yylloc; ;} break; - case 518: + case 519: #line 89 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(1) - (4)].node), (yyvsp[(2) - (4)].list), (yyvsp[(4) - (4)].list), @@ -23768,7 +23808,7 @@ YYLTYPE yylloc; ;} break; - case 519: + case 520: #line 97 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(2) - (2)].node), NULL, NIL, @@ -23779,7 +23819,7 @@ YYLTYPE yylloc; ;} break; - case 520: + case 521: #line 105 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(2) - (3)].node), (yyvsp[(3) - (3)].list), NIL, @@ -23790,7 +23830,7 @@ YYLTYPE yylloc; ;} break; - case 521: + case 522: #line 113 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(2) - (5)].node), (yyvsp[(3) - (5)].list), (yyvsp[(4) - (5)].list), @@ -23801,7 +23841,7 @@ YYLTYPE yylloc; ;} break; - case 522: + case 523: #line 121 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(2) - (5)].node), (yyvsp[(3) - (5)].list), (yyvsp[(5) - (5)].list), @@ -23812,24 +23852,24 @@ YYLTYPE yylloc; ;} break; - case 523: + case 524: #line 131 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 524: + case 525: #line 132 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 525: + case 526: #line 160 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (3)].list); ;} break; - case 526: + case 527: #line 164 "third_party/libpg_query/grammar/statements/select.y" { PGAStar *star = makeNode(PGAStar); @@ -23837,7 +23877,7 @@ YYLTYPE yylloc; ;} break; - case 527: + case 528: #line 175 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = makeNode(PGSelectStmt); @@ -23854,7 +23894,7 @@ YYLTYPE yylloc; ;} break; - case 528: + case 529: #line 191 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = makeNode(PGSelectStmt); @@ -23872,7 +23912,7 @@ YYLTYPE yylloc; ;} break; - case 529: + case 530: #line 208 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = makeNode(PGSelectStmt); @@ -23889,7 +23929,7 @@ YYLTYPE yylloc; ;} break; - case 530: + case 531: #line 225 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = makeNode(PGSelectStmt); @@ -23907,12 +23947,12 @@ YYLTYPE yylloc; ;} break; - case 531: + case 532: #line 239 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 532: + case 533: #line 241 "third_party/libpg_query/grammar/statements/select.y" { /* same as SELECT * FROM relation_expr */ @@ -23934,35 +23974,35 @@ YYLTYPE yylloc; ;} break; - case 533: + case 534: #line 260 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSetOp(PG_SETOP_UNION_BY_NAME, (yyvsp[(3) - (5)].boolean), (yyvsp[(1) - (5)].node), (yyvsp[(5) - (5)].node)); ;} break; - case 534: + case 535: #line 264 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSetOp(PG_SETOP_UNION, (yyvsp[(3) - (4)].boolean), (yyvsp[(1) - (4)].node), (yyvsp[(4) - (4)].node)); ;} break; - case 535: + case 536: #line 268 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSetOp(PG_SETOP_INTERSECT, (yyvsp[(3) - (4)].boolean), (yyvsp[(1) - (4)].node), (yyvsp[(4) - (4)].node)); ;} break; - case 536: + case 537: #line 272 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSetOp(PG_SETOP_EXCEPT, (yyvsp[(3) - (4)].boolean), (yyvsp[(1) - (4)].node), (yyvsp[(4) - (4)].node)); ;} break; - case 537: + case 538: #line 276 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -23975,7 +24015,7 @@ YYLTYPE yylloc; ;} break; - case 538: + case 539: #line 286 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -23989,7 +24029,7 @@ YYLTYPE yylloc; ;} break; - case 539: + case 540: #line 297 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -24002,7 +24042,7 @@ YYLTYPE yylloc; ;} break; - case 540: + case 541: #line 307 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -24014,7 +24054,7 @@ YYLTYPE yylloc; ;} break; - case 541: + case 542: #line 316 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -24028,7 +24068,7 @@ YYLTYPE yylloc; ;} break; - case 542: + case 543: #line 327 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -24042,7 +24082,7 @@ YYLTYPE yylloc; ;} break; - case 543: + case 544: #line 338 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -24057,7 +24097,7 @@ YYLTYPE yylloc; ;} break; - case 544: + case 545: #line 350 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -24075,7 +24115,7 @@ YYLTYPE yylloc; ;} break; - case 545: + case 546: #line 365 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -24093,7 +24133,7 @@ YYLTYPE yylloc; ;} break; - case 552: + case 553: #line 395 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -24102,7 +24142,7 @@ YYLTYPE yylloc; ;} break; - case 553: + case 554: #line 401 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -24112,32 +24152,32 @@ YYLTYPE yylloc; ;} break; - case 554: + case 555: #line 407 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 555: + case 556: #line 411 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 556: + case 557: #line 412 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 557: + case 558: #line 416 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 558: + case 559: #line 417 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 559: + case 560: #line 432 "third_party/libpg_query/grammar/statements/select.y" { (yyval.with) = makeNode(PGWithClause); @@ -24147,7 +24187,7 @@ YYLTYPE yylloc; ;} break; - case 560: + case 561: #line 439 "third_party/libpg_query/grammar/statements/select.y" { (yyval.with) = makeNode(PGWithClause); @@ -24157,7 +24197,7 @@ YYLTYPE yylloc; ;} break; - case 561: + case 562: #line 446 "third_party/libpg_query/grammar/statements/select.y" { (yyval.with) = makeNode(PGWithClause); @@ -24167,17 +24207,17 @@ YYLTYPE yylloc; ;} break; - case 562: + case 563: #line 455 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 563: + case 564: #line 456 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 564: + case 565: #line 460 "third_party/libpg_query/grammar/statements/select.y" { PGCommonTableExpr *n = makeNode(PGCommonTableExpr); @@ -24190,22 +24230,22 @@ YYLTYPE yylloc; ;} break; - case 565: + case 566: #line 472 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ctematerialize) = PGCTEMaterializeAlways; ;} break; - case 566: + case 567: #line 473 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ctematerialize) = PGCTEMaterializeNever; ;} break; - case 567: + case 568: #line 474 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ctematerialize) = PGCTEMaterializeDefault; ;} break; - case 568: + case 569: #line 479 "third_party/libpg_query/grammar/statements/select.y" { (yyval.into) = makeNode(PGIntoClause); @@ -24218,12 +24258,12 @@ YYLTYPE yylloc; ;} break; - case 569: + case 570: #line 489 "third_party/libpg_query/grammar/statements/select.y" { (yyval.into) = NULL; ;} break; - case 570: + case 571: #line 498 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(3) - (3)].range); @@ -24231,7 +24271,7 @@ YYLTYPE yylloc; ;} break; - case 571: + case 572: #line 503 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(3) - (3)].range); @@ -24239,7 +24279,7 @@ YYLTYPE yylloc; ;} break; - case 572: + case 573: #line 508 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(4) - (4)].range); @@ -24247,7 +24287,7 @@ YYLTYPE yylloc; ;} break; - case 573: + case 574: #line 513 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(4) - (4)].range); @@ -24255,7 +24295,7 @@ YYLTYPE yylloc; ;} break; - case 574: + case 575: #line 518 "third_party/libpg_query/grammar/statements/select.y" { ereport(PGWARNING, @@ -24266,7 +24306,7 @@ YYLTYPE yylloc; ;} break; - case 575: + case 576: #line 526 "third_party/libpg_query/grammar/statements/select.y" { ereport(PGWARNING, @@ -24277,7 +24317,7 @@ YYLTYPE yylloc; ;} break; - case 576: + case 577: #line 534 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(3) - (3)].range); @@ -24285,7 +24325,7 @@ YYLTYPE yylloc; ;} break; - case 577: + case 578: #line 539 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(2) - (2)].range); @@ -24293,7 +24333,7 @@ YYLTYPE yylloc; ;} break; - case 578: + case 579: #line 544 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(1) - (1)].range); @@ -24301,87 +24341,87 @@ YYLTYPE yylloc; ;} break; - case 579: + case 580: #line 550 "third_party/libpg_query/grammar/statements/select.y" {;} break; - case 580: + case 581: #line 551 "third_party/libpg_query/grammar/statements/select.y" {;} break; - case 581: + case 582: #line 555 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 582: + case 583: #line 556 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 583: + case 584: #line 557 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 584: + case 585: #line 561 "third_party/libpg_query/grammar/statements/select.y" { ;} break; - case 585: + case 586: #line 568 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(NIL); ;} break; - case 586: + case 587: #line 569 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(4) - (5)].list); ;} break; - case 587: + case 588: #line 573 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL;;} break; - case 588: + case 589: #line 574 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 589: + case 590: #line 578 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.boolean) = true;;} + { (yyval.ignorenulls) = PG_IGNORE_NULLS;;} break; - case 590: + case 591: #line 579 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.boolean) = false;;} + { (yyval.ignorenulls) = PG_RESPECT_NULLS;;} break; - case 591: + case 592: #line 580 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.boolean) = false; ;} + { (yyval.ignorenulls) = PG_DEFAULT_NULLS; ;} break; - case 592: + case 593: #line 584 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list);;} break; - case 593: + case 594: #line 585 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 594: + case 595: #line 589 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (3)].list); ;} break; - case 595: + case 596: #line 591 "third_party/libpg_query/grammar/statements/select.y" { PGSortBy *sort = makeNode(PGSortBy); @@ -24397,17 +24437,17 @@ YYLTYPE yylloc; ;} break; - case 596: + case 597: #line 606 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].sortby)); ;} break; - case 597: + case 598: #line 607 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].sortby)); ;} break; - case 598: + case 599: #line 611 "third_party/libpg_query/grammar/statements/select.y" { (yyval.sortby) = makeNode(PGSortBy); @@ -24419,7 +24459,7 @@ YYLTYPE yylloc; ;} break; - case 599: + case 600: #line 620 "third_party/libpg_query/grammar/statements/select.y" { (yyval.sortby) = makeNode(PGSortBy); @@ -24431,72 +24471,72 @@ YYLTYPE yylloc; ;} break; - case 600: + case 601: #line 630 "third_party/libpg_query/grammar/statements/select.y" { (yyval.sortorder) = PG_SORTBY_ASC; ;} break; - case 601: + case 602: #line 631 "third_party/libpg_query/grammar/statements/select.y" { (yyval.sortorder) = PG_SORTBY_DESC; ;} break; - case 602: + case 603: #line 632 "third_party/libpg_query/grammar/statements/select.y" { (yyval.sortorder) = PG_SORTBY_DEFAULT; ;} break; - case 603: + case 604: #line 635 "third_party/libpg_query/grammar/statements/select.y" { (yyval.nullorder) = PG_SORTBY_NULLS_FIRST; ;} break; - case 604: + case 605: #line 636 "third_party/libpg_query/grammar/statements/select.y" { (yyval.nullorder) = PG_SORTBY_NULLS_LAST; ;} break; - case 605: + case 606: #line 637 "third_party/libpg_query/grammar/statements/select.y" { (yyval.nullorder) = PG_SORTBY_NULLS_DEFAULT; ;} break; - case 606: + case 607: #line 641 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(2) - (2)].node), (yyvsp[(1) - (2)].node)); ;} break; - case 607: + case 608: #line 642 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].node)); ;} break; - case 608: + case 609: #line 643 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(NULL, (yyvsp[(1) - (1)].node)); ;} break; - case 609: + case 610: #line 644 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (1)].node), NULL); ;} break; - case 610: + case 611: #line 648 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 611: + case 612: #line 649 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(NULL,NULL); ;} break; - case 612: + case 613: #line 654 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 613: + case 614: #line 656 "third_party/libpg_query/grammar/statements/select.y" { /* Disabled because it was too confusing, bjm 2002-02-18 */ @@ -24508,91 +24548,91 @@ YYLTYPE yylloc; ;} break; - case 614: + case 615: #line 672 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(3) - (5)].node); ;} break; - case 615: + case 616: #line 674 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntConst(1, -1); ;} break; - case 616: + case 617: #line 679 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 617: + case 618: #line 682 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 618: + case 619: #line 690 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize(makeFloat((yyvsp[(1) - (2)].str)), true); ;} break; - case 619: + case 620: #line 694 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize(makeInteger((yyvsp[(1) - (2)].ival)), true); ;} break; - case 620: + case 621: #line 698 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize(makeFloat((yyvsp[(1) - (2)].str)), true); ;} break; - case 621: + case 622: #line 702 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize(makeInteger((yyvsp[(1) - (2)].ival)), true); ;} break; - case 622: + case 623: #line 706 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize(makeInteger((yyvsp[(1) - (1)].ival)), false); ;} break; - case 623: + case 624: #line 710 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize(makeInteger((yyvsp[(1) - (2)].ival)), false); ;} break; - case 624: + case 625: #line 717 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(3) - (3)].node); ;} break; - case 625: + case 626: #line 721 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 626: + case 627: #line 728 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 627: + case 628: #line 729 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = NULL; ;} break; - case 628: + case 629: #line 734 "third_party/libpg_query/grammar/statements/select.y" { int seed = (yyvsp[(5) - (5)].ival); @@ -24600,21 +24640,21 @@ YYLTYPE yylloc; ;} break; - case 629: + case 630: #line 739 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleOptions((yyvsp[(1) - (1)].node), NULL, NULL, (yylsp[(1) - (1)])); ;} break; - case 630: + case 631: #line 743 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleOptions((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].str), NULL, (yylsp[(1) - (4)])); ;} break; - case 631: + case 632: #line 747 "third_party/libpg_query/grammar/statements/select.y" { int seed = (yyvsp[(5) - (6)].ival); @@ -24622,39 +24662,39 @@ YYLTYPE yylloc; ;} break; - case 632: + case 633: #line 755 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 633: + case 634: #line 761 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 634: + case 635: #line 762 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 635: + case 636: #line 767 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = (yyvsp[(3) - (4)].ival); ;} break; - case 636: + case 637: #line 768 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = -1; ;} break; - case 637: + case 638: #line 772 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 638: + case 639: #line 774 "third_party/libpg_query/grammar/statements/select.y" { /* LIMIT ALL is represented as a NULL constant */ @@ -24662,77 +24702,77 @@ YYLTYPE yylloc; ;} break; - case 639: + case 640: #line 779 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeLimitPercent((yyvsp[(1) - (2)].node)); ;} break; - case 640: + case 641: #line 781 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeLimitPercent(makeFloatConst((yyvsp[(1) - (2)].str),(yylsp[(1) - (2)]))); ;} break; - case 641: + case 642: #line 783 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeLimitPercent(makeIntConst((yyvsp[(1) - (2)].ival),(yylsp[(1) - (2)]))); ;} break; - case 642: + case 643: #line 787 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 643: + case 644: #line 807 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 644: + case 645: #line 809 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "+", NULL, (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 645: + case 646: #line 811 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = doNegate((yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 646: + case 647: #line 815 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntConst((yyvsp[(1) - (1)].ival),(yylsp[(1) - (1)])); ;} break; - case 647: + case 648: #line 816 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeFloatConst((yyvsp[(1) - (1)].str),(yylsp[(1) - (1)])); ;} break; - case 648: + case 649: #line 820 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 649: + case 650: #line 821 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 650: + case 651: #line 824 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 651: + case 652: #line 825 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 652: + case 653: #line 850 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (3)].list); ;} break; - case 653: + case 654: #line 852 "third_party/libpg_query/grammar/statements/select.y" { PGNode *node = (PGNode *) makeGroupingSet(GROUPING_SET_ALL, NIL, (yylsp[(3) - (3)])); @@ -24740,145 +24780,145 @@ YYLTYPE yylloc; ;} break; - case 654: + case 655: #line 856 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 655: + case 656: #line 860 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 656: + case 657: #line 861 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list),(yyvsp[(3) - (3)].node)); ;} break; - case 657: + case 658: #line 865 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 658: + case 659: #line 866 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 659: + case 660: #line 870 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 660: + case 661: #line 871 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 661: + case 662: #line 872 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 662: + case 663: #line 873 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 663: + case 664: #line 874 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 664: + case 665: #line 879 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeGroupingSet(GROUPING_SET_EMPTY, NIL, (yylsp[(1) - (2)])); ;} break; - case 665: + case 666: #line 892 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeGroupingSet(GROUPING_SET_ROLLUP, (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 666: + case 667: #line 899 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeGroupingSet(GROUPING_SET_CUBE, (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 667: + case 668: #line 906 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeGroupingSet(GROUPING_SET_SETS, (yyvsp[(4) - (5)].list), (yylsp[(1) - (5)])); ;} break; - case 668: + case 669: #line 912 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 669: + case 670: #line 913 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 670: + case 671: #line 917 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 671: + case 672: #line 918 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 672: + case 673: #line 922 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 673: + case 674: #line 923 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 674: + case 675: #line 927 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 675: + case 676: #line 928 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 676: + case 677: #line 932 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 677: + case 678: #line 933 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 678: + case 679: #line 937 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 679: + case 680: #line 938 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 680: + case 681: #line 943 "third_party/libpg_query/grammar/statements/select.y" { PGLockingClause *n = makeNode(PGLockingClause); @@ -24889,52 +24929,52 @@ YYLTYPE yylloc; ;} break; - case 681: + case 682: #line 953 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockstrength) = LCS_FORUPDATE; ;} break; - case 682: + case 683: #line 954 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockstrength) = PG_LCS_FORNOKEYUPDATE; ;} break; - case 683: + case 684: #line 955 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockstrength) = PG_LCS_FORSHARE; ;} break; - case 684: + case 685: #line 956 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockstrength) = PG_LCS_FORKEYSHARE; ;} break; - case 685: + case 686: #line 960 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 686: + case 687: #line 961 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 687: + case 688: #line 966 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockwaitpolicy) = LockWaitError; ;} break; - case 688: + case 689: #line 967 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockwaitpolicy) = PGLockWaitSkip; ;} break; - case 689: + case 690: #line 968 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockwaitpolicy) = PGLockWaitBlock; ;} break; - case 690: + case 691: #line 978 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = makeNode(PGSelectStmt); @@ -24943,7 +24983,7 @@ YYLTYPE yylloc; ;} break; - case 691: + case 692: #line 984 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = (PGSelectStmt *) (yyvsp[(1) - (5)].node); @@ -24952,47 +24992,47 @@ YYLTYPE yylloc; ;} break; - case 692: + case 693: #line 992 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 693: + case 694: #line 993 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (2)].node); ;} break; - case 694: + case 695: #line 1006 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 695: + case 696: #line 1007 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 696: + case 697: #line 1011 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 697: + case 698: #line 1012 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 698: + case 699: #line 1016 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 699: + case 700: #line 1017 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 700: + case 701: #line 1024 "third_party/libpg_query/grammar/statements/select.y" { (yyvsp[(1) - (3)].range)->alias = (yyvsp[(2) - (3)].alias); @@ -25001,7 +25041,7 @@ YYLTYPE yylloc; ;} break; - case 701: + case 702: #line 1030 "third_party/libpg_query/grammar/statements/select.y" { PGRangeFunction *n = (PGRangeFunction *) (yyvsp[(1) - (3)].node); @@ -25012,7 +25052,7 @@ YYLTYPE yylloc; ;} break; - case 702: + case 703: #line 1038 "third_party/libpg_query/grammar/statements/select.y" { PGRangeSubselect *n = makeNode(PGRangeSubselect); @@ -25024,7 +25064,7 @@ YYLTYPE yylloc; ;} break; - case 703: + case 704: #line 1047 "third_party/libpg_query/grammar/statements/select.y" { PGRangeFunction *n = (PGRangeFunction *) (yyvsp[(2) - (3)].node); @@ -25035,7 +25075,7 @@ YYLTYPE yylloc; ;} break; - case 704: + case 705: #line 1055 "third_party/libpg_query/grammar/statements/select.y" { PGRangeSubselect *n = makeNode(PGRangeSubselect); @@ -25047,7 +25087,7 @@ YYLTYPE yylloc; ;} break; - case 705: + case 706: #line 1064 "third_party/libpg_query/grammar/statements/select.y" { PGRangeSubselect *n = makeNode(PGRangeSubselect); @@ -25059,14 +25099,14 @@ YYLTYPE yylloc; ;} break; - case 706: + case 707: #line 1073 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) (yyvsp[(1) - (1)].jexpr); ;} break; - case 707: + case 708: #line 1077 "third_party/libpg_query/grammar/statements/select.y" { (yyvsp[(2) - (4)].jexpr)->alias = (yyvsp[(4) - (4)].alias); @@ -25074,7 +25114,7 @@ YYLTYPE yylloc; ;} break; - case 708: + case 709: #line 1082 "third_party/libpg_query/grammar/statements/select.y" { PGPivotExpr *n = makeNode(PGPivotExpr); @@ -25088,7 +25128,7 @@ YYLTYPE yylloc; ;} break; - case 709: + case 710: #line 1093 "third_party/libpg_query/grammar/statements/select.y" { PGPivotExpr *n = makeNode(PGPivotExpr); @@ -25102,32 +25142,32 @@ YYLTYPE yylloc; ;} break; - case 710: + case 711: #line 1106 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (3)].list); ;} break; - case 711: + case 712: #line 1107 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 712: + case 713: #line 1110 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 713: + case 714: #line 1111 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 714: + case 715: #line 1112 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 715: + case 716: #line 1116 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -25137,7 +25177,7 @@ YYLTYPE yylloc; ;} break; - case 716: + case 717: #line 1124 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -25147,22 +25187,22 @@ YYLTYPE yylloc; ;} break; - case 718: + case 719: #line 1133 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 719: + case 720: #line 1134 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 720: + case 721: #line 1135 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 721: + case 722: #line 1139 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -25172,7 +25212,7 @@ YYLTYPE yylloc; ;} break; - case 722: + case 723: #line 1147 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -25182,31 +25222,31 @@ YYLTYPE yylloc; ;} break; - case 723: + case 724: #line 1156 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 724: + case 725: #line 1160 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 725: + case 726: #line 1166 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 726: + case 727: #line 1167 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 727: + case 728: #line 1172 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -25216,28 +25256,28 @@ YYLTYPE yylloc; ;} break; - case 728: + case 729: #line 1181 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 729: + case 730: #line 1185 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 730: + case 731: #line 1210 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jexpr) = (yyvsp[(2) - (3)].jexpr); ;} break; - case 731: + case 732: #line 1214 "third_party/libpg_query/grammar/statements/select.y" { /* CROSS JOIN is same as unqualified inner join */ @@ -25253,7 +25293,7 @@ YYLTYPE yylloc; ;} break; - case 732: + case 733: #line 1227 "third_party/libpg_query/grammar/statements/select.y" { PGJoinExpr *n = makeNode(PGJoinExpr); @@ -25270,7 +25310,7 @@ YYLTYPE yylloc; ;} break; - case 733: + case 734: #line 1241 "third_party/libpg_query/grammar/statements/select.y" { /* letting join_type reduce to empty doesn't work */ @@ -25288,7 +25328,7 @@ YYLTYPE yylloc; ;} break; - case 734: + case 735: #line 1256 "third_party/libpg_query/grammar/statements/select.y" { PGJoinExpr *n = makeNode(PGJoinExpr); @@ -25303,7 +25343,7 @@ YYLTYPE yylloc; ;} break; - case 735: + case 736: #line 1268 "third_party/libpg_query/grammar/statements/select.y" { /* letting join_type reduce to empty doesn't work */ @@ -25319,7 +25359,7 @@ YYLTYPE yylloc; ;} break; - case 736: + case 737: #line 1281 "third_party/libpg_query/grammar/statements/select.y" { PGJoinExpr *n = makeNode(PGJoinExpr); @@ -25336,7 +25376,7 @@ YYLTYPE yylloc; ;} break; - case 737: + case 738: #line 1295 "third_party/libpg_query/grammar/statements/select.y" { PGJoinExpr *n = makeNode(PGJoinExpr); @@ -25353,7 +25393,7 @@ YYLTYPE yylloc; ;} break; - case 738: + case 739: #line 1309 "third_party/libpg_query/grammar/statements/select.y" { /* POSITIONAL JOIN is a coordinated scan */ @@ -25369,7 +25409,7 @@ YYLTYPE yylloc; ;} break; - case 739: + case 740: #line 1322 "third_party/libpg_query/grammar/statements/select.y" { /* ANTI JOIN is a filter */ @@ -25387,7 +25427,7 @@ YYLTYPE yylloc; ;} break; - case 740: + case 741: #line 1337 "third_party/libpg_query/grammar/statements/select.y" { /* SEMI JOIN is also a filter */ @@ -25406,7 +25446,7 @@ YYLTYPE yylloc; ;} break; - case 741: + case 742: #line 1356 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = makeNode(PGAlias); @@ -25415,7 +25455,7 @@ YYLTYPE yylloc; ;} break; - case 742: + case 743: #line 1362 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = makeNode(PGAlias); @@ -25423,7 +25463,7 @@ YYLTYPE yylloc; ;} break; - case 743: + case 744: #line 1367 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = makeNode(PGAlias); @@ -25432,7 +25472,7 @@ YYLTYPE yylloc; ;} break; - case 744: + case 745: #line 1373 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = makeNode(PGAlias); @@ -25440,31 +25480,31 @@ YYLTYPE yylloc; ;} break; - case 745: + case 746: #line 1379 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = (yyvsp[(1) - (1)].alias); ;} break; - case 746: + case 747: #line 1380 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = NULL; ;} break; - case 747: + case 748: #line 1389 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (1)].alias), NIL); ;} break; - case 748: + case 749: #line 1393 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(NULL, (yyvsp[(3) - (4)].list)); ;} break; - case 749: + case 750: #line 1397 "third_party/libpg_query/grammar/statements/select.y" { PGAlias *a = makeNode(PGAlias); @@ -25473,7 +25513,7 @@ YYLTYPE yylloc; ;} break; - case 750: + case 751: #line 1403 "third_party/libpg_query/grammar/statements/select.y" { PGAlias *a = makeNode(PGAlias); @@ -25482,64 +25522,64 @@ YYLTYPE yylloc; ;} break; - case 751: + case 752: #line 1409 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(NULL, NIL); ;} break; - case 752: + case 753: #line 1414 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_FULL; ;} break; - case 753: + case 754: #line 1415 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_LEFT; ;} break; - case 754: + case 755: #line 1416 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_RIGHT; ;} break; - case 755: + case 756: #line 1417 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_SEMI; ;} break; - case 756: + case 757: #line 1418 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_ANTI; ;} break; - case 757: + case 758: #line 1419 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_INNER; ;} break; - case 758: + case 759: #line 1423 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 759: + case 760: #line 1424 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 760: + case 761: #line 1436 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) (yyvsp[(3) - (4)].list); ;} break; - case 761: + case 762: #line 1437 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 762: + case 763: #line 1443 "third_party/libpg_query/grammar/statements/select.y" { /* inheritance query, implicitly */ @@ -25549,7 +25589,7 @@ YYLTYPE yylloc; ;} break; - case 763: + case 764: #line 1450 "third_party/libpg_query/grammar/statements/select.y" { /* inheritance query, explicitly */ @@ -25559,7 +25599,7 @@ YYLTYPE yylloc; ;} break; - case 764: + case 765: #line 1457 "third_party/libpg_query/grammar/statements/select.y" { /* no inheritance */ @@ -25569,7 +25609,7 @@ YYLTYPE yylloc; ;} break; - case 765: + case 766: #line 1464 "third_party/libpg_query/grammar/statements/select.y" { /* no inheritance, SQL99-style syntax */ @@ -25579,7 +25619,7 @@ YYLTYPE yylloc; ;} break; - case 766: + case 767: #line 1496 "third_party/libpg_query/grammar/statements/select.y" { PGRangeFunction *n = makeNode(PGRangeFunction); @@ -25593,7 +25633,7 @@ YYLTYPE yylloc; ;} break; - case 767: + case 768: #line 1507 "third_party/libpg_query/grammar/statements/select.y" { PGRangeFunction *n = makeNode(PGRangeFunction); @@ -25607,66 +25647,66 @@ YYLTYPE yylloc; ;} break; - case 768: + case 769: #line 1520 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].list)); ;} break; - case 769: + case 770: #line 1524 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].list)); ;} break; - case 770: + case 771: #line 1525 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list)); ;} break; - case 771: + case 772: #line 1528 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 772: + case 773: #line 1529 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 773: + case 774: #line 1532 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 774: + case 775: #line 1533 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 775: + case 776: #line 1538 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 776: + case 777: #line 1539 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 777: + case 778: #line 1545 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 778: + case 779: #line 1549 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 779: + case 780: #line 1555 "third_party/libpg_query/grammar/statements/select.y" { PGColumnDef *n = makeNode(PGColumnDef); @@ -25687,7 +25727,7 @@ YYLTYPE yylloc; ;} break; - case 780: + case 781: #line 1576 "third_party/libpg_query/grammar/statements/select.y" { PGCollateClause *n = makeNode(PGCollateClause); @@ -25698,36 +25738,36 @@ YYLTYPE yylloc; ;} break; - case 781: + case 782: #line 1583 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 782: + case 783: #line 1596 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(list_make2(makeString((yyvsp[(1) - (2)].str)), (yyvsp[(2) - (2)].typnam))); ;} break; - case 783: + case 784: #line 1599 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (4)].list), list_make2(makeString((yyvsp[(3) - (4)].str)), (yyvsp[(4) - (4)].typnam))); ;} break; - case 786: + case 787: #line 1606 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 787: + case 788: #line 1607 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = NULL; ;} break; - case 788: + case 789: #line 1610 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (2)].typnam); @@ -25735,7 +25775,7 @@ YYLTYPE yylloc; ;} break; - case 789: + case 790: #line 1615 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(2) - (3)].typnam); @@ -25744,7 +25784,7 @@ YYLTYPE yylloc; ;} break; - case 790: + case 791: #line 1622 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (5)].typnam); @@ -25752,7 +25792,7 @@ YYLTYPE yylloc; ;} break; - case 791: + case 792: #line 1627 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(2) - (6)].typnam); @@ -25761,7 +25801,7 @@ YYLTYPE yylloc; ;} break; - case 792: + case 793: #line 1633 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (2)].typnam); @@ -25769,7 +25809,7 @@ YYLTYPE yylloc; ;} break; - case 793: + case 794: #line 1638 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(2) - (3)].typnam); @@ -25778,14 +25818,14 @@ YYLTYPE yylloc; ;} break; - case 794: + case 795: #line 1644 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = makeTypeNameFromNameList((yyvsp[(1) - (1)].list)); ;} break; - case 795: + case 796: #line 1648 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("struct"); @@ -25795,7 +25835,7 @@ YYLTYPE yylloc; ;} break; - case 796: + case 797: #line 1655 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("map"); @@ -25805,7 +25845,7 @@ YYLTYPE yylloc; ;} break; - case 797: + case 798: #line 1662 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("union"); @@ -25815,57 +25855,57 @@ YYLTYPE yylloc; ;} break; - case 798: + case 799: #line 1671 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(makeString((yyvsp[(1) - (3)].str)), makeString((yyvsp[(3) - (3)].str))); ;} break; - case 799: + case 800: #line 1672 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), makeString((yyvsp[(3) - (3)].str))); ;} break; - case 800: + case 801: #line 1677 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), makeInteger(-1)); ;} break; - case 801: + case 802: #line 1679 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (4)].list), makeInteger((yyvsp[(3) - (4)].ival))); ;} break; - case 802: + case 803: #line 1681 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 803: + case 804: #line 1685 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 804: + case 805: #line 1686 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 805: + case 806: #line 1687 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 806: + case 807: #line 1688 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 807: + case 808: #line 1689 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 808: + case 809: #line 1691 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (2)].typnam); @@ -25873,7 +25913,7 @@ YYLTYPE yylloc; ;} break; - case 809: + case 810: #line 1696 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (4)].typnam); @@ -25882,27 +25922,27 @@ YYLTYPE yylloc; ;} break; - case 810: + case 811: #line 1715 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 811: + case 812: #line 1716 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 812: + case 813: #line 1717 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 813: + case 814: #line 1718 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 814: + case 815: #line 1730 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = makeTypeName((yyvsp[(1) - (2)].str)); @@ -25911,17 +25951,17 @@ YYLTYPE yylloc; ;} break; - case 815: + case 816: #line 1743 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 816: + case 817: #line 1744 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 817: + case 818: #line 1751 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("int4"); @@ -25929,7 +25969,7 @@ YYLTYPE yylloc; ;} break; - case 818: + case 819: #line 1756 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("int4"); @@ -25937,7 +25977,7 @@ YYLTYPE yylloc; ;} break; - case 819: + case 820: #line 1761 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("int2"); @@ -25945,7 +25985,7 @@ YYLTYPE yylloc; ;} break; - case 820: + case 821: #line 1766 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("int8"); @@ -25953,7 +25993,7 @@ YYLTYPE yylloc; ;} break; - case 821: + case 822: #line 1771 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("float4"); @@ -25961,7 +26001,7 @@ YYLTYPE yylloc; ;} break; - case 822: + case 823: #line 1776 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(2) - (2)].typnam); @@ -25969,7 +26009,7 @@ YYLTYPE yylloc; ;} break; - case 823: + case 824: #line 1781 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("float8"); @@ -25977,7 +26017,7 @@ YYLTYPE yylloc; ;} break; - case 824: + case 825: #line 1786 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("numeric"); @@ -25986,7 +26026,7 @@ YYLTYPE yylloc; ;} break; - case 825: + case 826: #line 1792 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("numeric"); @@ -25995,7 +26035,7 @@ YYLTYPE yylloc; ;} break; - case 826: + case 827: #line 1798 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("numeric"); @@ -26004,7 +26044,7 @@ YYLTYPE yylloc; ;} break; - case 827: + case 828: #line 1804 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("bool"); @@ -26012,7 +26052,7 @@ YYLTYPE yylloc; ;} break; - case 828: + case 829: #line 1811 "third_party/libpg_query/grammar/statements/select.y" { /* @@ -26036,35 +26076,35 @@ YYLTYPE yylloc; ;} break; - case 829: + case 830: #line 1832 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("float4"); ;} break; - case 830: + case 831: #line 1842 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 831: + case 832: #line 1846 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 832: + case 833: #line 1854 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 833: + case 834: #line 1858 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); @@ -26072,7 +26112,7 @@ YYLTYPE yylloc; ;} break; - case 834: + case 835: #line 1866 "third_party/libpg_query/grammar/statements/select.y" { const char *typname; @@ -26084,7 +26124,7 @@ YYLTYPE yylloc; ;} break; - case 835: + case 836: #line 1878 "third_party/libpg_query/grammar/statements/select.y" { /* bit defaults to bit(1), varbit to no limit */ @@ -26101,28 +26141,28 @@ YYLTYPE yylloc; ;} break; - case 836: + case 837: #line 1899 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 837: + case 838: #line 1903 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 838: + case 839: #line 1909 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 839: + case 840: #line 1913 "third_party/libpg_query/grammar/statements/select.y" { /* Length was not specified so allow to be unrestricted. @@ -26136,7 +26176,7 @@ YYLTYPE yylloc; ;} break; - case 840: + case 841: #line 1926 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName((yyvsp[(1) - (4)].conststr)); @@ -26145,7 +26185,7 @@ YYLTYPE yylloc; ;} break; - case 841: + case 842: #line 1934 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName((yyvsp[(1) - (1)].conststr)); @@ -26156,47 +26196,47 @@ YYLTYPE yylloc; ;} break; - case 842: + case 843: #line 1944 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = (yyvsp[(2) - (2)].boolean) ? "varchar": "bpchar"; ;} break; - case 843: + case 844: #line 1946 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = (yyvsp[(2) - (2)].boolean) ? "varchar": "bpchar"; ;} break; - case 844: + case 845: #line 1948 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = "varchar"; ;} break; - case 845: + case 846: #line 1950 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = (yyvsp[(3) - (3)].boolean) ? "varchar": "bpchar"; ;} break; - case 846: + case 847: #line 1952 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = (yyvsp[(3) - (3)].boolean) ? "varchar": "bpchar"; ;} break; - case 847: + case 848: #line 1954 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = (yyvsp[(2) - (2)].boolean) ? "varchar": "bpchar"; ;} break; - case 848: + case 849: #line 1958 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 849: + case 850: #line 1959 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 850: + case 851: #line 1967 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(5) - (5)].boolean)) @@ -26208,7 +26248,7 @@ YYLTYPE yylloc; ;} break; - case 851: + case 852: #line 1976 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(2) - (2)].boolean)) @@ -26219,7 +26259,7 @@ YYLTYPE yylloc; ;} break; - case 852: + case 853: #line 1984 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(5) - (5)].boolean)) @@ -26231,7 +26271,7 @@ YYLTYPE yylloc; ;} break; - case 853: + case 854: #line 1993 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(2) - (2)].boolean)) @@ -26242,7 +26282,7 @@ YYLTYPE yylloc; ;} break; - case 854: + case 855: #line 2004 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("interval"); @@ -26250,82 +26290,82 @@ YYLTYPE yylloc; ;} break; - case 855: + case 856: #line 2011 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 856: + case 857: #line 2012 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 857: + case 858: #line 2013 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 882: + case 883: #line 2054 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(YEAR), (yylsp[(1) - (1)]))); ;} break; - case 883: + case 884: #line 2056 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MONTH), (yylsp[(1) - (1)]))); ;} break; - case 884: + case 885: #line 2058 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(DAY), (yylsp[(1) - (1)]))); ;} break; - case 885: + case 886: #line 2060 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(HOUR), (yylsp[(1) - (1)]))); ;} break; - case 886: + case 887: #line 2062 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MINUTE), (yylsp[(1) - (1)]))); ;} break; - case 887: + case 888: #line 2064 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(SECOND), (yylsp[(1) - (1)]))); ;} break; - case 888: + case 889: #line 2066 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MILLISECOND), (yylsp[(1) - (1)]))); ;} break; - case 889: + case 890: #line 2068 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MICROSECOND), (yylsp[(1) - (1)]))); ;} break; - case 890: + case 891: #line 2070 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(WEEK), (yylsp[(1) - (1)]))); ;} break; - case 891: + case 892: #line 2072 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(DECADE), (yylsp[(1) - (1)]))); ;} break; - case 892: + case 893: #line 2074 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(CENTURY), (yylsp[(1) - (1)]))); ;} break; - case 893: + case 894: #line 2076 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MILLENNIUM), (yylsp[(1) - (1)]))); ;} break; - case 894: + case 895: #line 2078 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(YEAR) | @@ -26333,7 +26373,7 @@ YYLTYPE yylloc; ;} break; - case 895: + case 896: #line 2083 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(DAY) | @@ -26341,7 +26381,7 @@ YYLTYPE yylloc; ;} break; - case 896: + case 897: #line 2088 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(DAY) | @@ -26350,7 +26390,7 @@ YYLTYPE yylloc; ;} break; - case 897: + case 898: #line 2094 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(DAY) | @@ -26360,7 +26400,7 @@ YYLTYPE yylloc; ;} break; - case 898: + case 899: #line 2101 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(HOUR) | @@ -26368,7 +26408,7 @@ YYLTYPE yylloc; ;} break; - case 899: + case 900: #line 2106 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(HOUR) | @@ -26377,7 +26417,7 @@ YYLTYPE yylloc; ;} break; - case 900: + case 901: #line 2112 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MINUTE) | @@ -26385,22 +26425,22 @@ YYLTYPE yylloc; ;} break; - case 901: + case 902: #line 2117 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 902: + case 903: #line 2148 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 903: + case 904: #line 2151 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeTypeCast((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].typnam), 0, (yylsp[(2) - (3)])); ;} break; - case 904: + case 905: #line 2153 "third_party/libpg_query/grammar/statements/select.y" { PGCollateClause *n = makeNode(PGCollateClause); @@ -26411,7 +26451,7 @@ YYLTYPE yylloc; ;} break; - case 905: + case 906: #line 2161 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("timezone"), @@ -26420,122 +26460,122 @@ YYLTYPE yylloc; ;} break; - case 906: + case 907: #line 2176 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "+", NULL, (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 907: + case 908: #line 2178 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = doNegate((yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 908: + case 909: #line 2180 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "+", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 909: + case 910: #line 2182 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "-", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 910: + case 911: #line 2184 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "*", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 911: + case 912: #line 2186 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "/", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 912: + case 913: #line 2188 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "//", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 913: + case 914: #line 2190 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "%", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 914: + case 915: #line 2192 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "^", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 915: + case 916: #line 2194 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "**", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 916: + case 917: #line 2196 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 917: + case 918: #line 2198 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, ">", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 918: + case 919: #line 2200 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 919: + case 920: #line 2202 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 920: + case 921: #line 2204 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, ">=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 921: + case 922: #line 2206 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<>", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 922: + case 923: #line 2209 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(2) - (3)].list), (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 923: + case 924: #line 2211 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(1) - (2)].list), NULL, (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 924: + case 925: #line 2213 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(2) - (2)].list), (yyvsp[(1) - (2)].node), NULL, (yylsp[(2) - (2)])); ;} break; - case 925: + case 926: #line 2216 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeAndExpr((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 926: + case 927: #line 2218 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeOrExpr((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 927: + case 928: #line 2220 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeNotExpr((yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 928: + case 929: #line 2222 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeNotExpr((yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 929: + case 930: #line 2224 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_GLOB, "~~~", @@ -26543,7 +26583,7 @@ YYLTYPE yylloc; ;} break; - case 930: + case 931: #line 2229 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_LIKE, "~~", @@ -26551,7 +26591,7 @@ YYLTYPE yylloc; ;} break; - case 931: + case 932: #line 2234 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("like_escape"), @@ -26561,7 +26601,7 @@ YYLTYPE yylloc; ;} break; - case 932: + case 933: #line 2241 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_LIKE, "!~~", @@ -26569,7 +26609,7 @@ YYLTYPE yylloc; ;} break; - case 933: + case 934: #line 2246 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("not_like_escape"), @@ -26579,7 +26619,7 @@ YYLTYPE yylloc; ;} break; - case 934: + case 935: #line 2253 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_ILIKE, "~~*", @@ -26587,7 +26627,7 @@ YYLTYPE yylloc; ;} break; - case 935: + case 936: #line 2258 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("ilike_escape"), @@ -26597,7 +26637,7 @@ YYLTYPE yylloc; ;} break; - case 936: + case 937: #line 2265 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_ILIKE, "!~~*", @@ -26605,7 +26645,7 @@ YYLTYPE yylloc; ;} break; - case 937: + case 938: #line 2270 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("not_ilike_escape"), @@ -26615,7 +26655,7 @@ YYLTYPE yylloc; ;} break; - case 938: + case 939: #line 2278 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), @@ -26626,7 +26666,7 @@ YYLTYPE yylloc; ;} break; - case 939: + case 940: #line 2286 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), @@ -26637,7 +26677,7 @@ YYLTYPE yylloc; ;} break; - case 940: + case 941: #line 2294 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), @@ -26648,7 +26688,7 @@ YYLTYPE yylloc; ;} break; - case 941: + case 942: #line 2302 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), @@ -26659,7 +26699,7 @@ YYLTYPE yylloc; ;} break; - case 942: + case 943: #line 2320 "third_party/libpg_query/grammar/statements/select.y" { PGNullTest *n = makeNode(PGNullTest); @@ -26670,7 +26710,7 @@ YYLTYPE yylloc; ;} break; - case 943: + case 944: #line 2328 "third_party/libpg_query/grammar/statements/select.y" { PGNullTest *n = makeNode(PGNullTest); @@ -26681,7 +26721,7 @@ YYLTYPE yylloc; ;} break; - case 944: + case 945: #line 2336 "third_party/libpg_query/grammar/statements/select.y" { PGNullTest *n = makeNode(PGNullTest); @@ -26692,7 +26732,7 @@ YYLTYPE yylloc; ;} break; - case 945: + case 946: #line 2344 "third_party/libpg_query/grammar/statements/select.y" { PGNullTest *n = makeNode(PGNullTest); @@ -26703,7 +26743,7 @@ YYLTYPE yylloc; ;} break; - case 946: + case 947: #line 2352 "third_party/libpg_query/grammar/statements/select.y" { PGNullTest *n = makeNode(PGNullTest); @@ -26714,7 +26754,7 @@ YYLTYPE yylloc; ;} break; - case 947: + case 948: #line 2360 "third_party/libpg_query/grammar/statements/select.y" { PGLambdaFunction *n = makeNode(PGLambdaFunction); @@ -26725,14 +26765,14 @@ YYLTYPE yylloc; ;} break; - case 948: + case 949: #line 2368 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "->>", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 949: + case 950: #line 2372 "third_party/libpg_query/grammar/statements/select.y" { if (list_length((yyvsp[(1) - (3)].list)) != 2) @@ -26751,7 +26791,7 @@ YYLTYPE yylloc; ;} break; - case 950: + case 951: #line 2388 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); @@ -26762,7 +26802,7 @@ YYLTYPE yylloc; ;} break; - case 951: + case 952: #line 2396 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); @@ -26773,7 +26813,7 @@ YYLTYPE yylloc; ;} break; - case 952: + case 953: #line 2404 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); @@ -26784,7 +26824,7 @@ YYLTYPE yylloc; ;} break; - case 953: + case 954: #line 2412 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); @@ -26795,7 +26835,7 @@ YYLTYPE yylloc; ;} break; - case 954: + case 955: #line 2420 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); @@ -26806,7 +26846,7 @@ YYLTYPE yylloc; ;} break; - case 955: + case 956: #line 2428 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); @@ -26817,35 +26857,35 @@ YYLTYPE yylloc; ;} break; - case 956: + case 957: #line 2436 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_DISTINCT, "=", (yyvsp[(1) - (5)].node), (yyvsp[(5) - (5)].node), (yylsp[(2) - (5)])); ;} break; - case 957: + case 958: #line 2440 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_NOT_DISTINCT, "=", (yyvsp[(1) - (6)].node), (yyvsp[(6) - (6)].node), (yylsp[(2) - (6)])); ;} break; - case 958: + case 959: #line 2444 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OF, "=", (yyvsp[(1) - (6)].node), (PGNode *) (yyvsp[(5) - (6)].list), (yylsp[(2) - (6)])); ;} break; - case 959: + case 960: #line 2448 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OF, "<>", (yyvsp[(1) - (7)].node), (PGNode *) (yyvsp[(6) - (7)].list), (yylsp[(2) - (7)])); ;} break; - case 960: + case 961: #line 2452 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_BETWEEN, @@ -26856,7 +26896,7 @@ YYLTYPE yylloc; ;} break; - case 961: + case 962: #line 2460 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_NOT_BETWEEN, @@ -26867,7 +26907,7 @@ YYLTYPE yylloc; ;} break; - case 962: + case 963: #line 2468 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_BETWEEN_SYM, @@ -26878,7 +26918,7 @@ YYLTYPE yylloc; ;} break; - case 963: + case 964: #line 2476 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_NOT_BETWEEN_SYM, @@ -26889,7 +26929,7 @@ YYLTYPE yylloc; ;} break; - case 964: + case 965: #line 2484 "third_party/libpg_query/grammar/statements/select.y" { /* in_expr returns a PGSubLink or a list of a_exprs */ @@ -26912,7 +26952,7 @@ YYLTYPE yylloc; ;} break; - case 965: + case 966: #line 2504 "third_party/libpg_query/grammar/statements/select.y" { /* in_expr returns a PGSubLink or a list of a_exprs */ @@ -26937,7 +26977,7 @@ YYLTYPE yylloc; ;} break; - case 966: + case 967: #line 2526 "third_party/libpg_query/grammar/statements/select.y" { PGSubLink *n = makeNode(PGSubLink); @@ -26951,7 +26991,7 @@ YYLTYPE yylloc; ;} break; - case 967: + case 968: #line 2537 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(3) - (6)].subquerytype) == PG_ANY_SUBLINK) @@ -26961,7 +27001,7 @@ YYLTYPE yylloc; ;} break; - case 968: + case 969: #line 2544 "third_party/libpg_query/grammar/statements/select.y" { /* @@ -26978,7 +27018,7 @@ YYLTYPE yylloc; ;} break; - case 969: + case 970: #line 2558 "third_party/libpg_query/grammar/statements/select.y" { PGAStar *star = makeNode(PGAStar); @@ -26989,7 +27029,7 @@ YYLTYPE yylloc; ;} break; - case 970: + case 971: #line 2566 "third_party/libpg_query/grammar/statements/select.y" { PGAStar *star = makeNode(PGAStar); @@ -27000,7 +27040,7 @@ YYLTYPE yylloc; ;} break; - case 971: + case 972: #line 2574 "third_party/libpg_query/grammar/statements/select.y" { PGAStar *star = makeNode(PGAStar); @@ -27012,140 +27052,140 @@ YYLTYPE yylloc; ;} break; - case 972: + case 973: #line 2594 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 973: + case 974: #line 2596 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeTypeCast((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].typnam), 0, (yylsp[(2) - (3)])); ;} break; - case 974: + case 975: #line 2598 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "+", NULL, (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 975: + case 976: #line 2600 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = doNegate((yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 976: + case 977: #line 2602 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "+", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 977: + case 978: #line 2604 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "-", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 978: + case 979: #line 2606 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "*", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 979: + case 980: #line 2608 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "/", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 980: + case 981: #line 2610 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "//", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 981: + case 982: #line 2612 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "%", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 982: + case 983: #line 2614 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "^", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 983: + case 984: #line 2616 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "**", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 984: + case 985: #line 2618 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 985: + case 986: #line 2620 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, ">", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 986: + case 987: #line 2622 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 987: + case 988: #line 2624 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 988: + case 989: #line 2626 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, ">=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 989: + case 990: #line 2628 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<>", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 990: + case 991: #line 2630 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(2) - (3)].list), (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 991: + case 992: #line 2632 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(1) - (2)].list), NULL, (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 992: + case 993: #line 2634 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(2) - (2)].list), (yyvsp[(1) - (2)].node), NULL, (yylsp[(2) - (2)])); ;} break; - case 993: + case 994: #line 2636 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_DISTINCT, "=", (yyvsp[(1) - (5)].node), (yyvsp[(5) - (5)].node), (yylsp[(2) - (5)])); ;} break; - case 994: + case 995: #line 2640 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_NOT_DISTINCT, "=", (yyvsp[(1) - (6)].node), (yyvsp[(6) - (6)].node), (yylsp[(2) - (6)])); ;} break; - case 995: + case 996: #line 2644 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OF, "=", (yyvsp[(1) - (6)].node), (PGNode *) (yyvsp[(5) - (6)].list), (yylsp[(2) - (6)])); ;} break; - case 996: + case 997: #line 2648 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OF, "<>", (yyvsp[(1) - (7)].node), (PGNode *) (yyvsp[(6) - (7)].list), (yylsp[(2) - (7)])); ;} break; - case 998: + case 999: #line 2663 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(2) - (2)].list)) @@ -27160,17 +27200,17 @@ YYLTYPE yylloc; ;} break; - case 999: + case 1000: #line 2676 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1000: + case 1001: #line 2677 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1001: + case 1002: #line 2679 "third_party/libpg_query/grammar/statements/select.y" { PGSubLink *n = makeNode(PGSubLink); @@ -27184,7 +27224,7 @@ YYLTYPE yylloc; ;} break; - case 1002: + case 1003: #line 2690 "third_party/libpg_query/grammar/statements/select.y" { /* @@ -27211,7 +27251,7 @@ YYLTYPE yylloc; ;} break; - case 1003: + case 1004: #line 2714 "third_party/libpg_query/grammar/statements/select.y" { PGSubLink *n = makeNode(PGSubLink); @@ -27225,7 +27265,7 @@ YYLTYPE yylloc; ;} break; - case 1004: + case 1005: #line 2725 "third_party/libpg_query/grammar/statements/select.y" { PGGroupingFunc *g = makeNode(PGGroupingFunc); @@ -27235,21 +27275,21 @@ YYLTYPE yylloc; ;} break; - case 1005: + case 1006: #line 2735 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 1006: + case 1007: #line 2739 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1007: + case 1008: #line 2742 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("row"), (yyvsp[(1) - (1)].list), (yylsp[(1) - (1)])); @@ -27257,14 +27297,14 @@ YYLTYPE yylloc; ;} break; - case 1008: + case 1009: #line 2750 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeParamRef(0, (yylsp[(1) - (1)])); ;} break; - case 1009: + case 1010: #line 2754 "third_party/libpg_query/grammar/statements/select.y" { PGParamRef *p = makeNode(PGParamRef); @@ -27274,14 +27314,14 @@ YYLTYPE yylloc; ;} break; - case 1010: + case 1011: #line 2761 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1011: + case 1012: #line 2765 "third_party/libpg_query/grammar/statements/select.y" { PGList *key_list = NULL; @@ -27301,35 +27341,34 @@ YYLTYPE yylloc; ;} break; - case 1012: + case 1013: #line 2782 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1013: + case 1014: #line 2786 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1014: + case 1015: #line 2787 "third_party/libpg_query/grammar/statements/select.y" { - PGFuncCall *n = makeFuncCall(SystemFuncName("list_value"), (yyvsp[(2) - (3)].list), (yylsp[(2) - (3)])); - (yyval.node) = (PGNode *) n; + (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1015: -#line 2791 "third_party/libpg_query/grammar/statements/select.y" + case 1016: +#line 2790 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1016: -#line 2795 "third_party/libpg_query/grammar/statements/select.y" + case 1017: +#line 2794 "third_party/libpg_query/grammar/statements/select.y" { PGSubLink *n = makeNode(PGSubLink); n->subLinkType = PG_ARRAY_SUBLINK; @@ -27342,8 +27381,8 @@ YYLTYPE yylloc; ;} break; - case 1017: -#line 2805 "third_party/libpg_query/grammar/statements/select.y" + case 1018: +#line 2804 "third_party/libpg_query/grammar/statements/select.y" { PGList *func_name = list_make1(makeString("construct_array")); PGFuncCall *n = makeFuncCall(func_name, (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); @@ -27351,8 +27390,8 @@ YYLTYPE yylloc; ;} break; - case 1018: -#line 2811 "third_party/libpg_query/grammar/statements/select.y" + case 1019: +#line 2810 "third_party/libpg_query/grammar/statements/select.y" { PGPositionalReference *n = makeNode(PGPositionalReference); n->position = (yyvsp[(2) - (2)].ival); @@ -27361,66 +27400,74 @@ YYLTYPE yylloc; ;} break; - case 1019: -#line 2818 "third_party/libpg_query/grammar/statements/select.y" + case 1020: +#line 2817 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeNamedParamRef((yyvsp[(2) - (2)].str), (yylsp[(1) - (2)])); ;} break; - case 1020: -#line 2826 "third_party/libpg_query/grammar/statements/select.y" + case 1021: +#line 2822 "third_party/libpg_query/grammar/statements/select.y" + { + PGFuncCall *n = makeFuncCall(SystemFuncName("list_value"), (yyvsp[(2) - (3)].list), (yylsp[(2) - (3)])); + (yyval.node) = (PGNode *) n; + ;} + break; + + case 1022: +#line 2829 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *f = makeFuncCall(SystemFuncName("struct_pack"), (yyvsp[(2) - (3)].list), (yylsp[(2) - (3)])); (yyval.node) = (PGNode *) f; ;} break; - case 1021: -#line 2835 "third_party/libpg_query/grammar/statements/select.y" + case 1023: +#line 2838 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall((yyvsp[(1) - (3)].list), NIL, (yylsp[(1) - (3)])); ;} break; - case 1022: -#line 2839 "third_party/libpg_query/grammar/statements/select.y" + case 1024: +#line 2842 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (6)].list), (yyvsp[(3) - (6)].list), (yylsp[(1) - (6)])); n->agg_order = (yyvsp[(4) - (6)].list); - n->agg_ignore_nulls = (yyvsp[(5) - (6)].boolean); + n->agg_ignore_nulls = (yyvsp[(5) - (6)].ignorenulls); (yyval.node) = (PGNode *)n; ;} break; - case 1023: -#line 2846 "third_party/libpg_query/grammar/statements/select.y" + case 1025: +#line 2849 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (7)].list), list_make1((yyvsp[(4) - (7)].node)), (yylsp[(1) - (7)])); n->func_variadic = true; n->agg_order = (yyvsp[(5) - (7)].list); - n->agg_ignore_nulls = (yyvsp[(6) - (7)].boolean); + n->agg_ignore_nulls = (yyvsp[(6) - (7)].ignorenulls); (yyval.node) = (PGNode *)n; ;} break; - case 1024: -#line 2854 "third_party/libpg_query/grammar/statements/select.y" + case 1026: +#line 2857 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (9)].list), lappend((yyvsp[(3) - (9)].list), (yyvsp[(6) - (9)].node)), (yylsp[(1) - (9)])); n->func_variadic = true; n->agg_order = (yyvsp[(7) - (9)].list); - n->agg_ignore_nulls = (yyvsp[(8) - (9)].boolean); + n->agg_ignore_nulls = (yyvsp[(8) - (9)].ignorenulls); (yyval.node) = (PGNode *)n; ;} break; - case 1025: -#line 2862 "third_party/libpg_query/grammar/statements/select.y" + case 1027: +#line 2865 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (7)].list), (yyvsp[(4) - (7)].list), (yylsp[(1) - (7)])); n->agg_order = (yyvsp[(5) - (7)].list); - n->agg_ignore_nulls = (yyvsp[(6) - (7)].boolean); + n->agg_ignore_nulls = (yyvsp[(6) - (7)].ignorenulls); /* Ideally we'd mark the PGFuncCall node to indicate * "must be an aggregate", but there's no provision * for that in PGFuncCall at the moment. @@ -27429,19 +27476,19 @@ YYLTYPE yylloc; ;} break; - case 1026: -#line 2873 "third_party/libpg_query/grammar/statements/select.y" + case 1028: +#line 2876 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (7)].list), (yyvsp[(4) - (7)].list), (yylsp[(1) - (7)])); n->agg_order = (yyvsp[(5) - (7)].list); - n->agg_ignore_nulls = (yyvsp[(6) - (7)].boolean); + n->agg_ignore_nulls = (yyvsp[(6) - (7)].ignorenulls); n->agg_distinct = true; (yyval.node) = (PGNode *)n; ;} break; - case 1027: -#line 2893 "third_party/libpg_query/grammar/statements/select.y" + case 1029: +#line 2896 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = (PGFuncCall *) (yyvsp[(1) - (5)].node); /* @@ -27479,23 +27526,23 @@ YYLTYPE yylloc; ;} break; - case 1028: -#line 2929 "third_party/libpg_query/grammar/statements/select.y" + case 1030: +#line 2932 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1029: -#line 2939 "third_party/libpg_query/grammar/statements/select.y" + case 1031: +#line 2942 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1030: -#line 2940 "third_party/libpg_query/grammar/statements/select.y" + case 1032: +#line 2943 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1031: -#line 2948 "third_party/libpg_query/grammar/statements/select.y" + case 1033: +#line 2951 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("pg_collation_for"), list_make1((yyvsp[(4) - (5)].node)), @@ -27503,25 +27550,25 @@ YYLTYPE yylloc; ;} break; - case 1032: -#line 2954 "third_party/libpg_query/grammar/statements/select.y" + case 1034: +#line 2957 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeTypeCast((yyvsp[(3) - (6)].node), (yyvsp[(5) - (6)].typnam), 0, (yylsp[(1) - (6)])); ;} break; - case 1033: -#line 2956 "third_party/libpg_query/grammar/statements/select.y" + case 1035: +#line 2959 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeTypeCast((yyvsp[(3) - (6)].node), (yyvsp[(5) - (6)].typnam), 1, (yylsp[(1) - (6)])); ;} break; - case 1034: -#line 2958 "third_party/libpg_query/grammar/statements/select.y" + case 1036: +#line 2961 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("date_part"), (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 1035: -#line 2962 "third_party/libpg_query/grammar/statements/select.y" + case 1037: +#line 2965 "third_party/libpg_query/grammar/statements/select.y" { /* overlay(A PLACING B FROM C FOR D) is converted to * overlay(A, B, C, D) @@ -27532,16 +27579,16 @@ YYLTYPE yylloc; ;} break; - case 1036: -#line 2971 "third_party/libpg_query/grammar/statements/select.y" + case 1038: +#line 2974 "third_party/libpg_query/grammar/statements/select.y" { - /* position(A in B) is converted to position(B, A) */ - (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("position"), (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); + /* position(A in B) is converted to position_inverse(A, B) */ + (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("__internal_position_operator"), (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 1037: -#line 2976 "third_party/libpg_query/grammar/statements/select.y" + case 1039: +#line 2979 "third_party/libpg_query/grammar/statements/select.y" { /* substring(A from B for C) is converted to * substring(A, B, C) - thomas 2000-11-28 @@ -27550,8 +27597,8 @@ YYLTYPE yylloc; ;} break; - case 1038: -#line 2983 "third_party/libpg_query/grammar/statements/select.y" + case 1040: +#line 2986 "third_party/libpg_query/grammar/statements/select.y" { /* TREAT(expr AS target) converts expr of a particular type to target, * which is defined to be a subtype of the original expression. @@ -27568,8 +27615,8 @@ YYLTYPE yylloc; ;} break; - case 1039: -#line 2998 "third_party/libpg_query/grammar/statements/select.y" + case 1041: +#line 3001 "third_party/libpg_query/grammar/statements/select.y" { /* various trim expressions are defined in SQL * - thomas 1997-07-19 @@ -27578,36 +27625,36 @@ YYLTYPE yylloc; ;} break; - case 1040: -#line 3005 "third_party/libpg_query/grammar/statements/select.y" + case 1042: +#line 3008 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("ltrim"), (yyvsp[(4) - (5)].list), (yylsp[(1) - (5)])); ;} break; - case 1041: -#line 3009 "third_party/libpg_query/grammar/statements/select.y" + case 1043: +#line 3012 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("rtrim"), (yyvsp[(4) - (5)].list), (yylsp[(1) - (5)])); ;} break; - case 1042: -#line 3013 "third_party/libpg_query/grammar/statements/select.y" + case 1044: +#line 3016 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("trim"), (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 1043: -#line 3017 "third_party/libpg_query/grammar/statements/select.y" + case 1045: +#line 3020 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_NULLIF, "=", (yyvsp[(3) - (6)].node), (yyvsp[(5) - (6)].node), (yylsp[(1) - (6)])); ;} break; - case 1044: -#line 3021 "third_party/libpg_query/grammar/statements/select.y" + case 1046: +#line 3024 "third_party/libpg_query/grammar/statements/select.y" { PGCoalesceExpr *c = makeNode(PGCoalesceExpr); c->args = (yyvsp[(3) - (4)].list); @@ -27616,8 +27663,8 @@ YYLTYPE yylloc; ;} break; - case 1045: -#line 3031 "third_party/libpg_query/grammar/statements/select.y" + case 1047: +#line 3034 "third_party/libpg_query/grammar/statements/select.y" { PGLambdaFunction *lambda = makeNode(PGLambdaFunction); lambda->lhs = makeColumnRef((yyvsp[(4) - (7)].str), NIL, (yylsp[(4) - (7)]), yyscanner); @@ -27628,8 +27675,8 @@ YYLTYPE yylloc; ;} break; - case 1046: -#line 3040 "third_party/libpg_query/grammar/statements/select.y" + case 1048: +#line 3043 "third_party/libpg_query/grammar/statements/select.y" { PGLambdaFunction *lambda = makeNode(PGLambdaFunction); lambda->lhs = makeColumnRef((yyvsp[(4) - (9)].str), NIL, (yylsp[(4) - (9)]), yyscanner); @@ -27646,63 +27693,63 @@ YYLTYPE yylloc; ;} break; - case 1047: -#line 3061 "third_party/libpg_query/grammar/statements/select.y" + case 1049: +#line 3064 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(4) - (5)].list); ;} break; - case 1048: -#line 3062 "third_party/libpg_query/grammar/statements/select.y" + case 1050: +#line 3065 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1049: -#line 3066 "third_party/libpg_query/grammar/statements/select.y" + case 1051: +#line 3069 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(4) - (5)].node); ;} break; - case 1050: -#line 3067 "third_party/libpg_query/grammar/statements/select.y" + case 1052: +#line 3070 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(3) - (4)].node); ;} break; - case 1051: -#line 3068 "third_party/libpg_query/grammar/statements/select.y" + case 1053: +#line 3071 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 1052: -#line 3072 "third_party/libpg_query/grammar/statements/select.y" + case 1054: +#line 3075 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 1053: -#line 3073 "third_party/libpg_query/grammar/statements/select.y" + case 1055: +#line 3076 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 1054: -#line 3080 "third_party/libpg_query/grammar/statements/select.y" + case 1056: +#line 3083 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 1055: -#line 3081 "third_party/libpg_query/grammar/statements/select.y" + case 1057: +#line 3084 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1056: -#line 3085 "third_party/libpg_query/grammar/statements/select.y" + case 1058: +#line 3088 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].windef)); ;} break; - case 1057: -#line 3087 "third_party/libpg_query/grammar/statements/select.y" + case 1059: +#line 3090 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].windef)); ;} break; - case 1058: -#line 3092 "third_party/libpg_query/grammar/statements/select.y" + case 1060: +#line 3095 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = (yyvsp[(3) - (3)].windef); n->name = (yyvsp[(1) - (3)].str); @@ -27710,13 +27757,13 @@ YYLTYPE yylloc; ;} break; - case 1059: -#line 3100 "third_party/libpg_query/grammar/statements/select.y" + case 1061: +#line 3103 "third_party/libpg_query/grammar/statements/select.y" { (yyval.windef) = (yyvsp[(2) - (2)].windef); ;} break; - case 1060: -#line 3102 "third_party/libpg_query/grammar/statements/select.y" + case 1062: +#line 3105 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); n->name = (yyvsp[(2) - (2)].str); @@ -27731,13 +27778,13 @@ YYLTYPE yylloc; ;} break; - case 1061: -#line 3115 "third_party/libpg_query/grammar/statements/select.y" + case 1063: +#line 3118 "third_party/libpg_query/grammar/statements/select.y" { (yyval.windef) = NULL; ;} break; - case 1062: -#line 3120 "third_party/libpg_query/grammar/statements/select.y" + case 1064: +#line 3123 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); n->name = NULL; @@ -27753,28 +27800,28 @@ YYLTYPE yylloc; ;} break; - case 1063: -#line 3145 "third_party/libpg_query/grammar/statements/select.y" + case 1065: +#line 3148 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1064: -#line 3146 "third_party/libpg_query/grammar/statements/select.y" + case 1066: +#line 3149 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = NULL; ;} break; - case 1065: -#line 3149 "third_party/libpg_query/grammar/statements/select.y" + case 1067: +#line 3152 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (3)].list); ;} break; - case 1066: -#line 3150 "third_party/libpg_query/grammar/statements/select.y" + case 1068: +#line 3153 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1067: -#line 3159 "third_party/libpg_query/grammar/statements/select.y" + case 1069: +#line 3162 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = (yyvsp[(2) - (3)].windef); @@ -27784,8 +27831,8 @@ YYLTYPE yylloc; ;} break; - case 1068: -#line 3167 "third_party/libpg_query/grammar/statements/select.y" + case 1070: +#line 3170 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = (yyvsp[(2) - (3)].windef); @@ -27795,8 +27842,8 @@ YYLTYPE yylloc; ;} break; - case 1069: -#line 3175 "third_party/libpg_query/grammar/statements/select.y" + case 1071: +#line 3178 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = (yyvsp[(2) - (3)].windef); @@ -27806,8 +27853,8 @@ YYLTYPE yylloc; ;} break; - case 1070: -#line 3183 "third_party/libpg_query/grammar/statements/select.y" + case 1072: +#line 3186 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -27818,8 +27865,8 @@ YYLTYPE yylloc; ;} break; - case 1071: -#line 3194 "third_party/libpg_query/grammar/statements/select.y" + case 1073: +#line 3197 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = (yyvsp[(1) - (1)].windef); @@ -27839,8 +27886,8 @@ YYLTYPE yylloc; ;} break; - case 1072: -#line 3212 "third_party/libpg_query/grammar/statements/select.y" + case 1074: +#line 3215 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n1 = (yyvsp[(2) - (4)].windef); PGWindowDef *n2 = (yyvsp[(4) - (4)].windef); @@ -27880,8 +27927,8 @@ YYLTYPE yylloc; ;} break; - case 1073: -#line 3258 "third_party/libpg_query/grammar/statements/select.y" + case 1075: +#line 3261 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -27892,8 +27939,8 @@ YYLTYPE yylloc; ;} break; - case 1074: -#line 3267 "third_party/libpg_query/grammar/statements/select.y" + case 1076: +#line 3270 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -27904,8 +27951,8 @@ YYLTYPE yylloc; ;} break; - case 1075: -#line 3276 "third_party/libpg_query/grammar/statements/select.y" + case 1077: +#line 3279 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -27916,8 +27963,8 @@ YYLTYPE yylloc; ;} break; - case 1076: -#line 3285 "third_party/libpg_query/grammar/statements/select.y" + case 1078: +#line 3288 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -27928,8 +27975,8 @@ YYLTYPE yylloc; ;} break; - case 1077: -#line 3294 "third_party/libpg_query/grammar/statements/select.y" + case 1079: +#line 3297 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -27940,53 +27987,53 @@ YYLTYPE yylloc; ;} break; - case 1078: -#line 3305 "third_party/libpg_query/grammar/statements/select.y" + case 1080: +#line 3308 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = FRAMEOPTION_EXCLUDE_CURRENT_ROW; ;} break; - case 1079: -#line 3306 "third_party/libpg_query/grammar/statements/select.y" + case 1081: +#line 3309 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = FRAMEOPTION_EXCLUDE_GROUP; ;} break; - case 1080: -#line 3307 "third_party/libpg_query/grammar/statements/select.y" + case 1082: +#line 3310 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = FRAMEOPTION_EXCLUDE_TIES; ;} break; - case 1081: -#line 3308 "third_party/libpg_query/grammar/statements/select.y" + case 1083: +#line 3311 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 1082: -#line 3309 "third_party/libpg_query/grammar/statements/select.y" + case 1084: +#line 3312 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 1083: -#line 3323 "third_party/libpg_query/grammar/statements/select.y" + case 1085: +#line 3326 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 1084: -#line 3324 "third_party/libpg_query/grammar/statements/select.y" + case 1086: +#line 3327 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1085: -#line 3327 "third_party/libpg_query/grammar/statements/select.y" + case 1087: +#line 3330 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list);;} break; - case 1086: -#line 3328 "third_party/libpg_query/grammar/statements/select.y" + case 1088: +#line 3331 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(2) - (5)].list), (yyvsp[(4) - (5)].node)); ;} break; - case 1087: -#line 3332 "third_party/libpg_query/grammar/statements/select.y" + case 1089: +#line 3335 "third_party/libpg_query/grammar/statements/select.y" { PGNamedArgExpr *na = makeNode(PGNamedArgExpr); na->name = (yyvsp[(1) - (3)].str); @@ -27997,321 +28044,321 @@ YYLTYPE yylloc; ;} break; - case 1088: -#line 3342 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} - break; - - case 1089: -#line 3343 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} - break; - case 1090: -#line 3347 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = (yyvsp[(1) - (1)].list); ;} +#line 3345 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; case 1091: -#line 3348 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = (yyvsp[(1) - (2)].list); ;} +#line 3346 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; case 1092: -#line 3353 "third_party/libpg_query/grammar/statements/select.y" - { - (yyval.list) = list_make2((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); - ;} +#line 3350 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; case 1093: -#line 3359 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1((yyvsp[(1) - (1)].list)); ;} +#line 3351 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; case 1094: -#line 3360 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list)); ;} +#line 3356 "third_party/libpg_query/grammar/statements/select.y" + { + (yyval.list) = list_make2((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + ;} break; case 1095: -#line 3365 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = (yyvsp[(1) - (1)].list); ;} +#line 3362 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1((yyvsp[(1) - (1)].list)); ;} break; case 1096: -#line 3366 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = (yyvsp[(1) - (2)].list); ;} +#line 3363 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list)); ;} break; case 1097: -#line 3371 "third_party/libpg_query/grammar/statements/select.y" +#line 3368 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; case 1098: -#line 3372 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = NULL; ;} +#line 3369 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; case 1099: -#line 3375 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.subquerytype) = PG_ANY_SUBLINK; ;} +#line 3374 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; case 1100: -#line 3376 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.subquerytype) = PG_ANY_SUBLINK; ;} +#line 3375 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = NULL; ;} break; case 1101: -#line 3377 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.subquerytype) = PG_ALL_SUBLINK; ;} +#line 3378 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.subquerytype) = PG_ANY_SUBLINK; ;} break; case 1102: -#line 3380 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.str) = (yyvsp[(1) - (1)].str); ;} +#line 3379 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.subquerytype) = PG_ANY_SUBLINK; ;} break; case 1103: -#line 3381 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.str) = (char*) (yyvsp[(1) - (1)].conststr); ;} +#line 3380 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.subquerytype) = PG_ALL_SUBLINK; ;} break; case 1104: -#line 3384 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "+"; ;} +#line 3383 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; case 1105: -#line 3385 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "-"; ;} +#line 3384 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.str) = (char*) (yyvsp[(1) - (1)].conststr); ;} break; case 1106: -#line 3386 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "*"; ;} +#line 3387 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "+"; ;} break; case 1107: -#line 3387 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "/"; ;} +#line 3388 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "-"; ;} break; case 1108: -#line 3388 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "//"; ;} +#line 3389 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "*"; ;} break; case 1109: -#line 3389 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "%"; ;} +#line 3390 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "/"; ;} break; case 1110: -#line 3390 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "^"; ;} +#line 3391 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "//"; ;} break; case 1111: -#line 3391 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "**"; ;} +#line 3392 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "%"; ;} break; case 1112: -#line 3392 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "<"; ;} +#line 3393 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "^"; ;} break; case 1113: -#line 3393 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = ">"; ;} +#line 3394 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "**"; ;} break; case 1114: -#line 3394 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "="; ;} +#line 3395 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "<"; ;} break; case 1115: -#line 3395 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "<="; ;} +#line 3396 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = ">"; ;} break; case 1116: -#line 3396 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = ">="; ;} +#line 3397 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "="; ;} break; case 1117: -#line 3397 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.conststr) = "<>"; ;} +#line 3398 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "<="; ;} break; case 1118: -#line 3401 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} +#line 3399 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = ">="; ;} break; case 1119: -#line 3403 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = (yyvsp[(3) - (4)].list); ;} +#line 3400 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.conststr) = "<>"; ;} break; case 1120: -#line 3408 "third_party/libpg_query/grammar/statements/select.y" +#line 3404 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; case 1121: -#line 3410 "third_party/libpg_query/grammar/statements/select.y" +#line 3406 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; case 1122: -#line 3415 "third_party/libpg_query/grammar/statements/select.y" +#line 3411 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; case 1123: -#line 3417 "third_party/libpg_query/grammar/statements/select.y" +#line 3413 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; case 1124: -#line 3419 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString("~~")); ;} +#line 3418 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; case 1125: -#line 3421 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString("!~~")); ;} +#line 3420 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; case 1126: -#line 3423 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString("~~~")); ;} +#line 3422 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString("~~")); ;} break; case 1127: -#line 3425 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString("!~~~")); ;} +#line 3424 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString("!~~")); ;} break; case 1128: -#line 3427 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString("~~*")); ;} +#line 3426 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString("~~~")); ;} break; case 1129: -#line 3429 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString("!~~*")); ;} +#line 3428 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString("!~~~")); ;} break; case 1130: -#line 3443 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} +#line 3430 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString("~~*")); ;} break; case 1131: -#line 3445 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = lcons(makeString((yyvsp[(1) - (3)].str)), (yyvsp[(3) - (3)].list)); ;} +#line 3432 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString("!~~*")); ;} break; case 1132: -#line 3450 "third_party/libpg_query/grammar/statements/select.y" +#line 3446 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} + break; + + case 1133: +#line 3448 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = lcons(makeString((yyvsp[(1) - (3)].str)), (yyvsp[(3) - (3)].list)); ;} + break; + + case 1134: +#line 3453 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1133: -#line 3454 "third_party/libpg_query/grammar/statements/select.y" + case 1135: +#line 3457 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 1134: -#line 3461 "third_party/libpg_query/grammar/statements/select.y" + case 1136: +#line 3464 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1135: -#line 3466 "third_party/libpg_query/grammar/statements/select.y" + case 1137: +#line 3469 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1136: -#line 3472 "third_party/libpg_query/grammar/statements/select.y" + case 1138: +#line 3475 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1137: -#line 3476 "third_party/libpg_query/grammar/statements/select.y" + case 1139: +#line 3479 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 1138: -#line 3483 "third_party/libpg_query/grammar/statements/select.y" + case 1140: +#line 3486 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1139: -#line 3488 "third_party/libpg_query/grammar/statements/select.y" + case 1141: +#line 3491 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1140: -#line 3495 "third_party/libpg_query/grammar/statements/select.y" + case 1142: +#line 3498 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1141: -#line 3499 "third_party/libpg_query/grammar/statements/select.y" + case 1143: +#line 3502 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 1142: -#line 3508 "third_party/libpg_query/grammar/statements/select.y" + case 1144: +#line 3511 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1143: -#line 3512 "third_party/libpg_query/grammar/statements/select.y" + case 1145: +#line 3515 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 1144: -#line 3518 "third_party/libpg_query/grammar/statements/select.y" + case 1146: +#line 3521 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1145: -#line 3522 "third_party/libpg_query/grammar/statements/select.y" + case 1147: +#line 3525 "third_party/libpg_query/grammar/statements/select.y" { PGNamedArgExpr *na = makeNode(PGNamedArgExpr); na->name = (yyvsp[(1) - (3)].str); @@ -28322,8 +28369,8 @@ YYLTYPE yylloc; ;} break; - case 1146: -#line 3531 "third_party/libpg_query/grammar/statements/select.y" + case 1148: +#line 3534 "third_party/libpg_query/grammar/statements/select.y" { PGNamedArgExpr *na = makeNode(PGNamedArgExpr); na->name = (yyvsp[(1) - (3)].str); @@ -28334,151 +28381,151 @@ YYLTYPE yylloc; ;} break; - case 1147: -#line 3541 "third_party/libpg_query/grammar/statements/select.y" + case 1149: +#line 3544 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].typnam)); ;} break; - case 1148: -#line 3542 "third_party/libpg_query/grammar/statements/select.y" + case 1150: +#line 3545 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].typnam)); ;} break; - case 1149: -#line 3547 "third_party/libpg_query/grammar/statements/select.y" + case 1151: +#line 3550 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(makeStringConst((yyvsp[(1) - (3)].str), (yylsp[(1) - (3)])), (yyvsp[(3) - (3)].node)); ;} break; - case 1150: -#line 3550 "third_party/libpg_query/grammar/statements/select.y" + case 1152: +#line 3553 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1151: -#line 3557 "third_party/libpg_query/grammar/statements/select.y" + case 1153: +#line 3560 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1152: -#line 3558 "third_party/libpg_query/grammar/statements/select.y" + case 1154: +#line 3561 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "year"; ;} break; - case 1153: -#line 3559 "third_party/libpg_query/grammar/statements/select.y" + case 1155: +#line 3562 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "month"; ;} break; - case 1154: -#line 3560 "third_party/libpg_query/grammar/statements/select.y" + case 1156: +#line 3563 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "day"; ;} break; - case 1155: -#line 3561 "third_party/libpg_query/grammar/statements/select.y" + case 1157: +#line 3564 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "hour"; ;} break; - case 1156: -#line 3562 "third_party/libpg_query/grammar/statements/select.y" + case 1158: +#line 3565 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "minute"; ;} break; - case 1157: -#line 3563 "third_party/libpg_query/grammar/statements/select.y" + case 1159: +#line 3566 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "second"; ;} break; - case 1158: -#line 3564 "third_party/libpg_query/grammar/statements/select.y" + case 1160: +#line 3567 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "millisecond"; ;} break; - case 1159: -#line 3565 "third_party/libpg_query/grammar/statements/select.y" + case 1161: +#line 3568 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "microsecond"; ;} break; - case 1160: -#line 3566 "third_party/libpg_query/grammar/statements/select.y" + case 1162: +#line 3569 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "week"; ;} break; - case 1161: -#line 3567 "third_party/libpg_query/grammar/statements/select.y" + case 1163: +#line 3570 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "decade"; ;} break; - case 1162: -#line 3568 "third_party/libpg_query/grammar/statements/select.y" + case 1164: +#line 3571 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "century"; ;} break; - case 1163: -#line 3569 "third_party/libpg_query/grammar/statements/select.y" + case 1165: +#line 3572 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "millennium"; ;} break; - case 1164: -#line 3570 "third_party/libpg_query/grammar/statements/select.y" + case 1166: +#line 3573 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1165: -#line 3581 "third_party/libpg_query/grammar/statements/select.y" + case 1167: +#line 3584 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make4((yyvsp[(1) - (4)].node), (yyvsp[(2) - (4)].node), (yyvsp[(3) - (4)].node), (yyvsp[(4) - (4)].node)); ;} break; - case 1166: -#line 3585 "third_party/libpg_query/grammar/statements/select.y" + case 1168: +#line 3588 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make3((yyvsp[(1) - (3)].node), (yyvsp[(2) - (3)].node), (yyvsp[(3) - (3)].node)); ;} break; - case 1167: -#line 3592 "third_party/libpg_query/grammar/statements/select.y" + case 1169: +#line 3595 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 1168: -#line 3598 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.list) = list_make2((yyvsp[(3) - (3)].node), (yyvsp[(1) - (3)].node)); ;} + case 1170: +#line 3601 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.list) = list_make2((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); ;} break; - case 1169: -#line 3599 "third_party/libpg_query/grammar/statements/select.y" + case 1171: +#line 3602 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1170: -#line 3616 "third_party/libpg_query/grammar/statements/select.y" + case 1172: +#line 3619 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make3((yyvsp[(1) - (3)].node), (yyvsp[(2) - (3)].node), (yyvsp[(3) - (3)].node)); ;} break; - case 1171: -#line 3620 "third_party/libpg_query/grammar/statements/select.y" + case 1173: +#line 3623 "third_party/libpg_query/grammar/statements/select.y" { /* not legal per SQL99, but might as well allow it */ (yyval.list) = list_make3((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yyvsp[(2) - (3)].node)); ;} break; - case 1172: -#line 3625 "third_party/libpg_query/grammar/statements/select.y" + case 1174: +#line 3628 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].node)); ;} break; - case 1173: -#line 3629 "third_party/libpg_query/grammar/statements/select.y" + case 1175: +#line 3632 "third_party/libpg_query/grammar/statements/select.y" { /* * Since there are no cases where this syntax allows @@ -28495,45 +28542,45 @@ YYLTYPE yylloc; ;} break; - case 1174: -#line 3644 "third_party/libpg_query/grammar/statements/select.y" + case 1176: +#line 3647 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1175: -#line 3648 "third_party/libpg_query/grammar/statements/select.y" + case 1177: +#line 3651 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1176: -#line 3652 "third_party/libpg_query/grammar/statements/select.y" + case 1178: +#line 3655 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 1177: -#line 3655 "third_party/libpg_query/grammar/statements/select.y" + case 1179: +#line 3658 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 1178: -#line 3658 "third_party/libpg_query/grammar/statements/select.y" + case 1180: +#line 3661 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(3) - (3)].list), (yyvsp[(1) - (3)].node)); ;} break; - case 1179: -#line 3659 "third_party/libpg_query/grammar/statements/select.y" + case 1181: +#line 3662 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 1180: -#line 3660 "third_party/libpg_query/grammar/statements/select.y" + case 1182: +#line 3663 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1181: -#line 3664 "third_party/libpg_query/grammar/statements/select.y" + case 1183: +#line 3667 "third_party/libpg_query/grammar/statements/select.y" { PGSubLink *n = makeNode(PGSubLink); n->subselect = (yyvsp[(1) - (1)].node); @@ -28542,13 +28589,13 @@ YYLTYPE yylloc; ;} break; - case 1182: -#line 3670 "third_party/libpg_query/grammar/statements/select.y" + case 1184: +#line 3673 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *)(yyvsp[(2) - (3)].list); ;} break; - case 1183: -#line 3681 "third_party/libpg_query/grammar/statements/select.y" + case 1185: +#line 3684 "third_party/libpg_query/grammar/statements/select.y" { PGCaseExpr *c = makeNode(PGCaseExpr); c->casetype = InvalidOid; /* not analyzed yet */ @@ -28560,18 +28607,18 @@ YYLTYPE yylloc; ;} break; - case 1184: -#line 3694 "third_party/libpg_query/grammar/statements/select.y" + case 1186: +#line 3697 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1185: -#line 3695 "third_party/libpg_query/grammar/statements/select.y" + case 1187: +#line 3698 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 1186: -#line 3700 "third_party/libpg_query/grammar/statements/select.y" + case 1188: +#line 3703 "third_party/libpg_query/grammar/statements/select.y" { PGCaseWhen *w = makeNode(PGCaseWhen); w->expr = (PGExpr *) (yyvsp[(2) - (4)].node); @@ -28581,42 +28628,42 @@ YYLTYPE yylloc; ;} break; - case 1187: -#line 3710 "third_party/libpg_query/grammar/statements/select.y" + case 1189: +#line 3713 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 1188: -#line 3711 "third_party/libpg_query/grammar/statements/select.y" + case 1190: +#line 3714 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 1189: -#line 3714 "third_party/libpg_query/grammar/statements/select.y" + case 1191: +#line 3717 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1190: -#line 3715 "third_party/libpg_query/grammar/statements/select.y" + case 1192: +#line 3718 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 1191: -#line 3719 "third_party/libpg_query/grammar/statements/select.y" + case 1193: +#line 3722 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeColumnRef((yyvsp[(1) - (1)].str), NIL, (yylsp[(1) - (1)]), yyscanner); ;} break; - case 1192: -#line 3723 "third_party/libpg_query/grammar/statements/select.y" + case 1194: +#line 3726 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeColumnRef((yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].list), (yylsp[(1) - (2)]), yyscanner); ;} break; - case 1193: -#line 3730 "third_party/libpg_query/grammar/statements/select.y" + case 1195: +#line 3733 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = false; @@ -28626,8 +28673,8 @@ YYLTYPE yylloc; ;} break; - case 1194: -#line 3738 "third_party/libpg_query/grammar/statements/select.y" + case 1196: +#line 3741 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -28637,8 +28684,8 @@ YYLTYPE yylloc; ;} break; - case 1195: -#line 3745 "third_party/libpg_query/grammar/statements/select.y" + case 1197: +#line 3748 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -28649,8 +28696,8 @@ YYLTYPE yylloc; ;} break; - case 1196: -#line 3753 "third_party/libpg_query/grammar/statements/select.y" + case 1198: +#line 3756 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -28660,43 +28707,43 @@ YYLTYPE yylloc; ;} break; - case 1197: -#line 3763 "third_party/libpg_query/grammar/statements/select.y" + case 1199: +#line 3766 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1198: -#line 3764 "third_party/libpg_query/grammar/statements/select.y" + case 1200: +#line 3767 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 1199: -#line 3769 "third_party/libpg_query/grammar/statements/select.y" + case 1201: +#line 3772 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1200: -#line 3770 "third_party/libpg_query/grammar/statements/select.y" + case 1202: +#line 3773 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 1201: -#line 3774 "third_party/libpg_query/grammar/statements/select.y" + case 1203: +#line 3777 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 1202: -#line 3775 "third_party/libpg_query/grammar/statements/select.y" + case 1204: +#line 3778 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(NULL); ;} break; - case 1203: -#line 3776 "third_party/libpg_query/grammar/statements/select.y" + case 1205: +#line 3779 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 1204: -#line 3781 "third_party/libpg_query/grammar/statements/select.y" + case 1206: +#line 3784 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(3) - (3)].list)) { PGFuncCall *n = makeFuncCall(list_make1(makeString((yyvsp[(2) - (3)].str))), (yyvsp[(3) - (3)].list)->head->data.ptr_value ? (yyvsp[(3) - (3)].list) : NULL, (yylsp[(2) - (3)])); @@ -28707,8 +28754,8 @@ YYLTYPE yylloc; ;} break; - case 1205: -#line 3790 "third_party/libpg_query/grammar/statements/select.y" + case 1207: +#line 3793 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = false; @@ -28718,8 +28765,8 @@ YYLTYPE yylloc; ;} break; - case 1206: -#line 3798 "third_party/libpg_query/grammar/statements/select.y" + case 1208: +#line 3801 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -28729,8 +28776,8 @@ YYLTYPE yylloc; ;} break; - case 1207: -#line 3805 "third_party/libpg_query/grammar/statements/select.y" + case 1209: +#line 3808 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -28741,8 +28788,8 @@ YYLTYPE yylloc; ;} break; - case 1208: -#line 3814 "third_party/libpg_query/grammar/statements/select.y" + case 1210: +#line 3817 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -28752,48 +28799,48 @@ YYLTYPE yylloc; ;} break; - case 1209: -#line 3829 "third_party/libpg_query/grammar/statements/select.y" + case 1211: +#line 3832 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1210: -#line 3830 "third_party/libpg_query/grammar/statements/select.y" + case 1212: +#line 3833 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 1213: -#line 3846 "third_party/libpg_query/grammar/statements/select.y" + case 1215: +#line 3849 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1214: -#line 3847 "third_party/libpg_query/grammar/statements/select.y" + case 1216: +#line 3850 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1215: -#line 3851 "third_party/libpg_query/grammar/statements/select.y" + case 1217: +#line 3854 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].target)); ;} break; - case 1216: -#line 3852 "third_party/libpg_query/grammar/statements/select.y" + case 1218: +#line 3855 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].target)); ;} break; - case 1217: -#line 3856 "third_party/libpg_query/grammar/statements/select.y" + case 1219: +#line 3859 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1218: -#line 3857 "third_party/libpg_query/grammar/statements/select.y" + case 1220: +#line 3860 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1219: -#line 3861 "third_party/libpg_query/grammar/statements/select.y" + case 1221: +#line 3864 "third_party/libpg_query/grammar/statements/select.y" { (yyval.target) = makeNode(PGResTarget); (yyval.target)->name = (yyvsp[(3) - (3)].str); @@ -28803,8 +28850,8 @@ YYLTYPE yylloc; ;} break; - case 1220: -#line 3877 "third_party/libpg_query/grammar/statements/select.y" + case 1222: +#line 3880 "third_party/libpg_query/grammar/statements/select.y" { (yyval.target) = makeNode(PGResTarget); (yyval.target)->name = (yyvsp[(2) - (2)].str); @@ -28814,8 +28861,8 @@ YYLTYPE yylloc; ;} break; - case 1221: -#line 3885 "third_party/libpg_query/grammar/statements/select.y" + case 1223: +#line 3888 "third_party/libpg_query/grammar/statements/select.y" { (yyval.target) = makeNode(PGResTarget); (yyval.target)->name = NULL; @@ -28825,140 +28872,140 @@ YYLTYPE yylloc; ;} break; - case 1222: -#line 3894 "third_party/libpg_query/grammar/statements/select.y" + case 1224: +#line 3897 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 1223: -#line 3895 "third_party/libpg_query/grammar/statements/select.y" + case 1225: +#line 3898 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(2) - (2)].str))); ;} break; - case 1224: -#line 3898 "third_party/libpg_query/grammar/statements/select.y" + case 1226: +#line 3901 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1225: -#line 3899 "third_party/libpg_query/grammar/statements/select.y" + case 1227: +#line 3902 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 1226: -#line 3902 "third_party/libpg_query/grammar/statements/select.y" + case 1228: +#line 3905 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (3)].node), makeString((yyvsp[(3) - (3)].str))); ;} break; - case 1227: -#line 3906 "third_party/libpg_query/grammar/statements/select.y" + case 1229: +#line 3909 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].list)); ;} break; - case 1228: -#line 3907 "third_party/libpg_query/grammar/statements/select.y" + case 1230: +#line 3910 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list)); ;} break; - case 1229: -#line 3911 "third_party/libpg_query/grammar/statements/select.y" + case 1231: +#line 3914 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1230: -#line 3912 "third_party/libpg_query/grammar/statements/select.y" + case 1232: +#line 3915 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1231: -#line 3915 "third_party/libpg_query/grammar/statements/select.y" + case 1233: +#line 3918 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 1232: -#line 3916 "third_party/libpg_query/grammar/statements/select.y" + case 1234: +#line 3919 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(2) - (2)].list)); ;} break; - case 1233: -#line 3917 "third_party/libpg_query/grammar/statements/select.y" + case 1235: +#line 3920 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 1234: -#line 3927 "third_party/libpg_query/grammar/statements/select.y" + case 1236: +#line 3930 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].range)); ;} break; - case 1235: -#line 3928 "third_party/libpg_query/grammar/statements/select.y" + case 1237: +#line 3931 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].range)); ;} break; - case 1236: -#line 3933 "third_party/libpg_query/grammar/statements/select.y" + case 1238: +#line 3936 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 1237: -#line 3935 "third_party/libpg_query/grammar/statements/select.y" + case 1239: +#line 3938 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), makeString((yyvsp[(3) - (3)].str))); ;} break; - case 1238: -#line 3940 "third_party/libpg_query/grammar/statements/select.y" + case 1240: +#line 3943 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1239: -#line 3941 "third_party/libpg_query/grammar/statements/select.y" + case 1241: +#line 3944 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1240: -#line 3945 "third_party/libpg_query/grammar/statements/select.y" + case 1242: +#line 3948 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1241: -#line 3946 "third_party/libpg_query/grammar/statements/select.y" + case 1243: +#line 3949 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 1242: -#line 3949 "third_party/libpg_query/grammar/statements/select.y" + case 1244: +#line 3952 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1243: -#line 3961 "third_party/libpg_query/grammar/statements/select.y" + case 1245: +#line 3964 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 1244: -#line 3964 "third_party/libpg_query/grammar/statements/select.y" + case 1246: +#line 3967 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = check_func_name(lcons(makeString((yyvsp[(1) - (2)].str)), (yyvsp[(2) - (2)].list)), yyscanner); ;} break; - case 1245: -#line 3975 "third_party/libpg_query/grammar/statements/select.y" + case 1247: +#line 3978 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntConst((yyvsp[(1) - (1)].ival), (yylsp[(1) - (1)])); ;} break; - case 1246: -#line 3979 "third_party/libpg_query/grammar/statements/select.y" + case 1248: +#line 3982 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeFloatConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 1247: -#line 3983 "third_party/libpg_query/grammar/statements/select.y" + case 1249: +#line 3986 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(2) - (2)].list)) { @@ -28972,15 +29019,15 @@ YYLTYPE yylloc; ;} break; - case 1248: -#line 3995 "third_party/libpg_query/grammar/statements/select.y" + case 1250: +#line 3998 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeBitStringConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 1249: -#line 3999 "third_party/libpg_query/grammar/statements/select.y" + case 1251: +#line 4002 "third_party/libpg_query/grammar/statements/select.y" { /* This is a bit constant per SQL99: * Without Feature F511, "BIT data type", @@ -28991,8 +29038,8 @@ YYLTYPE yylloc; ;} break; - case 1250: -#line 4008 "third_party/libpg_query/grammar/statements/select.y" + case 1252: +#line 4011 "third_party/libpg_query/grammar/statements/select.y" { /* generic type 'literal' syntax */ PGTypeName *t = makeTypeNameFromNameList((yyvsp[(1) - (2)].list)); @@ -29001,8 +29048,8 @@ YYLTYPE yylloc; ;} break; - case 1251: -#line 4015 "third_party/libpg_query/grammar/statements/select.y" + case 1253: +#line 4018 "third_party/libpg_query/grammar/statements/select.y" { /* generic syntax with a type modifier */ PGTypeName *t = makeTypeNameFromNameList((yyvsp[(1) - (7)].list)); @@ -29029,7 +29076,7 @@ YYLTYPE yylloc; (errcode(PG_ERRCODE_SYNTAX_ERROR), errmsg("type modifier cannot have ORDER BY"), parser_errposition((yylsp[(4) - (7)])))); - if ((yyvsp[(5) - (7)].boolean) != false) + if ((yyvsp[(5) - (7)].ignorenulls) != false) ereport(ERROR, (errcode(PG_ERRCODE_SYNTAX_ERROR), errmsg("type modifier cannot have IGNORE NULLS"), @@ -29042,146 +29089,146 @@ YYLTYPE yylloc; ;} break; - case 1252: -#line 4053 "third_party/libpg_query/grammar/statements/select.y" + case 1254: +#line 4056 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeStringConstCast((yyvsp[(2) - (2)].str), (yylsp[(2) - (2)]), (yyvsp[(1) - (2)].typnam)); ;} break; - case 1253: -#line 4057 "third_party/libpg_query/grammar/statements/select.y" + case 1255: +#line 4060 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntervalNode((yyvsp[(3) - (5)].node), (yylsp[(3) - (5)]), (yyvsp[(5) - (5)].list)); ;} break; - case 1254: -#line 4061 "third_party/libpg_query/grammar/statements/select.y" + case 1256: +#line 4064 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntervalNode((yyvsp[(2) - (3)].ival), (yylsp[(2) - (3)]), (yyvsp[(3) - (3)].list)); ;} break; - case 1255: -#line 4065 "third_party/libpg_query/grammar/statements/select.y" + case 1257: +#line 4068 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntervalNode((yyvsp[(2) - (3)].str), (yylsp[(2) - (3)]), (yyvsp[(3) - (3)].list)); ;} break; - case 1256: -#line 4069 "third_party/libpg_query/grammar/statements/select.y" + case 1258: +#line 4072 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeBoolAConst(true, (yylsp[(1) - (1)])); ;} break; - case 1257: -#line 4073 "third_party/libpg_query/grammar/statements/select.y" + case 1259: +#line 4076 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeBoolAConst(false, (yylsp[(1) - (1)])); ;} break; - case 1258: -#line 4077 "third_party/libpg_query/grammar/statements/select.y" + case 1260: +#line 4080 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeNullAConst((yylsp[(1) - (1)])); ;} break; - case 1259: -#line 4082 "third_party/libpg_query/grammar/statements/select.y" + case 1261: +#line 4085 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = (yyvsp[(1) - (1)].ival); ;} break; - case 1260: -#line 4099 "third_party/libpg_query/grammar/statements/select.y" + case 1262: +#line 4102 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1261: -#line 4100 "third_party/libpg_query/grammar/statements/select.y" + case 1263: +#line 4103 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1262: -#line 4101 "third_party/libpg_query/grammar/statements/select.y" + case 1264: +#line 4104 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1263: -#line 4104 "third_party/libpg_query/grammar/statements/select.y" + case 1265: +#line 4107 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1264: -#line 4105 "third_party/libpg_query/grammar/statements/select.y" + case 1266: +#line 4108 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1265: -#line 4106 "third_party/libpg_query/grammar/statements/select.y" + case 1267: +#line 4109 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1266: -#line 4109 "third_party/libpg_query/grammar/statements/select.y" + case 1268: +#line 4112 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1267: -#line 4110 "third_party/libpg_query/grammar/statements/select.y" + case 1269: +#line 4113 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1268: -#line 4111 "third_party/libpg_query/grammar/statements/select.y" + case 1270: +#line 4114 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1269: -#line 4114 "third_party/libpg_query/grammar/statements/select.y" + case 1271: +#line 4117 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 1270: -#line 4115 "third_party/libpg_query/grammar/statements/select.y" + case 1272: +#line 4118 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lcons(makeString((yyvsp[(1) - (2)].str)), (yyvsp[(2) - (2)].list)); ;} break; - case 1271: -#line 4119 "third_party/libpg_query/grammar/statements/select.y" + case 1273: +#line 4122 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(2) - (2)].str))); ;} break; - case 1272: -#line 4121 "third_party/libpg_query/grammar/statements/select.y" + case 1274: +#line 4124 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), makeString((yyvsp[(3) - (3)].str))); ;} break; - case 1273: -#line 4125 "third_party/libpg_query/grammar/statements/select.y" + case 1275: +#line 4128 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 1274: -#line 4126 "third_party/libpg_query/grammar/statements/select.y" + case 1276: +#line 4129 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1276: -#line 4133 "third_party/libpg_query/grammar/statements/select.y" + case 1278: +#line 4136 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1277: -#line 4134 "third_party/libpg_query/grammar/statements/select.y" + case 1279: +#line 4137 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1278: + case 1280: #line 8 "third_party/libpg_query/grammar/statements/prepare.y" { PGPrepareStmt *n = makeNode(PGPrepareStmt); @@ -29192,17 +29239,17 @@ YYLTYPE yylloc; ;} break; - case 1279: + case 1281: #line 18 "third_party/libpg_query/grammar/statements/prepare.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 1280: + case 1282: #line 19 "third_party/libpg_query/grammar/statements/prepare.y" { (yyval.list) = NIL; ;} break; - case 1287: + case 1289: #line 8 "third_party/libpg_query/grammar/statements/create_schema.y" { PGCreateSchemaStmt *n = makeNode(PGCreateSchemaStmt); @@ -29224,7 +29271,7 @@ YYLTYPE yylloc; ;} break; - case 1288: + case 1290: #line 27 "third_party/libpg_query/grammar/statements/create_schema.y" { PGCreateSchemaStmt *n = makeNode(PGCreateSchemaStmt); @@ -29251,7 +29298,7 @@ YYLTYPE yylloc; ;} break; - case 1289: + case 1291: #line 51 "third_party/libpg_query/grammar/statements/create_schema.y" { PGCreateSchemaStmt *n = makeNode(PGCreateSchemaStmt); @@ -29273,7 +29320,7 @@ YYLTYPE yylloc; ;} break; - case 1290: + case 1292: #line 74 "third_party/libpg_query/grammar/statements/create_schema.y" { if ((yyloc) < 0) /* see comments for YYLLOC_DEFAULT */ @@ -29282,12 +29329,12 @@ YYLTYPE yylloc; ;} break; - case 1291: + case 1293: #line 80 "third_party/libpg_query/grammar/statements/create_schema.y" { (yyval.list) = NIL; ;} break; - case 1296: + case 1298: #line 11 "third_party/libpg_query/grammar/statements/index.y" { PGIndexStmt *n = makeNode(PGIndexStmt); @@ -29313,7 +29360,7 @@ YYLTYPE yylloc; ;} break; - case 1297: + case 1299: #line 36 "third_party/libpg_query/grammar/statements/index.y" { PGIndexStmt *n = makeNode(PGIndexStmt); @@ -29339,62 +29386,62 @@ YYLTYPE yylloc; ;} break; - case 1298: + case 1300: #line 62 "third_party/libpg_query/grammar/statements/index.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1299: + case 1301: #line 66 "third_party/libpg_query/grammar/statements/index.y" { (yyval.str) = (yyvsp[(2) - (2)].str); ;} break; - case 1300: + case 1302: #line 67 "third_party/libpg_query/grammar/statements/index.y" { (yyval.str) = (char*) DEFAULT_INDEX_TYPE; ;} break; - case 1301: + case 1303: #line 72 "third_party/libpg_query/grammar/statements/index.y" { (yyval.boolean) = true; ;} break; - case 1302: + case 1304: #line 73 "third_party/libpg_query/grammar/statements/index.y" { (yyval.boolean) = false; ;} break; - case 1303: + case 1305: #line 78 "third_party/libpg_query/grammar/statements/index.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1304: + case 1306: #line 79 "third_party/libpg_query/grammar/statements/index.y" { (yyval.str) = NULL; ;} break; - case 1305: + case 1307: #line 83 "third_party/libpg_query/grammar/statements/index.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 1306: + case 1308: #line 84 "third_party/libpg_query/grammar/statements/index.y" { (yyval.list) = NIL; ;} break; - case 1307: + case 1309: #line 89 "third_party/libpg_query/grammar/statements/index.y" { (yyval.boolean) = true; ;} break; - case 1308: + case 1310: #line 90 "third_party/libpg_query/grammar/statements/index.y" { (yyval.boolean) = false; ;} break; - case 1309: + case 1311: #line 8 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -29406,7 +29453,7 @@ YYLTYPE yylloc; ;} break; - case 1310: + case 1312: #line 17 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -29418,7 +29465,7 @@ YYLTYPE yylloc; ;} break; - case 1311: + case 1313: #line 26 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -29430,7 +29477,7 @@ YYLTYPE yylloc; ;} break; - case 1312: + case 1314: #line 35 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -29442,7 +29489,7 @@ YYLTYPE yylloc; ;} break; - case 1313: + case 1315: #line 44 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -29454,7 +29501,7 @@ YYLTYPE yylloc; ;} break; - case 1314: + case 1316: #line 53 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -29466,7 +29513,7 @@ YYLTYPE yylloc; ;} break; - case 1315: + case 1317: #line 6 "third_party/libpg_query/grammar/statements/checkpoint.y" { PGCheckPointStmt *n = makeNode(PGCheckPointStmt); @@ -29476,7 +29523,7 @@ YYLTYPE yylloc; ;} break; - case 1316: + case 1318: #line 13 "third_party/libpg_query/grammar/statements/checkpoint.y" { PGCheckPointStmt *n = makeNode(PGCheckPointStmt); @@ -29486,17 +29533,17 @@ YYLTYPE yylloc; ;} break; - case 1317: + case 1319: #line 22 "third_party/libpg_query/grammar/statements/checkpoint.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1318: + case 1320: #line 23 "third_party/libpg_query/grammar/statements/checkpoint.y" { (yyval.str) = NULL; ;} break; - case 1319: + case 1321: #line 8 "third_party/libpg_query/grammar/statements/comment_on.y" { PGCommentOnStmt *n = makeNode(PGCommentOnStmt); @@ -29507,7 +29554,7 @@ YYLTYPE yylloc; ;} break; - case 1320: + case 1322: #line 16 "third_party/libpg_query/grammar/statements/comment_on.y" { PGCommentOnStmt *n = makeNode(PGCommentOnStmt); @@ -29518,67 +29565,67 @@ YYLTYPE yylloc; ;} break; - case 1321: + case 1323: #line 26 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.node) = makeStringConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 1322: + case 1324: #line 27 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.node) = makeNullAConst((yylsp[(1) - (1)])); ;} break; - case 1323: + case 1325: #line 30 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_TABLE; ;} break; - case 1324: + case 1326: #line 31 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_SEQUENCE; ;} break; - case 1325: + case 1327: #line 32 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_FUNCTION; ;} break; - case 1326: + case 1328: #line 33 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_FUNCTION; ;} break; - case 1327: + case 1329: #line 34 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_TABLE_MACRO; ;} break; - case 1328: + case 1330: #line 35 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_VIEW; ;} break; - case 1329: + case 1331: #line 36 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_DATABASE; ;} break; - case 1330: + case 1332: #line 37 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_INDEX; ;} break; - case 1331: + case 1333: #line 38 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_SCHEMA; ;} break; - case 1332: + case 1334: #line 39 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_TYPE; ;} break; - case 1333: + case 1335: #line 8 "third_party/libpg_query/grammar/statements/export.y" { PGExportStmt *n = makeNode(PGExportStmt); @@ -29592,7 +29639,7 @@ YYLTYPE yylloc; ;} break; - case 1334: + case 1336: #line 20 "third_party/libpg_query/grammar/statements/export.y" { PGExportStmt *n = makeNode(PGExportStmt); @@ -29606,7 +29653,7 @@ YYLTYPE yylloc; ;} break; - case 1335: + case 1337: #line 34 "third_party/libpg_query/grammar/statements/export.y" { PGImportStmt *n = makeNode(PGImportStmt); @@ -29615,7 +29662,7 @@ YYLTYPE yylloc; ;} break; - case 1336: + case 1338: #line 10 "third_party/libpg_query/grammar/statements/explain.y" { PGExplainStmt *n = makeNode(PGExplainStmt); @@ -29625,7 +29672,7 @@ YYLTYPE yylloc; ;} break; - case 1337: + case 1339: #line 17 "third_party/libpg_query/grammar/statements/explain.y" { PGExplainStmt *n = makeNode(PGExplainStmt); @@ -29638,7 +29685,7 @@ YYLTYPE yylloc; ;} break; - case 1338: + case 1340: #line 27 "third_party/libpg_query/grammar/statements/explain.y" { PGExplainStmt *n = makeNode(PGExplainStmt); @@ -29648,7 +29695,7 @@ YYLTYPE yylloc; ;} break; - case 1339: + case 1341: #line 34 "third_party/libpg_query/grammar/statements/explain.y" { PGExplainStmt *n = makeNode(PGExplainStmt); @@ -29658,118 +29705,118 @@ YYLTYPE yylloc; ;} break; - case 1340: + case 1342: #line 44 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.boolean) = true; ;} break; - case 1341: + case 1343: #line 45 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.boolean) = false; ;} break; - case 1342: + case 1344: #line 50 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.node) = (PGNode *) makeString((yyvsp[(1) - (1)].str)); ;} break; - case 1343: + case 1345: #line 51 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.node) = (PGNode *) (yyvsp[(1) - (1)].value); ;} break; - case 1344: + case 1346: #line 52 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.node) = NULL; ;} break; - case 1375: + case 1377: #line 90 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1376: + case 1378: #line 91 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1377: + case 1379: #line 92 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1378: + case 1380: #line 97 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1379: + case 1381: #line 98 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1380: + case 1382: #line 104 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].defelt)); ;} break; - case 1381: + case 1383: #line 108 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].defelt)); ;} break; - case 1382: + case 1384: #line 115 "third_party/libpg_query/grammar/statements/explain.y" {;} break; - case 1383: + case 1385: #line 116 "third_party/libpg_query/grammar/statements/explain.y" {;} break; - case 1384: + case 1386: #line 121 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (char*) "true"; ;} break; - case 1385: + case 1387: #line 122 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (char*) "false"; ;} break; - case 1386: + case 1388: #line 123 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (char*) "on"; ;} break; - case 1387: + case 1389: #line 129 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1388: + case 1390: #line 135 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.defelt) = makeDefElem((yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 1389: + case 1391: #line 142 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1390: + case 1392: #line 143 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (char*) "analyze"; ;} break; - case 1391: + case 1393: #line 11 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = (yyvsp[(2) - (2)].vsetstmt); @@ -29778,7 +29825,7 @@ YYLTYPE yylloc; ;} break; - case 1392: + case 1394: #line 17 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = (yyvsp[(3) - (3)].vsetstmt); @@ -29787,7 +29834,7 @@ YYLTYPE yylloc; ;} break; - case 1393: + case 1395: #line 23 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = (yyvsp[(3) - (3)].vsetstmt); @@ -29796,7 +29843,7 @@ YYLTYPE yylloc; ;} break; - case 1394: + case 1396: #line 29 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = (yyvsp[(3) - (3)].vsetstmt); @@ -29805,12 +29852,12 @@ YYLTYPE yylloc; ;} break; - case 1395: + case 1397: #line 38 "third_party/libpg_query/grammar/statements/variable_set.y" {(yyval.vsetstmt) = (yyvsp[(1) - (1)].vsetstmt);;} break; - case 1396: + case 1398: #line 40 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -29820,7 +29867,7 @@ YYLTYPE yylloc; ;} break; - case 1397: + case 1399: #line 48 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -29834,7 +29881,7 @@ YYLTYPE yylloc; ;} break; - case 1398: + case 1400: #line 59 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -29845,7 +29892,7 @@ YYLTYPE yylloc; ;} break; - case 1399: + case 1401: #line 71 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -29856,7 +29903,7 @@ YYLTYPE yylloc; ;} break; - case 1400: + case 1402: #line 79 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -29867,26 +29914,26 @@ YYLTYPE yylloc; ;} break; - case 1401: + case 1403: #line 90 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1402: + case 1404: #line 96 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = makeStringConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 1403: + case 1405: #line 100 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = makeStringConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 1404: + case 1406: #line 104 "third_party/libpg_query/grammar/statements/variable_set.y" { PGTypeName *t = (yyvsp[(1) - (3)].typnam); @@ -29904,7 +29951,7 @@ YYLTYPE yylloc; ;} break; - case 1405: + case 1407: #line 119 "third_party/libpg_query/grammar/statements/variable_set.y" { PGTypeName *t = (yyvsp[(1) - (5)].typnam); @@ -29914,32 +29961,32 @@ YYLTYPE yylloc; ;} break; - case 1406: + case 1408: #line 125 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = makeAConst((yyvsp[(1) - (1)].value), (yylsp[(1) - (1)])); ;} break; - case 1407: + case 1409: #line 126 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = NULL; ;} break; - case 1408: + case 1410: #line 127 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = NULL; ;} break; - case 1409: + case 1411: #line 131 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1410: + case 1412: #line 132 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 1411: + case 1413: #line 8 "third_party/libpg_query/grammar/statements/load.y" { PGLoadStmt *n = makeNode(PGLoadStmt); @@ -29950,7 +29997,7 @@ YYLTYPE yylloc; ;} break; - case 1412: + case 1414: #line 15 "third_party/libpg_query/grammar/statements/load.y" { PGLoadStmt *n = makeNode(PGLoadStmt); @@ -29961,7 +30008,7 @@ YYLTYPE yylloc; ;} break; - case 1413: + case 1415: #line 22 "third_party/libpg_query/grammar/statements/load.y" { PGLoadStmt *n = makeNode(PGLoadStmt); @@ -29972,7 +30019,7 @@ YYLTYPE yylloc; ;} break; - case 1414: + case 1416: #line 29 "third_party/libpg_query/grammar/statements/load.y" { PGLoadStmt *n = makeNode(PGLoadStmt); @@ -29983,7 +30030,7 @@ YYLTYPE yylloc; ;} break; - case 1415: + case 1417: #line 36 "third_party/libpg_query/grammar/statements/load.y" { PGLoadStmt *n = makeNode(PGLoadStmt); @@ -29994,27 +30041,27 @@ YYLTYPE yylloc; ;} break; - case 1416: + case 1418: #line 45 "third_party/libpg_query/grammar/statements/load.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1417: + case 1419: #line 46 "third_party/libpg_query/grammar/statements/load.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1418: + case 1420: #line 48 "third_party/libpg_query/grammar/statements/load.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1419: + case 1421: #line 49 "third_party/libpg_query/grammar/statements/load.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1420: + case 1422: #line 9 "third_party/libpg_query/grammar/statements/vacuum.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -30031,7 +30078,7 @@ YYLTYPE yylloc; ;} break; - case 1421: + case 1423: #line 23 "third_party/libpg_query/grammar/statements/vacuum.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -30048,7 +30095,7 @@ YYLTYPE yylloc; ;} break; - case 1422: + case 1424: #line 37 "third_party/libpg_query/grammar/statements/vacuum.y" { PGVacuumStmt *n = (PGVacuumStmt *) (yyvsp[(5) - (5)].node); @@ -30063,7 +30110,7 @@ YYLTYPE yylloc; ;} break; - case 1423: + case 1425: #line 49 "third_party/libpg_query/grammar/statements/vacuum.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -30074,7 +30121,7 @@ YYLTYPE yylloc; ;} break; - case 1424: + case 1426: #line 57 "third_party/libpg_query/grammar/statements/vacuum.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -30087,27 +30134,27 @@ YYLTYPE yylloc; ;} break; - case 1425: + case 1427: #line 70 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = PG_VACOPT_ANALYZE; ;} break; - case 1426: + case 1428: #line 71 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = PG_VACOPT_VERBOSE; ;} break; - case 1427: + case 1429: #line 72 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = PG_VACOPT_FREEZE; ;} break; - case 1428: + case 1430: #line 73 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = PG_VACOPT_FULL; ;} break; - case 1429: + case 1431: #line 75 "third_party/libpg_query/grammar/statements/vacuum.y" { if (strcmp((yyvsp[(1) - (1)].str), "disable_page_skipping") == 0) @@ -30120,37 +30167,37 @@ YYLTYPE yylloc; ;} break; - case 1430: + case 1432: #line 87 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.boolean) = true; ;} break; - case 1431: + case 1433: #line 88 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.boolean) = false; ;} break; - case 1432: + case 1434: #line 93 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = (yyvsp[(1) - (1)].ival); ;} break; - case 1433: + case 1435: #line 94 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = (yyvsp[(1) - (3)].ival) | (yyvsp[(3) - (3)].ival); ;} break; - case 1434: + case 1436: #line 98 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.boolean) = true; ;} break; - case 1435: + case 1437: #line 99 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.boolean) = false; ;} break; - case 1436: + case 1438: #line 9 "third_party/libpg_query/grammar/statements/delete.y" { PGDeleteStmt *n = makeNode(PGDeleteStmt); @@ -30163,7 +30210,7 @@ YYLTYPE yylloc; ;} break; - case 1437: + case 1439: #line 19 "third_party/libpg_query/grammar/statements/delete.y" { PGDeleteStmt *n = makeNode(PGDeleteStmt); @@ -30176,14 +30223,14 @@ YYLTYPE yylloc; ;} break; - case 1438: + case 1440: #line 32 "third_party/libpg_query/grammar/statements/delete.y" { (yyval.range) = (yyvsp[(1) - (1)].range); ;} break; - case 1439: + case 1441: #line 36 "third_party/libpg_query/grammar/statements/delete.y" { PGAlias *alias = makeNode(PGAlias); @@ -30193,7 +30240,7 @@ YYLTYPE yylloc; ;} break; - case 1440: + case 1442: #line 43 "third_party/libpg_query/grammar/statements/delete.y" { PGAlias *alias = makeNode(PGAlias); @@ -30203,27 +30250,27 @@ YYLTYPE yylloc; ;} break; - case 1441: + case 1443: #line 53 "third_party/libpg_query/grammar/statements/delete.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 1442: + case 1444: #line 54 "third_party/libpg_query/grammar/statements/delete.y" { (yyval.node) = NULL; ;} break; - case 1443: + case 1445: #line 60 "third_party/libpg_query/grammar/statements/delete.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 1444: + case 1446: #line 61 "third_party/libpg_query/grammar/statements/delete.y" { (yyval.list) = NIL; ;} break; - case 1445: + case 1447: #line 10 "third_party/libpg_query/grammar/statements/analyze.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -30236,7 +30283,7 @@ YYLTYPE yylloc; ;} break; - case 1446: + case 1448: #line 20 "third_party/libpg_query/grammar/statements/analyze.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -30249,7 +30296,7 @@ YYLTYPE yylloc; ;} break; - case 1447: + case 1449: #line 8 "third_party/libpg_query/grammar/statements/attach.y" { PGAttachStmt *n = makeNode(PGAttachStmt); @@ -30261,7 +30308,7 @@ YYLTYPE yylloc; ;} break; - case 1448: + case 1450: #line 17 "third_party/libpg_query/grammar/statements/attach.y" { PGAttachStmt *n = makeNode(PGAttachStmt); @@ -30273,7 +30320,7 @@ YYLTYPE yylloc; ;} break; - case 1449: + case 1451: #line 29 "third_party/libpg_query/grammar/statements/attach.y" { PGDetachStmt *n = makeNode(PGDetachStmt); @@ -30283,7 +30330,7 @@ YYLTYPE yylloc; ;} break; - case 1450: + case 1452: #line 36 "third_party/libpg_query/grammar/statements/attach.y" { PGDetachStmt *n = makeNode(PGDetachStmt); @@ -30293,7 +30340,7 @@ YYLTYPE yylloc; ;} break; - case 1451: + case 1453: #line 43 "third_party/libpg_query/grammar/statements/attach.y" { PGDetachStmt *n = makeNode(PGDetachStmt); @@ -30303,27 +30350,27 @@ YYLTYPE yylloc; ;} break; - case 1452: + case 1454: #line 51 "third_party/libpg_query/grammar/statements/attach.y" {;} break; - case 1453: + case 1455: #line 52 "third_party/libpg_query/grammar/statements/attach.y" {;} break; - case 1454: + case 1456: #line 56 "third_party/libpg_query/grammar/statements/attach.y" { (yyval.str) = (yyvsp[(2) - (2)].str); ;} break; - case 1455: + case 1457: #line 57 "third_party/libpg_query/grammar/statements/attach.y" { (yyval.str) = NULL; ;} break; - case 1456: + case 1458: #line 3 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyvsp[(2) - (2)].vsetstmt)->scope = VAR_SET_SCOPE_DEFAULT; @@ -30331,7 +30378,7 @@ YYLTYPE yylloc; ;} break; - case 1457: + case 1459: #line 8 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyvsp[(3) - (3)].vsetstmt)->scope = VAR_SET_SCOPE_LOCAL; @@ -30339,7 +30386,7 @@ YYLTYPE yylloc; ;} break; - case 1458: + case 1460: #line 13 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyvsp[(3) - (3)].vsetstmt)->scope = VAR_SET_SCOPE_SESSION; @@ -30347,7 +30394,7 @@ YYLTYPE yylloc; ;} break; - case 1459: + case 1461: #line 18 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyvsp[(3) - (3)].vsetstmt)->scope = VAR_SET_SCOPE_GLOBAL; @@ -30355,7 +30402,7 @@ YYLTYPE yylloc; ;} break; - case 1460: + case 1462: #line 27 "third_party/libpg_query/grammar/statements/variable_reset.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -30365,7 +30412,7 @@ YYLTYPE yylloc; ;} break; - case 1461: + case 1463: #line 34 "third_party/libpg_query/grammar/statements/variable_reset.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -30374,12 +30421,12 @@ YYLTYPE yylloc; ;} break; - case 1462: + case 1464: #line 43 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyval.vsetstmt) = (yyvsp[(1) - (1)].vsetstmt); ;} break; - case 1463: + case 1465: #line 45 "third_party/libpg_query/grammar/statements/variable_reset.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -30389,7 +30436,7 @@ YYLTYPE yylloc; ;} break; - case 1464: + case 1466: #line 52 "third_party/libpg_query/grammar/statements/variable_reset.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -30399,7 +30446,7 @@ YYLTYPE yylloc; ;} break; - case 1465: + case 1467: #line 3 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowSelectStmt *n = makeNode(PGVariableShowSelectStmt); @@ -30410,7 +30457,7 @@ YYLTYPE yylloc; ;} break; - case 1466: + case 1468: #line 10 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowSelectStmt *n = makeNode(PGVariableShowSelectStmt); @@ -30421,7 +30468,7 @@ YYLTYPE yylloc; ;} break; - case 1467: + case 1469: #line 18 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -30431,7 +30478,7 @@ YYLTYPE yylloc; ;} break; - case 1468: + case 1470: #line 25 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -30441,7 +30488,7 @@ YYLTYPE yylloc; ;} break; - case 1469: + case 1471: #line 32 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -30451,7 +30498,7 @@ YYLTYPE yylloc; ;} break; - case 1470: + case 1472: #line 39 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -30461,7 +30508,7 @@ YYLTYPE yylloc; ;} break; - case 1471: + case 1473: #line 46 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -30471,7 +30518,7 @@ YYLTYPE yylloc; ;} break; - case 1472: + case 1474: #line 53 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -30481,27 +30528,27 @@ YYLTYPE yylloc; ;} break; - case 1479: + case 1481: #line 67 "third_party/libpg_query/grammar/statements/variable_show.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1480: + case 1482: #line 69 "third_party/libpg_query/grammar/statements/variable_show.y" { (yyval.str) = psprintf("%s.%s", (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str)); ;} break; - case 1481: + case 1483: #line 72 "third_party/libpg_query/grammar/statements/variable_show.y" { (yyval.str) = psprintf("\"%s\"", (yyvsp[(1) - (1)].str)); ;} break; - case 1482: + case 1484: #line 74 "third_party/libpg_query/grammar/statements/variable_show.y" { (yyval.str) = psprintf("%s.\"%s\"", (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str)); ;} break; - case 1483: + case 1485: #line 7 "third_party/libpg_query/grammar/statements/call.y" { PGCallStmt *n = makeNode(PGCallStmt); @@ -30510,7 +30557,7 @@ YYLTYPE yylloc; ;} break; - case 1484: + case 1486: #line 10 "third_party/libpg_query/grammar/statements/view.y" { PGViewStmt *n = makeNode(PGViewStmt); @@ -30525,7 +30572,7 @@ YYLTYPE yylloc; ;} break; - case 1485: + case 1487: #line 23 "third_party/libpg_query/grammar/statements/view.y" { PGViewStmt *n = makeNode(PGViewStmt); @@ -30540,7 +30587,7 @@ YYLTYPE yylloc; ;} break; - case 1486: + case 1488: #line 36 "third_party/libpg_query/grammar/statements/view.y" { PGViewStmt *n = makeNode(PGViewStmt); @@ -30555,7 +30602,7 @@ YYLTYPE yylloc; ;} break; - case 1487: + case 1489: #line 49 "third_party/libpg_query/grammar/statements/view.y" { PGViewStmt *n = makeNode(PGViewStmt); @@ -30575,7 +30622,7 @@ YYLTYPE yylloc; ;} break; - case 1488: + case 1490: #line 67 "third_party/libpg_query/grammar/statements/view.y" { PGViewStmt *n = makeNode(PGViewStmt); @@ -30595,27 +30642,27 @@ YYLTYPE yylloc; ;} break; - case 1489: + case 1491: #line 87 "third_party/libpg_query/grammar/statements/view.y" { (yyval.viewcheckoption) = CASCADED_CHECK_OPTION; ;} break; - case 1490: + case 1492: #line 88 "third_party/libpg_query/grammar/statements/view.y" { (yyval.viewcheckoption) = CASCADED_CHECK_OPTION; ;} break; - case 1491: + case 1493: #line 89 "third_party/libpg_query/grammar/statements/view.y" { (yyval.viewcheckoption) = PG_LOCAL_CHECK_OPTION; ;} break; - case 1492: + case 1494: #line 90 "third_party/libpg_query/grammar/statements/view.y" { (yyval.viewcheckoption) = PG_NO_CHECK_OPTION; ;} break; - case 1493: + case 1495: #line 12 "third_party/libpg_query/grammar/statements/create_as.y" { PGCreateTableAsStmt *ctas = makeNode(PGCreateTableAsStmt); @@ -30631,7 +30678,7 @@ YYLTYPE yylloc; ;} break; - case 1494: + case 1496: #line 25 "third_party/libpg_query/grammar/statements/create_as.y" { PGCreateTableAsStmt *ctas = makeNode(PGCreateTableAsStmt); @@ -30647,7 +30694,7 @@ YYLTYPE yylloc; ;} break; - case 1495: + case 1497: #line 38 "third_party/libpg_query/grammar/statements/create_as.y" { PGCreateTableAsStmt *ctas = makeNode(PGCreateTableAsStmt); @@ -30663,22 +30710,22 @@ YYLTYPE yylloc; ;} break; - case 1496: + case 1498: #line 54 "third_party/libpg_query/grammar/statements/create_as.y" { (yyval.boolean) = true; ;} break; - case 1497: + case 1499: #line 55 "third_party/libpg_query/grammar/statements/create_as.y" { (yyval.boolean) = false; ;} break; - case 1498: + case 1500: #line 56 "third_party/libpg_query/grammar/statements/create_as.y" { (yyval.boolean) = true; ;} break; - case 1499: + case 1501: #line 62 "third_party/libpg_query/grammar/statements/create_as.y" { (yyval.into) = makeNode(PGIntoClause); @@ -30693,7 +30740,7 @@ YYLTYPE yylloc; /* Line 1267 of yacc.c. */ -#line 30697 "third_party/libpg_query/grammar/grammar_out.cpp" +#line 30744 "third_party/libpg_query/grammar/grammar_out.cpp" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); diff --git a/src/duckdb/third_party/libpg_query/src_backend_parser_scan.cpp b/src/duckdb/third_party/libpg_query/src_backend_parser_scan.cpp index 37863743..e395c285 100644 --- a/src/duckdb/third_party/libpg_query/src_backend_parser_scan.cpp +++ b/src/duckdb/third_party/libpg_query/src_backend_parser_scan.cpp @@ -1,4 +1,5 @@ -#line 1 "third_party/libpg_query/src_backend_parser_scan.cpp" +#line 2 "third_party/libpg_query/src_backend_parser_scan.cpp" +#line 2 "third_party/libpg_query/scan.l" /*------------------------------------------------------------------------- * * scan.l @@ -40,7 +41,10 @@ #include -#line 43 "third_party/libpg_query/src_backend_parser_scan.cpp" + + + +#line 48 "third_party/libpg_query/src_backend_parser_scan.cpp" #define YY_INT_ALIGNED short int @@ -48,246 +52,12 @@ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 6 -#define YY_FLEX_SUBMINOR_VERSION 4 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif -#ifdef yy_create_buffer -#define core_yy_create_buffer_ALREADY_DEFINED -#else -#define yy_create_buffer core_yy_create_buffer -#endif - -#ifdef yy_delete_buffer -#define core_yy_delete_buffer_ALREADY_DEFINED -#else -#define yy_delete_buffer core_yy_delete_buffer -#endif - -#ifdef yy_scan_buffer -#define core_yy_scan_buffer_ALREADY_DEFINED -#else -#define yy_scan_buffer core_yy_scan_buffer -#endif - -#ifdef yy_scan_string -#define core_yy_scan_string_ALREADY_DEFINED -#else -#define yy_scan_string core_yy_scan_string -#endif - -#ifdef yy_scan_bytes -#define core_yy_scan_bytes_ALREADY_DEFINED -#else -#define yy_scan_bytes core_yy_scan_bytes -#endif - -#ifdef yy_init_buffer -#define core_yy_init_buffer_ALREADY_DEFINED -#else -#define yy_init_buffer core_yy_init_buffer -#endif - -#ifdef yy_flush_buffer -#define core_yy_flush_buffer_ALREADY_DEFINED -#else -#define yy_flush_buffer core_yy_flush_buffer -#endif - -#ifdef yy_load_buffer_state -#define core_yy_load_buffer_state_ALREADY_DEFINED -#else -#define yy_load_buffer_state core_yy_load_buffer_state -#endif - -#ifdef yy_switch_to_buffer -#define core_yy_switch_to_buffer_ALREADY_DEFINED -#else -#define yy_switch_to_buffer core_yy_switch_to_buffer -#endif - -#ifdef yypush_buffer_state -#define core_yypush_buffer_state_ALREADY_DEFINED -#else -#define yypush_buffer_state core_yypush_buffer_state -#endif - -#ifdef yypop_buffer_state -#define core_yypop_buffer_state_ALREADY_DEFINED -#else -#define yypop_buffer_state core_yypop_buffer_state -#endif - -#ifdef yyensure_buffer_stack -#define core_yyensure_buffer_stack_ALREADY_DEFINED -#else -#define yyensure_buffer_stack core_yyensure_buffer_stack -#endif - -#ifdef yylex -#define core_yylex_ALREADY_DEFINED -#else -#define yylex core_yylex -#endif - -#ifdef yyrestart -#define core_yyrestart_ALREADY_DEFINED -#else -#define yyrestart core_yyrestart -#endif - -#ifdef yylex_init -#define core_yylex_init_ALREADY_DEFINED -#else -#define yylex_init core_yylex_init -#endif - -#ifdef yylex_init_extra -#define core_yylex_init_extra_ALREADY_DEFINED -#else -#define yylex_init_extra core_yylex_init_extra -#endif - -#ifdef yylex_destroy -#define core_yylex_destroy_ALREADY_DEFINED -#else -#define yylex_destroy core_yylex_destroy -#endif - -#ifdef yyget_debug -#define core_yyget_debug_ALREADY_DEFINED -#else -#define yyget_debug core_yyget_debug -#endif - -#ifdef yyset_debug -#define core_yyset_debug_ALREADY_DEFINED -#else -#define yyset_debug core_yyset_debug -#endif - -#ifdef yyget_extra -#define core_yyget_extra_ALREADY_DEFINED -#else -#define yyget_extra core_yyget_extra -#endif - -#ifdef yyset_extra -#define core_yyset_extra_ALREADY_DEFINED -#else -#define yyset_extra core_yyset_extra -#endif - -#ifdef yyget_in -#define core_yyget_in_ALREADY_DEFINED -#else -#define yyget_in core_yyget_in -#endif - -#ifdef yyset_in -#define core_yyset_in_ALREADY_DEFINED -#else -#define yyset_in core_yyset_in -#endif - -#ifdef yyget_out -#define core_yyget_out_ALREADY_DEFINED -#else -#define yyget_out core_yyget_out -#endif - -#ifdef yyset_out -#define core_yyset_out_ALREADY_DEFINED -#else -#define yyset_out core_yyset_out -#endif - -#ifdef yyget_leng -#define core_yyget_leng_ALREADY_DEFINED -#else -#define yyget_leng core_yyget_leng -#endif - -#ifdef yyget_text -#define core_yyget_text_ALREADY_DEFINED -#else -#define yyget_text core_yyget_text -#endif - -#ifdef yyget_lineno -#define core_yyget_lineno_ALREADY_DEFINED -#else -#define yyget_lineno core_yyget_lineno -#endif - -#ifdef yyset_lineno -#define core_yyset_lineno_ALREADY_DEFINED -#else -#define yyset_lineno core_yyset_lineno -#endif - -#ifdef yyget_column -#define core_yyget_column_ALREADY_DEFINED -#else -#define yyget_column core_yyget_column -#endif - -#ifdef yyset_column -#define core_yyset_column_ALREADY_DEFINED -#else -#define yyset_column core_yyset_column -#endif - -#ifdef yywrap -#define core_yywrap_ALREADY_DEFINED -#else -#define yywrap core_yywrap -#endif - -#ifdef yyget_lval -#define core_yyget_lval_ALREADY_DEFINED -#else -#define yyget_lval core_yyget_lval -#endif - -#ifdef yyset_lval -#define core_yyset_lval_ALREADY_DEFINED -#else -#define yyset_lval core_yyset_lval -#endif - -#ifdef yyget_lloc -#define core_yyget_lloc_ALREADY_DEFINED -#else -#define yyget_lloc core_yyget_lloc -#endif - -#ifdef yyset_lloc -#define core_yyset_lloc_ALREADY_DEFINED -#else -#define yyset_lloc core_yyset_lloc -#endif - -#ifdef yyalloc -#define core_yyalloc_ALREADY_DEFINED -#else -#define yyalloc core_yyalloc -#endif - -#ifdef yyrealloc -#define core_yyrealloc_ALREADY_DEFINED -#else -#define yyrealloc core_yyrealloc -#endif - -#ifdef yyfree -#define core_yyfree_ALREADY_DEFINED -#else -#define yyfree core_yyfree -#endif - /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ @@ -330,6 +100,7 @@ typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN @@ -360,32 +131,38 @@ typedef unsigned int flex_uint32_t; #define UINT32_MAX (4294967295U) #endif -#ifndef SIZE_MAX -#define SIZE_MAX (~(size_t)0) -#endif +#endif /* ! FLEXINT_H */ -#endif /* ! C99 */ +#ifdef __cplusplus -#endif /* ! FLEXINT_H */ +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST -/* begin standard C++ headers. */ +#else /* ! __cplusplus */ -/* TODO: this is always defined, so inline it */ -#define yyconst const +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) -#if defined(__GNUC__) && __GNUC__ >= 3 -#define yynoreturn __attribute__((__noreturn__)) +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const #else -#define yynoreturn +#define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 -/* Promotes a possibly negative, possibly signed char to an - * integer in range [0..255] for use as an array index. +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. */ -#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* An opaque pointer. */ #ifndef YY_TYPEDEF_YY_SCANNER_T @@ -409,29 +186,25 @@ typedef void* yyscan_t; * definition of BEGIN. */ #define BEGIN yyg->yy_start = 1 + 2 * + /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START ((yyg->yy_start - 1) / 2) #define YYSTATE YY_START + /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + /* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart( yyin , yyscanner ) +#define YY_NEW_FILE core_yyrestart(yyin ,yyscanner ) + #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else #define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. @@ -451,9 +224,8 @@ typedef size_t yy_size_t; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 - + #define YY_LESS_LINENO(n) - #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ @@ -468,6 +240,7 @@ typedef size_t yy_size_t; YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) + #define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) #ifndef YY_STRUCT_YY_BUFFER_STATE @@ -510,7 +283,7 @@ struct yy_buffer_state int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ - + /* Whether to try to fill the input buffer when we reach the * end of it. */ @@ -527,7 +300,7 @@ struct yy_buffer_state * possible backing-up. * * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by + * (via core_yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 @@ -544,67 +317,73 @@ struct yy_buffer_state #define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ : NULL) + /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] -void yyrestart ( FILE *input_file , yyscan_t yyscanner ); -void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); -void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); -void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); -void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); -void yypop_buffer_state ( yyscan_t yyscanner ); +void core_yyrestart (FILE *input_file ,yyscan_t yyscanner ); +void core_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +YY_BUFFER_STATE core_yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); +void core_yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void core_yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void core_yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +void core_yypop_buffer_state (yyscan_t yyscanner ); + +static void core_yyensure_buffer_stack (yyscan_t yyscanner ); +static void core_yy_load_buffer_state (yyscan_t yyscanner ); +static void core_yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner ); -static void yyensure_buffer_stack ( yyscan_t yyscanner ); -static void yy_load_buffer_state ( yyscan_t yyscanner ); -static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner ); -#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner) +#define YY_FLUSH_BUFFER core_yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner) -YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, yy_size_t len , yyscan_t yyscanner ); +YY_BUFFER_STATE core_yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); +YY_BUFFER_STATE core_yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); +YY_BUFFER_STATE core_yy_scan_bytes (yyconst char *bytes,yy_size_t len ,yyscan_t yyscanner ); -void *yyalloc ( yy_size_t , yyscan_t yyscanner ); -void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); -void yyfree ( void * , yyscan_t yyscanner ); +void *core_yyalloc (yy_size_t ,yyscan_t yyscanner ); +void *core_yyrealloc (void *,yy_size_t ,yyscan_t yyscanner ); +void core_yyfree (void * ,yyscan_t yyscanner ); + +#define yy_new_buffer core_yy_create_buffer -#define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ - yyensure_buffer_stack (yyscanner); \ + core_yyensure_buffer_stack (yyscanner); \ YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ + core_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } + #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ - yyensure_buffer_stack (yyscanner); \ + core_yyensure_buffer_stack (yyscanner); \ YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ + core_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } + #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ -#define core_yywrap(yyscanner) (/*CONSTCOND*/1) +#define core_yywrap(n) 1 #define YY_SKIP_YYWRAP -typedef flex_uint8_t YY_CHAR; + +typedef unsigned char YY_CHAR; typedef int yy_state_type; #define yytext_ptr yytext_r -static yy_state_type yy_get_previous_state ( yyscan_t yyscanner ); -static yy_state_type yy_try_NUL_trans ( yy_state_type current_state , yyscan_t yyscanner); -static int yy_get_next_buffer ( yyscan_t yyscanner ); -static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); +static yy_state_type yy_get_previous_state (yyscan_t yyscanner ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ,yyscan_t yyscanner); +static int yy_get_next_buffer (yyscan_t yyscanner ); +static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. @@ -615,6 +394,7 @@ static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); yyg->yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; + #define YY_NUM_RULES 84 #define YY_END_OF_BUFFER 85 /* This struct is not used in this scanner, @@ -624,7 +404,7 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[309] = +static yyconst flex_int16_t yy_accept[309] = { 0, 0, 0, 12, 12, 0, 0, 0, 0, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, @@ -662,7 +442,7 @@ static const flex_int16_t yy_accept[309] = 28, 28, 28, 55, 55, 28, 28, 0 } ; -static const YY_CHAR yy_ec[256] = +static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 2, 4, 1, 1, 1, 1, 1, 1, 1, @@ -694,7 +474,7 @@ static const YY_CHAR yy_ec[256] = 30, 30, 30, 30, 30 } ; -static const YY_CHAR yy_meta[40] = +static yyconst flex_int32_t yy_meta[40] = { 0, 1, 1, 2, 2, 3, 4, 5, 3, 3, 6, 1, 7, 3, 3, 1, 7, 8, 8, 1, 3, @@ -702,7 +482,7 @@ static const YY_CHAR yy_meta[40] = 10, 10, 10, 10, 10, 11, 10, 10, 10 } ; -static const flex_int16_t yy_base[376] = +static yyconst flex_int16_t yy_base[376] = { 0, 0, 0, 486, 484, 35, 55, 483, 475, 466, 465, 42, 51, 458, 450, 39, 55, 449, 448, 86, 123, @@ -747,7 +527,7 @@ static const flex_int16_t yy_base[376] = 1196, 1205, 1216, 1227, 1238 } ; -static const flex_int16_t yy_def[376] = +static yyconst flex_int16_t yy_def[376] = { 0, 308, 1, 309, 309, 310, 310, 311, 311, 312, 312, 313, 313, 314, 314, 315, 315, 311, 311, 316, 316, @@ -792,7 +572,7 @@ static const flex_int16_t yy_def[376] = 308, 308, 308, 308, 308 } ; -static const flex_int16_t yy_nxt[1290] = +static yyconst flex_int16_t yy_nxt[1290] = { 0, 28, 29, 30, 29, 31, 32, 33, 34, 35, 36, 37, 38, 34, 39, 40, 41, 42, 42, 43, 44, @@ -937,7 +717,7 @@ static const flex_int16_t yy_nxt[1290] = 308, 308, 308, 308, 308, 308, 308, 308, 308 } ; -static const flex_int16_t yy_chk[1290] = +static yyconst flex_int16_t yy_chk[1290] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1118,7 +898,7 @@ bool standard_conforming_strings = true; #define YY_EXTRA_TYPE core_yy_extra_type * /* - * Each call to yylex must set yylloc to the location of the found token + * Each call to core_yylex must set yylloc to the location of the found token * (expressed as a byte offset from the start of the input text). * When we parse a token that requires multiple lexer rules to process, * this should be done in the first such rule, else yylloc will point @@ -1160,7 +940,6 @@ static void check_escape_warning(core_yyscan_t yyscanner); extern int core_yyget_column(yyscan_t yyscanner); extern void core_yyset_column(int column_no, yyscan_t yyscanner); -#line 1162 "third_party/libpg_query/src_backend_parser_scan.cpp" #define YY_NO_INPUT 1 /* * OK, here is a short description of lex/flex rules behavior. @@ -1190,6 +969,17 @@ extern void core_yyset_column(int column_no, yyscan_t yyscanner); * The default one is probably not the right thing. */ + + + + + + + + + + + /* * In order to make the world safe for Windows and Mac clients as well as * Unix ones, we accept either \n or \r as a newline. A DOS-style \r\n @@ -1314,7 +1104,7 @@ extern void core_yyset_column(int column_no, yyscan_t yyscanner); * Note that xcstart must appear before operator, as explained above! * Also whitespace (comment) must appear before operator. */ -#line 1316 "third_party/libpg_query/src_backend_parser_scan.cpp" +#line 1107 "third_party/libpg_query/src_backend_parser_scan.cpp" #define INITIAL 0 #define xb 1 @@ -1372,7 +1162,7 @@ struct yyguts_t }; /* end struct yyguts_t */ -static int yy_init_globals ( yyscan_t yyscanner ); +static int yy_init_globals (yyscan_t yyscanner ); /* This must go here because YYSTYPE and YYLTYPE are included * from bison output in section 1.*/ @@ -1380,50 +1170,46 @@ static int yy_init_globals ( yyscan_t yyscanner ); # define yylloc yyg->yylloc_r -int yylex_init (yyscan_t* scanner); +int core_yylex_init (yyscan_t* scanner); -int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); +int core_yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ -int yylex_destroy ( yyscan_t yyscanner ); +int core_yylex_destroy (yyscan_t yyscanner ); -int yyget_debug ( yyscan_t yyscanner ); +int core_yyget_debug (yyscan_t yyscanner ); -void yyset_debug ( int debug_flag , yyscan_t yyscanner ); +void core_yyset_debug (int debug_flag ,yyscan_t yyscanner ); -YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); +YY_EXTRA_TYPE core_yyget_extra (yyscan_t yyscanner ); -void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); +void core_yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); -FILE *yyget_in ( yyscan_t yyscanner ); +FILE *core_yyget_in (yyscan_t yyscanner ); -void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); +void core_yyset_in (FILE * in_str ,yyscan_t yyscanner ); -FILE *yyget_out ( yyscan_t yyscanner ); +FILE *core_yyget_out (yyscan_t yyscanner ); -void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); +void core_yyset_out (FILE * out_str ,yyscan_t yyscanner ); - yy_size_t yyget_leng ( yyscan_t yyscanner ); +yy_size_t core_yyget_leng (yyscan_t yyscanner ); -char *yyget_text ( yyscan_t yyscanner ); +char *core_yyget_text (yyscan_t yyscanner ); -int yyget_lineno ( yyscan_t yyscanner ); +int core_yyget_lineno (yyscan_t yyscanner ); -void yyset_lineno ( int _line_number , yyscan_t yyscanner ); +void core_yyset_lineno (int line_number ,yyscan_t yyscanner ); -int yyget_column ( yyscan_t yyscanner ); +YYSTYPE * core_yyget_lval (yyscan_t yyscanner ); -void yyset_column ( int _column_no , yyscan_t yyscanner ); +void core_yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner ); -YYSTYPE * yyget_lval ( yyscan_t yyscanner ); - -void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner ); - - YYLTYPE *yyget_lloc ( yyscan_t yyscanner ); + YYLTYPE *core_yyget_lloc (yyscan_t yyscanner ); - void yyset_lloc ( YYLTYPE * yylloc_param , yyscan_t yyscanner ); + void core_yyset_lloc (YYLTYPE * yylloc_param ,yyscan_t yyscanner ); /* Macros after this point can all be overridden by user definitions in * section 1. @@ -1431,41 +1217,33 @@ void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner ); #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus -extern "C" int yywrap ( yyscan_t yyscanner ); +extern "C" int core_yywrap (yyscan_t yyscanner ); #else -extern int yywrap ( yyscan_t yyscanner ); -#endif +extern int core_yywrap (yyscan_t yyscanner ); #endif - -#ifndef YY_NO_UNPUT - #endif #ifndef yytext_ptr -static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); +static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen ( const char * , yyscan_t yyscanner); +static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); #endif #ifndef YY_NO_INPUT + #ifdef __cplusplus -static int yyinput ( yyscan_t yyscanner ); +static int yyinput (yyscan_t yyscanner ); #else -static int input ( yyscan_t yyscanner ); +static int input (yyscan_t yyscanner ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else #define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ @@ -1473,7 +1251,7 @@ static int input ( yyscan_t yyscanner ); /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ -#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) +#define ECHO fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, @@ -1497,7 +1275,7 @@ static int input ( yyscan_t yyscanner ); else \ { \ errno=0; \ - while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ @@ -1538,10 +1316,10 @@ static int input ( yyscan_t yyscanner ); #ifndef YY_DECL #define YY_DECL_IS_OURS 1 -extern int yylex \ - (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner); +extern int core_yylex \ + (YYSTYPE * yylval_param,YYLTYPE * yylloc_param ,yyscan_t yyscanner); -#define YY_DECL int yylex \ +#define YY_DECL int core_yylex \ (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner) #endif /* !YY_DECL */ @@ -1554,7 +1332,7 @@ extern int yylex \ /* Code executed at the end of each rule. */ #ifndef YY_BREAK -#define YY_BREAK /*LINTED*/break; +#define YY_BREAK break; #endif #define YY_RULE_SETUP \ @@ -1569,6 +1347,11 @@ YY_DECL int yy_act; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +#line 404 "third_party/libpg_query/scan.l" + + +#line 1353 "third_party/libpg_query/src_backend_parser_scan.cpp" + yylval = yylval_param; yylloc = yylloc_param; @@ -1584,21 +1367,15 @@ YY_DECL if ( ! yyg->yy_start ) yyg->yy_start = 1; /* first start state */ if ( ! YY_CURRENT_BUFFER ) { - yyensure_buffer_stack (yyscanner); + core_yyensure_buffer_stack (yyscanner); YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); + core_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); } - yy_load_buffer_state( yyscanner ); + core_yy_load_buffer_state(yyscanner ); } - { -#line 404 "third_party/libpg_query/scan.l" - - -#line 1605 "third_party/libpg_query/src_backend_parser_scan.cpp" - - while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ + while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = yyg->yy_c_buf_p; @@ -1614,7 +1391,7 @@ YY_DECL yy_match: do { - YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { yyg->yy_last_accepting_state = yy_current_state; @@ -1624,9 +1401,9 @@ YY_DECL { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 309 ) - yy_c = yy_meta[yy_c]; + yy_c = yy_meta[(unsigned int) yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 308 ); @@ -2667,7 +2444,7 @@ YY_RULE_SETUP #line 1089 "third_party/libpg_query/scan.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 2676 "third_party/libpg_query/src_backend_parser_scan.cpp" +#line 2454 "third_party/libpg_query/src_backend_parser_scan.cpp" case YY_END_OF_BUFFER: { @@ -2683,7 +2460,7 @@ YY_FATAL_ERROR( "flex scanner jammed" ); /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure + * core_yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a @@ -2744,7 +2521,7 @@ YY_FATAL_ERROR( "flex scanner jammed" ); { yyg->yy_did_buffer_switch_on_eof = 0; - if ( yywrap( yyscanner ) ) + if ( core_yywrap(yyscanner ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up @@ -2797,8 +2574,7 @@ YY_FATAL_ERROR( "flex scanner jammed" ); "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ - } /* end of user's declarations */ -} /* end of yylex */ +} /* end of core_yylex */ /* yy_get_next_buffer - try to read in a new buffer * @@ -2841,7 +2617,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) /* Try to read more data. */ /* First move last chars to start of buffer. */ - number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1); + number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); @@ -2861,7 +2637,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) (yyg->yy_c_buf_p - b->yy_ch_buf); @@ -2877,12 +2653,11 @@ static int yy_get_next_buffer (yyscan_t yyscanner) b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ - yyrealloc( (void *) b->yy_ch_buf, - (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); + core_yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner ); } else /* Can't grow it, we don't own it. */ - b->yy_ch_buf = NULL; + b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( @@ -2910,7 +2685,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin , yyscanner); + core_yyrestart(yyin ,yyscanner); } else @@ -2924,15 +2699,12 @@ static int yy_get_next_buffer (yyscan_t yyscanner) else ret_val = EOB_ACT_CONTINUE_SCAN; - if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( - (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner ); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) core_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - /* "- 2" to take care of EOB's */ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } yyg->yy_n_chars += number_to_move; @@ -2966,9 +2738,9 @@ static int yy_get_next_buffer (yyscan_t yyscanner) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 309 ) - yy_c = yy_meta[yy_c]; + yy_c = yy_meta[(unsigned int) yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; @@ -2995,19 +2767,14 @@ static int yy_get_next_buffer (yyscan_t yyscanner) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 309 ) - yy_c = yy_meta[yy_c]; + yy_c = yy_meta[(unsigned int) yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 308); - (void)yyg; return yy_is_jam ? 0 : yy_current_state; } -#ifndef YY_NO_UNPUT - -#endif - #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (yyscan_t yyscanner) @@ -3050,13 +2817,13 @@ static int yy_get_next_buffer (yyscan_t yyscanner) */ /* Reset buffer status. */ - yyrestart( yyin , yyscanner); + core_yyrestart(yyin ,yyscanner); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { - if ( yywrap( yyscanner ) ) + if ( core_yywrap(yyscanner ) ) return 0; if ( ! yyg->yy_did_buffer_switch_on_eof ) @@ -3088,34 +2855,34 @@ static int yy_get_next_buffer (yyscan_t yyscanner) * @param yyscanner The scanner object. * @note This function does not reset the start condition to @c INITIAL . */ - void yyrestart (FILE * input_file , yyscan_t yyscanner) + void core_yyrestart (FILE * input_file , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! YY_CURRENT_BUFFER ){ - yyensure_buffer_stack (yyscanner); + core_yyensure_buffer_stack (yyscanner); YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); + core_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); } - yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner); - yy_load_buffer_state( yyscanner ); + core_yy_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner); + core_yy_load_buffer_state(yyscanner ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * @param yyscanner The scanner object. */ - void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) + void core_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* TODO. We should be able to replace this entire function body * with - * yypop_buffer_state(); - * yypush_buffer_state(new_buffer); + * core_yypop_buffer_state(); + * core_yypush_buffer_state(new_buffer); */ - yyensure_buffer_stack (yyscanner); + core_yyensure_buffer_stack (yyscanner); if ( YY_CURRENT_BUFFER == new_buffer ) return; @@ -3128,17 +2895,17 @@ static int yy_get_next_buffer (yyscan_t yyscanner) } YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state( yyscanner ); + core_yy_load_buffer_state(yyscanner ); /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe + * EOF (core_yywrap()) processing, but the only time this flag + * is looked at is after core_yywrap() is called, so it's safe * to go ahead and always set it. */ yyg->yy_did_buffer_switch_on_eof = 1; } -static void yy_load_buffer_state (yyscan_t yyscanner) +static void core_yy_load_buffer_state (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; @@ -3153,35 +2920,35 @@ static void yy_load_buffer_state (yyscan_t yyscanner) * @param yyscanner The scanner object. * @return the allocated buffer state. */ - YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) + YY_BUFFER_STATE core_yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) { YY_BUFFER_STATE b; - b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); + b = (YY_BUFFER_STATE) core_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + YY_FATAL_ERROR( "out of dynamic memory in core_yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ - b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); + b->yy_ch_buf = (char *) core_yyalloc(b->yy_buf_size + 2 ,yyscanner ); if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + YY_FATAL_ERROR( "out of dynamic memory in core_yy_create_buffer()" ); b->yy_is_our_buffer = 1; - yy_init_buffer( b, file , yyscanner); + core_yy_init_buffer(b,file ,yyscanner); return b; } /** Destroy the buffer. - * @param b a buffer created with yy_create_buffer() + * @param b a buffer created with core_yy_create_buffer() * @param yyscanner The scanner object. */ - void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) + void core_yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; @@ -3192,28 +2959,28 @@ static void yy_load_buffer_state (yyscan_t yyscanner) YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) - yyfree( (void *) b->yy_ch_buf , yyscanner ); + core_yyfree((void *) b->yy_ch_buf ,yyscanner ); - yyfree( (void *) b , yyscanner ); + core_yyfree((void *) b ,yyscanner ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, - * such as during a yyrestart() or at EOF. + * such as during a core_yyrestart() or at EOF. */ - static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) + static void core_yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) { int oerrno = errno; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yy_flush_buffer( b , yyscanner); + core_yy_flush_buffer(b ,yyscanner); b->yy_input_file = file; b->yy_fill_buffer = 1; - /* If b is the current buffer, then yy_init_buffer was _probably_ - * called from yyrestart() or through yy_get_next_buffer. + /* If b is the current buffer, then core_yy_init_buffer was _probably_ + * called from core_yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ @@ -3230,7 +2997,7 @@ static void yy_load_buffer_state (yyscan_t yyscanner) * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * @param yyscanner The scanner object. */ - void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) + void core_yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! b ) @@ -3251,7 +3018,7 @@ static void yy_load_buffer_state (yyscan_t yyscanner) b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) - yy_load_buffer_state( yyscanner ); + core_yy_load_buffer_state(yyscanner ); } /** Pushes the new state onto the stack. The new state becomes @@ -3260,15 +3027,15 @@ static void yy_load_buffer_state (yyscan_t yyscanner) * @param new_buffer The new state. * @param yyscanner The scanner object. */ -void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) +void core_yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (new_buffer == NULL) return; - yyensure_buffer_stack(yyscanner); + core_yyensure_buffer_stack(yyscanner); - /* This block is copied from yy_switch_to_buffer. */ + /* This block is copied from core_yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ @@ -3282,8 +3049,8 @@ void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) yyg->yy_buffer_stack_top++; YY_CURRENT_BUFFER_LVALUE = new_buffer; - /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( yyscanner ); + /* copied from core_yy_switch_to_buffer. */ + core_yy_load_buffer_state(yyscanner ); yyg->yy_did_buffer_switch_on_eof = 1; } @@ -3291,19 +3058,19 @@ void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) * The next element becomes the new top. * @param yyscanner The scanner object. */ -void yypop_buffer_state (yyscan_t yyscanner) +void core_yypop_buffer_state (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (!YY_CURRENT_BUFFER) return; - yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner); + core_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner); YY_CURRENT_BUFFER_LVALUE = NULL; if (yyg->yy_buffer_stack_top > 0) --yyg->yy_buffer_stack_top; if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( yyscanner ); + core_yy_load_buffer_state(yyscanner ); yyg->yy_did_buffer_switch_on_eof = 1; } } @@ -3311,7 +3078,7 @@ void yypop_buffer_state (yyscan_t yyscanner) /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ -static void yyensure_buffer_stack (yyscan_t yyscanner) +static void core_yyensure_buffer_stack (yyscan_t yyscanner) { yy_size_t num_to_alloc; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; @@ -3322,15 +3089,15 @@ static void yyensure_buffer_stack (yyscan_t yyscanner) * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ - num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ - yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc + num_to_alloc = 1; + yyg->yy_buffer_stack = (struct yy_buffer_state**)core_yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) , yyscanner); if ( ! yyg->yy_buffer_stack ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - + YY_FATAL_ERROR( "out of dynamic memory in core_yyensure_buffer_stack()" ); + memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - + yyg->yy_buffer_stack_max = num_to_alloc; yyg->yy_buffer_stack_top = 0; return; @@ -3339,15 +3106,15 @@ static void yyensure_buffer_stack (yyscan_t yyscanner) if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ /* Increase the buffer to prepare for a possible push. */ - yy_size_t grow_size = 8 /* arbitrary grow size */; + int grow_size = 8 /* arbitrary grow size */; num_to_alloc = yyg->yy_buffer_stack_max + grow_size; - yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc + yyg->yy_buffer_stack = (struct yy_buffer_state**)core_yyrealloc (yyg->yy_buffer_stack, num_to_alloc * sizeof(struct yy_buffer_state*) , yyscanner); if ( ! yyg->yy_buffer_stack ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + YY_FATAL_ERROR( "out of dynamic memory in core_yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); @@ -3359,9 +3126,9 @@ static void yyensure_buffer_stack (yyscan_t yyscanner) * @param base the character buffer * @param size the size in bytes of the character buffer * @param yyscanner The scanner object. - * @return the newly allocated buffer state object. + * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) +YY_BUFFER_STATE core_yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) { YY_BUFFER_STATE b; @@ -3369,69 +3136,68 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscann base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ - return NULL; + return 0; - b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); + b = (YY_BUFFER_STATE) core_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + YY_FATAL_ERROR( "out of dynamic memory in core_yy_scan_buffer()" ); - b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; - b->yy_input_file = NULL; + b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; - yy_switch_to_buffer( b , yyscanner ); + core_yy_switch_to_buffer(b ,yyscanner ); return b; } -/** Setup the input buffer state to scan a string. The next call to yylex() will +/** Setup the input buffer state to scan a string. The next call to core_yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * @param yyscanner The scanner object. * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use - * yy_scan_bytes() instead. + * core_yy_scan_bytes() instead. */ -YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner) +YY_BUFFER_STATE core_yy_scan_string (yyconst char * yystr , yyscan_t yyscanner) { - return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner); + return core_yy_scan_bytes(yystr,strlen(yystr) ,yyscanner); } -/** Setup the input buffer state to scan the given bytes. The next call to yylex() will +/** Setup the input buffer state to scan the given bytes. The next call to core_yylex() will * scan from a @e copy of @a bytes. - * @param yybytes the byte buffer to scan - * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. * @param yyscanner The scanner object. * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, yy_size_t _yybytes_len , yyscan_t yyscanner) +YY_BUFFER_STATE core_yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len , yyscan_t yyscanner) { YY_BUFFER_STATE b; char *buf; - yy_size_t n; - yy_size_t i; + yy_size_t n, i; /* Get memory for full buffer, including space for trailing EOB's. */ - n = (yy_size_t) (_yybytes_len + 2); - buf = (char *) yyalloc( n , yyscanner ); + n = _yybytes_len + 2; + buf = (char *) core_yyalloc(n ,yyscanner ); if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + YY_FATAL_ERROR( "out of dynamic memory in core_yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - b = yy_scan_buffer( buf, n , yyscanner); + b = core_yy_scan_buffer(buf,n ,yyscanner); if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + YY_FATAL_ERROR( "bad buffer in core_yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. @@ -3445,11 +3211,9 @@ YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, yy_size_t _yybytes_len , #define YY_EXIT_FAILURE 2 #endif -static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner) +static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner) { - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - //( stderr, "%s\n", msg ); + //( stderr, "%s\n", msg ); throw std::runtime_error(msg); // YY_EXIT_FAILURE ); } @@ -3460,7 +3224,7 @@ static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner) do \ { \ /* Undo effects of setting up yytext. */ \ - yy_size_t yyless_macro_arg = (n); \ + int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = yyg->yy_hold_char; \ yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ @@ -3475,7 +3239,7 @@ static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner) /** Get the user-defined data for this scanner. * @param yyscanner The scanner object. */ -YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) +YY_EXTRA_TYPE core_yyget_extra (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyextra; @@ -3484,10 +3248,10 @@ YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) /** Get the current line number. * @param yyscanner The scanner object. */ -int yyget_lineno (yyscan_t yyscanner) +int core_yyget_lineno (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - + if (! YY_CURRENT_BUFFER) return 0; @@ -3497,10 +3261,10 @@ int yyget_lineno (yyscan_t yyscanner) /** Get the current column number. * @param yyscanner The scanner object. */ -int yyget_column (yyscan_t yyscanner) +int core_yyget_column (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - + if (! YY_CURRENT_BUFFER) return 0; @@ -3510,7 +3274,7 @@ int yyget_column (yyscan_t yyscanner) /** Get the input stream. * @param yyscanner The scanner object. */ -FILE *yyget_in (yyscan_t yyscanner) +FILE *core_yyget_in (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyin; @@ -3519,7 +3283,7 @@ FILE *yyget_in (yyscan_t yyscanner) /** Get the output stream. * @param yyscanner The scanner object. */ -FILE *yyget_out (yyscan_t yyscanner) +FILE *core_yyget_out (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyout; @@ -3528,7 +3292,7 @@ FILE *yyget_out (yyscan_t yyscanner) /** Get the length of the current token. * @param yyscanner The scanner object. */ -yy_size_t yyget_leng (yyscan_t yyscanner) +yy_size_t core_yyget_leng (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyleng; @@ -3538,7 +3302,7 @@ yy_size_t yyget_leng (yyscan_t yyscanner) * @param yyscanner The scanner object. */ -char *yyget_text (yyscan_t yyscanner) +char *core_yyget_text (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yytext; @@ -3548,93 +3312,93 @@ char *yyget_text (yyscan_t yyscanner) * @param user_defined The data to be associated with this scanner. * @param yyscanner The scanner object. */ -void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) +void core_yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyextra = user_defined ; } /** Set the current line number. - * @param _line_number line number + * @param line_number * @param yyscanner The scanner object. */ -void yyset_lineno (int _line_number , yyscan_t yyscanner) +void core_yyset_lineno (int line_number , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* lineno is only valid if an input buffer exists. */ if (! YY_CURRENT_BUFFER ) - YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); + yy_fatal_error( "core_yyset_lineno called with no buffer" , yyscanner); - yylineno = _line_number; + yylineno = line_number; } /** Set the current column. - * @param _column_no column number + * @param line_number * @param yyscanner The scanner object. */ -void yyset_column (int _column_no , yyscan_t yyscanner) +void core_yyset_column (int column_no , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* column is only valid if an input buffer exists. */ if (! YY_CURRENT_BUFFER ) - YY_FATAL_ERROR( "yyset_column called with no buffer" ); + yy_fatal_error( "core_yyset_column called with no buffer" , yyscanner); - yycolumn = _column_no; + yycolumn = column_no; } /** Set the input stream. This does not discard the current * input buffer. - * @param _in_str A readable stream. + * @param in_str A readable stream. * @param yyscanner The scanner object. - * @see yy_switch_to_buffer + * @see core_yy_switch_to_buffer */ -void yyset_in (FILE * _in_str , yyscan_t yyscanner) +void core_yyset_in (FILE * in_str , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyin = _in_str ; + yyin = in_str ; } -void yyset_out (FILE * _out_str , yyscan_t yyscanner) +void core_yyset_out (FILE * out_str , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yyout = _out_str ; + yyout = out_str ; } -int yyget_debug (yyscan_t yyscanner) +int core_yyget_debug (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yy_flex_debug; } -void yyset_debug (int _bdebug , yyscan_t yyscanner) +void core_yyset_debug (int bdebug , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - yy_flex_debug = _bdebug ; + yy_flex_debug = bdebug ; } /* Accessor methods for yylval and yylloc */ -YYSTYPE * yyget_lval (yyscan_t yyscanner) +YYSTYPE * core_yyget_lval (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yylval; } -void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) +void core_yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yylval = yylval_param; } -YYLTYPE *yyget_lloc (yyscan_t yyscanner) +YYLTYPE *core_yyget_lloc (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yylloc; } -void yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner) +void core_yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yylloc = yylloc_param; @@ -3642,18 +3406,20 @@ void yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner) /* User-visible API */ -/* yylex_init is special because it creates the scanner itself, so it is +/* core_yylex_init is special because it creates the scanner itself, so it is * the ONLY reentrant function that doesn't take the scanner as the last argument. * That's why we explicitly handle the declaration, instead of using our macros. */ -int yylex_init(yyscan_t* ptr_yy_globals) + +int core_yylex_init(yyscan_t* ptr_yy_globals) + { if (ptr_yy_globals == NULL){ errno = EINVAL; return 1; } - *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); + *ptr_yy_globals = (yyscan_t) core_yyalloc ( sizeof( struct yyguts_t ), NULL ); if (*ptr_yy_globals == NULL){ errno = ENOMEM; @@ -3666,37 +3432,39 @@ int yylex_init(yyscan_t* ptr_yy_globals) return yy_init_globals ( *ptr_yy_globals ); } -/* yylex_init_extra has the same functionality as yylex_init, but follows the +/* core_yylex_init_extra has the same functionality as core_yylex_init, but follows the * convention of taking the scanner as the last argument. Note however, that * this is a *pointer* to a scanner, as it will be allocated by this call (and * is the reason, too, why this function also must handle its own declaration). - * The user defined value in the first argument will be available to yyalloc in + * The user defined value in the first argument will be available to core_yyalloc in * the yyextra field. */ -int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals ) + +int core_yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals ) + { struct yyguts_t dummy_yyguts; - yyset_extra (yy_user_defined, &dummy_yyguts); + core_yyset_extra (yy_user_defined, &dummy_yyguts); if (ptr_yy_globals == NULL){ errno = EINVAL; return 1; } - - *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); - + + *ptr_yy_globals = (yyscan_t) core_yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); + if (*ptr_yy_globals == NULL){ errno = ENOMEM; return 1; } - + /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); - - yyset_extra (yy_user_defined, *ptr_yy_globals); - + + core_yyset_extra (yy_user_defined, *ptr_yy_globals); + return yy_init_globals ( *ptr_yy_globals ); } @@ -3704,13 +3472,13 @@ static int yy_init_globals (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* Initialization is the same as for the non-reentrant scanner. - * This function is called from yylex_destroy(), so don't allocate here. + * This function is called from core_yylex_destroy(), so don't allocate here. */ - yyg->yy_buffer_stack = NULL; + yyg->yy_buffer_stack = 0; yyg->yy_buffer_stack_top = 0; yyg->yy_buffer_stack_max = 0; - yyg->yy_c_buf_p = NULL; + yyg->yy_c_buf_p = (char *) 0; yyg->yy_init = 0; yyg->yy_start = 0; @@ -3719,46 +3487,41 @@ static int yy_init_globals (yyscan_t yyscanner) yyg->yy_start_stack = NULL; /* Defined in main.c */ -#ifdef YY_STDINIT - yyin = stdin; - yyout = stdout; -#else - yyin = NULL; - yyout = NULL; -#endif + yyin = (FILE *) 0; + yyout = (FILE *) 0; /* For future reference: Set errno on error, since we are called by - * yylex_init() + * core_yylex_init() */ return 0; } -/* yylex_destroy is for both reentrant and non-reentrant scanners. */ -int yylex_destroy (yyscan_t yyscanner) +/* core_yylex_destroy is for both reentrant and non-reentrant scanners. */ +int core_yylex_destroy (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ - yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner ); + core_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner ); YY_CURRENT_BUFFER_LVALUE = NULL; - yypop_buffer_state(yyscanner); + core_yypop_buffer_state(yyscanner); } /* Destroy the stack itself. */ - yyfree(yyg->yy_buffer_stack , yyscanner); + core_yyfree(yyg->yy_buffer_stack ,yyscanner); yyg->yy_buffer_stack = NULL; /* Destroy the start condition stack. */ - yyfree( yyg->yy_start_stack , yyscanner ); + core_yyfree(yyg->yy_start_stack ,yyscanner ); yyg->yy_start_stack = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time - * yylex() is called, initialization will occur. */ + * core_yylex() is called, initialization will occur. */ yy_init_globals( yyscanner); /* Destroy the main struct (reentrant only). */ - yyfree ( yyscanner , yyscanner ); + core_yyfree ( yyscanner , yyscanner ); yyscanner = NULL; return 0; } @@ -3768,11 +3531,8 @@ int yylex_destroy (yyscan_t yyscanner) */ #ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner) +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner) { - struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; - (void)yyg; - int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; @@ -3780,7 +3540,7 @@ static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscann #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen (const char * s , yyscan_t yyscanner) +static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner) { int n; for ( n = 0; s[n]; ++n ) @@ -3795,10 +3555,11 @@ static int yy_flex_strlen (const char * s , yyscan_t yyscanner) #line 1089 "third_party/libpg_query/scan.l" + /* LCOV_EXCL_STOP */ /* - * Arrange access to yyextra for subroutines of the main yylex() function. + * Arrange access to yyextra for subroutines of the main core_yylex() function. * We expect each subroutine to have a yyscanner parameter. Rather than * use the yyget_xxx functions, which might or might not get inlined by the * compiler, we cheat just a bit and cast yyscanner to the right type. @@ -3843,7 +3604,7 @@ scanner_errposition(int location, core_yyscan_t yyscanner) * Report a lexer or grammar error. * * The message's cursor position is whatever YYLLOC was last set to, - * ie, the start of the current token if called within yylex(), or the + * ie, the start of the current token if called within core_yylex(), or the * most recently lexed token if called from the grammar. * This is OK for syntax error messages from the Bison parser, because Bison * parsers report error as soon as the first unparsable token is reached. @@ -3886,8 +3647,8 @@ scanner_init(const char *str, PGSize slen = strlen(str); yyscan_t scanner; - if (yylex_init(&scanner) != 0) - elog(ERROR, "yylex_init() failed: %m"); + if (core_yylex_init(&scanner) != 0) + elog(ERROR, "core_yylex_init() failed: %m"); core_yyset_extra(yyext, scanner); @@ -3905,7 +3666,7 @@ scanner_init(const char *str, yyext->scanbuflen = slen; memcpy(yyext->scanbuf, str, slen); yyext->scanbuf[slen] = yyext->scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR; - yy_scan_buffer(yyext->scanbuf, slen + 2, scanner); + core_yy_scan_buffer(yyext->scanbuf,slen + 2,scanner); /* initialize literal buffer to a reasonable but expansible size */ yyext->literalalloc = 1024; @@ -3923,7 +3684,7 @@ void scanner_finish(core_yyscan_t yyscanner) { /* - * We don't bother to call yylex_destroy(), because all it would do is + * We don't bother to call core_yylex_destroy(), because all it would do is * pfree a small amount of control storage. It's cheaper to leak the * storage until the parsing context is destroyed. The amount of space * involved is usually negligible compared to the output parse tree diff --git a/src/duckdb/third_party/lz4/lz4.cpp b/src/duckdb/third_party/lz4/lz4.cpp new file mode 100644 index 00000000..b6237ae9 --- /dev/null +++ b/src/duckdb/third_party/lz4/lz4.cpp @@ -0,0 +1,2605 @@ +/* + LZ4 - Fast LZ compression algorithm + Copyright (C) 2011-2020, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 homepage : http://www.lz4.org + - LZ4 source repository : https://github.com/lz4/lz4 +*/ + +/*-************************************ +* Tuning parameters +**************************************/ +/* + * LZ4_HEAPMODE : + * Select how default compression functions will allocate memory for their hash table, + * in memory stack (0:default, fastest), or in memory heap (1:requires malloc()). + */ +#ifndef LZ4_HEAPMODE +# define LZ4_HEAPMODE 0 +#endif + +/* + * LZ4_ACCELERATION_DEFAULT : + * Select "acceleration" for LZ4_compress_fast() when parameter value <= 0 + */ +#define LZ4_ACCELERATION_DEFAULT 1 +/* + * LZ4_ACCELERATION_MAX : + * Any "acceleration" value higher than this threshold + * get treated as LZ4_ACCELERATION_MAX instead (fix #876) + */ +#define LZ4_ACCELERATION_MAX 65537 + + +/*-************************************ +* CPU Feature Detection +**************************************/ +/* LZ4_FORCE_MEMORY_ACCESS + * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. + * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. + * The below switch allow to select different access method for improved performance. + * Method 0 (default) : use `memcpy()`. Safe and portable. + * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). + * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. + * Method 2 : direct access. This method is portable but violate C standard. + * It can generate buggy code on targets which assembly generation depends on alignment. + * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) + * See https://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. + * Prefer these methods in priority order (0 > 1 > 2) + */ +#ifndef LZ4_FORCE_MEMORY_ACCESS /* can be defined externally */ +# if defined(__GNUC__) && \ + ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) \ + || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) +# define LZ4_FORCE_MEMORY_ACCESS 2 +# elif (defined(__INTEL_COMPILER) && !defined(_WIN32)) || defined(__GNUC__) +# define LZ4_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +/* + * LZ4_FORCE_SW_BITCOUNT + * Define this parameter if your target system or compiler does not support hardware bit count + */ +#if defined(_MSC_VER) && defined(_WIN32_WCE) /* Visual Studio for WinCE doesn't support Hardware bit count */ +# undef LZ4_FORCE_SW_BITCOUNT /* avoid double def */ +# define LZ4_FORCE_SW_BITCOUNT +#endif + + + +/*-************************************ +* Dependency +**************************************/ +/* + * LZ4_SRC_INCLUDED: + * Amalgamation flag, whether lz4.c is included + */ +#ifndef LZ4_SRC_INCLUDED +# define LZ4_SRC_INCLUDED 1 +#endif + +#ifndef LZ4_STATIC_LINKING_ONLY +#define LZ4_STATIC_LINKING_ONLY +#endif + +#ifndef LZ4_DISABLE_DEPRECATE_WARNINGS +#define LZ4_DISABLE_DEPRECATE_WARNINGS /* due to LZ4_decompress_safe_withPrefix64k */ +#endif + +#define LZ4_STATIC_LINKING_ONLY /* LZ4_DISTANCE_MAX */ +#include + +#include "lz4.hpp" +/* see also "memory routines" below */ + + +/*-************************************ +* Compiler Options +**************************************/ + +#define LZ4_FORCE_INLINE static +#define LZ4_FORCE_O2 + +#if (defined(__GNUC__) && (__GNUC__ >= 3)) || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) || defined(__clang__) +# define expect(expr,value) (__builtin_expect ((expr),(value)) ) +#else +# define expect(expr,value) (expr) +#endif + +#ifndef likely +#define likely(expr) expect((expr) != 0, 1) +#endif +#ifndef unlikely +#define unlikely(expr) expect((expr) != 0, 0) +#endif + +/* Should the alignment test prove unreliable, for some reason, + * it can be disabled by setting LZ4_ALIGN_TEST to 0 */ +#ifndef LZ4_ALIGN_TEST /* can be externally provided */ +# define LZ4_ALIGN_TEST 1 +#endif + +namespace duckdb_lz4 { +/*-************************************ +* Memory routines +**************************************/ + +/*! LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION : + * Disable relatively high-level LZ4/HC functions that use dynamic memory + * allocation functions (malloc(), calloc(), free()). + * + * Note that this is a compile-time switch. And since it disables + * public/stable LZ4 v1 API functions, we don't recommend using this + * symbol to generate a library for distribution. + * + * The following public functions are removed when this symbol is defined. + * - lz4 : LZ4_createStream, LZ4_freeStream, + * LZ4_createStreamDecode, LZ4_freeStreamDecode, LZ4_create (deprecated) + * - lz4hc : LZ4_createStreamHC, LZ4_freeStreamHC, + * LZ4_createHC (deprecated), LZ4_freeHC (deprecated) + * - lz4frame, lz4file : All LZ4F_* functions + */ +#if defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +# define ALLOC(s) lz4_error_memory_allocation_is_disabled +# define ALLOC_AND_ZERO(s) lz4_error_memory_allocation_is_disabled +# define FREEMEM(p) lz4_error_memory_allocation_is_disabled +#elif defined(LZ4_USER_MEMORY_FUNCTIONS) +/* memory management functions can be customized by user project. + * Below functions must exist somewhere in the Project + * and be available at link time */ +void* LZ4_malloc(size_t s); +void* LZ4_calloc(size_t n, size_t s); +void LZ4_free(void* p); +# define ALLOC(s) LZ4_malloc(s) +# define ALLOC_AND_ZERO(s) LZ4_calloc(1,s) +# define FREEMEM(p) LZ4_free(p) +#else +# include /* malloc, calloc, free */ +# define ALLOC(s) malloc(s) +# define ALLOC_AND_ZERO(s) calloc(1,s) +# define FREEMEM(p) free(p) +#endif + +#if ! LZ4_FREESTANDING +# include /* memset, memcpy */ +#endif +#if !defined(LZ4_memset) +# define LZ4_memset(p,v,s) memset((p),(v),(s)) +#endif +#define MEM_INIT(p,v,s) LZ4_memset((p),(v),(s)) + + +/*-************************************ +* Common Constants +**************************************/ +#define MINMATCH 4 + +#define WILDCOPYLENGTH 8 +#define LASTLITERALS 5 /* see ../doc/lz4_Block_format.md#parsing-restrictions */ +#define MFLIMIT 12 /* see ../doc/lz4_Block_format.md#parsing-restrictions */ +#define MATCH_SAFEGUARD_DISTANCE ((2*WILDCOPYLENGTH) - MINMATCH) /* ensure it's possible to write 2 x wildcopyLength without overflowing output buffer */ +#define FASTLOOP_SAFE_DISTANCE 64 +static const int LZ4_minLength = (MFLIMIT+1); + +#define KB *(1 <<10) +#define MB *(1 <<20) +#define GB *(1U<<30) + +#define LZ4_DISTANCE_ABSOLUTE_MAX 65535 +#if (LZ4_DISTANCE_MAX > LZ4_DISTANCE_ABSOLUTE_MAX) /* max supported by LZ4 format */ +# error "LZ4_DISTANCE_MAX is too big : must be <= 65535" +#endif + +#define ML_BITS 4 +#define ML_MASK ((1U<=1) +# include +#else +# ifndef assert +# define assert(condition) ((void)0) +# endif +#endif + +#define LZ4_STATIC_ASSERT(c) { enum { LZ4_static_assert = 1/(int)(!!(c)) }; } /* use after variable declarations */ + +#if defined(LZ4_DEBUG) && (LZ4_DEBUG>=2) +# include + static int g_debuglog_enable = 1; +# define DEBUGLOG(l, ...) { \ + if ((g_debuglog_enable) && (l<=LZ4_DEBUG)) { \ + fprintf(stderr, __FILE__ ": "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " \n"); \ + } } +#else +# define DEBUGLOG(l, ...) {} /* disabled */ +#endif + +static int LZ4_isAligned(const void* ptr, size_t alignment) +{ + return ((size_t)ptr & (alignment -1)) == 0; +} + + +/*-************************************ +* Types +**************************************/ +#include +#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# include + typedef uint8_t BYTE; + typedef uint16_t U16; + typedef uint32_t U32; + typedef int32_t S32; + typedef uint64_t U64; + typedef uintptr_t uptrval; +#else +# if UINT_MAX != 4294967295UL +# error "LZ4 code (when not C++ or C99) assumes that sizeof(int) == 4" +# endif + typedef unsigned char BYTE; + typedef unsigned short U16; + typedef unsigned int U32; + typedef signed int S32; + typedef unsigned long long U64; + typedef size_t uptrval; /* generally true, except OpenVMS-64 */ +#endif + +#if defined(__x86_64__) + typedef U64 reg_t; /* 64-bits in x32 mode */ +#else + typedef size_t reg_t; /* 32-bits in x32 mode */ +#endif + +typedef enum { + notLimited = 0, + limitedOutput = 1, + fillOutput = 2 +} limitedOutput_directive; + + +/*-************************************ +* Reading and writing into memory +**************************************/ + +/** + * LZ4 relies on memcpy with a constant size being inlined. In freestanding + * environments, the compiler can't assume the implementation of memcpy() is + * standard compliant, so it can't apply its specialized memcpy() inlining + * logic. When possible, use __builtin_memcpy() to tell the compiler to analyze + * memcpy() as if it were standard compliant, so it can inline it in freestanding + * environments. This is needed when decompressing the Linux Kernel, for example. + */ +#if !defined(LZ4_memcpy) +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4_memcpy(dst, src, size) __builtin_memcpy(dst, src, size) +# else +# define LZ4_memcpy(dst, src, size) memcpy(dst, src, size) +# endif +#endif + +#if !defined(LZ4_memmove) +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4_memmove __builtin_memmove +# else +# define LZ4_memmove memmove +# endif +#endif + +static unsigned LZ4_isLittleEndian(void) +{ + const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ + return one.c[0]; +} + + +#if defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==2) +/* lie to the compiler about data alignment; use with caution */ + +static U16 LZ4_read16(const void* memPtr) { return *(const U16*) memPtr; } +static U32 LZ4_read32(const void* memPtr) { return *(const U32*) memPtr; } +static reg_t LZ4_read_ARCH(const void* memPtr) { return *(const reg_t*) memPtr; } + +static void LZ4_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } +static void LZ4_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; } + +#elif defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==1) + +/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ +/* currently only defined for gcc and icc */ +typedef union { U16 u16; U32 u32; reg_t uArch; } __attribute__((packed)) LZ4_unalign; + +static U16 LZ4_read16(const void* ptr) { return ((const LZ4_unalign*)ptr)->u16; } +static U32 LZ4_read32(const void* ptr) { return ((const LZ4_unalign*)ptr)->u32; } +static reg_t LZ4_read_ARCH(const void* ptr) { return ((const LZ4_unalign*)ptr)->uArch; } + +static void LZ4_write16(void* memPtr, U16 value) { ((LZ4_unalign*)memPtr)->u16 = value; } +static void LZ4_write32(void* memPtr, U32 value) { ((LZ4_unalign*)memPtr)->u32 = value; } + +#else /* safe and portable access using memcpy() */ + +static U16 LZ4_read16(const void* memPtr) +{ + U16 val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; +} + +static U32 LZ4_read32(const void* memPtr) +{ + U32 val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; +} + +static reg_t LZ4_read_ARCH(const void* memPtr) +{ + reg_t val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; +} + +static void LZ4_write16(void* memPtr, U16 value) +{ + LZ4_memcpy(memPtr, &value, sizeof(value)); +} + +static void LZ4_write32(void* memPtr, U32 value) +{ + LZ4_memcpy(memPtr, &value, sizeof(value)); +} + +#endif /* LZ4_FORCE_MEMORY_ACCESS */ + + +static U16 LZ4_readLE16(const void* memPtr) +{ + if (LZ4_isLittleEndian()) { + return LZ4_read16(memPtr); + } else { + const BYTE* p = (const BYTE*)memPtr; + return (U16)((U16)p[0] + (p[1]<<8)); + } +} + +static void LZ4_writeLE16(void* memPtr, U16 value) +{ + if (LZ4_isLittleEndian()) { + LZ4_write16(memPtr, value); + } else { + BYTE* p = (BYTE*)memPtr; + p[0] = (BYTE) value; + p[1] = (BYTE)(value>>8); + } +} + +/* customized variant of memcpy, which can overwrite up to 8 bytes beyond dstEnd */ +LZ4_FORCE_INLINE +void LZ4_wildCopy8(void* dstPtr, const void* srcPtr, void* dstEnd) +{ + BYTE* d = (BYTE*)dstPtr; + const BYTE* s = (const BYTE*)srcPtr; + BYTE* const e = (BYTE*)dstEnd; + + do { LZ4_memcpy(d,s,8); d+=8; s+=8; } while (d= 16. */ +LZ4_FORCE_INLINE void +LZ4_wildCopy32(void* dstPtr, const void* srcPtr, void* dstEnd) +{ + BYTE* d = (BYTE*)dstPtr; + const BYTE* s = (const BYTE*)srcPtr; + BYTE* const e = (BYTE*)dstEnd; + + do { LZ4_memcpy(d,s,16); LZ4_memcpy(d+16,s+16,16); d+=32; s+=32; } while (d= dstPtr + MINMATCH + * - there is at least 8 bytes available to write after dstEnd */ +LZ4_FORCE_INLINE void +LZ4_memcpy_using_offset(BYTE* dstPtr, const BYTE* srcPtr, BYTE* dstEnd, const size_t offset) +{ + BYTE v[8]; + + assert(dstEnd >= dstPtr + MINMATCH); + + switch(offset) { + case 1: + MEM_INIT(v, *srcPtr, 8); + break; + case 2: + LZ4_memcpy(v, srcPtr, 2); + LZ4_memcpy(&v[2], srcPtr, 2); +#if defined(_MSC_VER) && (_MSC_VER <= 1933) /* MSVC 2022 ver 17.3 or earlier */ +# pragma warning(push) +# pragma warning(disable : 6385) /* warning C6385: Reading invalid data from 'v'. */ +#endif + LZ4_memcpy(&v[4], v, 4); +#if defined(_MSC_VER) && (_MSC_VER <= 1933) /* MSVC 2022 ver 17.3 or earlier */ +# pragma warning(pop) +#endif + break; + case 4: + LZ4_memcpy(v, srcPtr, 4); + LZ4_memcpy(&v[4], srcPtr, 4); + break; + default: + LZ4_memcpy_using_offset_base(dstPtr, srcPtr, dstEnd, offset); + return; + } + + LZ4_memcpy(dstPtr, v, 8); + dstPtr += 8; + while (dstPtr < dstEnd) { + LZ4_memcpy(dstPtr, v, 8); + dstPtr += 8; + } +} +#endif + + +/*-************************************ +* Common functions +**************************************/ +static unsigned LZ4_NbCommonBytes (reg_t val) +{ + assert(val != 0); + if (LZ4_isLittleEndian()) { + if (sizeof(val) == 8) { + const U64 m = 0x0101010101010101ULL; + val ^= val - 1; + return (unsigned)(((U64)((val & (m - 1)) * m)) >> 56); + } else /* 32 bits */ { + const U32 m = 0x01010101; + return (unsigned)((((val - 1) ^ val) & (m - 1)) * m) >> 24; + } + } else /* Big Endian CPU */ { + assert(false); + return 0; + } +} + + +#define STEPSIZE sizeof(reg_t) +LZ4_FORCE_INLINE +unsigned LZ4_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* pInLimit) +{ + const BYTE* const pStart = pIn; + + if (likely(pIn < pInLimit-(STEPSIZE-1))) { + reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); + if (!diff) { + pIn+=STEPSIZE; pMatch+=STEPSIZE; + } else { + return LZ4_NbCommonBytes(diff); + } } + + while (likely(pIn < pInLimit-(STEPSIZE-1))) { + reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); + if (!diff) { pIn+=STEPSIZE; pMatch+=STEPSIZE; continue; } + pIn += LZ4_NbCommonBytes(diff); + return (unsigned)(pIn - pStart); + } + + if ((STEPSIZE==8) && (pIn<(pInLimit-3)) && (LZ4_read32(pMatch) == LZ4_read32(pIn))) { pIn+=4; pMatch+=4; } + if ((pIn<(pInLimit-1)) && (LZ4_read16(pMatch) == LZ4_read16(pIn))) { pIn+=2; pMatch+=2; } + if ((pIn compression run slower on incompressible data */ + + +/*-************************************ +* Local Structures and types +**************************************/ +typedef enum { clearedTable = 0, byPtr, byU32, byU16 } tableType_t; + +/** + * This enum distinguishes several different modes of accessing previous + * content in the stream. + * + * - noDict : There is no preceding content. + * - withPrefix64k : Table entries up to ctx->dictSize before the current blob + * blob being compressed are valid and refer to the preceding + * content (of length ctx->dictSize), which is available + * contiguously preceding in memory the content currently + * being compressed. + * - usingExtDict : Like withPrefix64k, but the preceding content is somewhere + * else in memory, starting at ctx->dictionary with length + * ctx->dictSize. + * - usingDictCtx : Everything concerning the preceding content is + * in a separate context, pointed to by ctx->dictCtx. + * ctx->dictionary, ctx->dictSize, and table entries + * in the current context that refer to positions + * preceding the beginning of the current compression are + * ignored. Instead, ctx->dictCtx->dictionary and ctx->dictCtx + * ->dictSize describe the location and size of the preceding + * content, and matches are found by looking in the ctx + * ->dictCtx->hashTable. + */ +typedef enum { noDict = 0, withPrefix64k, usingExtDict, usingDictCtx } dict_directive; +typedef enum { noDictIssue = 0, dictSmall } dictIssue_directive; + + +/*-************************************ +* Local Utils +**************************************/ +int LZ4_versionNumber (void) { return LZ4_VERSION_NUMBER; } +const char* LZ4_versionString(void) { return LZ4_VERSION_STRING; } +int LZ4_compressBound(int isize) { return LZ4_COMPRESSBOUND(isize); } +int LZ4_sizeofState(void) { return sizeof(LZ4_stream_t); } + + +/*-**************************************** +* Internal Definitions, used only in Tests +*******************************************/ +//#if defined (__cplusplus) +//extern "C" { +//#endif + +int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize); + +int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, + int compressedSize, int maxOutputSize, + const void* dictStart, size_t dictSize); +int LZ4_decompress_safe_partial_forceExtDict(const char* source, char* dest, + int compressedSize, int targetOutputSize, int dstCapacity, + const void* dictStart, size_t dictSize); +//#if defined (__cplusplus) +//} +//#endif + +/*-****************************** +* Compression functions +********************************/ +LZ4_FORCE_INLINE U32 LZ4_hash4(U32 sequence, tableType_t const tableType) +{ + if (tableType == byU16) + return ((sequence * 2654435761U) >> ((MINMATCH*8)-(LZ4_HASHLOG+1))); + else + return ((sequence * 2654435761U) >> ((MINMATCH*8)-LZ4_HASHLOG)); +} + +LZ4_FORCE_INLINE U32 LZ4_hash5(U64 sequence, tableType_t const tableType) +{ + const U32 hashLog = (tableType == byU16) ? LZ4_HASHLOG+1 : LZ4_HASHLOG; + if (LZ4_isLittleEndian()) { + const U64 prime5bytes = 889523592379ULL; + return (U32)(((sequence << 24) * prime5bytes) >> (64 - hashLog)); + } else { + const U64 prime8bytes = 11400714785074694791ULL; + return (U32)(((sequence >> 24) * prime8bytes) >> (64 - hashLog)); + } +} + +LZ4_FORCE_INLINE U32 LZ4_hashPosition(const void* const p, tableType_t const tableType) +{ + if ((sizeof(reg_t)==8) && (tableType != byU16)) return LZ4_hash5(LZ4_read_ARCH(p), tableType); + return LZ4_hash4(LZ4_read32(p), tableType); +} + +LZ4_FORCE_INLINE void LZ4_clearHash(U32 h, void* tableBase, tableType_t const tableType) +{ + switch (tableType) + { + default: /* fallthrough */ + case clearedTable: { /* illegal! */ assert(0); return; } + case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = NULL; return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = 0; return; } + case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = 0; return; } + } +} + +LZ4_FORCE_INLINE void LZ4_putIndexOnHash(U32 idx, U32 h, void* tableBase, tableType_t const tableType) +{ + switch (tableType) + { + default: /* fallthrough */ + case clearedTable: /* fallthrough */ + case byPtr: { /* illegal! */ assert(0); return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = idx; return; } + case byU16: { U16* hashTable = (U16*) tableBase; assert(idx < 65536); hashTable[h] = (U16)idx; return; } + } +} + +LZ4_FORCE_INLINE void LZ4_putPositionOnHash(const BYTE* p, U32 h, + void* tableBase, tableType_t const tableType, + const BYTE* srcBase) +{ + switch (tableType) + { + case clearedTable: { /* illegal! */ assert(0); return; } + case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = p; return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = (U32)(p-srcBase); return; } + case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = (U16)(p-srcBase); return; } + } +} + +LZ4_FORCE_INLINE void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_t tableType, const BYTE* srcBase) +{ + U32 const h = LZ4_hashPosition(p, tableType); + LZ4_putPositionOnHash(p, h, tableBase, tableType, srcBase); +} + +/* LZ4_getIndexOnHash() : + * Index of match position registered in hash table. + * hash position must be calculated by using base+index, or dictBase+index. + * Assumption 1 : only valid if tableType == byU32 or byU16. + * Assumption 2 : h is presumed valid (within limits of hash table) + */ +LZ4_FORCE_INLINE U32 LZ4_getIndexOnHash(U32 h, const void* tableBase, tableType_t tableType) +{ + LZ4_STATIC_ASSERT(LZ4_MEMORY_USAGE > 2); + if (tableType == byU32) { + const U32* const hashTable = (const U32*) tableBase; + assert(h < (1U << (LZ4_MEMORY_USAGE-2))); + return hashTable[h]; + } + if (tableType == byU16) { + const U16* const hashTable = (const U16*) tableBase; + assert(h < (1U << (LZ4_MEMORY_USAGE-1))); + return hashTable[h]; + } + assert(0); return 0; /* forbidden case */ +} + +static const BYTE* LZ4_getPositionOnHash(U32 h, const void* tableBase, tableType_t tableType, const BYTE* srcBase) +{ + if (tableType == byPtr) { const BYTE* const* hashTable = (const BYTE* const*) tableBase; return hashTable[h]; } + if (tableType == byU32) { const U32* const hashTable = (const U32*) tableBase; return hashTable[h] + srcBase; } + { const U16* const hashTable = (const U16*) tableBase; return hashTable[h] + srcBase; } /* default, to ensure a return */ +} + +LZ4_FORCE_INLINE const BYTE* +LZ4_getPosition(const BYTE* p, + const void* tableBase, tableType_t tableType, + const BYTE* srcBase) +{ + U32 const h = LZ4_hashPosition(p, tableType); + return LZ4_getPositionOnHash(h, tableBase, tableType, srcBase); +} + +LZ4_FORCE_INLINE void +LZ4_prepareTable(LZ4_stream_t_internal* const cctx, + const int inputSize, + const tableType_t tableType) { + /* If the table hasn't been used, it's guaranteed to be zeroed out, and is + * therefore safe to use no matter what mode we're in. Otherwise, we figure + * out if it's safe to leave as is or whether it needs to be reset. + */ + if ((tableType_t)cctx->tableType != clearedTable) { + assert(inputSize >= 0); + if ((tableType_t)cctx->tableType != tableType + || ((tableType == byU16) && cctx->currentOffset + (unsigned)inputSize >= 0xFFFFU) + || ((tableType == byU32) && cctx->currentOffset > 1 GB) + || tableType == byPtr + || inputSize >= 4 KB) + { + DEBUGLOG(4, "LZ4_prepareTable: Resetting table in %p", cctx); + MEM_INIT(cctx->hashTable, 0, LZ4_HASHTABLESIZE); + cctx->currentOffset = 0; + cctx->tableType = (U32)clearedTable; + } else { + DEBUGLOG(4, "LZ4_prepareTable: Re-use hash table (no reset)"); + } + } + + /* Adding a gap, so all previous entries are > LZ4_DISTANCE_MAX back, + * is faster than compressing without a gap. + * However, compressing with currentOffset == 0 is faster still, + * so we preserve that case. + */ + if (cctx->currentOffset != 0 && tableType == byU32) { + DEBUGLOG(5, "LZ4_prepareTable: adding 64KB to currentOffset"); + cctx->currentOffset += 64 KB; + } + + /* Finally, clear history */ + cctx->dictCtx = NULL; + cctx->dictionary = NULL; + cctx->dictSize = 0; +} + +/** LZ4_compress_generic() : + * inlined, to ensure branches are decided at compilation time. + * Presumed already validated at this stage: + * - source != NULL + * - inputSize > 0 + */ +LZ4_FORCE_INLINE int LZ4_compress_generic_validated( + LZ4_stream_t_internal* const cctx, + const char* const source, + char* const dest, + const int inputSize, + int* inputConsumed, /* only written when outputDirective == fillOutput */ + const int maxOutputSize, + const limitedOutput_directive outputDirective, + const tableType_t tableType, + const dict_directive dictDirective, + const dictIssue_directive dictIssue, + const int acceleration) +{ + int result; + const BYTE* ip = (const BYTE*) source; + + U32 const startIndex = cctx->currentOffset; + const BYTE* base = (const BYTE*) source - startIndex; + const BYTE* lowLimit; + + const LZ4_stream_t_internal* dictCtx = (const LZ4_stream_t_internal*) cctx->dictCtx; + const BYTE* const dictionary = + dictDirective == usingDictCtx ? dictCtx->dictionary : cctx->dictionary; + const U32 dictSize = + dictDirective == usingDictCtx ? dictCtx->dictSize : cctx->dictSize; + const U32 dictDelta = (dictDirective == usingDictCtx) ? startIndex - dictCtx->currentOffset : 0; /* make indexes in dictCtx comparable with index in current context */ + + int const maybe_extMem = (dictDirective == usingExtDict) || (dictDirective == usingDictCtx); + U32 const prefixIdxLimit = startIndex - dictSize; /* used when dictDirective == dictSmall */ + const BYTE* const dictEnd = dictionary ? dictionary + dictSize : dictionary; + const BYTE* anchor = (const BYTE*) source; + const BYTE* const iend = ip + inputSize; + const BYTE* const mflimitPlusOne = iend - MFLIMIT + 1; + const BYTE* const matchlimit = iend - LASTLITERALS; + + /* the dictCtx currentOffset is indexed on the start of the dictionary, + * while a dictionary in the current context precedes the currentOffset */ + const BYTE* dictBase = (dictionary == NULL) ? NULL : + (dictDirective == usingDictCtx) ? + dictionary + dictSize - dictCtx->currentOffset : + dictionary + dictSize - startIndex; + + BYTE* op = (BYTE*) dest; + BYTE* const olimit = op + maxOutputSize; + + U32 offset = 0; + U32 forwardH; + + DEBUGLOG(5, "LZ4_compress_generic_validated: srcSize=%i, tableType=%u", inputSize, tableType); + assert(ip != NULL); + /* If init conditions are not met, we don't have to mark stream + * as having dirty context, since no action was taken yet */ + if (outputDirective == fillOutput && maxOutputSize < 1) { return 0; } /* Impossible to store anything */ + if ((tableType == byU16) && (inputSize>=LZ4_64Klimit)) { return 0; } /* Size too large (not within 64K limit) */ + if (tableType==byPtr) assert(dictDirective==noDict); /* only supported use case with byPtr */ + assert(acceleration >= 1); + + lowLimit = (const BYTE*)source - (dictDirective == withPrefix64k ? dictSize : 0); + + /* Update context state */ + if (dictDirective == usingDictCtx) { + /* Subsequent linked blocks can't use the dictionary. */ + /* Instead, they use the block we just compressed. */ + cctx->dictCtx = NULL; + cctx->dictSize = (U32)inputSize; + } else { + cctx->dictSize += (U32)inputSize; + } + cctx->currentOffset += (U32)inputSize; + cctx->tableType = (U32)tableType; + + if (inputSizehashTable, tableType, base); + ip++; forwardH = LZ4_hashPosition(ip, tableType); + + /* Main Loop */ + for ( ; ; ) { + const BYTE* match; + BYTE* token; + const BYTE* filledIp; + + /* Find a match */ + if (tableType == byPtr) { + const BYTE* forwardIp = ip; + int step = 1; + int searchMatchNb = acceleration << LZ4_skipTrigger; + do { + U32 const h = forwardH; + ip = forwardIp; + forwardIp += step; + step = (searchMatchNb++ >> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimitPlusOne)) goto _last_literals; + assert(ip < mflimitPlusOne); + + match = LZ4_getPositionOnHash(h, cctx->hashTable, tableType, base); + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putPositionOnHash(ip, h, cctx->hashTable, tableType, base); + + } while ( (match+LZ4_DISTANCE_MAX < ip) + || (LZ4_read32(match) != LZ4_read32(ip)) ); + + } else { /* byU32, byU16 */ + + const BYTE* forwardIp = ip; + int step = 1; + int searchMatchNb = acceleration << LZ4_skipTrigger; + do { + U32 const h = forwardH; + U32 const current = (U32)(forwardIp - base); + U32 matchIndex = LZ4_getIndexOnHash(h, cctx->hashTable, tableType); + assert(matchIndex <= current); + assert(forwardIp - base < (ptrdiff_t)(2 GB - 1)); + ip = forwardIp; + forwardIp += step; + step = (searchMatchNb++ >> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimitPlusOne)) goto _last_literals; + assert(ip < mflimitPlusOne); + + if (dictDirective == usingDictCtx) { + if (matchIndex < startIndex) { + /* there was no match, try the dictionary */ + assert(tableType == byU32); + matchIndex = LZ4_getIndexOnHash(h, dictCtx->hashTable, byU32); + match = dictBase + matchIndex; + matchIndex += dictDelta; /* make dictCtx index comparable with current context */ + lowLimit = dictionary; + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; + } + } else if (dictDirective == usingExtDict) { + if (matchIndex < startIndex) { + DEBUGLOG(7, "extDict candidate: matchIndex=%5u < startIndex=%5u", matchIndex, startIndex); + assert(startIndex - matchIndex >= MINMATCH); + assert(dictBase); + match = dictBase + matchIndex; + lowLimit = dictionary; + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; + } + } else { /* single continuous memory segment */ + match = base + matchIndex; + } + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType); + + DEBUGLOG(7, "candidate at pos=%u (offset=%u \n", matchIndex, current - matchIndex); + if ((dictIssue == dictSmall) && (matchIndex < prefixIdxLimit)) { continue; } /* match outside of valid area */ + assert(matchIndex < current); + if ( ((tableType != byU16) || (LZ4_DISTANCE_MAX < LZ4_DISTANCE_ABSOLUTE_MAX)) + && (matchIndex+LZ4_DISTANCE_MAX < current)) { + continue; + } /* too far */ + assert((current - matchIndex) <= LZ4_DISTANCE_MAX); /* match now expected within distance */ + + if (LZ4_read32(match) == LZ4_read32(ip)) { + if (maybe_extMem) offset = current - matchIndex; + break; /* match found */ + } + + } while(1); + } + + /* Catch up */ + filledIp = ip; + while (((ip>anchor) & (match > lowLimit)) && (unlikely(ip[-1]==match[-1]))) { ip--; match--; } + + /* Encode Literals */ + { unsigned const litLength = (unsigned)(ip - anchor); + token = op++; + if ((outputDirective == limitedOutput) && /* Check output buffer overflow */ + (unlikely(op + litLength + (2 + 1 + LASTLITERALS) + (litLength/255) > olimit)) ) { + return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ + } + if ((outputDirective == fillOutput) && + (unlikely(op + (litLength+240)/255 /* litlen */ + litLength /* literals */ + 2 /* offset */ + 1 /* token */ + MFLIMIT - MINMATCH /* min last literals so last match is <= end - MFLIMIT */ > olimit))) { + op--; + goto _last_literals; + } + if (litLength >= RUN_MASK) { + int len = (int)(litLength - RUN_MASK); + *token = (RUN_MASK<= 255 ; len-=255) *op++ = 255; + *op++ = (BYTE)len; + } + else *token = (BYTE)(litLength< olimit)) { + /* the match was too close to the end, rewind and go to last literals */ + op = token; + goto _last_literals; + } + + /* Encode Offset */ + if (maybe_extMem) { /* static test */ + DEBUGLOG(6, " with offset=%u (ext if > %i)", offset, (int)(ip - (const BYTE*)source)); + assert(offset <= LZ4_DISTANCE_MAX && offset > 0); + LZ4_writeLE16(op, (U16)offset); op+=2; + } else { + DEBUGLOG(6, " with offset=%u (same segment)", (U32)(ip - match)); + assert(ip-match <= LZ4_DISTANCE_MAX); + LZ4_writeLE16(op, (U16)(ip - match)); op+=2; + } + + /* Encode MatchLength */ + { unsigned matchCode; + + if ( (dictDirective==usingExtDict || dictDirective==usingDictCtx) + && (lowLimit==dictionary) /* match within extDict */ ) { + const BYTE* limit = ip + (dictEnd-match); + assert(dictEnd > match); + if (limit > matchlimit) limit = matchlimit; + matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, limit); + ip += (size_t)matchCode + MINMATCH; + if (ip==limit) { + unsigned const more = LZ4_count(limit, (const BYTE*)source, matchlimit); + matchCode += more; + ip += more; + } + DEBUGLOG(6, " with matchLength=%u starting in extDict", matchCode+MINMATCH); + } else { + matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, matchlimit); + ip += (size_t)matchCode + MINMATCH; + DEBUGLOG(6, " with matchLength=%u", matchCode+MINMATCH); + } + + if ((outputDirective) && /* Check output buffer overflow */ + (unlikely(op + (1 + LASTLITERALS) + (matchCode+240)/255 > olimit)) ) { + if (outputDirective == fillOutput) { + /* Match description too long : reduce it */ + U32 newMatchCode = 15 /* in token */ - 1 /* to avoid needing a zero byte */ + ((U32)(olimit - op) - 1 - LASTLITERALS) * 255; + ip -= matchCode - newMatchCode; + assert(newMatchCode < matchCode); + matchCode = newMatchCode; + if (unlikely(ip <= filledIp)) { + /* We have already filled up to filledIp so if ip ends up less than filledIp + * we have positions in the hash table beyond the current position. This is + * a problem if we reuse the hash table. So we have to remove these positions + * from the hash table. + */ + const BYTE* ptr; + DEBUGLOG(5, "Clearing %u positions", (U32)(filledIp - ip)); + for (ptr = ip; ptr <= filledIp; ++ptr) { + U32 const h = LZ4_hashPosition(ptr, tableType); + LZ4_clearHash(h, cctx->hashTable, tableType); + } + } + } else { + assert(outputDirective == limitedOutput); + return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ + } + } + if (matchCode >= ML_MASK) { + *token += ML_MASK; + matchCode -= ML_MASK; + LZ4_write32(op, 0xFFFFFFFF); + while (matchCode >= 4*255) { + op+=4; + LZ4_write32(op, 0xFFFFFFFF); + matchCode -= 4*255; + } + op += matchCode / 255; + *op++ = (BYTE)(matchCode % 255); + } else + *token += (BYTE)(matchCode); + } + /* Ensure we have enough space for the last literals. */ + assert(!(outputDirective == fillOutput && op + 1 + LASTLITERALS > olimit)); + + anchor = ip; + + /* Test end of chunk */ + if (ip >= mflimitPlusOne) break; + + /* Fill table */ + LZ4_putPosition(ip-2, cctx->hashTable, tableType, base); + + /* Test next position */ + if (tableType == byPtr) { + + match = LZ4_getPosition(ip, cctx->hashTable, tableType, base); + LZ4_putPosition(ip, cctx->hashTable, tableType, base); + if ( (match+LZ4_DISTANCE_MAX >= ip) + && (LZ4_read32(match) == LZ4_read32(ip)) ) + { token=op++; *token=0; goto _next_match; } + + } else { /* byU32, byU16 */ + + U32 const h = LZ4_hashPosition(ip, tableType); + U32 const current = (U32)(ip-base); + U32 matchIndex = LZ4_getIndexOnHash(h, cctx->hashTable, tableType); + assert(matchIndex < current); + if (dictDirective == usingDictCtx) { + if (matchIndex < startIndex) { + /* there was no match, try the dictionary */ + matchIndex = LZ4_getIndexOnHash(h, dictCtx->hashTable, byU32); + match = dictBase + matchIndex; + lowLimit = dictionary; /* required for match length counter */ + matchIndex += dictDelta; + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; /* required for match length counter */ + } + } else if (dictDirective==usingExtDict) { + if (matchIndex < startIndex) { + assert(dictBase); + match = dictBase + matchIndex; + lowLimit = dictionary; /* required for match length counter */ + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; /* required for match length counter */ + } + } else { /* single memory segment */ + match = base + matchIndex; + } + LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType); + assert(matchIndex < current); + if ( ((dictIssue==dictSmall) ? (matchIndex >= prefixIdxLimit) : 1) + && (((tableType==byU16) && (LZ4_DISTANCE_MAX == LZ4_DISTANCE_ABSOLUTE_MAX)) ? 1 : (matchIndex+LZ4_DISTANCE_MAX >= current)) + && (LZ4_read32(match) == LZ4_read32(ip)) ) { + token=op++; + *token=0; + if (maybe_extMem) offset = current - matchIndex; + DEBUGLOG(6, "seq.start:%i, literals=%u, match.start:%i", + (int)(anchor-(const BYTE*)source), 0, (int)(ip-(const BYTE*)source)); + goto _next_match; + } + } + + /* Prepare next loop */ + forwardH = LZ4_hashPosition(++ip, tableType); + + } + +_last_literals: + /* Encode Last Literals */ + { size_t lastRun = (size_t)(iend - anchor); + if ( (outputDirective) && /* Check output buffer overflow */ + (op + lastRun + 1 + ((lastRun+255-RUN_MASK)/255) > olimit)) { + if (outputDirective == fillOutput) { + /* adapt lastRun to fill 'dst' */ + assert(olimit >= op); + lastRun = (size_t)(olimit-op) - 1/*token*/; + lastRun -= (lastRun + 256 - RUN_MASK) / 256; /*additional length tokens*/ + } else { + assert(outputDirective == limitedOutput); + return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ + } + } + DEBUGLOG(6, "Final literal run : %i literals", (int)lastRun); + if (lastRun >= RUN_MASK) { + size_t accumulator = lastRun - RUN_MASK; + *op++ = RUN_MASK << ML_BITS; + for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; + *op++ = (BYTE) accumulator; + } else { + *op++ = (BYTE)(lastRun< 0); + DEBUGLOG(5, "LZ4_compress_generic: compressed %i bytes into %i bytes", inputSize, result); + return result; +} + +/** LZ4_compress_generic() : + * inlined, to ensure branches are decided at compilation time; + * takes care of src == (NULL, 0) + * and forward the rest to LZ4_compress_generic_validated */ +LZ4_FORCE_INLINE int LZ4_compress_generic( + LZ4_stream_t_internal* const cctx, + const char* const src, + char* const dst, + const int srcSize, + int *inputConsumed, /* only written when outputDirective == fillOutput */ + const int dstCapacity, + const limitedOutput_directive outputDirective, + const tableType_t tableType, + const dict_directive dictDirective, + const dictIssue_directive dictIssue, + const int acceleration) +{ + DEBUGLOG(5, "LZ4_compress_generic: srcSize=%i, dstCapacity=%i", + srcSize, dstCapacity); + + if ((U32)srcSize > (U32)LZ4_MAX_INPUT_SIZE) { return 0; } /* Unsupported srcSize, too large (or negative) */ + if (srcSize == 0) { /* src == NULL supported if srcSize == 0 */ + if (outputDirective != notLimited && dstCapacity <= 0) return 0; /* no output, can't write anything */ + DEBUGLOG(5, "Generating an empty block"); + assert(outputDirective == notLimited || dstCapacity >= 1); + assert(dst != NULL); + dst[0] = 0; + if (outputDirective == fillOutput) { + assert (inputConsumed != NULL); + *inputConsumed = 0; + } + return 1; + } + assert(src != NULL); + + return LZ4_compress_generic_validated(cctx, src, dst, srcSize, + inputConsumed, /* only written into if outputDirective == fillOutput */ + dstCapacity, outputDirective, + tableType, dictDirective, dictIssue, acceleration); +} + + +int LZ4_compress_fast_extState(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ + LZ4_stream_t_internal* const ctx = & LZ4_initStream(state, sizeof(LZ4_stream_t)) -> internal_donotuse; + assert(ctx != NULL); + if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; + if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; + if (maxOutputSize >= LZ4_compressBound(inputSize)) { + if (inputSize < LZ4_64Klimit) { + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, byU16, noDict, noDictIssue, acceleration); + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); + } + } else { + if (inputSize < LZ4_64Klimit) { + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, noDict, noDictIssue, acceleration); + } + } +} + +/** + * LZ4_compress_fast_extState_fastReset() : + * A variant of LZ4_compress_fast_extState(). + * + * Using this variant avoids an expensive initialization step. It is only safe + * to call if the state buffer is known to be correctly initialized already + * (see comment in lz4.h on LZ4_resetStream_fast() for a definition of + * "correctly initialized"). + */ +int LZ4_compress_fast_extState_fastReset(void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration) +{ + LZ4_stream_t_internal* ctx = &((LZ4_stream_t*)state)->internal_donotuse; + if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; + if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; + + if (dstCapacity >= LZ4_compressBound(srcSize)) { + if (srcSize < LZ4_64Klimit) { + const tableType_t tableType = byU16; + LZ4_prepareTable(ctx, srcSize, tableType); + if (ctx->currentOffset) { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, dictSmall, acceleration); + } else { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); + } + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + LZ4_prepareTable(ctx, srcSize, tableType); + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); + } + } else { + if (srcSize < LZ4_64Klimit) { + const tableType_t tableType = byU16; + LZ4_prepareTable(ctx, srcSize, tableType); + if (ctx->currentOffset) { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, dictSmall, acceleration); + } else { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); + } + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + LZ4_prepareTable(ctx, srcSize, tableType); + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); + } + } +} + + +int LZ4_compress_fast(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ + int result; +#if (LZ4_HEAPMODE) + LZ4_stream_t* ctxPtr = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ + if (ctxPtr == NULL) return 0; +#else + LZ4_stream_t ctx; + LZ4_stream_t* const ctxPtr = &ctx; +#endif + result = LZ4_compress_fast_extState(ctxPtr, source, dest, inputSize, maxOutputSize, acceleration); + +#if (LZ4_HEAPMODE) + FREEMEM(ctxPtr); +#endif + return result; +} + + +int LZ4_compress_default(const char* src, char* dst, int srcSize, int maxOutputSize) +{ + return LZ4_compress_fast(src, dst, srcSize, maxOutputSize, 1); +} + + +/* Note!: This function leaves the stream in an unclean/broken state! + * It is not safe to subsequently use the same state with a _fastReset() or + * _continue() call without resetting it. */ +static int LZ4_compress_destSize_extState (LZ4_stream_t* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize) +{ + void* const s = LZ4_initStream(state, sizeof (*state)); + assert(s != NULL); (void)s; + + if (targetDstSize >= LZ4_compressBound(*srcSizePtr)) { /* compression success is guaranteed */ + return LZ4_compress_fast_extState(state, src, dst, *srcSizePtr, targetDstSize, 1); + } else { + if (*srcSizePtr < LZ4_64Klimit) { + return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, byU16, noDict, noDictIssue, 1); + } else { + tableType_t const addrMode = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, addrMode, noDict, noDictIssue, 1); + } } +} + + +int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize) +{ +#if (LZ4_HEAPMODE) + LZ4_stream_t* ctx = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ + if (ctx == NULL) return 0; +#else + LZ4_stream_t ctxBody; + LZ4_stream_t* ctx = &ctxBody; +#endif + + int result = LZ4_compress_destSize_extState(ctx, src, dst, srcSizePtr, targetDstSize); + +#if (LZ4_HEAPMODE) + FREEMEM(ctx); +#endif + return result; +} + + + +/*-****************************** +* Streaming functions +********************************/ + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4_stream_t* LZ4_createStream(void) +{ + LZ4_stream_t* const lz4s = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); + LZ4_STATIC_ASSERT(sizeof(LZ4_stream_t) >= sizeof(LZ4_stream_t_internal)); + DEBUGLOG(4, "LZ4_createStream %p", lz4s); + if (lz4s == NULL) return NULL; + LZ4_initStream(lz4s, sizeof(*lz4s)); + return lz4s; +} +#endif + +static size_t LZ4_stream_t_alignment(void) +{ +#if LZ4_ALIGN_TEST + typedef struct { char c; LZ4_stream_t t; } t_a; + return sizeof(t_a) - sizeof(LZ4_stream_t); +#else + return 1; /* effectively disabled */ +#endif +} + +LZ4_stream_t* LZ4_initStream (void* buffer, size_t size) +{ + DEBUGLOG(5, "LZ4_initStream"); + if (buffer == NULL) { return NULL; } + if (size < sizeof(LZ4_stream_t)) { return NULL; } + if (!LZ4_isAligned(buffer, LZ4_stream_t_alignment())) return NULL; + MEM_INIT(buffer, 0, sizeof(LZ4_stream_t_internal)); + return (LZ4_stream_t*)buffer; +} + +/* resetStream is now deprecated, + * prefer initStream() which is more general */ +void LZ4_resetStream (LZ4_stream_t* LZ4_stream) +{ + DEBUGLOG(5, "LZ4_resetStream (ctx:%p)", LZ4_stream); + MEM_INIT(LZ4_stream, 0, sizeof(LZ4_stream_t_internal)); +} + +void LZ4_resetStream_fast(LZ4_stream_t* ctx) { + LZ4_prepareTable(&(ctx->internal_donotuse), 0, byU32); +} + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +int LZ4_freeStream (LZ4_stream_t* LZ4_stream) +{ + if (!LZ4_stream) return 0; /* support free on NULL */ + DEBUGLOG(5, "LZ4_freeStream %p", LZ4_stream); + FREEMEM(LZ4_stream); + return (0); +} +#endif + + +#define HASH_UNIT sizeof(reg_t) +int LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) +{ + LZ4_stream_t_internal* dict = &LZ4_dict->internal_donotuse; + const tableType_t tableType = byU32; + const BYTE* p = (const BYTE*)dictionary; + const BYTE* const dictEnd = p + dictSize; + const BYTE* base; + + DEBUGLOG(4, "LZ4_loadDict (%i bytes from %p into %p)", dictSize, dictionary, LZ4_dict); + + /* It's necessary to reset the context, + * and not just continue it with prepareTable() + * to avoid any risk of generating overflowing matchIndex + * when compressing using this dictionary */ + LZ4_resetStream(LZ4_dict); + + /* We always increment the offset by 64 KB, since, if the dict is longer, + * we truncate it to the last 64k, and if it's shorter, we still want to + * advance by a whole window length so we can provide the guarantee that + * there are only valid offsets in the window, which allows an optimization + * in LZ4_compress_fast_continue() where it uses noDictIssue even when the + * dictionary isn't a full 64k. */ + dict->currentOffset += 64 KB; + + if (dictSize < (int)HASH_UNIT) { + return 0; + } + + if ((dictEnd - p) > 64 KB) p = dictEnd - 64 KB; + base = dictEnd - dict->currentOffset; + dict->dictionary = p; + dict->dictSize = (U32)(dictEnd - p); + dict->tableType = (U32)tableType; + + while (p <= dictEnd-HASH_UNIT) { + LZ4_putPosition(p, dict->hashTable, tableType, base); + p+=3; + } + + return (int)dict->dictSize; +} + +void LZ4_attach_dictionary(LZ4_stream_t* workingStream, const LZ4_stream_t* dictionaryStream) +{ + const LZ4_stream_t_internal* dictCtx = (dictionaryStream == NULL) ? NULL : + &(dictionaryStream->internal_donotuse); + + DEBUGLOG(4, "LZ4_attach_dictionary (%p, %p, size %u)", + workingStream, dictionaryStream, + dictCtx != NULL ? dictCtx->dictSize : 0); + + if (dictCtx != NULL) { + /* If the current offset is zero, we will never look in the + * external dictionary context, since there is no value a table + * entry can take that indicate a miss. In that case, we need + * to bump the offset to something non-zero. + */ + if (workingStream->internal_donotuse.currentOffset == 0) { + workingStream->internal_donotuse.currentOffset = 64 KB; + } + + /* Don't actually attach an empty dictionary. + */ + if (dictCtx->dictSize == 0) { + dictCtx = NULL; + } + } + workingStream->internal_donotuse.dictCtx = dictCtx; +} + + +static void LZ4_renormDictT(LZ4_stream_t_internal* LZ4_dict, int nextSize) +{ + assert(nextSize >= 0); + if (LZ4_dict->currentOffset + (unsigned)nextSize > 0x80000000) { /* potential ptrdiff_t overflow (32-bits mode) */ + /* rescale hash table */ + U32 const delta = LZ4_dict->currentOffset - 64 KB; + const BYTE* dictEnd = LZ4_dict->dictionary + LZ4_dict->dictSize; + int i; + DEBUGLOG(4, "LZ4_renormDictT"); + for (i=0; ihashTable[i] < delta) LZ4_dict->hashTable[i]=0; + else LZ4_dict->hashTable[i] -= delta; + } + LZ4_dict->currentOffset = 64 KB; + if (LZ4_dict->dictSize > 64 KB) LZ4_dict->dictSize = 64 KB; + LZ4_dict->dictionary = dictEnd - LZ4_dict->dictSize; + } +} + + +int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, + const char* source, char* dest, + int inputSize, int maxOutputSize, + int acceleration) +{ + const tableType_t tableType = byU32; + LZ4_stream_t_internal* const streamPtr = &LZ4_stream->internal_donotuse; + const char* dictEnd = streamPtr->dictSize ? (const char*)streamPtr->dictionary + streamPtr->dictSize : NULL; + + DEBUGLOG(5, "LZ4_compress_fast_continue (inputSize=%i, dictSize=%u)", inputSize, streamPtr->dictSize); + + LZ4_renormDictT(streamPtr, inputSize); /* fix index overflow */ + if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; + if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; + + /* invalidate tiny dictionaries */ + if ( (streamPtr->dictSize < 4) /* tiny dictionary : not enough for a hash */ + && (dictEnd != source) /* prefix mode */ + && (inputSize > 0) /* tolerance : don't lose history, in case next invocation would use prefix mode */ + && (streamPtr->dictCtx == NULL) /* usingDictCtx */ + ) { + DEBUGLOG(5, "LZ4_compress_fast_continue: dictSize(%u) at addr:%p is too small", streamPtr->dictSize, streamPtr->dictionary); + /* remove dictionary existence from history, to employ faster prefix mode */ + streamPtr->dictSize = 0; + streamPtr->dictionary = (const BYTE*)source; + dictEnd = source; + } + + /* Check overlapping input/dictionary space */ + { const char* const sourceEnd = source + inputSize; + if ((sourceEnd > (const char*)streamPtr->dictionary) && (sourceEnd < dictEnd)) { + streamPtr->dictSize = (U32)(dictEnd - sourceEnd); + if (streamPtr->dictSize > 64 KB) streamPtr->dictSize = 64 KB; + if (streamPtr->dictSize < 4) streamPtr->dictSize = 0; + streamPtr->dictionary = (const BYTE*)dictEnd - streamPtr->dictSize; + } + } + + /* prefix mode : source data follows dictionary */ + if (dictEnd == source) { + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) + return LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, withPrefix64k, dictSmall, acceleration); + else + return LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, withPrefix64k, noDictIssue, acceleration); + } + + /* external dictionary mode */ + { int result; + if (streamPtr->dictCtx) { + /* We depend here on the fact that dictCtx'es (produced by + * LZ4_loadDict) guarantee that their tables contain no references + * to offsets between dictCtx->currentOffset - 64 KB and + * dictCtx->currentOffset - dictCtx->dictSize. This makes it safe + * to use noDictIssue even when the dict isn't a full 64 KB. + */ + if (inputSize > 4 KB) { + /* For compressing large blobs, it is faster to pay the setup + * cost to copy the dictionary's tables into the active context, + * so that the compression loop is only looking into one table. + */ + LZ4_memcpy(streamPtr, streamPtr->dictCtx, sizeof(*streamPtr)); + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, noDictIssue, acceleration); + } else { + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingDictCtx, noDictIssue, acceleration); + } + } else { /* small data <= 4 KB */ + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) { + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, dictSmall, acceleration); + } else { + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, noDictIssue, acceleration); + } + } + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)inputSize; + return result; + } +} + + +/* Hidden debug function, to force-test external dictionary mode */ +int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize) +{ + LZ4_stream_t_internal* streamPtr = &LZ4_dict->internal_donotuse; + int result; + + LZ4_renormDictT(streamPtr, srcSize); + + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) { + result = LZ4_compress_generic(streamPtr, source, dest, srcSize, NULL, 0, notLimited, byU32, usingExtDict, dictSmall, 1); + } else { + result = LZ4_compress_generic(streamPtr, source, dest, srcSize, NULL, 0, notLimited, byU32, usingExtDict, noDictIssue, 1); + } + + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)srcSize; + + return result; +} + + +/*! LZ4_saveDict() : + * If previously compressed data block is not guaranteed to remain available at its memory location, + * save it into a safer place (char* safeBuffer). + * Note : no need to call LZ4_loadDict() afterwards, dictionary is immediately usable, + * one can therefore call LZ4_compress_fast_continue() right after. + * @return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error. + */ +int LZ4_saveDict (LZ4_stream_t* LZ4_dict, char* safeBuffer, int dictSize) +{ + LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse; + + DEBUGLOG(5, "LZ4_saveDict : dictSize=%i, safeBuffer=%p", dictSize, safeBuffer); + + if ((U32)dictSize > 64 KB) { dictSize = 64 KB; } /* useless to define a dictionary > 64 KB */ + if ((U32)dictSize > dict->dictSize) { dictSize = (int)dict->dictSize; } + + if (safeBuffer == NULL) assert(dictSize == 0); + if (dictSize > 0) { + const BYTE* const previousDictEnd = dict->dictionary + dict->dictSize; + assert(dict->dictionary); + LZ4_memmove(safeBuffer, previousDictEnd - dictSize, (size_t)dictSize); + } + + dict->dictionary = (const BYTE*)safeBuffer; + dict->dictSize = (U32)dictSize; + + return dictSize; +} + + + +/*-******************************* + * Decompression functions + ********************************/ + +typedef enum { decode_full_block = 0, partial_decode = 1 } earlyEnd_directive; + +#undef MIN +#define MIN(a,b) ( (a) < (b) ? (a) : (b) ) + + +/* variant for decompress_unsafe() + * does not know end of input + * presumes input is well formed + * note : will consume at least one byte */ +size_t read_long_length_no_check(const BYTE** pp) +{ + size_t b, l = 0; + do { b = **pp; (*pp)++; l += b; } while (b==255); + DEBUGLOG(6, "read_long_length_no_check: +length=%zu using %zu input bytes", l, l/255 + 1) + return l; +} + +/* core decoder variant for LZ4_decompress_fast*() + * for legacy support only : these entry points are deprecated. + * - Presumes input is correctly formed (no defense vs malformed inputs) + * - Does not know input size (presume input buffer is "large enough") + * - Decompress a full block (only) + * @return : nb of bytes read from input. + * Note : this variant is not optimized for speed, just for maintenance. + * the goal is to remove support of decompress_fast*() variants by v2.0 +**/ +LZ4_FORCE_INLINE int +LZ4_decompress_unsafe_generic( + const BYTE* const istart, + BYTE* const ostart, + int decompressedSize, + + size_t prefixSize, + const BYTE* const dictStart, /* only if dict==usingExtDict */ + const size_t dictSize /* note: =0 if dictStart==NULL */ + ) +{ + const BYTE* ip = istart; + BYTE* op = (BYTE*)ostart; + BYTE* const oend = ostart + decompressedSize; + const BYTE* const prefixStart = ostart - prefixSize; + + DEBUGLOG(5, "LZ4_decompress_unsafe_generic"); + if (dictStart == NULL) assert(dictSize == 0); + + while (1) { + /* start new sequence */ + unsigned token = *ip++; + + /* literals */ + { size_t ll = token >> ML_BITS; + if (ll==15) { + /* long literal length */ + ll += read_long_length_no_check(&ip); + } + if ((size_t)(oend-op) < ll) return -1; /* output buffer overflow */ + LZ4_memmove(op, ip, ll); /* support in-place decompression */ + op += ll; + ip += ll; + if ((size_t)(oend-op) < MFLIMIT) { + if (op==oend) break; /* end of block */ + DEBUGLOG(5, "invalid: literals end at distance %zi from end of block", oend-op); + /* incorrect end of block : + * last match must start at least MFLIMIT==12 bytes before end of output block */ + return -1; + } } + + /* match */ + { size_t ml = token & 15; + size_t const offset = LZ4_readLE16(ip); + ip+=2; + + if (ml==15) { + /* long literal length */ + ml += read_long_length_no_check(&ip); + } + ml += MINMATCH; + + if ((size_t)(oend-op) < ml) return -1; /* output buffer overflow */ + + { const BYTE* match = op - offset; + + /* out of range */ + if (offset > (size_t)(op - prefixStart) + dictSize) { + DEBUGLOG(6, "offset out of range"); + return -1; + } + + /* check special case : extDict */ + if (offset > (size_t)(op - prefixStart)) { + /* extDict scenario */ + const BYTE* const dictEnd = dictStart + dictSize; + const BYTE* extMatch = dictEnd - (offset - (size_t)(op-prefixStart)); + size_t const extml = (size_t)(dictEnd - extMatch); + if (extml > ml) { + /* match entirely within extDict */ + LZ4_memmove(op, extMatch, ml); + op += ml; + ml = 0; + } else { + /* match split between extDict & prefix */ + LZ4_memmove(op, extMatch, extml); + op += extml; + ml -= extml; + } + match = prefixStart; + } + + /* match copy - slow variant, supporting overlap copy */ + { size_t u; + for (u=0; u= ipmax before start of loop. Returns initial_error if so. + * @error (output) - error code. Must be set to 0 before call. +**/ +typedef size_t Rvl_t; +static const Rvl_t rvl_error = (Rvl_t)(-1); +LZ4_FORCE_INLINE Rvl_t +read_variable_length(const BYTE** ip, const BYTE* ilimit, + int initial_check) +{ + Rvl_t s, length = 0; + assert(ip != NULL); + assert(*ip != NULL); + assert(ilimit != NULL); + if (initial_check && unlikely((*ip) >= ilimit)) { /* read limit reached */ + return rvl_error; + } + do { + s = **ip; + (*ip)++; + length += s; + if (unlikely((*ip) > ilimit)) { /* read limit reached */ + return rvl_error; + } + /* accumulator overflow detection (32-bit mode only) */ + if ((sizeof(length)<8) && unlikely(length > ((Rvl_t)(-1)/2)) ) { + return rvl_error; + } + } while (s==255); + + return length; +} + +/*! LZ4_decompress_generic() : + * This generic decompression function covers all use cases. + * It shall be instantiated several times, using different sets of directives. + * Note that it is important for performance that this function really get inlined, + * in order to remove useless branches during compilation optimization. + */ +LZ4_FORCE_INLINE int +LZ4_decompress_generic( + const char* const src, + char* const dst, + int srcSize, + int outputSize, /* If endOnInput==endOnInputSize, this value is `dstCapacity` */ + + earlyEnd_directive partialDecoding, /* full, partial */ + dict_directive dict, /* noDict, withPrefix64k, usingExtDict */ + const BYTE* const lowPrefix, /* always <= dst, == dst when no prefix */ + const BYTE* const dictStart, /* only if dict==usingExtDict */ + const size_t dictSize /* note : = 0 if noDict */ + ) +{ + if ((src == NULL) || (outputSize < 0)) { return -1; } + + { const BYTE* ip = (const BYTE*) src; + const BYTE* const iend = ip + srcSize; + + BYTE* op = (BYTE*) dst; + BYTE* const oend = op + outputSize; + BYTE* cpy; + + const BYTE* const dictEnd = (dictStart == NULL) ? NULL : dictStart + dictSize; + + const int checkOffset = (dictSize < (int)(64 KB)); + + + /* Set up the "end" pointers for the shortcut. */ + const BYTE* const shortiend = iend - 14 /*maxLL*/ - 2 /*offset*/; + const BYTE* const shortoend = oend - 14 /*maxLL*/ - 18 /*maxML*/; + + const BYTE* match; + size_t offset; + unsigned token; + size_t length; + + + DEBUGLOG(5, "LZ4_decompress_generic (srcSize:%i, dstSize:%i)", srcSize, outputSize); + + /* Special cases */ + assert(lowPrefix <= op); + if (unlikely(outputSize==0)) { + /* Empty output buffer */ + if (partialDecoding) return 0; + return ((srcSize==1) && (*ip==0)) ? 0 : -1; + } + if (unlikely(srcSize==0)) { return -1; } + + /* LZ4_FAST_DEC_LOOP: + * designed for modern OoO performance cpus, + * where copying reliably 32-bytes is preferable to an unpredictable branch. + * note : fast loop may show a regression for some client arm chips. */ +#if LZ4_FAST_DEC_LOOP + if ((oend - op) < FASTLOOP_SAFE_DISTANCE) { + DEBUGLOG(6, "skip fast decode loop"); + goto safe_decode; + } + + /* Fast loop : decode sequences as long as output < oend-FASTLOOP_SAFE_DISTANCE */ + while (1) { + /* Main fastloop assertion: We can always wildcopy FASTLOOP_SAFE_DISTANCE */ + assert(oend - op >= FASTLOOP_SAFE_DISTANCE); + assert(ip < iend); + token = *ip++; + length = token >> ML_BITS; /* literal length */ + + /* decode literal length */ + if (length == RUN_MASK) { + size_t const addl = read_variable_length(&ip, iend-RUN_MASK, 1); + if (addl == rvl_error) { goto _output_error; } + length += addl; + if (unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ + if (unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ + + /* copy literals */ + cpy = op+length; + LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); + if ((cpy>oend-32) || (ip+length>iend-32)) { goto safe_literal_copy; } + LZ4_wildCopy32(op, ip, cpy); + ip += length; op = cpy; + } else { + cpy = op+length; + DEBUGLOG(7, "copy %u bytes in a 16-bytes stripe", (unsigned)length); + /* We don't need to check oend, since we check it once for each loop below */ + if (ip > iend-(16 + 1/*max lit + offset + nextToken*/)) { goto safe_literal_copy; } + /* Literals can only be <= 14, but hope compilers optimize better when copy by a register size */ + LZ4_memcpy(op, ip, 16); + ip += length; op = cpy; + } + + /* get offset */ + offset = LZ4_readLE16(ip); ip+=2; + match = op - offset; + assert(match <= op); /* overflow check */ + + /* get matchlength */ + length = token & ML_MASK; + + if (length == ML_MASK) { + size_t const addl = read_variable_length(&ip, iend - LASTLITERALS + 1, 0); + if (addl == rvl_error) { goto _output_error; } + length += addl; + length += MINMATCH; + if (unlikely((uptrval)(op)+length<(uptrval)op)) { goto _output_error; } /* overflow detection */ + if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) { goto _output_error; } /* Error : offset outside buffers */ + if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { + goto safe_match_copy; + } + } else { + length += MINMATCH; + if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { + goto safe_match_copy; + } + + /* Fastpath check: skip LZ4_wildCopy32 when true */ + if ((dict == withPrefix64k) || (match >= lowPrefix)) { + if (offset >= 8) { + assert(match >= lowPrefix); + assert(match <= op); + assert(op + 18 <= oend); + + LZ4_memcpy(op, match, 8); + LZ4_memcpy(op+8, match+8, 8); + LZ4_memcpy(op+16, match+16, 2); + op += length; + continue; + } } } + + if (checkOffset && (unlikely(match + dictSize < lowPrefix))) { goto _output_error; } /* Error : offset outside buffers */ + /* match starting within external dictionary */ + if ((dict==usingExtDict) && (match < lowPrefix)) { + assert(dictEnd != NULL); + if (unlikely(op+length > oend-LASTLITERALS)) { + if (partialDecoding) { + DEBUGLOG(7, "partialDecoding: dictionary match, close to dstEnd"); + length = MIN(length, (size_t)(oend-op)); + } else { + goto _output_error; /* end-of-block condition violated */ + } } + + if (length <= (size_t)(lowPrefix-match)) { + /* match fits entirely within external dictionary : just copy */ + LZ4_memmove(op, dictEnd - (lowPrefix-match), length); + op += length; + } else { + /* match stretches into both external dictionary and current block */ + size_t const copySize = (size_t)(lowPrefix - match); + size_t const restSize = length - copySize; + LZ4_memcpy(op, dictEnd - copySize, copySize); + op += copySize; + if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ + BYTE* const endOfMatch = op + restSize; + const BYTE* copyFrom = lowPrefix; + while (op < endOfMatch) { *op++ = *copyFrom++; } + } else { + LZ4_memcpy(op, lowPrefix, restSize); + op += restSize; + } } + continue; + } + + /* copy match within block */ + cpy = op + length; + + assert((op <= oend) && (oend-op >= 32)); + if (unlikely(offset<16)) { + LZ4_memcpy_using_offset(op, match, cpy, offset); + } else { + LZ4_wildCopy32(op, match, cpy); + } + + op = cpy; /* wildcopy correction */ + } + safe_decode: +#endif + + /* Main Loop : decode remaining sequences where output < FASTLOOP_SAFE_DISTANCE */ + while (1) { + assert(ip < iend); + token = *ip++; + length = token >> ML_BITS; /* literal length */ + + /* A two-stage shortcut for the most common case: + * 1) If the literal length is 0..14, and there is enough space, + * enter the shortcut and copy 16 bytes on behalf of the literals + * (in the fast mode, only 8 bytes can be safely copied this way). + * 2) Further if the match length is 4..18, copy 18 bytes in a similar + * manner; but we ensure that there's enough space in the output for + * those 18 bytes earlier, upon entering the shortcut (in other words, + * there is a combined check for both stages). + */ + if ( (length != RUN_MASK) + /* strictly "less than" on input, to re-enter the loop with at least one byte */ + && likely((ip < shortiend) & (op <= shortoend)) ) { + /* Copy the literals */ + LZ4_memcpy(op, ip, 16); + op += length; ip += length; + + /* The second stage: prepare for match copying, decode full info. + * If it doesn't work out, the info won't be wasted. */ + length = token & ML_MASK; /* match length */ + offset = LZ4_readLE16(ip); ip += 2; + match = op - offset; + assert(match <= op); /* check overflow */ + + /* Do not deal with overlapping matches. */ + if ( (length != ML_MASK) + && (offset >= 8) + && (dict==withPrefix64k || match >= lowPrefix) ) { + /* Copy the match. */ + LZ4_memcpy(op + 0, match + 0, 8); + LZ4_memcpy(op + 8, match + 8, 8); + LZ4_memcpy(op +16, match +16, 2); + op += length + MINMATCH; + /* Both stages worked, load the next token. */ + continue; + } + + /* The second stage didn't work out, but the info is ready. + * Propel it right to the point of match copying. */ + goto _copy_match; + } + + /* decode literal length */ + if (length == RUN_MASK) { + size_t const addl = read_variable_length(&ip, iend-RUN_MASK, 1); + if (addl == rvl_error) { goto _output_error; } + length += addl; + if (unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ + if (unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ + } + + /* copy literals */ + cpy = op+length; +#if LZ4_FAST_DEC_LOOP + safe_literal_copy: +#endif + LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); + if ((cpy>oend-MFLIMIT) || (ip+length>iend-(2+1+LASTLITERALS))) { + /* We've either hit the input parsing restriction or the output parsing restriction. + * In the normal scenario, decoding a full block, it must be the last sequence, + * otherwise it's an error (invalid input or dimensions). + * In partialDecoding scenario, it's necessary to ensure there is no buffer overflow. + */ + if (partialDecoding) { + /* Since we are partial decoding we may be in this block because of the output parsing + * restriction, which is not valid since the output buffer is allowed to be undersized. + */ + DEBUGLOG(7, "partialDecoding: copying literals, close to input or output end") + DEBUGLOG(7, "partialDecoding: literal length = %u", (unsigned)length); + DEBUGLOG(7, "partialDecoding: remaining space in dstBuffer : %i", (int)(oend - op)); + DEBUGLOG(7, "partialDecoding: remaining space in srcBuffer : %i", (int)(iend - ip)); + /* Finishing in the middle of a literals segment, + * due to lack of input. + */ + if (ip+length > iend) { + length = (size_t)(iend-ip); + cpy = op + length; + } + /* Finishing in the middle of a literals segment, + * due to lack of output space. + */ + if (cpy > oend) { + cpy = oend; + assert(op<=oend); + length = (size_t)(oend-op); + } + } else { + /* We must be on the last sequence (or invalid) because of the parsing limitations + * so check that we exactly consume the input and don't overrun the output buffer. + */ + if ((ip+length != iend) || (cpy > oend)) { + DEBUGLOG(6, "should have been last run of literals") + DEBUGLOG(6, "ip(%p) + length(%i) = %p != iend (%p)", ip, (int)length, ip+length, iend); + DEBUGLOG(6, "or cpy(%p) > oend(%p)", cpy, oend); + goto _output_error; + } + } + LZ4_memmove(op, ip, length); /* supports overlapping memory regions, for in-place decompression scenarios */ + ip += length; + op += length; + /* Necessarily EOF when !partialDecoding. + * When partialDecoding, it is EOF if we've either + * filled the output buffer or + * can't proceed with reading an offset for following match. + */ + if (!partialDecoding || (cpy == oend) || (ip >= (iend-2))) { + break; + } + } else { + LZ4_wildCopy8(op, ip, cpy); /* can overwrite up to 8 bytes beyond cpy */ + ip += length; op = cpy; + } + + /* get offset */ + offset = LZ4_readLE16(ip); ip+=2; + match = op - offset; + + /* get matchlength */ + length = token & ML_MASK; + + _copy_match: + if (length == ML_MASK) { + size_t const addl = read_variable_length(&ip, iend - LASTLITERALS + 1, 0); + if (addl == rvl_error) { goto _output_error; } + length += addl; + if (unlikely((uptrval)(op)+length<(uptrval)op)) goto _output_error; /* overflow detection */ + } + length += MINMATCH; + +#if LZ4_FAST_DEC_LOOP + safe_match_copy: +#endif + if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) goto _output_error; /* Error : offset outside buffers */ + /* match starting within external dictionary */ + if ((dict==usingExtDict) && (match < lowPrefix)) { + assert(dictEnd != NULL); + if (unlikely(op+length > oend-LASTLITERALS)) { + if (partialDecoding) length = MIN(length, (size_t)(oend-op)); + else goto _output_error; /* doesn't respect parsing restriction */ + } + + if (length <= (size_t)(lowPrefix-match)) { + /* match fits entirely within external dictionary : just copy */ + LZ4_memmove(op, dictEnd - (lowPrefix-match), length); + op += length; + } else { + /* match stretches into both external dictionary and current block */ + size_t const copySize = (size_t)(lowPrefix - match); + size_t const restSize = length - copySize; + LZ4_memcpy(op, dictEnd - copySize, copySize); + op += copySize; + if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ + BYTE* const endOfMatch = op + restSize; + const BYTE* copyFrom = lowPrefix; + while (op < endOfMatch) *op++ = *copyFrom++; + } else { + LZ4_memcpy(op, lowPrefix, restSize); + op += restSize; + } } + continue; + } + assert(match >= lowPrefix); + + /* copy match within block */ + cpy = op + length; + + /* partialDecoding : may end anywhere within the block */ + assert(op<=oend); + if (partialDecoding && (cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { + size_t const mlen = MIN(length, (size_t)(oend-op)); + const BYTE* const matchEnd = match + mlen; + BYTE* const copyEnd = op + mlen; + if (matchEnd > op) { /* overlap copy */ + while (op < copyEnd) { *op++ = *match++; } + } else { + LZ4_memcpy(op, match, mlen); + } + op = copyEnd; + if (op == oend) { break; } + continue; + } + + if (unlikely(offset<8)) { + LZ4_write32(op, 0); /* silence msan warning when offset==0 */ + op[0] = match[0]; + op[1] = match[1]; + op[2] = match[2]; + op[3] = match[3]; + match += inc32table[offset]; + LZ4_memcpy(op+4, match, 4); + match -= dec64table[offset]; + } else { + LZ4_memcpy(op, match, 8); + match += 8; + } + op += 8; + + if (unlikely(cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { + BYTE* const oCopyLimit = oend - (WILDCOPYLENGTH-1); + if (cpy > oend-LASTLITERALS) { goto _output_error; } /* Error : last LASTLITERALS bytes must be literals (uncompressed) */ + if (op < oCopyLimit) { + LZ4_wildCopy8(op, match, oCopyLimit); + match += oCopyLimit - op; + op = oCopyLimit; + } + while (op < cpy) { *op++ = *match++; } + } else { + LZ4_memcpy(op, match, 8); + if (length > 16) { LZ4_wildCopy8(op+8, match+8, cpy); } + } + op = cpy; /* wildcopy correction */ + } + + /* end of decoding */ + DEBUGLOG(5, "decoded %i bytes", (int) (((char*)op)-dst)); + return (int) (((char*)op)-dst); /* Nb of output bytes decoded */ + + /* Overflow error detected */ + _output_error: + return (int) (-(((const char*)ip)-src))-1; + } +} + + +/*===== Instantiate the API decoding functions. =====*/ + +LZ4_FORCE_O2 +int LZ4_decompress_safe(const char* source, char* dest, int compressedSize, int maxDecompressedSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, + decode_full_block, noDict, + (BYTE*)dest, NULL, 0); +} + +LZ4_FORCE_O2 +int LZ4_decompress_safe_partial(const char* src, char* dst, int compressedSize, int targetOutputSize, int dstCapacity) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(src, dst, compressedSize, dstCapacity, + partial_decode, + noDict, (BYTE*)dst, NULL, 0); +} + +LZ4_FORCE_O2 +int LZ4_decompress_fast(const char* source, char* dest, int originalSize) +{ + DEBUGLOG(5, "LZ4_decompress_fast"); + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + 0, NULL, 0); +} + +/*===== Instantiate a few more decoding cases, used more than once. =====*/ + +LZ4_FORCE_O2 /* Exported, an obsolete API function. */ +int LZ4_decompress_safe_withPrefix64k(const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, withPrefix64k, + (BYTE*)dest - 64 KB, NULL, 0); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_safe_partial_withPrefix64k(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, + partial_decode, withPrefix64k, + (BYTE*)dest - 64 KB, NULL, 0); +} + +/* Another obsolete API function, paired with the previous one. */ +int LZ4_decompress_fast_withPrefix64k(const char* source, char* dest, int originalSize) +{ + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + 64 KB, NULL, 0); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_safe_withSmallPrefix(const char* source, char* dest, int compressedSize, int maxOutputSize, + size_t prefixSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, noDict, + (BYTE*)dest-prefixSize, NULL, 0); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_safe_partial_withSmallPrefix(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity, + size_t prefixSize) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, + partial_decode, noDict, + (BYTE*)dest-prefixSize, NULL, 0); +} + +LZ4_FORCE_O2 +int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, + int compressedSize, int maxOutputSize, + const void* dictStart, size_t dictSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, usingExtDict, + (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + +LZ4_FORCE_O2 +int LZ4_decompress_safe_partial_forceExtDict(const char* source, char* dest, + int compressedSize, int targetOutputSize, int dstCapacity, + const void* dictStart, size_t dictSize) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, + partial_decode, usingExtDict, + (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_fast_extDict(const char* source, char* dest, int originalSize, + const void* dictStart, size_t dictSize) +{ + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + 0, (const BYTE*)dictStart, dictSize); +} + +/* The "double dictionary" mode, for use with e.g. ring buffers: the first part + * of the dictionary is passed as prefix, and the second via dictStart + dictSize. + * These routines are used only once, in LZ4_decompress_*_continue(). + */ +LZ4_FORCE_INLINE +int LZ4_decompress_safe_doubleDict(const char* source, char* dest, int compressedSize, int maxOutputSize, + size_t prefixSize, const void* dictStart, size_t dictSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, usingExtDict, + (BYTE*)dest-prefixSize, (const BYTE*)dictStart, dictSize); +} + +/*===== streaming decompression functions =====*/ + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4_streamDecode_t* LZ4_createStreamDecode(void) +{ + LZ4_STATIC_ASSERT(sizeof(LZ4_streamDecode_t) >= sizeof(LZ4_streamDecode_t_internal)); + return (LZ4_streamDecode_t*) ALLOC_AND_ZERO(sizeof(LZ4_streamDecode_t)); +} + +int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream) +{ + if (LZ4_stream == NULL) { return 0; } /* support free on NULL */ + FREEMEM(LZ4_stream); + return 0; +} +#endif + +/*! LZ4_setStreamDecode() : + * Use this function to instruct where to find the dictionary. + * This function is not necessary if previous data is still available where it was decoded. + * Loading a size of 0 is allowed (same effect as no dictionary). + * @return : 1 if OK, 0 if error + */ +int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + lz4sd->prefixSize = (size_t)dictSize; + if (dictSize) { + assert(dictionary != NULL); + lz4sd->prefixEnd = (const BYTE*) dictionary + dictSize; + } else { + lz4sd->prefixEnd = (const BYTE*) dictionary; + } + lz4sd->externalDict = NULL; + lz4sd->extDictSize = 0; + return 1; +} + +/*! LZ4_decoderRingBufferSize() : + * when setting a ring buffer for streaming decompression (optional scenario), + * provides the minimum size of this ring buffer + * to be compatible with any source respecting maxBlockSize condition. + * Note : in a ring buffer scenario, + * blocks are presumed decompressed next to each other. + * When not enough space remains for next block (remainingSize < maxBlockSize), + * decoding resumes from beginning of ring buffer. + * @return : minimum ring buffer size, + * or 0 if there is an error (invalid maxBlockSize). + */ +int LZ4_decoderRingBufferSize(int maxBlockSize) +{ + if (maxBlockSize < 0) return 0; + if (maxBlockSize > LZ4_MAX_INPUT_SIZE) return 0; + if (maxBlockSize < 16) maxBlockSize = 16; + return LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize); +} + +/* +*_continue() : + These decoding functions allow decompression of multiple blocks in "streaming" mode. + Previously decoded blocks must still be available at the memory position where they were decoded. + If it's not possible, save the relevant part of decoded data into a safe buffer, + and indicate where it stands using LZ4_setStreamDecode() +*/ +LZ4_FORCE_O2 +int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + int result; + + if (lz4sd->prefixSize == 0) { + /* The first call, no dictionary yet. */ + assert(lz4sd->extDictSize == 0); + result = LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)result; + lz4sd->prefixEnd = (BYTE*)dest + result; + } else if (lz4sd->prefixEnd == (BYTE*)dest) { + /* They're rolling the current segment. */ + if (lz4sd->prefixSize >= 64 KB - 1) + result = LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); + else if (lz4sd->extDictSize == 0) + result = LZ4_decompress_safe_withSmallPrefix(source, dest, compressedSize, maxOutputSize, + lz4sd->prefixSize); + else + result = LZ4_decompress_safe_doubleDict(source, dest, compressedSize, maxOutputSize, + lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += (size_t)result; + lz4sd->prefixEnd += result; + } else { + /* The buffer wraps around, or they're switching to another buffer. */ + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; + result = LZ4_decompress_safe_forceExtDict(source, dest, compressedSize, maxOutputSize, + lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)result; + lz4sd->prefixEnd = (BYTE*)dest + result; + } + + return result; +} + +LZ4_FORCE_O2 int +LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, + const char* source, char* dest, int originalSize) +{ + LZ4_streamDecode_t_internal* const lz4sd = + (assert(LZ4_streamDecode!=NULL), &LZ4_streamDecode->internal_donotuse); + int result; + + DEBUGLOG(5, "LZ4_decompress_fast_continue (toDecodeSize=%i)", originalSize); + assert(originalSize >= 0); + + if (lz4sd->prefixSize == 0) { + DEBUGLOG(5, "first invocation : no prefix nor extDict"); + assert(lz4sd->extDictSize == 0); + result = LZ4_decompress_fast(source, dest, originalSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)originalSize; + lz4sd->prefixEnd = (BYTE*)dest + originalSize; + } else if (lz4sd->prefixEnd == (BYTE*)dest) { + DEBUGLOG(5, "continue using existing prefix"); + result = LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + lz4sd->prefixSize, + lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += (size_t)originalSize; + lz4sd->prefixEnd += originalSize; + } else { + DEBUGLOG(5, "prefix becomes extDict"); + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; + result = LZ4_decompress_fast_extDict(source, dest, originalSize, + lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)originalSize; + lz4sd->prefixEnd = (BYTE*)dest + originalSize; + } + + return result; +} + + +/* +Advanced decoding functions : +*_usingDict() : + These decoding functions work the same as "_continue" ones, + the dictionary must be explicitly provided within parameters +*/ + +int LZ4_decompress_safe_usingDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) +{ + if (dictSize==0) + return LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); + if (dictStart+dictSize == dest) { + if (dictSize >= 64 KB - 1) { + return LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_withSmallPrefix(source, dest, compressedSize, maxOutputSize, (size_t)dictSize); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_forceExtDict(source, dest, compressedSize, maxOutputSize, dictStart, (size_t)dictSize); +} + +int LZ4_decompress_safe_partial_usingDict(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity, const char* dictStart, int dictSize) +{ + if (dictSize==0) + return LZ4_decompress_safe_partial(source, dest, compressedSize, targetOutputSize, dstCapacity); + if (dictStart+dictSize == dest) { + if (dictSize >= 64 KB - 1) { + return LZ4_decompress_safe_partial_withPrefix64k(source, dest, compressedSize, targetOutputSize, dstCapacity); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_partial_withSmallPrefix(source, dest, compressedSize, targetOutputSize, dstCapacity, (size_t)dictSize); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_partial_forceExtDict(source, dest, compressedSize, targetOutputSize, dstCapacity, dictStart, (size_t)dictSize); +} + +int LZ4_decompress_fast_usingDict(const char* source, char* dest, int originalSize, const char* dictStart, int dictSize) +{ + if (dictSize==0 || dictStart+dictSize == dest) + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + (size_t)dictSize, NULL, 0); + assert(dictSize >= 0); + return LZ4_decompress_fast_extDict(source, dest, originalSize, dictStart, (size_t)dictSize); +} + + +/*=************************************************* +* Obsolete Functions +***************************************************/ +/* obsolete compression functions */ +int LZ4_compress_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize) +{ + return LZ4_compress_default(source, dest, inputSize, maxOutputSize); +} +int LZ4_compress(const char* src, char* dest, int srcSize) +{ + return LZ4_compress_default(src, dest, srcSize, LZ4_compressBound(srcSize)); +} +int LZ4_compress_limitedOutput_withState (void* state, const char* src, char* dst, int srcSize, int dstSize) +{ + return LZ4_compress_fast_extState(state, src, dst, srcSize, dstSize, 1); +} +int LZ4_compress_withState (void* state, const char* src, char* dst, int srcSize) +{ + return LZ4_compress_fast_extState(state, src, dst, srcSize, LZ4_compressBound(srcSize), 1); +} +int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_stream, const char* src, char* dst, int srcSize, int dstCapacity) +{ + return LZ4_compress_fast_continue(LZ4_stream, src, dst, srcSize, dstCapacity, 1); +} +int LZ4_compress_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize) +{ + return LZ4_compress_fast_continue(LZ4_stream, source, dest, inputSize, LZ4_compressBound(inputSize), 1); +} + +/* +These decompression functions are deprecated and should no longer be used. +They are only provided here for compatibility with older user programs. +- LZ4_uncompress is totally equivalent to LZ4_decompress_fast +- LZ4_uncompress_unknownOutputSize is totally equivalent to LZ4_decompress_safe +*/ +int LZ4_uncompress (const char* source, char* dest, int outputSize) +{ + return LZ4_decompress_fast(source, dest, outputSize); +} +int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize) +{ + return LZ4_decompress_safe(source, dest, isize, maxOutputSize); +} + +/* Obsolete Streaming functions */ + +int LZ4_sizeofStreamState(void) { return sizeof(LZ4_stream_t); } + +int LZ4_resetStreamState(void* state, char* inputBuffer) +{ + (void)inputBuffer; + LZ4_resetStream((LZ4_stream_t*)state); + return 0; +} + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +void* LZ4_create (char* inputBuffer) +{ + (void)inputBuffer; + return LZ4_createStream(); +} +#endif + +char* LZ4_slideInputBuffer (void* state) +{ + /* avoid const char * -> char * conversion warning */ + return (char *)(uptrval)((LZ4_stream_t*)state)->internal_donotuse.dictionary; +} + +#endif /* LZ4_COMMONDEFS_ONLY */ +} \ No newline at end of file diff --git a/src/duckdb/third_party/lz4/lz4.hpp b/src/duckdb/third_party/lz4/lz4.hpp new file mode 100644 index 00000000..dcf1f032 --- /dev/null +++ b/src/duckdb/third_party/lz4/lz4.hpp @@ -0,0 +1,843 @@ +/* + * LZ4 - Fast LZ compression algorithm + * Header File + * Copyright (C) 2011-2020, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 homepage : http://www.lz4.org + - LZ4 source repository : https://github.com/lz4/lz4 +*/ +//#if defined (__cplusplus) +//extern "C" { +//#endif + +#ifndef LZ4_H_2983827168210 +#define LZ4_H_2983827168210 + +/* --- Dependency --- */ +#include /* size_t */ + +namespace duckdb_lz4 { + +/** + Introduction + + LZ4 is lossless compression algorithm, providing compression speed >500 MB/s per core, + scalable with multi-cores CPU. It features an extremely fast decoder, with speed in + multiple GB/s per core, typically reaching RAM speed limits on multi-core systems. + + The LZ4 compression library provides in-memory compression and decompression functions. + It gives full buffer control to user. + Compression can be done in: + - a single step (described as Simple Functions) + - a single step, reusing a context (described in Advanced Functions) + - unbounded multiple steps (described as Streaming compression) + + lz4.h generates and decodes LZ4-compressed blocks (doc/lz4_Block_format.md). + Decompressing such a compressed block requires additional metadata. + Exact metadata depends on exact decompression function. + For the typical case of LZ4_decompress_safe(), + metadata includes block's compressed size, and maximum bound of decompressed size. + Each application is free to encode and pass such metadata in whichever way it wants. + + lz4.h only handle blocks, it can not generate Frames. + + Blocks are different from Frames (doc/lz4_Frame_format.md). + Frames bundle both blocks and metadata in a specified manner. + Embedding metadata is required for compressed data to be self-contained and portable. + Frame format is delivered through a companion API, declared in lz4frame.h. + The `lz4` CLI can only manage frames. +*/ + +/*^*************************************************************** +* Export parameters +*****************************************************************/ +/* +* LZ4_DLL_EXPORT : +* Enable exporting of functions when building a Windows DLL +* LZ4LIB_VISIBILITY : +* Control library symbols visibility. +*/ +#ifndef LZ4LIB_VISIBILITY +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4LIB_VISIBILITY __attribute__ ((visibility ("default"))) +# else +# define LZ4LIB_VISIBILITY +# endif +#endif +#if defined(LZ4_DLL_EXPORT) && (LZ4_DLL_EXPORT==1) +# define LZ4LIB_API __declspec(dllexport) LZ4LIB_VISIBILITY +#elif defined(LZ4_DLL_IMPORT) && (LZ4_DLL_IMPORT==1) +# define LZ4LIB_API __declspec(dllimport) LZ4LIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define LZ4LIB_API LZ4LIB_VISIBILITY +#endif + +/*! LZ4_FREESTANDING : + * When this macro is set to 1, it enables "freestanding mode" that is + * suitable for typical freestanding environment which doesn't support + * standard C library. + * + * - LZ4_FREESTANDING is a compile-time switch. + * - It requires the following macros to be defined: + * LZ4_memcpy, LZ4_memmove, LZ4_memset. + * - It only enables LZ4/HC functions which don't use heap. + * All LZ4F_* functions are not supported. + * - See tests/freestanding.c to check its basic setup. + */ +#if defined(LZ4_FREESTANDING) && (LZ4_FREESTANDING == 1) +# define LZ4_HEAPMODE 0 +# define LZ4HC_HEAPMODE 0 +# define LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION 1 +# if !defined(LZ4_memcpy) +# error "LZ4_FREESTANDING requires macro 'LZ4_memcpy'." +# endif +# if !defined(LZ4_memset) +# error "LZ4_FREESTANDING requires macro 'LZ4_memset'." +# endif +# if !defined(LZ4_memmove) +# error "LZ4_FREESTANDING requires macro 'LZ4_memmove'." +# endif +#elif ! defined(LZ4_FREESTANDING) +# define LZ4_FREESTANDING 0 +#endif + + +/*------ Version ------*/ +#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */ +#define LZ4_VERSION_MINOR 9 /* for new (non-breaking) interface capabilities */ +#define LZ4_VERSION_RELEASE 4 /* for tweaks, bug-fixes, or development */ + +#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE) + +#define LZ4_LIB_VERSION LZ4_VERSION_MAJOR.LZ4_VERSION_MINOR.LZ4_VERSION_RELEASE +#define LZ4_QUOTE(str) #str +#define LZ4_EXPAND_AND_QUOTE(str) LZ4_QUOTE(str) +#define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION) /* requires v1.7.3+ */ + +LZ4LIB_API int LZ4_versionNumber (void); /**< library version number; useful to check dll version; requires v1.3.0+ */ +LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; useful to check dll version; requires v1.7.5+ */ + + +/*-************************************ +* Tuning parameter +**************************************/ +#define LZ4_MEMORY_USAGE_MIN 10 +#define LZ4_MEMORY_USAGE_DEFAULT 14 +#define LZ4_MEMORY_USAGE_MAX 20 + +/*! + * LZ4_MEMORY_USAGE : + * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; ) + * Increasing memory usage improves compression ratio, at the cost of speed. + * Reduced memory usage may improve speed at the cost of ratio, thanks to better cache locality. + * Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache + */ +#ifndef LZ4_MEMORY_USAGE +# define LZ4_MEMORY_USAGE LZ4_MEMORY_USAGE_DEFAULT +#endif + +#if (LZ4_MEMORY_USAGE < LZ4_MEMORY_USAGE_MIN) +# error "LZ4_MEMORY_USAGE is too small !" +#endif + +#if (LZ4_MEMORY_USAGE > LZ4_MEMORY_USAGE_MAX) +# error "LZ4_MEMORY_USAGE is too large !" +#endif + +/*-************************************ +* Simple Functions +**************************************/ +/*! LZ4_compress_default() : + * Compresses 'srcSize' bytes from buffer 'src' + * into already allocated 'dst' buffer of size 'dstCapacity'. + * Compression is guaranteed to succeed if 'dstCapacity' >= LZ4_compressBound(srcSize). + * It also runs faster, so it's a recommended setting. + * If the function cannot compress 'src' into a more limited 'dst' budget, + * compression stops *immediately*, and the function result is zero. + * In which case, 'dst' content is undefined (invalid). + * srcSize : max supported value is LZ4_MAX_INPUT_SIZE. + * dstCapacity : size of buffer 'dst' (which must be already allocated) + * @return : the number of bytes written into buffer 'dst' (necessarily <= dstCapacity) + * or 0 if compression fails + * Note : This function is protected against buffer overflow scenarios (never writes outside 'dst' buffer, nor read outside 'source' buffer). + */ +LZ4LIB_API int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity); + +/*! LZ4_decompress_safe() : + * compressedSize : is the exact complete size of the compressed block. + * dstCapacity : is the size of destination buffer (which must be already allocated), presumed an upper bound of decompressed size. + * @return : the number of bytes decompressed into destination buffer (necessarily <= dstCapacity) + * If destination buffer is not large enough, decoding will stop and output an error code (negative value). + * If the source stream is detected malformed, the function will stop decoding and return a negative result. + * Note 1 : This function is protected against malicious data packets : + * it will never writes outside 'dst' buffer, nor read outside 'source' buffer, + * even if the compressed block is maliciously modified to order the decoder to do these actions. + * In such case, the decoder stops immediately, and considers the compressed block malformed. + * Note 2 : compressedSize and dstCapacity must be provided to the function, the compressed block does not contain them. + * The implementation is free to send / store / derive this information in whichever way is most beneficial. + * If there is a need for a different format which bundles together both compressed data and its metadata, consider looking at lz4frame.h instead. + */ +LZ4LIB_API int LZ4_decompress_safe (const char* src, char* dst, int compressedSize, int dstCapacity); + + +/*-************************************ +* Advanced Functions +**************************************/ +#define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */ +#define LZ4_COMPRESSBOUND(isize) ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16) + +/*! LZ4_compressBound() : + Provides the maximum size that LZ4 compression may output in a "worst case" scenario (input data not compressible) + This function is primarily useful for memory allocation purposes (destination buffer size). + Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example). + Note that LZ4_compress_default() compresses faster when dstCapacity is >= LZ4_compressBound(srcSize) + inputSize : max supported value is LZ4_MAX_INPUT_SIZE + return : maximum output size in a "worst case" scenario + or 0, if input size is incorrect (too large or negative) +*/ +LZ4LIB_API int LZ4_compressBound(int inputSize); + +/*! LZ4_compress_fast() : + Same as LZ4_compress_default(), but allows selection of "acceleration" factor. + The larger the acceleration value, the faster the algorithm, but also the lesser the compression. + It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed. + An acceleration value of "1" is the same as regular LZ4_compress_default() + Values <= 0 will be replaced by LZ4_ACCELERATION_DEFAULT (currently == 1, see lz4.c). + Values > LZ4_ACCELERATION_MAX will be replaced by LZ4_ACCELERATION_MAX (currently == 65537, see lz4.c). +*/ +LZ4LIB_API int LZ4_compress_fast (const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + + +/*! LZ4_compress_fast_extState() : + * Same as LZ4_compress_fast(), using an externally allocated memory space for its state. + * Use LZ4_sizeofState() to know how much memory must be allocated, + * and allocate it on 8-bytes boundaries (using `malloc()` typically). + * Then, provide this buffer as `void* state` to compression function. + */ +LZ4LIB_API int LZ4_sizeofState(void); +LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + + +/*! LZ4_compress_destSize() : + * Reverse the logic : compresses as much data as possible from 'src' buffer + * into already allocated buffer 'dst', of size >= 'targetDestSize'. + * This function either compresses the entire 'src' content into 'dst' if it's large enough, + * or fill 'dst' buffer completely with as much data as possible from 'src'. + * note: acceleration parameter is fixed to "default". + * + * *srcSizePtr : will be modified to indicate how many bytes where read from 'src' to fill 'dst'. + * New value is necessarily <= input value. + * @return : Nb bytes written into 'dst' (necessarily <= targetDestSize) + * or 0 if compression fails. + * + * Note : from v1.8.2 to v1.9.1, this function had a bug (fixed un v1.9.2+): + * the produced compressed content could, in specific circumstances, + * require to be decompressed into a destination buffer larger + * by at least 1 byte than the content to decompress. + * If an application uses `LZ4_compress_destSize()`, + * it's highly recommended to update liblz4 to v1.9.2 or better. + * If this can't be done or ensured, + * the receiving decompression function should provide + * a dstCapacity which is > decompressedSize, by at least 1 byte. + * See https://github.com/lz4/lz4/issues/859 for details + */ +LZ4LIB_API int LZ4_compress_destSize (const char* src, char* dst, int* srcSizePtr, int targetDstSize); + + +/*! LZ4_decompress_safe_partial() : + * Decompress an LZ4 compressed block, of size 'srcSize' at position 'src', + * into destination buffer 'dst' of size 'dstCapacity'. + * Up to 'targetOutputSize' bytes will be decoded. + * The function stops decoding on reaching this objective. + * This can be useful to boost performance + * whenever only the beginning of a block is required. + * + * @return : the number of bytes decoded in `dst` (necessarily <= targetOutputSize) + * If source stream is detected malformed, function returns a negative result. + * + * Note 1 : @return can be < targetOutputSize, if compressed block contains less data. + * + * Note 2 : targetOutputSize must be <= dstCapacity + * + * Note 3 : this function effectively stops decoding on reaching targetOutputSize, + * so dstCapacity is kind of redundant. + * This is because in older versions of this function, + * decoding operation would still write complete sequences. + * Therefore, there was no guarantee that it would stop writing at exactly targetOutputSize, + * it could write more bytes, though only up to dstCapacity. + * Some "margin" used to be required for this operation to work properly. + * Thankfully, this is no longer necessary. + * The function nonetheless keeps the same signature, in an effort to preserve API compatibility. + * + * Note 4 : If srcSize is the exact size of the block, + * then targetOutputSize can be any value, + * including larger than the block's decompressed size. + * The function will, at most, generate block's decompressed size. + * + * Note 5 : If srcSize is _larger_ than block's compressed size, + * then targetOutputSize **MUST** be <= block's decompressed size. + * Otherwise, *silent corruption will occur*. + */ +LZ4LIB_API int LZ4_decompress_safe_partial (const char* src, char* dst, int srcSize, int targetOutputSize, int dstCapacity); + + +/*-********************************************* +* Streaming Compression Functions +***********************************************/ +typedef union LZ4_stream_u LZ4_stream_t; /* incomplete type (defined later) */ + +/** + Note about RC_INVOKED + + - RC_INVOKED is predefined symbol of rc.exe (the resource compiler which is part of MSVC/Visual Studio). + https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros + + - Since rc.exe is a legacy compiler, it truncates long symbol (> 30 chars) + and reports warning "RC4011: identifier truncated". + + - To eliminate the warning, we surround long preprocessor symbol with + "#if !defined(RC_INVOKED) ... #endif" block that means + "skip this block when rc.exe is trying to read it". +*/ +#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */ +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4LIB_API LZ4_stream_t* LZ4_createStream(void); +LZ4LIB_API int LZ4_freeStream (LZ4_stream_t* streamPtr); +#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */ +#endif + +/*! LZ4_resetStream_fast() : v1.9.0+ + * Use this to prepare an LZ4_stream_t for a new chain of dependent blocks + * (e.g., LZ4_compress_fast_continue()). + * + * An LZ4_stream_t must be initialized once before usage. + * This is automatically done when created by LZ4_createStream(). + * However, should the LZ4_stream_t be simply declared on stack (for example), + * it's necessary to initialize it first, using LZ4_initStream(). + * + * After init, start any new stream with LZ4_resetStream_fast(). + * A same LZ4_stream_t can be re-used multiple times consecutively + * and compress multiple streams, + * provided that it starts each new stream with LZ4_resetStream_fast(). + * + * LZ4_resetStream_fast() is much faster than LZ4_initStream(), + * but is not compatible with memory regions containing garbage data. + * + * Note: it's only useful to call LZ4_resetStream_fast() + * in the context of streaming compression. + * The *extState* functions perform their own resets. + * Invoking LZ4_resetStream_fast() before is redundant, and even counterproductive. + */ +LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr); + +/*! LZ4_loadDict() : + * Use this function to reference a static dictionary into LZ4_stream_t. + * The dictionary must remain available during compression. + * LZ4_loadDict() triggers a reset, so any previous data will be forgotten. + * The same dictionary will have to be loaded on decompression side for successful decoding. + * Dictionary are useful for better compression of small data (KB range). + * While LZ4 accept any input as dictionary, + * results are generally better when using Zstandard's Dictionary Builder. + * Loading a size of 0 is allowed, and is the same as reset. + * @return : loaded dictionary size, in bytes (necessarily <= 64 KB) + */ +LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); + +/*! LZ4_compress_fast_continue() : + * Compress 'src' content using data from previously compressed blocks, for better compression ratio. + * 'dst' buffer must be already allocated. + * If dstCapacity >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster. + * + * @return : size of compressed block + * or 0 if there is an error (typically, cannot fit into 'dst'). + * + * Note 1 : Each invocation to LZ4_compress_fast_continue() generates a new block. + * Each block has precise boundaries. + * Each block must be decompressed separately, calling LZ4_decompress_*() with relevant metadata. + * It's not possible to append blocks together and expect a single invocation of LZ4_decompress_*() to decompress them together. + * + * Note 2 : The previous 64KB of source data is __assumed__ to remain present, unmodified, at same address in memory ! + * + * Note 3 : When input is structured as a double-buffer, each buffer can have any size, including < 64 KB. + * Make sure that buffers are separated, by at least one byte. + * This construction ensures that each block only depends on previous block. + * + * Note 4 : If input buffer is a ring-buffer, it can have any size, including < 64 KB. + * + * Note 5 : After an error, the stream status is undefined (invalid), it can only be reset or freed. + */ +LZ4LIB_API int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + +/*! LZ4_saveDict() : + * If last 64KB data cannot be guaranteed to remain available at its current memory location, + * save it into a safer place (char* safeBuffer). + * This is schematically equivalent to a memcpy() followed by LZ4_loadDict(), + * but is much faster, because LZ4_saveDict() doesn't need to rebuild tables. + * @return : saved dictionary size in bytes (necessarily <= maxDictSize), or 0 if error. + */ +LZ4LIB_API int LZ4_saveDict (LZ4_stream_t* streamPtr, char* safeBuffer, int maxDictSize); + + +/*-********************************************** +* Streaming Decompression Functions +* Bufferless synchronous API +************************************************/ +typedef union LZ4_streamDecode_u LZ4_streamDecode_t; /* tracking context */ + +/*! LZ4_createStreamDecode() and LZ4_freeStreamDecode() : + * creation / destruction of streaming decompression tracking context. + * A tracking context can be re-used multiple times. + */ +#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */ +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4LIB_API LZ4_streamDecode_t* LZ4_createStreamDecode(void); +LZ4LIB_API int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream); +#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */ +#endif + +/*! LZ4_setStreamDecode() : + * An LZ4_streamDecode_t context can be allocated once and re-used multiple times. + * Use this function to start decompression of a new stream of blocks. + * A dictionary can optionally be set. Use NULL or size 0 for a reset order. + * Dictionary is presumed stable : it must remain accessible and unmodified during next decompression. + * @return : 1 if OK, 0 if error + */ +LZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize); + +/*! LZ4_decoderRingBufferSize() : v1.8.2+ + * Note : in a ring buffer scenario (optional), + * blocks are presumed decompressed next to each other + * up to the moment there is not enough remaining space for next block (remainingSize < maxBlockSize), + * at which stage it resumes from beginning of ring buffer. + * When setting such a ring buffer for streaming decompression, + * provides the minimum size of this ring buffer + * to be compatible with any source respecting maxBlockSize condition. + * @return : minimum ring buffer size, + * or 0 if there is an error (invalid maxBlockSize). + */ +LZ4LIB_API int LZ4_decoderRingBufferSize(int maxBlockSize); +#define LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize) (65536 + 14 + (maxBlockSize)) /* for static allocation; maxBlockSize presumed valid */ + +/*! LZ4_decompress_*_continue() : + * These decoding functions allow decompression of consecutive blocks in "streaming" mode. + * A block is an unsplittable entity, it must be presented entirely to a decompression function. + * Decompression functions only accepts one block at a time. + * The last 64KB of previously decoded data *must* remain available and unmodified at the memory position where they were decoded. + * If less than 64KB of data has been decoded, all the data must be present. + * + * Special : if decompression side sets a ring buffer, it must respect one of the following conditions : + * - Decompression buffer size is _at least_ LZ4_decoderRingBufferSize(maxBlockSize). + * maxBlockSize is the maximum size of any single block. It can have any value > 16 bytes. + * In which case, encoding and decoding buffers do not need to be synchronized. + * Actually, data can be produced by any source compliant with LZ4 format specification, and respecting maxBlockSize. + * - Synchronized mode : + * Decompression buffer size is _exactly_ the same as compression buffer size, + * and follows exactly same update rule (block boundaries at same positions), + * and decoding function is provided with exact decompressed size of each block (exception for last block of the stream), + * _then_ decoding & encoding ring buffer can have any size, including small ones ( < 64 KB). + * - Decompression buffer is larger than encoding buffer, by a minimum of maxBlockSize more bytes. + * In which case, encoding and decoding buffers do not need to be synchronized, + * and encoding ring buffer can have any size, including small ones ( < 64 KB). + * + * Whenever these conditions are not possible, + * save the last 64KB of decoded data into a safe buffer where it can't be modified during decompression, + * then indicate where this data is saved using LZ4_setStreamDecode(), before decompressing next block. +*/ +LZ4LIB_API int +LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, + const char* src, char* dst, + int srcSize, int dstCapacity); + + +/*! LZ4_decompress_*_usingDict() : + * These decoding functions work the same as + * a combination of LZ4_setStreamDecode() followed by LZ4_decompress_*_continue() + * They are stand-alone, and don't need an LZ4_streamDecode_t structure. + * Dictionary is presumed stable : it must remain accessible and unmodified during decompression. + * Performance tip : Decompression speed can be substantially increased + * when dst == dictStart + dictSize. + */ +LZ4LIB_API int +LZ4_decompress_safe_usingDict(const char* src, char* dst, + int srcSize, int dstCapacity, + const char* dictStart, int dictSize); + +LZ4LIB_API int +LZ4_decompress_safe_partial_usingDict(const char* src, char* dst, + int compressedSize, + int targetOutputSize, int maxOutputSize, + const char* dictStart, int dictSize); + +#endif /* LZ4_H_2983827168210 */ + + +/*^************************************* + * !!!!!! STATIC LINKING ONLY !!!!!! + ***************************************/ + +/*-**************************************************************************** + * Experimental section + * + * Symbols declared in this section must be considered unstable. Their + * signatures or semantics may change, or they may be removed altogether in the + * future. They are therefore only safe to depend on when the caller is + * statically linked against the library. + * + * To protect against unsafe usage, not only are the declarations guarded, + * the definitions are hidden by default + * when building LZ4 as a shared/dynamic library. + * + * In order to access these declarations, + * define LZ4_STATIC_LINKING_ONLY in your application + * before including LZ4's headers. + * + * In order to make their implementations accessible dynamically, you must + * define LZ4_PUBLISH_STATIC_FUNCTIONS when building the LZ4 library. + ******************************************************************************/ + +#ifdef LZ4_STATIC_LINKING_ONLY + +#ifndef LZ4_STATIC_3504398509 +#define LZ4_STATIC_3504398509 + +#ifdef LZ4_PUBLISH_STATIC_FUNCTIONS +#define LZ4LIB_STATIC_API LZ4LIB_API +#else +#define LZ4LIB_STATIC_API +#endif + + +/*! LZ4_compress_fast_extState_fastReset() : + * A variant of LZ4_compress_fast_extState(). + * + * Using this variant avoids an expensive initialization step. + * It is only safe to call if the state buffer is known to be correctly initialized already + * (see above comment on LZ4_resetStream_fast() for a definition of "correctly initialized"). + * From a high level, the difference is that + * this function initializes the provided state with a call to something like LZ4_resetStream_fast() + * while LZ4_compress_fast_extState() starts with a call to LZ4_resetStream(). + */ +LZ4LIB_STATIC_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + +/*! LZ4_attach_dictionary() : + * This is an experimental API that allows + * efficient use of a static dictionary many times. + * + * Rather than re-loading the dictionary buffer into a working context before + * each compression, or copying a pre-loaded dictionary's LZ4_stream_t into a + * working LZ4_stream_t, this function introduces a no-copy setup mechanism, + * in which the working stream references the dictionary stream in-place. + * + * Several assumptions are made about the state of the dictionary stream. + * Currently, only streams which have been prepared by LZ4_loadDict() should + * be expected to work. + * + * Alternatively, the provided dictionaryStream may be NULL, + * in which case any existing dictionary stream is unset. + * + * If a dictionary is provided, it replaces any pre-existing stream history. + * The dictionary contents are the only history that can be referenced and + * logically immediately precede the data compressed in the first subsequent + * compression call. + * + * The dictionary will only remain attached to the working stream through the + * first compression call, at the end of which it is cleared. The dictionary + * stream (and source buffer) must remain in-place / accessible / unchanged + * through the completion of the first compression call on the stream. + */ +LZ4LIB_STATIC_API void +LZ4_attach_dictionary(LZ4_stream_t* workingStream, + const LZ4_stream_t* dictionaryStream); + + +/*! In-place compression and decompression + * + * It's possible to have input and output sharing the same buffer, + * for highly constrained memory environments. + * In both cases, it requires input to lay at the end of the buffer, + * and decompression to start at beginning of the buffer. + * Buffer size must feature some margin, hence be larger than final size. + * + * |<------------------------buffer--------------------------------->| + * |<-----------compressed data--------->| + * |<-----------decompressed size------------------>| + * |<----margin---->| + * + * This technique is more useful for decompression, + * since decompressed size is typically larger, + * and margin is short. + * + * In-place decompression will work inside any buffer + * which size is >= LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize). + * This presumes that decompressedSize > compressedSize. + * Otherwise, it means compression actually expanded data, + * and it would be more efficient to store such data with a flag indicating it's not compressed. + * This can happen when data is not compressible (already compressed, or encrypted). + * + * For in-place compression, margin is larger, as it must be able to cope with both + * history preservation, requiring input data to remain unmodified up to LZ4_DISTANCE_MAX, + * and data expansion, which can happen when input is not compressible. + * As a consequence, buffer size requirements are much higher, + * and memory savings offered by in-place compression are more limited. + * + * There are ways to limit this cost for compression : + * - Reduce history size, by modifying LZ4_DISTANCE_MAX. + * Note that it is a compile-time constant, so all compressions will apply this limit. + * Lower values will reduce compression ratio, except when input_size < LZ4_DISTANCE_MAX, + * so it's a reasonable trick when inputs are known to be small. + * - Require the compressor to deliver a "maximum compressed size". + * This is the `dstCapacity` parameter in `LZ4_compress*()`. + * When this size is < LZ4_COMPRESSBOUND(inputSize), then compression can fail, + * in which case, the return code will be 0 (zero). + * The caller must be ready for these cases to happen, + * and typically design a backup scheme to send data uncompressed. + * The combination of both techniques can significantly reduce + * the amount of margin required for in-place compression. + * + * In-place compression can work in any buffer + * which size is >= (maxCompressedSize) + * with maxCompressedSize == LZ4_COMPRESSBOUND(srcSize) for guaranteed compression success. + * LZ4_COMPRESS_INPLACE_BUFFER_SIZE() depends on both maxCompressedSize and LZ4_DISTANCE_MAX, + * so it's possible to reduce memory requirements by playing with them. + */ + +#define LZ4_DECOMPRESS_INPLACE_MARGIN(compressedSize) (((compressedSize) >> 8) + 32) +#define LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize) ((decompressedSize) + LZ4_DECOMPRESS_INPLACE_MARGIN(decompressedSize)) /**< note: presumes that compressedSize < decompressedSize. note2: margin is overestimated a bit, since it could use compressedSize instead */ + +#ifndef LZ4_DISTANCE_MAX /* history window size; can be user-defined at compile time */ +# define LZ4_DISTANCE_MAX 65535 /* set to maximum value by default */ +#endif + +#define LZ4_COMPRESS_INPLACE_MARGIN (LZ4_DISTANCE_MAX + 32) /* LZ4_DISTANCE_MAX can be safely replaced by srcSize when it's smaller */ +#define LZ4_COMPRESS_INPLACE_BUFFER_SIZE(maxCompressedSize) ((maxCompressedSize) + LZ4_COMPRESS_INPLACE_MARGIN) /**< maxCompressedSize is generally LZ4_COMPRESSBOUND(inputSize), but can be set to any lower value, with the risk that compression can fail (return code 0(zero)) */ + +#endif /* LZ4_STATIC_3504398509 */ +#endif /* LZ4_STATIC_LINKING_ONLY */ + + + +#ifndef LZ4_H_98237428734687 +#define LZ4_H_98237428734687 + +/*-************************************************************ + * Private Definitions + ************************************************************** + * Do not use these definitions directly. + * They are only exposed to allow static allocation of `LZ4_stream_t` and `LZ4_streamDecode_t`. + * Accessing members will expose user code to API and/or ABI break in future versions of the library. + **************************************************************/ +#define LZ4_HASHLOG (LZ4_MEMORY_USAGE-2) +#define LZ4_HASHTABLESIZE (1 << LZ4_MEMORY_USAGE) +#define LZ4_HASH_SIZE_U32 (1 << LZ4_HASHLOG) /* required as macro for static allocation */ + +#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# include + typedef int8_t LZ4_i8; + typedef uint8_t LZ4_byte; + typedef uint16_t LZ4_u16; + typedef uint32_t LZ4_u32; +#else + typedef signed char LZ4_i8; + typedef unsigned char LZ4_byte; + typedef unsigned short LZ4_u16; + typedef unsigned int LZ4_u32; +#endif + +/*! LZ4_stream_t : + * Never ever use below internal definitions directly ! + * These definitions are not API/ABI safe, and may change in future versions. + * If you need static allocation, declare or allocate an LZ4_stream_t object. +**/ + +typedef struct LZ4_stream_t_internal LZ4_stream_t_internal; +struct LZ4_stream_t_internal { + LZ4_u32 hashTable[LZ4_HASH_SIZE_U32]; + const LZ4_byte* dictionary; + const LZ4_stream_t_internal* dictCtx; + LZ4_u32 currentOffset; + LZ4_u32 tableType; + LZ4_u32 dictSize; + /* Implicit padding to ensure structure is aligned */ +}; + +#define LZ4_STREAM_MINSIZE ((1UL << LZ4_MEMORY_USAGE) + 32) /* static size, for inter-version compatibility */ +union LZ4_stream_u { + char minStateSize[LZ4_STREAM_MINSIZE]; + LZ4_stream_t_internal internal_donotuse; +}; /* previously typedef'd to LZ4_stream_t */ + + +/*! LZ4_initStream() : v1.9.0+ + * An LZ4_stream_t structure must be initialized at least once. + * This is automatically done when invoking LZ4_createStream(), + * but it's not when the structure is simply declared on stack (for example). + * + * Use LZ4_initStream() to properly initialize a newly declared LZ4_stream_t. + * It can also initialize any arbitrary buffer of sufficient size, + * and will @return a pointer of proper type upon initialization. + * + * Note : initialization fails if size and alignment conditions are not respected. + * In which case, the function will @return NULL. + * Note2: An LZ4_stream_t structure guarantees correct alignment and size. + * Note3: Before v1.9.0, use LZ4_resetStream() instead +**/ +LZ4LIB_API LZ4_stream_t* LZ4_initStream (void* buffer, size_t size); + + +/*! LZ4_streamDecode_t : + * Never ever use below internal definitions directly ! + * These definitions are not API/ABI safe, and may change in future versions. + * If you need static allocation, declare or allocate an LZ4_streamDecode_t object. +**/ +typedef struct { + const LZ4_byte* externalDict; + const LZ4_byte* prefixEnd; + size_t extDictSize; + size_t prefixSize; +} LZ4_streamDecode_t_internal; + +#define LZ4_STREAMDECODE_MINSIZE 32 +union LZ4_streamDecode_u { + char minStateSize[LZ4_STREAMDECODE_MINSIZE]; + LZ4_streamDecode_t_internal internal_donotuse; +} ; /* previously typedef'd to LZ4_streamDecode_t */ + + + +/*-************************************ +* Obsolete Functions +**************************************/ + +/*! Deprecation warnings + * + * Deprecated functions make the compiler generate a warning when invoked. + * This is meant to invite users to update their source code. + * Should deprecation warnings be a problem, it is generally possible to disable them, + * typically with -Wno-deprecated-declarations for gcc + * or _CRT_SECURE_NO_WARNINGS in Visual. + * + * Another method is to define LZ4_DISABLE_DEPRECATE_WARNINGS + * before including the header file. + */ +#ifdef LZ4_DISABLE_DEPRECATE_WARNINGS +# define LZ4_DEPRECATED(message) /* disable deprecation warnings */ +#else +# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ +# define LZ4_DEPRECATED(message) [[deprecated(message)]] +# elif defined(_MSC_VER) +# define LZ4_DEPRECATED(message) __declspec(deprecated(message)) +# elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 45)) +# define LZ4_DEPRECATED(message) __attribute__((deprecated(message))) +# elif defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 31) +# define LZ4_DEPRECATED(message) __attribute__((deprecated)) +# else +# pragma message("WARNING: LZ4_DEPRECATED needs custom implementation for this compiler") +# define LZ4_DEPRECATED(message) /* disabled */ +# endif +#endif /* LZ4_DISABLE_DEPRECATE_WARNINGS */ + +/*! Obsolete compression functions (since v1.7.3) */ +LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress (const char* src, char* dest, int srcSize); +LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress_limitedOutput (const char* src, char* dest, int srcSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize, int maxOutputSize); + +/*! Obsolete decompression functions (since v1.8.0) */ +LZ4_DEPRECATED("use LZ4_decompress_fast() instead") LZ4LIB_API int LZ4_uncompress (const char* source, char* dest, int outputSize); +LZ4_DEPRECATED("use LZ4_decompress_safe() instead") LZ4LIB_API int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize); + +/* Obsolete streaming functions (since v1.7.0) + * degraded functionality; do not use! + * + * In order to perform streaming compression, these functions depended on data + * that is no longer tracked in the state. They have been preserved as well as + * possible: using them will still produce a correct output. However, they don't + * actually retain any history between compression calls. The compression ratio + * achieved will therefore be no better than compressing each chunk + * independently. + */ +LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API void* LZ4_create (char* inputBuffer); +LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API int LZ4_sizeofStreamState(void); +LZ4_DEPRECATED("Use LZ4_resetStream() instead") LZ4LIB_API int LZ4_resetStreamState(void* state, char* inputBuffer); +LZ4_DEPRECATED("Use LZ4_saveDict() instead") LZ4LIB_API char* LZ4_slideInputBuffer (void* state); + +/*! Obsolete streaming decoding functions (since v1.7.0) */ +LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") LZ4LIB_API int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize); +LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") LZ4LIB_API int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize); + +/*! Obsolete LZ4_decompress_fast variants (since v1.9.0) : + * These functions used to be faster than LZ4_decompress_safe(), + * but this is no longer the case. They are now slower. + * This is because LZ4_decompress_fast() doesn't know the input size, + * and therefore must progress more cautiously into the input buffer to not read beyond the end of block. + * On top of that `LZ4_decompress_fast()` is not protected vs malformed or malicious inputs, making it a security liability. + * As a consequence, LZ4_decompress_fast() is strongly discouraged, and deprecated. + * + * The last remaining LZ4_decompress_fast() specificity is that + * it can decompress a block without knowing its compressed size. + * Such functionality can be achieved in a more secure manner + * by employing LZ4_decompress_safe_partial(). + * + * Parameters: + * originalSize : is the uncompressed size to regenerate. + * `dst` must be already allocated, its size must be >= 'originalSize' bytes. + * @return : number of bytes read from source buffer (== compressed size). + * The function expects to finish at block's end exactly. + * If the source stream is detected malformed, the function stops decoding and returns a negative result. + * note : LZ4_decompress_fast*() requires originalSize. Thanks to this information, it never writes past the output buffer. + * However, since it doesn't know its 'src' size, it may read an unknown amount of input, past input buffer bounds. + * Also, since match offsets are not validated, match reads from 'src' may underflow too. + * These issues never happen if input (compressed) data is correct. + * But they may happen if input data is invalid (error or intentional tampering). + * As a consequence, use these functions in trusted environments with trusted data **only**. + */ +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe() instead") +LZ4LIB_API int LZ4_decompress_fast (const char* src, char* dst, int originalSize); +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_continue() instead") +LZ4LIB_API int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int originalSize); +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_usingDict() instead") +LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int originalSize, const char* dictStart, int dictSize); + +/*! LZ4_resetStream() : + * An LZ4_stream_t structure must be initialized at least once. + * This is done with LZ4_initStream(), or LZ4_resetStream(). + * Consider switching to LZ4_initStream(), + * invoking LZ4_resetStream() will trigger deprecation warnings in the future. + */ +LZ4LIB_API void LZ4_resetStream (LZ4_stream_t* streamPtr); + + +#endif /* LZ4_H_98237428734687 */ + + +#if defined (__cplusplus) +} +#endif diff --git a/src/duckdb/third_party/parquet/parquet_types.cpp b/src/duckdb/third_party/parquet/parquet_types.cpp index 9df4b8e9..22299be3 100644 --- a/src/duckdb/third_party/parquet/parquet_types.cpp +++ b/src/duckdb/third_party/parquet/parquet_types.cpp @@ -194,6 +194,9 @@ std::ostream &operator<<(std::ostream &out, const CompressionCodec::type &val) { case CompressionCodec::ZSTD: out << "ZSTD"; return out; + case CompressionCodec::LZ4_RAW: + out << "LZ4_RAW"; + return out; // no default for compiler error on missing enum } out << static_cast(val); diff --git a/src/duckdb/third_party/parquet/parquet_types.h b/src/duckdb/third_party/parquet/parquet_types.h index 434f9db4..55bc8c0e 100644 --- a/src/duckdb/third_party/parquet/parquet_types.h +++ b/src/duckdb/third_party/parquet/parquet_types.h @@ -101,7 +101,8 @@ struct CompressionCodec { LZO = 3, BROTLI = 4, LZ4 = 5, - ZSTD = 6 + ZSTD = 6, + LZ4_RAW = 7 }; }; diff --git a/src/duckdb/third_party/re2/re2/bitmap256.cc b/src/duckdb/third_party/re2/re2/bitmap256.cc new file mode 100644 index 00000000..92d14e7c --- /dev/null +++ b/src/duckdb/third_party/re2/re2/bitmap256.cc @@ -0,0 +1,44 @@ +// Copyright 2023 The RE2 Authors. All Rights Reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "re2/bitmap256.h" + +#include + +#include "util/util.h" +#include "util/logging.h" + +namespace duckdb_re2 { + +int Bitmap256::FindNextSetBit(int c) const { + DCHECK_GE(c, 0); + DCHECK_LE(c, 255); + + // Check the word that contains the bit. Mask out any lower bits. + int i = c / 64; + uint64_t word = words_[i] & (~uint64_t{0} << (c % 64)); + if (word != 0) + return (i * 64) + FindLSBSet(word); + + // Check any following words. + i++; + switch (i) { + case 1: + if (words_[1] != 0) + return (1 * 64) + FindLSBSet(words_[1]); + FALLTHROUGH_INTENDED; + case 2: + if (words_[2] != 0) + return (2 * 64) + FindLSBSet(words_[2]); + FALLTHROUGH_INTENDED; + case 3: + if (words_[3] != 0) + return (3 * 64) + FindLSBSet(words_[3]); + FALLTHROUGH_INTENDED; + default: + return -1; + } +} + +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/bitmap256.h b/src/duckdb/third_party/re2/re2/bitmap256.h index 78e8b78e..3707090c 100644 --- a/src/duckdb/third_party/re2/re2/bitmap256.h +++ b/src/duckdb/third_party/re2/re2/bitmap256.h @@ -11,7 +11,6 @@ #include #include -#include "util/util.h" #include "util/logging.h" namespace duckdb_re2 { @@ -32,7 +31,7 @@ class Bitmap256 { DCHECK_GE(c, 0); DCHECK_LE(c, 255); - return (words_[c / 64] & (1ULL << (c % 64))) != 0; + return (words_[c / 64] & (uint64_t{1} << (c % 64))) != 0; } // Sets the bit with index c. @@ -40,7 +39,7 @@ class Bitmap256 { DCHECK_GE(c, 0); DCHECK_LE(c, 255); - words_[c / 64] |= (1ULL << (c % 64)); + words_[c / 64] |= (uint64_t{1} << (c % 64)); } // Finds the next non-zero bit with index >= c. @@ -51,7 +50,6 @@ class Bitmap256 { // Finds the least significant non-zero bit in n. static int FindLSBSet(uint64_t n) { DCHECK_NE(n, 0); - #if defined(__GNUC__) return __builtin_ctzll(n); #elif defined(_MSC_VER) && defined(_M_X64) @@ -83,36 +81,6 @@ class Bitmap256 { uint64_t words_[4]; }; -int Bitmap256::FindNextSetBit(int c) const { - DCHECK_GE(c, 0); - DCHECK_LE(c, 255); - - // Check the word that contains the bit. Mask out any lower bits. - int i = c / 64; - uint64_t word = words_[i] & (~0ULL << (c % 64)); - if (word != 0) - return (i * 64) + FindLSBSet(word); - - // Check any following words. - i++; - switch (i) { - case 1: - if (words_[1] != 0) - return (1 * 64) + FindLSBSet(words_[1]); - FALLTHROUGH_INTENDED; - case 2: - if (words_[2] != 0) - return (2 * 64) + FindLSBSet(words_[2]); - FALLTHROUGH_INTENDED; - case 3: - if (words_[3] != 0) - return (3 * 64) + FindLSBSet(words_[3]); - FALLTHROUGH_INTENDED; - default: - return -1; - } -} - -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_BITMAP256_H_ diff --git a/src/duckdb/third_party/re2/re2/bitstate.cc b/src/duckdb/third_party/re2/re2/bitstate.cc index 84a32d19..a7ef5d88 100644 --- a/src/duckdb/third_party/re2/re2/bitstate.cc +++ b/src/duckdb/third_party/re2/re2/bitstate.cc @@ -7,7 +7,7 @@ // Prog::SearchBitState is a regular expression search with submatch // tracking for small regular expressions and texts. Similarly to // testing/backtrack.cc, it allocates a bitmap with (count of -// lists) * (length of prog) bits to make sure it never explores the +// lists) * (length of text) bits to make sure it never explores the // same (instruction list, character position) multiple times. This // limits the search to run in time linear in the length of the text. // @@ -24,7 +24,7 @@ #include #include "util/logging.h" -#include "util/pod_array.h" +#include "re2/pod_array.h" #include "re2/prog.h" #include "re2/regexp.h" @@ -63,11 +63,14 @@ class BitState { int nsubmatch_; // # of submatches to fill in // Search state - static const int VisitedBits = 32; - PODArray visited_; // bitmap: (list ID, char*) pairs visited + static constexpr int kVisitedBits = 64; + PODArray visited_; // bitmap: (list ID, char*) pairs visited PODArray cap_; // capture registers PODArray job_; // stack of text positions to explore int njob_; // stack size + + BitState(const BitState&) = delete; + BitState& operator=(const BitState&) = delete; }; BitState::BitState(Prog* prog) @@ -86,10 +89,10 @@ BitState::BitState(Prog* prog) // we don't repeat the visit. bool BitState::ShouldVisit(int id, const char* p) { int n = prog_->list_heads()[id] * static_cast(text_.size()+1) + - static_cast(p-text_.begin()); - if (visited_[n/VisitedBits] & (1 << (n & (VisitedBits-1)))) + static_cast(p-text_.data()); + if (visited_[n/kVisitedBits] & (uint64_t{1} << (n & (kVisitedBits-1)))) return false; - visited_[n/VisitedBits] |= 1 << (n & (VisitedBits-1)); + visited_[n/kVisitedBits] |= uint64_t{1} << (n & (kVisitedBits-1)); return true; } @@ -134,7 +137,7 @@ void BitState::Push(int id, const char* p) { // Return whether it succeeded. bool BitState::TrySearch(int id0, const char* p0) { bool matched = false; - const char* end = text_.end(); + const char* end = text_.data() + text_.size(); njob_ = 0; // Push() no longer checks ShouldVisit(), // so we must perform the check ourselves. @@ -251,7 +254,7 @@ bool BitState::TrySearch(int id0, const char* p0) { matched = true; cap_[1] = p; if (submatch_[0].data() == NULL || - (longest_ && p > submatch_[0].end())) { + (longest_ && p > submatch_[0].data() + submatch_[0].size())) { for (int i = 0; i < nsubmatch_; i++) submatch_[i] = StringPiece(cap_[2 * i], @@ -288,11 +291,11 @@ bool BitState::Search(const StringPiece& text, const StringPiece& context, // Search parameters. text_ = text; context_ = context; - if (context_.begin() == NULL) + if (context_.data() == NULL) context_ = text; - if (prog_->anchor_start() && context_.begin() != text.begin()) + if (prog_->anchor_start() && BeginPtr(context_) != BeginPtr(text)) return false; - if (prog_->anchor_end() && context_.end() != text.end()) + if (prog_->anchor_end() && EndPtr(context_) != EndPtr(text)) return false; anchored_ = anchored || prog_->anchor_start(); longest_ = longest || prog_->anchor_end(); @@ -304,8 +307,8 @@ bool BitState::Search(const StringPiece& text, const StringPiece& context, // Allocate scratch space. int nvisited = prog_->list_count() * static_cast(text.size()+1); - nvisited = (nvisited + VisitedBits-1) / VisitedBits; - visited_ = PODArray(nvisited); + nvisited = (nvisited + kVisitedBits-1) / kVisitedBits; + visited_ = PODArray(nvisited); memset(visited_.data(), 0, nvisited*sizeof visited_[0]); int ncap = 2*nsubmatch; @@ -319,8 +322,8 @@ bool BitState::Search(const StringPiece& text, const StringPiece& context, // Anchored search must start at text.begin(). if (anchored_) { - cap_[0] = text.begin(); - return TrySearch(prog_->start(), text.begin()); + cap_[0] = text.data(); + return TrySearch(prog_->start(), text.data()); } // Unanchored search, starting from each possible text position. @@ -329,18 +332,22 @@ bool BitState::Search(const StringPiece& text, const StringPiece& context, // This looks like it's quadratic in the size of the text, // but we are not clearing visited_ between calls to TrySearch, // so no work is duplicated and it ends up still being linear. - for (const char* p = text.begin(); p <= text.end(); p++) { - // Try to use memchr to find the first byte quickly. - int fb = prog_->first_byte(); - if (fb >= 0 && p < text.end() && (p[0] & 0xFF) != fb) { - p = reinterpret_cast(memchr(p, fb, text.end() - p)); + const char* etext = text.data() + text.size(); + for (const char* p = text.data(); p <= etext; p++) { + // Try to use prefix accel (e.g. memchr) to skip ahead. + if (p < etext && prog_->can_prefix_accel()) { + p = reinterpret_cast(prog_->PrefixAccel(p, etext - p)); if (p == NULL) - p = text.end(); + p = etext; } cap_[0] = p; if (TrySearch(prog_->start(), p)) // Match must be leftmost; done. return true; + // Avoid invoking undefined behavior (arithmetic on a null pointer) + // by simply not continuing the loop. + if (p == NULL) + break; } return false; } @@ -370,9 +377,9 @@ bool Prog::SearchBitState(const StringPiece& text, bool longest = kind != kFirstMatch; if (!b.Search(text, context, anchored, longest, match, nmatch)) return false; - if (kind == kFullMatch && match[0].end() != text.end()) + if (kind == kFullMatch && EndPtr(match[0]) != EndPtr(text)) return false; return true; } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/compile.cc b/src/duckdb/third_party/re2/re2/compile.cc index 1a2c5e04..7bc76bbd 100644 --- a/src/duckdb/third_party/re2/re2/compile.cc +++ b/src/duckdb/third_party/re2/re2/compile.cc @@ -14,8 +14,8 @@ #include #include "util/logging.h" -#include "util/pod_array.h" #include "util/utf.h" +#include "re2/pod_array.h" #include "re2/prog.h" #include "re2/re2.h" #include "re2/regexp.h" @@ -30,92 +30,60 @@ namespace duckdb_re2 { // See http://swtch.com/~rsc/regexp/regexp1.html for inspiration. // // Because the out and out1 fields in Inst are no longer pointers, -// we can't use pointers directly here either. Instead, p refers -// to inst_[p>>1].out (p&1 == 0) or inst_[p>>1].out1 (p&1 == 1). -// p == 0 represents the NULL list. This is okay because instruction #0 +// we can't use pointers directly here either. Instead, head refers +// to inst_[head>>1].out (head&1 == 0) or inst_[head>>1].out1 (head&1 == 1). +// head == 0 represents the NULL list. This is okay because instruction #0 // is always the fail instruction, which never appears on a list. - struct PatchList { - uint32_t p; - // Returns patch list containing just p. - static PatchList Mk(uint32_t p); + static PatchList Mk(uint32_t p) { + return {p, p}; + } - // Patches all the entries on l to have value v. + // Patches all the entries on l to have value p. // Caller must not ever use patch list again. - static void Patch(Prog::Inst *inst0, PatchList l, uint32_t v); - - // Deref returns the next pointer pointed at by p. - static PatchList Deref(Prog::Inst *inst0, PatchList l); - - // Appends two patch lists and returns result. - static PatchList Append(Prog::Inst *inst0, PatchList l1, PatchList l2); -}; - -static PatchList nullPatchList = { 0 }; - -// Returns patch list containing just p. -PatchList PatchList::Mk(uint32_t p) { - PatchList l; - l.p = p; - return l; -} - -// Returns the next pointer pointed at by l. -PatchList PatchList::Deref(Prog::Inst* inst0, PatchList l) { - Prog::Inst* ip = &inst0[l.p>>1]; - if (l.p&1) - l.p = ip->out1(); - else - l.p = ip->out(); - return l; -} - -// Patches all the entries on l to have value v. -void PatchList::Patch(Prog::Inst *inst0, PatchList l, uint32_t val) { - while (l.p != 0) { - Prog::Inst* ip = &inst0[l.p>>1]; - if (l.p&1) { - l.p = ip->out1(); - ip->out1_ = val; - } else { - l.p = ip->out(); - ip->set_out(val); + static void Patch(Prog::Inst* inst0, PatchList l, uint32_t p) { + while (l.head != 0) { + Prog::Inst* ip = &inst0[l.head>>1]; + if (l.head&1) { + l.head = ip->out1(); + ip->out1_ = p; + } else { + l.head = ip->out(); + ip->set_out(p); + } } } -} -// Appends two patch lists and returns result. -PatchList PatchList::Append(Prog::Inst* inst0, PatchList l1, PatchList l2) { - if (l1.p == 0) - return l2; - if (l2.p == 0) - return l1; - - PatchList l = l1; - for (;;) { - PatchList next = PatchList::Deref(inst0, l); - if (next.p == 0) - break; - l = next; + // Appends two patch lists and returns result. + static PatchList Append(Prog::Inst* inst0, PatchList l1, PatchList l2) { + if (l1.head == 0) + return l2; + if (l2.head == 0) + return l1; + Prog::Inst* ip = &inst0[l1.tail>>1]; + if (l1.tail&1) + ip->out1_ = l2.head; + else + ip->set_out(l2.head); + return {l1.head, l2.tail}; } - Prog::Inst* ip = &inst0[l.p>>1]; - if (l.p&1) - ip->out1_ = l2.p; - else - ip->set_out(l2.p); + uint32_t head; + uint32_t tail; // for constant-time append +}; - return l1; -} +static const PatchList kNullPatchList = {0, 0}; // Compiled program fragment. struct Frag { uint32_t begin; PatchList end; + bool nullable; - Frag() : begin(0) { end.p = 0; } // needed so Frag can go in vector - Frag(uint32_t begin, PatchList end) : begin(begin), end(end) {} + Frag() : begin(0), end(kNullPatchList), nullable(false) {} + Frag(uint32_t begin, PatchList end, bool nullable) + : begin(begin), end(end), nullable(nullable) {} }; // Input encodings. @@ -212,8 +180,8 @@ class Compiler : public Regexp::Walker { int AddSuffixRecursive(int root, int id); // Finds the trie node for the given suffix. Returns a Frag in order to - // distinguish between pointing at the root node directly (end.p == 0) - // and pointing at an Alt's out1 or out (end.p&1 == 1 or 0, respectively). + // distinguish between pointing at the root node directly (end.head == 0) + // and pointing at an Alt's out1 or out (end.head&1 == 1 or 0, respectively). Frag FindByteRange(int root, int id); // Compares two ByteRanges and returns true iff they are equal. @@ -225,8 +193,8 @@ class Compiler : public Regexp::Walker { // Single rune. Frag Literal(Rune r, bool foldcase); - void Setup(Regexp::ParseFlags, int64_t, RE2::Anchor); - Prog* Finish(); + void Setup(Regexp::ParseFlags flags, int64_t max_mem, RE2::Anchor anchor); + Prog* Finish(Regexp* re); // Returns .* where dot = any byte Frag DotStar(); @@ -298,7 +266,7 @@ int Compiler::AllocInst(int n) { // Returns an unmatchable fragment. Frag Compiler::NoMatch() { - return Frag(0, nullPatchList); + return Frag(); } // Is a an unmatchable fragment? @@ -314,7 +282,7 @@ Frag Compiler::Cat(Frag a, Frag b) { // Elide no-op. Prog::Inst* begin = &inst_[a.begin]; if (begin->opcode() == kInstNop && - a.end.p == (a.begin << 1) && + a.end.head == (a.begin << 1) && begin->out() == 0) { // in case refs to a somewhere PatchList::Patch(inst_.data(), a.end, b.begin); @@ -324,11 +292,11 @@ Frag Compiler::Cat(Frag a, Frag b) { // To run backward over string, reverse all concatenations. if (reversed_) { PatchList::Patch(inst_.data(), b.end, a.begin); - return Frag(b.begin, a.end); + return Frag(b.begin, a.end, b.nullable && a.nullable); } PatchList::Patch(inst_.data(), a.end, b.begin); - return Frag(a.begin, b.end); + return Frag(a.begin, b.end, a.nullable && b.nullable); } // Given fragments for a and b, returns fragment for a|b. @@ -344,7 +312,8 @@ Frag Compiler::Alt(Frag a, Frag b) { return NoMatch(); inst_[id].InitAlt(a.begin, b.begin); - return Frag(id, PatchList::Append(inst_.data(), a.end, b.end)); + return Frag(id, PatchList::Append(inst_.data(), a.end, b.end), + a.nullable || b.nullable); } // When capturing submatches in like-Perl mode, a kOpAlt Inst @@ -354,27 +323,44 @@ Frag Compiler::Alt(Frag a, Frag b) { // then the operator is greedy. If out1_ is the repetition // (and out_ moves forward), then the operator is non-greedy. -// Given a fragment a, returns a fragment for a* or a*? (if nongreedy) -Frag Compiler::Star(Frag a, bool nongreedy) { +// Given a fragment for a, returns a fragment for a+ or a+? (if nongreedy) +Frag Compiler::Plus(Frag a, bool nongreedy) { int id = AllocInst(1); if (id < 0) return NoMatch(); - inst_[id].InitAlt(0, 0); - PatchList::Patch(inst_.data(), a.end, id); + PatchList pl; if (nongreedy) { - inst_[id].out1_ = a.begin; - return Frag(id, PatchList::Mk(id << 1)); + inst_[id].InitAlt(0, a.begin); + pl = PatchList::Mk(id << 1); } else { - inst_[id].set_out(a.begin); - return Frag(id, PatchList::Mk((id << 1) | 1)); + inst_[id].InitAlt(a.begin, 0); + pl = PatchList::Mk((id << 1) | 1); } + PatchList::Patch(inst_.data(), a.end, id); + return Frag(a.begin, pl, a.nullable); } -// Given a fragment for a, returns a fragment for a+ or a+? (if nongreedy) -Frag Compiler::Plus(Frag a, bool nongreedy) { - // a+ is just a* with a different entry point. - Frag f = Star(a, nongreedy); - return Frag(a.begin, f.end); +// Given a fragment for a, returns a fragment for a* or a*? (if nongreedy) +Frag Compiler::Star(Frag a, bool nongreedy) { + // When the subexpression is nullable, one Alt isn't enough to guarantee + // correct priority ordering within the transitive closure. The simplest + // solution is to handle it as (a+)? instead, which adds the second Alt. + if (a.nullable) + return Quest(Plus(a, nongreedy), nongreedy); + + int id = AllocInst(1); + if (id < 0) + return NoMatch(); + PatchList pl; + if (nongreedy) { + inst_[id].InitAlt(0, a.begin); + pl = PatchList::Mk(id << 1); + } else { + inst_[id].InitAlt(a.begin, 0); + pl = PatchList::Mk((id << 1) | 1); + } + PatchList::Patch(inst_.data(), a.end, id); + return Frag(id, pl, true); } // Given a fragment for a, returns a fragment for a? or a?? (if nongreedy) @@ -392,7 +378,7 @@ Frag Compiler::Quest(Frag a, bool nongreedy) { inst_[id].InitAlt(a.begin, 0); pl = PatchList::Mk((id << 1) | 1); } - return Frag(id, PatchList::Append(inst_.data(), pl, a.end)); + return Frag(id, PatchList::Append(inst_.data(), pl, a.end), true); } // Returns a fragment for the byte range lo-hi. @@ -401,7 +387,7 @@ Frag Compiler::ByteRange(int lo, int hi, bool foldcase) { if (id < 0) return NoMatch(); inst_[id].InitByteRange(lo, hi, foldcase, 0); - return Frag(id, PatchList::Mk(id << 1)); + return Frag(id, PatchList::Mk(id << 1), false); } // Returns a no-op fragment. Sometimes unavoidable. @@ -410,7 +396,7 @@ Frag Compiler::Nop() { if (id < 0) return NoMatch(); inst_[id].InitNop(0); - return Frag(id, PatchList::Mk(id << 1)); + return Frag(id, PatchList::Mk(id << 1), true); } // Returns a fragment that signals a match. @@ -419,7 +405,7 @@ Frag Compiler::Match(int32_t match_id) { if (id < 0) return NoMatch(); inst_[id].InitMatch(match_id); - return Frag(id, nullPatchList); + return Frag(id, kNullPatchList, false); } // Returns a fragment matching a particular empty-width op (like ^ or $) @@ -428,7 +414,7 @@ Frag Compiler::EmptyWidth(EmptyOp empty) { if (id < 0) return NoMatch(); inst_[id].InitEmptyWidth(empty, 0); - return Frag(id, PatchList::Mk(id << 1)); + return Frag(id, PatchList::Mk(id << 1), true); } // Given a fragment a, returns a fragment with capturing parens around a. @@ -442,7 +428,7 @@ Frag Compiler::Capture(Frag a, int n) { inst_[id+1].InitCapture(2*n+1, 0); PatchList::Patch(inst_.data(), a.end, id+1); - return Frag(id, PatchList::Mk((id+1) << 1)); + return Frag(id, PatchList::Mk((id+1) << 1), a.nullable); } // A Rune is a name for a Unicode code point. @@ -467,7 +453,7 @@ static int MaxRune(int len) { void Compiler::BeginRange() { rune_cache_.clear(); rune_range_.begin = 0; - rune_range_.end = nullPatchList; + rune_range_.end = kNullPatchList; } int Compiler::UncachedRuneByteSuffix(uint8_t lo, uint8_t hi, bool foldcase, @@ -501,8 +487,8 @@ int Compiler::CachedRuneByteSuffix(uint8_t lo, uint8_t hi, bool foldcase, } bool Compiler::IsCachedRuneByteSuffix(int id) { - uint8_t lo = inst_[id].inst_byte_range_data_.lo_; - uint8_t hi = inst_[id].inst_byte_range_data_.hi_; + uint8_t lo = inst_[id].lo_; + uint8_t hi = inst_[id].hi_; bool foldcase = inst_[id].foldcase() != 0; int next = inst_[id].out(); @@ -548,9 +534,9 @@ int Compiler::AddSuffixRecursive(int root, int id) { } int br; - if (f.end.p == 0) + if (f.end.head == 0) br = root; - else if (f.end.p&1) + else if (f.end.head&1) br = inst_[f.begin].out1(); else br = inst_[f.begin].out(); @@ -566,9 +552,9 @@ int Compiler::AddSuffixRecursive(int root, int id) { // Ensure that the parent points to the clone, not to the original. // Note that this could leave the head unreachable except via the cache. br = byterange; - if (f.end.p == 0) + if (f.end.head == 0) root = br; - else if (f.end.p&1) + else if (f.end.head&1) inst_[f.begin].out1_ = br; else inst_[f.begin].set_out(br); @@ -601,7 +587,7 @@ bool Compiler::ByteRangeEqual(int id1, int id2) { Frag Compiler::FindByteRange(int root, int id) { if (inst_[root].opcode() == kInstByteRange) { if (ByteRangeEqual(root, id)) - return Frag(root, nullPatchList); + return Frag(root, kNullPatchList, false); else return NoMatch(); } @@ -609,7 +595,7 @@ Frag Compiler::FindByteRange(int root, int id) { while (inst_[root].opcode() == kInstAlt) { int out1 = inst_[root].out1(); if (ByteRangeEqual(out1, id)) - return Frag(root, PatchList::Mk((root << 1) | 1)); + return Frag(root, PatchList::Mk((root << 1) | 1), false); // CharClass is a sorted list of ranges, so if out1 of the root Alt wasn't // what we're looking for, then we can stop immediately. Unfortunately, we @@ -621,7 +607,7 @@ Frag Compiler::FindByteRange(int root, int id) { if (inst_[out].opcode() == kInstAlt) root = out; else if (ByteRangeEqual(out, id)) - return Frag(root, PatchList::Mk(root << 1)); + return Frag(root, PatchList::Mk(root << 1), false); else return NoMatch(); } @@ -662,48 +648,43 @@ void Compiler::AddRuneRangeLatin1(Rune lo, Rune hi, bool foldcase) { static_cast(hi), foldcase, 0)); } -// Table describing how to make a UTF-8 matching machine -// for the rune range 80-10FFFF (Runeself-Runemax). -// This range happens frequently enough (for example /./ and /[^a-z]/) -// and the rune_cache_ map is slow enough that this is worth -// special handling. Makes compilation of a small expression -// with a dot in it about 10% faster. -// The * in the comments below mark whole sequences. -static struct ByteRangeProg { - int next; - int lo; - int hi; -} prog_80_10ffff[] = { - // Two-byte - { -1, 0x80, 0xBF, }, // 0: 80-BF - { 0, 0xC2, 0xDF, }, // 1: C2-DF 80-BF* - - // Three-byte - { 0, 0xA0, 0xBF, }, // 2: A0-BF 80-BF - { 2, 0xE0, 0xE0, }, // 3: E0 A0-BF 80-BF* - { 0, 0x80, 0xBF, }, // 4: 80-BF 80-BF - { 4, 0xE1, 0xEF, }, // 5: E1-EF 80-BF 80-BF* - - // Four-byte - { 4, 0x90, 0xBF, }, // 6: 90-BF 80-BF 80-BF - { 6, 0xF0, 0xF0, }, // 7: F0 90-BF 80-BF 80-BF* - { 4, 0x80, 0xBF, }, // 8: 80-BF 80-BF 80-BF - { 8, 0xF1, 0xF3, }, // 9: F1-F3 80-BF 80-BF 80-BF* - { 4, 0x80, 0x8F, }, // 10: 80-8F 80-BF 80-BF - { 10, 0xF4, 0xF4, }, // 11: F4 80-8F 80-BF 80-BF* -}; - void Compiler::Add_80_10ffff() { - int inst[arraysize(prog_80_10ffff)] = { 0 }; // does not need to be initialized; silences gcc warning - for (int i = 0; i < arraysize(prog_80_10ffff); i++) { - const ByteRangeProg& p = prog_80_10ffff[i]; - int next = 0; - if (p.next >= 0) - next = inst[p.next]; - inst[i] = UncachedRuneByteSuffix(static_cast(p.lo), - static_cast(p.hi), false, next); - if ((p.lo & 0xC0) != 0x80) - AddSuffix(inst[i]); + // The 80-10FFFF (Runeself-Runemax) rune range occurs frequently enough + // (for example, for /./ and /[^a-z]/) that it is worth simplifying: by + // permitting overlong encodings in E0 and F0 sequences and code points + // over 10FFFF in F4 sequences, the size of the bytecode and the number + // of equivalence classes are reduced significantly. + int id; + if (reversed_) { + // Prefix factoring matters, but we don't have to handle it here + // because the rune range trie logic takes care of that already. + id = UncachedRuneByteSuffix(0xC2, 0xDF, false, 0); + id = UncachedRuneByteSuffix(0x80, 0xBF, false, id); + AddSuffix(id); + + id = UncachedRuneByteSuffix(0xE0, 0xEF, false, 0); + id = UncachedRuneByteSuffix(0x80, 0xBF, false, id); + id = UncachedRuneByteSuffix(0x80, 0xBF, false, id); + AddSuffix(id); + + id = UncachedRuneByteSuffix(0xF0, 0xF4, false, 0); + id = UncachedRuneByteSuffix(0x80, 0xBF, false, id); + id = UncachedRuneByteSuffix(0x80, 0xBF, false, id); + id = UncachedRuneByteSuffix(0x80, 0xBF, false, id); + AddSuffix(id); + } else { + // Suffix factoring matters - and we do have to handle it here. + int cont1 = UncachedRuneByteSuffix(0x80, 0xBF, false, 0); + id = UncachedRuneByteSuffix(0xC2, 0xDF, false, cont1); + AddSuffix(id); + + int cont2 = UncachedRuneByteSuffix(0x80, 0xBF, false, cont1); + id = UncachedRuneByteSuffix(0xE0, 0xEF, false, cont2); + AddSuffix(id); + + int cont3 = UncachedRuneByteSuffix(0x80, 0xBF, false, cont2); + id = UncachedRuneByteSuffix(0xF0, 0xF4, false, cont3); + AddSuffix(id); } } @@ -711,9 +692,8 @@ void Compiler::AddRuneRangeUTF8(Rune lo, Rune hi, bool foldcase) { if (lo > hi) return; - // Pick off 80-10FFFF as a common special case - // that can bypass the slow rune_cache_. - if (lo == 0x80 && hi == 0x10ffff && !reversed_) { + // Pick off 80-10FFFF as a common special case. + if (lo == 0x80 && hi == 0x10ffff) { Add_80_10ffff(); return; } @@ -809,8 +789,8 @@ void Compiler::AddRuneRangeUTF8(Rune lo, Rune hi, bool foldcase) { // Should not be called. Frag Compiler::Copy(Frag arg) { // We're using WalkExponential; there should be no copying. - LOG(DFATAL) << "Compiler::Copy called!"; failed_ = true; + LOG(DFATAL) << "Compiler::Copy called!"; return NoMatch(); } @@ -936,8 +916,8 @@ Frag Compiler::PostVisit(Regexp* re, Frag, Frag, Frag* child_frags, CharClass* cc = re->cc(); if (cc->empty()) { // This can't happen. - LOG(DFATAL) << "No ranges in char class"; failed_ = true; + LOG(DFATAL) << "No ranges in char class"; return NoMatch(); } @@ -994,8 +974,8 @@ Frag Compiler::PostVisit(Regexp* re, Frag, Frag, Frag* child_frags, case kRegexpNoWordBoundary: return EmptyWidth(kEmptyNonWordBoundary); } - LOG(DFATAL) << "Missing case in Compiler: " << re->op(); failed_ = true; + LOG(DFATAL) << "Missing case in Compiler: " << re->op(); return NoMatch(); } @@ -1095,8 +1075,6 @@ static bool IsAnchorEnd(Regexp** pre, int depth) { void Compiler::Setup(Regexp::ParseFlags flags, int64_t max_mem, RE2::Anchor anchor) { - prog_->set_flags(flags); - if (flags & Regexp::Latin1) encoding_ = kEncodingLatin1; max_mem_ = max_mem; @@ -1117,14 +1095,11 @@ void Compiler::Setup(Regexp::ParseFlags flags, int64_t max_mem, // on the program.) if (m >= 1<<24) m = 1<<24; - // Inst imposes its own limit (currently bigger than 2^24 but be safe). if (m > Prog::Inst::kMaxInst) m = Prog::Inst::kMaxInst; - max_ninst_ = static_cast(m); } - anchor_ = anchor; } @@ -1178,10 +1153,10 @@ Prog* Compiler::Compile(Regexp* re, bool reversed, int64_t max_mem) { c.prog_->set_start_unanchored(all.begin); // Hand ownership of prog_ to caller. - return c.Finish(); + return c.Finish(re); } -Prog* Compiler::Finish() { +Prog* Compiler::Finish(Regexp* re) { if (failed_) return NULL; @@ -1198,6 +1173,13 @@ Prog* Compiler::Finish() { prog_->Flatten(); prog_->ComputeByteMap(); + if (!prog_->reversed()) { + std::string prefix; + bool prefix_foldcase; + if (re->RequiredPrefixForAccel(&prefix, &prefix_foldcase)) + prog_->ConfigurePrefixAccel(prefix, prefix_foldcase); + } + // Record remaining memory for DFA. if (max_mem_ <= 0) { prog_->set_dfa_mem(1<<20); @@ -1254,7 +1236,7 @@ Prog* Compiler::CompileSet(Regexp* re, RE2::Anchor anchor, int64_t max_mem) { c.prog_->set_start(all.begin); c.prog_->set_start_unanchored(all.begin); - Prog* prog = c.Finish(); + Prog* prog = c.Finish(re); if (prog == NULL) return NULL; @@ -1276,4 +1258,4 @@ Prog* Prog::CompileSet(Regexp* re, RE2::Anchor anchor, int64_t max_mem) { return Compiler::CompileSet(re, anchor, max_mem); } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/dfa.cc b/src/duckdb/third_party/re2/re2/dfa.cc index 092eec38..38b060d5 100644 --- a/src/duckdb/third_party/re2/re2/dfa.cc +++ b/src/duckdb/third_party/re2/re2/dfa.cc @@ -39,33 +39,27 @@ #include "util/logging.h" #include "util/mix.h" #include "util/mutex.h" -#include "util/pod_array.h" -#include "util/sparse_set.h" #include "util/strutil.h" +#include "re2/pod_array.h" #include "re2/prog.h" +#include "re2/re2.h" +#include "re2/sparse_set.h" #include "re2/stringpiece.h" // Silence "zero-sized array in struct/union" warning for DFA::State::next_. #ifdef _MSC_VER -//#pragma warning(disable: 4200) +#pragma warning(disable: 4200) #endif namespace duckdb_re2 { -#if !defined(__linux__) /* only Linux seems to have memrchr */ -static void* memrchr(const void* s, int c, size_t n) { - const unsigned char* p = (const unsigned char*)s; - for (p += n; n > 0; n--) - if (*--p == c) - return (void*)p; - - return NULL; -} -#endif - // Controls whether the DFA should bail out early if the NFA would be faster. static bool dfa_should_bail_when_slow = true; +void Prog::TESTING_ONLY_set_dfa_should_bail_when_slow(bool b) { + dfa_should_bail_when_slow = b; +} + // A DFA implementation of a regular expression program. // Since this is entirely a forward declaration mandated by C++, // some of the comments here are better understood after reading @@ -115,7 +109,6 @@ class DFA { // byte c, the next state should be s->next_[c]. struct State { inline bool IsMatch() const { return (flag_ & kFlagMatch) != 0; } - void SaveMatch(std::vector* v); int* inst_; // Instruction pointers in the state. int ninst_; // # of inst_ pointers. @@ -125,17 +118,15 @@ class DFA { // Work around the bug affecting flexible array members in GCC 6.x (for x >= 1). // (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70932) - std::atomic next_[1]; // Outgoing arrows from State, +#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ == 6 && __GNUC_MINOR__ >= 1 + std::atomic next_[0]; // Outgoing arrows from State, +#else + std::atomic next_[]; // Outgoing arrows from State, +#endif + // one per input byte class }; - // Marks separate thread groups of different priority - // in the work queue when in leftmost-longest matching mode. - constexpr static int32_t Mark = -1; - // Separates the match IDs from the instructions in inst_. - // Used only for "many match" DFA states. - constexpr static int32_t MatchSep = -2; - enum { kByteEndText = 256, // imaginary byte at end of text @@ -176,11 +167,8 @@ class DFA { typedef std::unordered_set StateSet; private: - // Special "first_byte" values for a state. (Values >= 0 denote actual bytes.) - enum { - kFbUnknown = -1, // No analysis has been performed. - kFbNone = -2, // The first-byte trick cannot be used. - }; + // Make it easier to swap in a scalable reader-writer mutex. + using CacheMutex = Mutex; enum { // Indices into start_ for unanchored searches. @@ -248,25 +236,26 @@ class DFA { struct SearchParams { SearchParams(const StringPiece& text, const StringPiece& context, RWLocker* cache_lock) - : text(text), context(context), + : text(text), + context(context), anchored(false), + can_prefix_accel(false), want_earliest_match(false), run_forward(false), start(NULL), - first_byte(kFbUnknown), cache_lock(cache_lock), failed(false), ep(NULL), - matches(NULL) { } + matches(NULL) {} StringPiece text; StringPiece context; bool anchored; + bool can_prefix_accel; bool want_earliest_match; bool run_forward; State* start; - int first_byte; - RWLocker *cache_lock; + RWLocker* cache_lock; bool failed; // "out" parameter: whether search gave up const char* ep; // "out" parameter: end pointer for match SparseSet* matches; @@ -277,15 +266,13 @@ class DFA { }; // Before each search, the parameters to Search are analyzed by - // AnalyzeSearch to determine the state in which to start and the - // "first_byte" for that state, if any. + // AnalyzeSearch to determine the state in which to start. struct StartInfo { - StartInfo() : start(NULL), first_byte(kFbUnknown) {} - State* start; - std::atomic first_byte; + StartInfo() : start(NULL) {} + std::atomic start; }; - // Fills in params->start and params->first_byte using + // Fills in params->start and params->can_prefix_accel using // the other search parameters. Returns true on success, // false on failure. // cache_mutex_.r <= L < mutex_ @@ -296,10 +283,10 @@ class DFA { // The generic search loop, inlined to create specialized versions. // cache_mutex_.r <= L < mutex_ // Might unlock and relock cache_mutex_ via params->cache_lock. - inline bool InlinedSearchLoop(SearchParams* params, - bool have_first_byte, - bool want_earliest_match, - bool run_forward); + template + inline bool InlinedSearchLoop(SearchParams* params); // The specialized versions of InlinedSearchLoop. The three letters // at the ends of the name denote the true/false values used as the @@ -321,13 +308,6 @@ class DFA { // Might unlock and relock cache_mutex_ via params->cache_lock. bool FastSearchLoop(SearchParams* params); - // For debugging, a slow search loop that calls InlinedSearchLoop - // directly -- because the booleans passed are not constants, the - // loop is not specialized like the SearchFFF etc. versions, so it - // runs much more slowly. Useful only for debugging. - // cache_mutex_.r <= L < mutex_ - // Might unlock and relock cache_mutex_ via params->cache_lock. - bool SlowSearchLoop(SearchParams* params); // Looks up bytes in bytemap_ but handles case c == kByteEndText too. int ByteMap(int c) { @@ -354,11 +334,14 @@ class DFA { // while holding cache_mutex_ for writing, to avoid interrupting other // readers. Any State* pointers are only valid while cache_mutex_ // is held. - Mutex cache_mutex_; + CacheMutex cache_mutex_; int64_t mem_budget_; // Total memory budget for all States. int64_t state_budget_; // Amount of memory remaining for new States. StateSet state_cache_; // All States computed so far. StartInfo start_[kMaxStart]; + + DFA(const DFA&) = delete; + DFA& operator=(const DFA&) = delete; }; // Shorthand for casting to uint8_t*. @@ -368,6 +351,17 @@ static inline const uint8_t* BytePtr(const void* v) { // Work queues +// Marks separate thread groups of different priority +// in the work queue when in leftmost-longest matching mode. +//#define Mark (-1) +constexpr auto Mark = -1; + + +// Separates the match IDs from the instructions in inst_. +// Used only for "many match" DFA states. +//#define MatchSep (-2) +constexpr auto MatchSep = -2; + // Internally, the DFA uses a sparse array of // program instruction pointers as a work queue. // In leftmost longest mode, marks separate sections @@ -498,10 +492,10 @@ std::string DFA::DumpWorkq(Workq* q) { const char* sep = ""; for (Workq::iterator it = q->begin(); it != q->end(); ++it) { if (q->is_mark(*it)) { - StringAppendF(&s, "|"); + s += "|"; sep = ""; } else { - StringAppendF(&s, "%s%d", sep, *it); + s += StringPrintf("%s%d", sep, *it); sep = ","; } } @@ -518,20 +512,20 @@ std::string DFA::DumpState(State* state) { return "*"; std::string s; const char* sep = ""; - StringAppendF(&s, "(%p)", state); + s += StringPrintf("(%p)", state); for (int i = 0; i < state->ninst_; i++) { if (state->inst_[i] == Mark) { - StringAppendF(&s, "|"); + s += "|"; sep = ""; } else if (state->inst_[i] == MatchSep) { - StringAppendF(&s, "||"); + s += "||"; sep = ""; } else { - StringAppendF(&s, "%s%d", sep, state->inst_[i]); + s += StringPrintf("%s%d", sep, state->inst_[i]); sep = ","; } } - StringAppendF(&s, " flag=%#x", state->flag_); + s += StringPrintf(" flag=%#x", state->flag_); return s; } @@ -602,11 +596,12 @@ DFA::State* DFA::WorkqToCachedState(Workq* q, Workq* mq, uint32_t flag) { // Only ByteRange, EmptyWidth, and Match instructions are useful to keep: // those are the only operators with any effect in // RunWorkqOnEmptyString or RunWorkqOnByte. - int* inst = new int[q->size()]; + PODArray inst(q->size()); int n = 0; uint32_t needflags = 0; // flags needed by kInstEmptyWidth instructions bool sawmatch = false; // whether queue contains guaranteed kInstMatch bool sawmark = false; // whether queue contains a Mark + for (Workq::iterator it = q->begin(); it != q->end(); ++it) { int id = *it; if (sawmatch && (kind_ == Prog::kFirstMatch || q->is_mark(id))) @@ -630,7 +625,6 @@ DFA::State* DFA::WorkqToCachedState(Workq* q, Workq* mq, uint32_t flag) { (it == q->begin() && ip->greedy(prog_))) && (kind_ != Prog::kLongestMatch || !sawmark) && (flag & kFlagMatch)) { - delete[] inst; return FullMatchState; } FALLTHROUGH_INTENDED; @@ -675,7 +669,6 @@ DFA::State* DFA::WorkqToCachedState(Workq* q, Workq* mq, uint32_t flag) { // the execution loop can stop early. This is only okay // if the state is *not* a matching state. if (n == 0 && flag == 0) { - delete[] inst; return DeadState; } @@ -683,7 +676,7 @@ DFA::State* DFA::WorkqToCachedState(Workq* q, Workq* mq, uint32_t flag) { // unordered state sets separated by Marks. Sort each set // to canonicalize, to reduce the number of distinct sets stored. if (kind_ == Prog::kLongestMatch) { - int* ip = inst; + int* ip = inst.data(); int* ep = ip + n; while (ip < ep) { int* markp = ip; @@ -696,6 +689,15 @@ DFA::State* DFA::WorkqToCachedState(Workq* q, Workq* mq, uint32_t flag) { } } + // If we're in many match mode, canonicalize for similar reasons: + // we have an unordered set of states (i.e. we don't have Marks) + // and sorting will reduce the number of distinct sets stored. + if (kind_ == Prog::kManyMatch) { + int* ip = inst.data(); + int* ep = ip + n; + std::sort(ip, ep); + } + // Append MatchSep and the match IDs in mq if necessary. if (mq != NULL) { inst[n++] = MatchSep; @@ -710,8 +712,7 @@ DFA::State* DFA::WorkqToCachedState(Workq* q, Workq* mq, uint32_t flag) { // Save the needed empty-width flags in the top bits for use later. flag |= needflags << kFlagNeedShift; - State* state = CachedState(inst, n, flag); - delete[] inst; + State* state = CachedState(inst.data(), n, flag); return state; } @@ -940,8 +941,21 @@ void DFA::RunWorkqOnByte(Workq* oldq, Workq* newq, break; case kInstByteRange: // can follow if c is in range - if (ip->Matches(c)) - AddToQueue(newq, ip->out(), flag); + if (!ip->Matches(c)) + break; + AddToQueue(newq, ip->out(), flag); + if (ip->hint() != 0) { + // We have a hint, but we must cancel out the + // increment that will occur after the break. + i += ip->hint() - 1; + } else { + // We have no hint, so we must find the end + // of the current list and then skip to it. + Prog::Inst* ip0 = ip; + while (!ip->last()) + ++ip; + i += ip - ip0; + } break; case kInstMatch: @@ -956,6 +970,7 @@ void DFA::RunWorkqOnByte(Workq* oldq, Workq* newq, break; } } + } // Processes input byte c in state, returning new state. @@ -1082,7 +1097,7 @@ DFA::State* DFA::RunStateOnByte(State* state, int c) { class DFA::RWLocker { public: - explicit RWLocker(Mutex* mu); + explicit RWLocker(CacheMutex* mu); ~RWLocker(); // If the lock is only held for reading right now, @@ -1092,19 +1107,19 @@ class DFA::RWLocker { void LockForWriting(); private: - Mutex* mu_; + CacheMutex* mu_; bool writing_; RWLocker(const RWLocker&) = delete; RWLocker& operator=(const RWLocker&) = delete; }; -DFA::RWLocker::RWLocker(Mutex* mu) : mu_(mu), writing_(false) { +DFA::RWLocker::RWLocker(CacheMutex* mu) : mu_(mu), writing_(false) { mu_->ReaderLock(); } -// This function is marked as NO_THREAD_SAFETY_ANALYSIS because the annotations -// does not support lock upgrade. +// This function is marked as NO_THREAD_SAFETY_ANALYSIS because +// the annotations don't support lock upgrade. void DFA::RWLocker::LockForWriting() NO_THREAD_SAFETY_ANALYSIS { if (!writing_) { mu_->ReaderUnlock(); @@ -1136,11 +1151,14 @@ void DFA::ResetCache(RWLocker* cache_lock) { // Re-acquire the cache_mutex_ for writing (exclusive use). cache_lock->LockForWriting(); + hooks::GetDFAStateCacheResetHook()({ + state_budget_, + state_cache_.size(), + }); + // Clear the cache, reset the memory budget. - for (int i = 0; i < kMaxStart; i++) { - start_[i].start = NULL; - start_[i].first_byte.store(kFbUnknown, std::memory_order_relaxed); - } + for (int i = 0; i < kMaxStart; i++) + start_[i].start.store(NULL, std::memory_order_relaxed); ClearCache(); mem_budget_ = state_budget_; } @@ -1255,8 +1273,7 @@ DFA::State* DFA::StateSaver::Restore() { // situation, the DFA can do better than executing the simple loop. // Instead, it can call memchr to search very quickly for the byte c. // Whether the start state has this property is determined during a -// pre-compilation pass, and if so, the byte b is passed to the search -// loop as the "first_byte" argument, along with a boolean "have_first_byte". +// pre-compilation pass and the "can_prefix_accel" argument is set. // // Fourth, the desired behavior is to search for the leftmost-best match // (approximately, the same one that Perl would find), which is not @@ -1279,7 +1296,7 @@ DFA::State* DFA::StateSaver::Restore() { // inline it to create the specialized ones. // // Note that matches are delayed by one byte, to make it easier to -// accommodate match conditions depending on the next input byte (like $ and \b). +// accomodate match conditions depending on the next input byte (like $ and \b). // When s->next[c]->IsMatch(), it means that there is a match ending just // *before* byte c. @@ -1288,15 +1305,16 @@ DFA::State* DFA::StateSaver::Restore() { // The bools are equal to the same-named variables in params, but // making them function arguments lets the inliner specialize // this function to each combination (see two paragraphs above). -inline bool DFA::InlinedSearchLoop(SearchParams* params, - bool have_first_byte, - bool want_earliest_match, - bool run_forward) { +template +inline bool DFA::InlinedSearchLoop(SearchParams* params) { State* start = params->start; - const uint8_t* bp = BytePtr(params->text.begin()); // start of text - const uint8_t* p = bp; // text scanning point - const uint8_t* ep = BytePtr(params->text.end()); // end of text - const uint8_t* resetp = NULL; // p at last cache reset + const uint8_t* bp = BytePtr(params->text.data()); // start of text + const uint8_t* p = bp; // text scanning point + const uint8_t* ep = BytePtr(params->text.data() + + params->text.size()); // end of text + const uint8_t* resetp = NULL; // p at last cache reset if (!run_forward) { using std::swap; swap(p, ep); @@ -1326,22 +1344,15 @@ inline bool DFA::InlinedSearchLoop(SearchParams* params, } while (p != ep) { - if (have_first_byte && s == start) { - // In start state, only way out is to find first_byte, - // so use optimized assembly in memchr to skip ahead. - // If first_byte isn't found, we can skip to the end - // of the string. - if (run_forward) { - if ((p = BytePtr(memchr(p, params->first_byte, ep - p))) == NULL) { - p = ep; - break; - } - } else { - if ((p = BytePtr(memrchr(ep, params->first_byte, p - ep))) == NULL) { - p = ep; - break; - } - p++; + + if (can_prefix_accel && s == start) { + // In start state, only way out is to find the prefix, + // so we use prefix accel (e.g. memchr) to skip ahead. + // If not found, we can skip to the end of the string. + p = BytePtr(prog_->PrefixAccel(p, ep - p)); + if (p == NULL) { + p = ep; + break; } } @@ -1380,9 +1391,11 @@ inline bool DFA::InlinedSearchLoop(SearchParams* params, // byte runs at about 0.2 MB/s, while the NFA (nfa.cc) can do the // same at about 2 MB/s. Unless we're processing an average // of 10 bytes per state computation, fail so that RE2 can - // fall back to the NFA. + // fall back to the NFA. However, RE2::Set cannot fall back, + // so we just have to keep on keeping on in that case. if (dfa_should_bail_when_slow && resetp != NULL && - static_cast(p - resetp) < 10*state_cache_.size()) { + static_cast(p - resetp) < 10*state_cache_.size() && + kind_ != Prog::kManyMatch) { params->failed = true; return false; } @@ -1446,17 +1459,18 @@ inline bool DFA::InlinedSearchLoop(SearchParams* params, // Process one more byte to see if it triggers a match. // (Remember, matches are delayed one byte.) + int lastbyte; if (run_forward) { - if (params->text.end() == params->context.end()) + if (EndPtr(params->text) == EndPtr(params->context)) lastbyte = kByteEndText; else - lastbyte = params->text.end()[0] & 0xFF; + lastbyte = EndPtr(params->text)[0] & 0xFF; } else { - if (params->text.begin() == params->context.begin()) + if (BeginPtr(params->text) == BeginPtr(params->context)) lastbyte = kByteEndText; else - lastbyte = params->text.begin()[-1] & 0xFF; + lastbyte = BeginPtr(params->text)[-1] & 0xFF; } State* ns = s->next_[ByteMap(lastbyte)].load(std::memory_order_acquire); @@ -1507,36 +1521,28 @@ inline bool DFA::InlinedSearchLoop(SearchParams* params, // Inline specializations of the general loop. bool DFA::SearchFFF(SearchParams* params) { - return InlinedSearchLoop(params, 0, 0, 0); + return InlinedSearchLoop(params); } bool DFA::SearchFFT(SearchParams* params) { - return InlinedSearchLoop(params, 0, 0, 1); + return InlinedSearchLoop(params); } bool DFA::SearchFTF(SearchParams* params) { - return InlinedSearchLoop(params, 0, 1, 0); + return InlinedSearchLoop(params); } bool DFA::SearchFTT(SearchParams* params) { - return InlinedSearchLoop(params, 0, 1, 1); + return InlinedSearchLoop(params); } bool DFA::SearchTFF(SearchParams* params) { - return InlinedSearchLoop(params, 1, 0, 0); + return InlinedSearchLoop(params); } bool DFA::SearchTFT(SearchParams* params) { - return InlinedSearchLoop(params, 1, 0, 1); + return InlinedSearchLoop(params); } bool DFA::SearchTTF(SearchParams* params) { - return InlinedSearchLoop(params, 1, 1, 0); + return InlinedSearchLoop(params); } bool DFA::SearchTTT(SearchParams* params) { - return InlinedSearchLoop(params, 1, 1, 1); -} - -// For debugging, calls the general code directly. -bool DFA::SlowSearchLoop(SearchParams* params) { - return InlinedSearchLoop(params, - params->first_byte >= 0, - params->want_earliest_match, - params->run_forward); + return InlinedSearchLoop(params); } // For performance, calls the appropriate specialized version @@ -1555,8 +1561,7 @@ bool DFA::FastSearchLoop(SearchParams* params) { &DFA::SearchTTT, }; - bool have_first_byte = params->first_byte >= 0; - int index = 4 * have_first_byte + + int index = 4 * params->can_prefix_accel + 2 * params->want_earliest_match + 1 * params->run_forward; return (this->*Searches[index])(params); @@ -1594,7 +1599,7 @@ bool DFA::AnalyzeSearch(SearchParams* params) { const StringPiece& context = params->context; // Sanity check: make sure that text lies within context. - if (text.begin() < context.begin() || text.end() > context.end()) { + if (BeginPtr(text) < BeginPtr(context) || EndPtr(text) > EndPtr(context)) { LOG(DFATAL) << "context does not contain text"; params->start = DeadState; return true; @@ -1604,13 +1609,13 @@ bool DFA::AnalyzeSearch(SearchParams* params) { int start; uint32_t flags; if (params->run_forward) { - if (text.begin() == context.begin()) { + if (BeginPtr(text) == BeginPtr(context)) { start = kStartBeginText; flags = kEmptyBeginText|kEmptyBeginLine; - } else if (text.begin()[-1] == '\n') { + } else if (BeginPtr(text)[-1] == '\n') { start = kStartBeginLine; flags = kEmptyBeginLine; - } else if (Prog::IsWordChar(text.begin()[-1] & 0xFF)) { + } else if (Prog::IsWordChar(BeginPtr(text)[-1] & 0xFF)) { start = kStartAfterWordChar; flags = kFlagLastWord; } else { @@ -1618,13 +1623,13 @@ bool DFA::AnalyzeSearch(SearchParams* params) { flags = 0; } } else { - if (text.end() == context.end()) { + if (EndPtr(text) == EndPtr(context)) { start = kStartBeginText; flags = kEmptyBeginText|kEmptyBeginLine; - } else if (text.end()[0] == '\n') { + } else if (EndPtr(text)[0] == '\n') { start = kStartBeginLine; flags = kEmptyBeginLine; - } else if (Prog::IsWordChar(text.end()[0] & 0xFF)) { + } else if (Prog::IsWordChar(EndPtr(text)[0] & 0xFF)) { start = kStartAfterWordChar; flags = kFlagLastWord; } else { @@ -1642,14 +1647,23 @@ bool DFA::AnalyzeSearch(SearchParams* params) { if (!AnalyzeSearchHelper(params, info, flags)) { ResetCache(params->cache_lock); if (!AnalyzeSearchHelper(params, info, flags)) { - LOG(DFATAL) << "Failed to analyze start state."; params->failed = true; + LOG(DFATAL) << "Failed to analyze start state."; return false; } } - params->start = info->start; - params->first_byte = info->first_byte.load(std::memory_order_acquire); + params->start = info->start.load(std::memory_order_acquire); + + // Even if we could prefix accel, we cannot do so when anchored and, + // less obviously, we cannot do so when we are going to need flags. + // This trick works only when there is a single byte that leads to a + // different state! + if (prog_->can_prefix_accel() && + !params->anchored && + params->start > SpecialStateMax && + params->start->flag_ >> kFlagNeedShift == 0) + params->can_prefix_accel = true; return true; } @@ -1658,47 +1672,25 @@ bool DFA::AnalyzeSearch(SearchParams* params) { bool DFA::AnalyzeSearchHelper(SearchParams* params, StartInfo* info, uint32_t flags) { // Quick check. - int fb = info->first_byte.load(std::memory_order_acquire); - if (fb != kFbUnknown) + State* start = info->start.load(std::memory_order_acquire); + if (start != NULL) return true; MutexLock l(&mutex_); - fb = info->first_byte.load(std::memory_order_relaxed); - if (fb != kFbUnknown) + start = info->start.load(std::memory_order_relaxed); + if (start != NULL) return true; q0_->clear(); AddToQueue(q0_, params->anchored ? prog_->start() : prog_->start_unanchored(), flags); - info->start = WorkqToCachedState(q0_, NULL, flags); - if (info->start == NULL) + start = WorkqToCachedState(q0_, NULL, flags); + if (start == NULL) return false; - if (info->start == DeadState) { - // Synchronize with "quick check" above. - info->first_byte.store(kFbNone, std::memory_order_release); - return true; - } - - if (info->start == FullMatchState) { - // Synchronize with "quick check" above. - info->first_byte.store(kFbNone, std::memory_order_release); // will be ignored - return true; - } - - // Even if we have a first_byte, we cannot use it when anchored and, - // less obviously, we cannot use it when we are going to need flags. - // This trick works only when there is a single byte that leads to a - // different state! - int first_byte = prog_->first_byte(); - if (first_byte == -1 || - params->anchored || - info->start->flag_ >> kFlagNeedShift != 0) - first_byte = kFbNone; - // Synchronize with "quick check" above. - info->first_byte.store(first_byte, std::memory_order_release); + info->start.store(start, std::memory_order_release); return true; } @@ -1733,9 +1725,9 @@ bool DFA::Search(const StringPiece& text, return false; if (params.start == FullMatchState) { if (run_forward == want_earliest_match) - *epp = text.begin(); + *epp = text.data(); else - *epp = text.end(); + *epp = text.data() + text.size(); return true; } bool ret = FastSearchLoop(¶ms); @@ -1796,17 +1788,17 @@ bool Prog::SearchDFA(const StringPiece& text, const StringPiece& const_context, *failed = false; StringPiece context = const_context; - if (context.begin() == NULL) + if (context.data() == NULL) context = text; - bool carat = anchor_start(); + bool caret = anchor_start(); bool dollar = anchor_end(); if (reversed_) { using std::swap; - swap(carat, dollar); + swap(caret, dollar); } - if (carat && context.begin() != text.begin()) + if (caret && BeginPtr(context) != BeginPtr(text)) return false; - if (dollar && context.end() != text.end()) + if (dollar && EndPtr(context) != EndPtr(text)) return false; // Handle full match by running an anchored longest match @@ -1839,11 +1831,15 @@ bool Prog::SearchDFA(const StringPiece& text, const StringPiece& const_context, bool matched = dfa->Search(text, context, anchored, want_earliest_match, !reversed_, failed, &ep, matches); - if (*failed) + if (*failed) { + hooks::GetDFASearchFailureHook()({ + // Nothing yet... + }); return false; + } if (!matched) return false; - if (endmatch && ep != (reversed_ ? text.begin() : text.end())) + if (endmatch && ep != (reversed_ ? text.data() : text.data() + text.size())) return false; // If caller cares, record the boundary of the match. @@ -1851,10 +1847,11 @@ bool Prog::SearchDFA(const StringPiece& text, const StringPiece& const_context, // as the beginning. if (match0) { if (reversed_) - *match0 = StringPiece(ep, static_cast(text.end() - ep)); + *match0 = + StringPiece(ep, static_cast(text.data() + text.size() - ep)); else *match0 = - StringPiece(text.begin(), static_cast(ep - text.begin())); + StringPiece(text.data(), static_cast(ep - text.data())); } return true; } @@ -1932,10 +1929,6 @@ int Prog::BuildEntireDFA(MatchKind kind, const DFAStateCallback& cb) { return GetDFA(kind)->BuildAllStates(cb); } -void Prog::TEST_dfa_should_bail_when_slow(bool b) { - dfa_should_bail_when_slow = b; -} - // Computes min and max for matching string. // Won't return strings bigger than maxlen. bool DFA::PossibleMatchRange(std::string* min, std::string* max, int maxlen) { @@ -2081,4 +2074,4 @@ bool Prog::PossibleMatchRange(std::string* min, std::string* max, int maxlen) { return GetDFA(kLongestMatch)->PossibleMatchRange(min, max, maxlen); } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/filtered_re2.cc b/src/duckdb/third_party/re2/re2/filtered_re2.cc index c9e97236..80a36f78 100644 --- a/src/duckdb/third_party/re2/re2/filtered_re2.cc +++ b/src/duckdb/third_party/re2/re2/filtered_re2.cc @@ -6,6 +6,7 @@ #include #include +#include #include "util/util.h" #include "util/logging.h" @@ -27,7 +28,22 @@ FilteredRE2::FilteredRE2(int min_atom_len) FilteredRE2::~FilteredRE2() { for (size_t i = 0; i < re2_vec_.size(); i++) delete re2_vec_[i]; - delete prefilter_tree_; +} + +FilteredRE2::FilteredRE2(FilteredRE2&& other) + : re2_vec_(std::move(other.re2_vec_)), + compiled_(other.compiled_), + prefilter_tree_(std::move(other.prefilter_tree_)) { + other.re2_vec_.clear(); + other.re2_vec_.shrink_to_fit(); + other.compiled_ = false; + other.prefilter_tree_.reset(new PrefilterTree()); +} + +FilteredRE2& FilteredRE2::operator=(FilteredRE2&& other) { + this->~FilteredRE2(); + (void) new (this) FilteredRE2(std::move(other)); + return *this; } RE2::ErrorCode FilteredRE2::Add(const StringPiece& pattern, @@ -38,7 +54,7 @@ RE2::ErrorCode FilteredRE2::Add(const StringPiece& pattern, if (!re->ok()) { if (options.log_errors()) { LOG(ERROR) << "Couldn't compile regular expression, skipping: " - << re << " due to error " << re->error(); + << pattern << " due to error " << re->error(); } delete re; } else { @@ -118,4 +134,4 @@ void FilteredRE2::PrintPrefilter(int regexpid) { prefilter_tree_->PrintPrefilter(regexpid); } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/filtered_re2.h b/src/duckdb/third_party/re2/re2/filtered_re2.h index d138f5a2..36f7c585 100644 --- a/src/duckdb/third_party/re2/re2/filtered_re2.h +++ b/src/duckdb/third_party/re2/re2/filtered_re2.h @@ -10,17 +10,18 @@ // number of regexps that need to be actually searched. // // By design, it does not include a string matching engine. This is to -// allow the user of the class to use their favorite string match +// allow the user of the class to use their favorite string matching // engine. The overall flow is: Add all the regexps using Add, then -// Compile the FilteredRE2. The compile returns strings that need to -// be matched. Note that all returned strings are lowercase. For -// applying regexps to a search text, the caller does the string -// matching using the strings returned. When doing the string match, -// note that the caller has to do that on lower cased version of the -// search text. Then call FirstMatch or AllMatches with a vector of -// indices of strings that were found in the text to get the actual -// regexp matches. - +// Compile the FilteredRE2. Compile returns strings that need to be +// matched. Note that the returned strings are lowercased and distinct. +// For applying regexps to a search text, the caller does the string +// matching using the returned strings. When doing the string match, +// note that the caller has to do that in a case-insensitive way or +// on a lowercased version of the search text. Then call FirstMatch +// or AllMatches with a vector of indices of strings that were found +// in the text to get the actual regexp matches. + +#include #include #include @@ -36,18 +37,25 @@ class FilteredRE2 { explicit FilteredRE2(int min_atom_len); ~FilteredRE2(); + // Not copyable. + FilteredRE2(const FilteredRE2&) = delete; + FilteredRE2& operator=(const FilteredRE2&) = delete; + // Movable. + FilteredRE2(FilteredRE2&& other); + FilteredRE2& operator=(FilteredRE2&& other); + // Uses RE2 constructor to create a RE2 object (re). Returns // re->error_code(). If error_code is other than NoError, then re is // deleted and not added to re2_vec_. RE2::ErrorCode Add(const StringPiece& pattern, const RE2::Options& options, - int *id); + int* id); // Prepares the regexps added by Add for filtering. Returns a set // of strings that the caller should check for in candidate texts. - // The returned strings are lowercased. When doing string matching, - // the search text should be lowercased first to find matching - // strings from the set of strings returned by Compile. Call after + // The returned strings are lowercased and distinct. When doing + // string matching, it should be performed in a case-insensitive + // way or the search text should be lowercased first. Call after // all Add calls are done. void Compile(std::vector* strings_to_match); @@ -80,11 +88,10 @@ class FilteredRE2 { // The number of regexps added. int NumRegexps() const { return static_cast(re2_vec_.size()); } - private: - - // Get the individual RE2 objects. Useful for testing. - RE2* GetRE2(int regexpid) const { return re2_vec_[regexpid]; } + // Get the individual RE2 objects. + const RE2& GetRE2(int regexpid) const { return *re2_vec_[regexpid]; } + private: // Print prefilter. void PrintPrefilter(int regexpid); @@ -99,12 +106,9 @@ class FilteredRE2 { bool compiled_; // An AND-OR tree of string atoms used for filtering regexps. - PrefilterTree* prefilter_tree_; - - FilteredRE2(const FilteredRE2&) = delete; - FilteredRE2& operator=(const FilteredRE2&) = delete; + std::unique_ptr prefilter_tree_; }; -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_FILTERED_RE2_H_ diff --git a/src/duckdb/third_party/re2/re2/mimics_pcre.cc b/src/duckdb/third_party/re2/re2/mimics_pcre.cc index fb4b642a..49a798bb 100644 --- a/src/duckdb/third_party/re2/re2/mimics_pcre.cc +++ b/src/duckdb/third_party/re2/re2/mimics_pcre.cc @@ -38,14 +38,21 @@ static bool CanBeEmptyString(Regexp *re); class PCREWalker : public Regexp::Walker { public: PCREWalker() {} - bool PostVisit(Regexp* re, bool parent_arg, bool pre_arg, bool* child_args, - int nchild_args); - bool ShortVisit(Regexp* re, bool a) { - // Should never be called: we use Walk not WalkExponential. - LOG(DFATAL) << "EmptyStringWalker::ShortVisit called"; + virtual bool PostVisit(Regexp* re, bool parent_arg, bool pre_arg, + bool* child_args, int nchild_args); + + virtual bool ShortVisit(Regexp* re, bool a) { + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + LOG(DFATAL) << "PCREWalker::ShortVisit called"; +#endif return a; } + + private: + PCREWalker(const PCREWalker&) = delete; + PCREWalker& operator=(const PCREWalker&) = delete; }; // Called after visiting each of re's children and accumulating @@ -114,13 +121,16 @@ bool Regexp::MimicsPCRE() { class EmptyStringWalker : public Regexp::Walker { public: - EmptyStringWalker() { } - bool PostVisit(Regexp* re, bool parent_arg, bool pre_arg, - bool* child_args, int nchild_args); + EmptyStringWalker() {} + + virtual bool PostVisit(Regexp* re, bool parent_arg, bool pre_arg, + bool* child_args, int nchild_args); - bool ShortVisit(Regexp* re, bool a) { - // Should never be called: we use Walk not WalkExponential. + virtual bool ShortVisit(Regexp* re, bool a) { + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION LOG(DFATAL) << "EmptyStringWalker::ShortVisit called"; +#endif return a; } @@ -184,4 +194,4 @@ static bool CanBeEmptyString(Regexp* re) { return w.Walk(re, true); } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/nfa.cc b/src/duckdb/third_party/re2/re2/nfa.cc index a03e1434..17f3e01e 100644 --- a/src/duckdb/third_party/re2/re2/nfa.cc +++ b/src/duckdb/third_party/re2/re2/nfa.cc @@ -27,17 +27,18 @@ #include #include #include +#include #include #include #include -#include "re2/prog.h" -#include "re2/regexp.h" #include "util/logging.h" -#include "util/pod_array.h" -#include "util/sparse_array.h" -#include "util/sparse_set.h" #include "util/strutil.h" +#include "re2/pod_array.h" +#include "re2/prog.h" +#include "re2/regexp.h" +#include "re2/sparse_array.h" +#include "re2/sparse_set.h" namespace duckdb_re2 { @@ -105,18 +106,21 @@ class NFA { // Returns text version of capture information, for debugging. std::string FormatCapture(const char** capture); - inline void CopyCapture(const char** dst, const char** src); + void CopyCapture(const char** dst, const char** src) { + memmove(dst, src, ncapture_*sizeof src[0]); + } Prog* prog_; // underlying program int start_; // start instruction in program int ncapture_; // number of submatches to track bool longest_; // whether searching for longest match bool endmatch_; // whether match must end at text.end() - const char* btext_; // beginning of text being matched (for FormatSubmatch) - const char* etext_; // end of text being matched (for endmatch_) + const char* btext_; // beginning of text (for FormatSubmatch) + const char* etext_; // end of text (for endmatch_) Threadq q0_, q1_; // pre-allocated for Search. PODArray stack_; // pre-allocated for AddToThreadq - Thread* free_threads_; // free list + std::deque arena_; // thread arena + Thread* freelist_; // thread freelist const char** match_; // best match so far bool matched_; // any match so far? @@ -139,31 +143,30 @@ NFA::NFA(Prog* prog) { prog_->inst_count(kInstEmptyWidth) + prog_->inst_count(kInstNop) + 1; // + 1 for start inst stack_ = PODArray(nstack); - free_threads_ = NULL; + freelist_ = NULL; match_ = NULL; matched_ = false; } NFA::~NFA() { delete[] match_; - Thread* next; - for (Thread* t = free_threads_; t; t = next) { - next = t->next; - delete[] t->capture; - delete t; - } + for (const Thread& t : arena_) + delete[] t.capture; } NFA::Thread* NFA::AllocThread() { - Thread* t = free_threads_; - if (t == NULL) { - t = new Thread; + Thread* t = freelist_; + if (t != NULL) { + freelist_ = t->next; t->ref = 1; - t->capture = new const char*[ncapture_]; + // We don't need to touch t->capture because + // the caller will immediately overwrite it. return t; } - free_threads_ = t->next; + arena_.emplace_back(); + t = &arena_.back(); t->ref = 1; + t->capture = new const char*[ncapture_]; return t; } @@ -174,21 +177,13 @@ NFA::Thread* NFA::Incref(Thread* t) { } void NFA::Decref(Thread* t) { - if (t == NULL) - return; + DCHECK(t != NULL); t->ref--; if (t->ref > 0) return; DCHECK_EQ(t->ref, 0); - t->next = free_threads_; - free_threads_ = t; -} - -void NFA::CopyCapture(const char** dst, const char** src) { - for (int i = 0; i < ncapture_; i+=2) { - dst[i] = src[i]; - dst[i+1] = src[i+1]; - } + t->next = freelist_; + freelist_ = t; } // Follows all empty arrows from id0 and enqueues all the states reached. @@ -288,6 +283,7 @@ void NFA::AddToThreadq(Threadq* q, int id0, int c, const StringPiece& context, // Save state; will pick up at next byte. t = Incref(t0); *tp = t; + if (ip->hint() == 0) break; a = {id+ip->hint(), NULL}; @@ -297,6 +293,7 @@ void NFA::AddToThreadq(Threadq* q, int id0, int c, const StringPiece& context, // Save state; will pick up at next byte. t = Incref(t0); *tp = t; + Next: if (ip->last()) break; @@ -362,8 +359,10 @@ int NFA::Step(Threadq* runq, Threadq* nextq, int c, const StringPiece& context, matched_ = true; Decref(t); - for (++i; i != runq->end(); ++i) - Decref(i->value()); + for (++i; i != runq->end(); ++i) { + if (i->value() != NULL) + Decref(i->value()); + } runq->clear(); if (ip->greedy(prog_)) return ip->out1(); @@ -372,10 +371,15 @@ int NFA::Step(Threadq* runq, Threadq* nextq, int c, const StringPiece& context, break; case kInstMatch: { - // Avoid invoking undefined behavior when p happens - // to be null - and p-1 would be meaningless anyway. - if (p == NULL) + // Avoid invoking undefined behavior (arithmetic on a null pointer) + // by storing p instead of p-1. (What would the latter even mean?!) + // This complements the special case in NFA::Search(). + if (p == NULL) { + CopyCapture(match_, t->capture); + match_[1] = p; + matched_ = true; break; + } if (endmatch_ && p-1 != etext_) break; @@ -401,8 +405,10 @@ int NFA::Step(Threadq* runq, Threadq* nextq, int c, const StringPiece& context, // worse than the one we just found: don't run the // rest of the current Threadq. Decref(t); - for (++i; i != runq->end(); ++i) - Decref(i->value()); + for (++i; i != runq->end(); ++i) { + if (i->value() != NULL) + Decref(i->value()); + } runq->clear(); return 0; } @@ -419,13 +425,14 @@ std::string NFA::FormatCapture(const char** capture) { std::string s; for (int i = 0; i < ncapture_; i+=2) { if (capture[i] == NULL) - StringAppendF(&s, "(?,?)"); + s += "(?,?)"; else if (capture[i+1] == NULL) - StringAppendF(&s, "(%d,?)", (int)(capture[i] - btext_)); + s += StringPrintf("(%td,?)", + capture[i] - btext_); else - StringAppendF(&s, "(%d,%d)", - (int)(capture[i] - btext_), - (int)(capture[i+1] - btext_)); + s += StringPrintf("(%td,%td)", + capture[i] - btext_, + capture[i+1] - btext_); } return s; } @@ -437,24 +444,23 @@ bool NFA::Search(const StringPiece& text, const StringPiece& const_context, return false; StringPiece context = const_context; - if (context.begin() == NULL) + if (context.data() == NULL) context = text; // Sanity check: make sure that text lies within context. - if (text.begin() < context.begin() || text.end() > context.end()) { + if (BeginPtr(text) < BeginPtr(context) || EndPtr(text) > EndPtr(context)) { LOG(DFATAL) << "context does not contain text"; return false; } - if (prog_->anchor_start() && context.begin() != text.begin()) + if (prog_->anchor_start() && BeginPtr(context) != BeginPtr(text)) return false; - if (prog_->anchor_end() && context.end() != text.end()) + if (prog_->anchor_end() && EndPtr(context) != EndPtr(text)) return false; anchored |= prog_->anchor_start(); if (prog_->anchor_end()) { longest = true; endmatch_ = true; - etext_ = text.end(); } if (nsubmatch < 0) { @@ -474,29 +480,31 @@ bool NFA::Search(const StringPiece& text, const StringPiece& const_context, } match_ = new const char*[ncapture_]; + memset(match_, 0, ncapture_*sizeof match_[0]); matched_ = false; // For debugging prints. - btext_ = context.begin(); + btext_ = context.data(); + // For convenience. + etext_ = text.data() + text.size(); // Set up search. Threadq* runq = &q0_; Threadq* nextq = &q1_; runq->clear(); nextq->clear(); - memset(&match_[0], 0, ncapture_*sizeof match_[0]); // Loop over the text, stepping the machine. - for (const char* p = text.begin();; p++) { + for (const char* p = text.data();; p++) { // This is a no-op the first time around the loop because runq is empty. - int id = Step(runq, nextq, p < text.end() ? p[0] & 0xFF : -1, context, p); + int id = Step(runq, nextq, p < etext_ ? p[0] & 0xFF : -1, context, p); DCHECK_EQ(runq->size(), 0); using std::swap; swap(nextq, runq); nextq->clear(); if (id != 0) { // We're done: full match ahead. - p = text.end(); + p = etext_; for (;;) { Prog::Inst* ip = prog_->inst(id); switch (ip->opcode()) { @@ -524,30 +532,28 @@ bool NFA::Search(const StringPiece& text, const StringPiece& const_context, break; } - if (p > text.end()) + if (p > etext_) break; // Start a new thread if there have not been any matches. // (No point in starting a new thread if there have been // matches, since it would be to the right of the match // we already found.) - if (!matched_ && (!anchored || p == text.begin())) { - // If there's a required first byte for an unanchored search - // and we're not in the middle of any possible matches, - // use memchr to search for the byte quickly. - int fb = prog_->first_byte(); + if (!matched_ && (!anchored || p == text.data())) { + // Try to use prefix accel (e.g. memchr) to skip ahead. + // The search must be unanchored and there must be zero + // possible matches already. if (!anchored && runq->size() == 0 && - fb >= 0 && p < text.end() && (p[0] & 0xFF) != fb) { - p = reinterpret_cast(memchr(p, fb, text.end() - p)); - if (p == NULL) { - p = text.end(); - } + p < etext_ && prog_->can_prefix_accel()) { + p = reinterpret_cast(prog_->PrefixAccel(p, etext_ - p)); + if (p == NULL) + p = etext_; } Thread* t = AllocThread(); CopyCapture(t->capture, match_); t->capture[0] = p; - AddToThreadq(runq, start_, p < text.end() ? p[0] & 0xFF : -1, context, p, + AddToThreadq(runq, start_, p < etext_ ? p[0] & 0xFF : -1, context, p, t); Decref(t); } @@ -556,10 +562,24 @@ bool NFA::Search(const StringPiece& text, const StringPiece& const_context, if (runq->size() == 0) { break; } + + // Avoid invoking undefined behavior (arithmetic on a null pointer) + // by simply not continuing the loop. + // This complements the special case in NFA::Step(). + if (p == NULL) { + (void) Step(runq, nextq, -1, context, p); + DCHECK_EQ(runq->size(), 0); + using std::swap; + swap(nextq, runq); + nextq->clear(); + break; + } } - for (Threadq::iterator i = runq->begin(); i != runq->end(); ++i) - Decref(i->value()); + for (Threadq::iterator i = runq->begin(); i != runq->end(); ++i) { + if (i->value() != NULL) + Decref(i->value()); + } if (matched_) { for (int i = 0; i < nsubmatch; i++) @@ -571,71 +591,11 @@ bool NFA::Search(const StringPiece& text, const StringPiece& const_context, return false; } -// Computes whether all successful matches have a common first byte, -// and if so, returns that byte. If not, returns -1. -int Prog::ComputeFirstByte() { - int b = -1; - SparseSet q(size()); - q.insert(start()); - for (SparseSet::iterator it = q.begin(); it != q.end(); ++it) { - int id = *it; - Prog::Inst* ip = inst(id); - switch (ip->opcode()) { - default: - LOG(DFATAL) << "unhandled " << ip->opcode() << " in ComputeFirstByte"; - break; - - case kInstMatch: - // The empty string matches: no first byte. - return -1; - - case kInstByteRange: - if (!ip->last()) - q.insert(id+1); - - // Must match only a single byte - if (ip->lo() != ip->hi()) - return -1; - if (ip->foldcase() && 'a' <= ip->lo() && ip->lo() <= 'z') - return -1; - // If we haven't seen any bytes yet, record it; - // otherwise must match the one we saw before. - if (b == -1) - b = ip->lo(); - else if (b != ip->lo()) - return -1; - break; - - case kInstNop: - case kInstCapture: - case kInstEmptyWidth: - if (!ip->last()) - q.insert(id+1); - - // Continue on. - // Ignore ip->empty() flags for kInstEmptyWidth - // in order to be as conservative as possible - // (assume all possible empty-width flags are true). - if (ip->out()) - q.insert(ip->out()); - break; - - case kInstAltMatch: - DCHECK(!ip->last()); - q.insert(id+1); - break; - - case kInstFail: - break; - } - } - return b; -} - bool Prog::SearchNFA(const StringPiece& text, const StringPiece& context, Anchor anchor, MatchKind kind, StringPiece* match, int nmatch) { + NFA nfa(this); StringPiece sp; if (kind == kFullMatch) { @@ -647,7 +607,7 @@ Prog::SearchNFA(const StringPiece& text, const StringPiece& context, } if (!nfa.Search(text, context, anchor == kAnchored, kind != kFirstMatch, match, nmatch)) return false; - if (kind == kFullMatch && match[0].end() != text.end()) + if (kind == kFullMatch && EndPtr(match[0]) != EndPtr(text)) return false; return true; } @@ -711,4 +671,4 @@ void Prog::Fanout(SparseArray* fanout) { } } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/onepass.cc b/src/duckdb/third_party/re2/re2/onepass.cc index b18eb4e5..2290e8c8 100644 --- a/src/duckdb/third_party/re2/re2/onepass.cc +++ b/src/duckdb/third_party/re2/re2/onepass.cc @@ -59,16 +59,16 @@ #include "util/util.h" #include "util/logging.h" -#include "util/pod_array.h" -#include "util/sparse_set.h" #include "util/strutil.h" #include "util/utf.h" +#include "re2/pod_array.h" #include "re2/prog.h" +#include "re2/sparse_set.h" #include "re2/stringpiece.h" // Silence "zero-sized array in struct/union" warning for OneState::action. #ifdef _MSC_VER -//#pragma warning(disable: 4200) +#pragma warning(disable: 4200) #endif namespace duckdb_re2 { @@ -143,7 +143,7 @@ namespace duckdb_re2 { // the memory footprint.) struct OneState { uint32_t matchcond; // conditions to match right now. - uint32_t action[1]; + uint32_t action[]; }; // The uint32_t conditions in the action are a combination of @@ -233,11 +233,11 @@ bool Prog::SearchOnePass(const StringPiece& text, matchcap[i] = NULL; StringPiece context = const_context; - if (context.begin() == NULL) + if (context.data() == NULL) context = text; - if (anchor_start() && context.begin() != text.begin()) + if (anchor_start() && BeginPtr(context) != BeginPtr(text)) return false; - if (anchor_end() && context.end() != text.end()) + if (anchor_end() && EndPtr(context) != EndPtr(text)) return false; if (anchor_end()) kind = kFullMatch; @@ -247,8 +247,8 @@ bool Prog::SearchOnePass(const StringPiece& text, // start() is always mapped to the zeroth OneState. OneState* state = IndexToNode(nodes, statesize, 0); uint8_t* bytemap = bytemap_; - const char* bp = text.begin(); - const char* ep = text.end(); + const char* bp = text.data(); + const char* ep = text.data() + text.size(); const char* p; bool matched = false; matchcap[0] = bp; @@ -563,6 +563,7 @@ bool Prog::IsOnePass() { } } } + dfa_mem_ -= nalloc*statesize; onepass_nodes_ = PODArray(nalloc*statesize); memmove(onepass_nodes_.data(), nodes.data(), nalloc*statesize); @@ -572,4 +573,4 @@ bool Prog::IsOnePass() { return false; } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/parse.cc b/src/duckdb/third_party/re2/re2/parse.cc index a9ed929e..5b4ae3db 100644 --- a/src/duckdb/third_party/re2/re2/parse.cc +++ b/src/duckdb/third_party/re2/re2/parse.cc @@ -27,29 +27,29 @@ #include "util/util.h" #include "util/logging.h" -#include "util/pod_array.h" #include "util/strutil.h" #include "util/utf.h" +#include "re2/pod_array.h" #include "re2/regexp.h" #include "re2/stringpiece.h" #include "re2/unicode_casefold.h" #include "re2/unicode_groups.h" #include "re2/walker-inl.h" -// #if defined(RE2_USE_ICU) -// #include "unicode/uniset.h" -// #include "unicode/unistr.h" -// #include "unicode/utypes.h" -// #endif +#if defined(RE2_USE_ICU) +//#include "unicode/uniset.h" +//#include "unicode/unistr.h" +//#include "unicode/utypes.h" +#endif namespace duckdb_re2 { -// Reduce the maximum repeat count by an order of magnitude when fuzzing. -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -static const int kMaxRepeat = 100; -#else -static const int kMaxRepeat = 1000; -#endif +// Controls the maximum repeat count permitted by the parser. +static int maximum_repeat_count = 1000; + +void Regexp::FUZZING_ONLY_set_maximum_repeat_count(int i) { + maximum_repeat_count = i; +} // Regular expression parse state. // The list of parsed regexps so far is maintained as a vector of @@ -93,7 +93,7 @@ class Regexp::ParseState { bool PushSimpleOp(RegexpOp op); // Pushes a ^ onto the stack. - bool PushCarat(); + bool PushCaret(); // Pushes a \b (word == true) or \B (word == false) onto the stack. bool PushWordBoundary(bool word); @@ -209,7 +209,7 @@ Regexp::ParseState::~ParseState() { next = re->down_; re->down_ = NULL; if (re->op() == kLeftParen) - delete re->capture_.name_; + delete re->arguments.capture.name_; re->Decref(); } } @@ -222,10 +222,10 @@ Regexp* Regexp::ParseState::FinishRegexp(Regexp* re) { return NULL; re->down_ = NULL; - if (re->op_ == kRegexpCharClass && re->char_class_.ccb_ != NULL) { - CharClassBuilder* ccb = re->char_class_.ccb_; - re->char_class_.ccb_ = NULL; - re->char_class_.cc_ = ccb->GetCharClass(); + if (re->op_ == kRegexpCharClass && re->arguments.char_class.ccb_ != NULL) { + CharClassBuilder* ccb = re->arguments.char_class.ccb_; + re->arguments.char_class.ccb_ = NULL; + re->arguments.char_class.cc_ = ccb->GetCharClass(); delete ccb; } @@ -242,20 +242,19 @@ bool Regexp::ParseState::PushRegexp(Regexp* re) { // single characters (e.g., [.] instead of \.), and some // analysis does better with fewer character classes. // Similarly, [Aa] can be rewritten as a literal A with ASCII case folding. - auto ccb = re->char_class_.ccb_; - if (re->op_ == kRegexpCharClass && ccb != NULL) { - ccb->RemoveAbove(rune_max_); - if (ccb->size() == 1) { - Rune r = ccb->begin()->lo; + if (re->op_ == kRegexpCharClass && re->arguments.char_class.ccb_ != NULL) { + re->arguments.char_class.ccb_->RemoveAbove(rune_max_); + if (re->arguments.char_class.ccb_->size() == 1) { + Rune r = re->arguments.char_class.ccb_->begin()->lo; re->Decref(); re = new Regexp(kRegexpLiteral, flags_); - re->rune_ = r; - } else if (ccb->size() == 2) { - Rune r = ccb->begin()->lo; - if ('A' <= r && r <= 'Z' && ccb->Contains(r + 'a' - 'A')) { + re->arguments.rune_ = r; + } else if (re->arguments.char_class.ccb_->size() == 2) { + Rune r = re->arguments.char_class.ccb_->begin()->lo; + if ('A' <= r && r <= 'Z' && re->arguments.char_class.ccb_->Contains(r + 'a' - 'A')) { re->Decref(); re = new Regexp(kRegexpLiteral, flags_ | FoldCase); - re->rune_ = r + 'a' - 'A'; + re->arguments.rune_ = r + 'a' - 'A'; } } } @@ -399,11 +398,11 @@ bool Regexp::ParseState::PushLiteral(Rune r) { // Do case folding if needed. if ((flags_ & FoldCase) && CycleFoldRune(r) != r) { Regexp* re = new Regexp(kRegexpCharClass, flags_ & ~FoldCase); - re->char_class_.ccb_ = new CharClassBuilder; + re->arguments.char_class.ccb_ = new CharClassBuilder; Rune r1 = r; do { if (!(flags_ & NeverNL) || r != '\n') { - re->char_class_.ccb_->AddRange(r, r); + re->arguments.char_class.ccb_->AddRange(r, r); } r = CycleFoldRune(r); } while (r != r1); @@ -419,12 +418,12 @@ bool Regexp::ParseState::PushLiteral(Rune r) { return true; Regexp* re = new Regexp(kRegexpLiteral, flags_); - re->rune_ = r; + re->arguments.rune_ = r; return PushRegexp(re); } // Pushes a ^ onto the stack. -bool Regexp::ParseState::PushCarat() { +bool Regexp::ParseState::PushCaret() { if (flags_ & OneLine) { return PushSimpleOp(kRegexpBeginText); } @@ -458,9 +457,9 @@ bool Regexp::ParseState::PushDot() { return PushSimpleOp(kRegexpAnyChar); // Rewrite . into [^\n] Regexp* re = new Regexp(kRegexpCharClass, flags_ & ~FoldCase); - re->char_class_.ccb_ = new CharClassBuilder; - re->char_class_.ccb_->AddRange(0, '\n' - 1); - re->char_class_.ccb_->AddRange('\n' + 1, rune_max_); + re->arguments.char_class.ccb_ = new CharClassBuilder; + re->arguments.char_class.ccb_->AddRange(0, '\n' - 1); + re->arguments.char_class.ccb_->AddRange('\n' + 1, rune_max_); return PushRegexp(re); } @@ -557,9 +556,10 @@ int RepetitionWalker::PostVisit(Regexp* re, int parent_arg, int pre_arg, } int RepetitionWalker::ShortVisit(Regexp* re, int parent_arg) { - // This should never be called, since we use Walk and not - // WalkExponential. + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION LOG(DFATAL) << "RepetitionWalker::ShortVisit called"; +#endif return 0; } @@ -568,7 +568,9 @@ int RepetitionWalker::ShortVisit(Regexp* re, int parent_arg) { bool Regexp::ParseState::PushRepetition(int min, int max, const StringPiece& s, bool nongreedy) { - if ((max != -1 && max < min) || min > kMaxRepeat || max > kMaxRepeat) { + if ((max != -1 && max < min) || + min > maximum_repeat_count || + max > maximum_repeat_count) { status_->set_code(kRegexpRepeatSize); status_->set_error_arg(s); return false; @@ -582,8 +584,8 @@ bool Regexp::ParseState::PushRepetition(int min, int max, if (nongreedy) fl = fl ^ NonGreedy; Regexp* re = new Regexp(kRegexpRepeat, fl); - re->repeat_.min_ = min; - re->repeat_.max_ = max; + re->arguments.repeat.min_ = min; + re->arguments.repeat.max_ = max; re->AllocSub(1); re->down_ = stacktop_->down_; re->sub()[0] = FinishRegexp(stacktop_); @@ -591,7 +593,7 @@ bool Regexp::ParseState::PushRepetition(int min, int max, stacktop_ = re; if (min >= 2 || max >= 2) { RepetitionWalker w; - if (w.Walk(stacktop_, kMaxRepeat) == 0) { + if (w.Walk(stacktop_, maximum_repeat_count) == 0) { status_->set_code(kRegexpRepeatSize); status_->set_error_arg(s); return false; @@ -609,16 +611,16 @@ bool Regexp::ParseState::IsMarker(RegexpOp op) { // Pushes a marker onto the stack. bool Regexp::ParseState::DoLeftParen(const StringPiece& name) { Regexp* re = new Regexp(kLeftParen, flags_); - re->capture_.cap_ = ++ncap_; + re->arguments.capture.cap_ = ++ncap_; if (name.data() != NULL) - re->capture_.name_ = new std::string(name); + re->arguments.capture.name_ = new std::string(name); return PushRegexp(re); } // Pushes a non-capturing marker onto the stack. bool Regexp::ParseState::DoLeftParenNoCapture() { Regexp* re = new Regexp(kLeftParen, flags_); - re->capture_.cap_ = -1; + re->arguments.capture.cap_ = -1; return PushRegexp(re); } @@ -685,7 +687,7 @@ bool Regexp::ParseState::DoRightParen() { if ((r1 = stacktop_) == NULL || (r2 = r1->down_) == NULL || r2->op() != kLeftParen) { - status_->set_code(kRegexpMissingParen); + status_->set_code(kRegexpUnexpectedParen); status_->set_error_arg(whole_regexp_); return false; } @@ -698,7 +700,7 @@ bool Regexp::ParseState::DoRightParen() { flags_ = re->parse_flags(); // Rewrite LeftParen as capture if needed. - if (re->capture_.cap_ > 0) { + if (re->arguments.capture.cap_ > 0) { re->op_ = kRegexpCapture; // re->cap_ is already set re->AllocSub(1); @@ -781,12 +783,12 @@ Rune* Regexp::LeadingString(Regexp* re, int *nrune, if (re->op() == kRegexpLiteral) { *nrune = 1; - return &re->rune_; + return &re->arguments.rune_; } if (re->op() == kRegexpLiteralString) { - *nrune = re->literal_string_.nrunes_; - return re->literal_string_.runes_; + *nrune = re->arguments.literal_string.nrunes_; + return re->arguments.literal_string.runes_; } *nrune = 0; @@ -802,7 +804,7 @@ void Regexp::RemoveLeadingString(Regexp* re, int n) { // limit on the size of a concatenation, so we should never // see more than two here. Regexp* stk[4]; - int d = 0; + size_t d = 0; while (re->op() == kRegexpConcat) { if (d < arraysize(stk)) stk[d++] = re; @@ -811,30 +813,30 @@ void Regexp::RemoveLeadingString(Regexp* re, int n) { // Remove leading string from re. if (re->op() == kRegexpLiteral) { - re->rune_ = 0; + re->arguments.rune_ = 0; re->op_ = kRegexpEmptyMatch; } else if (re->op() == kRegexpLiteralString) { - if (n >= re->literal_string_.nrunes_) { - delete[] re->literal_string_.runes_; - re->literal_string_.runes_ = NULL; - re->literal_string_.nrunes_ = 0; + if (n >= re->arguments.literal_string.nrunes_) { + delete[] re->arguments.literal_string.runes_; + re->arguments.literal_string.runes_ = NULL; + re->arguments.literal_string.nrunes_ = 0; re->op_ = kRegexpEmptyMatch; - } else if (n == re->literal_string_.nrunes_ - 1) { - Rune rune = re->literal_string_.runes_[re->literal_string_.nrunes_ - 1]; - delete[] re->literal_string_.runes_; - re->literal_string_.runes_ = NULL; - re->literal_string_.nrunes_ = 0; - re->rune_ = rune; + } else if (n == re->arguments.literal_string.nrunes_ - 1) { + Rune rune = re->arguments.literal_string.runes_[re->arguments.literal_string.nrunes_ - 1]; + delete[] re->arguments.literal_string.runes_; + re->arguments.literal_string.runes_ = NULL; + re->arguments.literal_string.nrunes_ = 0; + re->arguments.rune_ = rune; re->op_ = kRegexpLiteral; } else { - re->literal_string_.nrunes_ -= n; - memmove(re->literal_string_.runes_, re->literal_string_.runes_ + n, re->literal_string_.nrunes_ * sizeof re->literal_string_.runes_[0]); + re->arguments.literal_string.nrunes_ -= n; + memmove(re->arguments.literal_string.runes_, re->arguments.literal_string.runes_ + n, re->arguments.literal_string.nrunes_ * sizeof re->arguments.literal_string.runes_[0]); } } // If re is now empty, concatenations might simplify too. - while (d-- > 0) { - re = stk[d]; + while (d > 0) { + re = stk[--d]; Regexp** sub = re->sub(); if (sub[0]->op() == kRegexpEmptyMatch) { sub[0]->Decref(); @@ -1288,28 +1290,28 @@ bool Regexp::ParseState::MaybeConcatString(int r, ParseFlags flags) { if (re2->op_ == kRegexpLiteral) { // convert into string - Rune rune = re2->rune_; + Rune rune = re2->arguments.rune_; re2->op_ = kRegexpLiteralString; - re2->literal_string_.nrunes_ = 0; - re2->literal_string_.runes_ = NULL; + re2->arguments.literal_string.nrunes_ = 0; + re2->arguments.literal_string.runes_ = NULL; re2->AddRuneToString(rune); } // push re1 into re2. if (re1->op_ == kRegexpLiteral) { - re2->AddRuneToString(re1->rune_); + re2->AddRuneToString(re1->arguments.rune_); } else { - for (int i = 0; i < re1->literal_string_.nrunes_; i++) - re2->AddRuneToString(re1->literal_string_.runes_[i]); - re1->literal_string_.nrunes_ = 0; - delete[] re1->literal_string_.runes_; - re1->literal_string_.runes_ = NULL; + for (int i = 0; i < re1->arguments.literal_string.nrunes_; i++) + re2->AddRuneToString(re1->arguments.literal_string.runes_[i]); + re1->arguments.literal_string.nrunes_ = 0; + delete[] re1->arguments.literal_string.runes_; + re1->arguments.literal_string.runes_ = NULL; } // reuse re1 if possible if (r >= 0) { re1->op_ = kRegexpLiteral; - re1->rune_ = r; + re1->arguments.rune_ = r; re1->parse_flags_ = static_cast(flags); return true; } @@ -1324,14 +1326,14 @@ bool Regexp::ParseState::MaybeConcatString(int r, ParseFlags flags) { // Parses a decimal integer, storing it in *np. // Sets *s to span the remainder of the string. static bool ParseInteger(StringPiece* s, int* np) { - if (s->size() == 0 || !isdigit((*s)[0] & 0xFF)) + if (s->empty() || !isdigit((*s)[0] & 0xFF)) return false; // Disallow leading zeros. if (s->size() >= 2 && (*s)[0] == '0' && isdigit((*s)[1] & 0xFF)) return false; int n = 0; int c; - while (s->size() > 0 && isdigit(c = (*s)[0] & 0xFF)) { + while (!s->empty() && isdigit(c = (*s)[0] & 0xFF)) { // Avoid overflow. if (n >= 100000000) return false; @@ -1353,16 +1355,16 @@ static bool ParseInteger(StringPiece* s, int* np) { // s must NOT be edited unless MaybeParseRepetition returns true. static bool MaybeParseRepetition(StringPiece* sp, int* lo, int* hi) { StringPiece s = *sp; - if (s.size() == 0 || s[0] != '{') + if (s.empty() || s[0] != '{') return false; s.remove_prefix(1); // '{' if (!ParseInteger(&s, lo)) return false; - if (s.size() == 0) + if (s.empty()) return false; if (s[0] == ',') { s.remove_prefix(1); // ',' - if (s.size() == 0) + if (s.empty()) return false; if (s[0] == '}') { // {2,} means at least 2 @@ -1376,7 +1378,7 @@ static bool MaybeParseRepetition(StringPiece* sp, int* lo, int* hi) { // {2} means exactly two *hi = *lo; } - if (s.size() == 0 || s[0] != '}') + if (s.empty() || s[0] != '}') return false; s.remove_prefix(1); // '}' *sp = s; @@ -1407,17 +1409,19 @@ static int StringPieceToRune(Rune *r, StringPiece *sp, RegexpStatus* status) { } } - status->set_code(kRegexpBadUTF8); - status->set_error_arg(StringPiece()); + if (status != NULL) { + status->set_code(kRegexpBadUTF8); + status->set_error_arg(StringPiece()); + } return -1; } -// Return whether name is valid UTF-8. -// If not, set status to kRegexpBadUTF8. +// Returns whether name is valid UTF-8. +// If not, sets status to kRegexpBadUTF8. static bool IsValidUTF8(const StringPiece& s, RegexpStatus* status) { StringPiece t = s; Rune r; - while (t.size() > 0) { + while (!t.empty()) { if (StringPieceToRune(&r, &t, status) < 0) return false; } @@ -1448,14 +1452,14 @@ static int UnHex(int c) { // Sets *rp to the named character. static bool ParseEscape(StringPiece* s, Rune* rp, RegexpStatus* status, int rune_max) { - const char* begin = s->begin(); - if (s->size() < 1 || (*s)[0] != '\\') { + const char* begin = s->data(); + if (s->empty() || (*s)[0] != '\\') { // Should not happen - caller always checks. status->set_code(kRegexpInternalError); status->set_error_arg(StringPiece()); return false; } - if (s->size() < 2) { + if (s->size() == 1) { status->set_code(kRegexpTrailingBackslash); status->set_error_arg(StringPiece()); return false; @@ -1486,16 +1490,16 @@ static bool ParseEscape(StringPiece* s, Rune* rp, case '6': case '7': // Single non-zero octal digit is a backreference; not supported. - if (s->size() == 0 || (*s)[0] < '0' || (*s)[0] > '7') + if (s->empty() || (*s)[0] < '0' || (*s)[0] > '7') goto BadEscape; FALLTHROUGH_INTENDED; case '0': // consume up to three octal digits; already have one. code = c - '0'; - if (s->size() > 0 && '0' <= (c = (*s)[0]) && c <= '7') { + if (!s->empty() && '0' <= (c = (*s)[0]) && c <= '7') { code = code * 8 + c - '0'; s->remove_prefix(1); // digit - if (s->size() > 0) { + if (!s->empty()) { c = (*s)[0]; if ('0' <= c && c <= '7') { code = code * 8 + c - '0'; @@ -1510,7 +1514,7 @@ static bool ParseEscape(StringPiece* s, Rune* rp, // Hexadecimal escapes case 'x': - if (s->size() == 0) + if (s->empty()) goto BadEscape; if (StringPieceToRune(&c, s, status) < 0) return false; @@ -1530,7 +1534,7 @@ static bool ParseEscape(StringPiece* s, Rune* rp, code = code * 16 + UnHex(c); if (code > rune_max) goto BadEscape; - if (s->size() == 0) + if (s->empty()) goto BadEscape; if (StringPieceToRune(&c, s, status) < 0) return false; @@ -1541,7 +1545,7 @@ static bool ParseEscape(StringPiece* s, Rune* rp, return true; } // Easy case: two hex digits. - if (s->size() == 0) + if (s->empty()) goto BadEscape; if (StringPieceToRune(&c1, s, status) < 0) return false; @@ -1585,13 +1589,11 @@ static bool ParseEscape(StringPiece* s, Rune* rp, // return true; } - LOG(DFATAL) << "Not reached in ParseEscape."; - BadEscape: // Unrecognized escape sequence. status->set_code(kRegexpBadEscape); status->set_error_arg( - StringPiece(begin, static_cast(s->begin() - begin))); + StringPiece(begin, static_cast(s->data() - begin))); return false; } @@ -1711,7 +1713,7 @@ const UGroup* MaybeParsePerlCCEscape(StringPiece* s, Regexp::ParseFlags parse_fl return NULL; // Could use StringPieceToRune, but there aren't // any non-ASCII Perl group names. - StringPiece name(s->begin(), 2); + StringPiece name(s->data(), 2); const UGroup *g = LookupPerlGroup(name); if (g == NULL) return NULL; @@ -1751,8 +1753,8 @@ ParseStatus ParseUnicodeGroup(StringPiece* s, Regexp::ParseFlags parse_flags, return kParseError; if (c != '{') { // Name is the bit of string we just skipped over for c. - const char* p = seq.begin() + 2; - name = StringPiece(p, static_cast(s->begin() - p)); + const char* p = seq.data() + 2; + name = StringPiece(p, static_cast(s->data() - p)); } else { // Name is in braces. Look for closing } size_t end = s->find('}', 0); @@ -1763,16 +1765,16 @@ ParseStatus ParseUnicodeGroup(StringPiece* s, Regexp::ParseFlags parse_flags, status->set_error_arg(seq); return kParseError; } - name = StringPiece(s->begin(), end); // without '}' + name = StringPiece(s->data(), end); // without '}' s->remove_prefix(end + 1); // with '}' if (!IsValidUTF8(name, status)) return kParseError; } // Chop seq where s now begins. - seq = StringPiece(seq.begin(), static_cast(s->begin() - seq.begin())); + seq = StringPiece(seq.data(), static_cast(s->data() - seq.data())); - if (name.size() > 0 && name[0] == '^') { + if (!name.empty() && name[0] == '^') { sign = -sign; name.remove_prefix(1); // '^' } @@ -1802,14 +1804,13 @@ ParseStatus ParseUnicodeGroup(StringPiece* s, Regexp::ParseFlags parse_flags, // Convert the UnicodeSet to a URange32 and UGroup that we can add. int nr = uset.getRangeCount(); - URange32* r = new URange32[nr]; + PODArray r(nr); for (int i = 0; i < nr; i++) { r[i].lo = uset.getRangeStart(i); r[i].hi = uset.getRangeEnd(i); } - UGroup g = {"", +1, 0, 0, r, nr}; + UGroup g = {"", +1, 0, 0, r.data(), nr}; AddUGroup(cc, &g, sign, parse_flags); - delete[] r; #endif return kParseOk; @@ -1859,7 +1860,7 @@ static ParseStatus ParseCCName(StringPiece* s, Regexp::ParseFlags parse_flags, bool Regexp::ParseState::ParseCCCharacter(StringPiece* s, Rune *rp, const StringPiece& whole_class, RegexpStatus* status) { - if (s->size() == 0) { + if (s->empty()) { status->set_code(kRegexpMissingBracket); status->set_error_arg(whole_class); return false; @@ -1867,7 +1868,7 @@ bool Regexp::ParseState::ParseCCCharacter(StringPiece* s, Rune *rp, // Allow regular escape sequences even though // many need not be escaped in this context. - if (s->size() >= 1 && (*s)[0] == '\\') + if ((*s)[0] == '\\') return ParseEscape(s, rp, status, rune_max_); // Otherwise take the next rune. @@ -1909,7 +1910,7 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s, Regexp** out_re, RegexpStatus* status) { StringPiece whole_class = *s; - if (s->size() == 0 || (*s)[0] != '[') { + if (s->empty() || (*s)[0] != '[') { // Caller checked this. status->set_code(kRegexpInternalError); status->set_error_arg(StringPiece()); @@ -1917,19 +1918,19 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s, } bool negated = false; Regexp* re = new Regexp(kRegexpCharClass, flags_ & ~FoldCase); - re->char_class_.ccb_ = new CharClassBuilder; + re->arguments.char_class.ccb_ = new CharClassBuilder; s->remove_prefix(1); // '[' - if (s->size() > 0 && (*s)[0] == '^') { + if (!s->empty() && (*s)[0] == '^') { s->remove_prefix(1); // '^' negated = true; if (!(flags_ & ClassNL) || (flags_ & NeverNL)) { // If NL can't match implicitly, then pretend // negated classes include a leading \n. - re->char_class_.ccb_->AddRange('\n', '\n'); + re->arguments.char_class.ccb_->AddRange('\n', '\n'); } } bool first = true; // ] is okay as first char in class - while (s->size() > 0 && ((*s)[0] != ']' || first)) { + while (!s->empty() && ((*s)[0] != ']' || first)) { // - is only okay unescaped as first or last in class. // Except that Perl allows - anywhere. if ((*s)[0] == '-' && !first && !(flags_&PerlX) && @@ -1951,7 +1952,7 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s, // Look for [:alnum:] etc. if (s->size() > 2 && (*s)[0] == '[' && (*s)[1] == ':') { - switch (ParseCCName(s, flags_, re->char_class_.ccb_, status)) { + switch (ParseCCName(s, flags_, re->arguments.char_class.ccb_, status)) { case kParseOk: continue; case kParseError: @@ -1966,7 +1967,7 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s, if (s->size() > 2 && (*s)[0] == '\\' && ((*s)[1] == 'p' || (*s)[1] == 'P')) { - switch (ParseUnicodeGroup(s, flags_, re->char_class_.ccb_, status)) { + switch (ParseUnicodeGroup(s, flags_, re->arguments.char_class.ccb_, status)) { case kParseOk: continue; case kParseError: @@ -1980,7 +1981,7 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s, // Look for Perl character class symbols (extension). const UGroup *g = MaybeParsePerlCCEscape(s, flags_); if (g != NULL) { - AddUGroup(re->char_class_.ccb_, g, g->sign, flags_); + AddUGroup(re->arguments.char_class.ccb_, g, g->sign, flags_); continue; } @@ -1995,9 +1996,9 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s, // Regexp::ClassNL is set. In an explicit range or singleton // like we just parsed, we do not filter \n out, so set ClassNL // in the flags. - re->char_class_.ccb_->AddRangeFlags(rr.lo, rr.hi, flags_ | Regexp::ClassNL); + re->arguments.char_class.ccb_->AddRangeFlags(rr.lo, rr.hi, flags_ | Regexp::ClassNL); } - if (s->size() == 0) { + if (s->empty()) { status->set_code(kRegexpMissingBracket); status->set_error_arg(whole_class); re->Decref(); @@ -2006,25 +2007,40 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s, s->remove_prefix(1); // ']' if (negated) - re->char_class_.ccb_->Negate(); + re->arguments.char_class.ccb_->Negate(); *out_re = re; return true; } -// Is this a valid capture name? [A-Za-z0-9_]+ -// PCRE limits names to 32 bytes. -// Python rejects names starting with digits. -// We don't enforce either of those. +// Returns whether name is a valid capture name. static bool IsValidCaptureName(const StringPiece& name) { - if (name.size() == 0) + if (name.empty()) return false; - for (size_t i = 0; i < name.size(); i++) { - int c = name[i]; - if (('0' <= c && c <= '9') || - ('a' <= c && c <= 'z') || - ('A' <= c && c <= 'Z') || - c == '_') + + // Historically, we effectively used [0-9A-Za-z_]+ to validate; that + // followed Python 2 except for not restricting the first character. + // As of Python 3, Unicode characters beyond ASCII are also allowed; + // accordingly, we permit the Lu, Ll, Lt, Lm, Lo, Nl, Mn, Mc, Nd and + // Pc categories, but again without restricting the first character. + // Also, Unicode normalization (e.g. NFKC) isn't performed: Python 3 + // performs it for identifiers, but seemingly not for capture names; + // if they start doing that for capture names, we won't follow suit. + static const CharClass* const cc = []() { + CharClassBuilder ccb; + for (StringPiece group : + {"Lu", "Ll", "Lt", "Lm", "Lo", "Nl", "Mn", "Mc", "Nd", "Pc"}) + AddUGroup(&ccb, LookupGroup(group, unicode_groups, num_unicode_groups), + +1, Regexp::NoParseFlags); + return ccb.GetCharClass(); + }(); + + StringPiece t = name; + Rune r; + while (!t.empty()) { + if (StringPieceToRune(&r, &t, NULL) < 0) + return false; + if (cc->Contains(r)) continue; return false; } @@ -2041,8 +2057,8 @@ bool Regexp::ParseState::ParsePerlFlags(StringPiece* s) { // Caller is supposed to check this. if (!(flags_ & PerlX) || t.size() < 2 || t[0] != '(' || t[1] != '?') { - LOG(DFATAL) << "Bad call to ParseState::ParsePerlFlags"; status_->set_code(kRegexpInternalError); + LOG(DFATAL) << "Bad call to ParseState::ParsePerlFlags"; return false; } @@ -2075,8 +2091,8 @@ bool Regexp::ParseState::ParsePerlFlags(StringPiece* s) { } // t is "P...", t[end] == '>' - StringPiece capture(t.begin()-2, end+3); // "(?P" - StringPiece name(t.begin()+2, end-2); // "name" + StringPiece capture(t.data()-2, end+3); // "(?P" + StringPiece name(t.data()+2, end-2); // "name" if (!IsValidUTF8(name, status_)) return false; if (!IsValidCaptureName(name)) { @@ -2090,7 +2106,8 @@ bool Regexp::ParseState::ParsePerlFlags(StringPiece* s) { return false; } - s->remove_prefix(static_cast(capture.end() - s->begin())); + s->remove_prefix( + static_cast(capture.data() + capture.size() - s->data())); return true; } @@ -2099,7 +2116,7 @@ bool Regexp::ParseState::ParsePerlFlags(StringPiece* s) { int nflags = flags_; Rune c; for (bool done = false; !done; ) { - if (t.size() == 0) + if (t.empty()) goto BadPerlOp; if (StringPieceToRune(&c, &t, status_) < 0) return false; @@ -2174,7 +2191,7 @@ bool Regexp::ParseState::ParsePerlFlags(StringPiece* s) { BadPerlOp: status_->set_code(kRegexpBadPerlOp); status_->set_error_arg( - StringPiece(s->begin(), static_cast(t.begin() - s->begin()))); + StringPiece(s->data(), static_cast(t.data() - s->data()))); return false; } @@ -2217,7 +2234,7 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, if (global_flags & Literal) { // Special parse loop for literal string. - while (t.size() > 0) { + while (!t.empty()) { Rune r; if (StringPieceToRune(&r, &t, status) < 0) return NULL; @@ -2228,7 +2245,7 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, } StringPiece lastunary = StringPiece(); - while (t.size() > 0) { + while (!t.empty()) { StringPiece isunary = StringPiece(); switch (t[0]) { default: { @@ -2271,7 +2288,7 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, break; case '^': // Beginning of line. - if (!ps.PushCarat()) + if (!ps.PushCaret()) return NULL; t.remove_prefix(1); // '^' break; @@ -2312,18 +2329,18 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, bool nongreedy = false; t.remove_prefix(1); // '*' or '+' or '?' if (ps.flags() & PerlX) { - if (t.size() > 0 && t[0] == '?') { + if (!t.empty() && t[0] == '?') { nongreedy = true; t.remove_prefix(1); // '?' } - if (lastunary.size() > 0) { + if (!lastunary.empty()) { // In Perl it is not allowed to stack repetition operators: // a** is a syntax error, not a double-star. // (and a++ means something else entirely, which we don't support!) status->set_code(kRegexpRepeatOp); status->set_error_arg(StringPiece( - lastunary.begin(), - static_cast(t.begin() - lastunary.begin()))); + lastunary.data(), + static_cast(t.data() - lastunary.data()))); return NULL; } } @@ -2347,16 +2364,16 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, } bool nongreedy = false; if (ps.flags() & PerlX) { - if (t.size() > 0 && t[0] == '?') { + if (!t.empty() && t[0] == '?') { nongreedy = true; t.remove_prefix(1); // '?' } - if (lastunary.size() > 0) { + if (!lastunary.empty()) { // Not allowed to stack repetition operators. status->set_code(kRegexpRepeatOp); status->set_error_arg(StringPiece( - lastunary.begin(), - static_cast(t.begin() - lastunary.begin()))); + lastunary.data(), + static_cast(t.data() - lastunary.data()))); return NULL; } } @@ -2405,7 +2422,7 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, if (t[1] == 'Q') { // \Q ... \E: the ... is always literals t.remove_prefix(2); // '\\', 'Q' - while (t.size() > 0) { + while (!t.empty()) { if (t.size() >= 2 && t[0] == '\\' && t[1] == 'E') { t.remove_prefix(2); // '\\', 'E' break; @@ -2422,8 +2439,8 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, if (t.size() >= 2 && (t[1] == 'p' || t[1] == 'P')) { Regexp* re = new Regexp(kRegexpCharClass, ps.flags() & ~FoldCase); - re->char_class_.ccb_ = new CharClassBuilder; - switch (ParseUnicodeGroup(&t, ps.flags(), re->char_class_.ccb_, status)) { + re->arguments.char_class.ccb_ = new CharClassBuilder; + switch (ParseUnicodeGroup(&t, ps.flags(), re->arguments.char_class.ccb_, status)) { case kParseOk: if (!ps.PushRegexp(re)) return NULL; @@ -2440,8 +2457,8 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, const UGroup *g = MaybeParsePerlCCEscape(&t, ps.flags()); if (g != NULL) { Regexp* re = new Regexp(kRegexpCharClass, ps.flags() & ~FoldCase); - re->char_class_.ccb_ = new CharClassBuilder; - AddUGroup(re->char_class_.ccb_, g, g->sign, ps.flags()); + re->arguments.char_class.ccb_ = new CharClassBuilder; + AddUGroup(re->arguments.char_class.ccb_, g, g->sign, ps.flags()); if (!ps.PushRegexp(re)) return NULL; break; @@ -2461,4 +2478,4 @@ Regexp* Regexp::Parse(const StringPiece& s, ParseFlags global_flags, return ps.DoFinish(); } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/perl_groups.cc b/src/duckdb/third_party/re2/re2/perl_groups.cc index d165ea87..97778ae1 100644 --- a/src/duckdb/third_party/re2/re2/perl_groups.cc +++ b/src/duckdb/third_party/re2/re2/perl_groups.cc @@ -20,12 +20,12 @@ static const URange16 code3[] = { /* \w */ { 0x61, 0x7a }, }; const UGroup perl_groups[] = { - { "\\d", +1, code1, 1 , nullptr, 0}, - { "\\D", -1, code1, 1 , nullptr, 0}, - { "\\s", +1, code2, 3 , nullptr, 0}, - { "\\S", -1, code2, 3 , nullptr, 0}, - { "\\w", +1, code3, 4 , nullptr, 0}, - { "\\W", -1, code3, 4 , nullptr, 0}, + { "\\d", +1, code1, 1, 0, 0 }, + { "\\D", -1, code1, 1, 0, 0 }, + { "\\s", +1, code2, 3, 0, 0 }, + { "\\S", -1, code2, 3, 0, 0 }, + { "\\w", +1, code3, 4, 0, 0 }, + { "\\W", -1, code3, 4, 0, 0 }, }; const int num_perl_groups = 6; static const URange16 code4[] = { /* [:alnum:] */ @@ -85,35 +85,35 @@ static const URange16 code17[] = { /* [:xdigit:] */ { 0x61, 0x66 }, }; const UGroup posix_groups[] = { - { "[:alnum:]", +1, code4, 3 , nullptr, 0}, - { "[:^alnum:]", -1, code4, 3 , nullptr, 0}, - { "[:alpha:]", +1, code5, 2 , nullptr, 0}, - { "[:^alpha:]", -1, code5, 2 , nullptr, 0}, - { "[:ascii:]", +1, code6, 1 , nullptr, 0}, - { "[:^ascii:]", -1, code6, 1 , nullptr, 0}, - { "[:blank:]", +1, code7, 2 , nullptr, 0}, - { "[:^blank:]", -1, code7, 2 , nullptr, 0}, - { "[:cntrl:]", +1, code8, 2 , nullptr, 0}, - { "[:^cntrl:]", -1, code8, 2 , nullptr, 0}, - { "[:digit:]", +1, code9, 1 , nullptr, 0}, - { "[:^digit:]", -1, code9, 1 , nullptr, 0}, - { "[:graph:]", +1, code10, 1 , nullptr, 0}, - { "[:^graph:]", -1, code10, 1 , nullptr, 0}, - { "[:lower:]", +1, code11, 1 , nullptr, 0}, - { "[:^lower:]", -1, code11, 1 , nullptr, 0}, - { "[:print:]", +1, code12, 1 , nullptr, 0}, - { "[:^print:]", -1, code12, 1 , nullptr, 0}, - { "[:punct:]", +1, code13, 4 , nullptr, 0}, - { "[:^punct:]", -1, code13, 4 , nullptr, 0}, - { "[:space:]", +1, code14, 2 , nullptr, 0}, - { "[:^space:]", -1, code14, 2 , nullptr, 0}, - { "[:upper:]", +1, code15, 1 , nullptr, 0}, - { "[:^upper:]", -1, code15, 1, nullptr, 0}, - { "[:word:]", +1, code16, 4 , nullptr, 0}, - { "[:^word:]", -1, code16, 4 , nullptr, 0}, - { "[:xdigit:]", +1, code17, 3 , nullptr, 0}, - { "[:^xdigit:]", -1, code17, 3 , nullptr, 0}, + { "[:alnum:]", +1, code4, 3, 0, 0 }, + { "[:^alnum:]", -1, code4, 3, 0, 0 }, + { "[:alpha:]", +1, code5, 2, 0, 0 }, + { "[:^alpha:]", -1, code5, 2, 0, 0 }, + { "[:ascii:]", +1, code6, 1, 0, 0 }, + { "[:^ascii:]", -1, code6, 1, 0, 0 }, + { "[:blank:]", +1, code7, 2, 0, 0 }, + { "[:^blank:]", -1, code7, 2, 0, 0 }, + { "[:cntrl:]", +1, code8, 2, 0, 0 }, + { "[:^cntrl:]", -1, code8, 2, 0, 0 }, + { "[:digit:]", +1, code9, 1, 0, 0 }, + { "[:^digit:]", -1, code9, 1, 0, 0 }, + { "[:graph:]", +1, code10, 1, 0, 0 }, + { "[:^graph:]", -1, code10, 1, 0, 0 }, + { "[:lower:]", +1, code11, 1, 0, 0 }, + { "[:^lower:]", -1, code11, 1, 0, 0 }, + { "[:print:]", +1, code12, 1, 0, 0 }, + { "[:^print:]", -1, code12, 1, 0, 0 }, + { "[:punct:]", +1, code13, 4, 0, 0 }, + { "[:^punct:]", -1, code13, 4, 0, 0 }, + { "[:space:]", +1, code14, 2, 0, 0 }, + { "[:^space:]", -1, code14, 2, 0, 0 }, + { "[:upper:]", +1, code15, 1, 0, 0 }, + { "[:^upper:]", -1, code15, 1, 0, 0 }, + { "[:word:]", +1, code16, 4, 0, 0 }, + { "[:^word:]", -1, code16, 4, 0, 0 }, + { "[:xdigit:]", +1, code17, 3, 0, 0 }, + { "[:^xdigit:]", -1, code17, 3, 0, 0 }, }; const int num_posix_groups = 28; -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/pod_array.h b/src/duckdb/third_party/re2/re2/pod_array.h new file mode 100644 index 00000000..4f311e78 --- /dev/null +++ b/src/duckdb/third_party/re2/re2/pod_array.h @@ -0,0 +1,55 @@ +// Copyright 2018 The RE2 Authors. All Rights Reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef RE2_POD_ARRAY_H_ +#define RE2_POD_ARRAY_H_ + +#include +#include + +namespace duckdb_re2 { + +template +class PODArray { + public: + static_assert(std::is_trivial::value && std::is_standard_layout::value, + "T must be POD"); + + PODArray() + : ptr_() {} + explicit PODArray(int len) + : ptr_(std::allocator().allocate(len), Deleter(len)) {} + + T* data() const { + return ptr_.get(); + } + + int size() const { + return ptr_.get_deleter().len_; + } + + T& operator[](int pos) const { + return ptr_[pos]; + } + + private: + struct Deleter { + Deleter() + : len_(0) {} + explicit Deleter(int len) + : len_(len) {} + + void operator()(T* ptr) const { + std::allocator().deallocate(ptr, len_); + } + + int len_; + }; + + std::unique_ptr ptr_; +}; + +} // namespace re2 + +#endif // RE2_POD_ARRAY_H_ diff --git a/src/duckdb/third_party/re2/re2/prefilter.cc b/src/duckdb/third_party/re2/re2/prefilter.cc index b6ce811e..d5543b08 100644 --- a/src/duckdb/third_party/re2/re2/prefilter.cc +++ b/src/duckdb/third_party/re2/re2/prefilter.cc @@ -7,6 +7,7 @@ #include #include #include +#include #include #include "util/util.h" @@ -19,9 +20,6 @@ namespace duckdb_re2 { -typedef std::set::iterator SSIter; -typedef std::set::const_iterator ConstSSIter; - // Initializes a Prefilter, allocating subs_ as necessary. Prefilter::Prefilter(Op op) { op_ = op; @@ -138,35 +136,41 @@ Prefilter* Prefilter::Or(Prefilter* a, Prefilter* b) { return AndOr(OR, a, b); } -static void SimplifyStringSet(std::set *ss) { +void Prefilter::SimplifyStringSet(SSet* ss) { // Now make sure that the strings aren't redundant. For example, if // we know "ab" is a required string, then it doesn't help at all to // know that "abc" is also a required string, so delete "abc". This // is because, when we are performing a string search to filter - // regexps, matching ab will already allow this regexp to be a - // candidate for match, so further matching abc is redundant. - - for (SSIter i = ss->begin(); i != ss->end(); ++i) { + // regexps, matching "ab" will already allow this regexp to be a + // candidate for match, so further matching "abc" is redundant. + // Note that we must ignore "" because find() would find it at the + // start of everything and thus we would end up erasing everything. + // + // The SSet sorts strings by length, then lexicographically. Note that + // smaller strings appear first and all strings must be unique. These + // observations let us skip string comparisons when possible. + SSIter i = ss->begin(); + if (i != ss->end() && i->empty()) { + ++i; + } + for (; i != ss->end(); ++i) { SSIter j = i; ++j; while (j != ss->end()) { - // Increment j early so that we can erase the element it points to. - SSIter old_j = j; + if (j->size() > i->size() && j->find(*i) != std::string::npos) { + j = ss->erase(j); + continue; + } ++j; - if (old_j->find(*i) != std::string::npos) - ss->erase(old_j); } } } -Prefilter* Prefilter::OrStrings(std::set* ss) { +Prefilter* Prefilter::OrStrings(SSet* ss) { + Prefilter* or_prefilter = new Prefilter(NONE); SimplifyStringSet(ss); - Prefilter* or_prefilter = NULL; - if (!ss->empty()) { - or_prefilter = new Prefilter(NONE); - for (SSIter i = ss->begin(); i != ss->end(); ++i) - or_prefilter = Or(or_prefilter, FromString(*i)); - } + for (SSIter i = ss->begin(); i != ss->end(); ++i) + or_prefilter = Or(or_prefilter, FromString(*i)); return or_prefilter; } @@ -224,14 +228,14 @@ class Prefilter::Info { // Caller takes ownership of the Prefilter. Prefilter* TakeMatch(); - std::set& exact() { return exact_; } + SSet& exact() { return exact_; } bool is_exact() const { return is_exact_; } class Walker; private: - std::set exact_; + SSet exact_; // When is_exact_ is true, the strings that match // are placed in exact_. When it is no longer an exact @@ -284,18 +288,7 @@ std::string Prefilter::Info::ToString() { return ""; } -// Add the strings from src to dst. -static void CopyIn(const std::set& src, - std::set* dst) { - for (ConstSSIter i = src.begin(); i != src.end(); ++i) - dst->insert(*i); -} - -// Add the cross-product of a and b to dst. -// (For each string i in a and j in b, add i+j.) -static void CrossProduct(const std::set& a, - const std::set& b, - std::set* dst) { +void Prefilter::CrossProduct(const SSet& a, const SSet& b, SSet* dst) { for (ConstSSIter i = a.begin(); i != a.end(); ++i) for (ConstSSIter j = b.begin(); j != b.end(); ++j) dst->insert(*i + *j); @@ -341,8 +334,14 @@ Prefilter::Info* Prefilter::Info::Alt(Info* a, Info* b) { Info *ab = new Info(); if (a->is_exact_ && b->is_exact_) { - CopyIn(a->exact_, &ab->exact_); - CopyIn(b->exact_, &ab->exact_); + // Avoid string copies by moving the larger exact_ set into + // ab directly, then merge in the smaller set. + if (a->exact_.size() < b->exact_.size()) { + using std::swap; + swap(a, b); + } + ab->exact_ = std::move(a->exact_); + ab->exact_.insert(b->exact_.begin(), b->exact_.end()); ab->is_exact_ = true; } else { // Either a or b has is_exact_ = false. If the other @@ -449,6 +448,7 @@ Prefilter::Info* Prefilter::Info::EmptyString() { typedef CharClass::iterator CCIter; Prefilter::Info* Prefilter::Info::CClass(CharClass *cc, bool latin1) { + // If the class is too large, it's okay to overestimate. if (cc->size() > 10) return AnyCharOrAnyByte(); @@ -465,7 +465,6 @@ Prefilter::Info* Prefilter::Info::CClass(CharClass *cc, a->is_exact_ = true; - return a; } @@ -518,8 +517,8 @@ Prefilter::Info* Prefilter::Info::Walker::PostVisit( switch (re->op()) { default: case kRegexpRepeat: - LOG(DFATAL) << "Bad regexp op " << re->op(); info = EmptyString(); + LOG(DFATAL) << "Bad regexp op " << re->op(); break; case kRegexpNoMatch: @@ -630,14 +629,15 @@ Prefilter* Prefilter::FromRegexp(Regexp* re) { return NULL; Regexp* simple = re->Simplify(); - Prefilter::Info *info = BuildInfo(simple); + if (simple == NULL) + return NULL; + Prefilter::Info* info = BuildInfo(simple); simple->Decref(); if (info == NULL) return NULL; Prefilter* m = info->TakeMatch(); - delete info; return m; } @@ -689,4 +689,4 @@ Prefilter* Prefilter::FromRE2(const RE2* re2) { } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/prefilter.h b/src/duckdb/third_party/re2/re2/prefilter.h index 02ed48df..4eb8ef83 100644 --- a/src/duckdb/third_party/re2/re2/prefilter.h +++ b/src/duckdb/third_party/re2/re2/prefilter.h @@ -60,8 +60,21 @@ class Prefilter { std::string DebugString() const; private: + // A comparator used to store exact strings. We compare by length, + // then lexicographically. This ordering makes it easier to reduce the + // set of strings in SimplifyStringSet. + struct LengthThenLex { + bool operator()(const std::string& a, const std::string& b) const { + return (a.size() < b.size()) || (a.size() == b.size() && a < b); + } + }; + class Info; + using SSet = std::set; + using SSIter = SSet::iterator; + using ConstSSIter = SSet::const_iterator; + // Combines two prefilters together to create an AND. The passed // Prefilters will be part of the returned Prefilter or deleted. static Prefilter* And(Prefilter* a, Prefilter* b); @@ -77,12 +90,21 @@ class Prefilter { static Prefilter* FromString(const std::string& str); - static Prefilter* OrStrings(std::set* ss); + static Prefilter* OrStrings(SSet* ss); static Info* BuildInfo(Regexp* re); Prefilter* Simplify(); + // Removes redundant strings from the set. A string is redundant if + // any of the other strings appear as a substring. The empty string + // is a special case, which is ignored. + static void SimplifyStringSet(SSet* ss); + + // Adds the cross-product of a and b to dst. + // (For each string i in a and j in b, add i+j.) + static void CrossProduct(const SSet& a, const SSet& b, SSet* dst); + // Kind of Prefilter. Op op_; @@ -103,6 +125,6 @@ class Prefilter { Prefilter& operator=(const Prefilter&) = delete; }; -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_PREFILTER_H_ diff --git a/src/duckdb/third_party/re2/re2/prefilter_tree.cc b/src/duckdb/third_party/re2/re2/prefilter_tree.cc index 08e1fbf0..533918b9 100644 --- a/src/duckdb/third_party/re2/re2/prefilter_tree.cc +++ b/src/duckdb/third_party/re2/re2/prefilter_tree.cc @@ -6,9 +6,9 @@ #include #include +#include #include #include -#include #include #include #include @@ -34,9 +34,6 @@ PrefilterTree::PrefilterTree(int min_atom_len) PrefilterTree::~PrefilterTree() { for (size_t i = 0; i < prefilter_vec_.size(); i++) delete prefilter_vec_[i]; - - for (size_t i = 0; i < entries_.size(); i++) - delete entries_[i].parents; } void PrefilterTree::Add(Prefilter* prefilter) { @@ -65,44 +62,13 @@ void PrefilterTree::Compile(std::vector* atom_vec) { compiled_ = true; - // TODO(junyer): Use std::unordered_set instead? NodeMap nodes; AssignUniqueIds(&nodes, atom_vec); - - // Identify nodes that are too common among prefilters and are - // triggering too many parents. Then get rid of them if possible. - // Note that getting rid of a prefilter node simply means they are - // no longer necessary for their parent to trigger; that is, we do - // not miss out on any regexps triggering by getting rid of a - // prefilter node. - for (size_t i = 0; i < entries_.size(); i++) { - StdIntMap* parents = entries_[i].parents; - if (parents->size() > 8) { - // This one triggers too many things. If all the parents are AND - // nodes and have other things guarding them, then get rid of - // this trigger. TODO(vsri): Adjust the threshold appropriately, - // make it a function of total number of nodes? - bool have_other_guard = true; - for (StdIntMap::iterator it = parents->begin(); - it != parents->end(); ++it) { - have_other_guard = have_other_guard && - (entries_[it->first].propagate_up_at_count > 1); - } - - if (have_other_guard) { - for (StdIntMap::iterator it = parents->begin(); - it != parents->end(); ++it) - entries_[it->first].propagate_up_at_count -= 1; - - parents->clear(); // Forget the parents - } - } - } } Prefilter* PrefilterTree::CanonicalNode(NodeMap* nodes, Prefilter* node) { std::string node_string = NodeString(node); - std::map::iterator iter = nodes->find(node_string); + NodeMap::iterator iter = nodes->find(node_string); if (iter == nodes->end()) return NULL; return (*iter).second; @@ -212,65 +178,42 @@ void PrefilterTree::AssignUniqueIds(NodeMap* nodes, node->set_unique_id(canonical->unique_id()); } } - entries_.resize(nodes->size()); - - // Create parent StdIntMap for the entries. - for (int i = static_cast(v.size()) - 1; i >= 0; i--) { - Prefilter* prefilter = v[i]; - if (prefilter == NULL) - continue; - - if (CanonicalNode(nodes, prefilter) != prefilter) - continue; - - Entry* entry = &entries_[prefilter->unique_id()]; - entry->parents = new StdIntMap(); - } + entries_.resize(unique_id); // Fill the entries. for (int i = static_cast(v.size()) - 1; i >= 0; i--) { Prefilter* prefilter = v[i]; if (prefilter == NULL) continue; - if (CanonicalNode(nodes, prefilter) != prefilter) continue; - - Entry* entry = &entries_[prefilter->unique_id()]; - + int id = prefilter->unique_id(); switch (prefilter->op()) { default: - case Prefilter::ALL: LOG(DFATAL) << "Unexpected op: " << prefilter->op(); return; case Prefilter::ATOM: - entry->propagate_up_at_count = 1; + entries_[id].propagate_up_at_count = 1; break; case Prefilter::OR: case Prefilter::AND: { - std::set uniq_child; + // For each child, we append our id to the child's list of + // parent ids... unless we happen to have done so already. + // The number of appends is the number of unique children, + // which allows correct upward propagation from AND nodes. + int up_count = 0; for (size_t j = 0; j < prefilter->subs()->size(); j++) { - Prefilter* child = (*prefilter->subs())[j]; - Prefilter* canonical = CanonicalNode(nodes, child); - if (canonical == NULL) { - LOG(DFATAL) << "Null canonical node"; - return; - } - int child_id = canonical->unique_id(); - uniq_child.insert(child_id); - // To the child, we want to add to parent indices. - Entry* child_entry = &entries_[child_id]; - if (child_entry->parents->find(prefilter->unique_id()) == - child_entry->parents->end()) { - (*child_entry->parents)[prefilter->unique_id()] = 1; + int child_id = (*prefilter->subs())[j]->unique_id(); + std::vector& parents = entries_[child_id].parents; + if (parents.empty() || parents.back() != id) { + parents.push_back(id); + up_count++; } } - entry->propagate_up_at_count = prefilter->op() == Prefilter::AND - ? static_cast(uniq_child.size()) - : 1; - + entries_[id].propagate_up_at_count = + prefilter->op() == Prefilter::AND ? up_count : 1; break; } } @@ -285,6 +228,52 @@ void PrefilterTree::AssignUniqueIds(NodeMap* nodes, Entry* entry = &entries_[id]; entry->regexps.push_back(static_cast(i)); } + + // Lastly, using probability-based heuristics, we identify nodes + // that trigger too many parents and then we try to prune edges. + // We use logarithms below to avoid the likelihood of underflow. + double log_num_regexps = std::log(prefilter_vec_.size() - unfiltered_.size()); + // Hoisted this above the loop so that we don't thrash the heap. + std::vector> entries_by_num_edges; + for (int i = static_cast(v.size()) - 1; i >= 0; i--) { + Prefilter* prefilter = v[i]; + // Pruning applies only to AND nodes because it "just" reduces + // precision; applied to OR nodes, it would break correctness. + if (prefilter == NULL || prefilter->op() != Prefilter::AND) + continue; + if (CanonicalNode(nodes, prefilter) != prefilter) + continue; + int id = prefilter->unique_id(); + + // Sort the current node's children by the numbers of parents. + entries_by_num_edges.clear(); + for (size_t j = 0; j < prefilter->subs()->size(); j++) { + int child_id = (*prefilter->subs())[j]->unique_id(); + const std::vector& parents = entries_[child_id].parents; + entries_by_num_edges.emplace_back(parents.size(), child_id); + } + std::stable_sort(entries_by_num_edges.begin(), entries_by_num_edges.end()); + + // A running estimate of how many regexps will be triggered by + // pruning the remaining children's edges to the current node. + // Our nominal target is one, so the threshold is log(1) == 0; + // pruning occurs iff the child has more than nine edges left. + double log_num_triggered = log_num_regexps; + for (const auto& pair : entries_by_num_edges) { + int child_id = pair.second; + std::vector& parents = entries_[child_id].parents; + if (log_num_triggered > 0.) { + log_num_triggered += std::log(parents.size()); + log_num_triggered -= log_num_regexps; + } else if (parents.size() > 9) { + auto it = std::find(parents.begin(), parents.end(), id); + if (it != parents.end()) { + parents.erase(it); + entries_[id].propagate_up_at_count--; + } + } + } + } } // Functions for triggering during search. @@ -331,10 +320,7 @@ void PrefilterTree::PropagateMatch(const std::vector& atom_ids, regexps->set(entry.regexps[i], 1); int c; // Pass trigger up to parents. - for (StdIntMap::iterator it = entry.parents->begin(); - it != entry.parents->end(); - ++it) { - int j = it->first; + for (int j : entry.parents) { const Entry& parent = entries_[j]; // Delay until all the children have succeeded. if (parent.propagate_up_at_count > 1) { @@ -364,15 +350,15 @@ void PrefilterTree::PrintDebugInfo(NodeMap* nodes) { LOG(ERROR) << "#Unique Nodes: " << entries_.size(); for (size_t i = 0; i < entries_.size(); i++) { - StdIntMap* parents = entries_[i].parents; + const std::vector& parents = entries_[i].parents; const std::vector& regexps = entries_[i].regexps; LOG(ERROR) << "EntryId: " << i - << " N: " << parents->size() << " R: " << regexps.size(); - for (StdIntMap::iterator it = parents->begin(); it != parents->end(); ++it) - LOG(ERROR) << it->first; + << " N: " << parents.size() << " R: " << regexps.size(); + for (int parent : parents) + LOG(ERROR) << parent; } LOG(ERROR) << "Map:"; - for (std::map::const_iterator iter = nodes->begin(); + for (NodeMap::const_iterator iter = nodes->begin(); iter != nodes->end(); ++iter) LOG(ERROR) << "NodeId: " << (*iter).second->unique_id() << " Str: " << (*iter).first; @@ -399,4 +385,4 @@ std::string PrefilterTree::DebugNodeString(Prefilter* node) const { return node_string; } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/prefilter_tree.h b/src/duckdb/third_party/re2/re2/prefilter_tree.h index 8be83eb5..12624a83 100644 --- a/src/duckdb/third_party/re2/re2/prefilter_tree.h +++ b/src/duckdb/third_party/re2/re2/prefilter_tree.h @@ -7,7 +7,7 @@ // The PrefilterTree class is used to form an AND-OR tree of strings // that would trigger each regexp. The 'prefilter' of each regexp is -// added tp PrefilterTree, and then PrefilterTree is used to find all +// added to PrefilterTree, and then PrefilterTree is used to find all // the unique strings across the prefilters. During search, by using // matches from a string matching engine, PrefilterTree deduces the // set of regexps that are to be triggered. The 'string matching @@ -21,8 +21,8 @@ #include #include "util/util.h" -#include "util/sparse_array.h" #include "re2/prefilter.h" +#include "re2/sparse_array.h" namespace duckdb_re2 { @@ -59,7 +59,8 @@ class PrefilterTree { private: typedef SparseArray IntMap; - typedef std::map StdIntMap; + // TODO(junyer): Use std::unordered_set instead? + // It should be trivial to get rid of the stringification... typedef std::map NodeMap; // Each unique node has a corresponding Entry that helps in @@ -77,7 +78,7 @@ class PrefilterTree { // are two different nodes, but they share the atom 'def'. So when // 'def' matches, it triggers two parents, corresponding to the two // different OR nodes. - StdIntMap* parents; + std::vector parents; // When this node is ready to trigger the parent, what are the // regexps that are triggered. diff --git a/src/duckdb/third_party/re2/re2/prog.cc b/src/duckdb/third_party/re2/re2/prog.cc index be2ad9bd..b0ed4dbb 100644 --- a/src/duckdb/third_party/re2/re2/prog.cc +++ b/src/duckdb/third_party/re2/re2/prog.cc @@ -7,6 +7,12 @@ #include "re2/prog.h" +#if defined(__AVX2__) +#include +#ifdef _MSC_VER +#include +#endif +#endif #include #include #include @@ -32,9 +38,9 @@ void Prog::Inst::InitAlt(uint32_t out, uint32_t out1) { void Prog::Inst::InitByteRange(int lo, int hi, int foldcase, uint32_t out) { DCHECK_EQ(out_opcode_, 0); set_out_opcode(out, kInstByteRange); - inst_byte_range_data_.lo_ = lo & 0xFF; - inst_byte_range_data_.hi_ = hi & 0xFF; - inst_byte_range_data_.hint_foldcase_ = foldcase&1; + lo_ = lo & 0xFF; + hi_ = hi & 0xFF; + hint_foldcase_ = foldcase&1; } void Prog::Inst::InitCapture(int cap, uint32_t out) { @@ -79,7 +85,7 @@ std::string Prog::Inst::Dump() { case kInstByteRange: return StringPrintf("byte%s [%02x-%02x] %d -> %d", foldcase() ? "/i" : "", - inst_byte_range_data_.lo_, inst_byte_range_data_.hi_, hint(), out()); + lo_, hi_, hint(), out()); case kInstCapture: return StringPrintf("capture %d -> %d", cap_, out()); @@ -109,9 +115,10 @@ Prog::Prog() start_unanchored_(0), size_(0), bytemap_range_(0), - first_byte_(-1), - flags_(0), + prefix_foldcase_(false), + prefix_size_(0), list_count_(0), + bit_state_text_max_size_(0), dfa_mem_(0), dfa_first_(NULL), dfa_longest_(NULL) { @@ -120,6 +127,8 @@ Prog::Prog() Prog::~Prog() { DeleteDFA(dfa_longest_); DeleteDFA(dfa_first_); + if (prefix_foldcase_) + delete[] prefix_dfa_; } typedef SparseSet Workq; @@ -134,7 +143,7 @@ static std::string ProgToString(Prog* prog, Workq* q) { for (Workq::iterator i = q->begin(); i != q->end(); ++i) { int id = *i; Prog::Inst* ip = prog->inst(id); - StringAppendF(&s, "%d. %s\n", id, ip->Dump().c_str()); + s += StringPrintf("%d. %s\n", id, ip->Dump().c_str()); AddToQueue(q, ip->out()); if (ip->opcode() == kInstAlt || ip->opcode() == kInstAltMatch) AddToQueue(q, ip->out1()); @@ -147,9 +156,9 @@ static std::string FlattenedProgToString(Prog* prog, int start) { for (int id = start; id < prog->size(); id++) { Prog::Inst* ip = prog->inst(id); if (ip->last()) - StringAppendF(&s, "%d. %s\n", id, ip->Dump().c_str()); + s += StringPrintf("%d. %s\n", id, ip->Dump().c_str()); else - StringAppendF(&s, "%d+ %s\n", id, ip->Dump().c_str()); + s += StringPrintf("%d+ %s\n", id, ip->Dump().c_str()); } return s; } @@ -180,19 +189,36 @@ std::string Prog::DumpByteMap() { while (c < 256-1 && bytemap_[c+1] == b) c++; int hi = c; - StringAppendF(&map, "[%02x-%02x] -> %d\n", lo, hi, b); + map += StringPrintf("[%02x-%02x] -> %d\n", lo, hi, b); } return map; } -int Prog::first_byte() { - std::call_once(first_byte_once_, [](Prog* prog) { - prog->first_byte_ = prog->ComputeFirstByte(); - }, this); - return first_byte_; -} +// Is ip a guaranteed match at end of text, perhaps after some capturing? +static bool IsMatch(Prog* prog, Prog::Inst* ip) { + for (;;) { + switch (ip->opcode()) { + default: + LOG(DFATAL) << "Unexpected opcode in IsMatch: " << ip->opcode(); + return false; + + case kInstAlt: + case kInstAltMatch: + case kInstByteRange: + case kInstFail: + case kInstEmptyWidth: + return false; -static bool IsMatch(Prog*, Prog::Inst*); + case kInstCapture: + case kInstNop: + ip = prog->inst(ip->out()); + break; + + case kInstMatch: + return true; + } + } +} // Peep-hole optimizer. void Prog::Optimize() { @@ -258,54 +284,28 @@ void Prog::Optimize() { } } -// Is ip a guaranteed match at end of text, perhaps after some capturing? -static bool IsMatch(Prog* prog, Prog::Inst* ip) { - for (;;) { - switch (ip->opcode()) { - default: - LOG(DFATAL) << "Unexpected opcode in IsMatch: " << ip->opcode(); - return false; - - case kInstAlt: - case kInstAltMatch: - case kInstByteRange: - case kInstFail: - case kInstEmptyWidth: - return false; - - case kInstCapture: - case kInstNop: - ip = prog->inst(ip->out()); - break; - - case kInstMatch: - return true; - } - } -} - uint32_t Prog::EmptyFlags(const StringPiece& text, const char* p) { int flags = 0; // ^ and \A - if (p == text.begin()) + if (p == text.data()) flags |= kEmptyBeginText | kEmptyBeginLine; else if (p[-1] == '\n') flags |= kEmptyBeginLine; // $ and \z - if (p == text.end()) + if (p == text.data() + text.size()) flags |= kEmptyEndText | kEmptyEndLine; - else if (p < text.end() && p[0] == '\n') + else if (p < text.data() + text.size() && p[0] == '\n') flags |= kEmptyEndLine; // \b and \B - if (p == text.begin() && p == text.end()) { + if (p == text.data() && p == text.data() + text.size()) { // no word boundary here - } else if (p == text.begin()) { + } else if (p == text.data()) { if (IsWordChar(p[0])) flags |= kEmptyWordBoundary; - } else if (p == text.end()) { + } else if (p == text.data() + text.size()) { if (IsWordChar(p[-1])) flags |= kEmptyWordBoundary; } else { @@ -510,13 +510,13 @@ void Prog::ComputeByteMap() { } builder.Build(bytemap_, &bytemap_range_); -} -int TotalInstructions(int inst_count_[]) { - int total = 0; - for (int i = 0; i < kNumInst; i++) - total += inst_count_[i]; - return total; + if ((0)) { // For debugging, use trivial bytemap. + LOG(ERROR) << "Using trivial bytemap."; + for (int i = 0; i < 256; i++) + bytemap_[i] = static_cast(i); + bytemap_range_ = 256; + } } // Prog::Flatten() implements a graph rewriting algorithm. @@ -611,7 +611,13 @@ void Prog::Flatten() { inst_count_[ip->opcode()]++; } - DCHECK_EQ(TotalInstructions(inst_count_), static_cast(flat.size())); +#if !defined(NDEBUG) + // Address a `-Wunused-but-set-variable' warning from Clang 13.x. + size_t total = 0; + for (int i = 0; i < kNumInst; i++) + total += inst_count_[i]; + CHECK_EQ(total, flat.size()); +#endif // Remap start_unanchored and start. if (start_unanchored() == 0) { @@ -638,6 +644,11 @@ void Prog::Flatten() { for (int i = 0; i < list_count_; ++i) list_heads_[flatmap[i]] = i; } + + // BitState allocates a bitmap of size list_count_ * (text.size()+1) + // for tracking pairs of possibilities that it has already explored. + const size_t kBitStateBitmapMaxSize = 256*1024; // max size in bits + bit_state_text_max_size_ = kBitStateBitmapMaxSize / list_count_ - 1; } void Prog::MarkSuccessors(SparseArray* rootmap, @@ -910,9 +921,255 @@ void Prog::ComputeHints(std::vector* flat, int begin, int end) { if (first != end) { uint16_t hint = static_cast(std::min(first - id, 32767)); - ip->inst_byte_range_data_.hint_foldcase_ |= hint<<1; + ip->hint_foldcase_ |= hint<<1; } } } -} // namespace duckdb_re2 +// The final state will always be this, which frees up a register for the hot +// loop and thus avoids the spilling that can occur when building with Clang. +static const size_t kShiftDFAFinal = 9; + +// This function takes the prefix as std::string (i.e. not const std::string& +// as normal) because it's going to clobber it, so a temporary is convenient. +static uint64_t* BuildShiftDFA(std::string prefix) { + // This constant is for convenience now and also for correctness later when + // we clobber the prefix, but still need to know how long it was initially. + const size_t size = prefix.size(); + + // Construct the NFA. + // The table is indexed by input byte; each element is a bitfield of states + // reachable by the input byte. Given a bitfield of the current states, the + // bitfield of states reachable from those is - for this specific purpose - + // always ((ncurr << 1) | 1). Intersecting the reachability bitfields gives + // the bitfield of the next states reached by stepping over the input byte. + // Credits for this technique: the Hyperscan paper by Geoff Langdale et al. + uint16_t nfa[256]{}; + for (size_t i = 0; i < size; ++i) { + uint8_t b = prefix[i]; + nfa[b] |= 1 << (i+1); + } + // This is the `\C*?` for unanchored search. + for (int b = 0; b < 256; ++b) + nfa[b] |= 1; + + // This maps from DFA state to NFA states; the reverse mapping is used when + // recording transitions and gets implemented with plain old linear search. + // The "Shift DFA" technique limits this to ten states when using uint64_t; + // to allow for the initial state, we use at most nine bytes of the prefix. + // That same limit is also why uint16_t is sufficient for the NFA bitfield. + uint16_t states[kShiftDFAFinal+1]{}; + states[0] = 1; + for (size_t dcurr = 0; dcurr < size; ++dcurr) { + uint8_t b = prefix[dcurr]; + uint16_t ncurr = states[dcurr]; + uint16_t nnext = nfa[b] & ((ncurr << 1) | 1); + size_t dnext = dcurr+1; + if (dnext == size) + dnext = kShiftDFAFinal; + states[dnext] = nnext; + } + + // Sort and unique the bytes of the prefix to avoid repeating work while we + // record transitions. This clobbers the prefix, but it's no longer needed. + std::sort(prefix.begin(), prefix.end()); + prefix.erase(std::unique(prefix.begin(), prefix.end()), prefix.end()); + + // Construct the DFA. + // The table is indexed by input byte; each element is effectively a packed + // array of uint6_t; each array value will be multiplied by six in order to + // avoid having to do so later in the hot loop as well as masking/shifting. + // Credits for this technique: "Shift-based DFAs" on GitHub by Per Vognsen. + uint64_t* dfa = new uint64_t[256]{}; + // Record a transition from each state for each of the bytes of the prefix. + // Note that all other input bytes go back to the initial state by default. + for (size_t dcurr = 0; dcurr < size; ++dcurr) { + for (uint8_t b : prefix) { + uint16_t ncurr = states[dcurr]; + uint16_t nnext = nfa[b] & ((ncurr << 1) | 1); + size_t dnext = 0; + while (states[dnext] != nnext) + ++dnext; + dfa[b] |= static_cast(dnext * 6) << (dcurr * 6); + // Convert ASCII letters to uppercase and record the extra transitions. + // Note that ASCII letters are guaranteed to be lowercase at this point + // because that's how the parser normalises them. #FunFact: 'k' and 's' + // match U+212A and U+017F, respectively, so they won't occur here when + // using UTF-8 encoding because the parser will emit character classes. + if ('a' <= b && b <= 'z') { + b -= 'a' - 'A'; + dfa[b] |= static_cast(dnext * 6) << (dcurr * 6); + } + } + } + // This lets the final state "saturate", which will matter for performance: + // in the hot loop, we check for a match only at the end of each iteration, + // so we must keep signalling the match until we get around to checking it. + for (int b = 0; b < 256; ++b) + dfa[b] |= static_cast(kShiftDFAFinal * 6) << (kShiftDFAFinal * 6); + + return dfa; +} + +void Prog::ConfigurePrefixAccel(const std::string& prefix, + bool prefix_foldcase) { + prefix_foldcase_ = prefix_foldcase; + prefix_size_ = prefix.size(); + if (prefix_foldcase_) { + // Use PrefixAccel_ShiftDFA(). + // ... and no more than nine bytes of the prefix. (See above for details.) + prefix_size_ = std::min(prefix_size_, kShiftDFAFinal); + prefix_dfa_ = BuildShiftDFA(prefix.substr(0, prefix_size_)); + } else if (prefix_size_ != 1) { + // Use PrefixAccel_FrontAndBack(). + prefix_front_ = prefix.front(); + prefix_back_ = prefix.back(); + } else { + // Use memchr(3). + prefix_front_ = prefix.front(); + } +} + +const void* Prog::PrefixAccel_ShiftDFA(const void* data, size_t size) { + if (size < prefix_size_) + return NULL; + + uint64_t curr = 0; + + // At the time of writing, rough benchmarks on a Broadwell machine showed + // that this unroll factor (i.e. eight) achieves a speedup factor of two. + if (size >= 8) { + const uint8_t* p = reinterpret_cast(data); + const uint8_t* endp = p + (size&~7); + do { + uint8_t b0 = p[0]; + uint8_t b1 = p[1]; + uint8_t b2 = p[2]; + uint8_t b3 = p[3]; + uint8_t b4 = p[4]; + uint8_t b5 = p[5]; + uint8_t b6 = p[6]; + uint8_t b7 = p[7]; + + uint64_t next0 = prefix_dfa_[b0]; + uint64_t next1 = prefix_dfa_[b1]; + uint64_t next2 = prefix_dfa_[b2]; + uint64_t next3 = prefix_dfa_[b3]; + uint64_t next4 = prefix_dfa_[b4]; + uint64_t next5 = prefix_dfa_[b5]; + uint64_t next6 = prefix_dfa_[b6]; + uint64_t next7 = prefix_dfa_[b7]; + + uint64_t curr0 = next0 >> (curr & 63); + uint64_t curr1 = next1 >> (curr0 & 63); + uint64_t curr2 = next2 >> (curr1 & 63); + uint64_t curr3 = next3 >> (curr2 & 63); + uint64_t curr4 = next4 >> (curr3 & 63); + uint64_t curr5 = next5 >> (curr4 & 63); + uint64_t curr6 = next6 >> (curr5 & 63); + uint64_t curr7 = next7 >> (curr6 & 63); + + if ((curr7 & 63) == kShiftDFAFinal * 6) { + // At the time of writing, using the same masking subexpressions from + // the preceding lines caused Clang to clutter the hot loop computing + // them - even though they aren't actually needed for shifting! Hence + // these rewritten conditions, which achieve a speedup factor of two. + if (((curr7-curr0) & 63) == 0) return p+1-prefix_size_; + if (((curr7-curr1) & 63) == 0) return p+2-prefix_size_; + if (((curr7-curr2) & 63) == 0) return p+3-prefix_size_; + if (((curr7-curr3) & 63) == 0) return p+4-prefix_size_; + if (((curr7-curr4) & 63) == 0) return p+5-prefix_size_; + if (((curr7-curr5) & 63) == 0) return p+6-prefix_size_; + if (((curr7-curr6) & 63) == 0) return p+7-prefix_size_; + if (((curr7-curr7) & 63) == 0) return p+8-prefix_size_; + } + + curr = curr7; + p += 8; + } while (p != endp); + data = p; + size = size&7; + } + + const uint8_t* p = reinterpret_cast(data); + const uint8_t* endp = p + size; + while (p != endp) { + uint8_t b = *p++; + uint64_t next = prefix_dfa_[b]; + curr = next >> (curr & 63); + if ((curr & 63) == kShiftDFAFinal * 6) + return p-prefix_size_; + } + return NULL; +} + +#if defined(__AVX2__) +// Finds the least significant non-zero bit in n. +static int FindLSBSet(uint32_t n) { + DCHECK_NE(n, 0); +#if defined(__GNUC__) + return __builtin_ctz(n); +#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) + unsigned long c; + _BitScanForward(&c, n); + return static_cast(c); +#else + int c = 31; + for (int shift = 1 << 4; shift != 0; shift >>= 1) { + uint32_t word = n << shift; + if (word != 0) { + n = word; + c -= shift; + } + } + return c; +#endif +} +#endif + +const void* Prog::PrefixAccel_FrontAndBack(const void* data, size_t size) { + DCHECK_GE(prefix_size_, 2); + if (size < prefix_size_) + return NULL; + // Don't bother searching the last prefix_size_-1 bytes for prefix_front_. + // This also means that probing for prefix_back_ doesn't go out of bounds. + size -= prefix_size_-1; + +#if defined(__AVX2__) + // Use AVX2 to look for prefix_front_ and prefix_back_ 32 bytes at a time. + if (size >= sizeof(__m256i)) { + const __m256i* fp = reinterpret_cast( + reinterpret_cast(data)); + const __m256i* bp = reinterpret_cast( + reinterpret_cast(data) + prefix_size_-1); + const __m256i* endfp = fp + size/sizeof(__m256i); + const __m256i f_set1 = _mm256_set1_epi8(prefix_front_); + const __m256i b_set1 = _mm256_set1_epi8(prefix_back_); + do { + const __m256i f_loadu = _mm256_loadu_si256(fp++); + const __m256i b_loadu = _mm256_loadu_si256(bp++); + const __m256i f_cmpeq = _mm256_cmpeq_epi8(f_set1, f_loadu); + const __m256i b_cmpeq = _mm256_cmpeq_epi8(b_set1, b_loadu); + const int fb_testz = _mm256_testz_si256(f_cmpeq, b_cmpeq); + if (fb_testz == 0) { // ZF: 1 means zero, 0 means non-zero. + const __m256i fb_and = _mm256_and_si256(f_cmpeq, b_cmpeq); + const int fb_movemask = _mm256_movemask_epi8(fb_and); + const int fb_ctz = FindLSBSet(fb_movemask); + return reinterpret_cast(fp-1) + fb_ctz; + } + } while (fp != endfp); + data = fp; + size = size%sizeof(__m256i); + } +#endif + + const char* p0 = reinterpret_cast(data); + for (const char* p = p0;; p++) { + DCHECK_GE(size, static_cast(p-p0)); + p = reinterpret_cast(memchr(p, prefix_front_, size - (p-p0))); + if (p == NULL || p[prefix_size_-1] == prefix_back_) + return p; + } +} + +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/prog.h b/src/duckdb/third_party/re2/re2/prog.h index 6eeefdd6..29be811a 100644 --- a/src/duckdb/third_party/re2/re2/prog.h +++ b/src/duckdb/third_party/re2/re2/prog.h @@ -18,10 +18,10 @@ #include "util/util.h" #include "util/logging.h" -#include "util/pod_array.h" -#include "util/sparse_array.h" -#include "util/sparse_set.h" +#include "re2/pod_array.h" #include "re2/re2.h" +#include "re2/sparse_array.h" +#include "re2/sparse_set.h" namespace duckdb_re2 { @@ -49,18 +49,6 @@ enum EmptyOp { kEmptyAllFlags = (1<<6)-1, }; -struct inst_byte_range_data_t { // opcode == kInstByteRange - uint8_t lo_; // byte range is lo_-hi_ inclusive - uint8_t hi_; // - uint16_t hint_foldcase_; // 15 bits: hint, 1 (low) bit: foldcase - // hint to execution engines: the delta to the - // next instruction (in the current list) worth - // exploring iff this instruction matched; 0 - // means there are no remaining possibilities, - // which is most likely for character classes. - // foldcase: A-Z -> a-z before checking range. -} ; - class DFA; class Regexp; @@ -96,10 +84,10 @@ class Prog { int out() { return out_opcode_>>4; } int out1() { DCHECK(opcode() == kInstAlt || opcode() == kInstAltMatch); return out1_; } int cap() { DCHECK_EQ(opcode(), kInstCapture); return cap_; } - int lo() { DCHECK_EQ(opcode(), kInstByteRange); return inst_byte_range_data_.lo_; } - int hi() { DCHECK_EQ(opcode(), kInstByteRange); return inst_byte_range_data_.hi_; } - int foldcase() { DCHECK_EQ(opcode(), kInstByteRange); return inst_byte_range_data_.hint_foldcase_&1; } - int hint() { DCHECK_EQ(opcode(), kInstByteRange); return inst_byte_range_data_.hint_foldcase_>>1; } + int lo() { DCHECK_EQ(opcode(), kInstByteRange); return lo_; } + int hi() { DCHECK_EQ(opcode(), kInstByteRange); return hi_; } + int foldcase() { DCHECK_EQ(opcode(), kInstByteRange); return hint_foldcase_&1; } + int hint() { DCHECK_EQ(opcode(), kInstByteRange); return hint_foldcase_>>1; } int match_id() { DCHECK_EQ(opcode(), kInstMatch); return match_id_; } EmptyOp empty() { DCHECK_EQ(opcode(), kInstEmptyWidth); return empty_; } @@ -115,7 +103,7 @@ class Prog { DCHECK_EQ(opcode(), kInstByteRange); if (foldcase() && 'A' <= c && c <= 'Z') c += 'a' - 'A'; - return inst_byte_range_data_.lo_ <= c && c <= inst_byte_range_data_.hi_; + return lo_ <= c && c <= hi_; } // Returns string representation for debugging. @@ -157,7 +145,17 @@ class Prog { int32_t match_id_; // opcode == kInstMatch // Match ID to identify this match (for duckdb_re2::Set). - struct inst_byte_range_data_t inst_byte_range_data_; + struct { // opcode == kInstByteRange + uint8_t lo_; // byte range is lo_-hi_ inclusive + uint8_t hi_; // + uint16_t hint_foldcase_; // 15 bits: hint, 1 (low) bit: foldcase + // hint to execution engines: the delta to the + // next instruction (in the current list) worth + // exploring iff this instruction matched; 0 + // means there are no remaining possibilities, + // which is most likely for character classes. + // foldcase: A-Z -> a-z before checking range. + }; EmptyOp empty_; // opcode == kInstEmptyWidth // empty_ is bitwise OR of kEmpty* flags above. @@ -200,8 +198,8 @@ class Prog { Inst *inst(int id) { return &inst_[id]; } int start() { return start_; } - int start_unanchored() { return start_unanchored_; } void set_start(int start) { start_ = start; } + int start_unanchored() { return start_unanchored_; } void set_start_unanchored(int start) { start_unanchored_ = start; } int size() { return size_; } bool reversed() { return reversed_; } @@ -209,19 +207,40 @@ class Prog { int list_count() { return list_count_; } int inst_count(InstOp op) { return inst_count_[op]; } uint16_t* list_heads() { return list_heads_.data(); } - void set_dfa_mem(int64_t dfa_mem) { dfa_mem_ = dfa_mem; } + size_t bit_state_text_max_size() { return bit_state_text_max_size_; } int64_t dfa_mem() { return dfa_mem_; } - int flags() { return flags_; } - void set_flags(int flags) { flags_ = flags; } + void set_dfa_mem(int64_t dfa_mem) { dfa_mem_ = dfa_mem; } bool anchor_start() { return anchor_start_; } void set_anchor_start(bool b) { anchor_start_ = b; } bool anchor_end() { return anchor_end_; } void set_anchor_end(bool b) { anchor_end_ = b; } int bytemap_range() { return bytemap_range_; } const uint8_t* bytemap() { return bytemap_; } + bool can_prefix_accel() { return prefix_size_ != 0; } + + // Accelerates to the first likely occurrence of the prefix. + // Returns a pointer to the first byte or NULL if not found. + const void* PrefixAccel(const void* data, size_t size) { + DCHECK(can_prefix_accel()); + if (prefix_foldcase_) { + return PrefixAccel_ShiftDFA(data, size); + } else if (prefix_size_ != 1) { + return PrefixAccel_FrontAndBack(data, size); + } else { + return memchr(data, prefix_front_, size); + } + } + + // Configures prefix accel using the analysis performed during compilation. + void ConfigurePrefixAccel(const std::string& prefix, bool prefix_foldcase); - // Lazily computed. - int first_byte(); + // An implementation of prefix accel that uses prefix_dfa_ to perform + // case-insensitive search. + const void* PrefixAccel_ShiftDFA(const void* data, size_t size); + + // An implementation of prefix accel that looks for prefix_front_ and + // prefix_back_ to return fewer false positives than memchr(3) alone. + const void* PrefixAccel_FrontAndBack(const void* data, size_t size); // Returns string representation of program for debugging. std::string Dump(); @@ -292,17 +311,9 @@ class Prog { // FOR TESTING OR EXPERIMENTAL PURPOSES ONLY. int BuildEntireDFA(MatchKind kind, const DFAStateCallback& cb); - // Controls whether the DFA should bail out early if the NFA would be faster. - // FOR TESTING ONLY. - static void TEST_dfa_should_bail_when_slow(bool b); - // Compute bytemap. void ComputeByteMap(); - // Computes whether all matches must begin with the same first - // byte, and if so, returns that byte. If not, returns -1. - int ComputeFirstByte(); - // Run peep-hole optimizer on program. void Optimize(); @@ -350,7 +361,6 @@ class Prog { // Returns true on success, false on error. bool PossibleMatchRange(std::string* min, std::string* max, int maxlen); - // EXPERIMENTAL! SUBJECT TO CHANGE! // Outputs the program fanout into the given sparse array. void Fanout(SparseArray* fanout); @@ -388,6 +398,10 @@ class Prog { // Computes hints for ByteRange instructions in [begin, end). void ComputeHints(std::vector* flat, int begin, int end); + // Controls whether the DFA should bail out early if the NFA would be faster. + // FOR TESTING ONLY. + static void TESTING_ONLY_set_dfa_should_bail_when_slow(bool b); + private: friend class Compiler; @@ -404,13 +418,22 @@ class Prog { int start_unanchored_; // unanchored entry point for program int size_; // number of instructions int bytemap_range_; // bytemap_[x] < bytemap_range_ - int first_byte_; // required first byte for match, or -1 if none - int flags_; // regexp parse flags - int list_count_; // count of lists (see above) - int inst_count_[kNumInst]; // count of instructions by opcode - PODArray list_heads_; // sparse array enumerating list heads - // not populated if size_ is overly large + bool prefix_foldcase_; // whether prefix is case-insensitive + size_t prefix_size_; // size of prefix (0 if no prefix) + union { + uint64_t* prefix_dfa_; // "Shift DFA" for prefix + struct { + int prefix_front_; // first byte of prefix + int prefix_back_; // last byte of prefix + }; + }; + + int list_count_; // count of lists (see above) + int inst_count_[kNumInst]; // count of instructions by opcode + PODArray list_heads_; // sparse array enumerating list heads + // not populated if size_ is overly large + size_t bit_state_text_max_size_; // upper bound (inclusive) on text.size() PODArray inst_; // pointer to instruction array PODArray onepass_nodes_; // data for OnePass nodes @@ -421,7 +444,6 @@ class Prog { uint8_t bytemap_[256]; // map from input bytes to byte classes - std::once_flag first_byte_once_; std::once_flag dfa_first_once_; std::once_flag dfa_longest_once_; @@ -429,6 +451,17 @@ class Prog { Prog& operator=(const Prog&) = delete; }; -} // namespace duckdb_re2 +// std::string_view in MSVC has iterators that aren't just pointers and +// that don't allow comparisons between different objects - not even if +// those objects are views into the same string! Thus, we provide these +// conversion functions for convenience. +static inline const char* BeginPtr(const StringPiece& s) { + return s.data(); +} +static inline const char* EndPtr(const StringPiece& s) { + return s.data() + s.size(); +} + +} // namespace re2 #endif // RE2_PROG_H_ diff --git a/src/duckdb/third_party/re2/re2/re2.cc b/src/duckdb/third_party/re2/re2/re2.cc index 569a82f6..17e9df02 100644 --- a/src/duckdb/third_party/re2/re2/re2.cc +++ b/src/duckdb/third_party/re2/re2/re2.cc @@ -12,10 +12,14 @@ #include #include #include +#ifdef _MSC_VER +#include +#endif #include #include #include #include +#include #include #include #include @@ -24,14 +28,21 @@ #include "util/util.h" #include "util/logging.h" -#include "util/sparse_array.h" #include "util/strutil.h" #include "util/utf.h" #include "re2/prog.h" #include "re2/regexp.h" +#include "re2/sparse_array.h" namespace duckdb_re2 { +// Controls the maximum count permitted by GlobalReplace(); -1 is unlimited. +static int maximum_global_replace_count = -1; + +void RE2::FUZZING_ONLY_set_maximum_global_replace_count(int i) { + maximum_global_replace_count = i; +} + // Maximum number of args we can set static const int kMaxArgs = 16; static const int kVecSize = 1+kMaxArgs; @@ -39,11 +50,11 @@ static const int kVecSize = 1+kMaxArgs; const int RE2::Options::kDefaultMaxMem; // initialized in re2.h RE2::Options::Options(RE2::CannedOptions opt) - : encoding_(opt == RE2::Latin1 ? EncodingLatin1 : EncodingUTF8), + : max_mem_(kDefaultMaxMem), + encoding_(opt == RE2::Latin1 ? EncodingLatin1 : EncodingUTF8), posix_syntax_(opt == RE2::POSIX), longest_match_(opt == RE2::POSIX), log_errors_(opt != RE2::Quiet), - max_mem_(kDefaultMaxMem), literal_(false), never_nl_(false), dot_nl_(false), @@ -54,11 +65,30 @@ RE2::Options::Options(RE2::CannedOptions opt) one_line_(false) { } -// static empty objects for use as const references. -// To avoid global constructors, allocated in RE2::Init(). -static const std::string* empty_string; -static const std::map* empty_named_groups; -static const std::map* empty_group_names; +// Empty objects for use as const references. +// Statically allocating the storage and then +// lazily constructing the objects (in a once +// in RE2::Init()) avoids global constructors +// and the false positives (thanks, Valgrind) +// about memory leaks at program termination. +struct EmptyStorage { + std::string empty_string; + std::map empty_named_groups; + std::map empty_group_names; +}; +alignas(EmptyStorage) static char empty_storage[sizeof(EmptyStorage)]; + +static inline std::string* empty_string() { + return &reinterpret_cast(empty_storage)->empty_string; +} + +static inline std::map* empty_named_groups() { + return &reinterpret_cast(empty_storage)->empty_named_groups; +} + +static inline std::map* empty_group_names() { + return &reinterpret_cast(empty_storage)->empty_group_names; +} // Converts from Regexp error code to RE2 error code. // Maybe some day they will diverge. In any event, this @@ -79,6 +109,8 @@ static RE2::ErrorCode RegexpErrorToRE2(duckdb_re2::RegexpStatusCode code) { return RE2::ErrorMissingBracket; case duckdb_re2::kRegexpMissingParen: return RE2::ErrorMissingParen; + case duckdb_re2::kRegexpUnexpectedParen: + return RE2::ErrorUnexpectedParen; case duckdb_re2::kRegexpTrailingBackslash: return RE2::ErrorTrailingBackslash; case duckdb_re2::kRegexpRepeatArgument: @@ -167,44 +199,53 @@ int RE2::Options::ParseFlags() const { void RE2::Init(const StringPiece& pattern, const Options& options) { static std::once_flag empty_once; std::call_once(empty_once, []() { - empty_string = new std::string; - empty_named_groups = new std::map; - empty_group_names = new std::map; + (void) new (empty_storage) EmptyStorage; }); - pattern_ = std::string(pattern); + pattern_ = new std::string(pattern); options_.Copy(options); entire_regexp_ = NULL; suffix_regexp_ = NULL; - prog_ = NULL; + error_ = empty_string(); + error_arg_ = empty_string(); + num_captures_ = -1; - rprog_ = NULL; - error_ = empty_string; error_code_ = NoError; + longest_match_ = options_.longest_match(); + is_one_pass_ = false; + prefix_foldcase_ = false; + prefix_.clear(); + prog_ = NULL; + + rprog_ = NULL; named_groups_ = NULL; group_names_ = NULL; RegexpStatus status; entire_regexp_ = Regexp::Parse( - pattern_, + *pattern_, static_cast(options_.ParseFlags()), &status); if (entire_regexp_ == NULL) { if (options_.log_errors()) { - LOG(ERROR) << "Error parsing '" << trunc(pattern_) << "': " + LOG(ERROR) << "Error parsing '" << trunc(*pattern_) << "': " << status.Text(); } error_ = new std::string(status.Text()); error_code_ = RegexpErrorToRE2(status.code()); - error_arg_ = std::string(status.error_arg()); + error_arg_ = new std::string(status.error_arg()); return; } + bool foldcase; duckdb_re2::Regexp* suffix; - if (entire_regexp_->RequiredPrefix(&prefix_, &prefix_foldcase_, &suffix)) + if (entire_regexp_->RequiredPrefix(&prefix_, &foldcase, &suffix)) { + prefix_foldcase_ = foldcase; suffix_regexp_ = suffix; - else + } + else { suffix_regexp_ = entire_regexp_->Incref(); + } // Two thirds of the memory goes to the forward Prog, // one third to the reverse prog, because the forward @@ -212,7 +253,7 @@ void RE2::Init(const StringPiece& pattern, const Options& options) { prog_ = suffix_regexp_->CompileToProg(options_.max_mem()*2/3); if (prog_ == NULL) { if (options_.log_errors()) - LOG(ERROR) << "Error compiling '" << trunc(pattern_) << "'"; + LOG(ERROR) << "Error compiling '" << trunc(*pattern_) << "'"; error_ = new std::string("pattern too large - compile failed"); error_code_ = RE2::ErrorPatternTooLarge; return; @@ -238,28 +279,34 @@ duckdb_re2::Prog* RE2::ReverseProg() const { re->suffix_regexp_->CompileToReverseProg(re->options_.max_mem() / 3); if (re->rprog_ == NULL) { if (re->options_.log_errors()) - LOG(ERROR) << "Error reverse compiling '" << trunc(re->pattern_) << "'"; - re->error_ = - new std::string("pattern too large - reverse compile failed"); - re->error_code_ = RE2::ErrorPatternTooLarge; + LOG(ERROR) << "Error reverse compiling '" << trunc(*re->pattern_) + << "'"; + // We no longer touch error_ and error_code_ because failing to compile + // the reverse Prog is not a showstopper: falling back to NFA execution + // is fine. More importantly, an RE2 object is supposed to be logically + // immutable: whatever ok() would have returned after Init() completed, + // it should continue to return that no matter what ReverseProg() does. } }, this); return rprog_; } RE2::~RE2() { + if (group_names_ != empty_group_names()) + delete group_names_; + if (named_groups_ != empty_named_groups()) + delete named_groups_; + delete rprog_; + delete prog_; + if (error_arg_ != empty_string()) + delete error_arg_; + if (error_ != empty_string()) + delete error_; if (suffix_regexp_) suffix_regexp_->Decref(); if (entire_regexp_) entire_regexp_->Decref(); - delete prog_; - delete rprog_; - if (error_ != empty_string) - delete error_; - if (named_groups_ != NULL && named_groups_ != empty_named_groups) - delete named_groups_; - if (group_names_ != NULL && group_names_ != empty_group_names) - delete group_names_; + delete pattern_; } int RE2::ProgramSize() const { @@ -277,28 +324,54 @@ int RE2::ReverseProgramSize() const { return prog->size(); } -static int Fanout(Prog* prog, std::map* histogram) { +// Finds the most significant non-zero bit in n. +static int FindMSBSet(uint32_t n) { + DCHECK_NE(n, 0); +#if defined(__GNUC__) + return 31 ^ __builtin_clz(n); +#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) + unsigned long c; + _BitScanReverse(&c, n); + return static_cast(c); +#else + int c = 0; + for (int shift = 1 << 4; shift != 0; shift >>= 1) { + uint32_t word = n >> shift; + if (word != 0) { + n = word; + c += shift; + } + } + return c; +#endif +} + +static int Fanout(Prog* prog, std::vector* histogram) { SparseArray fanout(prog->size()); prog->Fanout(&fanout); - histogram->clear(); + int data[32] = {}; + int size = 0; for (SparseArray::iterator i = fanout.begin(); i != fanout.end(); ++i) { - // TODO(junyer): Optimise this? - int bucket = 0; - while (1 << bucket < i->value()) { - bucket++; - } - (*histogram)[bucket]++; + if (i->value() == 0) + continue; + uint32_t value = i->value(); + int bucket = FindMSBSet(value); + bucket += value & (value-1) ? 1 : 0; + ++data[bucket]; + size = std::max(size, bucket+1); } - return histogram->rbegin()->first; + if (histogram != NULL) + histogram->assign(data, data+size); + return size-1; } -int RE2::ProgramFanout(std::map* histogram) const { +int RE2::ProgramFanout(std::vector* histogram) const { if (prog_ == NULL) return -1; return Fanout(prog_, histogram); } -int RE2::ReverseProgramFanout(std::map* histogram) const { +int RE2::ReverseProgramFanout(std::vector* histogram) const { if (prog_ == NULL) return -1; Prog* prog = ReverseProg(); @@ -313,7 +386,7 @@ const std::map& RE2::NamedCapturingGroups() const { if (re->suffix_regexp_ != NULL) re->named_groups_ = re->suffix_regexp_->NamedCaptures(); if (re->named_groups_ == NULL) - re->named_groups_ = empty_named_groups; + re->named_groups_ = empty_named_groups(); }, this); return *named_groups_; } @@ -324,7 +397,7 @@ const std::map& RE2::CapturingGroupNames() const { if (re->suffix_regexp_ != NULL) re->group_names_ = re->suffix_regexp_->CaptureNames(); if (re->group_names_ == NULL) - re->group_names_ = empty_group_names; + re->group_names_ = empty_group_names(); }, this); return *group_names_; } @@ -368,7 +441,9 @@ bool RE2::Replace(std::string* str, const StringPiece& rewrite) { StringPiece vec[kVecSize]; int nvec = 1 + MaxSubmatch(rewrite); - if (nvec > arraysize(vec)) + if (nvec > 1 + re.NumberOfCapturingGroups()) + return false; + if (nvec > static_cast(arraysize(vec))) return false; if (!re.Match(*str, 0, str->size(), UNANCHORED, vec, nvec)) return false; @@ -377,8 +452,8 @@ bool RE2::Replace(std::string* str, if (!re.Rewrite(&s, rewrite, vec, nvec)) return false; - assert(vec[0].begin() >= str->data()); - assert(vec[0].end() <= str->data()+str->size()); + assert(vec[0].data() >= str->data()); + assert(vec[0].data() + vec[0].size() <= str->data() + str->size()); str->replace(vec[0].data() - str->data(), vec[0].size(), s); return true; } @@ -388,7 +463,9 @@ int RE2::GlobalReplace(std::string* str, const StringPiece& rewrite) { StringPiece vec[kVecSize]; int nvec = 1 + MaxSubmatch(rewrite); - if (nvec > arraysize(vec)) + if (nvec > 1 + re.NumberOfCapturingGroups()) + return false; + if (nvec > static_cast(arraysize(vec))) return false; const char* p = str->data(); @@ -396,19 +473,16 @@ int RE2::GlobalReplace(std::string* str, const char* lastend = NULL; std::string out; int count = 0; -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - // Iterate just once when fuzzing. Otherwise, we easily get bogged down - // and coverage is unlikely to improve despite significant expense. - while (p == str->data()) { -#else while (p <= ep) { -#endif + if (maximum_global_replace_count != -1 && + count >= maximum_global_replace_count) + break; if (!re.Match(*str, static_cast(p - str->data()), str->size(), UNANCHORED, vec, nvec)) break; - if (p < vec[0].begin()) - out.append(p, vec[0].begin() - p); - if (vec[0].begin() == lastend && vec[0].size() == 0) { + if (p < vec[0].data()) + out.append(p, vec[0].data() - p); + if (vec[0].data() == lastend && vec[0].empty()) { // Disallow empty match at end of last match: skip ahead. // // fullrune() takes int, not ptrdiff_t. However, it just looks @@ -439,7 +513,7 @@ int RE2::GlobalReplace(std::string* str, continue; } re.Rewrite(&out, rewrite, vec, nvec); - p = vec[0].end(); + p = vec[0].data() + vec[0].size(); lastend = p; count++; } @@ -460,9 +534,10 @@ bool RE2::Extract(const StringPiece& text, std::string* out) { StringPiece vec[kVecSize]; int nvec = 1 + MaxSubmatch(rewrite); - if (nvec > arraysize(vec)) + if (nvec > 1 + re.NumberOfCapturingGroups()) + return false; + if (nvec > static_cast(arraysize(vec))) return false; - if (!re.Match(text, 0, text.size(), UNANCHORED, vec, nvec)) return false; @@ -566,15 +641,6 @@ static int ascii_strcasecmp(const char* a, const char* b, size_t len) { return 0; } -RE2::Anchor RE2::Anchored() const { - if (prog_->anchor_start()) { - if (prog_->anchor_end()) { - return Anchor::ANCHOR_BOTH; - } - return Anchor::ANCHOR_START; - } - return Anchor::UNANCHORED; -} /***** Actual matching and rewriting code *****/ @@ -619,6 +685,8 @@ bool RE2::Match(const StringPiece& text, // If the regexp is anchored explicitly, must not be in middle of text. if (prog_->anchor_start() && startpos != 0) return false; + if (prog_->anchor_end() && endpos != text.size()) + return false; // If the regexp is anchored explicitly, update re_anchor // so that we can potentially fall into a faster case below. @@ -649,53 +717,89 @@ bool RE2::Match(const StringPiece& text, } Prog::Anchor anchor = Prog::kUnanchored; - Prog::MatchKind kind = Prog::kFirstMatch; - if (options_.longest_match()) - kind = Prog::kLongestMatch; - bool skipped_test = false; - - bool can_one_pass = (is_one_pass_ && ncap <= Prog::kMaxOnePassCapture); + Prog::MatchKind kind = + longest_match_ ? Prog::kLongestMatch : Prog::kFirstMatch; - // BitState allocates a bitmap of size prog_->list_count() * text.size(). - // It also allocates a stack of 3-word structures which could potentially - // grow as large as prog_->list_count() * text.size(), but in practice is - // much smaller. - const int kMaxBitStateBitmapSize = 256*1024; // bitmap size <= max (bits) + bool can_one_pass = is_one_pass_ && ncap <= Prog::kMaxOnePassCapture; bool can_bit_state = prog_->CanBitState(); - size_t bit_state_text_max = kMaxBitStateBitmapSize / prog_->list_count(); + size_t bit_state_text_max_size = prog_->bit_state_text_max_size(); +#ifdef RE2_HAVE_THREAD_LOCAL + hooks::context = this; +#endif bool dfa_failed = false; + bool skipped_test = false; switch (re_anchor) { default: + LOG(DFATAL) << "Unexpected re_anchor value: " << re_anchor; + return false; + case UNANCHORED: { + if (prog_->anchor_end()) { + // This is a very special case: we don't need the forward DFA because + // we already know where the match must end! Instead, the reverse DFA + // can say whether there is a match and (optionally) where it starts. + Prog* prog = ReverseProg(); + if (prog == NULL) { + // Fall back to NFA below. + skipped_test = true; + break; + } + if (!prog->SearchDFA(subtext, text, Prog::kAnchored, + Prog::kLongestMatch, matchp, &dfa_failed, NULL)) { + if (dfa_failed) { + if (options_.log_errors()) + LOG(ERROR) << "DFA out of memory: " + << "pattern length " << pattern_->size() << ", " + << "program size " << prog->size() << ", " + << "list count " << prog->list_count() << ", " + << "bytemap range " << prog->bytemap_range(); + // Fall back to NFA below. + skipped_test = true; + break; + } + return false; + } + if (matchp == NULL) // Matched. Don't care where. + return true; + break; + } + if (!prog_->SearchDFA(subtext, text, anchor, kind, matchp, &dfa_failed, NULL)) { if (dfa_failed) { if (options_.log_errors()) - LOG(ERROR) << "DFA out of memory: size " << prog_->size() << ", " - << "bytemap range " << prog_->bytemap_range() << ", " - << "list count " << prog_->list_count(); + LOG(ERROR) << "DFA out of memory: " + << "pattern length " << pattern_->size() << ", " + << "program size " << prog_->size() << ", " + << "list count " << prog_->list_count() << ", " + << "bytemap range " << prog_->bytemap_range(); // Fall back to NFA below. skipped_test = true; break; } return false; } - if (matchp == NULL) // Matched. Don't care where + if (matchp == NULL) // Matched. Don't care where. return true; - // SearchDFA set match[0].end() but didn't know where the - // match started. Run the regexp backward from match[0].end() + // SearchDFA set match.end() but didn't know where the + // match started. Run the regexp backward from match.end() // to find the longest possible match -- that's where it started. Prog* prog = ReverseProg(); - if (prog == NULL) - return false; + if (prog == NULL) { + // Fall back to NFA below. + skipped_test = true; + break; + } if (!prog->SearchDFA(match, text, Prog::kAnchored, Prog::kLongestMatch, &match, &dfa_failed, NULL)) { if (dfa_failed) { if (options_.log_errors()) - LOG(ERROR) << "DFA out of memory: size " << prog->size() << ", " - << "bytemap range " << prog->bytemap_range() << ", " - << "list count " << prog->list_count(); + LOG(ERROR) << "DFA out of memory: " + << "pattern length " << pattern_->size() << ", " + << "program size " << prog->size() << ", " + << "list count " << prog->list_count() << ", " + << "bytemap range " << prog->bytemap_range(); // Fall back to NFA below. skipped_test = true; break; @@ -721,11 +825,12 @@ bool RE2::Match(const StringPiece& text, // it doesn't have the shared state and occasional mutex that // the DFA does. if (can_one_pass && text.size() <= 4096 && - (ncap > 1 || text.size() <= 8)) { + (ncap > 1 || text.size() <= 16)) { skipped_test = true; break; } - if (can_bit_state && text.size() <= bit_state_text_max && ncap > 1) { + if (can_bit_state && text.size() <= bit_state_text_max_size && + ncap > 1) { skipped_test = true; break; } @@ -733,9 +838,11 @@ bool RE2::Match(const StringPiece& text, &match, &dfa_failed, NULL)) { if (dfa_failed) { if (options_.log_errors()) - LOG(ERROR) << "DFA out of memory: size " << prog_->size() << ", " - << "bytemap range " << prog_->bytemap_range() << ", " - << "list count " << prog_->list_count(); + LOG(ERROR) << "DFA out of memory: " + << "pattern length " << pattern_->size() << ", " + << "program size " << prog_->size() << ", " + << "list count " << prog_->list_count() << ", " + << "bytemap range " << prog_->bytemap_range(); // Fall back to NFA below. skipped_test = true; break; @@ -770,7 +877,7 @@ bool RE2::Match(const StringPiece& text, LOG(ERROR) << "SearchOnePass inconsistency"; return false; } - } else if (can_bit_state && subtext1.size() <= bit_state_text_max) { + } else if (can_bit_state && subtext1.size() <= bit_state_text_max_size) { if (!prog_->SearchBitState(subtext1, text, anchor, kind, submatch, ncap)) { if (!skipped_test && options_.log_errors()) @@ -825,7 +932,7 @@ bool RE2::DoMatch(const StringPiece& text, StringPiece stkvec[kVecSize]; StringPiece* heapvec = NULL; - if (nvec <= arraysize(stkvec)) { + if (nvec <= static_cast(arraysize(stkvec))) { vec = stkvec; } else { vec = new StringPiece[nvec]; @@ -838,7 +945,7 @@ bool RE2::DoMatch(const StringPiece& text, } if (consumed != NULL) - *consumed = static_cast(vec[0].end() - text.begin()); + *consumed = static_cast(EndPtr(vec[0]) - BeginPtr(text)); if (n == 0 || args == NULL) { // We are not interested in results @@ -891,9 +998,10 @@ bool RE2::CheckRewriteString(const StringPiece& rewrite, } if (max_token > NumberOfCapturingGroups()) { - SStringPrintf(error, "Rewrite schema requests %d matches, " - "but the regexp only has %d parenthesized subexpressions.", - max_token, NumberOfCapturingGroups()); + *error = StringPrintf( + "Rewrite schema requests %d matches, but the regexp only has %d " + "parenthesized subexpressions.", + max_token, NumberOfCapturingGroups()); return false; } return true; @@ -936,13 +1044,13 @@ bool RE2::Rewrite(std::string* out, int n = (c - '0'); if (n >= veclen) { if (options_.log_errors()) { - LOG(ERROR) << "requested group " << n - << " in regexp " << rewrite.data(); + LOG(ERROR) << "invalid substitution \\" << n + << " from " << veclen << " groups"; } return false; } StringPiece snip = vec[n]; - if (snip.size() > 0) + if (!snip.empty()) out->append(snip.data(), snip.size()); } else if (c == '\\') { out->push_back('\\'); @@ -957,41 +1065,49 @@ bool RE2::Rewrite(std::string* out, /***** Parsers for various types *****/ -bool RE2::Arg::parse_null(const char* str, size_t n, void* dest) { +namespace re2_internal { + +template <> +bool Parse(const char* str, size_t n, void* dest) { // We fail if somebody asked us to store into a non-NULL void* pointer return (dest == NULL); } -bool RE2::Arg::parse_string(const char* str, size_t n, void* dest) { +template <> +bool Parse(const char* str, size_t n, std::string* dest) { if (dest == NULL) return true; - reinterpret_cast(dest)->assign(str, n); + dest->assign(str, n); return true; } -bool RE2::Arg::parse_stringpiece(const char* str, size_t n, void* dest) { +template <> +bool Parse(const char* str, size_t n, StringPiece* dest) { if (dest == NULL) return true; - *(reinterpret_cast(dest)) = StringPiece(str, n); + *dest = StringPiece(str, n); return true; } -bool RE2::Arg::parse_char(const char* str, size_t n, void* dest) { +template <> +bool Parse(const char* str, size_t n, char* dest) { if (n != 1) return false; if (dest == NULL) return true; - *(reinterpret_cast(dest)) = str[0]; + *dest = str[0]; return true; } -bool RE2::Arg::parse_schar(const char* str, size_t n, void* dest) { +template <> +bool Parse(const char* str, size_t n, signed char* dest) { if (n != 1) return false; if (dest == NULL) return true; - *(reinterpret_cast(dest)) = str[0]; + *dest = str[0]; return true; } -bool RE2::Arg::parse_uchar(const char* str, size_t n, void* dest) { +template <> +bool Parse(const char* str, size_t n, unsigned char* dest) { if (n != 1) return false; if (dest == NULL) return true; - *(reinterpret_cast(dest)) = str[0]; + *dest = str[0]; return true; } @@ -1055,10 +1171,40 @@ static const char* TerminateNumber(char* buf, size_t nbuf, const char* str, return buf; } -bool RE2::Arg::parse_long_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, float* dest) { + if (n == 0) return false; + static const int kMaxLength = 200; + char buf[kMaxLength+1]; + str = TerminateNumber(buf, sizeof buf, str, &n, true); + char* end; + errno = 0; + float r = strtof(str, &end); + if (end != str + n) return false; // Leftover junk + if (errno) return false; + if (dest == NULL) return true; + *dest = r; + return true; +} + +template <> +bool Parse(const char* str, size_t n, double* dest) { + if (n == 0) return false; + static const int kMaxLength = 200; + char buf[kMaxLength+1]; + str = TerminateNumber(buf, sizeof buf, str, &n, true); + char* end; + errno = 0; + double r = strtod(str, &end); + if (end != str + n) return false; // Leftover junk + if (errno) return false; + if (dest == NULL) return true; + *dest = r; + return true; +} + +template <> +bool Parse(const char* str, size_t n, long* dest, int radix) { if (n == 0) return false; char buf[kMaxNumberLength+1]; str = TerminateNumber(buf, sizeof buf, str, &n, false); @@ -1068,14 +1214,12 @@ bool RE2::Arg::parse_long_radix(const char* str, if (end != str + n) return false; // Leftover junk if (errno) return false; if (dest == NULL) return true; - *(reinterpret_cast(dest)) = r; + *dest = r; return true; } -bool RE2::Arg::parse_ulong_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, unsigned long* dest, int radix) { if (n == 0) return false; char buf[kMaxNumberLength+1]; str = TerminateNumber(buf, sizeof buf, str, &n, false); @@ -1091,62 +1235,52 @@ bool RE2::Arg::parse_ulong_radix(const char* str, if (end != str + n) return false; // Leftover junk if (errno) return false; if (dest == NULL) return true; - *(reinterpret_cast(dest)) = r; + *dest = r; return true; } -bool RE2::Arg::parse_short_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, short* dest, int radix) { long r; - if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse - if ((short)r != r) return false; // Out of range + if (!Parse(str, n, &r, radix)) return false; // Could not parse + if ((short)r != r) return false; // Out of range if (dest == NULL) return true; - *(reinterpret_cast(dest)) = (short)r; + *dest = (short)r; return true; } -bool RE2::Arg::parse_ushort_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, unsigned short* dest, int radix) { unsigned long r; - if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse - if ((unsigned short)r != r) return false; // Out of range + if (!Parse(str, n, &r, radix)) return false; // Could not parse + if ((unsigned short)r != r) return false; // Out of range if (dest == NULL) return true; - *(reinterpret_cast(dest)) = (unsigned short)r; + *dest = (unsigned short)r; return true; } -bool RE2::Arg::parse_int_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, int* dest, int radix) { long r; - if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse - if ((int)r != r) return false; // Out of range + if (!Parse(str, n, &r, radix)) return false; // Could not parse + if ((int)r != r) return false; // Out of range if (dest == NULL) return true; - *(reinterpret_cast(dest)) = (int)r; + *dest = (int)r; return true; } -bool RE2::Arg::parse_uint_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, unsigned int* dest, int radix) { unsigned long r; - if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse - if ((unsigned int)r != r) return false; // Out of range + if (!Parse(str, n, &r, radix)) return false; // Could not parse + if ((unsigned int)r != r) return false; // Out of range if (dest == NULL) return true; - *(reinterpret_cast(dest)) = (unsigned int)r; + *dest = (unsigned int)r; return true; } -bool RE2::Arg::parse_longlong_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, long long* dest, int radix) { if (n == 0) return false; char buf[kMaxNumberLength+1]; str = TerminateNumber(buf, sizeof buf, str, &n, false); @@ -1156,14 +1290,12 @@ bool RE2::Arg::parse_longlong_radix(const char* str, if (end != str + n) return false; // Leftover junk if (errno) return false; if (dest == NULL) return true; - *(reinterpret_cast(dest)) = r; + *dest = r; return true; } -bool RE2::Arg::parse_ulonglong_radix(const char* str, - size_t n, - void* dest, - int radix) { +template <> +bool Parse(const char* str, size_t n, unsigned long long* dest, int radix) { if (n == 0) return false; char buf[kMaxNumberLength+1]; str = TerminateNumber(buf, sizeof buf, str, &n, false); @@ -1178,67 +1310,47 @@ bool RE2::Arg::parse_ulonglong_radix(const char* str, if (end != str + n) return false; // Leftover junk if (errno) return false; if (dest == NULL) return true; - *(reinterpret_cast(dest)) = r; + *dest = r; return true; } -static bool parse_double_float(const char* str, size_t n, bool isfloat, - void* dest) { - if (n == 0) return false; - static const int kMaxLength = 200; - char buf[kMaxLength+1]; - str = TerminateNumber(buf, sizeof buf, str, &n, true); - char* end; - errno = 0; - double r; - if (isfloat) { - r = strtof(str, &end); - } else { - r = strtod(str, &end); - } - if (end != str + n) return false; // Leftover junk - if (errno) return false; - if (dest == NULL) return true; - if (isfloat) { - *(reinterpret_cast(dest)) = (float)r; - } else { - *(reinterpret_cast(dest)) = r; - } - return true; -} +} // namespace re2_internal -bool RE2::Arg::parse_double(const char* str, size_t n, void* dest) { - return parse_double_float(str, n, false, dest); -} +namespace hooks { -bool RE2::Arg::parse_float(const char* str, size_t n, void* dest) { - return parse_double_float(str, n, true, dest); -} +#ifdef RE2_HAVE_THREAD_LOCAL +thread_local const RE2* context = NULL; +#endif -#define DEFINE_INTEGER_PARSER(name) \ - bool RE2::Arg::parse_##name(const char* str, size_t n, void* dest) { \ - return parse_##name##_radix(str, n, dest, 10); \ - } \ - bool RE2::Arg::parse_##name##_hex(const char* str, size_t n, void* dest) { \ - return parse_##name##_radix(str, n, dest, 16); \ - } \ - bool RE2::Arg::parse_##name##_octal(const char* str, size_t n, void* dest) { \ - return parse_##name##_radix(str, n, dest, 8); \ - } \ - bool RE2::Arg::parse_##name##_cradix(const char* str, size_t n, \ - void* dest) { \ - return parse_##name##_radix(str, n, dest, 0); \ - } +template +union Hook { + void Store(T* cb) { cb_.store(cb, std::memory_order_release); } + T* Load() const { return cb_.load(std::memory_order_acquire); } + +#if !defined(__clang__) && defined(_MSC_VER) + // Citing https://github.com/protocolbuffers/protobuf/pull/4777 as precedent, + // this is a gross hack to make std::atomic constant-initialized on MSVC. + static_assert(ATOMIC_POINTER_LOCK_FREE == 2, + "std::atomic must be always lock-free"); + T* cb_for_constinit_; +#endif + + std::atomic cb_; +}; + +template +static void DoNothing(const T&) {} + +#define DEFINE_HOOK(type, name) \ + static Hook name##_hook = {{&DoNothing}}; \ + void Set##type##Hook(type##Callback* cb) { name##_hook.Store(cb); } \ + type##Callback* Get##type##Hook() { return name##_hook.Load(); } + +DEFINE_HOOK(DFAStateCacheReset, dfa_state_cache_reset) +DEFINE_HOOK(DFASearchFailure, dfa_search_failure) -DEFINE_INTEGER_PARSER(short) -DEFINE_INTEGER_PARSER(ushort) -DEFINE_INTEGER_PARSER(int) -DEFINE_INTEGER_PARSER(uint) -DEFINE_INTEGER_PARSER(long) -DEFINE_INTEGER_PARSER(ulong) -DEFINE_INTEGER_PARSER(longlong) -DEFINE_INTEGER_PARSER(ulonglong) +#undef DEFINE_HOOK -#undef DEFINE_INTEGER_PARSER +} // namespace hooks -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/re2.h b/src/duckdb/third_party/re2/re2/re2.h index 56a664fc..f3493601 100644 --- a/src/duckdb/third_party/re2/re2/re2.h +++ b/src/duckdb/third_party/re2/re2/re2.h @@ -30,6 +30,19 @@ // "(?i)hello" -- (?i) turns on case-insensitive matching // "/\\*(.*?)\\*/" -- .*? matches . minimum no. of times possible // +// The double backslashes are needed when writing C++ string literals. +// However, they should NOT be used when writing C++11 raw string literals: +// +// R"(hello (\w+) world)" -- \w matches a "word" character +// R"(version (\d+))" -- \d matches a digit +// R"(hello\s+world)" -- \s matches any whitespace character +// R"(\b(\w+)\b)" -- \b matches non-empty string at word boundary +// R"((?i)hello)" -- (?i) turns on case-insensitive matching +// R"(/\*(.*?)\*/)" -- .*? matches . minimum no. of times possible +// +// When using UTF-8 encoding, case-insensitive matching will perform +// simple case folding, not full case folding. +// // ----------------------------------------------------------------------- // MATCHING INTERFACE: // @@ -53,17 +66,17 @@ // CHECK(RE2::FullMatch(latin1_string, RE2(latin1_pattern, RE2::Latin1))); // // ----------------------------------------------------------------------- -// MATCHING WITH SUBSTRING EXTRACTION: +// SUBMATCH EXTRACTION: // -// You can supply extra pointer arguments to extract matched substrings. +// You can supply extra pointer arguments to extract submatches. // On match failure, none of the pointees will have been modified. -// On match success, the substrings will be converted (as necessary) and +// On match success, the submatches will be converted (as necessary) and // their values will be assigned to their pointees until all conversions // have succeeded or one conversion has failed. // On conversion failure, the pointees will be in an indeterminate state // because the caller has no way of knowing which conversion failed. // However, conversion cannot fail for types like string and StringPiece -// that do not inspect the substring contents. Hence, in the common case +// that do not inspect the submatch contents. Hence, in the common case // where all of the pointees are of such types, failure is always due to // match failure and thus none of the pointees will have been modified. // @@ -87,10 +100,10 @@ // Example: integer overflow causes failure // CHECK(!RE2::FullMatch("ruby:1234567891234", "\\w+:(\\d+)", &i)); // -// NOTE(rsc): Asking for substrings slows successful matches quite a bit. +// NOTE(rsc): Asking for submatches slows successful matches quite a bit. // This may get a little faster in the future, but right now is slower // than PCRE. On the other hand, failed matches run *very* fast (faster -// than PCRE), as do matches without substring extraction. +// than PCRE), as do matches without submatch extraction. // // ----------------------------------------------------------------------- // PARTIAL MATCHES @@ -195,13 +208,19 @@ #include #include #include +#include +#include + +#if defined(__APPLE__) +#include +#endif #include "re2/stringpiece.h" namespace duckdb_re2 { class Prog; class Regexp; -} // namespace duckdb_re2 +} // namespace re2 namespace duckdb_re2 { @@ -229,6 +248,7 @@ class RE2 { ErrorBadCharRange, // bad character class range ErrorMissingBracket, // missing closing ] ErrorMissingParen, // missing closing ) + ErrorUnexpectedParen, // unexpected closing ) ErrorTrailingBackslash, // trailing \ at end of regexp ErrorRepeatArgument, // repeat argument missing, e.g. "*" ErrorRepeatSize, // bad repetition argument @@ -254,21 +274,33 @@ class RE2 { // Need to have the const char* and const std::string& forms for implicit // conversions when passing string literals to FullMatch and PartialMatch. // Otherwise the StringPiece form would be sufficient. -#ifndef SWIG RE2(const char* pattern); RE2(const std::string& pattern); -#endif RE2(const StringPiece& pattern); RE2(const StringPiece& pattern, const Options& options); ~RE2(); + // Not copyable. + // RE2 objects are expensive. You should probably use std::shared_ptr + // instead. If you really must copy, RE2(first.pattern(), first.options()) + // effectively does so: it produces a second object that mimics the first. + RE2(const RE2&) = delete; + RE2& operator=(const RE2&) = delete; + // Not movable. + // RE2 objects are thread-safe and logically immutable. You should probably + // use std::unique_ptr instead. Otherwise, consider std::deque if + // direct emplacement into a container is desired. If you really must move, + // be prepared to submit a design document along with your feature request. + RE2(RE2&&) = delete; + RE2& operator=(RE2&&) = delete; + // Returns whether RE2 was created properly. bool ok() const { return error_code() == NoError; } // The string specification for this RE2. E.g. // RE2 re("ab*c?d+"); // re.pattern(); // "ab*c?d+" - const std::string& pattern() const { return pattern_; } + const std::string& pattern() const { return *pattern_; } // If RE2 could not be created properly, returns an error string. // Else returns the empty string. @@ -280,18 +312,18 @@ class RE2 { // If RE2 could not be created properly, returns the offending // portion of the regexp. - const std::string& error_arg() const { return error_arg_; } + const std::string& error_arg() const { return *error_arg_; } // Returns the program size, a very approximate measure of a regexp's "cost". // Larger numbers are more expensive than smaller numbers. int ProgramSize() const; int ReverseProgramSize() const; - // EXPERIMENTAL! SUBJECT TO CHANGE! - // Outputs the program fanout as a histogram bucketed by powers of 2. + // If histogram is not null, outputs the program fanout + // as a histogram bucketed by powers of 2. // Returns the number of the largest non-empty bucket. - int ProgramFanout(std::map* histogram) const; - int ReverseProgramFanout(std::map* histogram) const; + int ProgramFanout(std::vector* histogram) const; + int ReverseProgramFanout(std::vector* histogram) const; // Returns the underlying Regexp; not for general use. // Returns entire_regexp_ so that callers don't need @@ -313,7 +345,6 @@ class RE2 { static bool FindAndConsumeN(StringPiece* input, const RE2& re, const Arg* const args[], int n); -#ifndef SWIG private: template static inline bool Apply(F f, SP sp, const RE2& re) { @@ -349,12 +380,12 @@ class RE2 { // (void*)NULL (the corresponding matched sub-pattern is not copied) // // Returns true iff all of the following conditions are satisfied: - // a. "text" matches "re" exactly - // b. The number of matched sub-patterns is >= number of supplied pointers + // a. "text" matches "re" fully - from the beginning to the end of "text". + // b. The number of matched sub-patterns is >= number of supplied pointers. // c. The "i"th argument has a suitable type for holding the // string captured as the "i"th sub-pattern. If you pass in // NULL for the "i"th argument, or pass fewer arguments than - // number of sub-patterns, "i"th captured sub-pattern is + // number of sub-patterns, the "i"th captured sub-pattern is // ignored. // // CAVEAT: An optional sub-pattern that does not exist in the @@ -368,8 +399,17 @@ class RE2 { return Apply(FullMatchN, text, re, Arg(std::forward(a))...); } - // Exactly like FullMatch(), except that "re" is allowed to match - // a substring of "text". + // Like FullMatch(), except that "re" is allowed to match a substring + // of "text". + // + // Returns true iff all of the following conditions are satisfied: + // a. "text" matches "re" partially - for some substring of "text". + // b. The number of matched sub-patterns is >= number of supplied pointers. + // c. The "i"th argument has a suitable type for holding the + // string captured as the "i"th sub-pattern. If you pass in + // NULL for the "i"th argument, or pass fewer arguments than + // number of sub-patterns, the "i"th captured sub-pattern is + // ignored. template static bool PartialMatch(const StringPiece& text, const RE2& re, A&&... a) { return Apply(PartialMatchN, text, re, Arg(std::forward(a))...); @@ -378,7 +418,16 @@ class RE2 { // Like FullMatch() and PartialMatch(), except that "re" has to match // a prefix of the text, and "input" is advanced past the matched // text. Note: "input" is modified iff this routine returns true - // and "re" matched a non-empty substring of "text". + // and "re" matched a non-empty substring of "input". + // + // Returns true iff all of the following conditions are satisfied: + // a. "input" matches "re" partially - for some prefix of "input". + // b. The number of matched sub-patterns is >= number of supplied pointers. + // c. The "i"th argument has a suitable type for holding the + // string captured as the "i"th sub-pattern. If you pass in + // NULL for the "i"th argument, or pass fewer arguments than + // number of sub-patterns, the "i"th captured sub-pattern is + // ignored. template static bool Consume(StringPiece* input, const RE2& re, A&&... a) { return Apply(ConsumeN, input, re, Arg(std::forward(a))...); @@ -388,11 +437,19 @@ class RE2 { // the text. That is, "re" need not start its match at the beginning // of "input". For example, "FindAndConsume(s, "(\\w+)", &word)" finds // the next word in "s" and stores it in "word". + // + // Returns true iff all of the following conditions are satisfied: + // a. "input" matches "re" partially - for some substring of "input". + // b. The number of matched sub-patterns is >= number of supplied pointers. + // c. The "i"th argument has a suitable type for holding the + // string captured as the "i"th sub-pattern. If you pass in + // NULL for the "i"th argument, or pass fewer arguments than + // number of sub-patterns, the "i"th captured sub-pattern is + // ignored. template static bool FindAndConsume(StringPiece* input, const RE2& re, A&&... a) { return Apply(FindAndConsumeN, input, re, Arg(std::forward(a))...); } -#endif // Replace the first match of "re" in "str" with "rewrite". // Within "rewrite", backslash-escaped digits (\1 to \9) can be @@ -443,7 +500,7 @@ class RE2 { // Escapes all potentially meaningful regexp characters in // 'unquoted'. The returned string, used as a regular expression, - // will exactly match the original string. For example, + // will match exactly the original string. For example, // 1.5-2.0? // may become: // 1\.5\-2\.0\? @@ -475,8 +532,6 @@ class RE2 { ANCHOR_BOTH // Anchor at start and end }; - Anchor Anchored() const; - // Return the number of capturing subpatterns, or -1 if the // regexp wasn't valid on construction. The overall match ($0) // does not count: if the regexp is "(a)(b)", returns 2. @@ -608,11 +663,11 @@ class RE2 { }; Options() : + max_mem_(kDefaultMaxMem), encoding_(EncodingUTF8), posix_syntax_(false), longest_match_(false), log_errors_(true), - max_mem_(kDefaultMaxMem), literal_(false), never_nl_(false), dot_nl_(false), @@ -625,20 +680,12 @@ class RE2 { /*implicit*/ Options(CannedOptions); + int64_t max_mem() const { return max_mem_; } + void set_max_mem(int64_t m) { max_mem_ = m; } + Encoding encoding() const { return encoding_; } void set_encoding(Encoding encoding) { encoding_ = encoding; } - // Legacy interface to encoding. - // TODO(rsc): Remove once clients have been converted. - bool utf8() const { return encoding_ == EncodingUTF8; } - void set_utf8(bool b) { - if (b) { - encoding_ = EncodingUTF8; - } else { - encoding_ = EncodingLatin1; - } - } - bool posix_syntax() const { return posix_syntax_; } void set_posix_syntax(bool b) { posix_syntax_ = b; } @@ -648,9 +695,6 @@ class RE2 { bool log_errors() const { return log_errors_; } void set_log_errors(bool b) { log_errors_ = b; } - int64_t max_mem() const { return max_mem_; } - void set_max_mem(int64_t m) { max_mem_ = m; } - bool literal() const { return literal_; } void set_literal(bool b) { literal_ = b; } @@ -682,11 +726,11 @@ class RE2 { int ParseFlags() const; private: + int64_t max_mem_; Encoding encoding_; bool posix_syntax_; bool longest_match_; bool log_errors_; - int64_t max_mem_; bool literal_; bool never_nl_; bool dot_nl_; @@ -701,32 +745,16 @@ class RE2 { const Options& options() const { return options_; } // Argument converters; see below. - static inline Arg CRadix(short* x); - static inline Arg CRadix(unsigned short* x); - static inline Arg CRadix(int* x); - static inline Arg CRadix(unsigned int* x); - static inline Arg CRadix(long* x); - static inline Arg CRadix(unsigned long* x); - static inline Arg CRadix(long long* x); - static inline Arg CRadix(unsigned long long* x); - - static inline Arg Hex(short* x); - static inline Arg Hex(unsigned short* x); - static inline Arg Hex(int* x); - static inline Arg Hex(unsigned int* x); - static inline Arg Hex(long* x); - static inline Arg Hex(unsigned long* x); - static inline Arg Hex(long long* x); - static inline Arg Hex(unsigned long long* x); - - static inline Arg Octal(short* x); - static inline Arg Octal(unsigned short* x); - static inline Arg Octal(int* x); - static inline Arg Octal(unsigned int* x); - static inline Arg Octal(long* x); - static inline Arg Octal(unsigned long* x); - static inline Arg Octal(long long* x); - static inline Arg Octal(unsigned long long* x); + template + static Arg CRadix(T* ptr); + template + static Arg Hex(T* ptr); + template + static Arg Octal(T* ptr); + + // Controls the maximum count permitted by GlobalReplace(); -1 is unlimited. + // FOR FUZZING ONLY. + static void FUZZING_ONLY_set_maximum_global_replace_count(int i); private: void Init(const StringPiece& pattern, const Options& options); @@ -739,166 +767,167 @@ class RE2 { duckdb_re2::Prog* ReverseProg() const; - std::string pattern_; // string regular expression - Options options_; // option flags - std::string prefix_; // required prefix (before regexp_) - bool prefix_foldcase_; // prefix is ASCII case-insensitive - duckdb_re2::Regexp* entire_regexp_; // parsed regular expression - duckdb_re2::Regexp* suffix_regexp_; // parsed regular expression, prefix removed - duckdb_re2::Prog* prog_; // compiled program for regexp - int num_captures_; // Number of capturing groups - bool is_one_pass_; // can use prog_->SearchOnePass? - - mutable duckdb_re2::Prog* rprog_; // reverse program for regexp - mutable const std::string* error_; // Error indicator - // (or points to empty string) - mutable ErrorCode error_code_; // Error code - mutable std::string error_arg_; // Fragment of regexp showing error - + // First cache line is relatively cold fields. + const std::string* pattern_; // string regular expression + Options options_; // option flags + duckdb_re2::Regexp* entire_regexp_; // parsed regular expression + duckdb_re2::Regexp* suffix_regexp_; // parsed regular expression, prefix_ removed + const std::string* error_; // error indicator (or points to empty string) + const std::string* error_arg_; // fragment of regexp showing error (or ditto) + + // Second cache line is relatively hot fields. + // These are ordered oddly to pack everything. + int num_captures_; // number of capturing groups + ErrorCode error_code_ : 29; // error code (29 bits is more than enough) + bool longest_match_ : 1; // cached copy of options_.longest_match() + bool is_one_pass_ : 1; // can use prog_->SearchOnePass? + bool prefix_foldcase_ : 1; // prefix_ is ASCII case-insensitive + std::string prefix_; // required prefix (before suffix_regexp_) + duckdb_re2::Prog* prog_; // compiled program for regexp + + // Reverse Prog for DFA execution only + mutable duckdb_re2::Prog* rprog_; // Map from capture names to indices mutable const std::map* named_groups_; - // Map from capture indices to names mutable const std::map* group_names_; - // Onces for lazy computations. mutable std::once_flag rprog_once_; mutable std::once_flag named_groups_once_; mutable std::once_flag group_names_once_; - - RE2(const RE2&) = delete; - RE2& operator=(const RE2&) = delete; }; /***** Implementation details *****/ -// Hex/Octal/Binary? - -// Special class for parsing into objects that define a ParseFrom() method -template -class _RE2_MatchObject { - public: - static inline bool Parse(const char* str, size_t n, void* dest) { - if (dest == NULL) return true; - T* object = reinterpret_cast(dest); - return object->ParseFrom(str, n); - } -}; +namespace re2_internal { + +// Types for which the 3-ary Parse() function template has specializations. +template struct Parse3ary : public std::false_type {}; +template <> struct Parse3ary : public std::true_type {}; +template <> struct Parse3ary : public std::true_type {}; +template <> struct Parse3ary : public std::true_type {}; +template <> struct Parse3ary : public std::true_type {}; +template <> struct Parse3ary : public std::true_type {}; +template <> struct Parse3ary : public std::true_type {}; +template <> struct Parse3ary : public std::true_type {}; +template <> struct Parse3ary : public std::true_type {}; + +template +bool Parse(const char* str, size_t n, T* dest); + +// Types for which the 4-ary Parse() function template has specializations. +template struct Parse4ary : public std::false_type {}; +template <> struct Parse4ary : public std::true_type {}; +template <> struct Parse4ary : public std::true_type {}; +template <> struct Parse4ary : public std::true_type {}; +template <> struct Parse4ary : public std::true_type {}; +template <> struct Parse4ary : public std::true_type {}; +template <> struct Parse4ary : public std::true_type {}; +template <> struct Parse4ary : public std::true_type {}; +template <> struct Parse4ary : public std::true_type {}; + +template +bool Parse(const char* str, size_t n, T* dest, int radix); + +} // namespace re2_internal class RE2::Arg { + private: + template + using CanParse3ary = typename std::enable_if< + re2_internal::Parse3ary::value, + int>::type; + + template + using CanParse4ary = typename std::enable_if< + re2_internal::Parse4ary::value, + int>::type; + +#if !defined(_MSC_VER) + template + using CanParseFrom = typename std::enable_if< + std::is_member_function_pointer< + decltype(static_cast( + &T::ParseFrom))>::value, + int>::type; +#endif + public: - // Empty constructor so we can declare arrays of RE2::Arg - Arg(); + Arg() : Arg(nullptr) {} + Arg(std::nullptr_t ptr) : arg_(ptr), parser_(DoNothing) {} - // Constructor specially designed for NULL arguments - Arg(void*); - Arg(std::nullptr_t); + template = 0> + Arg(T* ptr) : arg_(ptr), parser_(DoParse3ary) {} - typedef bool (*Parser)(const char* str, size_t n, void* dest); + template = 0> + Arg(T* ptr) : arg_(ptr), parser_(DoParse4ary) {} -// Type-specific parsers -#define MAKE_PARSER(type, name) \ - Arg(type* p) : arg_(p), parser_(name) {} \ - Arg(type* p, Parser parser) : arg_(p), parser_(parser) {} - - MAKE_PARSER(char, parse_char) - MAKE_PARSER(signed char, parse_schar) - MAKE_PARSER(unsigned char, parse_uchar) - MAKE_PARSER(float, parse_float) - MAKE_PARSER(double, parse_double) - MAKE_PARSER(std::string, parse_string) - MAKE_PARSER(StringPiece, parse_stringpiece) - - MAKE_PARSER(short, parse_short) - MAKE_PARSER(unsigned short, parse_ushort) - MAKE_PARSER(int, parse_int) - MAKE_PARSER(unsigned int, parse_uint) - MAKE_PARSER(long, parse_long) - MAKE_PARSER(unsigned long, parse_ulong) - MAKE_PARSER(long long, parse_longlong) - MAKE_PARSER(unsigned long long, parse_ulonglong) - -#undef MAKE_PARSER - - // Generic constructor templates - template Arg(T* p) - : arg_(p), parser_(_RE2_MatchObject::Parse) { } - template Arg(T* p, Parser parser) - : arg_(p), parser_(parser) { } - - // Parse the data - bool Parse(const char* str, size_t n) const; +#if !defined(_MSC_VER) + template = 0> + Arg(T* ptr) : arg_(ptr), parser_(DoParseFrom) {} +#endif - private: - void* arg_; - Parser parser_; + typedef bool (*Parser)(const char* str, size_t n, void* dest); - static bool parse_null (const char* str, size_t n, void* dest); - static bool parse_char (const char* str, size_t n, void* dest); - static bool parse_schar (const char* str, size_t n, void* dest); - static bool parse_uchar (const char* str, size_t n, void* dest); - static bool parse_float (const char* str, size_t n, void* dest); - static bool parse_double (const char* str, size_t n, void* dest); - static bool parse_string (const char* str, size_t n, void* dest); - static bool parse_stringpiece (const char* str, size_t n, void* dest); - -#define DECLARE_INTEGER_PARSER(name) \ - private: \ - static bool parse_##name(const char* str, size_t n, void* dest); \ - static bool parse_##name##_radix(const char* str, size_t n, void* dest, \ - int radix); \ - \ - public: \ - static bool parse_##name##_hex(const char* str, size_t n, void* dest); \ - static bool parse_##name##_octal(const char* str, size_t n, void* dest); \ - static bool parse_##name##_cradix(const char* str, size_t n, void* dest); - - DECLARE_INTEGER_PARSER(short) - DECLARE_INTEGER_PARSER(ushort) - DECLARE_INTEGER_PARSER(int) - DECLARE_INTEGER_PARSER(uint) - DECLARE_INTEGER_PARSER(long) - DECLARE_INTEGER_PARSER(ulong) - DECLARE_INTEGER_PARSER(longlong) - DECLARE_INTEGER_PARSER(ulonglong) - -#undef DECLARE_INTEGER_PARSER + template + Arg(T* ptr, Parser parser) : arg_(ptr), parser_(parser) {} -}; + bool Parse(const char* str, size_t n) const { + return (*parser_)(str, n, arg_); + } -inline RE2::Arg::Arg() : arg_(NULL), parser_(parse_null) { } -inline RE2::Arg::Arg(void* p) : arg_(p), parser_(parse_null) { } -inline RE2::Arg::Arg(std::nullptr_t p) : arg_(p), parser_(parse_null) { } + private: + static bool DoNothing(const char* /*str*/, size_t /*n*/, void* /*dest*/) { + return true; + } -inline bool RE2::Arg::Parse(const char* str, size_t n) const { - return (*parser_)(str, n, arg_); -} + template + static bool DoParse3ary(const char* str, size_t n, void* dest) { + return re2_internal::Parse(str, n, reinterpret_cast(dest)); + } -// This part of the parser, appropriate only for ints, deals with bases -#define MAKE_INTEGER_PARSER(type, name) \ - inline RE2::Arg RE2::Hex(type* ptr) { \ - return RE2::Arg(ptr, RE2::Arg::parse_##name##_hex); \ - } \ - inline RE2::Arg RE2::Octal(type* ptr) { \ - return RE2::Arg(ptr, RE2::Arg::parse_##name##_octal); \ - } \ - inline RE2::Arg RE2::CRadix(type* ptr) { \ - return RE2::Arg(ptr, RE2::Arg::parse_##name##_cradix); \ + template + static bool DoParse4ary(const char* str, size_t n, void* dest) { + return re2_internal::Parse(str, n, reinterpret_cast(dest), 10); } -MAKE_INTEGER_PARSER(short, short) -MAKE_INTEGER_PARSER(unsigned short, ushort) -MAKE_INTEGER_PARSER(int, int) -MAKE_INTEGER_PARSER(unsigned int, uint) -MAKE_INTEGER_PARSER(long, long) -MAKE_INTEGER_PARSER(unsigned long, ulong) -MAKE_INTEGER_PARSER(long long, longlong) -MAKE_INTEGER_PARSER(unsigned long long, ulonglong) +#if !defined(_MSC_VER) + template + static bool DoParseFrom(const char* str, size_t n, void* dest) { + if (dest == NULL) return true; + return reinterpret_cast(dest)->ParseFrom(str, n); + } +#endif -#undef MAKE_INTEGER_PARSER + void* arg_; + Parser parser_; +}; + +template +inline RE2::Arg RE2::CRadix(T* ptr) { + return RE2::Arg(ptr, [](const char* str, size_t n, void* dest) -> bool { + return re2_internal::Parse(str, n, reinterpret_cast(dest), 0); + }); +} + +template +inline RE2::Arg RE2::Hex(T* ptr) { + return RE2::Arg(ptr, [](const char* str, size_t n, void* dest) -> bool { + return re2_internal::Parse(str, n, reinterpret_cast(dest), 16); + }); +} -#ifndef SWIG +template +inline RE2::Arg RE2::Octal(T* ptr) { + return RE2::Arg(ptr, [](const char* str, size_t n, void* dest) -> bool { + return re2_internal::Parse(str, n, reinterpret_cast(dest), 8); + }); +} +// Silence warnings about missing initializers for members of LazyRE2. +#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ >= 6 +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif // Helper for writing global or static RE2s safely. // Write @@ -945,9 +974,56 @@ class LazyRE2 { void operator=(const LazyRE2&); // disallowed }; -#endif // SWIG -} // namespace duckdb_re2 +namespace hooks { + +// Most platforms support thread_local. Older versions of iOS don't support +// thread_local, but for the sake of brevity, we lump together all versions +// of Apple platforms that aren't macOS. If an iOS application really needs +// the context pointee someday, we can get more specific then... +// +// As per https://github.com/google/re2/issues/325, thread_local support in +// MinGW seems to be buggy. (FWIW, Abseil folks also avoid it.) +#define RE2_HAVE_THREAD_LOCAL +#if (defined(__APPLE__) && !(defined(TARGET_OS_OSX) && TARGET_OS_OSX)) || defined(__MINGW32__) +#undef RE2_HAVE_THREAD_LOCAL +#endif + +// A hook must not make any assumptions regarding the lifetime of the context +// pointee beyond the current invocation of the hook. Pointers and references +// obtained via the context pointee should be considered invalidated when the +// hook returns. Hence, any data about the context pointee (e.g. its pattern) +// would have to be copied in order for it to be kept for an indefinite time. +// +// A hook must not use RE2 for matching. Control flow reentering RE2::Match() +// could result in infinite mutual recursion. To discourage that possibility, +// RE2 will not maintain the context pointer correctly when used in that way. +#ifdef RE2_HAVE_THREAD_LOCAL +extern thread_local const RE2* context; +#endif + +struct DFAStateCacheReset { + int64_t state_budget; + size_t state_cache_size; +}; + +struct DFASearchFailure { + // Nothing yet... +}; + +#define DECLARE_HOOK(type) \ + using type##Callback = void(const type&); \ + void Set##type##Hook(type##Callback* cb); \ + type##Callback* Get##type##Hook(); + +DECLARE_HOOK(DFAStateCacheReset) +DECLARE_HOOK(DFASearchFailure) + +#undef DECLARE_HOOK + +} // namespace hooks + +} // namespace re2 using duckdb_re2::RE2; using duckdb_re2::LazyRE2; diff --git a/src/duckdb/third_party/re2/re2/regexp.cc b/src/duckdb/third_party/re2/re2/regexp.cc index 182fd19e..9bd8ac54 100644 --- a/src/duckdb/third_party/re2/re2/regexp.cc +++ b/src/duckdb/third_party/re2/re2/regexp.cc @@ -20,9 +20,17 @@ #include "util/logging.h" #include "util/mutex.h" #include "util/utf.h" +#include "re2/pod_array.h" #include "re2/stringpiece.h" #include "re2/walker-inl.h" +#ifdef min +#undef min +#endif +#ifdef max +#undef max +#endif + namespace duckdb_re2 { // Constructor. Allocates vectors as appropriate for operator. @@ -34,7 +42,7 @@ Regexp::Regexp(RegexpOp op, ParseFlags parse_flags) nsub_(0), down_(NULL) { subone_ = NULL; - memset(the_union_, 0, sizeof the_union_); + memset(arguments.the_union_, 0, sizeof arguments.the_union_); } // Destructor. Assumes already cleaned up children. @@ -50,15 +58,15 @@ Regexp::~Regexp() { default: break; case kRegexpCapture: - delete capture_.name_; + delete arguments.capture.name_; break; case kRegexpLiteralString: - delete[] literal_string_.runes_; + delete[] arguments.literal_string.runes_; break; case kRegexpCharClass: - if (char_class_.cc_) - char_class_.cc_->Delete(); - delete char_class_.ccb_; + if (arguments.char_class.cc_) + arguments.char_class.cc_->Delete(); + delete arguments.char_class.ccb_; break; } } @@ -73,16 +81,27 @@ bool Regexp::QuickDestroy() { return false; } -// Lazily allocated. -static Mutex* ref_mutex; -static std::map* ref_map; +// Similar to EmptyStorage in re2.cc. +struct RefStorage { + Mutex ref_mutex; + std::map ref_map; +}; +alignas(RefStorage) static char ref_storage[sizeof(RefStorage)]; + +static inline Mutex* ref_mutex() { + return &reinterpret_cast(ref_storage)->ref_mutex; +} + +static inline std::map* ref_map() { + return &reinterpret_cast(ref_storage)->ref_map; +} int Regexp::Ref() { if (ref_ < kMaxRef) return ref_; - MutexLock l(ref_mutex); - return (*ref_map)[this]; + MutexLock l(ref_mutex()); + return (*ref_map())[this]; } // Increments reference count, returns object as convenience. @@ -90,18 +109,17 @@ Regexp* Regexp::Incref() { if (ref_ >= kMaxRef-1) { static std::once_flag ref_once; std::call_once(ref_once, []() { - ref_mutex = new Mutex; - ref_map = new std::map; + (void) new (ref_storage) RefStorage; }); // Store ref count in overflow map. - MutexLock l(ref_mutex); + MutexLock l(ref_mutex()); if (ref_ == kMaxRef) { // already overflowed - (*ref_map)[this]++; + (*ref_map())[this]++; } else { // overflowing now - (*ref_map)[this] = kMaxRef; + (*ref_map())[this] = kMaxRef; ref_ = kMaxRef; } return this; @@ -115,13 +133,13 @@ Regexp* Regexp::Incref() { void Regexp::Decref() { if (ref_ == kMaxRef) { // Ref count is stored in overflow map. - MutexLock l(ref_mutex); - int r = (*ref_map)[this] - 1; + MutexLock l(ref_mutex()); + int r = (*ref_map())[this] - 1; if (r < kMaxRef) { ref_ = static_cast(r); - ref_map->erase(this); + ref_map()->erase(this); } else { - (*ref_map)[this] = r; + (*ref_map())[this] = r; } return; } @@ -169,24 +187,24 @@ void Regexp::Destroy() { void Regexp::AddRuneToString(Rune r) { DCHECK(op_ == kRegexpLiteralString); - if (literal_string_.nrunes_ == 0) { + if (arguments.literal_string.nrunes_ == 0) { // start with 8 - literal_string_.runes_ = new Rune[8]; - } else if (literal_string_.nrunes_ >= 8 && (literal_string_.nrunes_ & (literal_string_.nrunes_ - 1)) == 0) { + arguments.literal_string.runes_ = new Rune[8]; + } else if (arguments.literal_string.nrunes_ >= 8 && (arguments.literal_string.nrunes_ & (arguments.literal_string.nrunes_ - 1)) == 0) { // double on powers of two - Rune *old = literal_string_.runes_; - literal_string_.runes_ = new Rune[literal_string_.nrunes_ * 2]; - for (int i = 0; i < literal_string_.nrunes_; i++) - literal_string_.runes_[i] = old[i]; + Rune *old = arguments.literal_string.runes_; + arguments.literal_string.runes_ = new Rune[arguments.literal_string.nrunes_ * 2]; + for (int i = 0; i < arguments.literal_string.nrunes_; i++) + arguments.literal_string.runes_[i] = old[i]; delete[] old; } - literal_string_.runes_[literal_string_.nrunes_++] = r; + arguments.literal_string.runes_[arguments.literal_string.nrunes_++] = r; } Regexp* Regexp::HaveMatch(int match_id, ParseFlags flags) { Regexp* re = new Regexp(kRegexpHaveMatch, flags); - re->match_id_ = match_id; + re->arguments.match_id_ = match_id; return re; } @@ -243,16 +261,15 @@ Regexp* Regexp::ConcatOrAlternate(RegexpOp op, Regexp** sub, int nsub, return new Regexp(kRegexpEmptyMatch, flags); } - Regexp** subcopy = NULL; + PODArray subcopy; if (op == kRegexpAlternate && can_factor) { // Going to edit sub; make a copy so we don't step on caller. - subcopy = new Regexp*[nsub]; - memmove(subcopy, sub, nsub * sizeof sub[0]); - sub = subcopy; + subcopy = PODArray(nsub); + memmove(subcopy.data(), sub, nsub * sizeof sub[0]); + sub = subcopy.data(); nsub = FactorAlternation(sub, nsub, flags); if (nsub == 1) { Regexp* re = sub[0]; - delete[] subcopy; return re; } } @@ -269,7 +286,6 @@ Regexp* Regexp::ConcatOrAlternate(RegexpOp op, Regexp** sub, int nsub, subs[nbigsub - 1] = ConcatOrAlternate(op, sub+(nbigsub-1)*kMaxNsub, nsub - (nbigsub-1)*kMaxNsub, flags, false); - delete[] subcopy; return re; } @@ -278,8 +294,6 @@ Regexp* Regexp::ConcatOrAlternate(RegexpOp op, Regexp** sub, int nsub, Regexp** subs = re->sub(); for (int i = 0; i < nsub; i++) subs[i] = sub[i]; - - delete[] subcopy; return re; } @@ -299,7 +313,7 @@ Regexp* Regexp::Capture(Regexp* sub, ParseFlags flags, int cap) { Regexp* re = new Regexp(kRegexpCapture, flags); re->AllocSub(1); re->sub()[0] = sub; - re->capture_.cap_ = cap; + re->arguments.capture.cap_ = cap; return re; } @@ -307,14 +321,14 @@ Regexp* Regexp::Repeat(Regexp* sub, ParseFlags flags, int min, int max) { Regexp* re = new Regexp(kRegexpRepeat, flags); re->AllocSub(1); re->sub()[0] = sub; - re->repeat_.min_ = min; - re->repeat_.max_ = max; + re->arguments.repeat.min_ = min; + re->arguments.repeat.max_ = max; return re; } Regexp* Regexp::NewLiteral(Rune rune, ParseFlags flags) { Regexp* re = new Regexp(kRegexpLiteral, flags); - re->rune_ = rune; + re->arguments.rune_ = rune; return re; } @@ -331,7 +345,7 @@ Regexp* Regexp::LiteralString(Rune* runes, int nrunes, ParseFlags flags) { Regexp* Regexp::NewCharClass(CharClass* cc, ParseFlags flags) { Regexp* re = new Regexp(kRegexpCharClass, flags); - re->char_class_.cc_ = cc; + re->arguments.char_class.cc_ = cc; return re; } @@ -501,6 +515,7 @@ static const char *kErrorStrings[] = { "invalid character class range", "missing ]", "missing )", + "unexpected )", "trailing \\", "no argument for repetition operator", "invalid repetition size", @@ -544,9 +559,12 @@ class NumCapturesWalker : public Regexp::Walker { ncapture_++; return ignored; } + virtual Ignored ShortVisit(Regexp* re, Ignored ignored) { - // Should never be called: we use Walk not WalkExponential. + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION LOG(DFATAL) << "NumCapturesWalker::ShortVisit called"; +#endif return ignored; } @@ -575,7 +593,7 @@ class NamedCapturesWalker : public Regexp::Walker { return m; } - Ignored PreVisit(Regexp* re, Ignored ignored, bool* stop) { + virtual Ignored PreVisit(Regexp* re, Ignored ignored, bool* stop) { if (re->op() == kRegexpCapture && re->name() != NULL) { // Allocate map once we find a name. if (map_ == NULL) @@ -584,15 +602,16 @@ class NamedCapturesWalker : public Regexp::Walker { // Record first occurrence of each name. // (The rule is that if you have the same name // multiple times, only the leftmost one counts.) - if (map_->find(*re->name()) == map_->end()) - (*map_)[*re->name()] = re->cap(); + map_->insert({*re->name(), re->cap()}); } return ignored; } virtual Ignored ShortVisit(Regexp* re, Ignored ignored) { - // Should never be called: we use Walk not WalkExponential. + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION LOG(DFATAL) << "NamedCapturesWalker::ShortVisit called"; +#endif return ignored; } @@ -621,7 +640,7 @@ class CaptureNamesWalker : public Regexp::Walker { return m; } - Ignored PreVisit(Regexp* re, Ignored ignored, bool* stop) { + virtual Ignored PreVisit(Regexp* re, Ignored ignored, bool* stop) { if (re->op() == kRegexpCapture && re->name() != NULL) { // Allocate map once we find a name. if (map_ == NULL) @@ -633,8 +652,10 @@ class CaptureNamesWalker : public Regexp::Walker { } virtual Ignored ShortVisit(Regexp* re, Ignored ignored) { - // Should never be called: we use Walk not WalkExponential. + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION LOG(DFATAL) << "CaptureNamesWalker::ShortVisit called"; +#endif return ignored; } @@ -651,78 +672,89 @@ std::map* Regexp::CaptureNames() { return w.TakeMap(); } +void ConvertRunesToBytes(bool latin1, Rune* runes, int nrunes, + std::string* bytes) { + if (latin1) { + bytes->resize(nrunes); + for (int i = 0; i < nrunes; i++) + (*bytes)[i] = static_cast(runes[i]); + } else { + bytes->resize(nrunes * UTFmax); // worst case + char* p = &(*bytes)[0]; + for (int i = 0; i < nrunes; i++) + p += runetochar(p, &runes[i]); + bytes->resize(p - &(*bytes)[0]); + bytes->shrink_to_fit(); + } +} + // Determines whether regexp matches must be anchored // with a fixed string prefix. If so, returns the prefix and // the regexp that remains after the prefix. The prefix might // be ASCII case-insensitive. bool Regexp::RequiredPrefix(std::string* prefix, bool* foldcase, Regexp** suffix) { + prefix->clear(); + *foldcase = false; + *suffix = NULL; + // No need for a walker: the regexp must be of the form // 1. some number of ^ anchors // 2. a literal char or string // 3. the rest - prefix->clear(); - *foldcase = false; - *suffix = NULL; if (op_ != kRegexpConcat) return false; - - // Some number of anchors, then a literal or concatenation. int i = 0; - Regexp** sub = this->sub(); - while (i < nsub_ && sub[i]->op_ == kRegexpBeginText) + while (i < nsub_ && sub()[i]->op_ == kRegexpBeginText) i++; if (i == 0 || i >= nsub_) return false; - - Regexp* re = sub[i]; - switch (re->op_) { - default: - return false; - - case kRegexpLiteralString: - // Convert to string in proper encoding. - if (re->parse_flags() & Latin1) { - prefix->resize(re->literal_string_.nrunes_); - for (int j = 0; j < re->literal_string_.nrunes_; j++) - (*prefix)[j] = static_cast(re->literal_string_.runes_[j]); - } else { - // Convert to UTF-8 in place. - // Assume worst-case space and then trim. - prefix->resize(re->literal_string_.nrunes_ * UTFmax); - char *p = &(*prefix)[0]; - for (int j = 0; j < re->literal_string_.nrunes_; j++) { - Rune r = re->literal_string_.runes_[j]; - if (r < Runeself) - *p++ = static_cast(r); - else - p += runetochar(p, &r); - } - prefix->resize(p - &(*prefix)[0]); - } - break; - - case kRegexpLiteral: - if ((re->parse_flags() & Latin1) || re->rune_ < Runeself) { - prefix->append(1, static_cast(re->rune_)); - } else { - char buf[UTFmax]; - prefix->append(buf, runetochar(buf, &re->rune_)); - } - break; - } - *foldcase = (sub[i]->parse_flags() & FoldCase) != 0; + Regexp* re = sub()[i]; + if (re->op_ != kRegexpLiteral && + re->op_ != kRegexpLiteralString) + return false; i++; - - // The rest. if (i < nsub_) { for (int j = i; j < nsub_; j++) - sub[j]->Incref(); - re = Concat(sub + i, nsub_ - i, parse_flags()); + sub()[j]->Incref(); + *suffix = Concat(sub() + i, nsub_ - i, parse_flags()); } else { - re = new Regexp(kRegexpEmptyMatch, parse_flags()); + *suffix = new Regexp(kRegexpEmptyMatch, parse_flags()); } - *suffix = re; + + bool latin1 = (re->parse_flags() & Latin1) != 0; + Rune* runes = re->op_ == kRegexpLiteral ? &re->arguments.rune_ : re->arguments.literal_string.runes_; + int nrunes = re->op_ == kRegexpLiteral ? 1 : re->arguments.literal_string.nrunes_; + ConvertRunesToBytes(latin1, runes, nrunes, prefix); + *foldcase = (re->parse_flags() & FoldCase) != 0; + return true; +} + +// Determines whether regexp matches must be unanchored +// with a fixed string prefix. If so, returns the prefix. +// The prefix might be ASCII case-insensitive. +bool Regexp::RequiredPrefixForAccel(std::string* prefix, bool* foldcase) { + prefix->clear(); + *foldcase = false; + + // No need for a walker: the regexp must either begin with or be + // a literal char or string. We "see through" capturing groups, + // but make no effort to glue multiple prefix fragments together. + Regexp* re = op_ == kRegexpConcat && nsub_ > 0 ? sub()[0] : this; + while (re->op_ == kRegexpCapture) { + re = re->sub()[0]; + if (re->op_ == kRegexpConcat && re->nsub_ > 0) + re = re->sub()[0]; + } + if (re->op_ != kRegexpLiteral && + re->op_ != kRegexpLiteralString) + return false; + + bool latin1 = (re->parse_flags() & Latin1) != 0; + Rune* runes = re->op_ == kRegexpLiteral ? &re->arguments.rune_ : re->arguments.literal_string.runes_; + int nrunes = re->op_ == kRegexpLiteral ? 1 : re->arguments.literal_string.nrunes_; + ConvertRunesToBytes(latin1, runes, nrunes, prefix); + *foldcase = (re->parse_flags() & FoldCase) != 0; return true; } @@ -903,7 +935,7 @@ void CharClassBuilder::Negate() { // The ranges are allocated in the same block as the header, // necessitating a special allocator and Delete method. -CharClass* CharClass::New(int maxranges) { +CharClass* CharClass::New(size_t maxranges) { CharClass* cc; uint8_t* data = new uint8_t[sizeof *cc + maxranges*sizeof cc->ranges_[0]]; cc = reinterpret_cast(data); @@ -920,7 +952,7 @@ void CharClass::Delete() { } CharClass* CharClass::Negate() { - CharClass* cc = CharClass::New(nranges_+1); + CharClass* cc = CharClass::New(static_cast(nranges_+1)); cc->folds_ascii_ = folds_ascii_; cc->nrunes_ = Runemax + 1 - nrunes_; int n = 0; @@ -939,7 +971,7 @@ CharClass* CharClass::Negate() { return cc; } -bool CharClass::Contains(Rune r) { +bool CharClass::Contains(Rune r) const { RuneRange* rr = ranges_; int n = nranges_; while (n > 0) { @@ -957,7 +989,7 @@ bool CharClass::Contains(Rune r) { } CharClass* CharClassBuilder::GetCharClass() { - CharClass* cc = CharClass::New(static_cast(ranges_.size())); + CharClass* cc = CharClass::New(ranges_.size()); int n = 0; for (iterator it = begin(); it != end(); ++it) cc->ranges_[n++] = *it; @@ -968,4 +1000,4 @@ CharClass* CharClassBuilder::GetCharClass() { return cc; } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/regexp.h b/src/duckdb/third_party/re2/re2/regexp.h index 7048ac1d..d3ff9629 100644 --- a/src/duckdb/third_party/re2/re2/regexp.h +++ b/src/duckdb/third_party/re2/re2/regexp.h @@ -86,6 +86,7 @@ // form accessible to clients, so that client code can analyze the // parsed regular expressions. +#include #include #include #include @@ -177,6 +178,7 @@ enum RegexpStatusCode { kRegexpBadCharRange, // bad character class range kRegexpMissingBracket, // missing closing ] kRegexpMissingParen, // missing closing ) + kRegexpUnexpectedParen, // unexpected closing ) kRegexpTrailingBackslash, // at end of regexp kRegexpRepeatArgument, // repeat argument missing, e.g. "*" kRegexpRepeatSize, // bad repetition argument @@ -252,13 +254,13 @@ class CharClass { bool full() { return nrunes_ == Runemax+1; } bool FoldsASCII() { return folds_ascii_; } - bool Contains(Rune r); + bool Contains(Rune r) const; CharClass* Negate(); private: CharClass(); // not implemented ~CharClass(); // not implemented - static CharClass* New(int maxranges); + static CharClass* New(size_t maxranges); friend class CharClassBuilder; @@ -271,29 +273,6 @@ class CharClass { CharClass& operator=(const CharClass&) = delete; }; -struct repeat_t { // Repeat - int max_; - int min_; -}; - -struct capture_t { // Capture - int cap_; - std::string* name_; -}; - -struct literal_string_t{ // LiteralString - int nrunes_; - Rune* runes_; -}; - -struct char_class_t { // CharClass - // These two could be in separate union members, - // but it wouldn't save any space (there are other two-word structs) - // and keeping them separate avoids confusion during parsing. - CharClass* cc_; - CharClassBuilder* ccb_; -}; - class Regexp { public: @@ -354,15 +333,15 @@ class Regexp { return submany_; } - int min() { DCHECK_EQ(op_, kRegexpRepeat); return repeat_.min_; } - int max() { DCHECK_EQ(op_, kRegexpRepeat); return repeat_.max_; } - Rune rune() { DCHECK_EQ(op_, kRegexpLiteral); return rune_; } - CharClass* cc() { DCHECK_EQ(op_, kRegexpCharClass); return char_class_.cc_; } - int cap() { DCHECK_EQ(op_, kRegexpCapture); return capture_.cap_; } - const std::string* name() { DCHECK_EQ(op_, kRegexpCapture); return capture_.name_; } - Rune* runes() { DCHECK_EQ(op_, kRegexpLiteralString); return literal_string_.runes_; } - int nrunes() { DCHECK_EQ(op_, kRegexpLiteralString); return literal_string_.nrunes_; } - int match_id() { DCHECK_EQ(op_, kRegexpHaveMatch); return match_id_; } + int min() { DCHECK_EQ(op_, kRegexpRepeat); return arguments.repeat.min_; } + int max() { DCHECK_EQ(op_, kRegexpRepeat); return arguments.repeat.max_; } + Rune rune() { DCHECK_EQ(op_, kRegexpLiteral); return arguments.rune_; } + CharClass* cc() { DCHECK_EQ(op_, kRegexpCharClass); return arguments.char_class.cc_; } + int cap() { DCHECK_EQ(op_, kRegexpCapture); return arguments.capture.cap_; } + const std::string* name() { DCHECK_EQ(op_, kRegexpCapture); return arguments.capture.name_; } + Rune* runes() { DCHECK_EQ(op_, kRegexpLiteralString); return arguments.literal_string.runes_; } + int nrunes() { DCHECK_EQ(op_, kRegexpLiteralString); return arguments.literal_string.nrunes_; } + int match_id() { DCHECK_EQ(op_, kRegexpHaveMatch); return arguments.match_id_; } // Increments reference count, returns object as convenience. Regexp* Incref(); @@ -463,6 +442,17 @@ class Regexp { bool RequiredPrefix(std::string* prefix, bool* foldcase, Regexp** suffix); + // Whether every match of this regexp must be unanchored and + // begin with a non-empty fixed string (perhaps after ASCII + // case-folding). If so, returns the prefix. + // Callers should expect *prefix and *foldcase to be "zeroed" + // regardless of the return value. + bool RequiredPrefixForAccel(std::string* prefix, bool* foldcase); + + // Controls the maximum repeat count permitted by the parser. + // FOR FUZZING ONLY. + static void FUZZING_ONLY_set_maximum_repeat_count(int i); + private: // Constructor allocates vectors as appropriate for operator. explicit Regexp(RegexpOp op, ParseFlags parse_flags); @@ -581,14 +571,29 @@ class Regexp { // Arguments to operator. See description of operators above. union { - repeat_t repeat_; - capture_t capture_; - literal_string_t literal_string_; - char_class_t char_class_; + struct { // Repeat + int max_; + int min_; + } repeat; + struct { // Capture + int cap_; + std::string* name_; + } capture; + struct { // LiteralString + int nrunes_; + Rune* runes_; + } literal_string; + struct { // CharClass + // These two could be in separate union members, + // but it wouldn't save any space (there are other two-word structs) + // and keeping them separate avoids confusion during parsing. + CharClass* cc_; + CharClassBuilder* ccb_; + } char_class; Rune rune_; // Literal int match_id_; // HaveMatch void *the_union_[2]; // as big as any other element, for memset - }; + } arguments; Regexp(const Regexp&) = delete; Regexp& operator=(const Regexp&) = delete; @@ -655,6 +660,6 @@ inline Regexp::ParseFlags operator~(Regexp::ParseFlags a) { ~static_cast(a) & static_cast(Regexp::AllParseFlags)); } -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_REGEXP_H_ diff --git a/src/duckdb/third_party/re2/re2/set.cc b/src/duckdb/third_party/re2/re2/set.cc index 223fa26d..8977c6a5 100644 --- a/src/duckdb/third_party/re2/re2/set.cc +++ b/src/duckdb/third_party/re2/re2/set.cc @@ -7,30 +7,49 @@ #include #include #include +#include #include "util/util.h" #include "util/logging.h" -#include "util/pod_array.h" -#include "re2/stringpiece.h" +#include "re2/pod_array.h" #include "re2/prog.h" #include "re2/re2.h" #include "re2/regexp.h" +#include "re2/stringpiece.h" namespace duckdb_re2 { -RE2::Set::Set(const RE2::Options& options, RE2::Anchor anchor) { - options_.Copy(options); +RE2::Set::Set(const RE2::Options& options, RE2::Anchor anchor) + : options_(options), + anchor_(anchor), + compiled_(false), + size_(0) { options_.set_never_capture(true); // might unblock some optimisations - anchor_ = anchor; - prog_ = NULL; - compiled_ = false; - size_ = 0; } RE2::Set::~Set() { for (size_t i = 0; i < elem_.size(); i++) elem_[i].second->Decref(); - delete prog_; +} + +RE2::Set::Set(Set&& other) + : options_(other.options_), + anchor_(other.anchor_), + elem_(std::move(other.elem_)), + compiled_(other.compiled_), + size_(other.size_), + prog_(std::move(other.prog_)) { + other.elem_.clear(); + other.elem_.shrink_to_fit(); + other.compiled_ = false; + other.size_ = 0; + other.prog_.reset(); +} + +RE2::Set& RE2::Set::operator=(Set&& other) { + this->~Set(); + (void) new (this) Set(std::move(other)); + return *this; } int RE2::Set::Add(const StringPiece& pattern, std::string* error) { @@ -97,9 +116,9 @@ bool RE2::Set::Compile() { options_.ParseFlags()); duckdb_re2::Regexp* re = duckdb_re2::Regexp::Alternate(sub.data(), size_, pf); - prog_ = Prog::CompileSet(re, anchor_, options_.max_mem()); + prog_.reset(Prog::CompileSet(re, anchor_, options_.max_mem())); re->Decref(); - return prog_ != NULL; + return prog_ != nullptr; } bool RE2::Set::Match(const StringPiece& text, std::vector* v) const { @@ -109,11 +128,14 @@ bool RE2::Set::Match(const StringPiece& text, std::vector* v) const { bool RE2::Set::Match(const StringPiece& text, std::vector* v, ErrorInfo* error_info) const { if (!compiled_) { - LOG(DFATAL) << "RE2::Set::Match() called before compiling"; if (error_info != NULL) error_info->kind = kNotCompiled; + LOG(DFATAL) << "RE2::Set::Match() called before compiling"; return false; } +#ifdef RE2_HAVE_THREAD_LOCAL + hooks::context = NULL; +#endif bool dfa_failed = false; std::unique_ptr matches; if (v != NULL) { @@ -124,9 +146,10 @@ bool RE2::Set::Match(const StringPiece& text, std::vector* v, NULL, &dfa_failed, matches.get()); if (dfa_failed) { if (options_.log_errors()) - LOG(ERROR) << "DFA out of memory: size " << prog_->size() << ", " - << "bytemap range " << prog_->bytemap_range() << ", " - << "list count " << prog_->list_count(); + LOG(ERROR) << "DFA out of memory: " + << "program size " << prog_->size() << ", " + << "list count " << prog_->list_count() << ", " + << "bytemap range " << prog_->bytemap_range(); if (error_info != NULL) error_info->kind = kOutOfMemory; return false; @@ -138,9 +161,9 @@ bool RE2::Set::Match(const StringPiece& text, std::vector* v, } if (v != NULL) { if (matches->empty()) { - LOG(DFATAL) << "RE2::Set::Match() matched, but no matches returned?!"; if (error_info != NULL) error_info->kind = kInconsistent; + LOG(DFATAL) << "RE2::Set::Match() matched, but no matches returned?!"; return false; } v->assign(matches->begin(), matches->end()); @@ -150,4 +173,4 @@ bool RE2::Set::Match(const StringPiece& text, std::vector* v, return true; } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/set.h b/src/duckdb/third_party/re2/re2/set.h index 65df2fdd..d357eb1a 100644 --- a/src/duckdb/third_party/re2/re2/set.h +++ b/src/duckdb/third_party/re2/re2/set.h @@ -5,6 +5,7 @@ #ifndef RE2_SET_H_ #define RE2_SET_H_ +#include #include #include #include @@ -14,7 +15,7 @@ namespace duckdb_re2 { class Prog; class Regexp; -} // namespace duckdb_re2 +} // namespace re2 namespace duckdb_re2 { @@ -36,6 +37,13 @@ class RE2::Set { Set(const RE2::Options& options, RE2::Anchor anchor); ~Set(); + // Not copyable. + Set(const Set&) = delete; + Set& operator=(const Set&) = delete; + // Movable. + Set(Set&& other); + Set& operator=(Set&& other); + // Adds pattern to the set using the options passed to the constructor. // Returns the index that will identify the regexp in the output of Match(), // or -1 if the regexp cannot be parsed. @@ -67,14 +75,11 @@ class RE2::Set { RE2::Options options_; RE2::Anchor anchor_; std::vector elem_; - duckdb_re2::Prog* prog_; bool compiled_; int size_; - - Set(const Set&) = delete; - Set& operator=(const Set&) = delete; + std::unique_ptr prog_; }; -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_SET_H_ diff --git a/src/duckdb/third_party/re2/re2/simplify.cc b/src/duckdb/third_party/re2/re2/simplify.cc index 4de66706..7a489490 100644 --- a/src/duckdb/third_party/re2/re2/simplify.cc +++ b/src/duckdb/third_party/re2/re2/simplify.cc @@ -10,8 +10,8 @@ #include "util/util.h" #include "util/logging.h" -#include "util/pod_array.h" #include "util/utf.h" +#include "re2/pod_array.h" #include "re2/regexp.h" #include "re2/walker-inl.h" @@ -28,8 +28,6 @@ bool Regexp::SimplifyRegexp(const StringPiece& src, ParseFlags flags, Regexp* sre = re->Simplify(); re->Decref(); if (sre == NULL) { - // Should not happen, since Simplify never fails. - LOG(ERROR) << "Simplify failed on " << src; if (status) { status->set_code(kRegexpInternalError); status->set_error_arg(src); @@ -45,9 +43,6 @@ bool Regexp::SimplifyRegexp(const StringPiece& src, ParseFlags flags, // is this Regexp* simple? bool Regexp::ComputeSimple() { Regexp** subs; - auto ccb = char_class_.ccb_; - auto cc = char_class_.cc_; - switch (op_) { case kRegexpNoMatch: case kRegexpEmptyMatch: @@ -73,9 +68,9 @@ bool Regexp::ComputeSimple() { return true; case kRegexpCharClass: // Simple as long as the char class is not empty, not full. - if (ccb != NULL) - return !ccb->empty() && !ccb->full(); - return !cc->empty() && !cc->full(); + if (arguments.char_class.ccb_ != NULL) + return !arguments.char_class.ccb_->empty() && !arguments.char_class.ccb_->full(); + return !arguments.char_class.cc_->empty() && !arguments.char_class.cc_->full(); case kRegexpCapture: subs = sub(); return subs[0]->simple(); @@ -183,13 +178,25 @@ Regexp* Regexp::Simplify() { CoalesceWalker cw; Regexp* cre = cw.Walk(this, NULL); if (cre == NULL) - return cre; + return NULL; + if (cw.stopped_early()) { + cre->Decref(); + return NULL; + } SimplifyWalker sw; Regexp* sre = sw.Walk(cre, NULL); cre->Decref(); + if (sre == NULL) + return NULL; + if (sw.stopped_early()) { + sre->Decref(); + return NULL; + } return sre; } +#define Simplify DontCallSimplify // Avoid accidental recursion + // Utility function for PostVisit implementations that compares re->sub() with // child_args to determine whether any child_args changed. In the common case, // where nothing changed, calls Decref() for all child_args and returns false, @@ -213,9 +220,10 @@ Regexp* CoalesceWalker::Copy(Regexp* re) { } Regexp* CoalesceWalker::ShortVisit(Regexp* re, Regexp* parent_arg) { - // This should never be called, since we use Walk and not - // WalkExponential. + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION LOG(DFATAL) << "CoalesceWalker::ShortVisit called"; +#endif return re->Incref(); } @@ -239,10 +247,10 @@ Regexp* CoalesceWalker::PostVisit(Regexp* re, nre_subs[i] = child_args[i]; // Repeats and Captures have additional data that must be copied. if (re->op() == kRegexpRepeat) { - nre->repeat_.min_ = re->min(); - nre->repeat_.max_ = re->max(); + nre->arguments.repeat.min_ = re->min(); + nre->arguments.repeat.max_ = re->max(); } else if (re->op() == kRegexpCapture) { - nre->capture_.cap_ = re->cap(); + nre->arguments.capture.cap_ = re->cap(); } return nre; } @@ -343,61 +351,61 @@ void CoalesceWalker::DoCoalesce(Regexp** r1ptr, Regexp** r2ptr) { switch (r1->op()) { case kRegexpStar: - nre->repeat_.min_ = 0; - nre->repeat_.max_ = -1; + nre->arguments.repeat.min_ = 0; + nre->arguments.repeat.max_ = -1; break; case kRegexpPlus: - nre->repeat_.min_ = 1; - nre->repeat_.max_ = -1; + nre->arguments.repeat.min_ = 1; + nre->arguments.repeat.max_ = -1; break; case kRegexpQuest: - nre->repeat_.min_ = 0; - nre->repeat_.max_ = 1; + nre->arguments.repeat.min_ = 0; + nre->arguments.repeat.max_ = 1; break; case kRegexpRepeat: - nre->repeat_.min_ = r1->min(); - nre->repeat_.max_ = r1->max(); + nre->arguments.repeat.min_ = r1->min(); + nre->arguments.repeat.max_ = r1->max(); break; default: - LOG(DFATAL) << "DoCoalesce failed: r1->op() is " << r1->op(); nre->Decref(); + LOG(DFATAL) << "DoCoalesce failed: r1->op() is " << r1->op(); return; } switch (r2->op()) { case kRegexpStar: - nre->repeat_.max_ = -1; + nre->arguments.repeat.max_ = -1; goto LeaveEmpty; case kRegexpPlus: - nre->repeat_.min_++; - nre->repeat_.max_ = -1; + nre->arguments.repeat.min_++; + nre->arguments.repeat.max_ = -1; goto LeaveEmpty; case kRegexpQuest: if (nre->max() != -1) - nre->repeat_.max_++; + nre->arguments.repeat.max_++; goto LeaveEmpty; case kRegexpRepeat: - nre->repeat_.min_ += r2->min(); + nre->arguments.repeat.min_ += r2->min(); if (r2->max() == -1) - nre->repeat_.max_ = -1; + nre->arguments.repeat.max_ = -1; else if (nre->max() != -1) - nre->repeat_.max_ += r2->max(); + nre->arguments.repeat.max_ += r2->max(); goto LeaveEmpty; case kRegexpLiteral: case kRegexpCharClass: case kRegexpAnyChar: case kRegexpAnyByte: - nre->repeat_.min_++; + nre->arguments.repeat.min_++; if (nre->max() != -1) - nre->repeat_.max_++; + nre->arguments.repeat.max_++; goto LeaveEmpty; LeaveEmpty: @@ -412,9 +420,9 @@ void CoalesceWalker::DoCoalesce(Regexp** r1ptr, Regexp** r2ptr) { int n = 1; while (n < r2->nrunes() && r2->runes()[n] == r) n++; - nre->repeat_.min_ += n; + nre->arguments.repeat.min_ += n; if (nre->max() != -1) - nre->repeat_.max_ += n; + nre->arguments.repeat.max_ += n; if (n == r2->nrunes()) goto LeaveEmpty; *r1ptr = nre; @@ -424,8 +432,8 @@ void CoalesceWalker::DoCoalesce(Regexp** r1ptr, Regexp** r2ptr) { } default: - LOG(DFATAL) << "DoCoalesce failed: r2->op() is " << r2->op(); nre->Decref(); + LOG(DFATAL) << "DoCoalesce failed: r2->op() is " << r2->op(); return; } @@ -438,9 +446,10 @@ Regexp* SimplifyWalker::Copy(Regexp* re) { } Regexp* SimplifyWalker::ShortVisit(Regexp* re, Regexp* parent_arg) { - // This should never be called, since we use Walk and not - // WalkExponential. + // Should never be called: we use Walk(), not WalkExponential(). +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION LOG(DFATAL) << "SimplifyWalker::ShortVisit called"; +#endif return re->Incref(); } @@ -501,7 +510,7 @@ Regexp* SimplifyWalker::PostVisit(Regexp* re, Regexp* nre = new Regexp(kRegexpCapture, re->parse_flags()); nre->AllocSub(1); nre->sub()[0] = newsub; - nre->capture_.cap_ = re->cap(); + nre->arguments.capture.cap_ = re->cap(); nre->simple_ = true; return nre; } @@ -541,7 +550,7 @@ Regexp* SimplifyWalker::PostVisit(Regexp* re, if (newsub->op() == kRegexpEmptyMatch) return newsub; - Regexp* nre = SimplifyRepeat(newsub, re->repeat_.min_, re->repeat_.max_, + Regexp* nre = SimplifyRepeat(newsub, re->arguments.repeat.min_, re->arguments.repeat.max_, re->parse_flags()); newsub->Decref(); nre->simple_ = true; @@ -653,4 +662,4 @@ Regexp* SimplifyWalker::SimplifyCharClass(Regexp* re) { return re->Incref(); } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/sparse_array.h b/src/duckdb/third_party/re2/re2/sparse_array.h new file mode 100644 index 00000000..5ff5bb21 --- /dev/null +++ b/src/duckdb/third_party/re2/re2/sparse_array.h @@ -0,0 +1,392 @@ +// Copyright 2006 The RE2 Authors. All Rights Reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef RE2_SPARSE_ARRAY_H_ +#define RE2_SPARSE_ARRAY_H_ + +// DESCRIPTION +// +// SparseArray(m) is a map from integers in [0, m) to T values. +// It requires (sizeof(T)+sizeof(int))*m memory, but it provides +// fast iteration through the elements in the array and fast clearing +// of the array. The array has a concept of certain elements being +// uninitialized (having no value). +// +// Insertion and deletion are constant time operations. +// +// Allocating the array is a constant time operation +// when memory allocation is a constant time operation. +// +// Clearing the array is a constant time operation (unusual!). +// +// Iterating through the array is an O(n) operation, where n +// is the number of items in the array (not O(m)). +// +// The array iterator visits entries in the order they were first +// inserted into the array. It is safe to add items to the array while +// using an iterator: the iterator will visit indices added to the array +// during the iteration, but will not re-visit indices whose values +// change after visiting. Thus SparseArray can be a convenient +// implementation of a work queue. +// +// The SparseArray implementation is NOT thread-safe. It is up to the +// caller to make sure only one thread is accessing the array. (Typically +// these arrays are temporary values and used in situations where speed is +// important.) +// +// The SparseArray interface does not present all the usual STL bells and +// whistles. +// +// Implemented with reference to Briggs & Torczon, An Efficient +// Representation for Sparse Sets, ACM Letters on Programming Languages +// and Systems, Volume 2, Issue 1-4 (March-Dec. 1993), pp. 59-69. +// +// Briggs & Torczon popularized this technique, but it had been known +// long before their paper. They point out that Aho, Hopcroft, and +// Ullman's 1974 Design and Analysis of Computer Algorithms and Bentley's +// 1986 Programming Pearls both hint at the technique in exercises to the +// reader (in Aho & Hopcroft, exercise 2.12; in Bentley, column 1 +// exercise 8). +// +// Briggs & Torczon describe a sparse set implementation. I have +// trivially generalized it to create a sparse array (actually the original +// target of the AHU and Bentley exercises). + +// IMPLEMENTATION +// +// SparseArray is an array dense_ and an array sparse_ of identical size. +// At any point, the number of elements in the sparse array is size_. +// +// The array dense_ contains the size_ elements in the sparse array (with +// their indices), +// in the order that the elements were first inserted. This array is dense: +// the size_ pairs are dense_[0] through dense_[size_-1]. +// +// The array sparse_ maps from indices in [0,m) to indices in [0,size_). +// For indices present in the array, dense_[sparse_[i]].index_ == i. +// For indices not present in the array, sparse_ can contain any value at all, +// perhaps outside the range [0, size_) but perhaps not. +// +// The lax requirement on sparse_ values makes clearing the array very easy: +// set size_ to 0. Lookups are slightly more complicated. +// An index i has a value in the array if and only if: +// sparse_[i] is in [0, size_) AND +// dense_[sparse_[i]].index_ == i. +// If both these properties hold, only then it is safe to refer to +// dense_[sparse_[i]].value_ +// as the value associated with index i. +// +// To insert a new entry, set sparse_[i] to size_, +// initialize dense_[size_], and then increment size_. +// +// To make the sparse array as efficient as possible for non-primitive types, +// elements may or may not be destroyed when they are deleted from the sparse +// array through a call to resize(). They immediately become inaccessible, but +// they are only guaranteed to be destroyed when the SparseArray destructor is +// called. +// +// A moved-from SparseArray will be empty. + +// Doing this simplifies the logic below. +#ifndef __has_feature +#define __has_feature(x) 0 +#endif + +#include +#include +#if __has_feature(memory_sanitizer) +#include +#endif +#include +#include +#include + +#include "re2/pod_array.h" + +namespace duckdb_re2 { + +template +class SparseArray { + public: + SparseArray(); + explicit SparseArray(int max_size); + ~SparseArray(); + + // IndexValue pairs: exposed in SparseArray::iterator. + class IndexValue; + + typedef IndexValue* iterator; + typedef const IndexValue* const_iterator; + + SparseArray(const SparseArray& src); + SparseArray(SparseArray&& src); + + SparseArray& operator=(const SparseArray& src); + SparseArray& operator=(SparseArray&& src); + + // Return the number of entries in the array. + int size() const { + return size_; + } + + // Indicate whether the array is empty. + int empty() const { + return size_ == 0; + } + + // Iterate over the array. + iterator begin() { + return dense_.data(); + } + iterator end() { + return dense_.data() + size_; + } + + const_iterator begin() const { + return dense_.data(); + } + const_iterator end() const { + return dense_.data() + size_; + } + + // Change the maximum size of the array. + // Invalidates all iterators. + void resize(int new_max_size); + + // Return the maximum size of the array. + // Indices can be in the range [0, max_size). + int max_size() const { + if (dense_.data() != NULL) + return dense_.size(); + else + return 0; + } + + // Clear the array. + void clear() { + size_ = 0; + } + + // Check whether index i is in the array. + bool has_index(int i) const; + + // Comparison function for sorting. + // Can sort the sparse array so that future iterations + // will visit indices in increasing order using + // std::sort(arr.begin(), arr.end(), arr.less); + static bool less(const IndexValue& a, const IndexValue& b); + + public: + // Set the value at index i to v. + iterator set(int i, const Value& v) { + return SetInternal(true, i, v); + } + + // Set the value at new index i to v. + // Fast but unsafe: only use if has_index(i) is false. + iterator set_new(int i, const Value& v) { + return SetInternal(false, i, v); + } + + // Set the value at index i to v. + // Fast but unsafe: only use if has_index(i) is true. + iterator set_existing(int i, const Value& v) { + return SetExistingInternal(i, v); + } + + // Get the value at index i. + // Fast but unsafe: only use if has_index(i) is true. + Value& get_existing(int i) { + assert(has_index(i)); + return dense_[sparse_[i]].value_; + } + const Value& get_existing(int i) const { + assert(has_index(i)); + return dense_[sparse_[i]].value_; + } + + private: + iterator SetInternal(bool allow_existing, int i, const Value& v) { + DebugCheckInvariants(); + if (static_cast(i) >= static_cast(max_size())) { + assert(false && "illegal index"); + // Semantically, end() would be better here, but we already know + // the user did something stupid, so begin() insulates them from + // dereferencing an invalid pointer. + return begin(); + } + if (!allow_existing) { + assert(!has_index(i)); + create_index(i); + } else { + if (!has_index(i)) + create_index(i); + } + return SetExistingInternal(i, v); + } + + iterator SetExistingInternal(int i, const Value& v) { + DebugCheckInvariants(); + assert(has_index(i)); + dense_[sparse_[i]].value_ = v; + DebugCheckInvariants(); + return dense_.data() + sparse_[i]; + } + + // Add the index i to the array. + // Only use if has_index(i) is known to be false. + // Since it doesn't set the value associated with i, + // this function is private, only intended as a helper + // for other methods. + void create_index(int i); + + // In debug mode, verify that some invariant properties of the class + // are being maintained. This is called at the end of the constructor + // and at the beginning and end of all public non-const member functions. + void DebugCheckInvariants() const; + + // Initializes memory for elements [min, max). + void MaybeInitializeMemory(int min, int max) { +#if __has_feature(memory_sanitizer) + __msan_unpoison(sparse_.data() + min, (max - min) * sizeof sparse_[0]); +#elif defined(RE2_ON_VALGRIND) + for (int i = min; i < max; i++) { + sparse_[i] = 0xababababU; + } +#endif + } + + int size_ = 0; + PODArray sparse_; + PODArray dense_; +}; + +template +SparseArray::SparseArray() = default; + +template +SparseArray::SparseArray(const SparseArray& src) + : size_(src.size_), + sparse_(src.max_size()), + dense_(src.max_size()) { + std::copy_n(src.sparse_.data(), src.max_size(), sparse_.data()); + std::copy_n(src.dense_.data(), src.max_size(), dense_.data()); +} + +template +SparseArray::SparseArray(SparseArray&& src) + : size_(src.size_), + sparse_(std::move(src.sparse_)), + dense_(std::move(src.dense_)) { + src.size_ = 0; +} + +template +SparseArray& SparseArray::operator=(const SparseArray& src) { + // Construct these first for exception safety. + PODArray a(src.max_size()); + PODArray b(src.max_size()); + + size_ = src.size_; + sparse_ = std::move(a); + dense_ = std::move(b); + std::copy_n(src.sparse_.data(), src.max_size(), sparse_.data()); + std::copy_n(src.dense_.data(), src.max_size(), dense_.data()); + return *this; +} + +template +SparseArray& SparseArray::operator=(SparseArray&& src) { + size_ = src.size_; + sparse_ = std::move(src.sparse_); + dense_ = std::move(src.dense_); + src.size_ = 0; + return *this; +} + +// IndexValue pairs: exposed in SparseArray::iterator. +template +class SparseArray::IndexValue { + public: + int index() const { return index_; } + Value& value() { return value_; } + const Value& value() const { return value_; } + + private: + friend class SparseArray; + int index_; + Value value_; +}; + +// Change the maximum size of the array. +// Invalidates all iterators. +template +void SparseArray::resize(int new_max_size) { + DebugCheckInvariants(); + if (new_max_size > max_size()) { + const int old_max_size = max_size(); + + // Construct these first for exception safety. + PODArray a(new_max_size); + PODArray b(new_max_size); + + std::copy_n(sparse_.data(), old_max_size, a.data()); + std::copy_n(dense_.data(), old_max_size, b.data()); + + sparse_ = std::move(a); + dense_ = std::move(b); + + MaybeInitializeMemory(old_max_size, new_max_size); + } + if (size_ > new_max_size) + size_ = new_max_size; + DebugCheckInvariants(); +} + +// Check whether index i is in the array. +template +bool SparseArray::has_index(int i) const { + assert(i >= 0); + assert(i < max_size()); + if (static_cast(i) >= static_cast(max_size())) { + return false; + } + // Unsigned comparison avoids checking sparse_[i] < 0. + return (uint32_t)sparse_[i] < (uint32_t)size_ && + dense_[sparse_[i]].index_ == i; +} + +template +void SparseArray::create_index(int i) { + assert(!has_index(i)); + assert(size_ < max_size()); + sparse_[i] = size_; + dense_[size_].index_ = i; + size_++; +} + +template SparseArray::SparseArray(int max_size) : + sparse_(max_size), dense_(max_size) { + MaybeInitializeMemory(size_, max_size); + DebugCheckInvariants(); +} + +template SparseArray::~SparseArray() { + DebugCheckInvariants(); +} + +template void SparseArray::DebugCheckInvariants() const { + assert(0 <= size_); + assert(size_ <= max_size()); +} + +// Comparison function for sorting. +template bool SparseArray::less(const IndexValue& a, + const IndexValue& b) { + return a.index_ < b.index_; +} + +} // namespace re2 + +#endif // RE2_SPARSE_ARRAY_H_ diff --git a/src/duckdb/third_party/re2/re2/sparse_set.h b/src/duckdb/third_party/re2/re2/sparse_set.h new file mode 100644 index 00000000..320b320d --- /dev/null +++ b/src/duckdb/third_party/re2/re2/sparse_set.h @@ -0,0 +1,264 @@ +// Copyright 2006 The RE2 Authors. All Rights Reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef RE2_SPARSE_SET_H_ +#define RE2_SPARSE_SET_H_ + +// DESCRIPTION +// +// SparseSet(m) is a set of integers in [0, m). +// It requires sizeof(int)*m memory, but it provides +// fast iteration through the elements in the set and fast clearing +// of the set. +// +// Insertion and deletion are constant time operations. +// +// Allocating the set is a constant time operation +// when memory allocation is a constant time operation. +// +// Clearing the set is a constant time operation (unusual!). +// +// Iterating through the set is an O(n) operation, where n +// is the number of items in the set (not O(m)). +// +// The set iterator visits entries in the order they were first +// inserted into the set. It is safe to add items to the set while +// using an iterator: the iterator will visit indices added to the set +// during the iteration, but will not re-visit indices whose values +// change after visiting. Thus SparseSet can be a convenient +// implementation of a work queue. +// +// The SparseSet implementation is NOT thread-safe. It is up to the +// caller to make sure only one thread is accessing the set. (Typically +// these sets are temporary values and used in situations where speed is +// important.) +// +// The SparseSet interface does not present all the usual STL bells and +// whistles. +// +// Implemented with reference to Briggs & Torczon, An Efficient +// Representation for Sparse Sets, ACM Letters on Programming Languages +// and Systems, Volume 2, Issue 1-4 (March-Dec. 1993), pp. 59-69. +// +// This is a specialization of sparse array; see sparse_array.h. + +// IMPLEMENTATION +// +// See sparse_array.h for implementation details. + +// Doing this simplifies the logic below. +#ifndef __has_feature +#define __has_feature(x) 0 +#endif + +#include +#include +#if __has_feature(memory_sanitizer) +#include +#endif +#include +#include +#include + +#include "re2/pod_array.h" + +namespace duckdb_re2 { + +template +class SparseSetT { + public: + SparseSetT(); + explicit SparseSetT(int max_size); + ~SparseSetT(); + + typedef int* iterator; + typedef const int* const_iterator; + + // Return the number of entries in the set. + int size() const { + return size_; + } + + // Indicate whether the set is empty. + int empty() const { + return size_ == 0; + } + + // Iterate over the set. + iterator begin() { + return dense_.data(); + } + iterator end() { + return dense_.data() + size_; + } + + const_iterator begin() const { + return dense_.data(); + } + const_iterator end() const { + return dense_.data() + size_; + } + + // Change the maximum size of the set. + // Invalidates all iterators. + void resize(int new_max_size); + + // Return the maximum size of the set. + // Indices can be in the range [0, max_size). + int max_size() const { + if (dense_.data() != NULL) + return dense_.size(); + else + return 0; + } + + // Clear the set. + void clear() { + size_ = 0; + } + + // Check whether index i is in the set. + bool contains(int i) const; + + // Comparison function for sorting. + // Can sort the sparse set so that future iterations + // will visit indices in increasing order using + // std::sort(arr.begin(), arr.end(), arr.less); + static bool less(int a, int b); + + public: + // Insert index i into the set. + iterator insert(int i) { + return InsertInternal(true, i); + } + + // Insert index i into the set. + // Fast but unsafe: only use if contains(i) is false. + iterator insert_new(int i) { + return InsertInternal(false, i); + } + + private: + iterator InsertInternal(bool allow_existing, int i) { + DebugCheckInvariants(); + if (static_cast(i) >= static_cast(max_size())) { + assert(false && "illegal index"); + // Semantically, end() would be better here, but we already know + // the user did something stupid, so begin() insulates them from + // dereferencing an invalid pointer. + return begin(); + } + if (!allow_existing) { + assert(!contains(i)); + create_index(i); + } else { + if (!contains(i)) + create_index(i); + } + DebugCheckInvariants(); + return dense_.data() + sparse_[i]; + } + + // Add the index i to the set. + // Only use if contains(i) is known to be false. + // This function is private, only intended as a helper + // for other methods. + void create_index(int i); + + // In debug mode, verify that some invariant properties of the class + // are being maintained. This is called at the end of the constructor + // and at the beginning and end of all public non-const member functions. + void DebugCheckInvariants() const; + + // Initializes memory for elements [min, max). + void MaybeInitializeMemory(int min, int max) { +#if __has_feature(memory_sanitizer) + __msan_unpoison(sparse_.data() + min, (max - min) * sizeof sparse_[0]); +#elif defined(RE2_ON_VALGRIND) + for (int i = min; i < max; i++) { + sparse_[i] = 0xababababU; + } +#endif + } + + int size_ = 0; + PODArray sparse_; + PODArray dense_; +}; + +template +SparseSetT::SparseSetT() = default; + +// Change the maximum size of the set. +// Invalidates all iterators. +template +void SparseSetT::resize(int new_max_size) { + DebugCheckInvariants(); + if (new_max_size > max_size()) { + const int old_max_size = max_size(); + + // Construct these first for exception safety. + PODArray a(new_max_size); + PODArray b(new_max_size); + + std::copy_n(sparse_.data(), old_max_size, a.data()); + std::copy_n(dense_.data(), old_max_size, b.data()); + + sparse_ = std::move(a); + dense_ = std::move(b); + + MaybeInitializeMemory(old_max_size, new_max_size); + } + if (size_ > new_max_size) + size_ = new_max_size; + DebugCheckInvariants(); +} + +// Check whether index i is in the set. +template +bool SparseSetT::contains(int i) const { + assert(i >= 0); + assert(i < max_size()); + if (static_cast(i) >= static_cast(max_size())) { + return false; + } + // Unsigned comparison avoids checking sparse_[i] < 0. + return (uint32_t)sparse_[i] < (uint32_t)size_ && + dense_[sparse_[i]] == i; +} + +template +void SparseSetT::create_index(int i) { + assert(!contains(i)); + assert(size_ < max_size()); + sparse_[i] = size_; + dense_[size_] = i; + size_++; +} + +template SparseSetT::SparseSetT(int max_size) : + sparse_(max_size), dense_(max_size) { + MaybeInitializeMemory(size_, max_size); + DebugCheckInvariants(); +} + +template SparseSetT::~SparseSetT() { + DebugCheckInvariants(); +} + +template void SparseSetT::DebugCheckInvariants() const { + assert(0 <= size_); + assert(size_ <= max_size()); +} + +// Comparison function for sorting. +template bool SparseSetT::less(int a, int b) { + return a < b; +} + +typedef SparseSetT SparseSet; + +} // namespace re2 + +#endif // RE2_SPARSE_SET_H_ diff --git a/src/duckdb/third_party/re2/re2/stringpiece.cc b/src/duckdb/third_party/re2/re2/stringpiece.cc index 4fc2c310..f38c91e9 100644 --- a/src/duckdb/third_party/re2/re2/stringpiece.cc +++ b/src/duckdb/third_party/re2/re2/stringpiece.cc @@ -62,4 +62,4 @@ std::ostream& operator<<(std::ostream& o, const StringPiece& p) { return o; } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/stringpiece.h b/src/duckdb/third_party/re2/re2/stringpiece.h index da568169..9a64617e 100644 --- a/src/duckdb/third_party/re2/re2/stringpiece.h +++ b/src/duckdb/third_party/re2/re2/stringpiece.h @@ -23,18 +23,13 @@ // // Arghh! I wish C++ literals were "string". -// Doing this simplifies the logic below. -#ifndef __has_include -#define __has_include(x) 0 -#endif - #include #include #include #include #include #include -#if __has_include() && __cplusplus >= 201703L +#ifdef __cpp_lib_string_view #include #endif @@ -61,7 +56,7 @@ class StringPiece { // expected. StringPiece() : data_(NULL), size_(0) {} -#if __has_include() && __cplusplus >= 201703L +#ifdef __cpp_lib_string_view StringPiece(const std::string_view& str) : data_(str.data()), size_(str.size()) {} #endif @@ -107,6 +102,14 @@ class StringPiece { size_ = len; } +#ifdef __cpp_lib_string_view + // Converts to `std::basic_string_view`. + operator std::basic_string_view() const { + if (!data_) return {}; + return std::basic_string_view(data_, size_); + } +#endif + // Converts to `std::basic_string`. template explicit operator std::basic_string() const { @@ -209,6 +212,6 @@ inline bool operator>=(const StringPiece& x, const StringPiece& y) { // Allow StringPiece to be logged. std::ostream& operator<<(std::ostream& o, const StringPiece& p); -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_STRINGPIECE_H_ diff --git a/src/duckdb/third_party/re2/re2/tostring.cc b/src/duckdb/third_party/re2/re2/tostring.cc index 36e38bc6..fea60880 100644 --- a/src/duckdb/third_party/re2/re2/tostring.cc +++ b/src/duckdb/third_party/re2/re2/tostring.cc @@ -61,6 +61,8 @@ std::string Regexp::ToString() { return t; } +#define ToString DontCallToString // Avoid accidental recursion. + // Visits re before children are processed. // Appends ( if needed and passes new precedence to children. int ToStringWalker::PreVisit(Regexp* re, int parent_arg, bool* stop) { @@ -267,9 +269,9 @@ int ToStringWalker::PostVisit(Regexp* re, int parent_arg, int pre_arg, } t_->append("["); // Heuristic: show class as negated if it contains the - // non-character 0xFFFE. + // non-character 0xFFFE and yet somehow isn't full. CharClass* cc = re->cc(); - if (cc->Contains(0xFFFE)) { + if (cc->Contains(0xFFFE) && !cc->full()) { cc = cc->Negate(); t_->append("^"); } @@ -289,7 +291,7 @@ int ToStringWalker::PostVisit(Regexp* re, int parent_arg, int pre_arg, // There's no syntax accepted by the parser to generate // this node (it is generated by RE2::Set) so make something // up that is readable but won't compile. - t_->append("(?HaveMatch:%d)", re->match_id()); + t_->append(StringPrintf("(?HaveMatch:%d)", re->match_id())); break; } @@ -330,10 +332,10 @@ static void AppendCCChar(std::string* t, Rune r) { } if (r < 0x100) { - StringAppendF(t, "\\x%02x", static_cast(r)); + *t += StringPrintf("\\x%02x", static_cast(r)); return; } - StringAppendF(t, "\\x{%x}", static_cast(r)); + *t += StringPrintf("\\x{%x}", static_cast(r)); } static void AppendCCRange(std::string* t, Rune lo, Rune hi) { @@ -346,4 +348,4 @@ static void AppendCCRange(std::string* t, Rune lo, Rune hi) { } } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/unicode_casefold.cc b/src/duckdb/third_party/re2/re2/unicode_casefold.cc index 98bad01b..d5f7ac21 100644 --- a/src/duckdb/third_party/re2/re2/unicode_casefold.cc +++ b/src/duckdb/third_party/re2/re2/unicode_casefold.cc @@ -7,7 +7,7 @@ namespace duckdb_re2 { -// 1374 groups, 2778 pairs, 349 ranges +// 1424 groups, 2878 pairs, 367 ranges const CaseFold unicode_casefold[] = { { 65, 90, 32 }, { 97, 106, -32 }, @@ -122,6 +122,7 @@ const CaseFold unicode_casefold[] = { { 629, 629, -214 }, { 637, 637, 10727 }, { 640, 640, -218 }, + { 642, 642, 42307 }, { 643, 643, -218 }, { 647, 647, 42282 }, { 648, 648, -218 }, @@ -228,6 +229,7 @@ const CaseFold unicode_casefold[] = { { 7357, 7359, -3008 }, { 7545, 7545, 35332 }, { 7549, 7549, 3814 }, + { 7566, 7566, 35384 }, { 7680, 7776, EvenOdd }, { 7777, 7777, 58 }, { 7778, 7829, EvenOdd }, @@ -297,8 +299,8 @@ const CaseFold unicode_casefold[] = { { 8579, 8580, OddEven }, { 9398, 9423, 26 }, { 9424, 9449, -26 }, - { 11264, 11310, 48 }, - { 11312, 11358, -48 }, + { 11264, 11311, 48 }, + { 11312, 11359, -48 }, { 11360, 11361, EvenOdd }, { 11362, 11362, -10743 }, { 11363, 11363, -3814 }, @@ -331,6 +333,7 @@ const CaseFold unicode_casefold[] = { { 42891, 42892, OddEven }, { 42893, 42893, -42280 }, { 42896, 42899, EvenOdd }, + { 42900, 42900, 48 }, { 42902, 42921, EvenOdd }, { 42922, 42922, -42308 }, { 42923, 42923, -42319 }, @@ -341,7 +344,14 @@ const CaseFold unicode_casefold[] = { { 42929, 42929, -42282 }, { 42930, 42930, -42261 }, { 42931, 42931, 928 }, - { 42932, 42937, EvenOdd }, + { 42932, 42947, EvenOdd }, + { 42948, 42948, -48 }, + { 42949, 42949, -42307 }, + { 42950, 42950, -35384 }, + { 42951, 42954, OddEven }, + { 42960, 42961, EvenOdd }, + { 42966, 42969, EvenOdd }, + { 42997, 42998, OddEven }, { 43859, 43859, -928 }, { 43888, 43967, -38864 }, { 65313, 65338, 32 }, @@ -350,6 +360,14 @@ const CaseFold unicode_casefold[] = { { 66600, 66639, -40 }, { 66736, 66771, 40 }, { 66776, 66811, -40 }, + { 66928, 66938, 39 }, + { 66940, 66954, 39 }, + { 66956, 66962, 39 }, + { 66964, 66965, 39 }, + { 66967, 66977, -39 }, + { 66979, 66993, -39 }, + { 66995, 67001, -39 }, + { 67003, 67004, -39 }, { 68736, 68786, 64 }, { 68800, 68850, -64 }, { 71840, 71871, 32 }, @@ -359,9 +377,9 @@ const CaseFold unicode_casefold[] = { { 125184, 125217, 34 }, { 125218, 125251, -34 }, }; -const int num_unicode_casefold = 349; +const int num_unicode_casefold = 367; -// 1374 groups, 1404 pairs, 194 ranges +// 1424 groups, 1454 pairs, 205 ranges const CaseFold unicode_tolower[] = { { 65, 90, 32 }, { 181, 181, 775 }, @@ -512,7 +530,7 @@ const CaseFold unicode_tolower[] = { { 8544, 8559, 16 }, { 8579, 8579, OddEven }, { 9398, 9423, 26 }, - { 11264, 11310, 48 }, + { 11264, 11311, 48 }, { 11360, 11360, EvenOdd }, { 11362, 11362, -10743 }, { 11363, 11363, -3814 }, @@ -548,20 +566,31 @@ const CaseFold unicode_tolower[] = { { 42929, 42929, -42282 }, { 42930, 42930, -42261 }, { 42931, 42931, 928 }, - { 42932, 42936, EvenOddSkip }, + { 42932, 42946, EvenOddSkip }, + { 42948, 42948, -48 }, + { 42949, 42949, -42307 }, + { 42950, 42950, -35384 }, + { 42951, 42953, OddEvenSkip }, + { 42960, 42960, EvenOdd }, + { 42966, 42968, EvenOddSkip }, + { 42997, 42997, OddEven }, { 43888, 43967, -38864 }, { 65313, 65338, 32 }, { 66560, 66599, 40 }, { 66736, 66771, 40 }, + { 66928, 66938, 39 }, + { 66940, 66954, 39 }, + { 66956, 66962, 39 }, + { 66964, 66965, 39 }, { 68736, 68786, 64 }, { 71840, 71871, 32 }, { 93760, 93791, 32 }, { 125184, 125217, 34 }, }; -const int num_unicode_tolower = 194; +const int num_unicode_tolower = 205; -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/unicode_casefold.h b/src/duckdb/third_party/re2/re2/unicode_casefold.h index 260a233f..25a399cd 100644 --- a/src/duckdb/third_party/re2/re2/unicode_casefold.h +++ b/src/duckdb/third_party/re2/re2/unicode_casefold.h @@ -73,6 +73,6 @@ extern const CaseFold* LookupCaseFold(const CaseFold*, int, Rune rune); // Returns the result of applying the fold f to the rune r. extern Rune ApplyFold(const CaseFold *f, Rune r); -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_UNICODE_CASEFOLD_H_ diff --git a/src/duckdb/third_party/re2/re2/unicode_groups.cc b/src/duckdb/third_party/re2/re2/unicode_groups.cc index 9ca5c0f2..f37daaec 100644 --- a/src/duckdb/third_party/re2/re2/unicode_groups.cc +++ b/src/duckdb/third_party/re2/re2/unicode_groups.cc @@ -7,183 +7,109 @@ namespace duckdb_re2 { -static const URange16 Ps_range16[] = { - { 40, 40 }, - { 91, 91 }, - { 123, 123 }, - { 3898, 3898 }, - { 3900, 3900 }, - { 5787, 5787 }, - { 8218, 8218 }, - { 8222, 8222 }, - { 8261, 8261 }, - { 8317, 8317 }, - { 8333, 8333 }, - { 8968, 8968 }, - { 8970, 8970 }, - { 9001, 9001 }, - { 10088, 10088 }, - { 10090, 10090 }, - { 10092, 10092 }, - { 10094, 10094 }, - { 10096, 10096 }, - { 10098, 10098 }, - { 10100, 10100 }, - { 10181, 10181 }, - { 10214, 10214 }, - { 10216, 10216 }, - { 10218, 10218 }, - { 10220, 10220 }, - { 10222, 10222 }, - { 10627, 10627 }, - { 10629, 10629 }, - { 10631, 10631 }, - { 10633, 10633 }, - { 10635, 10635 }, - { 10637, 10637 }, - { 10639, 10639 }, - { 10641, 10641 }, - { 10643, 10643 }, - { 10645, 10645 }, - { 10647, 10647 }, - { 10712, 10712 }, - { 10714, 10714 }, - { 10748, 10748 }, - { 11810, 11810 }, - { 11812, 11812 }, - { 11814, 11814 }, - { 11816, 11816 }, - { 11842, 11842 }, - { 12296, 12296 }, - { 12298, 12298 }, - { 12300, 12300 }, - { 12302, 12302 }, - { 12304, 12304 }, - { 12308, 12308 }, - { 12310, 12310 }, - { 12312, 12312 }, - { 12314, 12314 }, - { 12317, 12317 }, - { 64831, 64831 }, - { 65047, 65047 }, - { 65077, 65077 }, - { 65079, 65079 }, - { 65081, 65081 }, - { 65083, 65083 }, - { 65085, 65085 }, - { 65087, 65087 }, - { 65089, 65089 }, - { 65091, 65091 }, - { 65095, 65095 }, - { 65113, 65113 }, - { 65115, 65115 }, - { 65117, 65117 }, - { 65288, 65288 }, - { 65339, 65339 }, - { 65371, 65371 }, - { 65375, 65375 }, - { 65378, 65378 }, +static const URange16 C_range16[] = { + { 0, 31 }, + { 127, 159 }, + { 173, 173 }, + { 1536, 1541 }, + { 1564, 1564 }, + { 1757, 1757 }, + { 1807, 1807 }, + { 2192, 2193 }, + { 2274, 2274 }, + { 6158, 6158 }, + { 8203, 8207 }, + { 8234, 8238 }, + { 8288, 8292 }, + { 8294, 8303 }, + { 55296, 63743 }, + { 65279, 65279 }, + { 65529, 65531 }, }; -static const URange16 Nl_range16[] = { - { 5870, 5872 }, - { 8544, 8578 }, - { 8581, 8584 }, - { 12295, 12295 }, - { 12321, 12329 }, - { 12344, 12346 }, - { 42726, 42735 }, +static const URange32 C_range32[] = { + { 69821, 69821 }, + { 69837, 69837 }, + { 78896, 78911 }, + { 113824, 113827 }, + { 119155, 119162 }, + { 917505, 917505 }, + { 917536, 917631 }, + { 983040, 1048573 }, + { 1048576, 1114109 }, }; -static const URange32 Nl_range32[] = { - { 65856, 65908 }, - { 66369, 66369 }, - { 66378, 66378 }, - { 66513, 66517 }, - { 74752, 74862 }, +static const URange16 Cc_range16[] = { + { 0, 31 }, + { 127, 159 }, }; -static const URange16 No_range16[] = { - { 178, 179 }, - { 185, 185 }, - { 188, 190 }, - { 2548, 2553 }, - { 2930, 2935 }, - { 3056, 3058 }, - { 3192, 3198 }, - { 3416, 3422 }, - { 3440, 3448 }, - { 3882, 3891 }, - { 4969, 4988 }, - { 6128, 6137 }, - { 6618, 6618 }, - { 8304, 8304 }, - { 8308, 8313 }, - { 8320, 8329 }, - { 8528, 8543 }, - { 8585, 8585 }, - { 9312, 9371 }, - { 9450, 9471 }, - { 10102, 10131 }, - { 11517, 11517 }, - { 12690, 12693 }, - { 12832, 12841 }, - { 12872, 12879 }, - { 12881, 12895 }, - { 12928, 12937 }, - { 12977, 12991 }, - { 43056, 43061 }, +static const URange16 Cf_range16[] = { + { 173, 173 }, + { 1536, 1541 }, + { 1564, 1564 }, + { 1757, 1757 }, + { 1807, 1807 }, + { 2192, 2193 }, + { 2274, 2274 }, + { 6158, 6158 }, + { 8203, 8207 }, + { 8234, 8238 }, + { 8288, 8292 }, + { 8294, 8303 }, + { 65279, 65279 }, + { 65529, 65531 }, }; -static const URange32 No_range32[] = { - { 65799, 65843 }, - { 65909, 65912 }, - { 65930, 65931 }, - { 66273, 66299 }, - { 66336, 66339 }, - { 67672, 67679 }, - { 67705, 67711 }, - { 67751, 67759 }, - { 67835, 67839 }, - { 67862, 67867 }, - { 68028, 68029 }, - { 68032, 68047 }, - { 68050, 68095 }, - { 68160, 68168 }, - { 68221, 68222 }, - { 68253, 68255 }, - { 68331, 68335 }, - { 68440, 68447 }, - { 68472, 68479 }, - { 68521, 68527 }, - { 68858, 68863 }, - { 69216, 69246 }, - { 69405, 69414 }, - { 69457, 69460 }, - { 69714, 69733 }, - { 70113, 70132 }, - { 71482, 71483 }, - { 71914, 71922 }, - { 72794, 72812 }, - { 93019, 93025 }, - { 93824, 93846 }, - { 119520, 119539 }, - { 119648, 119672 }, - { 125127, 125135 }, - { 126065, 126123 }, - { 126125, 126127 }, - { 126129, 126132 }, - { 127232, 127244 }, +static const URange32 Cf_range32[] = { + { 69821, 69821 }, + { 69837, 69837 }, + { 78896, 78911 }, + { 113824, 113827 }, + { 119155, 119162 }, + { 917505, 917505 }, + { 917536, 917631 }, }; -static const URange16 Lo_range16[] = { +static const URange16 Co_range16[] = { + { 57344, 63743 }, +}; +static const URange32 Co_range32[] = { + { 983040, 1048573 }, + { 1048576, 1114109 }, +}; +static const URange16 Cs_range16[] = { + { 55296, 57343 }, +}; +static const URange16 L_range16[] = { + { 65, 90 }, + { 97, 122 }, { 170, 170 }, + { 181, 181 }, { 186, 186 }, - { 443, 443 }, - { 448, 451 }, - { 660, 660 }, + { 192, 214 }, + { 216, 246 }, + { 248, 705 }, + { 710, 721 }, + { 736, 740 }, + { 748, 748 }, + { 750, 750 }, + { 880, 884 }, + { 886, 887 }, + { 890, 893 }, + { 895, 895 }, + { 902, 902 }, + { 904, 906 }, + { 908, 908 }, + { 910, 929 }, + { 931, 1013 }, + { 1015, 1153 }, + { 1162, 1327 }, + { 1329, 1366 }, + { 1369, 1369 }, + { 1376, 1416 }, { 1488, 1514 }, { 1519, 1522 }, - { 1568, 1599 }, - { 1601, 1610 }, + { 1568, 1610 }, { 1646, 1647 }, { 1649, 1747 }, { 1749, 1749 }, + { 1765, 1766 }, { 1774, 1775 }, { 1786, 1788 }, { 1791, 1791 }, @@ -192,16 +118,22 @@ static const URange16 Lo_range16[] = { { 1869, 1957 }, { 1969, 1969 }, { 1994, 2026 }, + { 2036, 2037 }, + { 2042, 2042 }, { 2048, 2069 }, - { 2112, 2136 }, - { 2144, 2154 }, - { 2208, 2228 }, - { 2230, 2237 }, + { 2074, 2074 }, + { 2084, 2084 }, + { 2088, 2088 }, + { 2112, 2136 }, + { 2144, 2154 }, + { 2160, 2183 }, + { 2185, 2190 }, + { 2208, 2249 }, { 2308, 2361 }, { 2365, 2365 }, { 2384, 2384 }, { 2392, 2401 }, - { 2418, 2432 }, + { 2417, 2432 }, { 2437, 2444 }, { 2447, 2448 }, { 2451, 2472 }, @@ -261,6 +193,7 @@ static const URange16 Lo_range16[] = { { 3114, 3129 }, { 3133, 3133 }, { 3160, 3162 }, + { 3165, 3165 }, { 3168, 3169 }, { 3200, 3200 }, { 3205, 3212 }, @@ -269,10 +202,10 @@ static const URange16 Lo_range16[] = { { 3242, 3251 }, { 3253, 3257 }, { 3261, 3261 }, - { 3294, 3294 }, + { 3293, 3294 }, { 3296, 3297 }, { 3313, 3314 }, - { 3333, 3340 }, + { 3332, 3340 }, { 3342, 3344 }, { 3346, 3386 }, { 3389, 3389 }, @@ -287,22 +220,17 @@ static const URange16 Lo_range16[] = { { 3520, 3526 }, { 3585, 3632 }, { 3634, 3635 }, - { 3648, 3653 }, + { 3648, 3654 }, { 3713, 3714 }, { 3716, 3716 }, - { 3719, 3720 }, - { 3722, 3722 }, - { 3725, 3725 }, - { 3732, 3735 }, - { 3737, 3743 }, - { 3745, 3747 }, + { 3718, 3722 }, + { 3724, 3747 }, { 3749, 3749 }, - { 3751, 3751 }, - { 3754, 3755 }, - { 3757, 3760 }, + { 3751, 3760 }, { 3762, 3763 }, { 3773, 3773 }, { 3776, 3780 }, + { 3782, 3782 }, { 3804, 3807 }, { 3840, 3840 }, { 3904, 3911 }, @@ -317,7 +245,11 @@ static const URange16 Lo_range16[] = { { 4206, 4208 }, { 4213, 4225 }, { 4238, 4238 }, - { 4352, 4680 }, + { 4256, 4293 }, + { 4295, 4295 }, + { 4301, 4301 }, + { 4304, 4346 }, + { 4348, 4680 }, { 4682, 4685 }, { 4688, 4694 }, { 4696, 4696 }, @@ -334,21 +266,22 @@ static const URange16 Lo_range16[] = { { 4882, 4885 }, { 4888, 4954 }, { 4992, 5007 }, + { 5024, 5109 }, + { 5112, 5117 }, { 5121, 5740 }, { 5743, 5759 }, { 5761, 5786 }, { 5792, 5866 }, { 5873, 5880 }, - { 5888, 5900 }, - { 5902, 5905 }, - { 5920, 5937 }, + { 5888, 5905 }, + { 5919, 5937 }, { 5952, 5969 }, { 5984, 5996 }, { 5998, 6000 }, { 6016, 6067 }, + { 6103, 6103 }, { 6108, 6108 }, - { 6176, 6210 }, - { 6212, 6264 }, + { 6176, 6264 }, { 6272, 6276 }, { 6279, 6312 }, { 6314, 6314 }, @@ -360,19 +293,67 @@ static const URange16 Lo_range16[] = { { 6576, 6601 }, { 6656, 6678 }, { 6688, 6740 }, + { 6823, 6823 }, { 6917, 6963 }, - { 6981, 6987 }, + { 6981, 6988 }, { 7043, 7072 }, { 7086, 7087 }, { 7098, 7141 }, { 7168, 7203 }, { 7245, 7247 }, - { 7258, 7287 }, + { 7258, 7293 }, + { 7296, 7304 }, + { 7312, 7354 }, + { 7357, 7359 }, { 7401, 7404 }, - { 7406, 7409 }, + { 7406, 7411 }, { 7413, 7414 }, - { 8501, 8504 }, + { 7418, 7418 }, + { 7424, 7615 }, + { 7680, 7957 }, + { 7960, 7965 }, + { 7968, 8005 }, + { 8008, 8013 }, + { 8016, 8023 }, + { 8025, 8025 }, + { 8027, 8027 }, + { 8029, 8029 }, + { 8031, 8061 }, + { 8064, 8116 }, + { 8118, 8124 }, + { 8126, 8126 }, + { 8130, 8132 }, + { 8134, 8140 }, + { 8144, 8147 }, + { 8150, 8155 }, + { 8160, 8172 }, + { 8178, 8180 }, + { 8182, 8188 }, + { 8305, 8305 }, + { 8319, 8319 }, + { 8336, 8348 }, + { 8450, 8450 }, + { 8455, 8455 }, + { 8458, 8467 }, + { 8469, 8469 }, + { 8473, 8477 }, + { 8484, 8484 }, + { 8486, 8486 }, + { 8488, 8488 }, + { 8490, 8493 }, + { 8495, 8505 }, + { 8508, 8511 }, + { 8517, 8521 }, + { 8526, 8526 }, + { 8579, 8580 }, + { 11264, 11492 }, + { 11499, 11502 }, + { 11506, 11507 }, + { 11520, 11557 }, + { 11559, 11559 }, + { 11565, 11565 }, { 11568, 11623 }, + { 11631, 11631 }, { 11648, 11670 }, { 11680, 11686 }, { 11688, 11694 }, @@ -382,29 +363,34 @@ static const URange16 Lo_range16[] = { { 11720, 11726 }, { 11728, 11734 }, { 11736, 11742 }, - { 12294, 12294 }, - { 12348, 12348 }, + { 11823, 11823 }, + { 12293, 12294 }, + { 12337, 12341 }, + { 12347, 12348 }, { 12353, 12438 }, - { 12447, 12447 }, + { 12445, 12447 }, { 12449, 12538 }, - { 12543, 12543 }, + { 12540, 12543 }, { 12549, 12591 }, { 12593, 12686 }, - { 12704, 12730 }, + { 12704, 12735 }, { 12784, 12799 }, - { 13312, 19893 }, - { 19968, 40943 }, - { 40960, 40980 }, - { 40982, 42124 }, - { 42192, 42231 }, - { 42240, 42507 }, + { 13312, 19903 }, + { 19968, 42124 }, + { 42192, 42237 }, + { 42240, 42508 }, { 42512, 42527 }, { 42538, 42539 }, - { 42606, 42606 }, + { 42560, 42606 }, + { 42623, 42653 }, { 42656, 42725 }, - { 42895, 42895 }, - { 42999, 42999 }, - { 43003, 43009 }, + { 42775, 42783 }, + { 42786, 42888 }, + { 42891, 42954 }, + { 42960, 42961 }, + { 42963, 42963 }, + { 42965, 42969 }, + { 42994, 43009 }, { 43011, 43013 }, { 43015, 43018 }, { 43020, 43042 }, @@ -417,14 +403,14 @@ static const URange16 Lo_range16[] = { { 43312, 43334 }, { 43360, 43388 }, { 43396, 43442 }, + { 43471, 43471 }, { 43488, 43492 }, - { 43495, 43503 }, + { 43494, 43503 }, { 43514, 43518 }, { 43520, 43560 }, { 43584, 43586 }, { 43588, 43595 }, - { 43616, 43631 }, - { 43633, 43638 }, + { 43616, 43638 }, { 43642, 43642 }, { 43646, 43695 }, { 43697, 43697 }, @@ -432,20 +418,24 @@ static const URange16 Lo_range16[] = { { 43705, 43709 }, { 43712, 43712 }, { 43714, 43714 }, - { 43739, 43740 }, + { 43739, 43741 }, { 43744, 43754 }, - { 43762, 43762 }, + { 43762, 43764 }, { 43777, 43782 }, { 43785, 43790 }, { 43793, 43798 }, { 43808, 43814 }, { 43816, 43822 }, - { 43968, 44002 }, + { 43824, 43866 }, + { 43868, 43881 }, + { 43888, 44002 }, { 44032, 55203 }, { 55216, 55238 }, { 55243, 55291 }, { 63744, 64109 }, { 64112, 64217 }, + { 64256, 64262 }, + { 64275, 64279 }, { 64285, 64285 }, { 64287, 64296 }, { 64298, 64310 }, @@ -460,15 +450,15 @@ static const URange16 Lo_range16[] = { { 65008, 65019 }, { 65136, 65140 }, { 65142, 65276 }, - { 65382, 65391 }, - { 65393, 65437 }, - { 65440, 65470 }, + { 65313, 65338 }, + { 65345, 65370 }, + { 65382, 65470 }, { 65474, 65479 }, { 65482, 65487 }, { 65490, 65495 }, { 65498, 65500 }, }; -static const URange32 Lo_range32[] = { +static const URange32 L_range32[] = { { 65536, 65547 }, { 65549, 65574 }, { 65576, 65594 }, @@ -485,12 +475,25 @@ static const URange32 Lo_range32[] = { { 66432, 66461 }, { 66464, 66499 }, { 66504, 66511 }, - { 66640, 66717 }, + { 66560, 66717 }, + { 66736, 66771 }, + { 66776, 66811 }, { 66816, 66855 }, { 66864, 66915 }, + { 66928, 66938 }, + { 66940, 66954 }, + { 66956, 66962 }, + { 66964, 66965 }, + { 66967, 66977 }, + { 66979, 66993 }, + { 66995, 67001 }, + { 67003, 67004 }, { 67072, 67382 }, { 67392, 67413 }, { 67424, 67431 }, + { 67456, 67461 }, + { 67463, 67504 }, + { 67506, 67514 }, { 67584, 67589 }, { 67592, 67592 }, { 67594, 67637 }, @@ -518,15 +521,25 @@ static const URange32 Lo_range32[] = { { 68448, 68466 }, { 68480, 68497 }, { 68608, 68680 }, + { 68736, 68786 }, + { 68800, 68850 }, { 68864, 68899 }, + { 69248, 69289 }, + { 69296, 69297 }, { 69376, 69404 }, { 69415, 69415 }, { 69424, 69445 }, + { 69488, 69505 }, + { 69552, 69572 }, + { 69600, 69622 }, { 69635, 69687 }, + { 69745, 69746 }, + { 69749, 69749 }, { 69763, 69807 }, { 69840, 69864 }, { 69891, 69926 }, { 69956, 69956 }, + { 69959, 69959 }, { 69968, 70002 }, { 70006, 70006 }, { 70019, 70066 }, @@ -535,6 +548,7 @@ static const URange32 Lo_range32[] = { { 70108, 70108 }, { 70144, 70161 }, { 70163, 70187 }, + { 70207, 70208 }, { 70272, 70278 }, { 70280, 70280 }, { 70282, 70285 }, @@ -552,6 +566,7 @@ static const URange32 Lo_range32[] = { { 70493, 70497 }, { 70656, 70708 }, { 70727, 70730 }, + { 70751, 70753 }, { 70784, 70831 }, { 70852, 70853 }, { 70855, 70855 }, @@ -560,17 +575,29 @@ static const URange32 Lo_range32[] = { { 71168, 71215 }, { 71236, 71236 }, { 71296, 71338 }, + { 71352, 71352 }, { 71424, 71450 }, + { 71488, 71494 }, { 71680, 71723 }, - { 71935, 71935 }, + { 71840, 71903 }, + { 71935, 71942 }, + { 71945, 71945 }, + { 71948, 71955 }, + { 71957, 71958 }, + { 71960, 71983 }, + { 71999, 71999 }, + { 72001, 72001 }, + { 72096, 72103 }, + { 72106, 72144 }, + { 72161, 72161 }, + { 72163, 72163 }, { 72192, 72192 }, { 72203, 72242 }, { 72250, 72250 }, { 72272, 72272 }, - { 72284, 72323 }, - { 72326, 72329 }, + { 72284, 72329 }, { 72349, 72349 }, - { 72384, 72440 }, + { 72368, 72440 }, { 72704, 72712 }, { 72714, 72750 }, { 72768, 72768 }, @@ -584,27 +611,92 @@ static const URange32 Lo_range32[] = { { 73066, 73097 }, { 73112, 73112 }, { 73440, 73458 }, + { 73474, 73474 }, + { 73476, 73488 }, + { 73490, 73523 }, + { 73648, 73648 }, { 73728, 74649 }, { 74880, 75075 }, - { 77824, 78894 }, + { 77712, 77808 }, + { 77824, 78895 }, + { 78913, 78918 }, { 82944, 83526 }, { 92160, 92728 }, { 92736, 92766 }, + { 92784, 92862 }, { 92880, 92909 }, { 92928, 92975 }, + { 92992, 92995 }, { 93027, 93047 }, { 93053, 93071 }, - { 93952, 94020 }, + { 93760, 93823 }, + { 93952, 94026 }, { 94032, 94032 }, - { 94208, 100337 }, - { 100352, 101106 }, - { 110592, 110878 }, + { 94099, 94111 }, + { 94176, 94177 }, + { 94179, 94179 }, + { 94208, 100343 }, + { 100352, 101589 }, + { 101632, 101640 }, + { 110576, 110579 }, + { 110581, 110587 }, + { 110589, 110590 }, + { 110592, 110882 }, + { 110898, 110898 }, + { 110928, 110930 }, + { 110933, 110933 }, + { 110948, 110951 }, { 110960, 111355 }, { 113664, 113770 }, { 113776, 113788 }, { 113792, 113800 }, { 113808, 113817 }, + { 119808, 119892 }, + { 119894, 119964 }, + { 119966, 119967 }, + { 119970, 119970 }, + { 119973, 119974 }, + { 119977, 119980 }, + { 119982, 119993 }, + { 119995, 119995 }, + { 119997, 120003 }, + { 120005, 120069 }, + { 120071, 120074 }, + { 120077, 120084 }, + { 120086, 120092 }, + { 120094, 120121 }, + { 120123, 120126 }, + { 120128, 120132 }, + { 120134, 120134 }, + { 120138, 120144 }, + { 120146, 120485 }, + { 120488, 120512 }, + { 120514, 120538 }, + { 120540, 120570 }, + { 120572, 120596 }, + { 120598, 120628 }, + { 120630, 120654 }, + { 120656, 120686 }, + { 120688, 120712 }, + { 120714, 120744 }, + { 120746, 120770 }, + { 120772, 120779 }, + { 122624, 122654 }, + { 122661, 122666 }, + { 122928, 122989 }, + { 123136, 123180 }, + { 123191, 123197 }, + { 123214, 123214 }, + { 123536, 123565 }, + { 123584, 123627 }, + { 124112, 124139 }, + { 124896, 124902 }, + { 124904, 124907 }, + { 124909, 124910 }, + { 124912, 124926 }, { 124928, 125124 }, + { 125184, 125251 }, + { 125259, 125259 }, { 126464, 126467 }, { 126469, 126495 }, { 126497, 126498 }, @@ -638,12 +730,14 @@ static const URange32 Lo_range32[] = { { 126625, 126627 }, { 126629, 126633 }, { 126635, 126651 }, - { 131072, 173782 }, - { 173824, 177972 }, + { 131072, 173791 }, + { 173824, 177977 }, { 177984, 178205 }, { 178208, 183969 }, { 183984, 191456 }, { 194560, 195101 }, + { 196608, 201546 }, + { 201552, 205743 }, }; static const URange16 Ll_range16[] = { { 97, 122 }, @@ -1077,7 +1171,7 @@ static const URange16 Ll_range16[] = { { 8518, 8521 }, { 8526, 8526 }, { 8580, 8580 }, - { 11312, 11358 }, + { 11312, 11359 }, { 11361, 11361 }, { 11365, 11366 }, { 11368, 11368 }, @@ -1243,9 +1337,22 @@ static const URange16 Ll_range16[] = { { 42933, 42933 }, { 42935, 42935 }, { 42937, 42937 }, + { 42939, 42939 }, + { 42941, 42941 }, + { 42943, 42943 }, + { 42945, 42945 }, + { 42947, 42947 }, + { 42952, 42952 }, + { 42954, 42954 }, + { 42961, 42961 }, + { 42963, 42963 }, + { 42965, 42965 }, + { 42967, 42967 }, + { 42969, 42969 }, + { 42998, 42998 }, { 43002, 43002 }, { 43824, 43866 }, - { 43872, 43877 }, + { 43872, 43880 }, { 43888, 43967 }, { 64256, 64262 }, { 64275, 64279 }, @@ -1254,6 +1361,10 @@ static const URange16 Ll_range16[] = { static const URange32 Ll_range32[] = { { 66600, 66639 }, { 66776, 66811 }, + { 66967, 66977 }, + { 66979, 66993 }, + { 66995, 67001 }, + { 67003, 67004 }, { 68800, 68850 }, { 71872, 71903 }, { 93792, 93823 }, @@ -1285,6 +1396,9 @@ static const URange32 Ll_range32[] = { { 120746, 120770 }, { 120772, 120777 }, { 120779, 120779 }, + { 122624, 122633 }, + { 122635, 122654 }, + { 122661, 122666 }, { 125218, 125251 }, }; static const URange16 Lm_range16[] = { @@ -1303,6 +1417,7 @@ static const URange16 Lm_range16[] = { { 2074, 2074 }, { 2084, 2084 }, { 2088, 2088 }, + { 2249, 2249 }, { 2417, 2417 }, { 3654, 3654 }, { 3782, 3782 }, @@ -1333,6 +1448,7 @@ static const URange16 Lm_range16[] = { { 42775, 42783 }, { 42864, 42864 }, { 42888, 42888 }, + { 42994, 42996 }, { 43000, 43001 }, { 43471, 43471 }, { 43494, 43494 }, @@ -1340,3900 +1456,4090 @@ static const URange16 Lm_range16[] = { { 43741, 43741 }, { 43763, 43764 }, { 43868, 43871 }, + { 43881, 43881 }, { 65392, 65392 }, { 65438, 65439 }, }; static const URange32 Lm_range32[] = { + { 67456, 67461 }, + { 67463, 67504 }, + { 67506, 67514 }, { 92992, 92995 }, { 94099, 94111 }, { 94176, 94177 }, + { 94179, 94179 }, + { 110576, 110579 }, + { 110581, 110587 }, + { 110589, 110590 }, + { 122928, 122989 }, + { 123191, 123197 }, + { 124139, 124139 }, + { 125259, 125259 }, }; -static const URange16 Nd_range16[] = { - { 48, 57 }, - { 1632, 1641 }, - { 1776, 1785 }, - { 1984, 1993 }, - { 2406, 2415 }, - { 2534, 2543 }, - { 2662, 2671 }, - { 2790, 2799 }, - { 2918, 2927 }, - { 3046, 3055 }, - { 3174, 3183 }, - { 3302, 3311 }, - { 3430, 3439 }, - { 3558, 3567 }, - { 3664, 3673 }, - { 3792, 3801 }, - { 3872, 3881 }, - { 4160, 4169 }, - { 4240, 4249 }, - { 6112, 6121 }, - { 6160, 6169 }, - { 6470, 6479 }, - { 6608, 6617 }, - { 6784, 6793 }, - { 6800, 6809 }, - { 6992, 7001 }, - { 7088, 7097 }, - { 7232, 7241 }, - { 7248, 7257 }, - { 42528, 42537 }, - { 43216, 43225 }, - { 43264, 43273 }, - { 43472, 43481 }, - { 43504, 43513 }, - { 43600, 43609 }, - { 44016, 44025 }, - { 65296, 65305 }, -}; -static const URange32 Nd_range32[] = { - { 66720, 66729 }, - { 68912, 68921 }, - { 69734, 69743 }, - { 69872, 69881 }, - { 69942, 69951 }, - { 70096, 70105 }, - { 70384, 70393 }, - { 70736, 70745 }, - { 70864, 70873 }, - { 71248, 71257 }, - { 71360, 71369 }, - { 71472, 71481 }, - { 71904, 71913 }, - { 72784, 72793 }, - { 73040, 73049 }, - { 73120, 73129 }, - { 92768, 92777 }, - { 93008, 93017 }, - { 120782, 120831 }, - { 125264, 125273 }, -}; -static const URange16 Pc_range16[] = { - { 95, 95 }, - { 8255, 8256 }, - { 8276, 8276 }, - { 65075, 65076 }, - { 65101, 65103 }, - { 65343, 65343 }, -}; -static const URange16 Lt_range16[] = { - { 453, 453 }, - { 456, 456 }, - { 459, 459 }, - { 498, 498 }, - { 8072, 8079 }, - { 8088, 8095 }, - { 8104, 8111 }, - { 8124, 8124 }, - { 8140, 8140 }, - { 8188, 8188 }, -}; -static const URange16 Lu_range16[] = { - { 65, 90 }, - { 192, 214 }, - { 216, 222 }, - { 256, 256 }, - { 258, 258 }, - { 260, 260 }, - { 262, 262 }, - { 264, 264 }, - { 266, 266 }, - { 268, 268 }, - { 270, 270 }, - { 272, 272 }, - { 274, 274 }, - { 276, 276 }, - { 278, 278 }, - { 280, 280 }, - { 282, 282 }, - { 284, 284 }, - { 286, 286 }, - { 288, 288 }, - { 290, 290 }, - { 292, 292 }, - { 294, 294 }, - { 296, 296 }, - { 298, 298 }, - { 300, 300 }, - { 302, 302 }, - { 304, 304 }, - { 306, 306 }, - { 308, 308 }, - { 310, 310 }, - { 313, 313 }, - { 315, 315 }, - { 317, 317 }, - { 319, 319 }, - { 321, 321 }, - { 323, 323 }, - { 325, 325 }, - { 327, 327 }, - { 330, 330 }, - { 332, 332 }, - { 334, 334 }, - { 336, 336 }, - { 338, 338 }, - { 340, 340 }, - { 342, 342 }, - { 344, 344 }, - { 346, 346 }, - { 348, 348 }, - { 350, 350 }, - { 352, 352 }, - { 354, 354 }, - { 356, 356 }, - { 358, 358 }, - { 360, 360 }, - { 362, 362 }, - { 364, 364 }, - { 366, 366 }, - { 368, 368 }, - { 370, 370 }, - { 372, 372 }, - { 374, 374 }, - { 376, 377 }, - { 379, 379 }, - { 381, 381 }, - { 385, 386 }, - { 388, 388 }, - { 390, 391 }, - { 393, 395 }, - { 398, 401 }, - { 403, 404 }, - { 406, 408 }, - { 412, 413 }, - { 415, 416 }, - { 418, 418 }, - { 420, 420 }, - { 422, 423 }, - { 425, 425 }, - { 428, 428 }, - { 430, 431 }, - { 433, 435 }, - { 437, 437 }, - { 439, 440 }, - { 444, 444 }, - { 452, 452 }, - { 455, 455 }, - { 458, 458 }, - { 461, 461 }, - { 463, 463 }, - { 465, 465 }, - { 467, 467 }, - { 469, 469 }, - { 471, 471 }, - { 473, 473 }, - { 475, 475 }, - { 478, 478 }, - { 480, 480 }, - { 482, 482 }, - { 484, 484 }, - { 486, 486 }, - { 488, 488 }, - { 490, 490 }, - { 492, 492 }, - { 494, 494 }, - { 497, 497 }, - { 500, 500 }, - { 502, 504 }, - { 506, 506 }, - { 508, 508 }, - { 510, 510 }, - { 512, 512 }, - { 514, 514 }, - { 516, 516 }, - { 518, 518 }, - { 520, 520 }, - { 522, 522 }, - { 524, 524 }, - { 526, 526 }, - { 528, 528 }, - { 530, 530 }, - { 532, 532 }, - { 534, 534 }, - { 536, 536 }, - { 538, 538 }, - { 540, 540 }, - { 542, 542 }, - { 544, 544 }, - { 546, 546 }, - { 548, 548 }, - { 550, 550 }, - { 552, 552 }, - { 554, 554 }, - { 556, 556 }, - { 558, 558 }, - { 560, 560 }, - { 562, 562 }, - { 570, 571 }, - { 573, 574 }, - { 577, 577 }, - { 579, 582 }, - { 584, 584 }, - { 586, 586 }, - { 588, 588 }, - { 590, 590 }, - { 880, 880 }, - { 882, 882 }, - { 886, 886 }, - { 895, 895 }, - { 902, 902 }, - { 904, 906 }, - { 908, 908 }, - { 910, 911 }, - { 913, 929 }, - { 931, 939 }, - { 975, 975 }, - { 978, 980 }, - { 984, 984 }, - { 986, 986 }, - { 988, 988 }, - { 990, 990 }, - { 992, 992 }, - { 994, 994 }, - { 996, 996 }, - { 998, 998 }, - { 1000, 1000 }, - { 1002, 1002 }, - { 1004, 1004 }, - { 1006, 1006 }, - { 1012, 1012 }, - { 1015, 1015 }, - { 1017, 1018 }, - { 1021, 1071 }, - { 1120, 1120 }, - { 1122, 1122 }, - { 1124, 1124 }, - { 1126, 1126 }, - { 1128, 1128 }, - { 1130, 1130 }, - { 1132, 1132 }, - { 1134, 1134 }, - { 1136, 1136 }, - { 1138, 1138 }, - { 1140, 1140 }, - { 1142, 1142 }, - { 1144, 1144 }, - { 1146, 1146 }, - { 1148, 1148 }, - { 1150, 1150 }, - { 1152, 1152 }, - { 1162, 1162 }, - { 1164, 1164 }, - { 1166, 1166 }, - { 1168, 1168 }, - { 1170, 1170 }, - { 1172, 1172 }, - { 1174, 1174 }, - { 1176, 1176 }, - { 1178, 1178 }, - { 1180, 1180 }, - { 1182, 1182 }, - { 1184, 1184 }, - { 1186, 1186 }, - { 1188, 1188 }, - { 1190, 1190 }, - { 1192, 1192 }, - { 1194, 1194 }, - { 1196, 1196 }, - { 1198, 1198 }, - { 1200, 1200 }, - { 1202, 1202 }, - { 1204, 1204 }, - { 1206, 1206 }, - { 1208, 1208 }, - { 1210, 1210 }, - { 1212, 1212 }, - { 1214, 1214 }, - { 1216, 1217 }, - { 1219, 1219 }, - { 1221, 1221 }, - { 1223, 1223 }, - { 1225, 1225 }, - { 1227, 1227 }, - { 1229, 1229 }, - { 1232, 1232 }, - { 1234, 1234 }, - { 1236, 1236 }, - { 1238, 1238 }, - { 1240, 1240 }, - { 1242, 1242 }, - { 1244, 1244 }, - { 1246, 1246 }, - { 1248, 1248 }, - { 1250, 1250 }, - { 1252, 1252 }, - { 1254, 1254 }, - { 1256, 1256 }, - { 1258, 1258 }, - { 1260, 1260 }, - { 1262, 1262 }, - { 1264, 1264 }, - { 1266, 1266 }, - { 1268, 1268 }, - { 1270, 1270 }, - { 1272, 1272 }, - { 1274, 1274 }, - { 1276, 1276 }, - { 1278, 1278 }, - { 1280, 1280 }, - { 1282, 1282 }, - { 1284, 1284 }, - { 1286, 1286 }, - { 1288, 1288 }, - { 1290, 1290 }, - { 1292, 1292 }, - { 1294, 1294 }, - { 1296, 1296 }, - { 1298, 1298 }, - { 1300, 1300 }, - { 1302, 1302 }, - { 1304, 1304 }, - { 1306, 1306 }, - { 1308, 1308 }, - { 1310, 1310 }, - { 1312, 1312 }, - { 1314, 1314 }, - { 1316, 1316 }, - { 1318, 1318 }, - { 1320, 1320 }, - { 1322, 1322 }, - { 1324, 1324 }, - { 1326, 1326 }, - { 1329, 1366 }, - { 4256, 4293 }, - { 4295, 4295 }, - { 4301, 4301 }, - { 5024, 5109 }, - { 7312, 7354 }, - { 7357, 7359 }, - { 7680, 7680 }, - { 7682, 7682 }, - { 7684, 7684 }, - { 7686, 7686 }, - { 7688, 7688 }, - { 7690, 7690 }, - { 7692, 7692 }, - { 7694, 7694 }, - { 7696, 7696 }, - { 7698, 7698 }, - { 7700, 7700 }, - { 7702, 7702 }, - { 7704, 7704 }, - { 7706, 7706 }, - { 7708, 7708 }, - { 7710, 7710 }, - { 7712, 7712 }, - { 7714, 7714 }, - { 7716, 7716 }, - { 7718, 7718 }, - { 7720, 7720 }, - { 7722, 7722 }, - { 7724, 7724 }, - { 7726, 7726 }, - { 7728, 7728 }, - { 7730, 7730 }, - { 7732, 7732 }, - { 7734, 7734 }, - { 7736, 7736 }, - { 7738, 7738 }, - { 7740, 7740 }, - { 7742, 7742 }, - { 7744, 7744 }, - { 7746, 7746 }, - { 7748, 7748 }, - { 7750, 7750 }, - { 7752, 7752 }, - { 7754, 7754 }, - { 7756, 7756 }, - { 7758, 7758 }, - { 7760, 7760 }, - { 7762, 7762 }, - { 7764, 7764 }, - { 7766, 7766 }, - { 7768, 7768 }, - { 7770, 7770 }, - { 7772, 7772 }, - { 7774, 7774 }, - { 7776, 7776 }, - { 7778, 7778 }, - { 7780, 7780 }, - { 7782, 7782 }, - { 7784, 7784 }, - { 7786, 7786 }, - { 7788, 7788 }, - { 7790, 7790 }, - { 7792, 7792 }, - { 7794, 7794 }, - { 7796, 7796 }, - { 7798, 7798 }, - { 7800, 7800 }, - { 7802, 7802 }, - { 7804, 7804 }, - { 7806, 7806 }, - { 7808, 7808 }, - { 7810, 7810 }, - { 7812, 7812 }, - { 7814, 7814 }, - { 7816, 7816 }, - { 7818, 7818 }, - { 7820, 7820 }, - { 7822, 7822 }, - { 7824, 7824 }, - { 7826, 7826 }, - { 7828, 7828 }, - { 7838, 7838 }, - { 7840, 7840 }, - { 7842, 7842 }, - { 7844, 7844 }, - { 7846, 7846 }, - { 7848, 7848 }, - { 7850, 7850 }, - { 7852, 7852 }, - { 7854, 7854 }, - { 7856, 7856 }, - { 7858, 7858 }, - { 7860, 7860 }, - { 7862, 7862 }, - { 7864, 7864 }, - { 7866, 7866 }, - { 7868, 7868 }, - { 7870, 7870 }, - { 7872, 7872 }, - { 7874, 7874 }, - { 7876, 7876 }, - { 7878, 7878 }, - { 7880, 7880 }, - { 7882, 7882 }, - { 7884, 7884 }, - { 7886, 7886 }, - { 7888, 7888 }, - { 7890, 7890 }, - { 7892, 7892 }, - { 7894, 7894 }, - { 7896, 7896 }, - { 7898, 7898 }, - { 7900, 7900 }, - { 7902, 7902 }, - { 7904, 7904 }, - { 7906, 7906 }, - { 7908, 7908 }, - { 7910, 7910 }, - { 7912, 7912 }, - { 7914, 7914 }, - { 7916, 7916 }, - { 7918, 7918 }, - { 7920, 7920 }, - { 7922, 7922 }, - { 7924, 7924 }, - { 7926, 7926 }, - { 7928, 7928 }, - { 7930, 7930 }, - { 7932, 7932 }, - { 7934, 7934 }, - { 7944, 7951 }, - { 7960, 7965 }, - { 7976, 7983 }, - { 7992, 7999 }, - { 8008, 8013 }, - { 8025, 8025 }, - { 8027, 8027 }, - { 8029, 8029 }, - { 8031, 8031 }, - { 8040, 8047 }, - { 8120, 8123 }, - { 8136, 8139 }, - { 8152, 8155 }, - { 8168, 8172 }, - { 8184, 8187 }, - { 8450, 8450 }, - { 8455, 8455 }, - { 8459, 8461 }, - { 8464, 8466 }, - { 8469, 8469 }, - { 8473, 8477 }, - { 8484, 8484 }, - { 8486, 8486 }, - { 8488, 8488 }, - { 8490, 8493 }, - { 8496, 8499 }, - { 8510, 8511 }, - { 8517, 8517 }, - { 8579, 8579 }, - { 11264, 11310 }, - { 11360, 11360 }, - { 11362, 11364 }, - { 11367, 11367 }, - { 11369, 11369 }, - { 11371, 11371 }, - { 11373, 11376 }, - { 11378, 11378 }, - { 11381, 11381 }, - { 11390, 11392 }, - { 11394, 11394 }, - { 11396, 11396 }, - { 11398, 11398 }, - { 11400, 11400 }, - { 11402, 11402 }, - { 11404, 11404 }, - { 11406, 11406 }, - { 11408, 11408 }, - { 11410, 11410 }, - { 11412, 11412 }, - { 11414, 11414 }, - { 11416, 11416 }, - { 11418, 11418 }, - { 11420, 11420 }, - { 11422, 11422 }, - { 11424, 11424 }, - { 11426, 11426 }, - { 11428, 11428 }, - { 11430, 11430 }, - { 11432, 11432 }, - { 11434, 11434 }, - { 11436, 11436 }, - { 11438, 11438 }, - { 11440, 11440 }, - { 11442, 11442 }, - { 11444, 11444 }, - { 11446, 11446 }, - { 11448, 11448 }, - { 11450, 11450 }, - { 11452, 11452 }, - { 11454, 11454 }, - { 11456, 11456 }, - { 11458, 11458 }, - { 11460, 11460 }, - { 11462, 11462 }, - { 11464, 11464 }, - { 11466, 11466 }, - { 11468, 11468 }, - { 11470, 11470 }, - { 11472, 11472 }, - { 11474, 11474 }, - { 11476, 11476 }, - { 11478, 11478 }, - { 11480, 11480 }, - { 11482, 11482 }, - { 11484, 11484 }, - { 11486, 11486 }, - { 11488, 11488 }, - { 11490, 11490 }, - { 11499, 11499 }, - { 11501, 11501 }, - { 11506, 11506 }, - { 42560, 42560 }, - { 42562, 42562 }, - { 42564, 42564 }, - { 42566, 42566 }, - { 42568, 42568 }, - { 42570, 42570 }, - { 42572, 42572 }, - { 42574, 42574 }, - { 42576, 42576 }, - { 42578, 42578 }, - { 42580, 42580 }, - { 42582, 42582 }, - { 42584, 42584 }, - { 42586, 42586 }, - { 42588, 42588 }, - { 42590, 42590 }, - { 42592, 42592 }, - { 42594, 42594 }, - { 42596, 42596 }, - { 42598, 42598 }, - { 42600, 42600 }, - { 42602, 42602 }, - { 42604, 42604 }, - { 42624, 42624 }, - { 42626, 42626 }, - { 42628, 42628 }, - { 42630, 42630 }, - { 42632, 42632 }, - { 42634, 42634 }, - { 42636, 42636 }, - { 42638, 42638 }, - { 42640, 42640 }, - { 42642, 42642 }, - { 42644, 42644 }, - { 42646, 42646 }, - { 42648, 42648 }, - { 42650, 42650 }, - { 42786, 42786 }, - { 42788, 42788 }, - { 42790, 42790 }, - { 42792, 42792 }, - { 42794, 42794 }, - { 42796, 42796 }, - { 42798, 42798 }, - { 42802, 42802 }, - { 42804, 42804 }, - { 42806, 42806 }, - { 42808, 42808 }, - { 42810, 42810 }, - { 42812, 42812 }, - { 42814, 42814 }, - { 42816, 42816 }, - { 42818, 42818 }, - { 42820, 42820 }, - { 42822, 42822 }, - { 42824, 42824 }, - { 42826, 42826 }, - { 42828, 42828 }, - { 42830, 42830 }, - { 42832, 42832 }, - { 42834, 42834 }, - { 42836, 42836 }, - { 42838, 42838 }, - { 42840, 42840 }, - { 42842, 42842 }, - { 42844, 42844 }, - { 42846, 42846 }, - { 42848, 42848 }, - { 42850, 42850 }, - { 42852, 42852 }, - { 42854, 42854 }, - { 42856, 42856 }, - { 42858, 42858 }, - { 42860, 42860 }, - { 42862, 42862 }, - { 42873, 42873 }, - { 42875, 42875 }, - { 42877, 42878 }, - { 42880, 42880 }, - { 42882, 42882 }, - { 42884, 42884 }, - { 42886, 42886 }, - { 42891, 42891 }, - { 42893, 42893 }, - { 42896, 42896 }, - { 42898, 42898 }, - { 42902, 42902 }, - { 42904, 42904 }, - { 42906, 42906 }, - { 42908, 42908 }, - { 42910, 42910 }, - { 42912, 42912 }, - { 42914, 42914 }, - { 42916, 42916 }, - { 42918, 42918 }, - { 42920, 42920 }, - { 42922, 42926 }, - { 42928, 42932 }, - { 42934, 42934 }, - { 42936, 42936 }, - { 65313, 65338 }, -}; -static const URange32 Lu_range32[] = { - { 66560, 66599 }, - { 66736, 66771 }, - { 68736, 68786 }, - { 71840, 71871 }, - { 93760, 93791 }, - { 119808, 119833 }, - { 119860, 119885 }, - { 119912, 119937 }, - { 119964, 119964 }, - { 119966, 119967 }, - { 119970, 119970 }, - { 119973, 119974 }, - { 119977, 119980 }, - { 119982, 119989 }, - { 120016, 120041 }, - { 120068, 120069 }, - { 120071, 120074 }, - { 120077, 120084 }, - { 120086, 120092 }, - { 120120, 120121 }, - { 120123, 120126 }, - { 120128, 120132 }, - { 120134, 120134 }, - { 120138, 120144 }, - { 120172, 120197 }, - { 120224, 120249 }, - { 120276, 120301 }, - { 120328, 120353 }, - { 120380, 120405 }, - { 120432, 120457 }, - { 120488, 120512 }, - { 120546, 120570 }, - { 120604, 120628 }, - { 120662, 120686 }, - { 120720, 120744 }, - { 120778, 120778 }, - { 125184, 125217 }, -}; -static const URange16 Pf_range16[] = { - { 187, 187 }, - { 8217, 8217 }, - { 8221, 8221 }, - { 8250, 8250 }, - { 11779, 11779 }, - { 11781, 11781 }, - { 11786, 11786 }, - { 11789, 11789 }, - { 11805, 11805 }, - { 11809, 11809 }, -}; -static const URange16 Pd_range16[] = { - { 45, 45 }, - { 1418, 1418 }, - { 1470, 1470 }, - { 5120, 5120 }, - { 6150, 6150 }, - { 8208, 8213 }, - { 11799, 11799 }, - { 11802, 11802 }, - { 11834, 11835 }, - { 11840, 11840 }, - { 12316, 12316 }, - { 12336, 12336 }, - { 12448, 12448 }, - { 65073, 65074 }, - { 65112, 65112 }, - { 65123, 65123 }, - { 65293, 65293 }, -}; -static const URange16 Pe_range16[] = { - { 41, 41 }, - { 93, 93 }, - { 125, 125 }, - { 3899, 3899 }, - { 3901, 3901 }, - { 5788, 5788 }, - { 8262, 8262 }, - { 8318, 8318 }, - { 8334, 8334 }, - { 8969, 8969 }, - { 8971, 8971 }, - { 9002, 9002 }, - { 10089, 10089 }, - { 10091, 10091 }, - { 10093, 10093 }, - { 10095, 10095 }, - { 10097, 10097 }, - { 10099, 10099 }, - { 10101, 10101 }, - { 10182, 10182 }, - { 10215, 10215 }, - { 10217, 10217 }, - { 10219, 10219 }, - { 10221, 10221 }, - { 10223, 10223 }, - { 10628, 10628 }, - { 10630, 10630 }, - { 10632, 10632 }, - { 10634, 10634 }, - { 10636, 10636 }, - { 10638, 10638 }, - { 10640, 10640 }, - { 10642, 10642 }, - { 10644, 10644 }, - { 10646, 10646 }, - { 10648, 10648 }, - { 10713, 10713 }, - { 10715, 10715 }, - { 10749, 10749 }, - { 11811, 11811 }, - { 11813, 11813 }, - { 11815, 11815 }, - { 11817, 11817 }, - { 12297, 12297 }, - { 12299, 12299 }, - { 12301, 12301 }, - { 12303, 12303 }, - { 12305, 12305 }, - { 12309, 12309 }, - { 12311, 12311 }, - { 12313, 12313 }, - { 12315, 12315 }, - { 12318, 12319 }, - { 64830, 64830 }, - { 65048, 65048 }, - { 65078, 65078 }, - { 65080, 65080 }, - { 65082, 65082 }, - { 65084, 65084 }, - { 65086, 65086 }, - { 65088, 65088 }, - { 65090, 65090 }, - { 65092, 65092 }, - { 65096, 65096 }, - { 65114, 65114 }, - { 65116, 65116 }, - { 65118, 65118 }, - { 65289, 65289 }, - { 65341, 65341 }, - { 65373, 65373 }, - { 65376, 65376 }, - { 65379, 65379 }, -}; -static const URange16 Pi_range16[] = { - { 171, 171 }, - { 8216, 8216 }, - { 8219, 8220 }, - { 8223, 8223 }, - { 8249, 8249 }, - { 11778, 11778 }, - { 11780, 11780 }, - { 11785, 11785 }, - { 11788, 11788 }, - { 11804, 11804 }, - { 11808, 11808 }, -}; -static const URange16 Po_range16[] = { - { 33, 35 }, - { 37, 39 }, - { 42, 42 }, - { 44, 44 }, - { 46, 47 }, - { 58, 59 }, - { 63, 64 }, - { 92, 92 }, - { 161, 161 }, - { 167, 167 }, - { 182, 183 }, - { 191, 191 }, - { 894, 894 }, - { 903, 903 }, - { 1370, 1375 }, - { 1417, 1417 }, - { 1472, 1472 }, - { 1475, 1475 }, - { 1478, 1478 }, - { 1523, 1524 }, - { 1545, 1546 }, - { 1548, 1549 }, - { 1563, 1563 }, - { 1566, 1567 }, - { 1642, 1645 }, - { 1748, 1748 }, - { 1792, 1805 }, - { 2039, 2041 }, - { 2096, 2110 }, - { 2142, 2142 }, - { 2404, 2405 }, - { 2416, 2416 }, - { 2557, 2557 }, - { 2678, 2678 }, - { 2800, 2800 }, - { 3204, 3204 }, - { 3572, 3572 }, - { 3663, 3663 }, - { 3674, 3675 }, - { 3844, 3858 }, - { 3860, 3860 }, - { 3973, 3973 }, - { 4048, 4052 }, - { 4057, 4058 }, - { 4170, 4175 }, - { 4347, 4347 }, - { 4960, 4968 }, - { 5741, 5742 }, - { 5867, 5869 }, - { 5941, 5942 }, - { 6100, 6102 }, - { 6104, 6106 }, - { 6144, 6149 }, - { 6151, 6154 }, - { 6468, 6469 }, - { 6686, 6687 }, - { 6816, 6822 }, - { 6824, 6829 }, - { 7002, 7008 }, - { 7164, 7167 }, - { 7227, 7231 }, - { 7294, 7295 }, - { 7360, 7367 }, - { 7379, 7379 }, - { 8214, 8215 }, - { 8224, 8231 }, - { 8240, 8248 }, - { 8251, 8254 }, - { 8257, 8259 }, - { 8263, 8273 }, - { 8275, 8275 }, - { 8277, 8286 }, - { 11513, 11516 }, - { 11518, 11519 }, - { 11632, 11632 }, - { 11776, 11777 }, - { 11782, 11784 }, - { 11787, 11787 }, - { 11790, 11798 }, - { 11800, 11801 }, - { 11803, 11803 }, - { 11806, 11807 }, - { 11818, 11822 }, - { 11824, 11833 }, - { 11836, 11839 }, - { 11841, 11841 }, - { 11843, 11854 }, - { 12289, 12291 }, - { 12349, 12349 }, - { 12539, 12539 }, - { 42238, 42239 }, - { 42509, 42511 }, - { 42611, 42611 }, - { 42622, 42622 }, - { 42738, 42743 }, - { 43124, 43127 }, - { 43214, 43215 }, - { 43256, 43258 }, - { 43260, 43260 }, - { 43310, 43311 }, - { 43359, 43359 }, - { 43457, 43469 }, - { 43486, 43487 }, - { 43612, 43615 }, - { 43742, 43743 }, - { 43760, 43761 }, - { 44011, 44011 }, - { 65040, 65046 }, - { 65049, 65049 }, - { 65072, 65072 }, - { 65093, 65094 }, - { 65097, 65100 }, - { 65104, 65106 }, - { 65108, 65111 }, - { 65119, 65121 }, - { 65128, 65128 }, - { 65130, 65131 }, - { 65281, 65283 }, - { 65285, 65287 }, - { 65290, 65290 }, - { 65292, 65292 }, - { 65294, 65295 }, - { 65306, 65307 }, - { 65311, 65312 }, - { 65340, 65340 }, - { 65377, 65377 }, - { 65380, 65381 }, -}; -static const URange32 Po_range32[] = { - { 65792, 65794 }, - { 66463, 66463 }, - { 66512, 66512 }, - { 66927, 66927 }, - { 67671, 67671 }, - { 67871, 67871 }, - { 67903, 67903 }, - { 68176, 68184 }, - { 68223, 68223 }, - { 68336, 68342 }, - { 68409, 68415 }, - { 68505, 68508 }, - { 69461, 69465 }, - { 69703, 69709 }, - { 69819, 69820 }, - { 69822, 69825 }, - { 69952, 69955 }, - { 70004, 70005 }, - { 70085, 70088 }, - { 70093, 70093 }, - { 70107, 70107 }, - { 70109, 70111 }, - { 70200, 70205 }, - { 70313, 70313 }, - { 70731, 70735 }, - { 70747, 70747 }, - { 70749, 70749 }, - { 70854, 70854 }, - { 71105, 71127 }, - { 71233, 71235 }, - { 71264, 71276 }, - { 71484, 71486 }, - { 71739, 71739 }, - { 72255, 72262 }, - { 72346, 72348 }, - { 72350, 72354 }, - { 72769, 72773 }, - { 72816, 72817 }, - { 73463, 73464 }, - { 74864, 74868 }, - { 92782, 92783 }, - { 92917, 92917 }, - { 92983, 92987 }, - { 92996, 92996 }, - { 93847, 93850 }, - { 113823, 113823 }, - { 121479, 121483 }, - { 125278, 125279 }, -}; -static const URange16 Me_range16[] = { - { 1160, 1161 }, - { 6846, 6846 }, - { 8413, 8416 }, - { 8418, 8420 }, - { 42608, 42610 }, -}; -static const URange16 C_range16[] = { - { 0, 31 }, - { 127, 159 }, - { 173, 173 }, - { 1536, 1541 }, - { 1564, 1564 }, - { 1757, 1757 }, - { 1807, 1807 }, - { 2274, 2274 }, - { 6158, 6158 }, - { 8203, 8207 }, - { 8234, 8238 }, - { 8288, 8292 }, - { 8294, 8303 }, - { 55296, 63743 }, - { 65279, 65279 }, - { 65529, 65531 }, -}; -static const URange32 C_range32[] = { - { 69821, 69821 }, - { 69837, 69837 }, - { 113824, 113827 }, - { 119155, 119162 }, - { 917505, 917505 }, - { 917536, 917631 }, - { 983040, 1048573 }, - { 1048576, 1114109 }, -}; -static const URange16 Mc_range16[] = { - { 2307, 2307 }, - { 2363, 2363 }, - { 2366, 2368 }, - { 2377, 2380 }, - { 2382, 2383 }, - { 2434, 2435 }, - { 2494, 2496 }, - { 2503, 2504 }, - { 2507, 2508 }, - { 2519, 2519 }, - { 2563, 2563 }, - { 2622, 2624 }, - { 2691, 2691 }, - { 2750, 2752 }, - { 2761, 2761 }, - { 2763, 2764 }, - { 2818, 2819 }, - { 2878, 2878 }, - { 2880, 2880 }, - { 2887, 2888 }, - { 2891, 2892 }, - { 2903, 2903 }, - { 3006, 3007 }, - { 3009, 3010 }, - { 3014, 3016 }, - { 3018, 3020 }, - { 3031, 3031 }, - { 3073, 3075 }, - { 3137, 3140 }, - { 3202, 3203 }, - { 3262, 3262 }, - { 3264, 3268 }, - { 3271, 3272 }, - { 3274, 3275 }, - { 3285, 3286 }, - { 3330, 3331 }, - { 3390, 3392 }, - { 3398, 3400 }, - { 3402, 3404 }, - { 3415, 3415 }, - { 3458, 3459 }, - { 3535, 3537 }, - { 3544, 3551 }, - { 3570, 3571 }, - { 3902, 3903 }, - { 3967, 3967 }, - { 4139, 4140 }, - { 4145, 4145 }, - { 4152, 4152 }, - { 4155, 4156 }, - { 4182, 4183 }, - { 4194, 4196 }, - { 4199, 4205 }, - { 4227, 4228 }, - { 4231, 4236 }, - { 4239, 4239 }, - { 4250, 4252 }, - { 6070, 6070 }, - { 6078, 6085 }, - { 6087, 6088 }, - { 6435, 6438 }, - { 6441, 6443 }, - { 6448, 6449 }, - { 6451, 6456 }, - { 6681, 6682 }, - { 6741, 6741 }, - { 6743, 6743 }, - { 6753, 6753 }, - { 6755, 6756 }, - { 6765, 6770 }, - { 6916, 6916 }, - { 6965, 6965 }, - { 6971, 6971 }, - { 6973, 6977 }, - { 6979, 6980 }, - { 7042, 7042 }, - { 7073, 7073 }, - { 7078, 7079 }, - { 7082, 7082 }, - { 7143, 7143 }, - { 7146, 7148 }, - { 7150, 7150 }, - { 7154, 7155 }, - { 7204, 7211 }, - { 7220, 7221 }, - { 7393, 7393 }, - { 7410, 7411 }, - { 7415, 7415 }, - { 12334, 12335 }, - { 43043, 43044 }, - { 43047, 43047 }, - { 43136, 43137 }, - { 43188, 43203 }, - { 43346, 43347 }, - { 43395, 43395 }, - { 43444, 43445 }, - { 43450, 43451 }, - { 43453, 43456 }, - { 43567, 43568 }, - { 43571, 43572 }, - { 43597, 43597 }, - { 43643, 43643 }, - { 43645, 43645 }, - { 43755, 43755 }, - { 43758, 43759 }, - { 43765, 43765 }, - { 44003, 44004 }, - { 44006, 44007 }, - { 44009, 44010 }, - { 44012, 44012 }, -}; -static const URange32 Mc_range32[] = { - { 69632, 69632 }, - { 69634, 69634 }, - { 69762, 69762 }, - { 69808, 69810 }, - { 69815, 69816 }, - { 69932, 69932 }, - { 69957, 69958 }, - { 70018, 70018 }, - { 70067, 70069 }, - { 70079, 70080 }, - { 70188, 70190 }, - { 70194, 70195 }, - { 70197, 70197 }, - { 70368, 70370 }, - { 70402, 70403 }, - { 70462, 70463 }, - { 70465, 70468 }, - { 70471, 70472 }, - { 70475, 70477 }, - { 70487, 70487 }, - { 70498, 70499 }, - { 70709, 70711 }, - { 70720, 70721 }, - { 70725, 70725 }, - { 70832, 70834 }, - { 70841, 70841 }, - { 70843, 70846 }, - { 70849, 70849 }, - { 71087, 71089 }, - { 71096, 71099 }, - { 71102, 71102 }, - { 71216, 71218 }, - { 71227, 71228 }, - { 71230, 71230 }, - { 71340, 71340 }, - { 71342, 71343 }, - { 71350, 71350 }, - { 71456, 71457 }, - { 71462, 71462 }, - { 71724, 71726 }, - { 71736, 71736 }, - { 72249, 72249 }, - { 72279, 72280 }, - { 72343, 72343 }, - { 72751, 72751 }, - { 72766, 72766 }, - { 72873, 72873 }, - { 72881, 72881 }, - { 72884, 72884 }, - { 73098, 73102 }, - { 73107, 73108 }, - { 73110, 73110 }, - { 73461, 73462 }, - { 94033, 94078 }, - { 119141, 119142 }, - { 119149, 119154 }, -}; -static const URange16 Mn_range16[] = { - { 768, 879 }, - { 1155, 1159 }, - { 1425, 1469 }, - { 1471, 1471 }, - { 1473, 1474 }, - { 1476, 1477 }, - { 1479, 1479 }, - { 1552, 1562 }, - { 1611, 1631 }, - { 1648, 1648 }, - { 1750, 1756 }, - { 1759, 1764 }, - { 1767, 1768 }, - { 1770, 1773 }, - { 1809, 1809 }, - { 1840, 1866 }, - { 1958, 1968 }, - { 2027, 2035 }, - { 2045, 2045 }, - { 2070, 2073 }, - { 2075, 2083 }, - { 2085, 2087 }, - { 2089, 2093 }, - { 2137, 2139 }, - { 2259, 2273 }, - { 2275, 2306 }, - { 2362, 2362 }, - { 2364, 2364 }, - { 2369, 2376 }, - { 2381, 2381 }, - { 2385, 2391 }, - { 2402, 2403 }, - { 2433, 2433 }, - { 2492, 2492 }, - { 2497, 2500 }, - { 2509, 2509 }, - { 2530, 2531 }, - { 2558, 2558 }, - { 2561, 2562 }, - { 2620, 2620 }, - { 2625, 2626 }, - { 2631, 2632 }, - { 2635, 2637 }, - { 2641, 2641 }, - { 2672, 2673 }, - { 2677, 2677 }, - { 2689, 2690 }, - { 2748, 2748 }, - { 2753, 2757 }, - { 2759, 2760 }, - { 2765, 2765 }, - { 2786, 2787 }, - { 2810, 2815 }, - { 2817, 2817 }, - { 2876, 2876 }, - { 2879, 2879 }, - { 2881, 2884 }, - { 2893, 2893 }, - { 2902, 2902 }, - { 2914, 2915 }, - { 2946, 2946 }, - { 3008, 3008 }, - { 3021, 3021 }, - { 3072, 3072 }, - { 3076, 3076 }, - { 3134, 3136 }, - { 3142, 3144 }, - { 3146, 3149 }, - { 3157, 3158 }, - { 3170, 3171 }, - { 3201, 3201 }, - { 3260, 3260 }, - { 3263, 3263 }, - { 3270, 3270 }, - { 3276, 3277 }, - { 3298, 3299 }, - { 3328, 3329 }, - { 3387, 3388 }, - { 3393, 3396 }, - { 3405, 3405 }, - { 3426, 3427 }, - { 3530, 3530 }, - { 3538, 3540 }, - { 3542, 3542 }, - { 3633, 3633 }, - { 3636, 3642 }, - { 3655, 3662 }, - { 3761, 3761 }, - { 3764, 3769 }, - { 3771, 3772 }, - { 3784, 3789 }, - { 3864, 3865 }, - { 3893, 3893 }, - { 3895, 3895 }, - { 3897, 3897 }, - { 3953, 3966 }, - { 3968, 3972 }, - { 3974, 3975 }, - { 3981, 3991 }, - { 3993, 4028 }, - { 4038, 4038 }, - { 4141, 4144 }, - { 4146, 4151 }, - { 4153, 4154 }, - { 4157, 4158 }, - { 4184, 4185 }, - { 4190, 4192 }, - { 4209, 4212 }, - { 4226, 4226 }, - { 4229, 4230 }, - { 4237, 4237 }, - { 4253, 4253 }, - { 4957, 4959 }, - { 5906, 5908 }, - { 5938, 5940 }, - { 5970, 5971 }, - { 6002, 6003 }, - { 6068, 6069 }, - { 6071, 6077 }, - { 6086, 6086 }, - { 6089, 6099 }, - { 6109, 6109 }, - { 6155, 6157 }, - { 6277, 6278 }, - { 6313, 6313 }, - { 6432, 6434 }, - { 6439, 6440 }, - { 6450, 6450 }, - { 6457, 6459 }, - { 6679, 6680 }, - { 6683, 6683 }, - { 6742, 6742 }, - { 6744, 6750 }, - { 6752, 6752 }, - { 6754, 6754 }, - { 6757, 6764 }, - { 6771, 6780 }, - { 6783, 6783 }, - { 6832, 6845 }, - { 6912, 6915 }, - { 6964, 6964 }, - { 6966, 6970 }, - { 6972, 6972 }, - { 6978, 6978 }, - { 7019, 7027 }, - { 7040, 7041 }, - { 7074, 7077 }, - { 7080, 7081 }, - { 7083, 7085 }, - { 7142, 7142 }, - { 7144, 7145 }, - { 7149, 7149 }, - { 7151, 7153 }, - { 7212, 7219 }, - { 7222, 7223 }, - { 7376, 7378 }, - { 7380, 7392 }, - { 7394, 7400 }, - { 7405, 7405 }, - { 7412, 7412 }, - { 7416, 7417 }, - { 7616, 7673 }, - { 7675, 7679 }, - { 8400, 8412 }, - { 8417, 8417 }, - { 8421, 8432 }, - { 11503, 11505 }, - { 11647, 11647 }, - { 11744, 11775 }, - { 12330, 12333 }, - { 12441, 12442 }, - { 42607, 42607 }, - { 42612, 42621 }, - { 42654, 42655 }, - { 42736, 42737 }, - { 43010, 43010 }, - { 43014, 43014 }, - { 43019, 43019 }, - { 43045, 43046 }, - { 43204, 43205 }, - { 43232, 43249 }, - { 43263, 43263 }, - { 43302, 43309 }, - { 43335, 43345 }, - { 43392, 43394 }, - { 43443, 43443 }, - { 43446, 43449 }, - { 43452, 43452 }, - { 43493, 43493 }, - { 43561, 43566 }, - { 43569, 43570 }, - { 43573, 43574 }, - { 43587, 43587 }, - { 43596, 43596 }, - { 43644, 43644 }, - { 43696, 43696 }, - { 43698, 43700 }, - { 43703, 43704 }, - { 43710, 43711 }, - { 43713, 43713 }, - { 43756, 43757 }, - { 43766, 43766 }, - { 44005, 44005 }, - { 44008, 44008 }, - { 44013, 44013 }, - { 64286, 64286 }, - { 65024, 65039 }, - { 65056, 65071 }, -}; -static const URange32 Mn_range32[] = { - { 66045, 66045 }, - { 66272, 66272 }, - { 66422, 66426 }, - { 68097, 68099 }, - { 68101, 68102 }, - { 68108, 68111 }, - { 68152, 68154 }, - { 68159, 68159 }, - { 68325, 68326 }, - { 68900, 68903 }, - { 69446, 69456 }, - { 69633, 69633 }, - { 69688, 69702 }, - { 69759, 69761 }, - { 69811, 69814 }, - { 69817, 69818 }, - { 69888, 69890 }, - { 69927, 69931 }, - { 69933, 69940 }, - { 70003, 70003 }, - { 70016, 70017 }, - { 70070, 70078 }, - { 70089, 70092 }, - { 70191, 70193 }, - { 70196, 70196 }, - { 70198, 70199 }, - { 70206, 70206 }, - { 70367, 70367 }, - { 70371, 70378 }, - { 70400, 70401 }, - { 70459, 70460 }, - { 70464, 70464 }, - { 70502, 70508 }, - { 70512, 70516 }, - { 70712, 70719 }, - { 70722, 70724 }, - { 70726, 70726 }, - { 70750, 70750 }, - { 70835, 70840 }, - { 70842, 70842 }, - { 70847, 70848 }, - { 70850, 70851 }, - { 71090, 71093 }, - { 71100, 71101 }, - { 71103, 71104 }, - { 71132, 71133 }, - { 71219, 71226 }, - { 71229, 71229 }, - { 71231, 71232 }, - { 71339, 71339 }, - { 71341, 71341 }, - { 71344, 71349 }, - { 71351, 71351 }, - { 71453, 71455 }, - { 71458, 71461 }, - { 71463, 71467 }, - { 71727, 71735 }, - { 71737, 71738 }, - { 72193, 72202 }, - { 72243, 72248 }, - { 72251, 72254 }, - { 72263, 72263 }, - { 72273, 72278 }, - { 72281, 72283 }, - { 72330, 72342 }, - { 72344, 72345 }, - { 72752, 72758 }, - { 72760, 72765 }, - { 72767, 72767 }, - { 72850, 72871 }, - { 72874, 72880 }, - { 72882, 72883 }, - { 72885, 72886 }, - { 73009, 73014 }, - { 73018, 73018 }, - { 73020, 73021 }, - { 73023, 73029 }, - { 73031, 73031 }, - { 73104, 73105 }, - { 73109, 73109 }, - { 73111, 73111 }, - { 73459, 73460 }, - { 92912, 92916 }, - { 92976, 92982 }, - { 94095, 94098 }, - { 113821, 113822 }, - { 119143, 119145 }, - { 119163, 119170 }, - { 119173, 119179 }, - { 119210, 119213 }, - { 119362, 119364 }, - { 121344, 121398 }, - { 121403, 121452 }, - { 121461, 121461 }, - { 121476, 121476 }, - { 121499, 121503 }, - { 121505, 121519 }, - { 122880, 122886 }, - { 122888, 122904 }, - { 122907, 122913 }, - { 122915, 122916 }, - { 122918, 122922 }, - { 125136, 125142 }, - { 125252, 125258 }, - { 917760, 917999 }, -}; -static const URange16 M_range16[] = { - { 768, 879 }, - { 1155, 1161 }, - { 1425, 1469 }, - { 1471, 1471 }, - { 1473, 1474 }, - { 1476, 1477 }, - { 1479, 1479 }, - { 1552, 1562 }, - { 1611, 1631 }, - { 1648, 1648 }, - { 1750, 1756 }, - { 1759, 1764 }, - { 1767, 1768 }, - { 1770, 1773 }, - { 1809, 1809 }, - { 1840, 1866 }, - { 1958, 1968 }, - { 2027, 2035 }, - { 2045, 2045 }, - { 2070, 2073 }, - { 2075, 2083 }, - { 2085, 2087 }, - { 2089, 2093 }, - { 2137, 2139 }, - { 2259, 2273 }, - { 2275, 2307 }, - { 2362, 2364 }, - { 2366, 2383 }, - { 2385, 2391 }, - { 2402, 2403 }, - { 2433, 2435 }, - { 2492, 2492 }, - { 2494, 2500 }, - { 2503, 2504 }, - { 2507, 2509 }, - { 2519, 2519 }, - { 2530, 2531 }, - { 2558, 2558 }, - { 2561, 2563 }, - { 2620, 2620 }, - { 2622, 2626 }, - { 2631, 2632 }, - { 2635, 2637 }, - { 2641, 2641 }, - { 2672, 2673 }, - { 2677, 2677 }, - { 2689, 2691 }, - { 2748, 2748 }, - { 2750, 2757 }, - { 2759, 2761 }, - { 2763, 2765 }, - { 2786, 2787 }, - { 2810, 2815 }, - { 2817, 2819 }, - { 2876, 2876 }, - { 2878, 2884 }, - { 2887, 2888 }, - { 2891, 2893 }, - { 2902, 2903 }, - { 2914, 2915 }, - { 2946, 2946 }, - { 3006, 3010 }, - { 3014, 3016 }, - { 3018, 3021 }, - { 3031, 3031 }, - { 3072, 3076 }, - { 3134, 3140 }, - { 3142, 3144 }, - { 3146, 3149 }, - { 3157, 3158 }, - { 3170, 3171 }, - { 3201, 3203 }, - { 3260, 3260 }, - { 3262, 3268 }, - { 3270, 3272 }, - { 3274, 3277 }, - { 3285, 3286 }, - { 3298, 3299 }, - { 3328, 3331 }, - { 3387, 3388 }, - { 3390, 3396 }, - { 3398, 3400 }, - { 3402, 3405 }, - { 3415, 3415 }, - { 3426, 3427 }, - { 3458, 3459 }, - { 3530, 3530 }, - { 3535, 3540 }, - { 3542, 3542 }, - { 3544, 3551 }, - { 3570, 3571 }, - { 3633, 3633 }, - { 3636, 3642 }, - { 3655, 3662 }, - { 3761, 3761 }, - { 3764, 3769 }, - { 3771, 3772 }, - { 3784, 3789 }, - { 3864, 3865 }, - { 3893, 3893 }, - { 3895, 3895 }, - { 3897, 3897 }, - { 3902, 3903 }, - { 3953, 3972 }, - { 3974, 3975 }, - { 3981, 3991 }, - { 3993, 4028 }, - { 4038, 4038 }, - { 4139, 4158 }, - { 4182, 4185 }, - { 4190, 4192 }, - { 4194, 4196 }, - { 4199, 4205 }, - { 4209, 4212 }, - { 4226, 4237 }, - { 4239, 4239 }, - { 4250, 4253 }, - { 4957, 4959 }, - { 5906, 5908 }, - { 5938, 5940 }, - { 5970, 5971 }, - { 6002, 6003 }, - { 6068, 6099 }, - { 6109, 6109 }, - { 6155, 6157 }, - { 6277, 6278 }, - { 6313, 6313 }, - { 6432, 6443 }, - { 6448, 6459 }, - { 6679, 6683 }, - { 6741, 6750 }, - { 6752, 6780 }, - { 6783, 6783 }, - { 6832, 6846 }, - { 6912, 6916 }, - { 6964, 6980 }, - { 7019, 7027 }, - { 7040, 7042 }, - { 7073, 7085 }, - { 7142, 7155 }, - { 7204, 7223 }, - { 7376, 7378 }, - { 7380, 7400 }, - { 7405, 7405 }, - { 7410, 7412 }, - { 7415, 7417 }, - { 7616, 7673 }, - { 7675, 7679 }, - { 8400, 8432 }, - { 11503, 11505 }, - { 11647, 11647 }, - { 11744, 11775 }, - { 12330, 12335 }, - { 12441, 12442 }, - { 42607, 42610 }, - { 42612, 42621 }, - { 42654, 42655 }, - { 42736, 42737 }, - { 43010, 43010 }, - { 43014, 43014 }, - { 43019, 43019 }, - { 43043, 43047 }, - { 43136, 43137 }, - { 43188, 43205 }, - { 43232, 43249 }, - { 43263, 43263 }, - { 43302, 43309 }, - { 43335, 43347 }, - { 43392, 43395 }, - { 43443, 43456 }, - { 43493, 43493 }, - { 43561, 43574 }, - { 43587, 43587 }, - { 43596, 43597 }, - { 43643, 43645 }, - { 43696, 43696 }, - { 43698, 43700 }, - { 43703, 43704 }, - { 43710, 43711 }, - { 43713, 43713 }, - { 43755, 43759 }, - { 43765, 43766 }, - { 44003, 44010 }, - { 44012, 44013 }, - { 64286, 64286 }, - { 65024, 65039 }, - { 65056, 65071 }, -}; -static const URange32 M_range32[] = { - { 66045, 66045 }, - { 66272, 66272 }, - { 66422, 66426 }, - { 68097, 68099 }, - { 68101, 68102 }, - { 68108, 68111 }, - { 68152, 68154 }, - { 68159, 68159 }, - { 68325, 68326 }, - { 68900, 68903 }, - { 69446, 69456 }, - { 69632, 69634 }, - { 69688, 69702 }, - { 69759, 69762 }, - { 69808, 69818 }, - { 69888, 69890 }, - { 69927, 69940 }, - { 69957, 69958 }, - { 70003, 70003 }, - { 70016, 70018 }, - { 70067, 70080 }, - { 70089, 70092 }, - { 70188, 70199 }, - { 70206, 70206 }, - { 70367, 70378 }, - { 70400, 70403 }, - { 70459, 70460 }, - { 70462, 70468 }, - { 70471, 70472 }, - { 70475, 70477 }, - { 70487, 70487 }, - { 70498, 70499 }, - { 70502, 70508 }, - { 70512, 70516 }, - { 70709, 70726 }, - { 70750, 70750 }, - { 70832, 70851 }, - { 71087, 71093 }, - { 71096, 71104 }, - { 71132, 71133 }, - { 71216, 71232 }, - { 71339, 71351 }, - { 71453, 71467 }, - { 71724, 71738 }, - { 72193, 72202 }, - { 72243, 72249 }, - { 72251, 72254 }, - { 72263, 72263 }, - { 72273, 72283 }, - { 72330, 72345 }, - { 72751, 72758 }, - { 72760, 72767 }, - { 72850, 72871 }, - { 72873, 72886 }, - { 73009, 73014 }, - { 73018, 73018 }, - { 73020, 73021 }, - { 73023, 73029 }, - { 73031, 73031 }, - { 73098, 73102 }, - { 73104, 73105 }, - { 73107, 73111 }, - { 73459, 73462 }, - { 92912, 92916 }, - { 92976, 92982 }, - { 94033, 94078 }, - { 94095, 94098 }, - { 113821, 113822 }, - { 119141, 119145 }, - { 119149, 119154 }, - { 119163, 119170 }, - { 119173, 119179 }, - { 119210, 119213 }, - { 119362, 119364 }, - { 121344, 121398 }, - { 121403, 121452 }, - { 121461, 121461 }, - { 121476, 121476 }, - { 121499, 121503 }, - { 121505, 121519 }, - { 122880, 122886 }, - { 122888, 122904 }, - { 122907, 122913 }, - { 122915, 122916 }, - { 122918, 122922 }, - { 125136, 125142 }, - { 125252, 125258 }, - { 917760, 917999 }, -}; -static const URange16 L_range16[] = { - { 65, 90 }, - { 97, 122 }, - { 170, 170 }, - { 181, 181 }, - { 186, 186 }, - { 192, 214 }, - { 216, 246 }, - { 248, 705 }, - { 710, 721 }, - { 736, 740 }, - { 748, 748 }, - { 750, 750 }, - { 880, 884 }, - { 886, 887 }, - { 890, 893 }, - { 895, 895 }, - { 902, 902 }, - { 904, 906 }, - { 908, 908 }, - { 910, 929 }, - { 931, 1013 }, - { 1015, 1153 }, - { 1162, 1327 }, - { 1329, 1366 }, - { 1369, 1369 }, - { 1376, 1416 }, - { 1488, 1514 }, - { 1519, 1522 }, - { 1568, 1610 }, - { 1646, 1647 }, - { 1649, 1747 }, - { 1749, 1749 }, - { 1765, 1766 }, - { 1774, 1775 }, - { 1786, 1788 }, - { 1791, 1791 }, - { 1808, 1808 }, - { 1810, 1839 }, - { 1869, 1957 }, - { 1969, 1969 }, - { 1994, 2026 }, - { 2036, 2037 }, - { 2042, 2042 }, - { 2048, 2069 }, - { 2074, 2074 }, - { 2084, 2084 }, - { 2088, 2088 }, - { 2112, 2136 }, - { 2144, 2154 }, - { 2208, 2228 }, - { 2230, 2237 }, - { 2308, 2361 }, - { 2365, 2365 }, - { 2384, 2384 }, - { 2392, 2401 }, - { 2417, 2432 }, - { 2437, 2444 }, - { 2447, 2448 }, - { 2451, 2472 }, - { 2474, 2480 }, - { 2482, 2482 }, - { 2486, 2489 }, - { 2493, 2493 }, - { 2510, 2510 }, - { 2524, 2525 }, - { 2527, 2529 }, - { 2544, 2545 }, - { 2556, 2556 }, - { 2565, 2570 }, - { 2575, 2576 }, - { 2579, 2600 }, - { 2602, 2608 }, - { 2610, 2611 }, - { 2613, 2614 }, - { 2616, 2617 }, - { 2649, 2652 }, - { 2654, 2654 }, - { 2674, 2676 }, - { 2693, 2701 }, - { 2703, 2705 }, - { 2707, 2728 }, - { 2730, 2736 }, - { 2738, 2739 }, - { 2741, 2745 }, - { 2749, 2749 }, - { 2768, 2768 }, - { 2784, 2785 }, - { 2809, 2809 }, - { 2821, 2828 }, - { 2831, 2832 }, - { 2835, 2856 }, - { 2858, 2864 }, - { 2866, 2867 }, - { 2869, 2873 }, - { 2877, 2877 }, - { 2908, 2909 }, - { 2911, 2913 }, - { 2929, 2929 }, - { 2947, 2947 }, - { 2949, 2954 }, - { 2958, 2960 }, - { 2962, 2965 }, - { 2969, 2970 }, - { 2972, 2972 }, - { 2974, 2975 }, - { 2979, 2980 }, - { 2984, 2986 }, - { 2990, 3001 }, - { 3024, 3024 }, - { 3077, 3084 }, - { 3086, 3088 }, - { 3090, 3112 }, - { 3114, 3129 }, - { 3133, 3133 }, - { 3160, 3162 }, - { 3168, 3169 }, - { 3200, 3200 }, - { 3205, 3212 }, - { 3214, 3216 }, - { 3218, 3240 }, - { 3242, 3251 }, - { 3253, 3257 }, - { 3261, 3261 }, - { 3294, 3294 }, - { 3296, 3297 }, - { 3313, 3314 }, - { 3333, 3340 }, - { 3342, 3344 }, - { 3346, 3386 }, - { 3389, 3389 }, - { 3406, 3406 }, - { 3412, 3414 }, - { 3423, 3425 }, - { 3450, 3455 }, - { 3461, 3478 }, - { 3482, 3505 }, - { 3507, 3515 }, - { 3517, 3517 }, - { 3520, 3526 }, - { 3585, 3632 }, - { 3634, 3635 }, - { 3648, 3654 }, - { 3713, 3714 }, - { 3716, 3716 }, - { 3719, 3720 }, - { 3722, 3722 }, - { 3725, 3725 }, - { 3732, 3735 }, - { 3737, 3743 }, - { 3745, 3747 }, - { 3749, 3749 }, - { 3751, 3751 }, - { 3754, 3755 }, - { 3757, 3760 }, - { 3762, 3763 }, - { 3773, 3773 }, - { 3776, 3780 }, - { 3782, 3782 }, - { 3804, 3807 }, - { 3840, 3840 }, - { 3904, 3911 }, - { 3913, 3948 }, - { 3976, 3980 }, - { 4096, 4138 }, - { 4159, 4159 }, - { 4176, 4181 }, - { 4186, 4189 }, - { 4193, 4193 }, - { 4197, 4198 }, - { 4206, 4208 }, - { 4213, 4225 }, - { 4238, 4238 }, - { 4256, 4293 }, - { 4295, 4295 }, - { 4301, 4301 }, - { 4304, 4346 }, - { 4348, 4680 }, - { 4682, 4685 }, - { 4688, 4694 }, - { 4696, 4696 }, - { 4698, 4701 }, - { 4704, 4744 }, - { 4746, 4749 }, - { 4752, 4784 }, - { 4786, 4789 }, - { 4792, 4798 }, - { 4800, 4800 }, - { 4802, 4805 }, - { 4808, 4822 }, - { 4824, 4880 }, - { 4882, 4885 }, - { 4888, 4954 }, - { 4992, 5007 }, - { 5024, 5109 }, - { 5112, 5117 }, - { 5121, 5740 }, - { 5743, 5759 }, - { 5761, 5786 }, - { 5792, 5866 }, - { 5873, 5880 }, - { 5888, 5900 }, - { 5902, 5905 }, - { 5920, 5937 }, - { 5952, 5969 }, - { 5984, 5996 }, - { 5998, 6000 }, - { 6016, 6067 }, - { 6103, 6103 }, - { 6108, 6108 }, - { 6176, 6264 }, - { 6272, 6276 }, - { 6279, 6312 }, - { 6314, 6314 }, - { 6320, 6389 }, - { 6400, 6430 }, - { 6480, 6509 }, - { 6512, 6516 }, - { 6528, 6571 }, - { 6576, 6601 }, - { 6656, 6678 }, - { 6688, 6740 }, - { 6823, 6823 }, - { 6917, 6963 }, - { 6981, 6987 }, - { 7043, 7072 }, - { 7086, 7087 }, - { 7098, 7141 }, - { 7168, 7203 }, - { 7245, 7247 }, - { 7258, 7293 }, - { 7296, 7304 }, - { 7312, 7354 }, - { 7357, 7359 }, - { 7401, 7404 }, - { 7406, 7409 }, - { 7413, 7414 }, - { 7424, 7615 }, - { 7680, 7957 }, - { 7960, 7965 }, - { 7968, 8005 }, - { 8008, 8013 }, - { 8016, 8023 }, - { 8025, 8025 }, - { 8027, 8027 }, - { 8029, 8029 }, - { 8031, 8061 }, - { 8064, 8116 }, - { 8118, 8124 }, - { 8126, 8126 }, - { 8130, 8132 }, - { 8134, 8140 }, - { 8144, 8147 }, - { 8150, 8155 }, - { 8160, 8172 }, - { 8178, 8180 }, - { 8182, 8188 }, - { 8305, 8305 }, - { 8319, 8319 }, - { 8336, 8348 }, - { 8450, 8450 }, - { 8455, 8455 }, - { 8458, 8467 }, - { 8469, 8469 }, - { 8473, 8477 }, - { 8484, 8484 }, - { 8486, 8486 }, - { 8488, 8488 }, - { 8490, 8493 }, - { 8495, 8505 }, - { 8508, 8511 }, - { 8517, 8521 }, - { 8526, 8526 }, - { 8579, 8580 }, - { 11264, 11310 }, - { 11312, 11358 }, - { 11360, 11492 }, - { 11499, 11502 }, - { 11506, 11507 }, - { 11520, 11557 }, - { 11559, 11559 }, - { 11565, 11565 }, - { 11568, 11623 }, - { 11631, 11631 }, - { 11648, 11670 }, - { 11680, 11686 }, - { 11688, 11694 }, - { 11696, 11702 }, - { 11704, 11710 }, - { 11712, 11718 }, - { 11720, 11726 }, - { 11728, 11734 }, - { 11736, 11742 }, - { 11823, 11823 }, - { 12293, 12294 }, - { 12337, 12341 }, - { 12347, 12348 }, - { 12353, 12438 }, - { 12445, 12447 }, - { 12449, 12538 }, - { 12540, 12543 }, - { 12549, 12591 }, - { 12593, 12686 }, - { 12704, 12730 }, - { 12784, 12799 }, - { 13312, 19893 }, - { 19968, 40943 }, - { 40960, 42124 }, - { 42192, 42237 }, - { 42240, 42508 }, - { 42512, 42527 }, - { 42538, 42539 }, - { 42560, 42606 }, - { 42623, 42653 }, - { 42656, 42725 }, - { 42775, 42783 }, - { 42786, 42888 }, - { 42891, 42937 }, - { 42999, 43009 }, - { 43011, 43013 }, - { 43015, 43018 }, - { 43020, 43042 }, - { 43072, 43123 }, - { 43138, 43187 }, - { 43250, 43255 }, - { 43259, 43259 }, - { 43261, 43262 }, - { 43274, 43301 }, - { 43312, 43334 }, - { 43360, 43388 }, - { 43396, 43442 }, - { 43471, 43471 }, - { 43488, 43492 }, - { 43494, 43503 }, - { 43514, 43518 }, - { 43520, 43560 }, - { 43584, 43586 }, - { 43588, 43595 }, - { 43616, 43638 }, - { 43642, 43642 }, - { 43646, 43695 }, - { 43697, 43697 }, - { 43701, 43702 }, - { 43705, 43709 }, - { 43712, 43712 }, - { 43714, 43714 }, - { 43739, 43741 }, - { 43744, 43754 }, - { 43762, 43764 }, - { 43777, 43782 }, - { 43785, 43790 }, - { 43793, 43798 }, - { 43808, 43814 }, - { 43816, 43822 }, - { 43824, 43866 }, - { 43868, 43877 }, - { 43888, 44002 }, - { 44032, 55203 }, - { 55216, 55238 }, - { 55243, 55291 }, - { 63744, 64109 }, - { 64112, 64217 }, - { 64256, 64262 }, - { 64275, 64279 }, - { 64285, 64285 }, - { 64287, 64296 }, - { 64298, 64310 }, - { 64312, 64316 }, - { 64318, 64318 }, - { 64320, 64321 }, - { 64323, 64324 }, - { 64326, 64433 }, - { 64467, 64829 }, - { 64848, 64911 }, - { 64914, 64967 }, - { 65008, 65019 }, - { 65136, 65140 }, - { 65142, 65276 }, - { 65313, 65338 }, - { 65345, 65370 }, - { 65382, 65470 }, - { 65474, 65479 }, - { 65482, 65487 }, - { 65490, 65495 }, - { 65498, 65500 }, -}; -static const URange32 L_range32[] = { - { 65536, 65547 }, - { 65549, 65574 }, - { 65576, 65594 }, - { 65596, 65597 }, - { 65599, 65613 }, - { 65616, 65629 }, - { 65664, 65786 }, - { 66176, 66204 }, - { 66208, 66256 }, - { 66304, 66335 }, - { 66349, 66368 }, - { 66370, 66377 }, - { 66384, 66421 }, - { 66432, 66461 }, - { 66464, 66499 }, - { 66504, 66511 }, - { 66560, 66717 }, - { 66736, 66771 }, - { 66776, 66811 }, - { 66816, 66855 }, - { 66864, 66915 }, - { 67072, 67382 }, - { 67392, 67413 }, - { 67424, 67431 }, - { 67584, 67589 }, - { 67592, 67592 }, - { 67594, 67637 }, - { 67639, 67640 }, - { 67644, 67644 }, - { 67647, 67669 }, - { 67680, 67702 }, - { 67712, 67742 }, - { 67808, 67826 }, - { 67828, 67829 }, - { 67840, 67861 }, - { 67872, 67897 }, - { 67968, 68023 }, - { 68030, 68031 }, - { 68096, 68096 }, - { 68112, 68115 }, - { 68117, 68119 }, - { 68121, 68149 }, - { 68192, 68220 }, - { 68224, 68252 }, - { 68288, 68295 }, - { 68297, 68324 }, - { 68352, 68405 }, - { 68416, 68437 }, - { 68448, 68466 }, - { 68480, 68497 }, - { 68608, 68680 }, - { 68736, 68786 }, - { 68800, 68850 }, - { 68864, 68899 }, - { 69376, 69404 }, - { 69415, 69415 }, - { 69424, 69445 }, - { 69635, 69687 }, - { 69763, 69807 }, - { 69840, 69864 }, - { 69891, 69926 }, - { 69956, 69956 }, - { 69968, 70002 }, - { 70006, 70006 }, - { 70019, 70066 }, - { 70081, 70084 }, - { 70106, 70106 }, - { 70108, 70108 }, - { 70144, 70161 }, - { 70163, 70187 }, - { 70272, 70278 }, - { 70280, 70280 }, - { 70282, 70285 }, - { 70287, 70301 }, - { 70303, 70312 }, - { 70320, 70366 }, - { 70405, 70412 }, - { 70415, 70416 }, - { 70419, 70440 }, - { 70442, 70448 }, - { 70450, 70451 }, - { 70453, 70457 }, - { 70461, 70461 }, - { 70480, 70480 }, - { 70493, 70497 }, - { 70656, 70708 }, - { 70727, 70730 }, - { 70784, 70831 }, - { 70852, 70853 }, - { 70855, 70855 }, - { 71040, 71086 }, - { 71128, 71131 }, - { 71168, 71215 }, - { 71236, 71236 }, - { 71296, 71338 }, - { 71424, 71450 }, - { 71680, 71723 }, - { 71840, 71903 }, - { 71935, 71935 }, - { 72192, 72192 }, - { 72203, 72242 }, - { 72250, 72250 }, - { 72272, 72272 }, - { 72284, 72323 }, - { 72326, 72329 }, - { 72349, 72349 }, - { 72384, 72440 }, - { 72704, 72712 }, - { 72714, 72750 }, - { 72768, 72768 }, - { 72818, 72847 }, - { 72960, 72966 }, - { 72968, 72969 }, - { 72971, 73008 }, - { 73030, 73030 }, - { 73056, 73061 }, - { 73063, 73064 }, - { 73066, 73097 }, - { 73112, 73112 }, - { 73440, 73458 }, - { 73728, 74649 }, - { 74880, 75075 }, - { 77824, 78894 }, - { 82944, 83526 }, - { 92160, 92728 }, - { 92736, 92766 }, - { 92880, 92909 }, - { 92928, 92975 }, - { 92992, 92995 }, - { 93027, 93047 }, - { 93053, 93071 }, - { 93760, 93823 }, - { 93952, 94020 }, - { 94032, 94032 }, - { 94099, 94111 }, - { 94176, 94177 }, - { 94208, 100337 }, - { 100352, 101106 }, - { 110592, 110878 }, - { 110960, 111355 }, - { 113664, 113770 }, - { 113776, 113788 }, - { 113792, 113800 }, - { 113808, 113817 }, - { 119808, 119892 }, - { 119894, 119964 }, - { 119966, 119967 }, - { 119970, 119970 }, - { 119973, 119974 }, - { 119977, 119980 }, - { 119982, 119993 }, - { 119995, 119995 }, - { 119997, 120003 }, - { 120005, 120069 }, - { 120071, 120074 }, - { 120077, 120084 }, - { 120086, 120092 }, - { 120094, 120121 }, - { 120123, 120126 }, - { 120128, 120132 }, - { 120134, 120134 }, - { 120138, 120144 }, - { 120146, 120485 }, - { 120488, 120512 }, - { 120514, 120538 }, - { 120540, 120570 }, - { 120572, 120596 }, - { 120598, 120628 }, - { 120630, 120654 }, - { 120656, 120686 }, - { 120688, 120712 }, - { 120714, 120744 }, - { 120746, 120770 }, - { 120772, 120779 }, - { 124928, 125124 }, - { 125184, 125251 }, - { 126464, 126467 }, - { 126469, 126495 }, - { 126497, 126498 }, - { 126500, 126500 }, - { 126503, 126503 }, - { 126505, 126514 }, - { 126516, 126519 }, - { 126521, 126521 }, - { 126523, 126523 }, - { 126530, 126530 }, - { 126535, 126535 }, - { 126537, 126537 }, - { 126539, 126539 }, - { 126541, 126543 }, - { 126545, 126546 }, - { 126548, 126548 }, - { 126551, 126551 }, - { 126553, 126553 }, - { 126555, 126555 }, - { 126557, 126557 }, - { 126559, 126559 }, - { 126561, 126562 }, - { 126564, 126564 }, - { 126567, 126570 }, - { 126572, 126578 }, - { 126580, 126583 }, - { 126585, 126588 }, - { 126590, 126590 }, - { 126592, 126601 }, - { 126603, 126619 }, - { 126625, 126627 }, - { 126629, 126633 }, - { 126635, 126651 }, - { 131072, 173782 }, - { 173824, 177972 }, - { 177984, 178205 }, - { 178208, 183969 }, - { 183984, 191456 }, - { 194560, 195101 }, -}; -static const URange16 N_range16[] = { - { 48, 57 }, - { 178, 179 }, - { 185, 185 }, - { 188, 190 }, - { 1632, 1641 }, - { 1776, 1785 }, - { 1984, 1993 }, - { 2406, 2415 }, - { 2534, 2543 }, - { 2548, 2553 }, - { 2662, 2671 }, - { 2790, 2799 }, - { 2918, 2927 }, - { 2930, 2935 }, - { 3046, 3058 }, - { 3174, 3183 }, - { 3192, 3198 }, - { 3302, 3311 }, - { 3416, 3422 }, - { 3430, 3448 }, - { 3558, 3567 }, - { 3664, 3673 }, - { 3792, 3801 }, - { 3872, 3891 }, - { 4160, 4169 }, - { 4240, 4249 }, - { 4969, 4988 }, - { 5870, 5872 }, - { 6112, 6121 }, - { 6128, 6137 }, - { 6160, 6169 }, - { 6470, 6479 }, - { 6608, 6618 }, - { 6784, 6793 }, - { 6800, 6809 }, - { 6992, 7001 }, - { 7088, 7097 }, - { 7232, 7241 }, - { 7248, 7257 }, - { 8304, 8304 }, - { 8308, 8313 }, - { 8320, 8329 }, - { 8528, 8578 }, - { 8581, 8585 }, - { 9312, 9371 }, - { 9450, 9471 }, - { 10102, 10131 }, - { 11517, 11517 }, - { 12295, 12295 }, - { 12321, 12329 }, - { 12344, 12346 }, - { 12690, 12693 }, - { 12832, 12841 }, - { 12872, 12879 }, - { 12881, 12895 }, - { 12928, 12937 }, - { 12977, 12991 }, - { 42528, 42537 }, - { 42726, 42735 }, - { 43056, 43061 }, - { 43216, 43225 }, - { 43264, 43273 }, - { 43472, 43481 }, - { 43504, 43513 }, - { 43600, 43609 }, - { 44016, 44025 }, - { 65296, 65305 }, -}; -static const URange32 N_range32[] = { - { 65799, 65843 }, - { 65856, 65912 }, - { 65930, 65931 }, - { 66273, 66299 }, - { 66336, 66339 }, - { 66369, 66369 }, - { 66378, 66378 }, - { 66513, 66517 }, - { 66720, 66729 }, - { 67672, 67679 }, - { 67705, 67711 }, - { 67751, 67759 }, - { 67835, 67839 }, - { 67862, 67867 }, - { 68028, 68029 }, - { 68032, 68047 }, - { 68050, 68095 }, - { 68160, 68168 }, - { 68221, 68222 }, - { 68253, 68255 }, - { 68331, 68335 }, - { 68440, 68447 }, - { 68472, 68479 }, - { 68521, 68527 }, - { 68858, 68863 }, - { 68912, 68921 }, - { 69216, 69246 }, - { 69405, 69414 }, - { 69457, 69460 }, - { 69714, 69743 }, - { 69872, 69881 }, - { 69942, 69951 }, - { 70096, 70105 }, - { 70113, 70132 }, - { 70384, 70393 }, - { 70736, 70745 }, - { 70864, 70873 }, - { 71248, 71257 }, - { 71360, 71369 }, - { 71472, 71483 }, - { 71904, 71922 }, - { 72784, 72812 }, - { 73040, 73049 }, - { 73120, 73129 }, - { 74752, 74862 }, - { 92768, 92777 }, - { 93008, 93017 }, - { 93019, 93025 }, - { 93824, 93846 }, - { 119520, 119539 }, - { 119648, 119672 }, - { 120782, 120831 }, - { 125127, 125135 }, - { 125264, 125273 }, - { 126065, 126123 }, - { 126125, 126127 }, - { 126129, 126132 }, - { 127232, 127244 }, -}; -static const URange16 Sk_range16[] = { - { 94, 94 }, - { 96, 96 }, - { 168, 168 }, - { 175, 175 }, - { 180, 180 }, - { 184, 184 }, - { 706, 709 }, - { 722, 735 }, - { 741, 747 }, - { 749, 749 }, - { 751, 767 }, - { 885, 885 }, - { 900, 901 }, - { 8125, 8125 }, - { 8127, 8129 }, - { 8141, 8143 }, - { 8157, 8159 }, - { 8173, 8175 }, - { 8189, 8190 }, - { 12443, 12444 }, - { 42752, 42774 }, - { 42784, 42785 }, - { 42889, 42890 }, - { 43867, 43867 }, - { 64434, 64449 }, - { 65342, 65342 }, - { 65344, 65344 }, - { 65507, 65507 }, -}; -static const URange32 Sk_range32[] = { - { 127995, 127999 }, -}; -static const URange16 P_range16[] = { - { 33, 35 }, - { 37, 42 }, - { 44, 47 }, - { 58, 59 }, - { 63, 64 }, - { 91, 93 }, - { 95, 95 }, - { 123, 123 }, - { 125, 125 }, - { 161, 161 }, - { 167, 167 }, - { 171, 171 }, - { 182, 183 }, - { 187, 187 }, - { 191, 191 }, - { 894, 894 }, - { 903, 903 }, - { 1370, 1375 }, - { 1417, 1418 }, - { 1470, 1470 }, - { 1472, 1472 }, - { 1475, 1475 }, - { 1478, 1478 }, - { 1523, 1524 }, - { 1545, 1546 }, - { 1548, 1549 }, - { 1563, 1563 }, - { 1566, 1567 }, - { 1642, 1645 }, - { 1748, 1748 }, - { 1792, 1805 }, - { 2039, 2041 }, - { 2096, 2110 }, - { 2142, 2142 }, - { 2404, 2405 }, - { 2416, 2416 }, - { 2557, 2557 }, - { 2678, 2678 }, - { 2800, 2800 }, - { 3204, 3204 }, - { 3572, 3572 }, - { 3663, 3663 }, - { 3674, 3675 }, - { 3844, 3858 }, - { 3860, 3860 }, - { 3898, 3901 }, - { 3973, 3973 }, - { 4048, 4052 }, - { 4057, 4058 }, - { 4170, 4175 }, - { 4347, 4347 }, - { 4960, 4968 }, - { 5120, 5120 }, - { 5741, 5742 }, - { 5787, 5788 }, - { 5867, 5869 }, - { 5941, 5942 }, - { 6100, 6102 }, - { 6104, 6106 }, - { 6144, 6154 }, - { 6468, 6469 }, - { 6686, 6687 }, - { 6816, 6822 }, - { 6824, 6829 }, - { 7002, 7008 }, - { 7164, 7167 }, - { 7227, 7231 }, - { 7294, 7295 }, - { 7360, 7367 }, - { 7379, 7379 }, - { 8208, 8231 }, - { 8240, 8259 }, - { 8261, 8273 }, - { 8275, 8286 }, - { 8317, 8318 }, - { 8333, 8334 }, - { 8968, 8971 }, - { 9001, 9002 }, - { 10088, 10101 }, - { 10181, 10182 }, - { 10214, 10223 }, - { 10627, 10648 }, - { 10712, 10715 }, - { 10748, 10749 }, - { 11513, 11516 }, - { 11518, 11519 }, - { 11632, 11632 }, - { 11776, 11822 }, - { 11824, 11854 }, - { 12289, 12291 }, - { 12296, 12305 }, - { 12308, 12319 }, - { 12336, 12336 }, - { 12349, 12349 }, - { 12448, 12448 }, - { 12539, 12539 }, - { 42238, 42239 }, - { 42509, 42511 }, - { 42611, 42611 }, - { 42622, 42622 }, - { 42738, 42743 }, - { 43124, 43127 }, - { 43214, 43215 }, - { 43256, 43258 }, - { 43260, 43260 }, - { 43310, 43311 }, - { 43359, 43359 }, - { 43457, 43469 }, - { 43486, 43487 }, - { 43612, 43615 }, - { 43742, 43743 }, - { 43760, 43761 }, - { 44011, 44011 }, - { 64830, 64831 }, - { 65040, 65049 }, - { 65072, 65106 }, - { 65108, 65121 }, - { 65123, 65123 }, - { 65128, 65128 }, - { 65130, 65131 }, - { 65281, 65283 }, - { 65285, 65290 }, - { 65292, 65295 }, - { 65306, 65307 }, - { 65311, 65312 }, - { 65339, 65341 }, - { 65343, 65343 }, - { 65371, 65371 }, - { 65373, 65373 }, - { 65375, 65381 }, -}; -static const URange32 P_range32[] = { - { 65792, 65794 }, - { 66463, 66463 }, - { 66512, 66512 }, - { 66927, 66927 }, - { 67671, 67671 }, - { 67871, 67871 }, - { 67903, 67903 }, - { 68176, 68184 }, - { 68223, 68223 }, - { 68336, 68342 }, - { 68409, 68415 }, - { 68505, 68508 }, - { 69461, 69465 }, - { 69703, 69709 }, - { 69819, 69820 }, - { 69822, 69825 }, - { 69952, 69955 }, - { 70004, 70005 }, - { 70085, 70088 }, - { 70093, 70093 }, - { 70107, 70107 }, - { 70109, 70111 }, - { 70200, 70205 }, - { 70313, 70313 }, - { 70731, 70735 }, - { 70747, 70747 }, - { 70749, 70749 }, - { 70854, 70854 }, - { 71105, 71127 }, - { 71233, 71235 }, - { 71264, 71276 }, - { 71484, 71486 }, - { 71739, 71739 }, - { 72255, 72262 }, - { 72346, 72348 }, - { 72350, 72354 }, - { 72769, 72773 }, - { 72816, 72817 }, - { 73463, 73464 }, - { 74864, 74868 }, - { 92782, 92783 }, - { 92917, 92917 }, - { 92983, 92987 }, - { 92996, 92996 }, - { 93847, 93850 }, - { 113823, 113823 }, - { 121479, 121483 }, - { 125278, 125279 }, -}; -static const URange16 S_range16[] = { - { 36, 36 }, - { 43, 43 }, - { 60, 62 }, - { 94, 94 }, - { 96, 96 }, - { 124, 124 }, - { 126, 126 }, - { 162, 166 }, - { 168, 169 }, - { 172, 172 }, - { 174, 177 }, - { 180, 180 }, - { 184, 184 }, - { 215, 215 }, - { 247, 247 }, - { 706, 709 }, - { 722, 735 }, - { 741, 747 }, - { 749, 749 }, - { 751, 767 }, - { 885, 885 }, - { 900, 901 }, - { 1014, 1014 }, - { 1154, 1154 }, - { 1421, 1423 }, - { 1542, 1544 }, - { 1547, 1547 }, - { 1550, 1551 }, - { 1758, 1758 }, - { 1769, 1769 }, - { 1789, 1790 }, - { 2038, 2038 }, - { 2046, 2047 }, - { 2546, 2547 }, - { 2554, 2555 }, - { 2801, 2801 }, - { 2928, 2928 }, - { 3059, 3066 }, - { 3199, 3199 }, - { 3407, 3407 }, - { 3449, 3449 }, - { 3647, 3647 }, - { 3841, 3843 }, - { 3859, 3859 }, - { 3861, 3863 }, - { 3866, 3871 }, - { 3892, 3892 }, - { 3894, 3894 }, - { 3896, 3896 }, - { 4030, 4037 }, - { 4039, 4044 }, - { 4046, 4047 }, - { 4053, 4056 }, - { 4254, 4255 }, - { 5008, 5017 }, - { 6107, 6107 }, - { 6464, 6464 }, - { 6622, 6655 }, - { 7009, 7018 }, - { 7028, 7036 }, - { 8125, 8125 }, - { 8127, 8129 }, - { 8141, 8143 }, - { 8157, 8159 }, - { 8173, 8175 }, - { 8189, 8190 }, - { 8260, 8260 }, - { 8274, 8274 }, - { 8314, 8316 }, - { 8330, 8332 }, - { 8352, 8383 }, - { 8448, 8449 }, - { 8451, 8454 }, - { 8456, 8457 }, - { 8468, 8468 }, - { 8470, 8472 }, - { 8478, 8483 }, - { 8485, 8485 }, - { 8487, 8487 }, - { 8489, 8489 }, - { 8494, 8494 }, - { 8506, 8507 }, - { 8512, 8516 }, - { 8522, 8525 }, - { 8527, 8527 }, - { 8586, 8587 }, - { 8592, 8967 }, - { 8972, 9000 }, - { 9003, 9254 }, - { 9280, 9290 }, - { 9372, 9449 }, - { 9472, 10087 }, - { 10132, 10180 }, - { 10183, 10213 }, - { 10224, 10626 }, - { 10649, 10711 }, - { 10716, 10747 }, - { 10750, 11123 }, - { 11126, 11157 }, - { 11160, 11208 }, - { 11210, 11262 }, - { 11493, 11498 }, - { 11904, 11929 }, - { 11931, 12019 }, - { 12032, 12245 }, - { 12272, 12283 }, - { 12292, 12292 }, - { 12306, 12307 }, - { 12320, 12320 }, - { 12342, 12343 }, - { 12350, 12351 }, - { 12443, 12444 }, - { 12688, 12689 }, - { 12694, 12703 }, - { 12736, 12771 }, - { 12800, 12830 }, - { 12842, 12871 }, - { 12880, 12880 }, - { 12896, 12927 }, - { 12938, 12976 }, - { 12992, 13054 }, - { 13056, 13311 }, - { 19904, 19967 }, - { 42128, 42182 }, - { 42752, 42774 }, - { 42784, 42785 }, - { 42889, 42890 }, - { 43048, 43051 }, - { 43062, 43065 }, - { 43639, 43641 }, - { 43867, 43867 }, - { 64297, 64297 }, - { 64434, 64449 }, - { 65020, 65021 }, - { 65122, 65122 }, - { 65124, 65126 }, - { 65129, 65129 }, - { 65284, 65284 }, - { 65291, 65291 }, - { 65308, 65310 }, - { 65342, 65342 }, - { 65344, 65344 }, - { 65372, 65372 }, - { 65374, 65374 }, - { 65504, 65510 }, - { 65512, 65518 }, - { 65532, 65533 }, +static const URange16 Lo_range16[] = { + { 170, 170 }, + { 186, 186 }, + { 443, 443 }, + { 448, 451 }, + { 660, 660 }, + { 1488, 1514 }, + { 1519, 1522 }, + { 1568, 1599 }, + { 1601, 1610 }, + { 1646, 1647 }, + { 1649, 1747 }, + { 1749, 1749 }, + { 1774, 1775 }, + { 1786, 1788 }, + { 1791, 1791 }, + { 1808, 1808 }, + { 1810, 1839 }, + { 1869, 1957 }, + { 1969, 1969 }, + { 1994, 2026 }, + { 2048, 2069 }, + { 2112, 2136 }, + { 2144, 2154 }, + { 2160, 2183 }, + { 2185, 2190 }, + { 2208, 2248 }, + { 2308, 2361 }, + { 2365, 2365 }, + { 2384, 2384 }, + { 2392, 2401 }, + { 2418, 2432 }, + { 2437, 2444 }, + { 2447, 2448 }, + { 2451, 2472 }, + { 2474, 2480 }, + { 2482, 2482 }, + { 2486, 2489 }, + { 2493, 2493 }, + { 2510, 2510 }, + { 2524, 2525 }, + { 2527, 2529 }, + { 2544, 2545 }, + { 2556, 2556 }, + { 2565, 2570 }, + { 2575, 2576 }, + { 2579, 2600 }, + { 2602, 2608 }, + { 2610, 2611 }, + { 2613, 2614 }, + { 2616, 2617 }, + { 2649, 2652 }, + { 2654, 2654 }, + { 2674, 2676 }, + { 2693, 2701 }, + { 2703, 2705 }, + { 2707, 2728 }, + { 2730, 2736 }, + { 2738, 2739 }, + { 2741, 2745 }, + { 2749, 2749 }, + { 2768, 2768 }, + { 2784, 2785 }, + { 2809, 2809 }, + { 2821, 2828 }, + { 2831, 2832 }, + { 2835, 2856 }, + { 2858, 2864 }, + { 2866, 2867 }, + { 2869, 2873 }, + { 2877, 2877 }, + { 2908, 2909 }, + { 2911, 2913 }, + { 2929, 2929 }, + { 2947, 2947 }, + { 2949, 2954 }, + { 2958, 2960 }, + { 2962, 2965 }, + { 2969, 2970 }, + { 2972, 2972 }, + { 2974, 2975 }, + { 2979, 2980 }, + { 2984, 2986 }, + { 2990, 3001 }, + { 3024, 3024 }, + { 3077, 3084 }, + { 3086, 3088 }, + { 3090, 3112 }, + { 3114, 3129 }, + { 3133, 3133 }, + { 3160, 3162 }, + { 3165, 3165 }, + { 3168, 3169 }, + { 3200, 3200 }, + { 3205, 3212 }, + { 3214, 3216 }, + { 3218, 3240 }, + { 3242, 3251 }, + { 3253, 3257 }, + { 3261, 3261 }, + { 3293, 3294 }, + { 3296, 3297 }, + { 3313, 3314 }, + { 3332, 3340 }, + { 3342, 3344 }, + { 3346, 3386 }, + { 3389, 3389 }, + { 3406, 3406 }, + { 3412, 3414 }, + { 3423, 3425 }, + { 3450, 3455 }, + { 3461, 3478 }, + { 3482, 3505 }, + { 3507, 3515 }, + { 3517, 3517 }, + { 3520, 3526 }, + { 3585, 3632 }, + { 3634, 3635 }, + { 3648, 3653 }, + { 3713, 3714 }, + { 3716, 3716 }, + { 3718, 3722 }, + { 3724, 3747 }, + { 3749, 3749 }, + { 3751, 3760 }, + { 3762, 3763 }, + { 3773, 3773 }, + { 3776, 3780 }, + { 3804, 3807 }, + { 3840, 3840 }, + { 3904, 3911 }, + { 3913, 3948 }, + { 3976, 3980 }, + { 4096, 4138 }, + { 4159, 4159 }, + { 4176, 4181 }, + { 4186, 4189 }, + { 4193, 4193 }, + { 4197, 4198 }, + { 4206, 4208 }, + { 4213, 4225 }, + { 4238, 4238 }, + { 4352, 4680 }, + { 4682, 4685 }, + { 4688, 4694 }, + { 4696, 4696 }, + { 4698, 4701 }, + { 4704, 4744 }, + { 4746, 4749 }, + { 4752, 4784 }, + { 4786, 4789 }, + { 4792, 4798 }, + { 4800, 4800 }, + { 4802, 4805 }, + { 4808, 4822 }, + { 4824, 4880 }, + { 4882, 4885 }, + { 4888, 4954 }, + { 4992, 5007 }, + { 5121, 5740 }, + { 5743, 5759 }, + { 5761, 5786 }, + { 5792, 5866 }, + { 5873, 5880 }, + { 5888, 5905 }, + { 5919, 5937 }, + { 5952, 5969 }, + { 5984, 5996 }, + { 5998, 6000 }, + { 6016, 6067 }, + { 6108, 6108 }, + { 6176, 6210 }, + { 6212, 6264 }, + { 6272, 6276 }, + { 6279, 6312 }, + { 6314, 6314 }, + { 6320, 6389 }, + { 6400, 6430 }, + { 6480, 6509 }, + { 6512, 6516 }, + { 6528, 6571 }, + { 6576, 6601 }, + { 6656, 6678 }, + { 6688, 6740 }, + { 6917, 6963 }, + { 6981, 6988 }, + { 7043, 7072 }, + { 7086, 7087 }, + { 7098, 7141 }, + { 7168, 7203 }, + { 7245, 7247 }, + { 7258, 7287 }, + { 7401, 7404 }, + { 7406, 7411 }, + { 7413, 7414 }, + { 7418, 7418 }, + { 8501, 8504 }, + { 11568, 11623 }, + { 11648, 11670 }, + { 11680, 11686 }, + { 11688, 11694 }, + { 11696, 11702 }, + { 11704, 11710 }, + { 11712, 11718 }, + { 11720, 11726 }, + { 11728, 11734 }, + { 11736, 11742 }, + { 12294, 12294 }, + { 12348, 12348 }, + { 12353, 12438 }, + { 12447, 12447 }, + { 12449, 12538 }, + { 12543, 12543 }, + { 12549, 12591 }, + { 12593, 12686 }, + { 12704, 12735 }, + { 12784, 12799 }, + { 13312, 19903 }, + { 19968, 40980 }, + { 40982, 42124 }, + { 42192, 42231 }, + { 42240, 42507 }, + { 42512, 42527 }, + { 42538, 42539 }, + { 42606, 42606 }, + { 42656, 42725 }, + { 42895, 42895 }, + { 42999, 42999 }, + { 43003, 43009 }, + { 43011, 43013 }, + { 43015, 43018 }, + { 43020, 43042 }, + { 43072, 43123 }, + { 43138, 43187 }, + { 43250, 43255 }, + { 43259, 43259 }, + { 43261, 43262 }, + { 43274, 43301 }, + { 43312, 43334 }, + { 43360, 43388 }, + { 43396, 43442 }, + { 43488, 43492 }, + { 43495, 43503 }, + { 43514, 43518 }, + { 43520, 43560 }, + { 43584, 43586 }, + { 43588, 43595 }, + { 43616, 43631 }, + { 43633, 43638 }, + { 43642, 43642 }, + { 43646, 43695 }, + { 43697, 43697 }, + { 43701, 43702 }, + { 43705, 43709 }, + { 43712, 43712 }, + { 43714, 43714 }, + { 43739, 43740 }, + { 43744, 43754 }, + { 43762, 43762 }, + { 43777, 43782 }, + { 43785, 43790 }, + { 43793, 43798 }, + { 43808, 43814 }, + { 43816, 43822 }, + { 43968, 44002 }, + { 44032, 55203 }, + { 55216, 55238 }, + { 55243, 55291 }, + { 63744, 64109 }, + { 64112, 64217 }, + { 64285, 64285 }, + { 64287, 64296 }, + { 64298, 64310 }, + { 64312, 64316 }, + { 64318, 64318 }, + { 64320, 64321 }, + { 64323, 64324 }, + { 64326, 64433 }, + { 64467, 64829 }, + { 64848, 64911 }, + { 64914, 64967 }, + { 65008, 65019 }, + { 65136, 65140 }, + { 65142, 65276 }, + { 65382, 65391 }, + { 65393, 65437 }, + { 65440, 65470 }, + { 65474, 65479 }, + { 65482, 65487 }, + { 65490, 65495 }, + { 65498, 65500 }, }; -static const URange32 S_range32[] = { - { 65847, 65855 }, - { 65913, 65929 }, - { 65932, 65934 }, - { 65936, 65947 }, - { 65952, 65952 }, - { 66000, 66044 }, - { 67703, 67704 }, - { 68296, 68296 }, - { 71487, 71487 }, - { 92988, 92991 }, - { 92997, 92997 }, - { 113820, 113820 }, - { 118784, 119029 }, - { 119040, 119078 }, - { 119081, 119140 }, - { 119146, 119148 }, - { 119171, 119172 }, - { 119180, 119209 }, - { 119214, 119272 }, - { 119296, 119361 }, - { 119365, 119365 }, - { 119552, 119638 }, - { 120513, 120513 }, - { 120539, 120539 }, - { 120571, 120571 }, - { 120597, 120597 }, - { 120629, 120629 }, - { 120655, 120655 }, - { 120687, 120687 }, - { 120713, 120713 }, - { 120745, 120745 }, - { 120771, 120771 }, - { 120832, 121343 }, - { 121399, 121402 }, - { 121453, 121460 }, - { 121462, 121475 }, - { 121477, 121478 }, - { 126124, 126124 }, - { 126128, 126128 }, - { 126704, 126705 }, - { 126976, 127019 }, - { 127024, 127123 }, - { 127136, 127150 }, - { 127153, 127167 }, - { 127169, 127183 }, - { 127185, 127221 }, - { 127248, 127339 }, - { 127344, 127404 }, - { 127462, 127490 }, - { 127504, 127547 }, - { 127552, 127560 }, - { 127568, 127569 }, - { 127584, 127589 }, - { 127744, 128724 }, - { 128736, 128748 }, - { 128752, 128761 }, - { 128768, 128883 }, - { 128896, 128984 }, - { 129024, 129035 }, - { 129040, 129095 }, - { 129104, 129113 }, - { 129120, 129159 }, - { 129168, 129197 }, - { 129280, 129291 }, - { 129296, 129342 }, - { 129344, 129392 }, - { 129395, 129398 }, - { 129402, 129402 }, - { 129404, 129442 }, - { 129456, 129465 }, - { 129472, 129474 }, - { 129488, 129535 }, - { 129632, 129645 }, +static const URange32 Lo_range32[] = { + { 65536, 65547 }, + { 65549, 65574 }, + { 65576, 65594 }, + { 65596, 65597 }, + { 65599, 65613 }, + { 65616, 65629 }, + { 65664, 65786 }, + { 66176, 66204 }, + { 66208, 66256 }, + { 66304, 66335 }, + { 66349, 66368 }, + { 66370, 66377 }, + { 66384, 66421 }, + { 66432, 66461 }, + { 66464, 66499 }, + { 66504, 66511 }, + { 66640, 66717 }, + { 66816, 66855 }, + { 66864, 66915 }, + { 67072, 67382 }, + { 67392, 67413 }, + { 67424, 67431 }, + { 67584, 67589 }, + { 67592, 67592 }, + { 67594, 67637 }, + { 67639, 67640 }, + { 67644, 67644 }, + { 67647, 67669 }, + { 67680, 67702 }, + { 67712, 67742 }, + { 67808, 67826 }, + { 67828, 67829 }, + { 67840, 67861 }, + { 67872, 67897 }, + { 67968, 68023 }, + { 68030, 68031 }, + { 68096, 68096 }, + { 68112, 68115 }, + { 68117, 68119 }, + { 68121, 68149 }, + { 68192, 68220 }, + { 68224, 68252 }, + { 68288, 68295 }, + { 68297, 68324 }, + { 68352, 68405 }, + { 68416, 68437 }, + { 68448, 68466 }, + { 68480, 68497 }, + { 68608, 68680 }, + { 68864, 68899 }, + { 69248, 69289 }, + { 69296, 69297 }, + { 69376, 69404 }, + { 69415, 69415 }, + { 69424, 69445 }, + { 69488, 69505 }, + { 69552, 69572 }, + { 69600, 69622 }, + { 69635, 69687 }, + { 69745, 69746 }, + { 69749, 69749 }, + { 69763, 69807 }, + { 69840, 69864 }, + { 69891, 69926 }, + { 69956, 69956 }, + { 69959, 69959 }, + { 69968, 70002 }, + { 70006, 70006 }, + { 70019, 70066 }, + { 70081, 70084 }, + { 70106, 70106 }, + { 70108, 70108 }, + { 70144, 70161 }, + { 70163, 70187 }, + { 70207, 70208 }, + { 70272, 70278 }, + { 70280, 70280 }, + { 70282, 70285 }, + { 70287, 70301 }, + { 70303, 70312 }, + { 70320, 70366 }, + { 70405, 70412 }, + { 70415, 70416 }, + { 70419, 70440 }, + { 70442, 70448 }, + { 70450, 70451 }, + { 70453, 70457 }, + { 70461, 70461 }, + { 70480, 70480 }, + { 70493, 70497 }, + { 70656, 70708 }, + { 70727, 70730 }, + { 70751, 70753 }, + { 70784, 70831 }, + { 70852, 70853 }, + { 70855, 70855 }, + { 71040, 71086 }, + { 71128, 71131 }, + { 71168, 71215 }, + { 71236, 71236 }, + { 71296, 71338 }, + { 71352, 71352 }, + { 71424, 71450 }, + { 71488, 71494 }, + { 71680, 71723 }, + { 71935, 71942 }, + { 71945, 71945 }, + { 71948, 71955 }, + { 71957, 71958 }, + { 71960, 71983 }, + { 71999, 71999 }, + { 72001, 72001 }, + { 72096, 72103 }, + { 72106, 72144 }, + { 72161, 72161 }, + { 72163, 72163 }, + { 72192, 72192 }, + { 72203, 72242 }, + { 72250, 72250 }, + { 72272, 72272 }, + { 72284, 72329 }, + { 72349, 72349 }, + { 72368, 72440 }, + { 72704, 72712 }, + { 72714, 72750 }, + { 72768, 72768 }, + { 72818, 72847 }, + { 72960, 72966 }, + { 72968, 72969 }, + { 72971, 73008 }, + { 73030, 73030 }, + { 73056, 73061 }, + { 73063, 73064 }, + { 73066, 73097 }, + { 73112, 73112 }, + { 73440, 73458 }, + { 73474, 73474 }, + { 73476, 73488 }, + { 73490, 73523 }, + { 73648, 73648 }, + { 73728, 74649 }, + { 74880, 75075 }, + { 77712, 77808 }, + { 77824, 78895 }, + { 78913, 78918 }, + { 82944, 83526 }, + { 92160, 92728 }, + { 92736, 92766 }, + { 92784, 92862 }, + { 92880, 92909 }, + { 92928, 92975 }, + { 93027, 93047 }, + { 93053, 93071 }, + { 93952, 94026 }, + { 94032, 94032 }, + { 94208, 100343 }, + { 100352, 101589 }, + { 101632, 101640 }, + { 110592, 110882 }, + { 110898, 110898 }, + { 110928, 110930 }, + { 110933, 110933 }, + { 110948, 110951 }, + { 110960, 111355 }, + { 113664, 113770 }, + { 113776, 113788 }, + { 113792, 113800 }, + { 113808, 113817 }, + { 122634, 122634 }, + { 123136, 123180 }, + { 123214, 123214 }, + { 123536, 123565 }, + { 123584, 123627 }, + { 124112, 124138 }, + { 124896, 124902 }, + { 124904, 124907 }, + { 124909, 124910 }, + { 124912, 124926 }, + { 124928, 125124 }, + { 126464, 126467 }, + { 126469, 126495 }, + { 126497, 126498 }, + { 126500, 126500 }, + { 126503, 126503 }, + { 126505, 126514 }, + { 126516, 126519 }, + { 126521, 126521 }, + { 126523, 126523 }, + { 126530, 126530 }, + { 126535, 126535 }, + { 126537, 126537 }, + { 126539, 126539 }, + { 126541, 126543 }, + { 126545, 126546 }, + { 126548, 126548 }, + { 126551, 126551 }, + { 126553, 126553 }, + { 126555, 126555 }, + { 126557, 126557 }, + { 126559, 126559 }, + { 126561, 126562 }, + { 126564, 126564 }, + { 126567, 126570 }, + { 126572, 126578 }, + { 126580, 126583 }, + { 126585, 126588 }, + { 126590, 126590 }, + { 126592, 126601 }, + { 126603, 126619 }, + { 126625, 126627 }, + { 126629, 126633 }, + { 126635, 126651 }, + { 131072, 173791 }, + { 173824, 177977 }, + { 177984, 178205 }, + { 178208, 183969 }, + { 183984, 191456 }, + { 194560, 195101 }, + { 196608, 201546 }, + { 201552, 205743 }, }; -static const URange16 So_range16[] = { - { 166, 166 }, - { 169, 169 }, - { 174, 174 }, - { 176, 176 }, - { 1154, 1154 }, - { 1421, 1422 }, - { 1550, 1551 }, - { 1758, 1758 }, - { 1769, 1769 }, - { 1789, 1790 }, - { 2038, 2038 }, - { 2554, 2554 }, - { 2928, 2928 }, - { 3059, 3064 }, - { 3066, 3066 }, - { 3199, 3199 }, - { 3407, 3407 }, - { 3449, 3449 }, - { 3841, 3843 }, - { 3859, 3859 }, - { 3861, 3863 }, - { 3866, 3871 }, - { 3892, 3892 }, - { 3894, 3894 }, - { 3896, 3896 }, - { 4030, 4037 }, - { 4039, 4044 }, - { 4046, 4047 }, - { 4053, 4056 }, - { 4254, 4255 }, - { 5008, 5017 }, - { 6464, 6464 }, - { 6622, 6655 }, - { 7009, 7018 }, - { 7028, 7036 }, - { 8448, 8449 }, - { 8451, 8454 }, - { 8456, 8457 }, - { 8468, 8468 }, - { 8470, 8471 }, - { 8478, 8483 }, - { 8485, 8485 }, - { 8487, 8487 }, - { 8489, 8489 }, - { 8494, 8494 }, - { 8506, 8507 }, - { 8522, 8522 }, - { 8524, 8525 }, - { 8527, 8527 }, - { 8586, 8587 }, - { 8597, 8601 }, - { 8604, 8607 }, - { 8609, 8610 }, - { 8612, 8613 }, - { 8615, 8621 }, - { 8623, 8653 }, - { 8656, 8657 }, - { 8659, 8659 }, - { 8661, 8691 }, - { 8960, 8967 }, - { 8972, 8991 }, - { 8994, 9000 }, - { 9003, 9083 }, - { 9085, 9114 }, - { 9140, 9179 }, - { 9186, 9254 }, - { 9280, 9290 }, - { 9372, 9449 }, - { 9472, 9654 }, - { 9656, 9664 }, - { 9666, 9719 }, - { 9728, 9838 }, - { 9840, 10087 }, - { 10132, 10175 }, - { 10240, 10495 }, - { 11008, 11055 }, - { 11077, 11078 }, - { 11085, 11123 }, - { 11126, 11157 }, - { 11160, 11208 }, - { 11210, 11262 }, - { 11493, 11498 }, - { 11904, 11929 }, - { 11931, 12019 }, - { 12032, 12245 }, - { 12272, 12283 }, - { 12292, 12292 }, - { 12306, 12307 }, - { 12320, 12320 }, - { 12342, 12343 }, - { 12350, 12351 }, - { 12688, 12689 }, - { 12694, 12703 }, - { 12736, 12771 }, - { 12800, 12830 }, - { 12842, 12871 }, - { 12880, 12880 }, - { 12896, 12927 }, - { 12938, 12976 }, - { 12992, 13054 }, - { 13056, 13311 }, - { 19904, 19967 }, - { 42128, 42182 }, - { 43048, 43051 }, - { 43062, 43063 }, - { 43065, 43065 }, - { 43639, 43641 }, - { 65021, 65021 }, - { 65508, 65508 }, - { 65512, 65512 }, - { 65517, 65518 }, - { 65532, 65533 }, +static const URange16 Lt_range16[] = { + { 453, 453 }, + { 456, 456 }, + { 459, 459 }, + { 498, 498 }, + { 8072, 8079 }, + { 8088, 8095 }, + { 8104, 8111 }, + { 8124, 8124 }, + { 8140, 8140 }, + { 8188, 8188 }, }; -static const URange32 So_range32[] = { - { 65847, 65855 }, - { 65913, 65929 }, - { 65932, 65934 }, - { 65936, 65947 }, - { 65952, 65952 }, - { 66000, 66044 }, - { 67703, 67704 }, - { 68296, 68296 }, - { 71487, 71487 }, - { 92988, 92991 }, - { 92997, 92997 }, - { 113820, 113820 }, - { 118784, 119029 }, - { 119040, 119078 }, - { 119081, 119140 }, - { 119146, 119148 }, - { 119171, 119172 }, - { 119180, 119209 }, - { 119214, 119272 }, - { 119296, 119361 }, - { 119365, 119365 }, - { 119552, 119638 }, - { 120832, 121343 }, - { 121399, 121402 }, - { 121453, 121460 }, - { 121462, 121475 }, - { 121477, 121478 }, - { 126124, 126124 }, - { 126976, 127019 }, - { 127024, 127123 }, - { 127136, 127150 }, - { 127153, 127167 }, - { 127169, 127183 }, - { 127185, 127221 }, - { 127248, 127339 }, - { 127344, 127404 }, - { 127462, 127490 }, - { 127504, 127547 }, - { 127552, 127560 }, - { 127568, 127569 }, - { 127584, 127589 }, - { 127744, 127994 }, - { 128000, 128724 }, - { 128736, 128748 }, - { 128752, 128761 }, - { 128768, 128883 }, - { 128896, 128984 }, - { 129024, 129035 }, - { 129040, 129095 }, - { 129104, 129113 }, - { 129120, 129159 }, - { 129168, 129197 }, - { 129280, 129291 }, - { 129296, 129342 }, - { 129344, 129392 }, - { 129395, 129398 }, - { 129402, 129402 }, - { 129404, 129442 }, - { 129456, 129465 }, - { 129472, 129474 }, - { 129488, 129535 }, - { 129632, 129645 }, +static const URange16 Lu_range16[] = { + { 65, 90 }, + { 192, 214 }, + { 216, 222 }, + { 256, 256 }, + { 258, 258 }, + { 260, 260 }, + { 262, 262 }, + { 264, 264 }, + { 266, 266 }, + { 268, 268 }, + { 270, 270 }, + { 272, 272 }, + { 274, 274 }, + { 276, 276 }, + { 278, 278 }, + { 280, 280 }, + { 282, 282 }, + { 284, 284 }, + { 286, 286 }, + { 288, 288 }, + { 290, 290 }, + { 292, 292 }, + { 294, 294 }, + { 296, 296 }, + { 298, 298 }, + { 300, 300 }, + { 302, 302 }, + { 304, 304 }, + { 306, 306 }, + { 308, 308 }, + { 310, 310 }, + { 313, 313 }, + { 315, 315 }, + { 317, 317 }, + { 319, 319 }, + { 321, 321 }, + { 323, 323 }, + { 325, 325 }, + { 327, 327 }, + { 330, 330 }, + { 332, 332 }, + { 334, 334 }, + { 336, 336 }, + { 338, 338 }, + { 340, 340 }, + { 342, 342 }, + { 344, 344 }, + { 346, 346 }, + { 348, 348 }, + { 350, 350 }, + { 352, 352 }, + { 354, 354 }, + { 356, 356 }, + { 358, 358 }, + { 360, 360 }, + { 362, 362 }, + { 364, 364 }, + { 366, 366 }, + { 368, 368 }, + { 370, 370 }, + { 372, 372 }, + { 374, 374 }, + { 376, 377 }, + { 379, 379 }, + { 381, 381 }, + { 385, 386 }, + { 388, 388 }, + { 390, 391 }, + { 393, 395 }, + { 398, 401 }, + { 403, 404 }, + { 406, 408 }, + { 412, 413 }, + { 415, 416 }, + { 418, 418 }, + { 420, 420 }, + { 422, 423 }, + { 425, 425 }, + { 428, 428 }, + { 430, 431 }, + { 433, 435 }, + { 437, 437 }, + { 439, 440 }, + { 444, 444 }, + { 452, 452 }, + { 455, 455 }, + { 458, 458 }, + { 461, 461 }, + { 463, 463 }, + { 465, 465 }, + { 467, 467 }, + { 469, 469 }, + { 471, 471 }, + { 473, 473 }, + { 475, 475 }, + { 478, 478 }, + { 480, 480 }, + { 482, 482 }, + { 484, 484 }, + { 486, 486 }, + { 488, 488 }, + { 490, 490 }, + { 492, 492 }, + { 494, 494 }, + { 497, 497 }, + { 500, 500 }, + { 502, 504 }, + { 506, 506 }, + { 508, 508 }, + { 510, 510 }, + { 512, 512 }, + { 514, 514 }, + { 516, 516 }, + { 518, 518 }, + { 520, 520 }, + { 522, 522 }, + { 524, 524 }, + { 526, 526 }, + { 528, 528 }, + { 530, 530 }, + { 532, 532 }, + { 534, 534 }, + { 536, 536 }, + { 538, 538 }, + { 540, 540 }, + { 542, 542 }, + { 544, 544 }, + { 546, 546 }, + { 548, 548 }, + { 550, 550 }, + { 552, 552 }, + { 554, 554 }, + { 556, 556 }, + { 558, 558 }, + { 560, 560 }, + { 562, 562 }, + { 570, 571 }, + { 573, 574 }, + { 577, 577 }, + { 579, 582 }, + { 584, 584 }, + { 586, 586 }, + { 588, 588 }, + { 590, 590 }, + { 880, 880 }, + { 882, 882 }, + { 886, 886 }, + { 895, 895 }, + { 902, 902 }, + { 904, 906 }, + { 908, 908 }, + { 910, 911 }, + { 913, 929 }, + { 931, 939 }, + { 975, 975 }, + { 978, 980 }, + { 984, 984 }, + { 986, 986 }, + { 988, 988 }, + { 990, 990 }, + { 992, 992 }, + { 994, 994 }, + { 996, 996 }, + { 998, 998 }, + { 1000, 1000 }, + { 1002, 1002 }, + { 1004, 1004 }, + { 1006, 1006 }, + { 1012, 1012 }, + { 1015, 1015 }, + { 1017, 1018 }, + { 1021, 1071 }, + { 1120, 1120 }, + { 1122, 1122 }, + { 1124, 1124 }, + { 1126, 1126 }, + { 1128, 1128 }, + { 1130, 1130 }, + { 1132, 1132 }, + { 1134, 1134 }, + { 1136, 1136 }, + { 1138, 1138 }, + { 1140, 1140 }, + { 1142, 1142 }, + { 1144, 1144 }, + { 1146, 1146 }, + { 1148, 1148 }, + { 1150, 1150 }, + { 1152, 1152 }, + { 1162, 1162 }, + { 1164, 1164 }, + { 1166, 1166 }, + { 1168, 1168 }, + { 1170, 1170 }, + { 1172, 1172 }, + { 1174, 1174 }, + { 1176, 1176 }, + { 1178, 1178 }, + { 1180, 1180 }, + { 1182, 1182 }, + { 1184, 1184 }, + { 1186, 1186 }, + { 1188, 1188 }, + { 1190, 1190 }, + { 1192, 1192 }, + { 1194, 1194 }, + { 1196, 1196 }, + { 1198, 1198 }, + { 1200, 1200 }, + { 1202, 1202 }, + { 1204, 1204 }, + { 1206, 1206 }, + { 1208, 1208 }, + { 1210, 1210 }, + { 1212, 1212 }, + { 1214, 1214 }, + { 1216, 1217 }, + { 1219, 1219 }, + { 1221, 1221 }, + { 1223, 1223 }, + { 1225, 1225 }, + { 1227, 1227 }, + { 1229, 1229 }, + { 1232, 1232 }, + { 1234, 1234 }, + { 1236, 1236 }, + { 1238, 1238 }, + { 1240, 1240 }, + { 1242, 1242 }, + { 1244, 1244 }, + { 1246, 1246 }, + { 1248, 1248 }, + { 1250, 1250 }, + { 1252, 1252 }, + { 1254, 1254 }, + { 1256, 1256 }, + { 1258, 1258 }, + { 1260, 1260 }, + { 1262, 1262 }, + { 1264, 1264 }, + { 1266, 1266 }, + { 1268, 1268 }, + { 1270, 1270 }, + { 1272, 1272 }, + { 1274, 1274 }, + { 1276, 1276 }, + { 1278, 1278 }, + { 1280, 1280 }, + { 1282, 1282 }, + { 1284, 1284 }, + { 1286, 1286 }, + { 1288, 1288 }, + { 1290, 1290 }, + { 1292, 1292 }, + { 1294, 1294 }, + { 1296, 1296 }, + { 1298, 1298 }, + { 1300, 1300 }, + { 1302, 1302 }, + { 1304, 1304 }, + { 1306, 1306 }, + { 1308, 1308 }, + { 1310, 1310 }, + { 1312, 1312 }, + { 1314, 1314 }, + { 1316, 1316 }, + { 1318, 1318 }, + { 1320, 1320 }, + { 1322, 1322 }, + { 1324, 1324 }, + { 1326, 1326 }, + { 1329, 1366 }, + { 4256, 4293 }, + { 4295, 4295 }, + { 4301, 4301 }, + { 5024, 5109 }, + { 7312, 7354 }, + { 7357, 7359 }, + { 7680, 7680 }, + { 7682, 7682 }, + { 7684, 7684 }, + { 7686, 7686 }, + { 7688, 7688 }, + { 7690, 7690 }, + { 7692, 7692 }, + { 7694, 7694 }, + { 7696, 7696 }, + { 7698, 7698 }, + { 7700, 7700 }, + { 7702, 7702 }, + { 7704, 7704 }, + { 7706, 7706 }, + { 7708, 7708 }, + { 7710, 7710 }, + { 7712, 7712 }, + { 7714, 7714 }, + { 7716, 7716 }, + { 7718, 7718 }, + { 7720, 7720 }, + { 7722, 7722 }, + { 7724, 7724 }, + { 7726, 7726 }, + { 7728, 7728 }, + { 7730, 7730 }, + { 7732, 7732 }, + { 7734, 7734 }, + { 7736, 7736 }, + { 7738, 7738 }, + { 7740, 7740 }, + { 7742, 7742 }, + { 7744, 7744 }, + { 7746, 7746 }, + { 7748, 7748 }, + { 7750, 7750 }, + { 7752, 7752 }, + { 7754, 7754 }, + { 7756, 7756 }, + { 7758, 7758 }, + { 7760, 7760 }, + { 7762, 7762 }, + { 7764, 7764 }, + { 7766, 7766 }, + { 7768, 7768 }, + { 7770, 7770 }, + { 7772, 7772 }, + { 7774, 7774 }, + { 7776, 7776 }, + { 7778, 7778 }, + { 7780, 7780 }, + { 7782, 7782 }, + { 7784, 7784 }, + { 7786, 7786 }, + { 7788, 7788 }, + { 7790, 7790 }, + { 7792, 7792 }, + { 7794, 7794 }, + { 7796, 7796 }, + { 7798, 7798 }, + { 7800, 7800 }, + { 7802, 7802 }, + { 7804, 7804 }, + { 7806, 7806 }, + { 7808, 7808 }, + { 7810, 7810 }, + { 7812, 7812 }, + { 7814, 7814 }, + { 7816, 7816 }, + { 7818, 7818 }, + { 7820, 7820 }, + { 7822, 7822 }, + { 7824, 7824 }, + { 7826, 7826 }, + { 7828, 7828 }, + { 7838, 7838 }, + { 7840, 7840 }, + { 7842, 7842 }, + { 7844, 7844 }, + { 7846, 7846 }, + { 7848, 7848 }, + { 7850, 7850 }, + { 7852, 7852 }, + { 7854, 7854 }, + { 7856, 7856 }, + { 7858, 7858 }, + { 7860, 7860 }, + { 7862, 7862 }, + { 7864, 7864 }, + { 7866, 7866 }, + { 7868, 7868 }, + { 7870, 7870 }, + { 7872, 7872 }, + { 7874, 7874 }, + { 7876, 7876 }, + { 7878, 7878 }, + { 7880, 7880 }, + { 7882, 7882 }, + { 7884, 7884 }, + { 7886, 7886 }, + { 7888, 7888 }, + { 7890, 7890 }, + { 7892, 7892 }, + { 7894, 7894 }, + { 7896, 7896 }, + { 7898, 7898 }, + { 7900, 7900 }, + { 7902, 7902 }, + { 7904, 7904 }, + { 7906, 7906 }, + { 7908, 7908 }, + { 7910, 7910 }, + { 7912, 7912 }, + { 7914, 7914 }, + { 7916, 7916 }, + { 7918, 7918 }, + { 7920, 7920 }, + { 7922, 7922 }, + { 7924, 7924 }, + { 7926, 7926 }, + { 7928, 7928 }, + { 7930, 7930 }, + { 7932, 7932 }, + { 7934, 7934 }, + { 7944, 7951 }, + { 7960, 7965 }, + { 7976, 7983 }, + { 7992, 7999 }, + { 8008, 8013 }, + { 8025, 8025 }, + { 8027, 8027 }, + { 8029, 8029 }, + { 8031, 8031 }, + { 8040, 8047 }, + { 8120, 8123 }, + { 8136, 8139 }, + { 8152, 8155 }, + { 8168, 8172 }, + { 8184, 8187 }, + { 8450, 8450 }, + { 8455, 8455 }, + { 8459, 8461 }, + { 8464, 8466 }, + { 8469, 8469 }, + { 8473, 8477 }, + { 8484, 8484 }, + { 8486, 8486 }, + { 8488, 8488 }, + { 8490, 8493 }, + { 8496, 8499 }, + { 8510, 8511 }, + { 8517, 8517 }, + { 8579, 8579 }, + { 11264, 11311 }, + { 11360, 11360 }, + { 11362, 11364 }, + { 11367, 11367 }, + { 11369, 11369 }, + { 11371, 11371 }, + { 11373, 11376 }, + { 11378, 11378 }, + { 11381, 11381 }, + { 11390, 11392 }, + { 11394, 11394 }, + { 11396, 11396 }, + { 11398, 11398 }, + { 11400, 11400 }, + { 11402, 11402 }, + { 11404, 11404 }, + { 11406, 11406 }, + { 11408, 11408 }, + { 11410, 11410 }, + { 11412, 11412 }, + { 11414, 11414 }, + { 11416, 11416 }, + { 11418, 11418 }, + { 11420, 11420 }, + { 11422, 11422 }, + { 11424, 11424 }, + { 11426, 11426 }, + { 11428, 11428 }, + { 11430, 11430 }, + { 11432, 11432 }, + { 11434, 11434 }, + { 11436, 11436 }, + { 11438, 11438 }, + { 11440, 11440 }, + { 11442, 11442 }, + { 11444, 11444 }, + { 11446, 11446 }, + { 11448, 11448 }, + { 11450, 11450 }, + { 11452, 11452 }, + { 11454, 11454 }, + { 11456, 11456 }, + { 11458, 11458 }, + { 11460, 11460 }, + { 11462, 11462 }, + { 11464, 11464 }, + { 11466, 11466 }, + { 11468, 11468 }, + { 11470, 11470 }, + { 11472, 11472 }, + { 11474, 11474 }, + { 11476, 11476 }, + { 11478, 11478 }, + { 11480, 11480 }, + { 11482, 11482 }, + { 11484, 11484 }, + { 11486, 11486 }, + { 11488, 11488 }, + { 11490, 11490 }, + { 11499, 11499 }, + { 11501, 11501 }, + { 11506, 11506 }, + { 42560, 42560 }, + { 42562, 42562 }, + { 42564, 42564 }, + { 42566, 42566 }, + { 42568, 42568 }, + { 42570, 42570 }, + { 42572, 42572 }, + { 42574, 42574 }, + { 42576, 42576 }, + { 42578, 42578 }, + { 42580, 42580 }, + { 42582, 42582 }, + { 42584, 42584 }, + { 42586, 42586 }, + { 42588, 42588 }, + { 42590, 42590 }, + { 42592, 42592 }, + { 42594, 42594 }, + { 42596, 42596 }, + { 42598, 42598 }, + { 42600, 42600 }, + { 42602, 42602 }, + { 42604, 42604 }, + { 42624, 42624 }, + { 42626, 42626 }, + { 42628, 42628 }, + { 42630, 42630 }, + { 42632, 42632 }, + { 42634, 42634 }, + { 42636, 42636 }, + { 42638, 42638 }, + { 42640, 42640 }, + { 42642, 42642 }, + { 42644, 42644 }, + { 42646, 42646 }, + { 42648, 42648 }, + { 42650, 42650 }, + { 42786, 42786 }, + { 42788, 42788 }, + { 42790, 42790 }, + { 42792, 42792 }, + { 42794, 42794 }, + { 42796, 42796 }, + { 42798, 42798 }, + { 42802, 42802 }, + { 42804, 42804 }, + { 42806, 42806 }, + { 42808, 42808 }, + { 42810, 42810 }, + { 42812, 42812 }, + { 42814, 42814 }, + { 42816, 42816 }, + { 42818, 42818 }, + { 42820, 42820 }, + { 42822, 42822 }, + { 42824, 42824 }, + { 42826, 42826 }, + { 42828, 42828 }, + { 42830, 42830 }, + { 42832, 42832 }, + { 42834, 42834 }, + { 42836, 42836 }, + { 42838, 42838 }, + { 42840, 42840 }, + { 42842, 42842 }, + { 42844, 42844 }, + { 42846, 42846 }, + { 42848, 42848 }, + { 42850, 42850 }, + { 42852, 42852 }, + { 42854, 42854 }, + { 42856, 42856 }, + { 42858, 42858 }, + { 42860, 42860 }, + { 42862, 42862 }, + { 42873, 42873 }, + { 42875, 42875 }, + { 42877, 42878 }, + { 42880, 42880 }, + { 42882, 42882 }, + { 42884, 42884 }, + { 42886, 42886 }, + { 42891, 42891 }, + { 42893, 42893 }, + { 42896, 42896 }, + { 42898, 42898 }, + { 42902, 42902 }, + { 42904, 42904 }, + { 42906, 42906 }, + { 42908, 42908 }, + { 42910, 42910 }, + { 42912, 42912 }, + { 42914, 42914 }, + { 42916, 42916 }, + { 42918, 42918 }, + { 42920, 42920 }, + { 42922, 42926 }, + { 42928, 42932 }, + { 42934, 42934 }, + { 42936, 42936 }, + { 42938, 42938 }, + { 42940, 42940 }, + { 42942, 42942 }, + { 42944, 42944 }, + { 42946, 42946 }, + { 42948, 42951 }, + { 42953, 42953 }, + { 42960, 42960 }, + { 42966, 42966 }, + { 42968, 42968 }, + { 42997, 42997 }, + { 65313, 65338 }, }; -static const URange16 Sm_range16[] = { - { 43, 43 }, - { 60, 62 }, - { 124, 124 }, - { 126, 126 }, - { 172, 172 }, - { 177, 177 }, - { 215, 215 }, - { 247, 247 }, - { 1014, 1014 }, - { 1542, 1544 }, - { 8260, 8260 }, - { 8274, 8274 }, - { 8314, 8316 }, - { 8330, 8332 }, - { 8472, 8472 }, - { 8512, 8516 }, - { 8523, 8523 }, - { 8592, 8596 }, - { 8602, 8603 }, - { 8608, 8608 }, - { 8611, 8611 }, - { 8614, 8614 }, - { 8622, 8622 }, - { 8654, 8655 }, - { 8658, 8658 }, - { 8660, 8660 }, - { 8692, 8959 }, - { 8992, 8993 }, - { 9084, 9084 }, - { 9115, 9139 }, - { 9180, 9185 }, - { 9655, 9655 }, - { 9665, 9665 }, - { 9720, 9727 }, - { 9839, 9839 }, - { 10176, 10180 }, - { 10183, 10213 }, - { 10224, 10239 }, - { 10496, 10626 }, - { 10649, 10711 }, - { 10716, 10747 }, - { 10750, 11007 }, - { 11056, 11076 }, - { 11079, 11084 }, - { 64297, 64297 }, - { 65122, 65122 }, - { 65124, 65126 }, - { 65291, 65291 }, - { 65308, 65310 }, - { 65372, 65372 }, - { 65374, 65374 }, - { 65506, 65506 }, - { 65513, 65516 }, +static const URange32 Lu_range32[] = { + { 66560, 66599 }, + { 66736, 66771 }, + { 66928, 66938 }, + { 66940, 66954 }, + { 66956, 66962 }, + { 66964, 66965 }, + { 68736, 68786 }, + { 71840, 71871 }, + { 93760, 93791 }, + { 119808, 119833 }, + { 119860, 119885 }, + { 119912, 119937 }, + { 119964, 119964 }, + { 119966, 119967 }, + { 119970, 119970 }, + { 119973, 119974 }, + { 119977, 119980 }, + { 119982, 119989 }, + { 120016, 120041 }, + { 120068, 120069 }, + { 120071, 120074 }, + { 120077, 120084 }, + { 120086, 120092 }, + { 120120, 120121 }, + { 120123, 120126 }, + { 120128, 120132 }, + { 120134, 120134 }, + { 120138, 120144 }, + { 120172, 120197 }, + { 120224, 120249 }, + { 120276, 120301 }, + { 120328, 120353 }, + { 120380, 120405 }, + { 120432, 120457 }, + { 120488, 120512 }, + { 120546, 120570 }, + { 120604, 120628 }, + { 120662, 120686 }, + { 120720, 120744 }, + { 120778, 120778 }, + { 125184, 125217 }, +}; +static const URange16 M_range16[] = { + { 768, 879 }, + { 1155, 1161 }, + { 1425, 1469 }, + { 1471, 1471 }, + { 1473, 1474 }, + { 1476, 1477 }, + { 1479, 1479 }, + { 1552, 1562 }, + { 1611, 1631 }, + { 1648, 1648 }, + { 1750, 1756 }, + { 1759, 1764 }, + { 1767, 1768 }, + { 1770, 1773 }, + { 1809, 1809 }, + { 1840, 1866 }, + { 1958, 1968 }, + { 2027, 2035 }, + { 2045, 2045 }, + { 2070, 2073 }, + { 2075, 2083 }, + { 2085, 2087 }, + { 2089, 2093 }, + { 2137, 2139 }, + { 2200, 2207 }, + { 2250, 2273 }, + { 2275, 2307 }, + { 2362, 2364 }, + { 2366, 2383 }, + { 2385, 2391 }, + { 2402, 2403 }, + { 2433, 2435 }, + { 2492, 2492 }, + { 2494, 2500 }, + { 2503, 2504 }, + { 2507, 2509 }, + { 2519, 2519 }, + { 2530, 2531 }, + { 2558, 2558 }, + { 2561, 2563 }, + { 2620, 2620 }, + { 2622, 2626 }, + { 2631, 2632 }, + { 2635, 2637 }, + { 2641, 2641 }, + { 2672, 2673 }, + { 2677, 2677 }, + { 2689, 2691 }, + { 2748, 2748 }, + { 2750, 2757 }, + { 2759, 2761 }, + { 2763, 2765 }, + { 2786, 2787 }, + { 2810, 2815 }, + { 2817, 2819 }, + { 2876, 2876 }, + { 2878, 2884 }, + { 2887, 2888 }, + { 2891, 2893 }, + { 2901, 2903 }, + { 2914, 2915 }, + { 2946, 2946 }, + { 3006, 3010 }, + { 3014, 3016 }, + { 3018, 3021 }, + { 3031, 3031 }, + { 3072, 3076 }, + { 3132, 3132 }, + { 3134, 3140 }, + { 3142, 3144 }, + { 3146, 3149 }, + { 3157, 3158 }, + { 3170, 3171 }, + { 3201, 3203 }, + { 3260, 3260 }, + { 3262, 3268 }, + { 3270, 3272 }, + { 3274, 3277 }, + { 3285, 3286 }, + { 3298, 3299 }, + { 3315, 3315 }, + { 3328, 3331 }, + { 3387, 3388 }, + { 3390, 3396 }, + { 3398, 3400 }, + { 3402, 3405 }, + { 3415, 3415 }, + { 3426, 3427 }, + { 3457, 3459 }, + { 3530, 3530 }, + { 3535, 3540 }, + { 3542, 3542 }, + { 3544, 3551 }, + { 3570, 3571 }, + { 3633, 3633 }, + { 3636, 3642 }, + { 3655, 3662 }, + { 3761, 3761 }, + { 3764, 3772 }, + { 3784, 3790 }, + { 3864, 3865 }, + { 3893, 3893 }, + { 3895, 3895 }, + { 3897, 3897 }, + { 3902, 3903 }, + { 3953, 3972 }, + { 3974, 3975 }, + { 3981, 3991 }, + { 3993, 4028 }, + { 4038, 4038 }, + { 4139, 4158 }, + { 4182, 4185 }, + { 4190, 4192 }, + { 4194, 4196 }, + { 4199, 4205 }, + { 4209, 4212 }, + { 4226, 4237 }, + { 4239, 4239 }, + { 4250, 4253 }, + { 4957, 4959 }, + { 5906, 5909 }, + { 5938, 5940 }, + { 5970, 5971 }, + { 6002, 6003 }, + { 6068, 6099 }, + { 6109, 6109 }, + { 6155, 6157 }, + { 6159, 6159 }, + { 6277, 6278 }, + { 6313, 6313 }, + { 6432, 6443 }, + { 6448, 6459 }, + { 6679, 6683 }, + { 6741, 6750 }, + { 6752, 6780 }, + { 6783, 6783 }, + { 6832, 6862 }, + { 6912, 6916 }, + { 6964, 6980 }, + { 7019, 7027 }, + { 7040, 7042 }, + { 7073, 7085 }, + { 7142, 7155 }, + { 7204, 7223 }, + { 7376, 7378 }, + { 7380, 7400 }, + { 7405, 7405 }, + { 7412, 7412 }, + { 7415, 7417 }, + { 7616, 7679 }, + { 8400, 8432 }, + { 11503, 11505 }, + { 11647, 11647 }, + { 11744, 11775 }, + { 12330, 12335 }, + { 12441, 12442 }, + { 42607, 42610 }, + { 42612, 42621 }, + { 42654, 42655 }, + { 42736, 42737 }, + { 43010, 43010 }, + { 43014, 43014 }, + { 43019, 43019 }, + { 43043, 43047 }, + { 43052, 43052 }, + { 43136, 43137 }, + { 43188, 43205 }, + { 43232, 43249 }, + { 43263, 43263 }, + { 43302, 43309 }, + { 43335, 43347 }, + { 43392, 43395 }, + { 43443, 43456 }, + { 43493, 43493 }, + { 43561, 43574 }, + { 43587, 43587 }, + { 43596, 43597 }, + { 43643, 43645 }, + { 43696, 43696 }, + { 43698, 43700 }, + { 43703, 43704 }, + { 43710, 43711 }, + { 43713, 43713 }, + { 43755, 43759 }, + { 43765, 43766 }, + { 44003, 44010 }, + { 44012, 44013 }, + { 64286, 64286 }, + { 65024, 65039 }, + { 65056, 65071 }, }; -static const URange32 Sm_range32[] = { - { 120513, 120513 }, - { 120539, 120539 }, - { 120571, 120571 }, - { 120597, 120597 }, - { 120629, 120629 }, - { 120655, 120655 }, - { 120687, 120687 }, - { 120713, 120713 }, - { 120745, 120745 }, - { 120771, 120771 }, - { 126704, 126705 }, +static const URange32 M_range32[] = { + { 66045, 66045 }, + { 66272, 66272 }, + { 66422, 66426 }, + { 68097, 68099 }, + { 68101, 68102 }, + { 68108, 68111 }, + { 68152, 68154 }, + { 68159, 68159 }, + { 68325, 68326 }, + { 68900, 68903 }, + { 69291, 69292 }, + { 69373, 69375 }, + { 69446, 69456 }, + { 69506, 69509 }, + { 69632, 69634 }, + { 69688, 69702 }, + { 69744, 69744 }, + { 69747, 69748 }, + { 69759, 69762 }, + { 69808, 69818 }, + { 69826, 69826 }, + { 69888, 69890 }, + { 69927, 69940 }, + { 69957, 69958 }, + { 70003, 70003 }, + { 70016, 70018 }, + { 70067, 70080 }, + { 70089, 70092 }, + { 70094, 70095 }, + { 70188, 70199 }, + { 70206, 70206 }, + { 70209, 70209 }, + { 70367, 70378 }, + { 70400, 70403 }, + { 70459, 70460 }, + { 70462, 70468 }, + { 70471, 70472 }, + { 70475, 70477 }, + { 70487, 70487 }, + { 70498, 70499 }, + { 70502, 70508 }, + { 70512, 70516 }, + { 70709, 70726 }, + { 70750, 70750 }, + { 70832, 70851 }, + { 71087, 71093 }, + { 71096, 71104 }, + { 71132, 71133 }, + { 71216, 71232 }, + { 71339, 71351 }, + { 71453, 71467 }, + { 71724, 71738 }, + { 71984, 71989 }, + { 71991, 71992 }, + { 71995, 71998 }, + { 72000, 72000 }, + { 72002, 72003 }, + { 72145, 72151 }, + { 72154, 72160 }, + { 72164, 72164 }, + { 72193, 72202 }, + { 72243, 72249 }, + { 72251, 72254 }, + { 72263, 72263 }, + { 72273, 72283 }, + { 72330, 72345 }, + { 72751, 72758 }, + { 72760, 72767 }, + { 72850, 72871 }, + { 72873, 72886 }, + { 73009, 73014 }, + { 73018, 73018 }, + { 73020, 73021 }, + { 73023, 73029 }, + { 73031, 73031 }, + { 73098, 73102 }, + { 73104, 73105 }, + { 73107, 73111 }, + { 73459, 73462 }, + { 73472, 73473 }, + { 73475, 73475 }, + { 73524, 73530 }, + { 73534, 73538 }, + { 78912, 78912 }, + { 78919, 78933 }, + { 92912, 92916 }, + { 92976, 92982 }, + { 94031, 94031 }, + { 94033, 94087 }, + { 94095, 94098 }, + { 94180, 94180 }, + { 94192, 94193 }, + { 113821, 113822 }, + { 118528, 118573 }, + { 118576, 118598 }, + { 119141, 119145 }, + { 119149, 119154 }, + { 119163, 119170 }, + { 119173, 119179 }, + { 119210, 119213 }, + { 119362, 119364 }, + { 121344, 121398 }, + { 121403, 121452 }, + { 121461, 121461 }, + { 121476, 121476 }, + { 121499, 121503 }, + { 121505, 121519 }, + { 122880, 122886 }, + { 122888, 122904 }, + { 122907, 122913 }, + { 122915, 122916 }, + { 122918, 122922 }, + { 123023, 123023 }, + { 123184, 123190 }, + { 123566, 123566 }, + { 123628, 123631 }, + { 124140, 124143 }, + { 125136, 125142 }, + { 125252, 125258 }, + { 917760, 917999 }, }; -static const URange16 Sc_range16[] = { - { 36, 36 }, - { 162, 165 }, - { 1423, 1423 }, - { 1547, 1547 }, - { 2046, 2047 }, - { 2546, 2547 }, - { 2555, 2555 }, - { 2801, 2801 }, - { 3065, 3065 }, - { 3647, 3647 }, - { 6107, 6107 }, - { 8352, 8383 }, - { 43064, 43064 }, - { 65020, 65020 }, - { 65129, 65129 }, - { 65284, 65284 }, - { 65504, 65505 }, - { 65509, 65510 }, +static const URange16 Mc_range16[] = { + { 2307, 2307 }, + { 2363, 2363 }, + { 2366, 2368 }, + { 2377, 2380 }, + { 2382, 2383 }, + { 2434, 2435 }, + { 2494, 2496 }, + { 2503, 2504 }, + { 2507, 2508 }, + { 2519, 2519 }, + { 2563, 2563 }, + { 2622, 2624 }, + { 2691, 2691 }, + { 2750, 2752 }, + { 2761, 2761 }, + { 2763, 2764 }, + { 2818, 2819 }, + { 2878, 2878 }, + { 2880, 2880 }, + { 2887, 2888 }, + { 2891, 2892 }, + { 2903, 2903 }, + { 3006, 3007 }, + { 3009, 3010 }, + { 3014, 3016 }, + { 3018, 3020 }, + { 3031, 3031 }, + { 3073, 3075 }, + { 3137, 3140 }, + { 3202, 3203 }, + { 3262, 3262 }, + { 3264, 3268 }, + { 3271, 3272 }, + { 3274, 3275 }, + { 3285, 3286 }, + { 3315, 3315 }, + { 3330, 3331 }, + { 3390, 3392 }, + { 3398, 3400 }, + { 3402, 3404 }, + { 3415, 3415 }, + { 3458, 3459 }, + { 3535, 3537 }, + { 3544, 3551 }, + { 3570, 3571 }, + { 3902, 3903 }, + { 3967, 3967 }, + { 4139, 4140 }, + { 4145, 4145 }, + { 4152, 4152 }, + { 4155, 4156 }, + { 4182, 4183 }, + { 4194, 4196 }, + { 4199, 4205 }, + { 4227, 4228 }, + { 4231, 4236 }, + { 4239, 4239 }, + { 4250, 4252 }, + { 5909, 5909 }, + { 5940, 5940 }, + { 6070, 6070 }, + { 6078, 6085 }, + { 6087, 6088 }, + { 6435, 6438 }, + { 6441, 6443 }, + { 6448, 6449 }, + { 6451, 6456 }, + { 6681, 6682 }, + { 6741, 6741 }, + { 6743, 6743 }, + { 6753, 6753 }, + { 6755, 6756 }, + { 6765, 6770 }, + { 6916, 6916 }, + { 6965, 6965 }, + { 6971, 6971 }, + { 6973, 6977 }, + { 6979, 6980 }, + { 7042, 7042 }, + { 7073, 7073 }, + { 7078, 7079 }, + { 7082, 7082 }, + { 7143, 7143 }, + { 7146, 7148 }, + { 7150, 7150 }, + { 7154, 7155 }, + { 7204, 7211 }, + { 7220, 7221 }, + { 7393, 7393 }, + { 7415, 7415 }, + { 12334, 12335 }, + { 43043, 43044 }, + { 43047, 43047 }, + { 43136, 43137 }, + { 43188, 43203 }, + { 43346, 43347 }, + { 43395, 43395 }, + { 43444, 43445 }, + { 43450, 43451 }, + { 43454, 43456 }, + { 43567, 43568 }, + { 43571, 43572 }, + { 43597, 43597 }, + { 43643, 43643 }, + { 43645, 43645 }, + { 43755, 43755 }, + { 43758, 43759 }, + { 43765, 43765 }, + { 44003, 44004 }, + { 44006, 44007 }, + { 44009, 44010 }, + { 44012, 44012 }, }; -static const URange32 Sc_range32[] = { - { 126128, 126128 }, +static const URange32 Mc_range32[] = { + { 69632, 69632 }, + { 69634, 69634 }, + { 69762, 69762 }, + { 69808, 69810 }, + { 69815, 69816 }, + { 69932, 69932 }, + { 69957, 69958 }, + { 70018, 70018 }, + { 70067, 70069 }, + { 70079, 70080 }, + { 70094, 70094 }, + { 70188, 70190 }, + { 70194, 70195 }, + { 70197, 70197 }, + { 70368, 70370 }, + { 70402, 70403 }, + { 70462, 70463 }, + { 70465, 70468 }, + { 70471, 70472 }, + { 70475, 70477 }, + { 70487, 70487 }, + { 70498, 70499 }, + { 70709, 70711 }, + { 70720, 70721 }, + { 70725, 70725 }, + { 70832, 70834 }, + { 70841, 70841 }, + { 70843, 70846 }, + { 70849, 70849 }, + { 71087, 71089 }, + { 71096, 71099 }, + { 71102, 71102 }, + { 71216, 71218 }, + { 71227, 71228 }, + { 71230, 71230 }, + { 71340, 71340 }, + { 71342, 71343 }, + { 71350, 71350 }, + { 71456, 71457 }, + { 71462, 71462 }, + { 71724, 71726 }, + { 71736, 71736 }, + { 71984, 71989 }, + { 71991, 71992 }, + { 71997, 71997 }, + { 72000, 72000 }, + { 72002, 72002 }, + { 72145, 72147 }, + { 72156, 72159 }, + { 72164, 72164 }, + { 72249, 72249 }, + { 72279, 72280 }, + { 72343, 72343 }, + { 72751, 72751 }, + { 72766, 72766 }, + { 72873, 72873 }, + { 72881, 72881 }, + { 72884, 72884 }, + { 73098, 73102 }, + { 73107, 73108 }, + { 73110, 73110 }, + { 73461, 73462 }, + { 73475, 73475 }, + { 73524, 73525 }, + { 73534, 73535 }, + { 73537, 73537 }, + { 94033, 94087 }, + { 94192, 94193 }, + { 119141, 119142 }, + { 119149, 119154 }, }; -static const URange16 Z_range16[] = { - { 32, 32 }, - { 160, 160 }, - { 5760, 5760 }, - { 8192, 8202 }, - { 8232, 8233 }, - { 8239, 8239 }, - { 8287, 8287 }, - { 12288, 12288 }, +static const URange16 Me_range16[] = { + { 1160, 1161 }, + { 6846, 6846 }, + { 8413, 8416 }, + { 8418, 8420 }, + { 42608, 42610 }, }; -static const URange16 Zl_range16[] = { - { 8232, 8232 }, +static const URange16 Mn_range16[] = { + { 768, 879 }, + { 1155, 1159 }, + { 1425, 1469 }, + { 1471, 1471 }, + { 1473, 1474 }, + { 1476, 1477 }, + { 1479, 1479 }, + { 1552, 1562 }, + { 1611, 1631 }, + { 1648, 1648 }, + { 1750, 1756 }, + { 1759, 1764 }, + { 1767, 1768 }, + { 1770, 1773 }, + { 1809, 1809 }, + { 1840, 1866 }, + { 1958, 1968 }, + { 2027, 2035 }, + { 2045, 2045 }, + { 2070, 2073 }, + { 2075, 2083 }, + { 2085, 2087 }, + { 2089, 2093 }, + { 2137, 2139 }, + { 2200, 2207 }, + { 2250, 2273 }, + { 2275, 2306 }, + { 2362, 2362 }, + { 2364, 2364 }, + { 2369, 2376 }, + { 2381, 2381 }, + { 2385, 2391 }, + { 2402, 2403 }, + { 2433, 2433 }, + { 2492, 2492 }, + { 2497, 2500 }, + { 2509, 2509 }, + { 2530, 2531 }, + { 2558, 2558 }, + { 2561, 2562 }, + { 2620, 2620 }, + { 2625, 2626 }, + { 2631, 2632 }, + { 2635, 2637 }, + { 2641, 2641 }, + { 2672, 2673 }, + { 2677, 2677 }, + { 2689, 2690 }, + { 2748, 2748 }, + { 2753, 2757 }, + { 2759, 2760 }, + { 2765, 2765 }, + { 2786, 2787 }, + { 2810, 2815 }, + { 2817, 2817 }, + { 2876, 2876 }, + { 2879, 2879 }, + { 2881, 2884 }, + { 2893, 2893 }, + { 2901, 2902 }, + { 2914, 2915 }, + { 2946, 2946 }, + { 3008, 3008 }, + { 3021, 3021 }, + { 3072, 3072 }, + { 3076, 3076 }, + { 3132, 3132 }, + { 3134, 3136 }, + { 3142, 3144 }, + { 3146, 3149 }, + { 3157, 3158 }, + { 3170, 3171 }, + { 3201, 3201 }, + { 3260, 3260 }, + { 3263, 3263 }, + { 3270, 3270 }, + { 3276, 3277 }, + { 3298, 3299 }, + { 3328, 3329 }, + { 3387, 3388 }, + { 3393, 3396 }, + { 3405, 3405 }, + { 3426, 3427 }, + { 3457, 3457 }, + { 3530, 3530 }, + { 3538, 3540 }, + { 3542, 3542 }, + { 3633, 3633 }, + { 3636, 3642 }, + { 3655, 3662 }, + { 3761, 3761 }, + { 3764, 3772 }, + { 3784, 3790 }, + { 3864, 3865 }, + { 3893, 3893 }, + { 3895, 3895 }, + { 3897, 3897 }, + { 3953, 3966 }, + { 3968, 3972 }, + { 3974, 3975 }, + { 3981, 3991 }, + { 3993, 4028 }, + { 4038, 4038 }, + { 4141, 4144 }, + { 4146, 4151 }, + { 4153, 4154 }, + { 4157, 4158 }, + { 4184, 4185 }, + { 4190, 4192 }, + { 4209, 4212 }, + { 4226, 4226 }, + { 4229, 4230 }, + { 4237, 4237 }, + { 4253, 4253 }, + { 4957, 4959 }, + { 5906, 5908 }, + { 5938, 5939 }, + { 5970, 5971 }, + { 6002, 6003 }, + { 6068, 6069 }, + { 6071, 6077 }, + { 6086, 6086 }, + { 6089, 6099 }, + { 6109, 6109 }, + { 6155, 6157 }, + { 6159, 6159 }, + { 6277, 6278 }, + { 6313, 6313 }, + { 6432, 6434 }, + { 6439, 6440 }, + { 6450, 6450 }, + { 6457, 6459 }, + { 6679, 6680 }, + { 6683, 6683 }, + { 6742, 6742 }, + { 6744, 6750 }, + { 6752, 6752 }, + { 6754, 6754 }, + { 6757, 6764 }, + { 6771, 6780 }, + { 6783, 6783 }, + { 6832, 6845 }, + { 6847, 6862 }, + { 6912, 6915 }, + { 6964, 6964 }, + { 6966, 6970 }, + { 6972, 6972 }, + { 6978, 6978 }, + { 7019, 7027 }, + { 7040, 7041 }, + { 7074, 7077 }, + { 7080, 7081 }, + { 7083, 7085 }, + { 7142, 7142 }, + { 7144, 7145 }, + { 7149, 7149 }, + { 7151, 7153 }, + { 7212, 7219 }, + { 7222, 7223 }, + { 7376, 7378 }, + { 7380, 7392 }, + { 7394, 7400 }, + { 7405, 7405 }, + { 7412, 7412 }, + { 7416, 7417 }, + { 7616, 7679 }, + { 8400, 8412 }, + { 8417, 8417 }, + { 8421, 8432 }, + { 11503, 11505 }, + { 11647, 11647 }, + { 11744, 11775 }, + { 12330, 12333 }, + { 12441, 12442 }, + { 42607, 42607 }, + { 42612, 42621 }, + { 42654, 42655 }, + { 42736, 42737 }, + { 43010, 43010 }, + { 43014, 43014 }, + { 43019, 43019 }, + { 43045, 43046 }, + { 43052, 43052 }, + { 43204, 43205 }, + { 43232, 43249 }, + { 43263, 43263 }, + { 43302, 43309 }, + { 43335, 43345 }, + { 43392, 43394 }, + { 43443, 43443 }, + { 43446, 43449 }, + { 43452, 43453 }, + { 43493, 43493 }, + { 43561, 43566 }, + { 43569, 43570 }, + { 43573, 43574 }, + { 43587, 43587 }, + { 43596, 43596 }, + { 43644, 43644 }, + { 43696, 43696 }, + { 43698, 43700 }, + { 43703, 43704 }, + { 43710, 43711 }, + { 43713, 43713 }, + { 43756, 43757 }, + { 43766, 43766 }, + { 44005, 44005 }, + { 44008, 44008 }, + { 44013, 44013 }, + { 64286, 64286 }, + { 65024, 65039 }, + { 65056, 65071 }, }; -static const URange16 Co_range16[] = { - { 57344, 63743 }, +static const URange32 Mn_range32[] = { + { 66045, 66045 }, + { 66272, 66272 }, + { 66422, 66426 }, + { 68097, 68099 }, + { 68101, 68102 }, + { 68108, 68111 }, + { 68152, 68154 }, + { 68159, 68159 }, + { 68325, 68326 }, + { 68900, 68903 }, + { 69291, 69292 }, + { 69373, 69375 }, + { 69446, 69456 }, + { 69506, 69509 }, + { 69633, 69633 }, + { 69688, 69702 }, + { 69744, 69744 }, + { 69747, 69748 }, + { 69759, 69761 }, + { 69811, 69814 }, + { 69817, 69818 }, + { 69826, 69826 }, + { 69888, 69890 }, + { 69927, 69931 }, + { 69933, 69940 }, + { 70003, 70003 }, + { 70016, 70017 }, + { 70070, 70078 }, + { 70089, 70092 }, + { 70095, 70095 }, + { 70191, 70193 }, + { 70196, 70196 }, + { 70198, 70199 }, + { 70206, 70206 }, + { 70209, 70209 }, + { 70367, 70367 }, + { 70371, 70378 }, + { 70400, 70401 }, + { 70459, 70460 }, + { 70464, 70464 }, + { 70502, 70508 }, + { 70512, 70516 }, + { 70712, 70719 }, + { 70722, 70724 }, + { 70726, 70726 }, + { 70750, 70750 }, + { 70835, 70840 }, + { 70842, 70842 }, + { 70847, 70848 }, + { 70850, 70851 }, + { 71090, 71093 }, + { 71100, 71101 }, + { 71103, 71104 }, + { 71132, 71133 }, + { 71219, 71226 }, + { 71229, 71229 }, + { 71231, 71232 }, + { 71339, 71339 }, + { 71341, 71341 }, + { 71344, 71349 }, + { 71351, 71351 }, + { 71453, 71455 }, + { 71458, 71461 }, + { 71463, 71467 }, + { 71727, 71735 }, + { 71737, 71738 }, + { 71995, 71996 }, + { 71998, 71998 }, + { 72003, 72003 }, + { 72148, 72151 }, + { 72154, 72155 }, + { 72160, 72160 }, + { 72193, 72202 }, + { 72243, 72248 }, + { 72251, 72254 }, + { 72263, 72263 }, + { 72273, 72278 }, + { 72281, 72283 }, + { 72330, 72342 }, + { 72344, 72345 }, + { 72752, 72758 }, + { 72760, 72765 }, + { 72767, 72767 }, + { 72850, 72871 }, + { 72874, 72880 }, + { 72882, 72883 }, + { 72885, 72886 }, + { 73009, 73014 }, + { 73018, 73018 }, + { 73020, 73021 }, + { 73023, 73029 }, + { 73031, 73031 }, + { 73104, 73105 }, + { 73109, 73109 }, + { 73111, 73111 }, + { 73459, 73460 }, + { 73472, 73473 }, + { 73526, 73530 }, + { 73536, 73536 }, + { 73538, 73538 }, + { 78912, 78912 }, + { 78919, 78933 }, + { 92912, 92916 }, + { 92976, 92982 }, + { 94031, 94031 }, + { 94095, 94098 }, + { 94180, 94180 }, + { 113821, 113822 }, + { 118528, 118573 }, + { 118576, 118598 }, + { 119143, 119145 }, + { 119163, 119170 }, + { 119173, 119179 }, + { 119210, 119213 }, + { 119362, 119364 }, + { 121344, 121398 }, + { 121403, 121452 }, + { 121461, 121461 }, + { 121476, 121476 }, + { 121499, 121503 }, + { 121505, 121519 }, + { 122880, 122886 }, + { 122888, 122904 }, + { 122907, 122913 }, + { 122915, 122916 }, + { 122918, 122922 }, + { 123023, 123023 }, + { 123184, 123190 }, + { 123566, 123566 }, + { 123628, 123631 }, + { 124140, 124143 }, + { 125136, 125142 }, + { 125252, 125258 }, + { 917760, 917999 }, }; -static const URange32 Co_range32[] = { - { 983040, 1048573 }, - { 1048576, 1114109 }, +static const URange16 N_range16[] = { + { 48, 57 }, + { 178, 179 }, + { 185, 185 }, + { 188, 190 }, + { 1632, 1641 }, + { 1776, 1785 }, + { 1984, 1993 }, + { 2406, 2415 }, + { 2534, 2543 }, + { 2548, 2553 }, + { 2662, 2671 }, + { 2790, 2799 }, + { 2918, 2927 }, + { 2930, 2935 }, + { 3046, 3058 }, + { 3174, 3183 }, + { 3192, 3198 }, + { 3302, 3311 }, + { 3416, 3422 }, + { 3430, 3448 }, + { 3558, 3567 }, + { 3664, 3673 }, + { 3792, 3801 }, + { 3872, 3891 }, + { 4160, 4169 }, + { 4240, 4249 }, + { 4969, 4988 }, + { 5870, 5872 }, + { 6112, 6121 }, + { 6128, 6137 }, + { 6160, 6169 }, + { 6470, 6479 }, + { 6608, 6618 }, + { 6784, 6793 }, + { 6800, 6809 }, + { 6992, 7001 }, + { 7088, 7097 }, + { 7232, 7241 }, + { 7248, 7257 }, + { 8304, 8304 }, + { 8308, 8313 }, + { 8320, 8329 }, + { 8528, 8578 }, + { 8581, 8585 }, + { 9312, 9371 }, + { 9450, 9471 }, + { 10102, 10131 }, + { 11517, 11517 }, + { 12295, 12295 }, + { 12321, 12329 }, + { 12344, 12346 }, + { 12690, 12693 }, + { 12832, 12841 }, + { 12872, 12879 }, + { 12881, 12895 }, + { 12928, 12937 }, + { 12977, 12991 }, + { 42528, 42537 }, + { 42726, 42735 }, + { 43056, 43061 }, + { 43216, 43225 }, + { 43264, 43273 }, + { 43472, 43481 }, + { 43504, 43513 }, + { 43600, 43609 }, + { 44016, 44025 }, + { 65296, 65305 }, }; -static const URange16 Cc_range16[] = { - { 0, 31 }, - { 127, 159 }, +static const URange32 N_range32[] = { + { 65799, 65843 }, + { 65856, 65912 }, + { 65930, 65931 }, + { 66273, 66299 }, + { 66336, 66339 }, + { 66369, 66369 }, + { 66378, 66378 }, + { 66513, 66517 }, + { 66720, 66729 }, + { 67672, 67679 }, + { 67705, 67711 }, + { 67751, 67759 }, + { 67835, 67839 }, + { 67862, 67867 }, + { 68028, 68029 }, + { 68032, 68047 }, + { 68050, 68095 }, + { 68160, 68168 }, + { 68221, 68222 }, + { 68253, 68255 }, + { 68331, 68335 }, + { 68440, 68447 }, + { 68472, 68479 }, + { 68521, 68527 }, + { 68858, 68863 }, + { 68912, 68921 }, + { 69216, 69246 }, + { 69405, 69414 }, + { 69457, 69460 }, + { 69573, 69579 }, + { 69714, 69743 }, + { 69872, 69881 }, + { 69942, 69951 }, + { 70096, 70105 }, + { 70113, 70132 }, + { 70384, 70393 }, + { 70736, 70745 }, + { 70864, 70873 }, + { 71248, 71257 }, + { 71360, 71369 }, + { 71472, 71483 }, + { 71904, 71922 }, + { 72016, 72025 }, + { 72784, 72812 }, + { 73040, 73049 }, + { 73120, 73129 }, + { 73552, 73561 }, + { 73664, 73684 }, + { 74752, 74862 }, + { 92768, 92777 }, + { 92864, 92873 }, + { 93008, 93017 }, + { 93019, 93025 }, + { 93824, 93846 }, + { 119488, 119507 }, + { 119520, 119539 }, + { 119648, 119672 }, + { 120782, 120831 }, + { 123200, 123209 }, + { 123632, 123641 }, + { 124144, 124153 }, + { 125127, 125135 }, + { 125264, 125273 }, + { 126065, 126123 }, + { 126125, 126127 }, + { 126129, 126132 }, + { 126209, 126253 }, + { 126255, 126269 }, + { 127232, 127244 }, + { 130032, 130041 }, }; -static const URange16 Cf_range16[] = { - { 173, 173 }, - { 1536, 1541 }, - { 1564, 1564 }, - { 1757, 1757 }, - { 1807, 1807 }, - { 2274, 2274 }, - { 6158, 6158 }, - { 8203, 8207 }, - { 8234, 8238 }, - { 8288, 8292 }, - { 8294, 8303 }, - { 65279, 65279 }, - { 65529, 65531 }, +static const URange16 Nd_range16[] = { + { 48, 57 }, + { 1632, 1641 }, + { 1776, 1785 }, + { 1984, 1993 }, + { 2406, 2415 }, + { 2534, 2543 }, + { 2662, 2671 }, + { 2790, 2799 }, + { 2918, 2927 }, + { 3046, 3055 }, + { 3174, 3183 }, + { 3302, 3311 }, + { 3430, 3439 }, + { 3558, 3567 }, + { 3664, 3673 }, + { 3792, 3801 }, + { 3872, 3881 }, + { 4160, 4169 }, + { 4240, 4249 }, + { 6112, 6121 }, + { 6160, 6169 }, + { 6470, 6479 }, + { 6608, 6617 }, + { 6784, 6793 }, + { 6800, 6809 }, + { 6992, 7001 }, + { 7088, 7097 }, + { 7232, 7241 }, + { 7248, 7257 }, + { 42528, 42537 }, + { 43216, 43225 }, + { 43264, 43273 }, + { 43472, 43481 }, + { 43504, 43513 }, + { 43600, 43609 }, + { 44016, 44025 }, + { 65296, 65305 }, }; -static const URange32 Cf_range32[] = { - { 69821, 69821 }, - { 69837, 69837 }, - { 113824, 113827 }, - { 119155, 119162 }, - { 917505, 917505 }, - { 917536, 917631 }, +static const URange32 Nd_range32[] = { + { 66720, 66729 }, + { 68912, 68921 }, + { 69734, 69743 }, + { 69872, 69881 }, + { 69942, 69951 }, + { 70096, 70105 }, + { 70384, 70393 }, + { 70736, 70745 }, + { 70864, 70873 }, + { 71248, 71257 }, + { 71360, 71369 }, + { 71472, 71481 }, + { 71904, 71913 }, + { 72016, 72025 }, + { 72784, 72793 }, + { 73040, 73049 }, + { 73120, 73129 }, + { 73552, 73561 }, + { 92768, 92777 }, + { 92864, 92873 }, + { 93008, 93017 }, + { 120782, 120831 }, + { 123200, 123209 }, + { 123632, 123641 }, + { 124144, 124153 }, + { 125264, 125273 }, + { 130032, 130041 }, }; -static const URange16 Cs_range16[] = { - { 55296, 57343 }, +static const URange16 Nl_range16[] = { + { 5870, 5872 }, + { 8544, 8578 }, + { 8581, 8584 }, + { 12295, 12295 }, + { 12321, 12329 }, + { 12344, 12346 }, + { 42726, 42735 }, }; -static const URange16 Zp_range16[] = { - { 8233, 8233 }, +static const URange32 Nl_range32[] = { + { 65856, 65908 }, + { 66369, 66369 }, + { 66378, 66378 }, + { 66513, 66517 }, + { 74752, 74862 }, }; -static const URange16 Zs_range16[] = { - { 32, 32 }, - { 160, 160 }, - { 5760, 5760 }, - { 8192, 8202 }, - { 8239, 8239 }, - { 8287, 8287 }, - { 12288, 12288 }, +static const URange16 No_range16[] = { + { 178, 179 }, + { 185, 185 }, + { 188, 190 }, + { 2548, 2553 }, + { 2930, 2935 }, + { 3056, 3058 }, + { 3192, 3198 }, + { 3416, 3422 }, + { 3440, 3448 }, + { 3882, 3891 }, + { 4969, 4988 }, + { 6128, 6137 }, + { 6618, 6618 }, + { 8304, 8304 }, + { 8308, 8313 }, + { 8320, 8329 }, + { 8528, 8543 }, + { 8585, 8585 }, + { 9312, 9371 }, + { 9450, 9471 }, + { 10102, 10131 }, + { 11517, 11517 }, + { 12690, 12693 }, + { 12832, 12841 }, + { 12872, 12879 }, + { 12881, 12895 }, + { 12928, 12937 }, + { 12977, 12991 }, + { 43056, 43061 }, }; -static const URange32 Tangut_range32[] = { - { 94176, 94176 }, - { 94208, 100337 }, - { 100352, 101106 }, +static const URange32 No_range32[] = { + { 65799, 65843 }, + { 65909, 65912 }, + { 65930, 65931 }, + { 66273, 66299 }, + { 66336, 66339 }, + { 67672, 67679 }, + { 67705, 67711 }, + { 67751, 67759 }, + { 67835, 67839 }, + { 67862, 67867 }, + { 68028, 68029 }, + { 68032, 68047 }, + { 68050, 68095 }, + { 68160, 68168 }, + { 68221, 68222 }, + { 68253, 68255 }, + { 68331, 68335 }, + { 68440, 68447 }, + { 68472, 68479 }, + { 68521, 68527 }, + { 68858, 68863 }, + { 69216, 69246 }, + { 69405, 69414 }, + { 69457, 69460 }, + { 69573, 69579 }, + { 69714, 69733 }, + { 70113, 70132 }, + { 71482, 71483 }, + { 71914, 71922 }, + { 72794, 72812 }, + { 73664, 73684 }, + { 93019, 93025 }, + { 93824, 93846 }, + { 119488, 119507 }, + { 119520, 119539 }, + { 119648, 119672 }, + { 125127, 125135 }, + { 126065, 126123 }, + { 126125, 126127 }, + { 126129, 126132 }, + { 126209, 126253 }, + { 126255, 126269 }, + { 127232, 127244 }, }; -static const URange16 Thaana_range16[] = { - { 1920, 1969 }, +static const URange16 P_range16[] = { + { 33, 35 }, + { 37, 42 }, + { 44, 47 }, + { 58, 59 }, + { 63, 64 }, + { 91, 93 }, + { 95, 95 }, + { 123, 123 }, + { 125, 125 }, + { 161, 161 }, + { 167, 167 }, + { 171, 171 }, + { 182, 183 }, + { 187, 187 }, + { 191, 191 }, + { 894, 894 }, + { 903, 903 }, + { 1370, 1375 }, + { 1417, 1418 }, + { 1470, 1470 }, + { 1472, 1472 }, + { 1475, 1475 }, + { 1478, 1478 }, + { 1523, 1524 }, + { 1545, 1546 }, + { 1548, 1549 }, + { 1563, 1563 }, + { 1565, 1567 }, + { 1642, 1645 }, + { 1748, 1748 }, + { 1792, 1805 }, + { 2039, 2041 }, + { 2096, 2110 }, + { 2142, 2142 }, + { 2404, 2405 }, + { 2416, 2416 }, + { 2557, 2557 }, + { 2678, 2678 }, + { 2800, 2800 }, + { 3191, 3191 }, + { 3204, 3204 }, + { 3572, 3572 }, + { 3663, 3663 }, + { 3674, 3675 }, + { 3844, 3858 }, + { 3860, 3860 }, + { 3898, 3901 }, + { 3973, 3973 }, + { 4048, 4052 }, + { 4057, 4058 }, + { 4170, 4175 }, + { 4347, 4347 }, + { 4960, 4968 }, + { 5120, 5120 }, + { 5742, 5742 }, + { 5787, 5788 }, + { 5867, 5869 }, + { 5941, 5942 }, + { 6100, 6102 }, + { 6104, 6106 }, + { 6144, 6154 }, + { 6468, 6469 }, + { 6686, 6687 }, + { 6816, 6822 }, + { 6824, 6829 }, + { 7002, 7008 }, + { 7037, 7038 }, + { 7164, 7167 }, + { 7227, 7231 }, + { 7294, 7295 }, + { 7360, 7367 }, + { 7379, 7379 }, + { 8208, 8231 }, + { 8240, 8259 }, + { 8261, 8273 }, + { 8275, 8286 }, + { 8317, 8318 }, + { 8333, 8334 }, + { 8968, 8971 }, + { 9001, 9002 }, + { 10088, 10101 }, + { 10181, 10182 }, + { 10214, 10223 }, + { 10627, 10648 }, + { 10712, 10715 }, + { 10748, 10749 }, + { 11513, 11516 }, + { 11518, 11519 }, + { 11632, 11632 }, + { 11776, 11822 }, + { 11824, 11855 }, + { 11858, 11869 }, + { 12289, 12291 }, + { 12296, 12305 }, + { 12308, 12319 }, + { 12336, 12336 }, + { 12349, 12349 }, + { 12448, 12448 }, + { 12539, 12539 }, + { 42238, 42239 }, + { 42509, 42511 }, + { 42611, 42611 }, + { 42622, 42622 }, + { 42738, 42743 }, + { 43124, 43127 }, + { 43214, 43215 }, + { 43256, 43258 }, + { 43260, 43260 }, + { 43310, 43311 }, + { 43359, 43359 }, + { 43457, 43469 }, + { 43486, 43487 }, + { 43612, 43615 }, + { 43742, 43743 }, + { 43760, 43761 }, + { 44011, 44011 }, + { 64830, 64831 }, + { 65040, 65049 }, + { 65072, 65106 }, + { 65108, 65121 }, + { 65123, 65123 }, + { 65128, 65128 }, + { 65130, 65131 }, + { 65281, 65283 }, + { 65285, 65290 }, + { 65292, 65295 }, + { 65306, 65307 }, + { 65311, 65312 }, + { 65339, 65341 }, + { 65343, 65343 }, + { 65371, 65371 }, + { 65373, 65373 }, + { 65375, 65381 }, }; -static const URange32 Adlam_range32[] = { - { 125184, 125258 }, - { 125264, 125273 }, +static const URange32 P_range32[] = { + { 65792, 65794 }, + { 66463, 66463 }, + { 66512, 66512 }, + { 66927, 66927 }, + { 67671, 67671 }, + { 67871, 67871 }, + { 67903, 67903 }, + { 68176, 68184 }, + { 68223, 68223 }, + { 68336, 68342 }, + { 68409, 68415 }, + { 68505, 68508 }, + { 69293, 69293 }, + { 69461, 69465 }, + { 69510, 69513 }, + { 69703, 69709 }, + { 69819, 69820 }, + { 69822, 69825 }, + { 69952, 69955 }, + { 70004, 70005 }, + { 70085, 70088 }, + { 70093, 70093 }, + { 70107, 70107 }, + { 70109, 70111 }, + { 70200, 70205 }, + { 70313, 70313 }, + { 70731, 70735 }, + { 70746, 70747 }, + { 70749, 70749 }, + { 70854, 70854 }, + { 71105, 71127 }, + { 71233, 71235 }, + { 71264, 71276 }, + { 71353, 71353 }, + { 71484, 71486 }, + { 71739, 71739 }, + { 72004, 72006 }, + { 72162, 72162 }, + { 72255, 72262 }, + { 72346, 72348 }, + { 72350, 72354 }, + { 72448, 72457 }, + { 72769, 72773 }, + { 72816, 72817 }, + { 73463, 73464 }, + { 73539, 73551 }, + { 73727, 73727 }, + { 74864, 74868 }, + { 77809, 77810 }, + { 92782, 92783 }, + { 92917, 92917 }, + { 92983, 92987 }, + { 92996, 92996 }, + { 93847, 93850 }, + { 94178, 94178 }, + { 113823, 113823 }, + { 121479, 121483 }, { 125278, 125279 }, }; -static const URange16 Telugu_range16[] = { - { 3072, 3084 }, - { 3086, 3088 }, - { 3090, 3112 }, - { 3114, 3129 }, - { 3133, 3140 }, - { 3142, 3144 }, - { 3146, 3149 }, - { 3157, 3158 }, - { 3160, 3162 }, - { 3168, 3171 }, - { 3174, 3183 }, - { 3192, 3199 }, -}; -static const URange16 Cyrillic_range16[] = { - { 1024, 1156 }, - { 1159, 1327 }, - { 7296, 7304 }, - { 7467, 7467 }, - { 7544, 7544 }, - { 11744, 11775 }, - { 42560, 42655 }, - { 65070, 65071 }, -}; -static const URange32 Zanabazar_Square_range32[] = { - { 72192, 72263 }, +static const URange16 Pc_range16[] = { + { 95, 95 }, + { 8255, 8256 }, + { 8276, 8276 }, + { 65075, 65076 }, + { 65101, 65103 }, + { 65343, 65343 }, }; -static const URange16 Hangul_range16[] = { - { 4352, 4607 }, - { 12334, 12335 }, - { 12593, 12686 }, - { 12800, 12830 }, - { 12896, 12926 }, - { 43360, 43388 }, - { 44032, 55203 }, - { 55216, 55238 }, - { 55243, 55291 }, - { 65440, 65470 }, - { 65474, 65479 }, - { 65482, 65487 }, - { 65490, 65495 }, - { 65498, 65500 }, +static const URange16 Pd_range16[] = { + { 45, 45 }, + { 1418, 1418 }, + { 1470, 1470 }, + { 5120, 5120 }, + { 6150, 6150 }, + { 8208, 8213 }, + { 11799, 11799 }, + { 11802, 11802 }, + { 11834, 11835 }, + { 11840, 11840 }, + { 11869, 11869 }, + { 12316, 12316 }, + { 12336, 12336 }, + { 12448, 12448 }, + { 65073, 65074 }, + { 65112, 65112 }, + { 65123, 65123 }, + { 65293, 65293 }, }; -static const URange32 Old_South_Arabian_range32[] = { - { 68192, 68223 }, +static const URange32 Pd_range32[] = { + { 69293, 69293 }, }; -static const URange16 Ethiopic_range16[] = { - { 4608, 4680 }, - { 4682, 4685 }, - { 4688, 4694 }, - { 4696, 4696 }, - { 4698, 4701 }, - { 4704, 4744 }, - { 4746, 4749 }, - { 4752, 4784 }, - { 4786, 4789 }, - { 4792, 4798 }, - { 4800, 4800 }, - { 4802, 4805 }, - { 4808, 4822 }, - { 4824, 4880 }, - { 4882, 4885 }, - { 4888, 4954 }, - { 4957, 4988 }, - { 4992, 5017 }, - { 11648, 11670 }, - { 11680, 11686 }, - { 11688, 11694 }, - { 11696, 11702 }, - { 11704, 11710 }, - { 11712, 11718 }, - { 11720, 11726 }, - { 11728, 11734 }, - { 11736, 11742 }, - { 43777, 43782 }, - { 43785, 43790 }, - { 43793, 43798 }, - { 43808, 43814 }, - { 43816, 43822 }, +static const URange16 Pe_range16[] = { + { 41, 41 }, + { 93, 93 }, + { 125, 125 }, + { 3899, 3899 }, + { 3901, 3901 }, + { 5788, 5788 }, + { 8262, 8262 }, + { 8318, 8318 }, + { 8334, 8334 }, + { 8969, 8969 }, + { 8971, 8971 }, + { 9002, 9002 }, + { 10089, 10089 }, + { 10091, 10091 }, + { 10093, 10093 }, + { 10095, 10095 }, + { 10097, 10097 }, + { 10099, 10099 }, + { 10101, 10101 }, + { 10182, 10182 }, + { 10215, 10215 }, + { 10217, 10217 }, + { 10219, 10219 }, + { 10221, 10221 }, + { 10223, 10223 }, + { 10628, 10628 }, + { 10630, 10630 }, + { 10632, 10632 }, + { 10634, 10634 }, + { 10636, 10636 }, + { 10638, 10638 }, + { 10640, 10640 }, + { 10642, 10642 }, + { 10644, 10644 }, + { 10646, 10646 }, + { 10648, 10648 }, + { 10713, 10713 }, + { 10715, 10715 }, + { 10749, 10749 }, + { 11811, 11811 }, + { 11813, 11813 }, + { 11815, 11815 }, + { 11817, 11817 }, + { 11862, 11862 }, + { 11864, 11864 }, + { 11866, 11866 }, + { 11868, 11868 }, + { 12297, 12297 }, + { 12299, 12299 }, + { 12301, 12301 }, + { 12303, 12303 }, + { 12305, 12305 }, + { 12309, 12309 }, + { 12311, 12311 }, + { 12313, 12313 }, + { 12315, 12315 }, + { 12318, 12319 }, + { 64830, 64830 }, + { 65048, 65048 }, + { 65078, 65078 }, + { 65080, 65080 }, + { 65082, 65082 }, + { 65084, 65084 }, + { 65086, 65086 }, + { 65088, 65088 }, + { 65090, 65090 }, + { 65092, 65092 }, + { 65096, 65096 }, + { 65114, 65114 }, + { 65116, 65116 }, + { 65118, 65118 }, + { 65289, 65289 }, + { 65341, 65341 }, + { 65373, 65373 }, + { 65376, 65376 }, + { 65379, 65379 }, }; -static const URange16 Inherited_range16[] = { - { 768, 879 }, - { 1157, 1158 }, - { 1611, 1621 }, - { 1648, 1648 }, - { 2385, 2386 }, - { 6832, 6846 }, - { 7376, 7378 }, - { 7380, 7392 }, - { 7394, 7400 }, - { 7405, 7405 }, - { 7412, 7412 }, - { 7416, 7417 }, - { 7616, 7673 }, - { 7675, 7679 }, - { 8204, 8205 }, - { 8400, 8432 }, - { 12330, 12333 }, - { 12441, 12442 }, - { 65024, 65039 }, - { 65056, 65069 }, +static const URange16 Pf_range16[] = { + { 187, 187 }, + { 8217, 8217 }, + { 8221, 8221 }, + { 8250, 8250 }, + { 11779, 11779 }, + { 11781, 11781 }, + { 11786, 11786 }, + { 11789, 11789 }, + { 11805, 11805 }, + { 11809, 11809 }, }; -static const URange32 Inherited_range32[] = { - { 66045, 66045 }, - { 66272, 66272 }, - { 70459, 70459 }, - { 119143, 119145 }, - { 119163, 119170 }, - { 119173, 119179 }, - { 119210, 119213 }, - { 917760, 917999 }, +static const URange16 Pi_range16[] = { + { 171, 171 }, + { 8216, 8216 }, + { 8219, 8220 }, + { 8223, 8223 }, + { 8249, 8249 }, + { 11778, 11778 }, + { 11780, 11780 }, + { 11785, 11785 }, + { 11788, 11788 }, + { 11804, 11804 }, + { 11808, 11808 }, }; -static const URange32 Meroitic_Cursive_range32[] = { - { 68000, 68023 }, - { 68028, 68047 }, - { 68050, 68095 }, +static const URange16 Po_range16[] = { + { 33, 35 }, + { 37, 39 }, + { 42, 42 }, + { 44, 44 }, + { 46, 47 }, + { 58, 59 }, + { 63, 64 }, + { 92, 92 }, + { 161, 161 }, + { 167, 167 }, + { 182, 183 }, + { 191, 191 }, + { 894, 894 }, + { 903, 903 }, + { 1370, 1375 }, + { 1417, 1417 }, + { 1472, 1472 }, + { 1475, 1475 }, + { 1478, 1478 }, + { 1523, 1524 }, + { 1545, 1546 }, + { 1548, 1549 }, + { 1563, 1563 }, + { 1565, 1567 }, + { 1642, 1645 }, + { 1748, 1748 }, + { 1792, 1805 }, + { 2039, 2041 }, + { 2096, 2110 }, + { 2142, 2142 }, + { 2404, 2405 }, + { 2416, 2416 }, + { 2557, 2557 }, + { 2678, 2678 }, + { 2800, 2800 }, + { 3191, 3191 }, + { 3204, 3204 }, + { 3572, 3572 }, + { 3663, 3663 }, + { 3674, 3675 }, + { 3844, 3858 }, + { 3860, 3860 }, + { 3973, 3973 }, + { 4048, 4052 }, + { 4057, 4058 }, + { 4170, 4175 }, + { 4347, 4347 }, + { 4960, 4968 }, + { 5742, 5742 }, + { 5867, 5869 }, + { 5941, 5942 }, + { 6100, 6102 }, + { 6104, 6106 }, + { 6144, 6149 }, + { 6151, 6154 }, + { 6468, 6469 }, + { 6686, 6687 }, + { 6816, 6822 }, + { 6824, 6829 }, + { 7002, 7008 }, + { 7037, 7038 }, + { 7164, 7167 }, + { 7227, 7231 }, + { 7294, 7295 }, + { 7360, 7367 }, + { 7379, 7379 }, + { 8214, 8215 }, + { 8224, 8231 }, + { 8240, 8248 }, + { 8251, 8254 }, + { 8257, 8259 }, + { 8263, 8273 }, + { 8275, 8275 }, + { 8277, 8286 }, + { 11513, 11516 }, + { 11518, 11519 }, + { 11632, 11632 }, + { 11776, 11777 }, + { 11782, 11784 }, + { 11787, 11787 }, + { 11790, 11798 }, + { 11800, 11801 }, + { 11803, 11803 }, + { 11806, 11807 }, + { 11818, 11822 }, + { 11824, 11833 }, + { 11836, 11839 }, + { 11841, 11841 }, + { 11843, 11855 }, + { 11858, 11860 }, + { 12289, 12291 }, + { 12349, 12349 }, + { 12539, 12539 }, + { 42238, 42239 }, + { 42509, 42511 }, + { 42611, 42611 }, + { 42622, 42622 }, + { 42738, 42743 }, + { 43124, 43127 }, + { 43214, 43215 }, + { 43256, 43258 }, + { 43260, 43260 }, + { 43310, 43311 }, + { 43359, 43359 }, + { 43457, 43469 }, + { 43486, 43487 }, + { 43612, 43615 }, + { 43742, 43743 }, + { 43760, 43761 }, + { 44011, 44011 }, + { 65040, 65046 }, + { 65049, 65049 }, + { 65072, 65072 }, + { 65093, 65094 }, + { 65097, 65100 }, + { 65104, 65106 }, + { 65108, 65111 }, + { 65119, 65121 }, + { 65128, 65128 }, + { 65130, 65131 }, + { 65281, 65283 }, + { 65285, 65287 }, + { 65290, 65290 }, + { 65292, 65292 }, + { 65294, 65295 }, + { 65306, 65307 }, + { 65311, 65312 }, + { 65340, 65340 }, + { 65377, 65377 }, + { 65380, 65381 }, }; -static const URange32 Bhaiksuki_range32[] = { - { 72704, 72712 }, - { 72714, 72758 }, - { 72760, 72773 }, - { 72784, 72812 }, +static const URange32 Po_range32[] = { + { 65792, 65794 }, + { 66463, 66463 }, + { 66512, 66512 }, + { 66927, 66927 }, + { 67671, 67671 }, + { 67871, 67871 }, + { 67903, 67903 }, + { 68176, 68184 }, + { 68223, 68223 }, + { 68336, 68342 }, + { 68409, 68415 }, + { 68505, 68508 }, + { 69461, 69465 }, + { 69510, 69513 }, + { 69703, 69709 }, + { 69819, 69820 }, + { 69822, 69825 }, + { 69952, 69955 }, + { 70004, 70005 }, + { 70085, 70088 }, + { 70093, 70093 }, + { 70107, 70107 }, + { 70109, 70111 }, + { 70200, 70205 }, + { 70313, 70313 }, + { 70731, 70735 }, + { 70746, 70747 }, + { 70749, 70749 }, + { 70854, 70854 }, + { 71105, 71127 }, + { 71233, 71235 }, + { 71264, 71276 }, + { 71353, 71353 }, + { 71484, 71486 }, + { 71739, 71739 }, + { 72004, 72006 }, + { 72162, 72162 }, + { 72255, 72262 }, + { 72346, 72348 }, + { 72350, 72354 }, + { 72448, 72457 }, + { 72769, 72773 }, + { 72816, 72817 }, + { 73463, 73464 }, + { 73539, 73551 }, + { 73727, 73727 }, + { 74864, 74868 }, + { 77809, 77810 }, + { 92782, 92783 }, + { 92917, 92917 }, + { 92983, 92987 }, + { 92996, 92996 }, + { 93847, 93850 }, + { 94178, 94178 }, + { 113823, 113823 }, + { 121479, 121483 }, + { 125278, 125279 }, }; -static const URange32 Ahom_range32[] = { - { 71424, 71450 }, - { 71453, 71467 }, - { 71472, 71487 }, +static const URange16 Ps_range16[] = { + { 40, 40 }, + { 91, 91 }, + { 123, 123 }, + { 3898, 3898 }, + { 3900, 3900 }, + { 5787, 5787 }, + { 8218, 8218 }, + { 8222, 8222 }, + { 8261, 8261 }, + { 8317, 8317 }, + { 8333, 8333 }, + { 8968, 8968 }, + { 8970, 8970 }, + { 9001, 9001 }, + { 10088, 10088 }, + { 10090, 10090 }, + { 10092, 10092 }, + { 10094, 10094 }, + { 10096, 10096 }, + { 10098, 10098 }, + { 10100, 10100 }, + { 10181, 10181 }, + { 10214, 10214 }, + { 10216, 10216 }, + { 10218, 10218 }, + { 10220, 10220 }, + { 10222, 10222 }, + { 10627, 10627 }, + { 10629, 10629 }, + { 10631, 10631 }, + { 10633, 10633 }, + { 10635, 10635 }, + { 10637, 10637 }, + { 10639, 10639 }, + { 10641, 10641 }, + { 10643, 10643 }, + { 10645, 10645 }, + { 10647, 10647 }, + { 10712, 10712 }, + { 10714, 10714 }, + { 10748, 10748 }, + { 11810, 11810 }, + { 11812, 11812 }, + { 11814, 11814 }, + { 11816, 11816 }, + { 11842, 11842 }, + { 11861, 11861 }, + { 11863, 11863 }, + { 11865, 11865 }, + { 11867, 11867 }, + { 12296, 12296 }, + { 12298, 12298 }, + { 12300, 12300 }, + { 12302, 12302 }, + { 12304, 12304 }, + { 12308, 12308 }, + { 12310, 12310 }, + { 12312, 12312 }, + { 12314, 12314 }, + { 12317, 12317 }, + { 64831, 64831 }, + { 65047, 65047 }, + { 65077, 65077 }, + { 65079, 65079 }, + { 65081, 65081 }, + { 65083, 65083 }, + { 65085, 65085 }, + { 65087, 65087 }, + { 65089, 65089 }, + { 65091, 65091 }, + { 65095, 65095 }, + { 65113, 65113 }, + { 65115, 65115 }, + { 65117, 65117 }, + { 65288, 65288 }, + { 65339, 65339 }, + { 65371, 65371 }, + { 65375, 65375 }, + { 65378, 65378 }, }; -static const URange16 Han_range16[] = { +static const URange16 S_range16[] = { + { 36, 36 }, + { 43, 43 }, + { 60, 62 }, + { 94, 94 }, + { 96, 96 }, + { 124, 124 }, + { 126, 126 }, + { 162, 166 }, + { 168, 169 }, + { 172, 172 }, + { 174, 177 }, + { 180, 180 }, + { 184, 184 }, + { 215, 215 }, + { 247, 247 }, + { 706, 709 }, + { 722, 735 }, + { 741, 747 }, + { 749, 749 }, + { 751, 767 }, + { 885, 885 }, + { 900, 901 }, + { 1014, 1014 }, + { 1154, 1154 }, + { 1421, 1423 }, + { 1542, 1544 }, + { 1547, 1547 }, + { 1550, 1551 }, + { 1758, 1758 }, + { 1769, 1769 }, + { 1789, 1790 }, + { 2038, 2038 }, + { 2046, 2047 }, + { 2184, 2184 }, + { 2546, 2547 }, + { 2554, 2555 }, + { 2801, 2801 }, + { 2928, 2928 }, + { 3059, 3066 }, + { 3199, 3199 }, + { 3407, 3407 }, + { 3449, 3449 }, + { 3647, 3647 }, + { 3841, 3843 }, + { 3859, 3859 }, + { 3861, 3863 }, + { 3866, 3871 }, + { 3892, 3892 }, + { 3894, 3894 }, + { 3896, 3896 }, + { 4030, 4037 }, + { 4039, 4044 }, + { 4046, 4047 }, + { 4053, 4056 }, + { 4254, 4255 }, + { 5008, 5017 }, + { 5741, 5741 }, + { 6107, 6107 }, + { 6464, 6464 }, + { 6622, 6655 }, + { 7009, 7018 }, + { 7028, 7036 }, + { 8125, 8125 }, + { 8127, 8129 }, + { 8141, 8143 }, + { 8157, 8159 }, + { 8173, 8175 }, + { 8189, 8190 }, + { 8260, 8260 }, + { 8274, 8274 }, + { 8314, 8316 }, + { 8330, 8332 }, + { 8352, 8384 }, + { 8448, 8449 }, + { 8451, 8454 }, + { 8456, 8457 }, + { 8468, 8468 }, + { 8470, 8472 }, + { 8478, 8483 }, + { 8485, 8485 }, + { 8487, 8487 }, + { 8489, 8489 }, + { 8494, 8494 }, + { 8506, 8507 }, + { 8512, 8516 }, + { 8522, 8525 }, + { 8527, 8527 }, + { 8586, 8587 }, + { 8592, 8967 }, + { 8972, 9000 }, + { 9003, 9254 }, + { 9280, 9290 }, + { 9372, 9449 }, + { 9472, 10087 }, + { 10132, 10180 }, + { 10183, 10213 }, + { 10224, 10626 }, + { 10649, 10711 }, + { 10716, 10747 }, + { 10750, 11123 }, + { 11126, 11157 }, + { 11159, 11263 }, + { 11493, 11498 }, + { 11856, 11857 }, { 11904, 11929 }, { 11931, 12019 }, { 12032, 12245 }, - { 12293, 12293 }, - { 12295, 12295 }, - { 12321, 12329 }, - { 12344, 12347 }, - { 13312, 19893 }, - { 19968, 40943 }, - { 63744, 64109 }, - { 64112, 64217 }, -}; -static const URange32 Han_range32[] = { - { 131072, 173782 }, - { 173824, 177972 }, - { 177984, 178205 }, - { 178208, 183969 }, - { 183984, 191456 }, - { 194560, 195101 }, -}; -static const URange32 Old_North_Arabian_range32[] = { - { 68224, 68255 }, -}; -static const URange16 Armenian_range16[] = { - { 1329, 1366 }, - { 1369, 1416 }, - { 1418, 1418 }, - { 1421, 1423 }, - { 64275, 64279 }, -}; -static const URange16 Tamil_range16[] = { - { 2946, 2947 }, - { 2949, 2954 }, - { 2958, 2960 }, - { 2962, 2965 }, - { 2969, 2970 }, - { 2972, 2972 }, - { 2974, 2975 }, - { 2979, 2980 }, - { 2984, 2986 }, - { 2990, 3001 }, - { 3006, 3010 }, - { 3014, 3016 }, - { 3018, 3021 }, - { 3024, 3024 }, - { 3031, 3031 }, - { 3046, 3066 }, -}; -static const URange16 Bopomofo_range16[] = { - { 746, 747 }, - { 12549, 12591 }, - { 12704, 12730 }, -}; -static const URange32 Bassa_Vah_range32[] = { - { 92880, 92909 }, - { 92912, 92917 }, -}; -static const URange16 Sundanese_range16[] = { - { 7040, 7103 }, - { 7360, 7367 }, -}; -static const URange32 Osage_range32[] = { - { 66736, 66771 }, - { 66776, 66811 }, -}; -static const URange32 Old_Sogdian_range32[] = { - { 69376, 69415 }, -}; -static const URange16 Tagalog_range16[] = { - { 5888, 5900 }, - { 5902, 5908 }, + { 12272, 12283 }, + { 12292, 12292 }, + { 12306, 12307 }, + { 12320, 12320 }, + { 12342, 12343 }, + { 12350, 12351 }, + { 12443, 12444 }, + { 12688, 12689 }, + { 12694, 12703 }, + { 12736, 12771 }, + { 12800, 12830 }, + { 12842, 12871 }, + { 12880, 12880 }, + { 12896, 12927 }, + { 12938, 12976 }, + { 12992, 13311 }, + { 19904, 19967 }, + { 42128, 42182 }, + { 42752, 42774 }, + { 42784, 42785 }, + { 42889, 42890 }, + { 43048, 43051 }, + { 43062, 43065 }, + { 43639, 43641 }, + { 43867, 43867 }, + { 43882, 43883 }, + { 64297, 64297 }, + { 64434, 64450 }, + { 64832, 64847 }, + { 64975, 64975 }, + { 65020, 65023 }, + { 65122, 65122 }, + { 65124, 65126 }, + { 65129, 65129 }, + { 65284, 65284 }, + { 65291, 65291 }, + { 65308, 65310 }, + { 65342, 65342 }, + { 65344, 65344 }, + { 65372, 65372 }, + { 65374, 65374 }, + { 65504, 65510 }, + { 65512, 65518 }, + { 65532, 65533 }, }; -static const URange16 Malayalam_range16[] = { - { 3328, 3331 }, - { 3333, 3340 }, - { 3342, 3344 }, - { 3346, 3396 }, - { 3398, 3400 }, - { 3402, 3407 }, - { 3412, 3427 }, - { 3430, 3455 }, +static const URange32 S_range32[] = { + { 65847, 65855 }, + { 65913, 65929 }, + { 65932, 65934 }, + { 65936, 65948 }, + { 65952, 65952 }, + { 66000, 66044 }, + { 67703, 67704 }, + { 68296, 68296 }, + { 71487, 71487 }, + { 73685, 73713 }, + { 92988, 92991 }, + { 92997, 92997 }, + { 113820, 113820 }, + { 118608, 118723 }, + { 118784, 119029 }, + { 119040, 119078 }, + { 119081, 119140 }, + { 119146, 119148 }, + { 119171, 119172 }, + { 119180, 119209 }, + { 119214, 119274 }, + { 119296, 119361 }, + { 119365, 119365 }, + { 119552, 119638 }, + { 120513, 120513 }, + { 120539, 120539 }, + { 120571, 120571 }, + { 120597, 120597 }, + { 120629, 120629 }, + { 120655, 120655 }, + { 120687, 120687 }, + { 120713, 120713 }, + { 120745, 120745 }, + { 120771, 120771 }, + { 120832, 121343 }, + { 121399, 121402 }, + { 121453, 121460 }, + { 121462, 121475 }, + { 121477, 121478 }, + { 123215, 123215 }, + { 123647, 123647 }, + { 126124, 126124 }, + { 126128, 126128 }, + { 126254, 126254 }, + { 126704, 126705 }, + { 126976, 127019 }, + { 127024, 127123 }, + { 127136, 127150 }, + { 127153, 127167 }, + { 127169, 127183 }, + { 127185, 127221 }, + { 127245, 127405 }, + { 127462, 127490 }, + { 127504, 127547 }, + { 127552, 127560 }, + { 127568, 127569 }, + { 127584, 127589 }, + { 127744, 128727 }, + { 128732, 128748 }, + { 128752, 128764 }, + { 128768, 128886 }, + { 128891, 128985 }, + { 128992, 129003 }, + { 129008, 129008 }, + { 129024, 129035 }, + { 129040, 129095 }, + { 129104, 129113 }, + { 129120, 129159 }, + { 129168, 129197 }, + { 129200, 129201 }, + { 129280, 129619 }, + { 129632, 129645 }, + { 129648, 129660 }, + { 129664, 129672 }, + { 129680, 129725 }, + { 129727, 129733 }, + { 129742, 129755 }, + { 129760, 129768 }, + { 129776, 129784 }, + { 129792, 129938 }, + { 129940, 129994 }, }; -static const URange32 Marchen_range32[] = { - { 72816, 72847 }, - { 72850, 72871 }, - { 72873, 72886 }, +static const URange16 Sc_range16[] = { + { 36, 36 }, + { 162, 165 }, + { 1423, 1423 }, + { 1547, 1547 }, + { 2046, 2047 }, + { 2546, 2547 }, + { 2555, 2555 }, + { 2801, 2801 }, + { 3065, 3065 }, + { 3647, 3647 }, + { 6107, 6107 }, + { 8352, 8384 }, + { 43064, 43064 }, + { 65020, 65020 }, + { 65129, 65129 }, + { 65284, 65284 }, + { 65504, 65505 }, + { 65509, 65510 }, }; -static const URange32 Carian_range32[] = { - { 66208, 66256 }, +static const URange32 Sc_range32[] = { + { 73693, 73696 }, + { 123647, 123647 }, + { 126128, 126128 }, }; -static const URange16 Hiragana_range16[] = { - { 12353, 12438 }, - { 12445, 12447 }, +static const URange16 Sk_range16[] = { + { 94, 94 }, + { 96, 96 }, + { 168, 168 }, + { 175, 175 }, + { 180, 180 }, + { 184, 184 }, + { 706, 709 }, + { 722, 735 }, + { 741, 747 }, + { 749, 749 }, + { 751, 767 }, + { 885, 885 }, + { 900, 901 }, + { 2184, 2184 }, + { 8125, 8125 }, + { 8127, 8129 }, + { 8141, 8143 }, + { 8157, 8159 }, + { 8173, 8175 }, + { 8189, 8190 }, + { 12443, 12444 }, + { 42752, 42774 }, + { 42784, 42785 }, + { 42889, 42890 }, + { 43867, 43867 }, + { 43882, 43883 }, + { 64434, 64450 }, + { 65342, 65342 }, + { 65344, 65344 }, + { 65507, 65507 }, }; -static const URange32 Hiragana_range32[] = { - { 110593, 110878 }, - { 127488, 127488 }, +static const URange32 Sk_range32[] = { + { 127995, 127999 }, }; -static const URange16 Tagbanwa_range16[] = { - { 5984, 5996 }, - { 5998, 6000 }, - { 6002, 6003 }, +static const URange16 Sm_range16[] = { + { 43, 43 }, + { 60, 62 }, + { 124, 124 }, + { 126, 126 }, + { 172, 172 }, + { 177, 177 }, + { 215, 215 }, + { 247, 247 }, + { 1014, 1014 }, + { 1542, 1544 }, + { 8260, 8260 }, + { 8274, 8274 }, + { 8314, 8316 }, + { 8330, 8332 }, + { 8472, 8472 }, + { 8512, 8516 }, + { 8523, 8523 }, + { 8592, 8596 }, + { 8602, 8603 }, + { 8608, 8608 }, + { 8611, 8611 }, + { 8614, 8614 }, + { 8622, 8622 }, + { 8654, 8655 }, + { 8658, 8658 }, + { 8660, 8660 }, + { 8692, 8959 }, + { 8992, 8993 }, + { 9084, 9084 }, + { 9115, 9139 }, + { 9180, 9185 }, + { 9655, 9655 }, + { 9665, 9665 }, + { 9720, 9727 }, + { 9839, 9839 }, + { 10176, 10180 }, + { 10183, 10213 }, + { 10224, 10239 }, + { 10496, 10626 }, + { 10649, 10711 }, + { 10716, 10747 }, + { 10750, 11007 }, + { 11056, 11076 }, + { 11079, 11084 }, + { 64297, 64297 }, + { 65122, 65122 }, + { 65124, 65126 }, + { 65291, 65291 }, + { 65308, 65310 }, + { 65372, 65372 }, + { 65374, 65374 }, + { 65506, 65506 }, + { 65513, 65516 }, }; -static const URange16 Meetei_Mayek_range16[] = { - { 43744, 43766 }, - { 43968, 44013 }, - { 44016, 44025 }, +static const URange32 Sm_range32[] = { + { 120513, 120513 }, + { 120539, 120539 }, + { 120571, 120571 }, + { 120597, 120597 }, + { 120629, 120629 }, + { 120655, 120655 }, + { 120687, 120687 }, + { 120713, 120713 }, + { 120745, 120745 }, + { 120771, 120771 }, + { 126704, 126705 }, }; -static const URange32 Hanifi_Rohingya_range32[] = { - { 68864, 68903 }, - { 68912, 68921 }, +static const URange16 So_range16[] = { + { 166, 166 }, + { 169, 169 }, + { 174, 174 }, + { 176, 176 }, + { 1154, 1154 }, + { 1421, 1422 }, + { 1550, 1551 }, + { 1758, 1758 }, + { 1769, 1769 }, + { 1789, 1790 }, + { 2038, 2038 }, + { 2554, 2554 }, + { 2928, 2928 }, + { 3059, 3064 }, + { 3066, 3066 }, + { 3199, 3199 }, + { 3407, 3407 }, + { 3449, 3449 }, + { 3841, 3843 }, + { 3859, 3859 }, + { 3861, 3863 }, + { 3866, 3871 }, + { 3892, 3892 }, + { 3894, 3894 }, + { 3896, 3896 }, + { 4030, 4037 }, + { 4039, 4044 }, + { 4046, 4047 }, + { 4053, 4056 }, + { 4254, 4255 }, + { 5008, 5017 }, + { 5741, 5741 }, + { 6464, 6464 }, + { 6622, 6655 }, + { 7009, 7018 }, + { 7028, 7036 }, + { 8448, 8449 }, + { 8451, 8454 }, + { 8456, 8457 }, + { 8468, 8468 }, + { 8470, 8471 }, + { 8478, 8483 }, + { 8485, 8485 }, + { 8487, 8487 }, + { 8489, 8489 }, + { 8494, 8494 }, + { 8506, 8507 }, + { 8522, 8522 }, + { 8524, 8525 }, + { 8527, 8527 }, + { 8586, 8587 }, + { 8597, 8601 }, + { 8604, 8607 }, + { 8609, 8610 }, + { 8612, 8613 }, + { 8615, 8621 }, + { 8623, 8653 }, + { 8656, 8657 }, + { 8659, 8659 }, + { 8661, 8691 }, + { 8960, 8967 }, + { 8972, 8991 }, + { 8994, 9000 }, + { 9003, 9083 }, + { 9085, 9114 }, + { 9140, 9179 }, + { 9186, 9254 }, + { 9280, 9290 }, + { 9372, 9449 }, + { 9472, 9654 }, + { 9656, 9664 }, + { 9666, 9719 }, + { 9728, 9838 }, + { 9840, 10087 }, + { 10132, 10175 }, + { 10240, 10495 }, + { 11008, 11055 }, + { 11077, 11078 }, + { 11085, 11123 }, + { 11126, 11157 }, + { 11159, 11263 }, + { 11493, 11498 }, + { 11856, 11857 }, + { 11904, 11929 }, + { 11931, 12019 }, + { 12032, 12245 }, + { 12272, 12283 }, + { 12292, 12292 }, + { 12306, 12307 }, + { 12320, 12320 }, + { 12342, 12343 }, + { 12350, 12351 }, + { 12688, 12689 }, + { 12694, 12703 }, + { 12736, 12771 }, + { 12800, 12830 }, + { 12842, 12871 }, + { 12880, 12880 }, + { 12896, 12927 }, + { 12938, 12976 }, + { 12992, 13311 }, + { 19904, 19967 }, + { 42128, 42182 }, + { 43048, 43051 }, + { 43062, 43063 }, + { 43065, 43065 }, + { 43639, 43641 }, + { 64832, 64847 }, + { 64975, 64975 }, + { 65021, 65023 }, + { 65508, 65508 }, + { 65512, 65512 }, + { 65517, 65518 }, + { 65532, 65533 }, }; -static const URange32 Pahawh_Hmong_range32[] = { - { 92928, 92997 }, - { 93008, 93017 }, - { 93019, 93025 }, - { 93027, 93047 }, - { 93053, 93071 }, +static const URange32 So_range32[] = { + { 65847, 65855 }, + { 65913, 65929 }, + { 65932, 65934 }, + { 65936, 65948 }, + { 65952, 65952 }, + { 66000, 66044 }, + { 67703, 67704 }, + { 68296, 68296 }, + { 71487, 71487 }, + { 73685, 73692 }, + { 73697, 73713 }, + { 92988, 92991 }, + { 92997, 92997 }, + { 113820, 113820 }, + { 118608, 118723 }, + { 118784, 119029 }, + { 119040, 119078 }, + { 119081, 119140 }, + { 119146, 119148 }, + { 119171, 119172 }, + { 119180, 119209 }, + { 119214, 119274 }, + { 119296, 119361 }, + { 119365, 119365 }, + { 119552, 119638 }, + { 120832, 121343 }, + { 121399, 121402 }, + { 121453, 121460 }, + { 121462, 121475 }, + { 121477, 121478 }, + { 123215, 123215 }, + { 126124, 126124 }, + { 126254, 126254 }, + { 126976, 127019 }, + { 127024, 127123 }, + { 127136, 127150 }, + { 127153, 127167 }, + { 127169, 127183 }, + { 127185, 127221 }, + { 127245, 127405 }, + { 127462, 127490 }, + { 127504, 127547 }, + { 127552, 127560 }, + { 127568, 127569 }, + { 127584, 127589 }, + { 127744, 127994 }, + { 128000, 128727 }, + { 128732, 128748 }, + { 128752, 128764 }, + { 128768, 128886 }, + { 128891, 128985 }, + { 128992, 129003 }, + { 129008, 129008 }, + { 129024, 129035 }, + { 129040, 129095 }, + { 129104, 129113 }, + { 129120, 129159 }, + { 129168, 129197 }, + { 129200, 129201 }, + { 129280, 129619 }, + { 129632, 129645 }, + { 129648, 129660 }, + { 129664, 129672 }, + { 129680, 129725 }, + { 129727, 129733 }, + { 129742, 129755 }, + { 129760, 129768 }, + { 129776, 129784 }, + { 129792, 129938 }, + { 129940, 129994 }, }; -static const URange16 Tai_Le_range16[] = { - { 6480, 6509 }, - { 6512, 6516 }, +static const URange16 Z_range16[] = { + { 32, 32 }, + { 160, 160 }, + { 5760, 5760 }, + { 8192, 8202 }, + { 8232, 8233 }, + { 8239, 8239 }, + { 8287, 8287 }, + { 12288, 12288 }, }; -static const URange16 Kayah_Li_range16[] = { - { 43264, 43309 }, - { 43311, 43311 }, +static const URange16 Zl_range16[] = { + { 8232, 8232 }, }; -static const URange16 Buginese_range16[] = { - { 6656, 6683 }, - { 6686, 6687 }, +static const URange16 Zp_range16[] = { + { 8233, 8233 }, }; -static const URange32 Kharoshthi_range32[] = { - { 68096, 68099 }, - { 68101, 68102 }, - { 68108, 68115 }, - { 68117, 68119 }, - { 68121, 68149 }, - { 68152, 68154 }, - { 68159, 68168 }, - { 68176, 68184 }, +static const URange16 Zs_range16[] = { + { 32, 32 }, + { 160, 160 }, + { 5760, 5760 }, + { 8192, 8202 }, + { 8239, 8239 }, + { 8287, 8287 }, + { 12288, 12288 }, }; -static const URange16 Tai_Tham_range16[] = { - { 6688, 6750 }, - { 6752, 6780 }, - { 6783, 6793 }, - { 6800, 6809 }, - { 6816, 6829 }, +static const URange32 Adlam_range32[] = { + { 125184, 125259 }, + { 125264, 125273 }, + { 125278, 125279 }, }; -static const URange32 Old_Italic_range32[] = { - { 66304, 66339 }, - { 66349, 66351 }, +static const URange32 Ahom_range32[] = { + { 71424, 71450 }, + { 71453, 71467 }, + { 71472, 71494 }, }; -static const URange32 Old_Persian_range32[] = { - { 66464, 66499 }, - { 66504, 66517 }, +static const URange32 Anatolian_Hieroglyphs_range32[] = { + { 82944, 83526 }, }; -static const URange32 Warang_Citi_range32[] = { - { 71840, 71922 }, - { 71935, 71935 }, +static const URange16 Arabic_range16[] = { + { 1536, 1540 }, + { 1542, 1547 }, + { 1549, 1562 }, + { 1564, 1566 }, + { 1568, 1599 }, + { 1601, 1610 }, + { 1622, 1647 }, + { 1649, 1756 }, + { 1758, 1791 }, + { 1872, 1919 }, + { 2160, 2190 }, + { 2192, 2193 }, + { 2200, 2273 }, + { 2275, 2303 }, + { 64336, 64450 }, + { 64467, 64829 }, + { 64832, 64911 }, + { 64914, 64967 }, + { 64975, 64975 }, + { 65008, 65023 }, + { 65136, 65140 }, + { 65142, 65276 }, }; -static const URange16 Latin_range16[] = { - { 65, 90 }, - { 97, 122 }, - { 170, 170 }, - { 186, 186 }, - { 192, 214 }, - { 216, 246 }, - { 248, 696 }, - { 736, 740 }, - { 7424, 7461 }, - { 7468, 7516 }, - { 7522, 7525 }, - { 7531, 7543 }, - { 7545, 7614 }, - { 7680, 7935 }, - { 8305, 8305 }, - { 8319, 8319 }, - { 8336, 8348 }, - { 8490, 8491 }, - { 8498, 8498 }, - { 8526, 8526 }, - { 8544, 8584 }, - { 11360, 11391 }, - { 42786, 42887 }, - { 42891, 42937 }, - { 42999, 43007 }, - { 43824, 43866 }, - { 43868, 43876 }, - { 64256, 64262 }, - { 65313, 65338 }, - { 65345, 65370 }, +static const URange32 Arabic_range32[] = { + { 69216, 69246 }, + { 69373, 69375 }, + { 126464, 126467 }, + { 126469, 126495 }, + { 126497, 126498 }, + { 126500, 126500 }, + { 126503, 126503 }, + { 126505, 126514 }, + { 126516, 126519 }, + { 126521, 126521 }, + { 126523, 126523 }, + { 126530, 126530 }, + { 126535, 126535 }, + { 126537, 126537 }, + { 126539, 126539 }, + { 126541, 126543 }, + { 126545, 126546 }, + { 126548, 126548 }, + { 126551, 126551 }, + { 126553, 126553 }, + { 126555, 126555 }, + { 126557, 126557 }, + { 126559, 126559 }, + { 126561, 126562 }, + { 126564, 126564 }, + { 126567, 126570 }, + { 126572, 126578 }, + { 126580, 126583 }, + { 126585, 126588 }, + { 126590, 126590 }, + { 126592, 126601 }, + { 126603, 126619 }, + { 126625, 126627 }, + { 126629, 126633 }, + { 126635, 126651 }, + { 126704, 126705 }, }; -static const URange16 Saurashtra_range16[] = { - { 43136, 43205 }, - { 43214, 43225 }, +static const URange16 Armenian_range16[] = { + { 1329, 1366 }, + { 1369, 1418 }, + { 1421, 1423 }, + { 64275, 64279 }, }; -static const URange32 Shavian_range32[] = { - { 66640, 66687 }, +static const URange32 Avestan_range32[] = { + { 68352, 68405 }, + { 68409, 68415 }, }; -static const URange16 Georgian_range16[] = { - { 4256, 4293 }, - { 4295, 4295 }, - { 4301, 4301 }, - { 4304, 4346 }, - { 4348, 4351 }, - { 7312, 7354 }, - { 7357, 7359 }, - { 11520, 11557 }, - { 11559, 11559 }, - { 11565, 11565 }, +static const URange16 Balinese_range16[] = { + { 6912, 6988 }, + { 6992, 7038 }, }; -static const URange32 Grantha_range32[] = { - { 70400, 70403 }, - { 70405, 70412 }, - { 70415, 70416 }, - { 70419, 70440 }, - { 70442, 70448 }, - { 70450, 70451 }, - { 70453, 70457 }, - { 70460, 70468 }, - { 70471, 70472 }, - { 70475, 70477 }, - { 70480, 70480 }, - { 70487, 70487 }, - { 70493, 70499 }, - { 70502, 70508 }, - { 70512, 70516 }, +static const URange16 Bamum_range16[] = { + { 42656, 42743 }, }; -static const URange32 Duployan_range32[] = { - { 113664, 113770 }, - { 113776, 113788 }, - { 113792, 113800 }, - { 113808, 113817 }, - { 113820, 113823 }, +static const URange32 Bamum_range32[] = { + { 92160, 92728 }, +}; +static const URange32 Bassa_Vah_range32[] = { + { 92880, 92909 }, + { 92912, 92917 }, }; static const URange16 Batak_range16[] = { { 7104, 7155 }, { 7164, 7167 }, }; -static const URange16 Devanagari_range16[] = { - { 2304, 2384 }, - { 2387, 2403 }, - { 2406, 2431 }, - { 43232, 43263 }, -}; -static const URange16 Thai_range16[] = { - { 3585, 3642 }, - { 3648, 3675 }, +static const URange16 Bengali_range16[] = { + { 2432, 2435 }, + { 2437, 2444 }, + { 2447, 2448 }, + { 2451, 2472 }, + { 2474, 2480 }, + { 2482, 2482 }, + { 2486, 2489 }, + { 2492, 2500 }, + { 2503, 2504 }, + { 2507, 2510 }, + { 2519, 2519 }, + { 2524, 2525 }, + { 2527, 2531 }, + { 2534, 2558 }, }; -static const URange16 Tibetan_range16[] = { - { 3840, 3911 }, - { 3913, 3948 }, - { 3953, 3991 }, - { 3993, 4028 }, - { 4030, 4044 }, - { 4046, 4052 }, - { 4057, 4058 }, +static const URange32 Bhaiksuki_range32[] = { + { 72704, 72712 }, + { 72714, 72758 }, + { 72760, 72773 }, + { 72784, 72812 }, }; -static const URange16 Tifinagh_range16[] = { - { 11568, 11623 }, - { 11631, 11632 }, - { 11647, 11647 }, +static const URange16 Bopomofo_range16[] = { + { 746, 747 }, + { 12549, 12591 }, + { 12704, 12735 }, }; -static const URange32 Ugaritic_range32[] = { - { 66432, 66461 }, - { 66463, 66463 }, +static const URange32 Brahmi_range32[] = { + { 69632, 69709 }, + { 69714, 69749 }, + { 69759, 69759 }, }; static const URange16 Braille_range16[] = { { 10240, 10495 }, }; -static const URange32 Anatolian_Hieroglyphs_range32[] = { - { 82944, 83526 }, +static const URange16 Buginese_range16[] = { + { 6656, 6683 }, + { 6686, 6687 }, }; -static const URange16 Greek_range16[] = { - { 880, 883 }, - { 885, 887 }, - { 890, 893 }, - { 895, 895 }, - { 900, 900 }, - { 902, 902 }, - { 904, 906 }, - { 908, 908 }, - { 910, 929 }, - { 931, 993 }, - { 1008, 1023 }, - { 7462, 7466 }, - { 7517, 7521 }, - { 7526, 7530 }, - { 7615, 7615 }, - { 7936, 7957 }, - { 7960, 7965 }, - { 7968, 8005 }, - { 8008, 8013 }, - { 8016, 8023 }, - { 8025, 8025 }, - { 8027, 8027 }, - { 8029, 8029 }, - { 8031, 8061 }, - { 8064, 8116 }, - { 8118, 8132 }, - { 8134, 8147 }, - { 8150, 8155 }, - { 8157, 8175 }, - { 8178, 8180 }, - { 8182, 8190 }, - { 8486, 8486 }, - { 43877, 43877 }, +static const URange16 Buhid_range16[] = { + { 5952, 5971 }, }; -static const URange32 Greek_range32[] = { - { 65856, 65934 }, - { 65952, 65952 }, - { 119296, 119365 }, +static const URange16 Canadian_Aboriginal_range16[] = { + { 5120, 5759 }, + { 6320, 6389 }, }; -static const URange32 Lycian_range32[] = { - { 66176, 66204 }, +static const URange32 Canadian_Aboriginal_range32[] = { + { 72368, 72383 }, +}; +static const URange32 Carian_range32[] = { + { 66208, 66256 }, +}; +static const URange32 Caucasian_Albanian_range32[] = { + { 66864, 66915 }, + { 66927, 66927 }, +}; +static const URange32 Chakma_range32[] = { + { 69888, 69940 }, + { 69942, 69959 }, +}; +static const URange16 Cham_range16[] = { + { 43520, 43574 }, + { 43584, 43597 }, + { 43600, 43609 }, + { 43612, 43615 }, +}; +static const URange16 Cherokee_range16[] = { + { 5024, 5109 }, + { 5112, 5117 }, + { 43888, 43967 }, +}; +static const URange32 Chorasmian_range32[] = { + { 69552, 69579 }, +}; +static const URange16 Common_range16[] = { + { 0, 64 }, + { 91, 96 }, + { 123, 169 }, + { 171, 185 }, + { 187, 191 }, + { 215, 215 }, + { 247, 247 }, + { 697, 735 }, + { 741, 745 }, + { 748, 767 }, + { 884, 884 }, + { 894, 894 }, + { 901, 901 }, + { 903, 903 }, + { 1541, 1541 }, + { 1548, 1548 }, + { 1563, 1563 }, + { 1567, 1567 }, + { 1600, 1600 }, + { 1757, 1757 }, + { 2274, 2274 }, + { 2404, 2405 }, + { 3647, 3647 }, + { 4053, 4056 }, + { 4347, 4347 }, + { 5867, 5869 }, + { 5941, 5942 }, + { 6146, 6147 }, + { 6149, 6149 }, + { 7379, 7379 }, + { 7393, 7393 }, + { 7401, 7404 }, + { 7406, 7411 }, + { 7413, 7415 }, + { 7418, 7418 }, + { 8192, 8203 }, + { 8206, 8292 }, + { 8294, 8304 }, + { 8308, 8318 }, + { 8320, 8334 }, + { 8352, 8384 }, + { 8448, 8485 }, + { 8487, 8489 }, + { 8492, 8497 }, + { 8499, 8525 }, + { 8527, 8543 }, + { 8585, 8587 }, + { 8592, 9254 }, + { 9280, 9290 }, + { 9312, 10239 }, + { 10496, 11123 }, + { 11126, 11157 }, + { 11159, 11263 }, + { 11776, 11869 }, + { 12272, 12283 }, + { 12288, 12292 }, + { 12294, 12294 }, + { 12296, 12320 }, + { 12336, 12343 }, + { 12348, 12351 }, + { 12443, 12444 }, + { 12448, 12448 }, + { 12539, 12540 }, + { 12688, 12703 }, + { 12736, 12771 }, + { 12832, 12895 }, + { 12927, 13007 }, + { 13055, 13055 }, + { 13144, 13311 }, + { 19904, 19967 }, + { 42752, 42785 }, + { 42888, 42890 }, + { 43056, 43065 }, + { 43310, 43310 }, + { 43471, 43471 }, + { 43867, 43867 }, + { 43882, 43883 }, + { 64830, 64831 }, + { 65040, 65049 }, + { 65072, 65106 }, + { 65108, 65126 }, + { 65128, 65131 }, + { 65279, 65279 }, + { 65281, 65312 }, + { 65339, 65344 }, + { 65371, 65381 }, + { 65392, 65392 }, + { 65438, 65439 }, + { 65504, 65510 }, + { 65512, 65518 }, + { 65529, 65533 }, }; -static const URange32 Mende_Kikakui_range32[] = { - { 124928, 125124 }, - { 125127, 125142 }, +static const URange32 Common_range32[] = { + { 65792, 65794 }, + { 65799, 65843 }, + { 65847, 65855 }, + { 65936, 65948 }, + { 66000, 66044 }, + { 66273, 66299 }, + { 113824, 113827 }, + { 118608, 118723 }, + { 118784, 119029 }, + { 119040, 119078 }, + { 119081, 119142 }, + { 119146, 119162 }, + { 119171, 119172 }, + { 119180, 119209 }, + { 119214, 119274 }, + { 119488, 119507 }, + { 119520, 119539 }, + { 119552, 119638 }, + { 119648, 119672 }, + { 119808, 119892 }, + { 119894, 119964 }, + { 119966, 119967 }, + { 119970, 119970 }, + { 119973, 119974 }, + { 119977, 119980 }, + { 119982, 119993 }, + { 119995, 119995 }, + { 119997, 120003 }, + { 120005, 120069 }, + { 120071, 120074 }, + { 120077, 120084 }, + { 120086, 120092 }, + { 120094, 120121 }, + { 120123, 120126 }, + { 120128, 120132 }, + { 120134, 120134 }, + { 120138, 120144 }, + { 120146, 120485 }, + { 120488, 120779 }, + { 120782, 120831 }, + { 126065, 126132 }, + { 126209, 126269 }, + { 126976, 127019 }, + { 127024, 127123 }, + { 127136, 127150 }, + { 127153, 127167 }, + { 127169, 127183 }, + { 127185, 127221 }, + { 127232, 127405 }, + { 127462, 127487 }, + { 127489, 127490 }, + { 127504, 127547 }, + { 127552, 127560 }, + { 127568, 127569 }, + { 127584, 127589 }, + { 127744, 128727 }, + { 128732, 128748 }, + { 128752, 128764 }, + { 128768, 128886 }, + { 128891, 128985 }, + { 128992, 129003 }, + { 129008, 129008 }, + { 129024, 129035 }, + { 129040, 129095 }, + { 129104, 129113 }, + { 129120, 129159 }, + { 129168, 129197 }, + { 129200, 129201 }, + { 129280, 129619 }, + { 129632, 129645 }, + { 129648, 129660 }, + { 129664, 129672 }, + { 129680, 129725 }, + { 129727, 129733 }, + { 129742, 129755 }, + { 129760, 129768 }, + { 129776, 129784 }, + { 129792, 129938 }, + { 129940, 129994 }, + { 130032, 130041 }, + { 917505, 917505 }, + { 917536, 917631 }, }; -static const URange16 Tai_Viet_range16[] = { - { 43648, 43714 }, - { 43739, 43743 }, +static const URange16 Coptic_range16[] = { + { 994, 1007 }, + { 11392, 11507 }, + { 11513, 11519 }, }; -static const URange16 Vai_range16[] = { - { 42240, 42539 }, +static const URange32 Cuneiform_range32[] = { + { 73728, 74649 }, + { 74752, 74862 }, + { 74864, 74868 }, + { 74880, 75075 }, }; -static const URange16 Ogham_range16[] = { - { 5760, 5788 }, +static const URange32 Cypriot_range32[] = { + { 67584, 67589 }, + { 67592, 67592 }, + { 67594, 67637 }, + { 67639, 67640 }, + { 67644, 67644 }, + { 67647, 67647 }, }; -static const URange32 Inscriptional_Parthian_range32[] = { - { 68416, 68437 }, - { 68440, 68447 }, +static const URange32 Cypro_Minoan_range32[] = { + { 77712, 77810 }, }; -static const URange16 Cham_range16[] = { - { 43520, 43574 }, - { 43584, 43597 }, - { 43600, 43609 }, - { 43612, 43615 }, +static const URange16 Cyrillic_range16[] = { + { 1024, 1156 }, + { 1159, 1327 }, + { 7296, 7304 }, + { 7467, 7467 }, + { 7544, 7544 }, + { 11744, 11775 }, + { 42560, 42655 }, + { 65070, 65071 }, }; -static const URange16 Syriac_range16[] = { - { 1792, 1805 }, - { 1807, 1866 }, - { 1869, 1871 }, - { 2144, 2154 }, +static const URange32 Cyrillic_range32[] = { + { 122928, 122989 }, + { 123023, 123023 }, }; -static const URange16 Runic_range16[] = { - { 5792, 5866 }, - { 5870, 5880 }, +static const URange32 Deseret_range32[] = { + { 66560, 66639 }, }; -static const URange32 Gothic_range32[] = { - { 66352, 66378 }, +static const URange16 Devanagari_range16[] = { + { 2304, 2384 }, + { 2389, 2403 }, + { 2406, 2431 }, + { 43232, 43263 }, }; -static const URange32 Mahajani_range32[] = { - { 69968, 70006 }, +static const URange32 Devanagari_range32[] = { + { 72448, 72457 }, }; -static const URange16 Katakana_range16[] = { - { 12449, 12538 }, - { 12541, 12543 }, - { 12784, 12799 }, - { 13008, 13054 }, - { 13056, 13143 }, - { 65382, 65391 }, - { 65393, 65437 }, +static const URange32 Dives_Akuru_range32[] = { + { 71936, 71942 }, + { 71945, 71945 }, + { 71948, 71955 }, + { 71957, 71958 }, + { 71960, 71989 }, + { 71991, 71992 }, + { 71995, 72006 }, + { 72016, 72025 }, }; -static const URange32 Katakana_range32[] = { - { 110592, 110592 }, +static const URange32 Dogra_range32[] = { + { 71680, 71739 }, }; -static const URange32 Osmanya_range32[] = { - { 66688, 66717 }, - { 66720, 66729 }, +static const URange32 Duployan_range32[] = { + { 113664, 113770 }, + { 113776, 113788 }, + { 113792, 113800 }, + { 113808, 113817 }, + { 113820, 113823 }, }; -static const URange16 New_Tai_Lue_range16[] = { - { 6528, 6571 }, - { 6576, 6601 }, - { 6608, 6618 }, - { 6622, 6623 }, +static const URange32 Egyptian_Hieroglyphs_range32[] = { + { 77824, 78933 }, }; -static const URange16 Ol_Chiki_range16[] = { - { 7248, 7295 }, +static const URange32 Elbasan_range32[] = { + { 66816, 66855 }, }; -static const URange32 Newa_range32[] = { - { 70656, 70745 }, - { 70747, 70747 }, - { 70749, 70750 }, +static const URange32 Elymaic_range32[] = { + { 69600, 69622 }, }; -static const URange16 Limbu_range16[] = { - { 6400, 6430 }, - { 6432, 6443 }, - { 6448, 6459 }, - { 6464, 6464 }, - { 6468, 6479 }, +static const URange16 Ethiopic_range16[] = { + { 4608, 4680 }, + { 4682, 4685 }, + { 4688, 4694 }, + { 4696, 4696 }, + { 4698, 4701 }, + { 4704, 4744 }, + { 4746, 4749 }, + { 4752, 4784 }, + { 4786, 4789 }, + { 4792, 4798 }, + { 4800, 4800 }, + { 4802, 4805 }, + { 4808, 4822 }, + { 4824, 4880 }, + { 4882, 4885 }, + { 4888, 4954 }, + { 4957, 4988 }, + { 4992, 5017 }, + { 11648, 11670 }, + { 11680, 11686 }, + { 11688, 11694 }, + { 11696, 11702 }, + { 11704, 11710 }, + { 11712, 11718 }, + { 11720, 11726 }, + { 11728, 11734 }, + { 11736, 11742 }, + { 43777, 43782 }, + { 43785, 43790 }, + { 43793, 43798 }, + { 43808, 43814 }, + { 43816, 43822 }, }; -static const URange32 Pau_Cin_Hau_range32[] = { - { 72384, 72440 }, +static const URange32 Ethiopic_range32[] = { + { 124896, 124902 }, + { 124904, 124907 }, + { 124909, 124910 }, + { 124912, 124926 }, }; -static const URange16 Cherokee_range16[] = { - { 5024, 5109 }, - { 5112, 5117 }, - { 43888, 43967 }, +static const URange16 Georgian_range16[] = { + { 4256, 4293 }, + { 4295, 4295 }, + { 4301, 4301 }, + { 4304, 4346 }, + { 4348, 4351 }, + { 7312, 7354 }, + { 7357, 7359 }, + { 11520, 11557 }, + { 11559, 11559 }, + { 11565, 11565 }, }; -static const URange32 Miao_range32[] = { - { 93952, 94020 }, - { 94032, 94078 }, - { 94095, 94111 }, +static const URange16 Glagolitic_range16[] = { + { 11264, 11359 }, }; -static const URange16 Oriya_range16[] = { - { 2817, 2819 }, - { 2821, 2828 }, - { 2831, 2832 }, - { 2835, 2856 }, - { 2858, 2864 }, - { 2866, 2867 }, - { 2869, 2873 }, - { 2876, 2884 }, - { 2887, 2888 }, - { 2891, 2893 }, - { 2902, 2903 }, - { 2908, 2909 }, - { 2911, 2915 }, - { 2918, 2935 }, +static const URange32 Glagolitic_range32[] = { + { 122880, 122886 }, + { 122888, 122904 }, + { 122907, 122913 }, + { 122915, 122916 }, + { 122918, 122922 }, }; -static const URange32 Medefaidrin_range32[] = { - { 93760, 93850 }, +static const URange32 Gothic_range32[] = { + { 66352, 66378 }, }; -static const URange32 Sharada_range32[] = { - { 70016, 70093 }, - { 70096, 70111 }, +static const URange32 Grantha_range32[] = { + { 70400, 70403 }, + { 70405, 70412 }, + { 70415, 70416 }, + { 70419, 70440 }, + { 70442, 70448 }, + { 70450, 70451 }, + { 70453, 70457 }, + { 70460, 70468 }, + { 70471, 70472 }, + { 70475, 70477 }, + { 70480, 70480 }, + { 70487, 70487 }, + { 70493, 70499 }, + { 70502, 70508 }, + { 70512, 70516 }, +}; +static const URange16 Greek_range16[] = { + { 880, 883 }, + { 885, 887 }, + { 890, 893 }, + { 895, 895 }, + { 900, 900 }, + { 902, 902 }, + { 904, 906 }, + { 908, 908 }, + { 910, 929 }, + { 931, 993 }, + { 1008, 1023 }, + { 7462, 7466 }, + { 7517, 7521 }, + { 7526, 7530 }, + { 7615, 7615 }, + { 7936, 7957 }, + { 7960, 7965 }, + { 7968, 8005 }, + { 8008, 8013 }, + { 8016, 8023 }, + { 8025, 8025 }, + { 8027, 8027 }, + { 8029, 8029 }, + { 8031, 8061 }, + { 8064, 8116 }, + { 8118, 8132 }, + { 8134, 8147 }, + { 8150, 8155 }, + { 8157, 8175 }, + { 8178, 8180 }, + { 8182, 8190 }, + { 8486, 8486 }, + { 43877, 43877 }, +}; +static const URange32 Greek_range32[] = { + { 65856, 65934 }, + { 65952, 65952 }, + { 119296, 119365 }, }; static const URange16 Gujarati_range16[] = { { 2689, 2691 }, @@ -5251,14 +5557,6 @@ static const URange16 Gujarati_range16[] = { { 2790, 2801 }, { 2809, 2815 }, }; -static const URange32 Nushu_range32[] = { - { 94177, 94177 }, - { 110960, 111355 }, -}; -static const URange32 Modi_range32[] = { - { 71168, 71236 }, - { 71248, 71257 }, -}; static const URange32 Gunjala_Gondi_range32[] = { { 73056, 73061 }, { 73063, 73064 }, @@ -5267,136 +5565,151 @@ static const URange32 Gunjala_Gondi_range32[] = { { 73107, 73112 }, { 73120, 73129 }, }; -static const URange32 Inscriptional_Pahlavi_range32[] = { - { 68448, 68466 }, - { 68472, 68479 }, +static const URange16 Gurmukhi_range16[] = { + { 2561, 2563 }, + { 2565, 2570 }, + { 2575, 2576 }, + { 2579, 2600 }, + { 2602, 2608 }, + { 2610, 2611 }, + { 2613, 2614 }, + { 2616, 2617 }, + { 2620, 2620 }, + { 2622, 2626 }, + { 2631, 2632 }, + { 2635, 2637 }, + { 2641, 2641 }, + { 2649, 2652 }, + { 2654, 2654 }, + { 2662, 2678 }, }; -static const URange32 Manichaean_range32[] = { - { 68288, 68326 }, - { 68331, 68342 }, +static const URange16 Han_range16[] = { + { 11904, 11929 }, + { 11931, 12019 }, + { 12032, 12245 }, + { 12293, 12293 }, + { 12295, 12295 }, + { 12321, 12329 }, + { 12344, 12347 }, + { 13312, 19903 }, + { 19968, 40959 }, + { 63744, 64109 }, + { 64112, 64217 }, }; -static const URange16 Khmer_range16[] = { - { 6016, 6109 }, - { 6112, 6121 }, - { 6128, 6137 }, - { 6624, 6655 }, +static const URange32 Han_range32[] = { + { 94178, 94179 }, + { 94192, 94193 }, + { 131072, 173791 }, + { 173824, 177977 }, + { 177984, 178205 }, + { 178208, 183969 }, + { 183984, 191456 }, + { 194560, 195101 }, + { 196608, 201546 }, + { 201552, 205743 }, }; -static const URange32 Cuneiform_range32[] = { - { 73728, 74649 }, - { 74752, 74862 }, - { 74864, 74868 }, - { 74880, 75075 }, +static const URange16 Hangul_range16[] = { + { 4352, 4607 }, + { 12334, 12335 }, + { 12593, 12686 }, + { 12800, 12830 }, + { 12896, 12926 }, + { 43360, 43388 }, + { 44032, 55203 }, + { 55216, 55238 }, + { 55243, 55291 }, + { 65440, 65470 }, + { 65474, 65479 }, + { 65482, 65487 }, + { 65490, 65495 }, + { 65498, 65500 }, }; -static const URange32 Khudawadi_range32[] = { - { 70320, 70378 }, - { 70384, 70393 }, +static const URange32 Hanifi_Rohingya_range32[] = { + { 68864, 68903 }, + { 68912, 68921 }, }; -static const URange16 Mandaic_range16[] = { - { 2112, 2139 }, - { 2142, 2142 }, +static const URange16 Hanunoo_range16[] = { + { 5920, 5940 }, }; static const URange32 Hatran_range32[] = { { 67808, 67826 }, { 67828, 67829 }, { 67835, 67839 }, }; -static const URange16 Syloti_Nagri_range16[] = { - { 43008, 43051 }, -}; -static const URange16 Nko_range16[] = { - { 1984, 2042 }, - { 2045, 2047 }, -}; -static const URange16 Canadian_Aboriginal_range16[] = { - { 5120, 5759 }, - { 6320, 6389 }, -}; -static const URange32 Meroitic_Hieroglyphs_range32[] = { - { 67968, 67999 }, -}; -static const URange32 Phoenician_range32[] = { - { 67840, 67867 }, - { 67871, 67871 }, -}; -static const URange32 Nabataean_range32[] = { - { 67712, 67742 }, - { 67751, 67759 }, -}; -static const URange16 Bengali_range16[] = { - { 2432, 2435 }, - { 2437, 2444 }, - { 2447, 2448 }, - { 2451, 2472 }, - { 2474, 2480 }, - { 2482, 2482 }, - { 2486, 2489 }, - { 2492, 2500 }, - { 2503, 2504 }, - { 2507, 2510 }, - { 2519, 2519 }, - { 2524, 2525 }, - { 2527, 2531 }, - { 2534, 2558 }, -}; -static const URange32 Kaithi_range32[] = { - { 69760, 69825 }, - { 69837, 69837 }, +static const URange16 Hebrew_range16[] = { + { 1425, 1479 }, + { 1488, 1514 }, + { 1519, 1524 }, + { 64285, 64310 }, + { 64312, 64316 }, + { 64318, 64318 }, + { 64320, 64321 }, + { 64323, 64324 }, + { 64326, 64335 }, }; -static const URange16 Glagolitic_range16[] = { - { 11264, 11310 }, - { 11312, 11358 }, +static const URange16 Hiragana_range16[] = { + { 12353, 12438 }, + { 12445, 12447 }, }; -static const URange32 Glagolitic_range32[] = { - { 122880, 122886 }, - { 122888, 122904 }, - { 122907, 122913 }, - { 122915, 122916 }, - { 122918, 122922 }, +static const URange32 Hiragana_range32[] = { + { 110593, 110879 }, + { 110898, 110898 }, + { 110928, 110930 }, + { 127488, 127488 }, }; static const URange32 Imperial_Aramaic_range32[] = { { 67648, 67669 }, { 67671, 67679 }, }; -static const URange32 Sora_Sompeng_range32[] = { - { 69840, 69864 }, - { 69872, 69881 }, +static const URange16 Inherited_range16[] = { + { 768, 879 }, + { 1157, 1158 }, + { 1611, 1621 }, + { 1648, 1648 }, + { 2385, 2388 }, + { 6832, 6862 }, + { 7376, 7378 }, + { 7380, 7392 }, + { 7394, 7400 }, + { 7405, 7405 }, + { 7412, 7412 }, + { 7416, 7417 }, + { 7616, 7679 }, + { 8204, 8205 }, + { 8400, 8432 }, + { 12330, 12333 }, + { 12441, 12442 }, + { 65024, 65039 }, + { 65056, 65069 }, }; -static const URange16 Gurmukhi_range16[] = { - { 2561, 2563 }, - { 2565, 2570 }, - { 2575, 2576 }, - { 2579, 2600 }, - { 2602, 2608 }, - { 2610, 2611 }, - { 2613, 2614 }, - { 2616, 2617 }, - { 2620, 2620 }, - { 2622, 2626 }, - { 2631, 2632 }, - { 2635, 2637 }, - { 2641, 2641 }, - { 2649, 2652 }, - { 2654, 2654 }, - { 2662, 2678 }, +static const URange32 Inherited_range32[] = { + { 66045, 66045 }, + { 66272, 66272 }, + { 70459, 70459 }, + { 118528, 118573 }, + { 118576, 118598 }, + { 119143, 119145 }, + { 119163, 119170 }, + { 119173, 119179 }, + { 119210, 119213 }, + { 917760, 917999 }, +}; +static const URange32 Inscriptional_Pahlavi_range32[] = { + { 68448, 68466 }, + { 68472, 68479 }, +}; +static const URange32 Inscriptional_Parthian_range32[] = { + { 68416, 68437 }, + { 68440, 68447 }, }; static const URange16 Javanese_range16[] = { { 43392, 43469 }, { 43472, 43481 }, { 43486, 43487 }, }; -static const URange32 Old_Permic_range32[] = { - { 66384, 66426 }, -}; -static const URange16 Phags_Pa_range16[] = { - { 43072, 43127 }, -}; -static const URange32 Cypriot_range32[] = { - { 67584, 67589 }, - { 67592, 67592 }, - { 67594, 67637 }, - { 67639, 67640 }, - { 67644, 67644 }, - { 67647, 67647 }, +static const URange32 Kaithi_range32[] = { + { 69760, 69826 }, + { 69837, 69837 }, }; static const URange16 Kannada_range16[] = { { 3200, 3212 }, @@ -5408,109 +5721,138 @@ static const URange16 Kannada_range16[] = { { 3270, 3272 }, { 3274, 3277 }, { 3285, 3286 }, - { 3294, 3294 }, + { 3293, 3294 }, { 3296, 3299 }, { 3302, 3311 }, - { 3313, 3314 }, -}; -static const URange32 Khojki_range32[] = { - { 70144, 70161 }, - { 70163, 70206 }, -}; -static const URange16 Mongolian_range16[] = { - { 6144, 6145 }, - { 6148, 6148 }, - { 6150, 6158 }, - { 6160, 6169 }, - { 6176, 6264 }, - { 6272, 6314 }, -}; -static const URange32 Mongolian_range32[] = { - { 71264, 71276 }, -}; -static const URange16 Sinhala_range16[] = { - { 3458, 3459 }, - { 3461, 3478 }, - { 3482, 3505 }, - { 3507, 3515 }, - { 3517, 3517 }, - { 3520, 3526 }, - { 3530, 3530 }, - { 3535, 3540 }, - { 3542, 3542 }, - { 3544, 3551 }, - { 3558, 3567 }, - { 3570, 3572 }, + { 3313, 3315 }, }; -static const URange32 Sinhala_range32[] = { - { 70113, 70132 }, +static const URange16 Katakana_range16[] = { + { 12449, 12538 }, + { 12541, 12543 }, + { 12784, 12799 }, + { 13008, 13054 }, + { 13056, 13143 }, + { 65382, 65391 }, + { 65393, 65437 }, }; -static const URange32 Brahmi_range32[] = { - { 69632, 69709 }, - { 69714, 69743 }, - { 69759, 69759 }, +static const URange32 Katakana_range32[] = { + { 110576, 110579 }, + { 110581, 110587 }, + { 110589, 110590 }, + { 110592, 110592 }, + { 110880, 110882 }, + { 110933, 110933 }, + { 110948, 110951 }, }; -static const URange32 Elbasan_range32[] = { - { 66816, 66855 }, +static const URange32 Kawi_range32[] = { + { 73472, 73488 }, + { 73490, 73530 }, + { 73534, 73561 }, }; -static const URange32 Deseret_range32[] = { - { 66560, 66639 }, +static const URange16 Kayah_Li_range16[] = { + { 43264, 43309 }, + { 43311, 43311 }, }; -static const URange16 Rejang_range16[] = { - { 43312, 43347 }, - { 43359, 43359 }, +static const URange32 Kharoshthi_range32[] = { + { 68096, 68099 }, + { 68101, 68102 }, + { 68108, 68115 }, + { 68117, 68119 }, + { 68121, 68149 }, + { 68152, 68154 }, + { 68159, 68168 }, + { 68176, 68184 }, }; -static const URange32 SignWriting_range32[] = { - { 120832, 121483 }, - { 121499, 121503 }, - { 121505, 121519 }, +static const URange32 Khitan_Small_Script_range32[] = { + { 94180, 94180 }, + { 101120, 101589 }, }; -static const URange32 Multani_range32[] = { - { 70272, 70278 }, - { 70280, 70280 }, - { 70282, 70285 }, - { 70287, 70301 }, - { 70303, 70313 }, +static const URange16 Khmer_range16[] = { + { 6016, 6109 }, + { 6112, 6121 }, + { 6128, 6137 }, + { 6624, 6655 }, }; -static const URange16 Yi_range16[] = { - { 40960, 42124 }, - { 42128, 42182 }, +static const URange32 Khojki_range32[] = { + { 70144, 70161 }, + { 70163, 70209 }, }; -static const URange16 Balinese_range16[] = { - { 6912, 6987 }, - { 6992, 7036 }, +static const URange32 Khudawadi_range32[] = { + { 70320, 70378 }, + { 70384, 70393 }, }; static const URange16 Lao_range16[] = { { 3713, 3714 }, { 3716, 3716 }, - { 3719, 3720 }, - { 3722, 3722 }, - { 3725, 3725 }, - { 3732, 3735 }, - { 3737, 3743 }, - { 3745, 3747 }, + { 3718, 3722 }, + { 3724, 3747 }, { 3749, 3749 }, - { 3751, 3751 }, - { 3754, 3755 }, - { 3757, 3769 }, - { 3771, 3773 }, + { 3751, 3773 }, { 3776, 3780 }, { 3782, 3782 }, - { 3784, 3789 }, + { 3784, 3790 }, { 3792, 3801 }, { 3804, 3807 }, }; -static const URange16 Hanunoo_range16[] = { - { 5920, 5940 }, +static const URange16 Latin_range16[] = { + { 65, 90 }, + { 97, 122 }, + { 170, 170 }, + { 186, 186 }, + { 192, 214 }, + { 216, 246 }, + { 248, 696 }, + { 736, 740 }, + { 7424, 7461 }, + { 7468, 7516 }, + { 7522, 7525 }, + { 7531, 7543 }, + { 7545, 7614 }, + { 7680, 7935 }, + { 8305, 8305 }, + { 8319, 8319 }, + { 8336, 8348 }, + { 8490, 8491 }, + { 8498, 8498 }, + { 8526, 8526 }, + { 8544, 8584 }, + { 11360, 11391 }, + { 42786, 42887 }, + { 42891, 42954 }, + { 42960, 42961 }, + { 42963, 42963 }, + { 42965, 42969 }, + { 42994, 43007 }, + { 43824, 43866 }, + { 43868, 43876 }, + { 43878, 43881 }, + { 64256, 64262 }, + { 65313, 65338 }, + { 65345, 65370 }, }; -static const URange32 Masaram_Gondi_range32[] = { - { 72960, 72966 }, - { 72968, 72969 }, - { 72971, 73014 }, - { 73018, 73018 }, - { 73020, 73021 }, - { 73023, 73031 }, - { 73040, 73049 }, +static const URange32 Latin_range32[] = { + { 67456, 67461 }, + { 67463, 67504 }, + { 67506, 67514 }, + { 122624, 122654 }, + { 122661, 122666 }, +}; +static const URange16 Lepcha_range16[] = { + { 7168, 7223 }, + { 7227, 7241 }, + { 7245, 7247 }, +}; +static const URange16 Limbu_range16[] = { + { 6400, 6430 }, + { 6432, 6443 }, + { 6448, 6459 }, + { 6464, 6464 }, + { 6468, 6479 }, +}; +static const URange32 Linear_A_range32[] = { + { 67072, 67382 }, + { 67392, 67413 }, + { 67424, 67431 }, }; static const URange32 Linear_B_range32[] = { { 65536, 65547 }, @@ -5521,356 +5863,452 @@ static const URange32 Linear_B_range32[] = { { 65616, 65629 }, { 65664, 65786 }, }; -static const URange32 Linear_A_range32[] = { - { 67072, 67382 }, - { 67392, 67413 }, - { 67424, 67431 }, +static const URange16 Lisu_range16[] = { + { 42192, 42239 }, +}; +static const URange32 Lisu_range32[] = { + { 73648, 73648 }, +}; +static const URange32 Lycian_range32[] = { + { 66176, 66204 }, +}; +static const URange32 Lydian_range32[] = { + { 67872, 67897 }, + { 67903, 67903 }, +}; +static const URange32 Mahajani_range32[] = { + { 69968, 70006 }, +}; +static const URange32 Makasar_range32[] = { + { 73440, 73464 }, +}; +static const URange16 Malayalam_range16[] = { + { 3328, 3340 }, + { 3342, 3344 }, + { 3346, 3396 }, + { 3398, 3400 }, + { 3402, 3407 }, + { 3412, 3427 }, + { 3430, 3455 }, +}; +static const URange16 Mandaic_range16[] = { + { 2112, 2139 }, + { 2142, 2142 }, +}; +static const URange32 Manichaean_range32[] = { + { 68288, 68326 }, + { 68331, 68342 }, +}; +static const URange32 Marchen_range32[] = { + { 72816, 72847 }, + { 72850, 72871 }, + { 72873, 72886 }, +}; +static const URange32 Masaram_Gondi_range32[] = { + { 72960, 72966 }, + { 72968, 72969 }, + { 72971, 73014 }, + { 73018, 73018 }, + { 73020, 73021 }, + { 73023, 73031 }, + { 73040, 73049 }, +}; +static const URange32 Medefaidrin_range32[] = { + { 93760, 93850 }, +}; +static const URange16 Meetei_Mayek_range16[] = { + { 43744, 43766 }, + { 43968, 44013 }, + { 44016, 44025 }, +}; +static const URange32 Mende_Kikakui_range32[] = { + { 124928, 125124 }, + { 125127, 125142 }, +}; +static const URange32 Meroitic_Cursive_range32[] = { + { 68000, 68023 }, + { 68028, 68047 }, + { 68050, 68095 }, +}; +static const URange32 Meroitic_Hieroglyphs_range32[] = { + { 67968, 67999 }, +}; +static const URange32 Miao_range32[] = { + { 93952, 94026 }, + { 94031, 94087 }, + { 94095, 94111 }, +}; +static const URange32 Modi_range32[] = { + { 71168, 71236 }, + { 71248, 71257 }, +}; +static const URange16 Mongolian_range16[] = { + { 6144, 6145 }, + { 6148, 6148 }, + { 6150, 6169 }, + { 6176, 6264 }, + { 6272, 6314 }, +}; +static const URange32 Mongolian_range32[] = { + { 71264, 71276 }, +}; +static const URange32 Mro_range32[] = { + { 92736, 92766 }, + { 92768, 92777 }, + { 92782, 92783 }, +}; +static const URange32 Multani_range32[] = { + { 70272, 70278 }, + { 70280, 70280 }, + { 70282, 70285 }, + { 70287, 70301 }, + { 70303, 70313 }, +}; +static const URange16 Myanmar_range16[] = { + { 4096, 4255 }, + { 43488, 43518 }, + { 43616, 43647 }, +}; +static const URange32 Nabataean_range32[] = { + { 67712, 67742 }, + { 67751, 67759 }, }; -static const URange32 Dogra_range32[] = { - { 71680, 71739 }, +static const URange32 Nag_Mundari_range32[] = { + { 124112, 124153 }, }; -static const URange32 Old_Turkic_range32[] = { - { 68608, 68680 }, +static const URange32 Nandinagari_range32[] = { + { 72096, 72103 }, + { 72106, 72151 }, + { 72154, 72164 }, }; -static const URange16 Lepcha_range16[] = { - { 7168, 7223 }, - { 7227, 7241 }, - { 7245, 7247 }, +static const URange16 New_Tai_Lue_range16[] = { + { 6528, 6571 }, + { 6576, 6601 }, + { 6608, 6618 }, + { 6622, 6623 }, }; -static const URange32 Lydian_range32[] = { - { 67872, 67897 }, - { 67903, 67903 }, +static const URange32 Newa_range32[] = { + { 70656, 70747 }, + { 70749, 70753 }, }; -static const URange32 Egyptian_Hieroglyphs_range32[] = { - { 77824, 78894 }, +static const URange16 Nko_range16[] = { + { 1984, 2042 }, + { 2045, 2047 }, }; -static const URange32 Sogdian_range32[] = { - { 69424, 69465 }, +static const URange32 Nushu_range32[] = { + { 94177, 94177 }, + { 110960, 111355 }, }; -static const URange32 Caucasian_Albanian_range32[] = { - { 66864, 66915 }, - { 66927, 66927 }, +static const URange32 Nyiakeng_Puachue_Hmong_range32[] = { + { 123136, 123180 }, + { 123184, 123197 }, + { 123200, 123209 }, + { 123214, 123215 }, }; -static const URange32 Makasar_range32[] = { - { 73440, 73464 }, +static const URange16 Ogham_range16[] = { + { 5760, 5788 }, +}; +static const URange16 Ol_Chiki_range16[] = { + { 7248, 7295 }, }; static const URange32 Old_Hungarian_range32[] = { { 68736, 68786 }, { 68800, 68850 }, { 68858, 68863 }, }; -static const URange16 Samaritan_range16[] = { - { 2048, 2093 }, - { 2096, 2110 }, +static const URange32 Old_Italic_range32[] = { + { 66304, 66339 }, + { 66349, 66351 }, }; -static const URange16 Lisu_range16[] = { - { 42192, 42239 }, +static const URange32 Old_North_Arabian_range32[] = { + { 68224, 68255 }, }; -static const URange16 Buhid_range16[] = { - { 5952, 5971 }, +static const URange32 Old_Permic_range32[] = { + { 66384, 66426 }, }; -static const URange32 Palmyrene_range32[] = { - { 67680, 67711 }, +static const URange32 Old_Persian_range32[] = { + { 66464, 66499 }, + { 66504, 66517 }, }; -static const URange32 Tirhuta_range32[] = { - { 70784, 70855 }, - { 70864, 70873 }, +static const URange32 Old_Sogdian_range32[] = { + { 69376, 69415 }, }; -static const URange32 Mro_range32[] = { - { 92736, 92766 }, - { 92768, 92777 }, - { 92782, 92783 }, +static const URange32 Old_South_Arabian_range32[] = { + { 68192, 68223 }, }; -static const URange16 Common_range16[] = { - { 0, 64 }, - { 91, 96 }, - { 123, 169 }, - { 171, 185 }, - { 187, 191 }, - { 215, 215 }, - { 247, 247 }, - { 697, 735 }, - { 741, 745 }, - { 748, 767 }, - { 884, 884 }, - { 894, 894 }, - { 901, 901 }, - { 903, 903 }, - { 1417, 1417 }, - { 1541, 1541 }, - { 1548, 1548 }, - { 1563, 1563 }, - { 1567, 1567 }, - { 1600, 1600 }, - { 1757, 1757 }, - { 2274, 2274 }, - { 2404, 2405 }, - { 3647, 3647 }, - { 4053, 4056 }, - { 4347, 4347 }, - { 5867, 5869 }, - { 5941, 5942 }, - { 6146, 6147 }, - { 6149, 6149 }, - { 7379, 7379 }, - { 7393, 7393 }, - { 7401, 7404 }, - { 7406, 7411 }, - { 7413, 7415 }, - { 8192, 8203 }, - { 8206, 8292 }, - { 8294, 8304 }, - { 8308, 8318 }, - { 8320, 8334 }, - { 8352, 8383 }, - { 8448, 8485 }, - { 8487, 8489 }, - { 8492, 8497 }, - { 8499, 8525 }, - { 8527, 8543 }, - { 8585, 8587 }, - { 8592, 9254 }, - { 9280, 9290 }, - { 9312, 10239 }, - { 10496, 11123 }, - { 11126, 11157 }, - { 11160, 11208 }, - { 11210, 11262 }, - { 11776, 11854 }, - { 12272, 12283 }, - { 12288, 12292 }, - { 12294, 12294 }, - { 12296, 12320 }, - { 12336, 12343 }, - { 12348, 12351 }, - { 12443, 12444 }, - { 12448, 12448 }, - { 12539, 12540 }, - { 12688, 12703 }, - { 12736, 12771 }, - { 12832, 12895 }, - { 12927, 13007 }, - { 13144, 13311 }, - { 19904, 19967 }, - { 42752, 42785 }, - { 42888, 42890 }, - { 43056, 43065 }, - { 43310, 43310 }, - { 43471, 43471 }, - { 43867, 43867 }, - { 64830, 64831 }, - { 65040, 65049 }, - { 65072, 65106 }, - { 65108, 65126 }, - { 65128, 65131 }, - { 65279, 65279 }, - { 65281, 65312 }, - { 65339, 65344 }, - { 65371, 65381 }, - { 65392, 65392 }, - { 65438, 65439 }, - { 65504, 65510 }, - { 65512, 65518 }, - { 65529, 65533 }, +static const URange32 Old_Turkic_range32[] = { + { 68608, 68680 }, }; -static const URange32 Common_range32[] = { - { 65792, 65794 }, - { 65799, 65843 }, - { 65847, 65855 }, - { 65936, 65947 }, - { 66000, 66044 }, - { 66273, 66299 }, - { 113824, 113827 }, - { 118784, 119029 }, - { 119040, 119078 }, - { 119081, 119142 }, - { 119146, 119162 }, - { 119171, 119172 }, - { 119180, 119209 }, - { 119214, 119272 }, - { 119520, 119539 }, - { 119552, 119638 }, - { 119648, 119672 }, - { 119808, 119892 }, - { 119894, 119964 }, - { 119966, 119967 }, - { 119970, 119970 }, - { 119973, 119974 }, - { 119977, 119980 }, - { 119982, 119993 }, - { 119995, 119995 }, - { 119997, 120003 }, - { 120005, 120069 }, - { 120071, 120074 }, - { 120077, 120084 }, - { 120086, 120092 }, - { 120094, 120121 }, - { 120123, 120126 }, - { 120128, 120132 }, - { 120134, 120134 }, - { 120138, 120144 }, - { 120146, 120485 }, - { 120488, 120779 }, - { 120782, 120831 }, - { 126065, 126132 }, - { 126976, 127019 }, - { 127024, 127123 }, - { 127136, 127150 }, - { 127153, 127167 }, - { 127169, 127183 }, - { 127185, 127221 }, - { 127232, 127244 }, - { 127248, 127339 }, - { 127344, 127404 }, - { 127462, 127487 }, - { 127489, 127490 }, - { 127504, 127547 }, - { 127552, 127560 }, - { 127568, 127569 }, - { 127584, 127589 }, - { 127744, 128724 }, - { 128736, 128748 }, - { 128752, 128761 }, - { 128768, 128883 }, - { 128896, 128984 }, - { 129024, 129035 }, - { 129040, 129095 }, - { 129104, 129113 }, - { 129120, 129159 }, - { 129168, 129197 }, - { 129280, 129291 }, - { 129296, 129342 }, - { 129344, 129392 }, - { 129395, 129398 }, - { 129402, 129402 }, - { 129404, 129442 }, - { 129456, 129465 }, - { 129472, 129474 }, - { 129488, 129535 }, - { 129632, 129645 }, - { 917505, 917505 }, - { 917536, 917631 }, +static const URange32 Old_Uyghur_range32[] = { + { 69488, 69513 }, +}; +static const URange16 Oriya_range16[] = { + { 2817, 2819 }, + { 2821, 2828 }, + { 2831, 2832 }, + { 2835, 2856 }, + { 2858, 2864 }, + { 2866, 2867 }, + { 2869, 2873 }, + { 2876, 2884 }, + { 2887, 2888 }, + { 2891, 2893 }, + { 2901, 2903 }, + { 2908, 2909 }, + { 2911, 2915 }, + { 2918, 2935 }, +}; +static const URange32 Osage_range32[] = { + { 66736, 66771 }, + { 66776, 66811 }, +}; +static const URange32 Osmanya_range32[] = { + { 66688, 66717 }, + { 66720, 66729 }, +}; +static const URange32 Pahawh_Hmong_range32[] = { + { 92928, 92997 }, + { 93008, 93017 }, + { 93019, 93025 }, + { 93027, 93047 }, + { 93053, 93071 }, +}; +static const URange32 Palmyrene_range32[] = { + { 67680, 67711 }, }; -static const URange16 Coptic_range16[] = { - { 994, 1007 }, - { 11392, 11507 }, - { 11513, 11519 }, +static const URange32 Pau_Cin_Hau_range32[] = { + { 72384, 72440 }, }; -static const URange32 Chakma_range32[] = { - { 69888, 69940 }, - { 69942, 69958 }, +static const URange16 Phags_Pa_range16[] = { + { 43072, 43127 }, }; -static const URange16 Arabic_range16[] = { - { 1536, 1540 }, - { 1542, 1547 }, - { 1549, 1562 }, - { 1564, 1564 }, - { 1566, 1566 }, - { 1568, 1599 }, - { 1601, 1610 }, - { 1622, 1647 }, - { 1649, 1756 }, - { 1758, 1791 }, - { 1872, 1919 }, - { 2208, 2228 }, - { 2230, 2237 }, - { 2259, 2273 }, - { 2275, 2303 }, - { 64336, 64449 }, - { 64467, 64829 }, - { 64848, 64911 }, - { 64914, 64967 }, - { 65008, 65021 }, - { 65136, 65140 }, - { 65142, 65276 }, +static const URange32 Phoenician_range32[] = { + { 67840, 67867 }, + { 67871, 67871 }, }; -static const URange32 Arabic_range32[] = { - { 69216, 69246 }, - { 126464, 126467 }, - { 126469, 126495 }, - { 126497, 126498 }, - { 126500, 126500 }, - { 126503, 126503 }, - { 126505, 126514 }, - { 126516, 126519 }, - { 126521, 126521 }, - { 126523, 126523 }, - { 126530, 126530 }, - { 126535, 126535 }, - { 126537, 126537 }, - { 126539, 126539 }, - { 126541, 126543 }, - { 126545, 126546 }, - { 126548, 126548 }, - { 126551, 126551 }, - { 126553, 126553 }, - { 126555, 126555 }, - { 126557, 126557 }, - { 126559, 126559 }, - { 126561, 126562 }, - { 126564, 126564 }, - { 126567, 126570 }, - { 126572, 126578 }, - { 126580, 126583 }, - { 126585, 126588 }, - { 126590, 126590 }, - { 126592, 126601 }, - { 126603, 126619 }, - { 126625, 126627 }, - { 126629, 126633 }, - { 126635, 126651 }, - { 126704, 126705 }, +static const URange32 Psalter_Pahlavi_range32[] = { + { 68480, 68497 }, + { 68505, 68508 }, + { 68521, 68527 }, }; -static const URange16 Bamum_range16[] = { - { 42656, 42743 }, +static const URange16 Rejang_range16[] = { + { 43312, 43347 }, + { 43359, 43359 }, }; -static const URange32 Bamum_range32[] = { - { 92160, 92728 }, +static const URange16 Runic_range16[] = { + { 5792, 5866 }, + { 5870, 5880 }, }; -static const URange16 Myanmar_range16[] = { - { 4096, 4255 }, - { 43488, 43518 }, - { 43616, 43647 }, +static const URange16 Samaritan_range16[] = { + { 2048, 2093 }, + { 2096, 2110 }, +}; +static const URange16 Saurashtra_range16[] = { + { 43136, 43205 }, + { 43214, 43225 }, +}; +static const URange32 Sharada_range32[] = { + { 70016, 70111 }, +}; +static const URange32 Shavian_range32[] = { + { 66640, 66687 }, }; static const URange32 Siddham_range32[] = { { 71040, 71093 }, { 71096, 71133 }, }; +static const URange32 SignWriting_range32[] = { + { 120832, 121483 }, + { 121499, 121503 }, + { 121505, 121519 }, +}; +static const URange16 Sinhala_range16[] = { + { 3457, 3459 }, + { 3461, 3478 }, + { 3482, 3505 }, + { 3507, 3515 }, + { 3517, 3517 }, + { 3520, 3526 }, + { 3530, 3530 }, + { 3535, 3540 }, + { 3542, 3542 }, + { 3544, 3551 }, + { 3558, 3567 }, + { 3570, 3572 }, +}; +static const URange32 Sinhala_range32[] = { + { 70113, 70132 }, +}; +static const URange32 Sogdian_range32[] = { + { 69424, 69465 }, +}; +static const URange32 Sora_Sompeng_range32[] = { + { 69840, 69864 }, + { 69872, 69881 }, +}; static const URange32 Soyombo_range32[] = { - { 72272, 72323 }, - { 72326, 72354 }, + { 72272, 72354 }, }; -static const URange32 Avestan_range32[] = { - { 68352, 68405 }, - { 68409, 68415 }, +static const URange16 Sundanese_range16[] = { + { 7040, 7103 }, + { 7360, 7367 }, }; -static const URange16 Hebrew_range16[] = { - { 1425, 1479 }, - { 1488, 1514 }, - { 1519, 1524 }, - { 64285, 64310 }, - { 64312, 64316 }, - { 64318, 64318 }, - { 64320, 64321 }, - { 64323, 64324 }, - { 64326, 64335 }, +static const URange16 Syloti_Nagri_range16[] = { + { 43008, 43052 }, }; -static const URange32 Psalter_Pahlavi_range32[] = { - { 68480, 68497 }, - { 68505, 68508 }, - { 68521, 68527 }, +static const URange16 Syriac_range16[] = { + { 1792, 1805 }, + { 1807, 1866 }, + { 1869, 1871 }, + { 2144, 2154 }, +}; +static const URange16 Tagalog_range16[] = { + { 5888, 5909 }, + { 5919, 5919 }, +}; +static const URange16 Tagbanwa_range16[] = { + { 5984, 5996 }, + { 5998, 6000 }, + { 6002, 6003 }, +}; +static const URange16 Tai_Le_range16[] = { + { 6480, 6509 }, + { 6512, 6516 }, +}; +static const URange16 Tai_Tham_range16[] = { + { 6688, 6750 }, + { 6752, 6780 }, + { 6783, 6793 }, + { 6800, 6809 }, + { 6816, 6829 }, +}; +static const URange16 Tai_Viet_range16[] = { + { 43648, 43714 }, + { 43739, 43743 }, }; static const URange32 Takri_range32[] = { - { 71296, 71351 }, + { 71296, 71353 }, { 71360, 71369 }, }; -// 3994 16-bit ranges, 1429 32-bit ranges +static const URange16 Tamil_range16[] = { + { 2946, 2947 }, + { 2949, 2954 }, + { 2958, 2960 }, + { 2962, 2965 }, + { 2969, 2970 }, + { 2972, 2972 }, + { 2974, 2975 }, + { 2979, 2980 }, + { 2984, 2986 }, + { 2990, 3001 }, + { 3006, 3010 }, + { 3014, 3016 }, + { 3018, 3021 }, + { 3024, 3024 }, + { 3031, 3031 }, + { 3046, 3066 }, +}; +static const URange32 Tamil_range32[] = { + { 73664, 73713 }, + { 73727, 73727 }, +}; +static const URange32 Tangsa_range32[] = { + { 92784, 92862 }, + { 92864, 92873 }, +}; +static const URange32 Tangut_range32[] = { + { 94176, 94176 }, + { 94208, 100343 }, + { 100352, 101119 }, + { 101632, 101640 }, +}; +static const URange16 Telugu_range16[] = { + { 3072, 3084 }, + { 3086, 3088 }, + { 3090, 3112 }, + { 3114, 3129 }, + { 3132, 3140 }, + { 3142, 3144 }, + { 3146, 3149 }, + { 3157, 3158 }, + { 3160, 3162 }, + { 3165, 3165 }, + { 3168, 3171 }, + { 3174, 3183 }, + { 3191, 3199 }, +}; +static const URange16 Thaana_range16[] = { + { 1920, 1969 }, +}; +static const URange16 Thai_range16[] = { + { 3585, 3642 }, + { 3648, 3675 }, +}; +static const URange16 Tibetan_range16[] = { + { 3840, 3911 }, + { 3913, 3948 }, + { 3953, 3991 }, + { 3993, 4028 }, + { 4030, 4044 }, + { 4046, 4052 }, + { 4057, 4058 }, +}; +static const URange16 Tifinagh_range16[] = { + { 11568, 11623 }, + { 11631, 11632 }, + { 11647, 11647 }, +}; +static const URange32 Tirhuta_range32[] = { + { 70784, 70855 }, + { 70864, 70873 }, +}; +static const URange32 Toto_range32[] = { + { 123536, 123566 }, +}; +static const URange32 Ugaritic_range32[] = { + { 66432, 66461 }, + { 66463, 66463 }, +}; +static const URange16 Vai_range16[] = { + { 42240, 42539 }, +}; +static const URange32 Vithkuqi_range32[] = { + { 66928, 66938 }, + { 66940, 66954 }, + { 66956, 66962 }, + { 66964, 66965 }, + { 66967, 66977 }, + { 66979, 66993 }, + { 66995, 67001 }, + { 67003, 67004 }, +}; +static const URange32 Wancho_range32[] = { + { 123584, 123641 }, + { 123647, 123647 }, +}; +static const URange32 Warang_Citi_range32[] = { + { 71840, 71922 }, + { 71935, 71935 }, +}; +static const URange32 Yezidi_range32[] = { + { 69248, 69289 }, + { 69291, 69293 }, + { 69296, 69297 }, +}; +static const URange16 Yi_range16[] = { + { 40960, 42124 }, + { 42128, 42182 }, +}; +static const URange32 Zanabazar_Square_range32[] = { + { 72192, 72263 }, +}; +// 4040 16-bit ranges, 1775 32-bit ranges const UGroup unicode_groups[] = { { "Adlam", +1, 0, 0, Adlam_range32, 3 }, { "Ahom", +1, 0, 0, Ahom_range32, 3 }, { "Anatolian_Hieroglyphs", +1, 0, 0, Anatolian_Hieroglyphs_range32, 1 }, - { "Arabic", +1, Arabic_range16, 22, Arabic_range32, 35 }, - { "Armenian", +1, Armenian_range16, 5, 0, 0 }, + { "Arabic", +1, Arabic_range16, 22, Arabic_range32, 36 }, + { "Armenian", +1, Armenian_range16, 4, 0, 0 }, { "Avestan", +1, 0, 0, Avestan_range32, 2 }, { "Balinese", +1, Balinese_range16, 2, 0, 0 }, { "Bamum", +1, Bamum_range16, 1, Bamum_range32, 1 }, @@ -5883,81 +6321,87 @@ const UGroup unicode_groups[] = { { "Braille", +1, Braille_range16, 1, 0, 0 }, { "Buginese", +1, Buginese_range16, 2, 0, 0 }, { "Buhid", +1, Buhid_range16, 1, 0, 0 }, - { "C", +1, C_range16, 16, C_range32, 8 }, - { "Canadian_Aboriginal", +1, Canadian_Aboriginal_range16, 2, 0, 0 }, + { "C", +1, C_range16, 17, C_range32, 9 }, + { "Canadian_Aboriginal", +1, Canadian_Aboriginal_range16, 2, Canadian_Aboriginal_range32, 1 }, { "Carian", +1, 0, 0, Carian_range32, 1 }, { "Caucasian_Albanian", +1, 0, 0, Caucasian_Albanian_range32, 2 }, { "Cc", +1, Cc_range16, 2, 0, 0 }, - { "Cf", +1, Cf_range16, 13, Cf_range32, 6 }, + { "Cf", +1, Cf_range16, 14, Cf_range32, 7 }, { "Chakma", +1, 0, 0, Chakma_range32, 2 }, { "Cham", +1, Cham_range16, 4, 0, 0 }, { "Cherokee", +1, Cherokee_range16, 3, 0, 0 }, + { "Chorasmian", +1, 0, 0, Chorasmian_range32, 1 }, { "Co", +1, Co_range16, 1, Co_range32, 2 }, - { "Common", +1, Common_range16, 90, Common_range32, 76 }, + { "Common", +1, Common_range16, 91, Common_range32, 82 }, { "Coptic", +1, Coptic_range16, 3, 0, 0 }, { "Cs", +1, Cs_range16, 1, 0, 0 }, { "Cuneiform", +1, 0, 0, Cuneiform_range32, 4 }, { "Cypriot", +1, 0, 0, Cypriot_range32, 6 }, - { "Cyrillic", +1, Cyrillic_range16, 8, 0, 0 }, + { "Cypro_Minoan", +1, 0, 0, Cypro_Minoan_range32, 1 }, + { "Cyrillic", +1, Cyrillic_range16, 8, Cyrillic_range32, 2 }, { "Deseret", +1, 0, 0, Deseret_range32, 1 }, - { "Devanagari", +1, Devanagari_range16, 4, 0, 0 }, + { "Devanagari", +1, Devanagari_range16, 4, Devanagari_range32, 1 }, + { "Dives_Akuru", +1, 0, 0, Dives_Akuru_range32, 8 }, { "Dogra", +1, 0, 0, Dogra_range32, 1 }, { "Duployan", +1, 0, 0, Duployan_range32, 5 }, { "Egyptian_Hieroglyphs", +1, 0, 0, Egyptian_Hieroglyphs_range32, 1 }, { "Elbasan", +1, 0, 0, Elbasan_range32, 1 }, - { "Ethiopic", +1, Ethiopic_range16, 32, 0, 0 }, + { "Elymaic", +1, 0, 0, Elymaic_range32, 1 }, + { "Ethiopic", +1, Ethiopic_range16, 32, Ethiopic_range32, 4 }, { "Georgian", +1, Georgian_range16, 10, 0, 0 }, - { "Glagolitic", +1, Glagolitic_range16, 2, Glagolitic_range32, 5 }, + { "Glagolitic", +1, Glagolitic_range16, 1, Glagolitic_range32, 5 }, { "Gothic", +1, 0, 0, Gothic_range32, 1 }, { "Grantha", +1, 0, 0, Grantha_range32, 15 }, { "Greek", +1, Greek_range16, 33, Greek_range32, 3 }, { "Gujarati", +1, Gujarati_range16, 14, 0, 0 }, { "Gunjala_Gondi", +1, 0, 0, Gunjala_Gondi_range32, 6 }, { "Gurmukhi", +1, Gurmukhi_range16, 16, 0, 0 }, - { "Han", +1, Han_range16, 11, Han_range32, 6 }, + { "Han", +1, Han_range16, 11, Han_range32, 10 }, { "Hangul", +1, Hangul_range16, 14, 0, 0 }, { "Hanifi_Rohingya", +1, 0, 0, Hanifi_Rohingya_range32, 2 }, { "Hanunoo", +1, Hanunoo_range16, 1, 0, 0 }, { "Hatran", +1, 0, 0, Hatran_range32, 3 }, { "Hebrew", +1, Hebrew_range16, 9, 0, 0 }, - { "Hiragana", +1, Hiragana_range16, 2, Hiragana_range32, 2 }, + { "Hiragana", +1, Hiragana_range16, 2, Hiragana_range32, 4 }, { "Imperial_Aramaic", +1, 0, 0, Imperial_Aramaic_range32, 2 }, - { "Inherited", +1, Inherited_range16, 20, Inherited_range32, 8 }, + { "Inherited", +1, Inherited_range16, 19, Inherited_range32, 10 }, { "Inscriptional_Pahlavi", +1, 0, 0, Inscriptional_Pahlavi_range32, 2 }, { "Inscriptional_Parthian", +1, 0, 0, Inscriptional_Parthian_range32, 2 }, { "Javanese", +1, Javanese_range16, 3, 0, 0 }, { "Kaithi", +1, 0, 0, Kaithi_range32, 2 }, { "Kannada", +1, Kannada_range16, 13, 0, 0 }, - { "Katakana", +1, Katakana_range16, 7, Katakana_range32, 1 }, + { "Katakana", +1, Katakana_range16, 7, Katakana_range32, 7 }, + { "Kawi", +1, 0, 0, Kawi_range32, 3 }, { "Kayah_Li", +1, Kayah_Li_range16, 2, 0, 0 }, { "Kharoshthi", +1, 0, 0, Kharoshthi_range32, 8 }, + { "Khitan_Small_Script", +1, 0, 0, Khitan_Small_Script_range32, 2 }, { "Khmer", +1, Khmer_range16, 4, 0, 0 }, { "Khojki", +1, 0, 0, Khojki_range32, 2 }, { "Khudawadi", +1, 0, 0, Khudawadi_range32, 2 }, - { "L", +1, L_range16, 384, L_range32, 215 }, - { "Lao", +1, Lao_range16, 18, 0, 0 }, - { "Latin", +1, Latin_range16, 30, 0, 0 }, + { "L", +1, L_range16, 380, L_range32, 279 }, + { "Lao", +1, Lao_range16, 11, 0, 0 }, + { "Latin", +1, Latin_range16, 34, Latin_range32, 5 }, { "Lepcha", +1, Lepcha_range16, 3, 0, 0 }, { "Limbu", +1, Limbu_range16, 5, 0, 0 }, { "Linear_A", +1, 0, 0, Linear_A_range32, 3 }, { "Linear_B", +1, 0, 0, Linear_B_range32, 7 }, - { "Lisu", +1, Lisu_range16, 1, 0, 0 }, - { "Ll", +1, Ll_range16, 604, Ll_range32, 34 }, - { "Lm", +1, Lm_range16, 54, Lm_range32, 3 }, - { "Lo", +1, Lo_range16, 295, Lo_range32, 175 }, + { "Lisu", +1, Lisu_range16, 1, Lisu_range32, 1 }, + { "Ll", +1, Ll_range16, 617, Ll_range32, 41 }, + { "Lm", +1, Lm_range16, 57, Lm_range32, 14 }, + { "Lo", +1, Lo_range16, 290, Lo_range32, 220 }, { "Lt", +1, Lt_range16, 10, 0, 0 }, - { "Lu", +1, Lu_range16, 594, Lu_range32, 37 }, + { "Lu", +1, Lu_range16, 605, Lu_range32, 41 }, { "Lycian", +1, 0, 0, Lycian_range32, 1 }, { "Lydian", +1, 0, 0, Lydian_range32, 2 }, - { "M", +1, M_range16, 187, M_range32, 88 }, + { "M", +1, M_range16, 190, M_range32, 120 }, { "Mahajani", +1, 0, 0, Mahajani_range32, 1 }, { "Makasar", +1, 0, 0, Makasar_range32, 1 }, - { "Malayalam", +1, Malayalam_range16, 8, 0, 0 }, + { "Malayalam", +1, Malayalam_range16, 7, 0, 0 }, { "Mandaic", +1, Mandaic_range16, 2, 0, 0 }, { "Manichaean", +1, 0, 0, Manichaean_range32, 2 }, { "Marchen", +1, 0, 0, Marchen_range32, 3 }, { "Masaram_Gondi", +1, 0, 0, Masaram_Gondi_range32, 7 }, - { "Mc", +1, Mc_range16, 110, Mc_range32, 56 }, + { "Mc", +1, Mc_range16, 112, Mc_range32, 70 }, { "Me", +1, Me_range16, 5, 0, 0 }, { "Medefaidrin", +1, 0, 0, Medefaidrin_range32, 1 }, { "Meetei_Mayek", +1, Meetei_Mayek_range16, 3, 0, 0 }, @@ -5965,21 +6409,24 @@ const UGroup unicode_groups[] = { { "Meroitic_Cursive", +1, 0, 0, Meroitic_Cursive_range32, 3 }, { "Meroitic_Hieroglyphs", +1, 0, 0, Meroitic_Hieroglyphs_range32, 1 }, { "Miao", +1, 0, 0, Miao_range32, 3 }, - { "Mn", +1, Mn_range16, 208, Mn_range32, 105 }, + { "Mn", +1, Mn_range16, 212, Mn_range32, 134 }, { "Modi", +1, 0, 0, Modi_range32, 2 }, - { "Mongolian", +1, Mongolian_range16, 6, Mongolian_range32, 1 }, + { "Mongolian", +1, Mongolian_range16, 5, Mongolian_range32, 1 }, { "Mro", +1, 0, 0, Mro_range32, 3 }, { "Multani", +1, 0, 0, Multani_range32, 5 }, { "Myanmar", +1, Myanmar_range16, 3, 0, 0 }, - { "N", +1, N_range16, 67, N_range32, 58 }, + { "N", +1, N_range16, 67, N_range32, 70 }, { "Nabataean", +1, 0, 0, Nabataean_range32, 2 }, - { "Nd", +1, Nd_range16, 37, Nd_range32, 20 }, + { "Nag_Mundari", +1, 0, 0, Nag_Mundari_range32, 1 }, + { "Nandinagari", +1, 0, 0, Nandinagari_range32, 3 }, + { "Nd", +1, Nd_range16, 37, Nd_range32, 27 }, { "New_Tai_Lue", +1, New_Tai_Lue_range16, 4, 0, 0 }, - { "Newa", +1, 0, 0, Newa_range32, 3 }, + { "Newa", +1, 0, 0, Newa_range32, 2 }, { "Nko", +1, Nko_range16, 2, 0, 0 }, { "Nl", +1, Nl_range16, 7, Nl_range32, 5 }, - { "No", +1, No_range16, 29, No_range32, 38 }, + { "No", +1, No_range16, 29, No_range32, 43 }, { "Nushu", +1, 0, 0, Nushu_range32, 2 }, + { "Nyiakeng_Puachue_Hmong", +1, 0, 0, Nyiakeng_Puachue_Hmong_range32, 4 }, { "Ogham", +1, Ogham_range16, 1, 0, 0 }, { "Ol_Chiki", +1, Ol_Chiki_range16, 1, 0, 0 }, { "Old_Hungarian", +1, 0, 0, Old_Hungarian_range32, 3 }, @@ -5990,40 +6437,41 @@ const UGroup unicode_groups[] = { { "Old_Sogdian", +1, 0, 0, Old_Sogdian_range32, 1 }, { "Old_South_Arabian", +1, 0, 0, Old_South_Arabian_range32, 1 }, { "Old_Turkic", +1, 0, 0, Old_Turkic_range32, 1 }, + { "Old_Uyghur", +1, 0, 0, Old_Uyghur_range32, 1 }, { "Oriya", +1, Oriya_range16, 14, 0, 0 }, { "Osage", +1, 0, 0, Osage_range32, 2 }, { "Osmanya", +1, 0, 0, Osmanya_range32, 2 }, - { "P", +1, P_range16, 130, P_range32, 48 }, + { "P", +1, P_range16, 133, P_range32, 58 }, { "Pahawh_Hmong", +1, 0, 0, Pahawh_Hmong_range32, 5 }, { "Palmyrene", +1, 0, 0, Palmyrene_range32, 1 }, { "Pau_Cin_Hau", +1, 0, 0, Pau_Cin_Hau_range32, 1 }, { "Pc", +1, Pc_range16, 6, 0, 0 }, - { "Pd", +1, Pd_range16, 17, 0, 0 }, - { "Pe", +1, Pe_range16, 72, 0, 0 }, + { "Pd", +1, Pd_range16, 18, Pd_range32, 1 }, + { "Pe", +1, Pe_range16, 76, 0, 0 }, { "Pf", +1, Pf_range16, 10, 0, 0 }, { "Phags_Pa", +1, Phags_Pa_range16, 1, 0, 0 }, { "Phoenician", +1, 0, 0, Phoenician_range32, 2 }, { "Pi", +1, Pi_range16, 11, 0, 0 }, - { "Po", +1, Po_range16, 127, Po_range32, 48 }, - { "Ps", +1, Ps_range16, 75, 0, 0 }, + { "Po", +1, Po_range16, 130, Po_range32, 57 }, + { "Ps", +1, Ps_range16, 79, 0, 0 }, { "Psalter_Pahlavi", +1, 0, 0, Psalter_Pahlavi_range32, 3 }, { "Rejang", +1, Rejang_range16, 2, 0, 0 }, { "Runic", +1, Runic_range16, 2, 0, 0 }, - { "S", +1, S_range16, 147, S_range32, 73 }, + { "S", +1, S_range16, 151, S_range32, 81 }, { "Samaritan", +1, Samaritan_range16, 2, 0, 0 }, { "Saurashtra", +1, Saurashtra_range16, 2, 0, 0 }, - { "Sc", +1, Sc_range16, 18, Sc_range32, 1 }, - { "Sharada", +1, 0, 0, Sharada_range32, 2 }, + { "Sc", +1, Sc_range16, 18, Sc_range32, 3 }, + { "Sharada", +1, 0, 0, Sharada_range32, 1 }, { "Shavian", +1, 0, 0, Shavian_range32, 1 }, { "Siddham", +1, 0, 0, Siddham_range32, 2 }, { "SignWriting", +1, 0, 0, SignWriting_range32, 3 }, { "Sinhala", +1, Sinhala_range16, 12, Sinhala_range32, 1 }, - { "Sk", +1, Sk_range16, 28, Sk_range32, 1 }, + { "Sk", +1, Sk_range16, 30, Sk_range32, 1 }, { "Sm", +1, Sm_range16, 53, Sm_range32, 11 }, - { "So", +1, So_range16, 112, So_range32, 62 }, + { "So", +1, So_range16, 114, So_range32, 70 }, { "Sogdian", +1, 0, 0, Sogdian_range32, 1 }, { "Sora_Sompeng", +1, 0, 0, Sora_Sompeng_range32, 2 }, - { "Soyombo", +1, 0, 0, Soyombo_range32, 2 }, + { "Soyombo", +1, 0, 0, Soyombo_range32, 1 }, { "Sundanese", +1, Sundanese_range16, 2, 0, 0 }, { "Syloti_Nagri", +1, Syloti_Nagri_range16, 1, 0, 0 }, { "Syriac", +1, Syriac_range16, 4, 0, 0 }, @@ -6033,17 +6481,22 @@ const UGroup unicode_groups[] = { { "Tai_Tham", +1, Tai_Tham_range16, 5, 0, 0 }, { "Tai_Viet", +1, Tai_Viet_range16, 2, 0, 0 }, { "Takri", +1, 0, 0, Takri_range32, 2 }, - { "Tamil", +1, Tamil_range16, 16, 0, 0 }, - { "Tangut", +1, 0, 0, Tangut_range32, 3 }, - { "Telugu", +1, Telugu_range16, 12, 0, 0 }, + { "Tamil", +1, Tamil_range16, 16, Tamil_range32, 2 }, + { "Tangsa", +1, 0, 0, Tangsa_range32, 2 }, + { "Tangut", +1, 0, 0, Tangut_range32, 4 }, + { "Telugu", +1, Telugu_range16, 13, 0, 0 }, { "Thaana", +1, Thaana_range16, 1, 0, 0 }, { "Thai", +1, Thai_range16, 2, 0, 0 }, { "Tibetan", +1, Tibetan_range16, 7, 0, 0 }, { "Tifinagh", +1, Tifinagh_range16, 3, 0, 0 }, { "Tirhuta", +1, 0, 0, Tirhuta_range32, 2 }, + { "Toto", +1, 0, 0, Toto_range32, 1 }, { "Ugaritic", +1, 0, 0, Ugaritic_range32, 2 }, { "Vai", +1, Vai_range16, 1, 0, 0 }, + { "Vithkuqi", +1, 0, 0, Vithkuqi_range32, 8 }, + { "Wancho", +1, 0, 0, Wancho_range32, 2 }, { "Warang_Citi", +1, 0, 0, Warang_Citi_range32, 2 }, + { "Yezidi", +1, 0, 0, Yezidi_range32, 3 }, { "Yi", +1, Yi_range16, 2, 0, 0 }, { "Z", +1, Z_range16, 8, 0, 0 }, { "Zanabazar_Square", +1, 0, 0, Zanabazar_Square_range32, 1 }, @@ -6051,9 +6504,9 @@ const UGroup unicode_groups[] = { { "Zp", +1, Zp_range16, 1, 0, 0 }, { "Zs", +1, Zs_range16, 7, 0, 0 }, }; -const int num_unicode_groups = 184; +const int num_unicode_groups = 199; -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/re2/unicode_groups.h b/src/duckdb/third_party/re2/re2/unicode_groups.h index 58392ff2..56069c6d 100644 --- a/src/duckdb/third_party/re2/re2/unicode_groups.h +++ b/src/duckdb/third_party/re2/re2/unicode_groups.h @@ -62,6 +62,6 @@ extern const int num_posix_groups; extern const UGroup perl_groups[]; extern const int num_perl_groups; -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_UNICODE_GROUPS_H_ diff --git a/src/duckdb/third_party/re2/re2/walker-inl.h b/src/duckdb/third_party/re2/re2/walker-inl.h index 572978d8..1bbec1c1 100644 --- a/src/duckdb/third_party/re2/re2/walker-inl.h +++ b/src/duckdb/third_party/re2/re2/walker-inl.h @@ -25,10 +25,7 @@ template struct WalkState; template class Regexp::Walker { public: Walker(); - virtual ~Walker() { - Reset(); - delete stack_; - } + virtual ~Walker(); // Virtual method called before visiting re's children. // PreVisit passes ownership of its return value to its caller. @@ -92,7 +89,7 @@ template class Regexp::Walker { private: // Walk state for the entire traversal. - std::stack >* stack_; + std::stack> stack_; bool stopped_early_; int max_visits_; @@ -122,7 +119,7 @@ template T Regexp::Walker::Copy(T arg) { // State about a single level in the traversal. template struct WalkState { - WalkState(Regexp* re, T parent) + WalkState(Regexp* re, T parent) : re(re), n(-1), parent_arg(parent), @@ -137,19 +134,23 @@ template struct WalkState { }; template Regexp::Walker::Walker() { - stack_ = new std::stack >; stopped_early_ = false; } +template Regexp::Walker::~Walker() { + Reset(); +} + // Clears the stack. Should never be necessary, since // Walk always enters and exits with an empty stack. // Logs DFATAL if stack is not already clear. template void Regexp::Walker::Reset() { - if (stack_ && stack_->size() > 0) { + if (!stack_.empty()) { LOG(DFATAL) << "Stack not empty."; - while (stack_->size() > 0) { - delete stack_->top().child_args; - stack_->pop(); + while (!stack_.empty()) { + if (stack_.top().re->nsub_ > 1) + delete[] stack_.top().child_args; + stack_.pop(); } } } @@ -163,13 +164,13 @@ template T Regexp::Walker::WalkInternal(Regexp* re, T top_arg, return top_arg; } - stack_->push(WalkState(re, top_arg)); + stack_.push(WalkState(re, top_arg)); WalkState* s; for (;;) { T t; - s = &stack_->top(); - Regexp* re = s->re; + s = &stack_.top(); + re = s->re; switch (s->n) { case -1: { if (--max_visits_ < 0) { @@ -199,7 +200,7 @@ template T Regexp::Walker::WalkInternal(Regexp* re, T top_arg, s->child_args[s->n] = Copy(s->child_args[s->n - 1]); s->n++; } else { - stack_->push(WalkState(sub[s->n], s->pre_arg)); + stack_.push(WalkState(sub[s->n], s->pre_arg)); } continue; } @@ -212,12 +213,12 @@ template T Regexp::Walker::WalkInternal(Regexp* re, T top_arg, } } - // We've finished stack_->top(). + // We've finished stack_.top(). // Update next guy down. - stack_->pop(); - if (stack_->size() == 0) + stack_.pop(); + if (stack_.empty()) return t; - s = &stack_->top(); + s = &stack_.top(); if (s->child_args != NULL) s->child_args[s->n] = t; else @@ -241,6 +242,6 @@ template T Regexp::Walker::WalkExponential(Regexp* re, T top_arg, return WalkInternal(re, top_arg, false); } -} // namespace duckdb_re2 +} // namespace re2 #endif // RE2_WALKER_INL_H_ diff --git a/src/duckdb/third_party/re2/util/logging.h b/src/duckdb/third_party/re2/util/logging.h index 668667e8..787d68a9 100644 --- a/src/duckdb/third_party/re2/util/logging.h +++ b/src/duckdb/third_party/re2/util/logging.h @@ -12,6 +12,7 @@ #include #include #include +#include #include "util/util.h" @@ -54,23 +55,18 @@ #define VLOG(x) if((x)>0){}else LOG_INFO.stream() -namespace duckdb_re2 { - - class LogMessage { public: LogMessage(const char* file, int line) : flushed_(false) { - stream() << file << ":" << line << ": "; +// stream() << file << ":" << line << ": "; } void Flush() { - stream() << "\n"; - /*// R does not allow us to have a reference to stderr even if we are not using it - std::string s = str_.str(); - size_t n = s.size(); - if (fwrite(s.data(), 1, n, stderr) < n) {} // shut up gcc - */ - flushed_ = true; +// stream() << "\n"; +// std::string s = str_.str(); +// size_t n = s.size(); +// if (fwrite(s.data(), 1, n, stderr) < n) {} // shut up gcc +// flushed_ = true; } ~LogMessage() { if (!flushed_) { @@ -90,26 +86,26 @@ class LogMessage { // Silence "destructor never returns" warning for ~LogMessageFatal(). // Since this is a header file, push and then pop to limit the scope. #ifdef _MSC_VER -//#pragma warning(push) -//#pragma warning(disable: 4722) +#pragma warning(push) +#pragma warning(disable: 4722) #endif class LogMessageFatal : public LogMessage { public: LogMessageFatal(const char* file, int line) - : LogMessage(file, line) {} - ATTRIBUTE_NORETURN ~LogMessageFatal() { + : LogMessage(file, line) { + throw std::runtime_error("RE2 Fatal Error"); + } + ~LogMessageFatal() { Flush(); - abort(); } private: LogMessageFatal(const LogMessageFatal&) = delete; LogMessageFatal& operator=(const LogMessageFatal&) = delete; }; -} // namespace #ifdef _MSC_VER -//#pragma warning(pop) +#pragma warning(pop) #endif #endif // UTIL_LOGGING_H_ diff --git a/src/duckdb/third_party/re2/util/mix.h b/src/duckdb/third_party/re2/util/mix.h index a1181170..2b889e5f 100644 --- a/src/duckdb/third_party/re2/util/mix.h +++ b/src/duckdb/third_party/re2/util/mix.h @@ -13,8 +13,8 @@ namespace duckdb_re2 { // Silence "truncation of constant value" warning for kMul in 32-bit mode. // Since this is a header file, push and then pop to limit the scope. #ifdef _MSC_VER -//#pragma warning(push) -//#pragma warning(disable: 4309) +#pragma warning(push) +#pragma warning(disable: 4309) #endif class HashMix { @@ -33,9 +33,9 @@ class HashMix { }; #ifdef _MSC_VER -//#pragma warning(pop) +#pragma warning(pop) #endif -} // namespace duckdb_re2 +} // namespace re2 #endif // UTIL_MIX_H_ diff --git a/src/duckdb/third_party/re2/util/mutex.h b/src/duckdb/third_party/re2/util/mutex.h index 7b34294c..a3d262d3 100644 --- a/src/duckdb/third_party/re2/util/mutex.h +++ b/src/duckdb/third_party/re2/util/mutex.h @@ -10,24 +10,39 @@ * You should assume the locks are *not* re-entrant. */ -#if !defined(_WIN32) +#ifdef RE2_NO_THREADS +#include +#define MUTEX_IS_LOCK_COUNTER +#else +#ifdef _WIN32 +// Requires Windows Vista or Windows Server 2008 at minimum. +#include +#if defined(WINVER) && WINVER >= 0x0600 +#define MUTEX_IS_WIN32_SRWLOCK +#endif +#else #ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 200809L #endif #include -//#if defined(_POSIX_READER_WRITER_LOCKS) && _POSIX_READER_WRITER_LOCKS > 0 -//#define MUTEX_IS_PTHREAD_RWLOCK -//#endif +#if defined(_POSIX_READER_WRITER_LOCKS) && _POSIX_READER_WRITER_LOCKS > 0 +#define MUTEX_IS_PTHREAD_RWLOCK +#endif +#endif #endif -#if defined(MUTEX_IS_PTHREAD_RWLOCK) -#error We really dont want to include pthread +#if defined(MUTEX_IS_LOCK_COUNTER) +typedef int MutexType; +#elif defined(MUTEX_IS_WIN32_SRWLOCK) +typedef SRWLOCK MutexType; +#elif defined(MUTEX_IS_PTHREAD_RWLOCK) +#include #include #include typedef pthread_rwlock_t MutexType; #else -#include -typedef std::mutex MutexType; +#include +typedef std::shared_mutex MutexType; #endif namespace duckdb_re2 { @@ -57,15 +72,33 @@ class Mutex { Mutex& operator=(const Mutex&) = delete; }; -#if defined(MUTEX_IS_PTHREAD_RWLOCK) +#if defined(MUTEX_IS_LOCK_COUNTER) + +Mutex::Mutex() : mutex_(0) { } +Mutex::~Mutex() { assert(mutex_ == 0); } +void Mutex::Lock() { assert(--mutex_ == -1); } +void Mutex::Unlock() { assert(mutex_++ == -1); } +void Mutex::ReaderLock() { assert(++mutex_ > 0); } +void Mutex::ReaderUnlock() { assert(mutex_-- > 0); } + +#elif defined(MUTEX_IS_WIN32_SRWLOCK) + +Mutex::Mutex() : mutex_(SRWLOCK_INIT) { } +Mutex::~Mutex() { } +void Mutex::Lock() { AcquireSRWLockExclusive(&mutex_); } +void Mutex::Unlock() { ReleaseSRWLockExclusive(&mutex_); } +void Mutex::ReaderLock() { AcquireSRWLockShared(&mutex_); } +void Mutex::ReaderUnlock() { ReleaseSRWLockShared(&mutex_); } + +#elif defined(MUTEX_IS_PTHREAD_RWLOCK) #define SAFE_PTHREAD(fncall) \ do { \ - if ((fncall) != 0) abort(); \ - } while (0) + if ((fncall) != 0) throw std::runtime_error("RE2 pthread failure"); \ + } while (0); Mutex::Mutex() { SAFE_PTHREAD(pthread_rwlock_init(&mutex_, NULL)); } -Mutex::~Mutex() { SAFE_PTHREAD(pthread_rwlock_destroy(&mutex_)); } +Mutex::~Mutex() { pthread_rwlock_destroy(&mutex_); } void Mutex::Lock() { SAFE_PTHREAD(pthread_rwlock_wrlock(&mutex_)); } void Mutex::Unlock() { SAFE_PTHREAD(pthread_rwlock_unlock(&mutex_)); } void Mutex::ReaderLock() { SAFE_PTHREAD(pthread_rwlock_rdlock(&mutex_)); } @@ -79,8 +112,8 @@ Mutex::Mutex() { } Mutex::~Mutex() { } void Mutex::Lock() { mutex_.lock(); } void Mutex::Unlock() { mutex_.unlock(); } -void Mutex::ReaderLock() { Lock(); } // C++11 doesn't have std::shared_mutex. -void Mutex::ReaderUnlock() { Unlock(); } +void Mutex::ReaderLock() { mutex_.lock_shared(); } +void Mutex::ReaderUnlock() { mutex_.unlock_shared(); } #endif @@ -127,6 +160,6 @@ class WriterMutexLock { #define ReaderMutexLock(x) static_assert(false, "ReaderMutexLock declaration missing variable name") #define WriterMutexLock(x) static_assert(false, "WriterMutexLock declaration missing variable name") -} // namespace duckdb_re2 +} // namespace re2 #endif // UTIL_MUTEX_H_ diff --git a/src/duckdb/third_party/re2/util/rune.cc b/src/duckdb/third_party/re2/util/rune.cc index ceb4ca15..04a22852 100644 --- a/src/duckdb/third_party/re2/util/rune.cc +++ b/src/duckdb/third_party/re2/util/rune.cc @@ -51,7 +51,7 @@ int chartorune(Rune *rune, const char *str) { int c, c1, c2, c3; - long l; + Rune l; /* * one character sequence @@ -127,7 +127,7 @@ int runetochar(char *str, const Rune *rune) { /* Runes are signed, so convert to unsigned for range check. */ - unsigned long c; + unsigned int c; /* * one character sequence @@ -212,7 +212,7 @@ int utflen(const char *s) { int c; - long n; + int n; Rune rune; n = 0; @@ -232,7 +232,7 @@ utflen(const char *s) char* utfrune(const char *s, Rune c) { - long c1; + int c1; Rune r; int n; @@ -257,4 +257,4 @@ utfrune(const char *s, Rune c) return 0; } -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/util/strutil.cc b/src/duckdb/third_party/re2/util/strutil.cc index bbb11d4f..54c05a1b 100644 --- a/src/duckdb/third_party/re2/util/strutil.cc +++ b/src/duckdb/third_party/re2/util/strutil.cc @@ -146,19 +146,4 @@ std::string StringPrintf(const char* format, ...) { return result; } -void SStringPrintf(std::string* dst, const char* format, ...) { - va_list ap; - va_start(ap, format); - dst->clear(); - StringAppendV(dst, format, ap); - va_end(ap); -} - -void StringAppendF(std::string* dst, const char* format, ...) { - va_list ap; - va_start(ap, format); - StringAppendV(dst, format, ap); - va_end(ap); -} - -} // namespace duckdb_re2 +} // namespace re2 diff --git a/src/duckdb/third_party/re2/util/strutil.h b/src/duckdb/third_party/re2/util/strutil.h index e81bbedc..fa64d0b3 100644 --- a/src/duckdb/third_party/re2/util/strutil.h +++ b/src/duckdb/third_party/re2/util/strutil.h @@ -15,9 +15,7 @@ namespace duckdb_re2 { std::string CEscape(const StringPiece& src); void PrefixSuccessor(std::string* prefix); std::string StringPrintf(const char* format, ...); -void SStringPrintf(std::string* dst, const char* format, ...); -void StringAppendF(std::string* dst, const char* format, ...); -} // namespace duckdb_re2 +} // namespace re2 #endif // UTIL_STRUTIL_H_ diff --git a/src/duckdb/third_party/re2/util/utf.h b/src/duckdb/third_party/re2/util/utf.h index a4a3dc53..6d7bc083 100644 --- a/src/duckdb/third_party/re2/util/utf.h +++ b/src/duckdb/third_party/re2/util/utf.h @@ -39,6 +39,6 @@ int fullrune(const char* s, int n); int utflen(const char* s); char* utfrune(const char*, Rune); -} // namespace duckdb_re2 +} // namespace re2 #endif // UTIL_UTF_H_ diff --git a/src/duckdb/third_party/re2/util/util.h b/src/duckdb/third_party/re2/util/util.h index 3f75794d..56e46c1a 100644 --- a/src/duckdb/third_party/re2/util/util.h +++ b/src/duckdb/third_party/re2/util/util.h @@ -5,7 +5,7 @@ #ifndef UTIL_UTIL_H_ #define UTIL_UTIL_H_ -#define arraysize(array) (int)(sizeof(array)/sizeof((array)[0])) +#define arraysize(array) (sizeof(array)/sizeof((array)[0])) #ifndef ATTRIBUTE_NORETURN #if defined(__GNUC__) @@ -17,6 +17,14 @@ #endif #endif +#ifndef ATTRIBUTE_UNUSED +#if defined(__GNUC__) +#define ATTRIBUTE_UNUSED __attribute__((unused)) +#else +#define ATTRIBUTE_UNUSED +#endif +#endif + #ifndef FALLTHROUGH_INTENDED #if defined(__clang__) #define FALLTHROUGH_INTENDED [[clang::fallthrough]] diff --git a/src/duckdb/third_party/utf8proc/include/utf8proc_wrapper.hpp b/src/duckdb/third_party/utf8proc/include/utf8proc_wrapper.hpp index fb988b25..a7fb8c66 100644 --- a/src/duckdb/third_party/utf8proc/include/utf8proc_wrapper.hpp +++ b/src/duckdb/third_party/utf8proc/include/utf8proc_wrapper.hpp @@ -26,6 +26,8 @@ class Utf8Proc { static char* Normalize(const char* s, size_t len); //! Returns whether or not the UTF8 string is valid static bool IsValid(const char *s, size_t len); + //! Makes Invalid Unicode valid by replacing invalid parts with a given character + static void MakeValid(char *s, size_t len, char special_flag = '?'); //! Returns the position (in bytes) of the next grapheme cluster static size_t NextGraphemeCluster(const char *s, size_t len, size_t pos); //! Returns the position (in bytes) of the previous grapheme cluster diff --git a/src/duckdb/third_party/utf8proc/utf8proc_wrapper.cpp b/src/duckdb/third_party/utf8proc/utf8proc_wrapper.cpp index c47472a3..9ff3615e 100644 --- a/src/duckdb/third_party/utf8proc/utf8proc_wrapper.cpp +++ b/src/duckdb/third_party/utf8proc/utf8proc_wrapper.cpp @@ -1,6 +1,6 @@ #include "utf8proc_wrapper.hpp" #include "utf8proc.hpp" - +#include "duckdb/common/assert.hpp" using namespace std; namespace duckdb { @@ -102,6 +102,41 @@ UnicodeType Utf8Proc::Analyze(const char *s, size_t len, UnicodeInvalidReason *i return type; } +void Utf8Proc::MakeValid(char *s, size_t len, char special_flag){ + D_ASSERT(special_flag <=127); + UnicodeType type = UnicodeType::ASCII; + for (size_t i = 0; i < len; i++) { + int c = (int) s[i]; + if ((c & 0x80) == 0) { + continue; + } + int first_pos_seq = i; + if ((c & 0xE0) == 0xC0) { + /* 2 byte sequence */ + int utf8char = c & 0x1F; + type = UTF8ExtraByteLoop<1, 0x000780>(first_pos_seq, utf8char, i, s, len, nullptr, nullptr); + } else if ((c & 0xF0) == 0xE0) { + /* 3 byte sequence */ + int utf8char = c & 0x0F; + type = UTF8ExtraByteLoop<2, 0x00F800>(first_pos_seq, utf8char, i, s, len, nullptr, nullptr); + } else if ((c & 0xF8) == 0xF0) { + /* 4 byte sequence */ + int utf8char = c & 0x07; + type = UTF8ExtraByteLoop<3, 0x1F0000>(first_pos_seq, utf8char, i, s, len, nullptr, nullptr); + } else { + /* invalid UTF-8 start byte */ + s[i] = special_flag; // Rewrite invalid byte + } + if (type == UnicodeType::INVALID) { + for (size_t j = first_pos_seq; j <= i; j++) { + s[j] = special_flag; // Rewrite each byte of the invalid sequence + } + type = UnicodeType::ASCII; + } + } + D_ASSERT(Utf8Proc::IsValid(s,len)); +} + char* Utf8Proc::Normalize(const char *s, size_t len) { assert(s); assert(Utf8Proc::Analyze(s, len) != UnicodeType::INVALID); diff --git a/src/duckdb/ub_src_common.cpp b/src/duckdb/ub_src_common.cpp index 8145f700..948f1c10 100644 --- a/src/duckdb/ub_src_common.cpp +++ b/src/duckdb/ub_src_common.cpp @@ -12,8 +12,6 @@ #include "src/common/checksum.cpp" -#include "src/common/cycle_counter.cpp" - #include "src/common/exception.cpp" #include "src/common/exception_format_value.cpp" diff --git a/src/duckdb/ub_src_execution_physical_plan.cpp b/src/duckdb/ub_src_execution_physical_plan.cpp index a78d05a7..e7f6016d 100644 --- a/src/duckdb/ub_src_execution_physical_plan.cpp +++ b/src/duckdb/ub_src_execution_physical_plan.cpp @@ -76,6 +76,8 @@ #include "src/execution/physical_plan/plan_window.cpp" +#include "src/execution/physical_plan/plan_vacuum.cpp" + #include "src/execution/physical_plan/plan_unnest.cpp" #include "src/execution/physical_plan/plan_expression_get.cpp" diff --git a/src/duckdb/ub_src_planner_expression.cpp b/src/duckdb/ub_src_planner_expression.cpp index cb9bd412..48fe0557 100644 --- a/src/duckdb/ub_src_planner_expression.cpp +++ b/src/duckdb/ub_src_planner_expression.cpp @@ -16,6 +16,8 @@ #include "src/planner/expression/bound_constant_expression.cpp" +#include "src/planner/expression/bound_expanded_expression.cpp" + #include "src/planner/expression/bound_function_expression.cpp" #include "src/planner/expression/bound_lambda_expression.cpp" diff --git a/src/duckdb/ub_src_planner_expression_binder.cpp b/src/duckdb/ub_src_planner_expression_binder.cpp index cdf8d294..982e3014 100644 --- a/src/duckdb/ub_src_planner_expression_binder.cpp +++ b/src/duckdb/ub_src_planner_expression_binder.cpp @@ -30,6 +30,8 @@ #include "src/planner/expression_binder/select_binder.cpp" +#include "src/planner/expression_binder/select_bind_state.cpp" + #include "src/planner/expression_binder/table_function_binder.cpp" #include "src/planner/expression_binder/update_binder.cpp" diff --git a/src/duckdb/ub_src_planner_operator.cpp b/src/duckdb/ub_src_planner_operator.cpp index 37894856..0ec5e67d 100644 --- a/src/duckdb/ub_src_planner_operator.cpp +++ b/src/duckdb/ub_src_planner_operator.cpp @@ -80,5 +80,7 @@ #include "src/planner/operator/logical_update.cpp" +#include "src/planner/operator/logical_vacuum.cpp" + #include "src/planner/operator/logical_window.cpp" From 1767e9cc52b996dce4a9e2f61a73927b86ae7c8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20M=C3=BChleisen?= Date: Wed, 17 Apr 2024 20:41:53 +0200 Subject: [PATCH 2/2] forgot binding --- binding.gyp | 40 ++++++++++++++++++++++------------------ binding.gyp.in | 3 +++ 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/binding.gyp b/binding.gyp index 1d9baf4c..94792f47 100644 --- a/binding.gyp +++ b/binding.gyp @@ -166,9 +166,9 @@ "src/duckdb/src/verification/statement_verifier.cpp", "src/duckdb/src/verification/unoptimized_statement_verifier.cpp", "src/duckdb/third_party/fmt/format.cc", - "src/duckdb/third_party/fsst/fsst_avx512.cpp", "src/duckdb/third_party/fsst/libfsst.cpp", "src/duckdb/third_party/miniz/miniz.cpp", + "src/duckdb/third_party/re2/re2/bitmap256.cc", "src/duckdb/third_party/re2/re2/bitstate.cc", "src/duckdb/third_party/re2/re2/compile.cc", "src/duckdb/third_party/re2/re2/dfa.cc", @@ -271,6 +271,7 @@ "src/duckdb/third_party/zstd/compress/zstd_lazy.cpp", "src/duckdb/third_party/zstd/compress/zstd_ldm.cpp", "src/duckdb/third_party/zstd/compress/zstd_opt.cpp", + "src/duckdb/third_party/lz4/lz4.cpp", "src/duckdb/extension/icu/./icu-table-range.cpp", "src/duckdb/extension/icu/./icu-makedate.cpp", "src/duckdb/extension/icu/./icu-list-range.cpp", @@ -301,30 +302,32 @@ "include_dirs": [ "