From 388d56fdc751b34fde088fbee7555e804e4e84ab Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Fri, 7 Nov 2025 00:07:11 -0800 Subject: [PATCH] enhance: Add support for minimum_should_match in text_match (parser, engine, client, and tests) (#44988) ### Is there an existing issue for this? - [x] I have searched the existing issues --- Please see: https://github.com/milvus-io/milvus/issues/44593 for the background This PR makes https://github.com/milvus-io/milvus/pull/44638 redundant, which can be closed. The PR comments for the original implementation suggested an alternative and a better approach, this new PR has that implementation. --- This PR - Adds an optional `minimum_should_match` argument to `text_match(...)` and wires it through the parser, planner/visitor, index bindings, and client-level tests/examples so full-text queries can require a minimum number of tokens to match. Motivation - Provide a way to require an expression to match a minimum number of tokens in lexical search. What changed - Parser / grammar - Added grammar rule and token: `MINIMUM_SHOULD_MATCH` and `textMatchOption` in `internal/parser/planparserv2/Plan.g4`. - Regenerated parser outputs: `internal/parser/planparserv2/generated/*` (parser, lexer, visitor, etc.) to support the new rule. - Planner / visitor - `parser_visitor.go`: parse and validate the `minimum_should_match` integer; propagate as an extra value on the `TextMatch` expression so downstream components receive it. - Added `VisitTextMatchOption` visitor method handling. - Client (Golang) - Added a unit test to verify `text_match(..., minimum_should_match=...)` appears in the generated DSL and is accepted by client code: `client/milvusclient/read_test.go` (new test coverage). - Added an integration-style test for the feature to the go-client testcase suite: `tests/go_client/testcases/full_text_search_test.go` (exercise min=1, min=3, large min). - Added an example demonstrating `text_match` usage: `client/milvusclient/read_example_test.go` (example name conforms to godoc mapping). - Engine / index - Updated C++ index interface: `TextMatchIndex::MatchQuery` - Added/updated unit tests for the index behavior: `internal/core/src/index/TextMatchIndexTest.cpp`. - Tantivy binding - Added `match_query_with_minimum` implementation and unit tests to `internal/core/thirdparty/tantivy/tantivy-binding/src/index_reader_text.rs` that construct boolean queries with minimum required clauses. Behavioral / compatibility notes - This adds an optional argument to `text_match` only; default behavior (no `minimum_should_match`) is unchanged. - Internal API change: `TextMatchIndex::MatchQuery` signature changed (internal component). Callers in the repo were updated accordingly. - Parser changes required regenerating ANTLR outputs Tests and verification - New/updated tests: - Go client unit test: `client/milvusclient/read_test.go` (mocked Search request asserts DSL contains `minimum_should_match=2`). - Go e2e-style test: `tests/go_client/testcases/full_text_search_test.go` (exercises min=1, 3 and a large min). - C++ unit tests for index behavior: `internal/core/src/index/TextMatchIndexTest.cpp`. - Rust binding unit tests for `match_query_with_minimum`. - Local verification commands to run: - Go client tests: `cd client && go test ./milvusclient -run ^$` (client package) - Go testcases: `cd tests/go_client && go test ./testcases -run TestTextMatchMinimumShouldMatch` (requires a running Milvus instance) - C++ unit tests / build: run core build/test per repo instructions (the change touches core index code). - Rust binding tests: `cd internal/core/thirdparty/tantivy/tantivy-binding && cargo test` (if developing locally). --------- Signed-off-by: Amit Kumar Co-authored-by: Amit Kumar --- client/milvusclient/read_example_test.go | 88 ++ client/milvusclient/read_test.go | 40 + go.mod | 4 +- go.sum | 8 +- .../core/src/exec/expression/UnaryExpr.cpp | 14 +- internal/core/src/index/TextMatchIndex.cpp | 9 +- internal/core/src/index/TextMatchIndex.h | 2 +- .../core/src/index/TextMatchIndexTest.cpp | 9 +- .../tantivy-binding/include/tantivy-binding.h | 1060 ++++++++------- .../tantivy-binding/src/index_reader_text.rs | 89 +- .../src/index_reader_text_c.rs | 11 +- .../core/thirdparty/tantivy/tantivy-wrapper.h | 7 +- internal/parser/planparserv2/Plan.g4 | 7 +- .../parser/planparserv2/generated/Plan.interp | 7 +- .../parser/planparserv2/generated/Plan.tokens | 115 +- .../planparserv2/generated/PlanLexer.interp | 8 +- .../planparserv2/generated/PlanLexer.tokens | 115 +- .../generated/plan_base_visitor.go | 4 + .../planparserv2/generated/plan_lexer.go | 1161 +++++++++-------- .../planparserv2/generated/plan_parser.go | 998 ++++++++------ .../planparserv2/generated/plan_visitor.go | 3 + .../parser/planparserv2/parser_visitor.go | 59 +- .../planparserv2/plan_parser_v2_test.go | 266 ++++ .../testcases/full_text_search_test.go | 39 + 24 files changed, 2533 insertions(+), 1590 deletions(-) diff --git a/client/milvusclient/read_example_test.go b/client/milvusclient/read_example_test.go index 2f4a7155da..08a995b96c 100644 --- a/client/milvusclient/read_example_test.go +++ b/client/milvusclient/read_example_test.go @@ -403,3 +403,91 @@ func ExampleClient_HybridSearch() { log.Println("Scores: ", resultSet.Scores) } } + +func ExampleClient_Search_textMatch() { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + collectionName := "text_min_match" + titleField := "title" + textField := "document_text" + titleSparse := "title_sparse_vector" + textSparse := "text_sparse_vector" + milvusAddr := "127.0.0.1:19530" + + cli, err := milvusclient.New(ctx, &milvusclient.ClientConfig{ + Address: milvusAddr, + }) + if err != nil { + log.Fatal("failed to connect to milvus server: ", err.Error()) + } + defer cli.Close(ctx) + + _ = cli.DropCollection(ctx, milvusclient.NewDropCollectionOption(collectionName)) + + schema := entity.NewSchema(). + WithField(entity.NewField().WithName("id").WithDataType(entity.FieldTypeInt64).WithIsPrimaryKey(true).WithIsAutoID(true)). + WithField(entity.NewField().WithName(titleField).WithDataType(entity.FieldTypeVarChar).WithMaxLength(512).WithEnableAnalyzer(true).WithEnableMatch(true)). + WithField(entity.NewField().WithName(textField).WithDataType(entity.FieldTypeVarChar).WithMaxLength(2048).WithEnableAnalyzer(true).WithEnableMatch(true)). + WithField(entity.NewField().WithName(titleSparse).WithDataType(entity.FieldTypeSparseVector)). + WithField(entity.NewField().WithName(textSparse).WithDataType(entity.FieldTypeSparseVector)). + WithFunction(entity.NewFunction().WithName("title_bm25_func").WithType(entity.FunctionTypeBM25).WithInputFields(titleField).WithOutputFields(titleSparse)). + WithFunction(entity.NewFunction().WithName("text_bm25_func").WithType(entity.FunctionTypeBM25).WithInputFields(textField).WithOutputFields(textSparse)) + + idxOpts := []milvusclient.CreateIndexOption{ + milvusclient.NewCreateIndexOption(collectionName, titleField, index.NewInvertedIndex()), + milvusclient.NewCreateIndexOption(collectionName, textField, index.NewInvertedIndex()), + milvusclient.NewCreateIndexOption(collectionName, titleSparse, index.NewSparseInvertedIndex(entity.BM25, 0.2)), + milvusclient.NewCreateIndexOption(collectionName, textSparse, index.NewSparseInvertedIndex(entity.BM25, 0.2)), + } + + err = cli.CreateCollection(ctx, milvusclient.NewCreateCollectionOption(collectionName, schema).WithIndexOptions(idxOpts...)) + if err != nil { + log.Fatal("failed to create collection: ", err.Error()) + } + + _, err = cli.Insert(ctx, milvusclient.NewColumnBasedInsertOption(collectionName). + WithVarcharColumn(titleField, []string{ + "History of AI", + "Alan Turing Biography", + "Machine Learning Overview", + }). + WithVarcharColumn(textField, []string{ + "Artificial intelligence was founded in 1956 by computer scientists.", + "Alan Turing proposed early concepts of AI and machine learning.", + "Machine learning is a subset of artificial intelligence.", + })) + if err != nil { + log.Fatal("failed to insert data: ", err.Error()) + } + + task, err := cli.LoadCollection(ctx, milvusclient.NewLoadCollectionOption(collectionName)) + if err != nil { + log.Fatal("failed to load collection: ", err.Error()) + } + _ = task.Await(ctx) + + q := "artificial intelligence" + expr := "text_match(" + titleField + ", \"" + q + "\", minimum_should_match=2) OR text_match(" + textField + ", \"" + q + "\", minimum_should_match=2)" + + boost := entity.NewFunction(). + WithName("title_boost"). + WithType(entity.FunctionTypeRerank). + WithParam("reranker", "boost"). + WithParam("filter", "text_match("+titleField+", \""+q+"\", minimum_should_match=2)"). + WithParam("weight", "2.0") + + vectors := []entity.Vector{entity.Text(q)} + rs, err := cli.Search(ctx, milvusclient.NewSearchOption(collectionName, 5, vectors). + WithANNSField(textSparse). + WithFilter(expr). + WithOutputFields("id", titleField, textField). + WithFunctionReranker(boost)) + if err != nil { + log.Fatal("failed to search: ", err.Error()) + } + + for _, r := range rs { + _ = r.ResultCount + } +} diff --git a/client/milvusclient/read_test.go b/client/milvusclient/read_test.go index 037f6ba426..99e95a691e 100644 --- a/client/milvusclient/read_test.go +++ b/client/milvusclient/read_test.go @@ -191,6 +191,46 @@ func (s *ReadSuite) TestSearch() { }) } +// TestSearch_TextMatch tests the text match search functionality. +// It tests the minimum_should_match parameter in the expression. +func (s *ReadSuite) TestSearch_TextMatch() { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + s.Run("min_should_match_in_expr", func() { + collectionName := fmt.Sprintf("coll_%s", s.randString(6)) + s.setupCache(collectionName, s.schema) + + s.mock.EXPECT().Search(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, sr *milvuspb.SearchRequest) (*milvuspb.SearchResults, error) { + // ensure the expression contains minimum_should_match and both fields + s.Contains(sr.GetDsl(), "minimum_should_match=2") + s.Contains(sr.GetDsl(), "text_match(") + return &milvuspb.SearchResults{ + Status: merr.Success(), + Results: &schemapb.SearchResultData{ + NumQueries: 1, + TopK: 1, + FieldsData: []*schemapb.FieldData{ + s.getInt64FieldData("ID", []int64{1}), + }, + Ids: &schemapb.IDs{IdField: &schemapb.IDs_IntId{IntId: &schemapb.LongArray{Data: []int64{1}}}}, + Scores: []float32{0.1}, + Topks: []int64{1}, + }, + }, nil + }).Once() + + q := "artificial intelligence" + expr := "text_match(title, \"" + q + "\", minimum_should_match=2) OR text_match(document_text, \"" + q + "\", minimum_should_match=2)" + vectors := []entity.Vector{entity.Text(q)} + _, err := s.client.Search(ctx, NewSearchOption(collectionName, 5, vectors). + WithANNSField("text_sparse_vector"). + WithFilter(expr). + WithOutputFields("ID")) + s.NoError(err) + }) +} + func (s *ReadSuite) TestHybridSearch() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() diff --git a/go.mod b/go.mod index f24bd59f01..6f955f1cb7 100644 --- a/go.mod +++ b/go.mod @@ -65,7 +65,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.23.0 github.com/bits-and-blooms/bitset v1.10.0 github.com/bytedance/mockey v1.2.14 - github.com/bytedance/sonic v1.13.2 + github.com/bytedance/sonic v1.14.0 github.com/cenkalti/backoff/v4 v4.2.1 github.com/cockroachdb/redact v1.1.3 github.com/google/uuid v1.6.0 @@ -136,7 +136,7 @@ require ( github.com/aws/smithy-go v1.22.2 // indirect github.com/benesch/cgosymbolizer v0.0.0-20190515212042-bec6fe6e597b // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bytedance/sonic/loader v0.2.4 // indirect + github.com/bytedance/sonic/loader v0.3.0 // indirect github.com/campoy/embedmd v1.0.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cilium/ebpf v0.11.0 // indirect diff --git a/go.sum b/go.sum index 21172727dd..e66d3d3f89 100644 --- a/go.sum +++ b/go.sum @@ -205,11 +205,11 @@ github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/bytedance/mockey v1.2.14 h1:KZaFgPdiUwW+jOWFieo3Lr7INM1P+6adO3hxZhDswY8= github.com/bytedance/mockey v1.2.14/go.mod h1:1BPHF9sol5R1ud/+0VEHGQq/+i2lN+GTsr3O2Q9IENY= -github.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ= -github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= +github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ= +github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= -github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= -github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA= +github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= github.com/campoy/embedmd v1.0.0 h1:V4kI2qTJJLf4J29RzI/MAt2c3Bl4dQSYPuflzwFH2hY= github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= github.com/casbin/casbin/v2 v2.0.0/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= diff --git a/internal/core/src/exec/expression/UnaryExpr.cpp b/internal/core/src/exec/expression/UnaryExpr.cpp index b01f68b699..a62ae71cb0 100644 --- a/internal/core/src/exec/expression/UnaryExpr.cpp +++ b/internal/core/src/exec/expression/UnaryExpr.cpp @@ -1797,10 +1797,18 @@ PhyUnaryRangeFilterExpr::ExecTextMatch() { } } - auto func = [op_type, slop](Index* index, - const std::string& query) -> TargetBitmap { + uint32_t min_should_match = 1; // default value + if (op_type == proto::plan::OpType::TextMatch && + expr_->extra_values_.size() > 0) { + // min_should_match is stored in the first extra value + min_should_match = static_cast( + GetValueFromProto(expr_->extra_values_[0])); + } + + auto func = [op_type, slop, min_should_match]( + Index* index, const std::string& query) -> TargetBitmap { if (op_type == proto::plan::OpType::TextMatch) { - return index->MatchQuery(query); + return index->MatchQuery(query, min_should_match); } else if (op_type == proto::plan::OpType::PhraseMatch) { return index->PhraseMatchQuery(query, slop); } else { diff --git a/internal/core/src/index/TextMatchIndex.cpp b/internal/core/src/index/TextMatchIndex.cpp index 3766524078..43669352d1 100644 --- a/internal/core/src/index/TextMatchIndex.cpp +++ b/internal/core/src/index/TextMatchIndex.cpp @@ -302,7 +302,8 @@ TextMatchIndex::RegisterTokenizer(const char* tokenizer_name, } TargetBitmap -TextMatchIndex::MatchQuery(const std::string& query) { +TextMatchIndex::MatchQuery(const std::string& query, + uint32_t min_should_match) { tracer::AutoSpan span("TextMatchIndex::MatchQuery", tracer::GetRootSpan()); if (shouldTriggerCommit()) { Commit(); @@ -310,10 +311,10 @@ TextMatchIndex::MatchQuery(const std::string& query) { } TargetBitmap bitset{static_cast(Count())}; - // The count opeartion of tantivy may be get older cnt if the index is committed with new tantivy segment. + // The count operation of tantivy may be get older cnt if the index is committed with new tantivy segment. // So we cannot use the count operation to get the total count for bitmap. // Just use the maximum offset of hits to get the total count for bitmap here. - wrapper_->match_query(query, &bitset); + wrapper_->match_query(query, min_should_match, &bitset); return bitset; } @@ -327,7 +328,7 @@ TextMatchIndex::PhraseMatchQuery(const std::string& query, uint32_t slop) { } TargetBitmap bitset{static_cast(Count())}; - // The count opeartion of tantivy may be get older cnt if the index is committed with new tantivy segment. + // The count operation of tantivy may be get older cnt if the index is committed with new tantivy segment. // So we cannot use the count operation to get the total count for bitmap. // Just use the maximum offset of hits to get the total count for bitmap here. wrapper_->phrase_match_query(query, slop, &bitset); diff --git a/internal/core/src/index/TextMatchIndex.h b/internal/core/src/index/TextMatchIndex.h index 59d725e1f3..02f62cfd4f 100644 --- a/internal/core/src/index/TextMatchIndex.h +++ b/internal/core/src/index/TextMatchIndex.h @@ -83,7 +83,7 @@ class TextMatchIndex : public InvertedIndexTantivy { RegisterTokenizer(const char* tokenizer_name, const char* analyzer_params); TargetBitmap - MatchQuery(const std::string& query); + MatchQuery(const std::string& query, uint32_t min_should_match); TargetBitmap PhraseMatchQuery(const std::string& query, uint32_t slop); diff --git a/internal/core/src/index/TextMatchIndexTest.cpp b/internal/core/src/index/TextMatchIndexTest.cpp index 858dc2e032..019d8bf2a0 100644 --- a/internal/core/src/index/TextMatchIndexTest.cpp +++ b/internal/core/src/index/TextMatchIndexTest.cpp @@ -164,7 +164,7 @@ TEST(TextMatch, Index) { index->Reload(); { - auto res = index->MatchQuery("football"); + auto res = index->MatchQuery("football", 1); ASSERT_EQ(res.size(), 3); ASSERT_TRUE(res[0]); ASSERT_FALSE(res[1]); @@ -177,11 +177,16 @@ TEST(TextMatch, Index) { ASSERT_TRUE(res2[0]); ASSERT_FALSE(res2[1]); ASSERT_TRUE(res2[2]); - res = index->MatchQuery("nothing"); + res = index->MatchQuery("nothing", 1); ASSERT_EQ(res.size(), 3); ASSERT_FALSE(res[0]); ASSERT_FALSE(res[1]); ASSERT_FALSE(res[2]); + auto res3 = index->MatchQuery("football pingpang cricket", 2); + ASSERT_EQ(res3.size(), 3); + ASSERT_TRUE(res3[0]); + ASSERT_FALSE(res3[1]); + ASSERT_FALSE(res3[2]); } { diff --git a/internal/core/thirdparty/tantivy/tantivy-binding/include/tantivy-binding.h b/internal/core/thirdparty/tantivy/tantivy-binding/include/tantivy-binding.h index bce05d8ea1..659b0f7860 100644 --- a/internal/core/thirdparty/tantivy/tantivy-binding/include/tantivy-binding.h +++ b/internal/core/thirdparty/tantivy/tantivy-binding/include/tantivy-binding.h @@ -7,501 +7,625 @@ #include enum class TantivyDataType : uint8_t { - Text, - Keyword, - I64, - F64, - Bool, - JSON, + Text, + Keyword, + I64, + F64, + Bool, + JSON, }; struct RustArray { - uint32_t *array; - size_t len; - size_t cap; + uint32_t* array; + size_t len; + size_t cap; }; struct RustArrayI64 { - int64_t *array; - size_t len; - size_t cap; + int64_t* array; + size_t len; + size_t cap; }; struct Value { - enum class Tag { - None, - RustArray, - RustArrayI64, - U32, - U64, - Ptr, - }; + enum class Tag { + None, + RustArray, + RustArrayI64, + U32, + U64, + Ptr, + }; - struct None_Body { + struct None_Body {}; - }; + struct RustArray_Body { + RustArray _0; + }; - struct RustArray_Body { - RustArray _0; - }; + struct RustArrayI64_Body { + RustArrayI64 _0; + }; - struct RustArrayI64_Body { - RustArrayI64 _0; - }; + struct U32_Body { + uint32_t _0; + }; - struct U32_Body { - uint32_t _0; - }; + struct U64_Body { + uint64_t _0; + }; - struct U64_Body { - uint64_t _0; - }; + struct Ptr_Body { + void* _0; + }; - struct Ptr_Body { - void *_0; - }; - - Tag tag; - union { - None_Body none; - RustArray_Body rust_array; - RustArrayI64_Body rust_array_i64; - U32_Body u32; - U64_Body u64; - Ptr_Body ptr; - }; + Tag tag; + union { + None_Body none; + RustArray_Body rust_array; + RustArrayI64_Body rust_array_i64; + U32_Body u32; + U64_Body u64; + Ptr_Body ptr; + }; }; struct RustResult { - bool success; - Value value; - const char *error; + bool success; + Value value; + const char* error; }; -using SetBitsetFn = void(*)(void*, const uint32_t*, uintptr_t); +using SetBitsetFn = void (*)(void*, const uint32_t*, uintptr_t); struct TantivyToken { - const char *token; - int64_t start_offset; - int64_t end_offset; - int64_t position; - int64_t position_length; + const char* token; + int64_t start_offset; + int64_t end_offset; + int64_t position; + int64_t position_length; }; extern "C" { -void free_rust_array(RustArray array); +void +free_rust_array(RustArray array); -void free_rust_array_i64(RustArrayI64 array); - -void free_rust_result(RustResult result); - -void free_rust_error(const char *error); - -RustResult test_enum_with_array(); - -RustResult test_enum_with_ptr(); - -void free_test_ptr(void *ptr); - -void print_vector_of_strings(const char *const *ptr, uintptr_t len); - -void *create_hashmap(); - -void hashmap_set_value(void *map, const char *key, const char *value); - -void free_hashmap(void *map); - -RustResult tantivy_create_json_key_stats_writer(const char *field_name, - const char *path, - uint32_t tantivy_index_version, - uintptr_t num_threads, - uintptr_t overall_memory_budget_in_bytes, - bool in_ram); - -RustResult tantivy_create_ngram_writer(const char *field_name, - const char *path, - uintptr_t min_gram, - uintptr_t max_gram, - uintptr_t num_threads, - uintptr_t overall_memory_budget_in_bytes); - -RustResult tantivy_load_index(const char *path, bool load_in_mmap, SetBitsetFn set_bitset); - -void tantivy_free_index_reader(void *ptr); - -RustResult tantivy_reload_index(void *ptr); - -RustResult tantivy_index_count(void *ptr); - -RustResult tantivy_index_size_bytes(void *ptr); - -RustResult tantivy_terms_query_bool(void *ptr, const bool *terms, uintptr_t len, void *bitset); - -RustResult tantivy_terms_query_i64(void *ptr, const int64_t *terms, uintptr_t len, void *bitset); - -RustResult tantivy_terms_query_f64(void *ptr, const double *terms, uintptr_t len, void *bitset); - -RustResult tantivy_terms_query_keyword(void *ptr, - const char *const *terms, - uintptr_t len, - void *bitset); - -RustResult tantivy_term_query_keyword_i64(void *ptr, const char *term); - -RustResult tantivy_lower_bound_range_query_i64(void *ptr, - int64_t lower_bound, - bool inclusive, - void *bitset); - -RustResult tantivy_lower_bound_range_query_bool(void *ptr, - bool lower_bound, - bool inclusive, - void *bitset); - -RustResult tantivy_upper_bound_range_query_i64(void *ptr, - int64_t upper_bound, - bool inclusive, - void *bitset); - -RustResult tantivy_upper_bound_range_query_bool(void *ptr, - bool upper_bound, - bool inclusive, - void *bitset); - -RustResult tantivy_range_query_i64(void *ptr, - int64_t lower_bound, - int64_t upper_bound, - bool lb_inclusive, - bool ub_inclusive, - void *bitset); - -RustResult tantivy_range_query_bool(void *ptr, - bool lower_bound, - bool upper_bound, - bool lb_inclusive, - bool ub_inclusive, - void *bitset); - -RustResult tantivy_lower_bound_range_query_f64(void *ptr, - double lower_bound, - bool inclusive, - void *bitset); - -RustResult tantivy_upper_bound_range_query_f64(void *ptr, - double upper_bound, - bool inclusive, - void *bitset); - -RustResult tantivy_range_query_f64(void *ptr, - double lower_bound, - double upper_bound, - bool lb_inclusive, - bool ub_inclusive, - void *bitset); - -RustResult tantivy_lower_bound_range_query_keyword(void *ptr, - const char *lower_bound, - bool inclusive, - void *bitset); - -RustResult tantivy_upper_bound_range_query_keyword(void *ptr, - const char *upper_bound, - bool inclusive, - void *bitset); - -RustResult tantivy_range_query_keyword(void *ptr, - const char *lower_bound, - const char *upper_bound, - bool lb_inclusive, - bool ub_inclusive, - void *bitset); - -RustResult tantivy_prefix_query_keyword(void *ptr, const char *prefix, void *bitset); - -RustResult tantivy_regex_query(void *ptr, const char *pattern, void *bitset); - -RustResult tantivy_json_term_query_i64(void *ptr, - const char *json_path, - int64_t term, - void *bitset); - -RustResult tantivy_json_term_query_f64(void *ptr, const char *json_path, double term, void *bitset); - -RustResult tantivy_json_term_query_bool(void *ptr, const char *json_path, bool term, void *bitset); - -RustResult tantivy_json_term_query_keyword(void *ptr, - const char *json_path, - const char *term, - void *bitset); - -RustResult tantivy_json_exist_query(void *ptr, const char *json_path, void *bitset); - -RustResult tantivy_json_range_query_i64(void *ptr, - const char *json_path, - int64_t lower_bound, - int64_t higher_bound, - bool lb_unbounded, - bool up_unbounded, - bool lb_inclusive, - bool ub_inclusive, - void *bitset); - -RustResult tantivy_json_range_query_f64(void *ptr, - const char *json_path, - double lower_bound, - double higher_bound, - bool lb_unbounded, - bool up_unbounded, - bool lb_inclusive, - bool ub_inclusive, - void *bitset); - -RustResult tantivy_json_range_query_bool(void *ptr, - const char *json_path, - bool lower_bound, - bool higher_bound, - bool lb_unbounded, - bool up_unbounded, - bool lb_inclusive, - bool ub_inclusive, - void *bitset); - -RustResult tantivy_json_range_query_keyword(void *ptr, - const char *json_path, - const char *lower_bound, - const char *higher_bound, - bool lb_unbounded, - bool up_unbounded, - bool lb_inclusive, - bool ub_inclusive, - void *bitset); - -RustResult tantivy_json_regex_query(void *ptr, - const char *json_path, - const char *pattern, - void *bitset); - -RustResult tantivy_json_prefix_query(void *ptr, - const char *json_path, - const char *prefix, - void *bitset); - -RustResult tantivy_ngram_match_query(void *ptr, - const char *literal, - uintptr_t min_gram, - uintptr_t max_gram, - void *bitset); - -RustResult tantivy_match_query(void *ptr, const char *query, void *bitset); - -RustResult tantivy_phrase_match_query(void *ptr, const char *query, uint32_t slop, void *bitset); - -RustResult tantivy_register_tokenizer(void *ptr, - const char *tokenizer_name, - const char *analyzer_params); - -RustResult tantivy_create_index(const char *field_name, - TantivyDataType data_type, - const char *path, - uint32_t tantivy_index_version, - uintptr_t num_threads, - uintptr_t overall_memory_budget_in_bytes, - bool enable_user_specified_doc_id); - -RustResult tantivy_create_index_with_single_segment(const char *field_name, - TantivyDataType data_type, - const char *path); - -void tantivy_free_index_writer(void *ptr); - -RustResult tantivy_finish_index(void *ptr); - -RustResult tantivy_commit_index(void *ptr); - -RustResult tantivy_create_reader_from_writer(void *ptr, SetBitsetFn set_bitset); - -RustResult tantivy_index_add_int8s(void *ptr, - const int8_t *array, - uintptr_t len, - int64_t offset_begin); - -RustResult tantivy_index_add_int8s_by_single_segment_writer(void *ptr, - const int8_t *array, - uintptr_t len); - -RustResult tantivy_index_add_int16s(void *ptr, - const int16_t *array, - uintptr_t len, - int64_t offset_begin); - -RustResult tantivy_index_add_int16s_by_single_segment_writer(void *ptr, - const int16_t *array, - uintptr_t len); - -RustResult tantivy_index_add_int32s(void *ptr, - const int32_t *array, - uintptr_t len, - int64_t offset_begin); - -RustResult tantivy_index_add_int32s_by_single_segment_writer(void *ptr, - const int32_t *array, - uintptr_t len); - -RustResult tantivy_index_add_int64s(void *ptr, - const int64_t *array, - uintptr_t len, - int64_t offset_begin); - -RustResult tantivy_index_add_int64s_by_single_segment_writer(void *ptr, - const int64_t *array, - uintptr_t len); - -RustResult tantivy_index_add_f32s(void *ptr, - const float *array, - uintptr_t len, - int64_t offset_begin); - -RustResult tantivy_index_add_f32s_by_single_segment_writer(void *ptr, - const float *array, - uintptr_t len); - -RustResult tantivy_index_add_f64s(void *ptr, - const double *array, - uintptr_t len, - int64_t offset_begin); - -RustResult tantivy_index_add_f64s_by_single_segment_writer(void *ptr, - const double *array, - uintptr_t len); - -RustResult tantivy_index_add_bools(void *ptr, - const bool *array, - uintptr_t len, - int64_t offset_begin); - -RustResult tantivy_index_add_bools_by_single_segment_writer(void *ptr, - const bool *array, - uintptr_t len); - -RustResult tantivy_index_add_string(void *ptr, const char *s, int64_t offset); - -RustResult tantivy_index_add_string_by_single_segment_writer(void *ptr, const char *s); - -RustResult tantivy_index_add_json_key_stats_data_by_batch(void *ptr, - const char *const *keys, - const int64_t *const *json_offsets, - const uintptr_t *json_offsets_len, - uintptr_t len); - -RustResult tantivy_index_add_json(void *ptr, const char *s, int64_t offset); - -RustResult tantivy_index_add_array_json(void *ptr, - const char *const *array, - uintptr_t len, - int64_t offset); - -RustResult tantivy_index_add_array_int8s(void *ptr, - const int8_t *array, - uintptr_t len, - int64_t offset); - -RustResult tantivy_index_add_array_int8s_by_single_segment_writer(void *ptr, - const int8_t *array, - uintptr_t len); - -RustResult tantivy_index_add_array_int16s(void *ptr, - const int16_t *array, - uintptr_t len, - int64_t offset); - -RustResult tantivy_index_add_array_int16s_by_single_segment_writer(void *ptr, - const int16_t *array, - uintptr_t len); - -RustResult tantivy_index_add_array_int32s(void *ptr, - const int32_t *array, - uintptr_t len, - int64_t offset); - -RustResult tantivy_index_add_array_int32s_by_single_segment_writer(void *ptr, - const int32_t *array, - uintptr_t len); - -RustResult tantivy_index_add_array_int64s(void *ptr, - const int64_t *array, - uintptr_t len, - int64_t offset); - -RustResult tantivy_index_add_array_int64s_by_single_segment_writer(void *ptr, - const int64_t *array, - uintptr_t len); - -RustResult tantivy_index_add_array_f32s(void *ptr, - const float *array, - uintptr_t len, - int64_t offset); - -RustResult tantivy_index_add_array_f32s_by_single_segment_writer(void *ptr, - const float *array, - uintptr_t len); - -RustResult tantivy_index_add_array_f64s(void *ptr, - const double *array, - uintptr_t len, - int64_t offset); - -RustResult tantivy_index_add_array_f64s_by_single_segment_writer(void *ptr, - const double *array, - uintptr_t len); - -RustResult tantivy_index_add_array_bools(void *ptr, - const bool *array, - uintptr_t len, - int64_t offset); - -RustResult tantivy_index_add_array_bools_by_single_segment_writer(void *ptr, - const bool *array, - uintptr_t len); - -RustResult tantivy_index_add_array_keywords(void *ptr, - const char *const *array, - uintptr_t len, - int64_t offset); - -RustResult tantivy_index_add_array_keywords_by_single_segment_writer(void *ptr, - const char *const *array, - uintptr_t len); - -RustResult tantivy_create_text_writer(const char *field_name, - const char *path, - uint32_t tantivy_index_version, - const char *tokenizer_name, - const char *analyzer_params, - uintptr_t num_threads, - uintptr_t overall_memory_budget_in_bytes, - bool in_ram); - -void free_rust_string(const char *ptr); - -void *tantivy_create_token_stream(void *tokenizer, const char *text); - -void tantivy_free_token_stream(void *token_stream); - -bool tantivy_token_stream_advance(void *token_stream); - -const char *tantivy_token_stream_get_token(void *token_stream); - -TantivyToken tantivy_token_stream_get_detailed_token(void *token_stream); - -RustResult tantivy_create_analyzer(const char *analyzer_params); - -void *tantivy_clone_analyzer(void *ptr); - -void tantivy_free_analyzer(void *tokenizer); - -RustResult tantivy_set_analyzer_options(const char *params); - -bool tantivy_index_exist(const char *path); +void +free_rust_array_i64(RustArrayI64 array); + +void +free_rust_result(RustResult result); + +void +free_rust_error(const char* error); + +RustResult +test_enum_with_array(); + +RustResult +test_enum_with_ptr(); + +void +free_test_ptr(void* ptr); + +void +print_vector_of_strings(const char* const* ptr, uintptr_t len); + +void* +create_hashmap(); + +void +hashmap_set_value(void* map, const char* key, const char* value); + +void +free_hashmap(void* map); + +RustResult +tantivy_create_json_key_stats_writer(const char* field_name, + const char* path, + uint32_t tantivy_index_version, + uintptr_t num_threads, + uintptr_t overall_memory_budget_in_bytes, + bool in_ram); + +RustResult +tantivy_create_ngram_writer(const char* field_name, + const char* path, + uintptr_t min_gram, + uintptr_t max_gram, + uintptr_t num_threads, + uintptr_t overall_memory_budget_in_bytes); + +RustResult +tantivy_load_index(const char* path, bool load_in_mmap, SetBitsetFn set_bitset); + +void +tantivy_free_index_reader(void* ptr); + +RustResult +tantivy_reload_index(void* ptr); + +RustResult +tantivy_index_count(void* ptr); + +RustResult +tantivy_index_size_bytes(void* ptr); + +RustResult +tantivy_terms_query_bool(void* ptr, + const bool* terms, + uintptr_t len, + void* bitset); + +RustResult +tantivy_terms_query_i64(void* ptr, + const int64_t* terms, + uintptr_t len, + void* bitset); + +RustResult +tantivy_terms_query_f64(void* ptr, + const double* terms, + uintptr_t len, + void* bitset); + +RustResult +tantivy_terms_query_keyword(void* ptr, + const char* const* terms, + uintptr_t len, + void* bitset); + +RustResult +tantivy_term_query_keyword_i64(void* ptr, const char* term); + +RustResult +tantivy_lower_bound_range_query_i64(void* ptr, + int64_t lower_bound, + bool inclusive, + void* bitset); + +RustResult +tantivy_lower_bound_range_query_bool(void* ptr, + bool lower_bound, + bool inclusive, + void* bitset); + +RustResult +tantivy_upper_bound_range_query_i64(void* ptr, + int64_t upper_bound, + bool inclusive, + void* bitset); + +RustResult +tantivy_upper_bound_range_query_bool(void* ptr, + bool upper_bound, + bool inclusive, + void* bitset); + +RustResult +tantivy_range_query_i64(void* ptr, + int64_t lower_bound, + int64_t upper_bound, + bool lb_inclusive, + bool ub_inclusive, + void* bitset); + +RustResult +tantivy_range_query_bool(void* ptr, + bool lower_bound, + bool upper_bound, + bool lb_inclusive, + bool ub_inclusive, + void* bitset); + +RustResult +tantivy_lower_bound_range_query_f64(void* ptr, + double lower_bound, + bool inclusive, + void* bitset); + +RustResult +tantivy_upper_bound_range_query_f64(void* ptr, + double upper_bound, + bool inclusive, + void* bitset); + +RustResult +tantivy_range_query_f64(void* ptr, + double lower_bound, + double upper_bound, + bool lb_inclusive, + bool ub_inclusive, + void* bitset); + +RustResult +tantivy_lower_bound_range_query_keyword(void* ptr, + const char* lower_bound, + bool inclusive, + void* bitset); + +RustResult +tantivy_upper_bound_range_query_keyword(void* ptr, + const char* upper_bound, + bool inclusive, + void* bitset); + +RustResult +tantivy_range_query_keyword(void* ptr, + const char* lower_bound, + const char* upper_bound, + bool lb_inclusive, + bool ub_inclusive, + void* bitset); + +RustResult +tantivy_prefix_query_keyword(void* ptr, const char* prefix, void* bitset); + +RustResult +tantivy_regex_query(void* ptr, const char* pattern, void* bitset); + +RustResult +tantivy_json_term_query_i64(void* ptr, + const char* json_path, + int64_t term, + void* bitset); + +RustResult +tantivy_json_term_query_f64(void* ptr, + const char* json_path, + double term, + void* bitset); + +RustResult +tantivy_json_term_query_bool(void* ptr, + const char* json_path, + bool term, + void* bitset); + +RustResult +tantivy_json_term_query_keyword(void* ptr, + const char* json_path, + const char* term, + void* bitset); + +RustResult +tantivy_json_exist_query(void* ptr, const char* json_path, void* bitset); + +RustResult +tantivy_json_range_query_i64(void* ptr, + const char* json_path, + int64_t lower_bound, + int64_t higher_bound, + bool lb_unbounded, + bool up_unbounded, + bool lb_inclusive, + bool ub_inclusive, + void* bitset); + +RustResult +tantivy_json_range_query_f64(void* ptr, + const char* json_path, + double lower_bound, + double higher_bound, + bool lb_unbounded, + bool up_unbounded, + bool lb_inclusive, + bool ub_inclusive, + void* bitset); + +RustResult +tantivy_json_range_query_bool(void* ptr, + const char* json_path, + bool lower_bound, + bool higher_bound, + bool lb_unbounded, + bool up_unbounded, + bool lb_inclusive, + bool ub_inclusive, + void* bitset); + +RustResult +tantivy_json_range_query_keyword(void* ptr, + const char* json_path, + const char* lower_bound, + const char* higher_bound, + bool lb_unbounded, + bool up_unbounded, + bool lb_inclusive, + bool ub_inclusive, + void* bitset); + +RustResult +tantivy_json_regex_query(void* ptr, + const char* json_path, + const char* pattern, + void* bitset); + +RustResult +tantivy_json_prefix_query(void* ptr, + const char* json_path, + const char* prefix, + void* bitset); + +RustResult +tantivy_ngram_match_query(void* ptr, + const char* literal, + uintptr_t min_gram, + uintptr_t max_gram, + void* bitset); + +RustResult +tantivy_match_query(void* ptr, + const char* query, + uintptr_t min_should_match, + void* bitset); + +RustResult +tantivy_phrase_match_query(void* ptr, + const char* query, + uint32_t slop, + void* bitset); + +RustResult +tantivy_register_tokenizer(void* ptr, + const char* tokenizer_name, + const char* analyzer_params); + +RustResult +tantivy_create_index(const char* field_name, + TantivyDataType data_type, + const char* path, + uint32_t tantivy_index_version, + uintptr_t num_threads, + uintptr_t overall_memory_budget_in_bytes, + bool enable_user_specified_doc_id); + +RustResult +tantivy_create_index_with_single_segment(const char* field_name, + TantivyDataType data_type, + const char* path); + +void +tantivy_free_index_writer(void* ptr); + +RustResult +tantivy_finish_index(void* ptr); + +RustResult +tantivy_commit_index(void* ptr); + +RustResult +tantivy_create_reader_from_writer(void* ptr, SetBitsetFn set_bitset); + +RustResult +tantivy_index_add_int8s(void* ptr, + const int8_t* array, + uintptr_t len, + int64_t offset_begin); + +RustResult +tantivy_index_add_int8s_by_single_segment_writer(void* ptr, + const int8_t* array, + uintptr_t len); + +RustResult +tantivy_index_add_int16s(void* ptr, + const int16_t* array, + uintptr_t len, + int64_t offset_begin); + +RustResult +tantivy_index_add_int16s_by_single_segment_writer(void* ptr, + const int16_t* array, + uintptr_t len); + +RustResult +tantivy_index_add_int32s(void* ptr, + const int32_t* array, + uintptr_t len, + int64_t offset_begin); + +RustResult +tantivy_index_add_int32s_by_single_segment_writer(void* ptr, + const int32_t* array, + uintptr_t len); + +RustResult +tantivy_index_add_int64s(void* ptr, + const int64_t* array, + uintptr_t len, + int64_t offset_begin); + +RustResult +tantivy_index_add_int64s_by_single_segment_writer(void* ptr, + const int64_t* array, + uintptr_t len); + +RustResult +tantivy_index_add_f32s(void* ptr, + const float* array, + uintptr_t len, + int64_t offset_begin); + +RustResult +tantivy_index_add_f32s_by_single_segment_writer(void* ptr, + const float* array, + uintptr_t len); + +RustResult +tantivy_index_add_f64s(void* ptr, + const double* array, + uintptr_t len, + int64_t offset_begin); + +RustResult +tantivy_index_add_f64s_by_single_segment_writer(void* ptr, + const double* array, + uintptr_t len); + +RustResult +tantivy_index_add_bools(void* ptr, + const bool* array, + uintptr_t len, + int64_t offset_begin); + +RustResult +tantivy_index_add_bools_by_single_segment_writer(void* ptr, + const bool* array, + uintptr_t len); + +RustResult +tantivy_index_add_string(void* ptr, const char* s, int64_t offset); + +RustResult +tantivy_index_add_string_by_single_segment_writer(void* ptr, const char* s); + +RustResult +tantivy_index_add_json_key_stats_data_by_batch( + void* ptr, + const char* const* keys, + const int64_t* const* json_offsets, + const uintptr_t* json_offsets_len, + uintptr_t len); + +RustResult +tantivy_index_add_json(void* ptr, const char* s, int64_t offset); + +RustResult +tantivy_index_add_array_json(void* ptr, + const char* const* array, + uintptr_t len, + int64_t offset); + +RustResult +tantivy_index_add_array_int8s(void* ptr, + const int8_t* array, + uintptr_t len, + int64_t offset); + +RustResult +tantivy_index_add_array_int8s_by_single_segment_writer(void* ptr, + const int8_t* array, + uintptr_t len); + +RustResult +tantivy_index_add_array_int16s(void* ptr, + const int16_t* array, + uintptr_t len, + int64_t offset); + +RustResult +tantivy_index_add_array_int16s_by_single_segment_writer(void* ptr, + const int16_t* array, + uintptr_t len); + +RustResult +tantivy_index_add_array_int32s(void* ptr, + const int32_t* array, + uintptr_t len, + int64_t offset); + +RustResult +tantivy_index_add_array_int32s_by_single_segment_writer(void* ptr, + const int32_t* array, + uintptr_t len); + +RustResult +tantivy_index_add_array_int64s(void* ptr, + const int64_t* array, + uintptr_t len, + int64_t offset); + +RustResult +tantivy_index_add_array_int64s_by_single_segment_writer(void* ptr, + const int64_t* array, + uintptr_t len); + +RustResult +tantivy_index_add_array_f32s(void* ptr, + const float* array, + uintptr_t len, + int64_t offset); + +RustResult +tantivy_index_add_array_f32s_by_single_segment_writer(void* ptr, + const float* array, + uintptr_t len); + +RustResult +tantivy_index_add_array_f64s(void* ptr, + const double* array, + uintptr_t len, + int64_t offset); + +RustResult +tantivy_index_add_array_f64s_by_single_segment_writer(void* ptr, + const double* array, + uintptr_t len); + +RustResult +tantivy_index_add_array_bools(void* ptr, + const bool* array, + uintptr_t len, + int64_t offset); + +RustResult +tantivy_index_add_array_bools_by_single_segment_writer(void* ptr, + const bool* array, + uintptr_t len); + +RustResult +tantivy_index_add_array_keywords(void* ptr, + const char* const* array, + uintptr_t len, + int64_t offset); + +RustResult +tantivy_index_add_array_keywords_by_single_segment_writer( + void* ptr, const char* const* array, uintptr_t len); + +RustResult +tantivy_create_text_writer(const char* field_name, + const char* path, + uint32_t tantivy_index_version, + const char* tokenizer_name, + const char* analyzer_params, + uintptr_t num_threads, + uintptr_t overall_memory_budget_in_bytes, + bool in_ram); + +void +free_rust_string(const char* ptr); + +void* +tantivy_create_token_stream(void* tokenizer, const char* text); + +void +tantivy_free_token_stream(void* token_stream); + +bool +tantivy_token_stream_advance(void* token_stream); + +const char* +tantivy_token_stream_get_token(void* token_stream); + +TantivyToken +tantivy_token_stream_get_detailed_token(void* token_stream); + +RustResult +tantivy_create_analyzer(const char* analyzer_params); + +void* +tantivy_clone_analyzer(void* ptr); + +void +tantivy_free_analyzer(void* tokenizer); + +RustResult +tantivy_set_analyzer_options(const char* params); + +bool +tantivy_index_exist(const char* path); } // extern "C" diff --git a/internal/core/thirdparty/tantivy/tantivy-binding/src/index_reader_text.rs b/internal/core/thirdparty/tantivy/tantivy-binding/src/index_reader_text.rs index 7b0e2a5278..dbd14081d2 100644 --- a/internal/core/thirdparty/tantivy/tantivy-binding/src/index_reader_text.rs +++ b/internal/core/thirdparty/tantivy/tantivy-binding/src/index_reader_text.rs @@ -31,15 +31,46 @@ impl IndexReaderWrapper { } let collector = DirectBitsetCollector { bitset_wrapper: BitsetWrapper::new(bitset, self.set_bitset), - terms, + terms: terms.clone(), }; - let query = BooleanQuery::new_multiterms_query(vec![]); + let query = BooleanQuery::new_multiterms_query(terms); let searcher = self.reader.searcher(); searcher .search(&query, &collector) .map_err(TantivyBindingError::TantivyError) } + pub(crate) fn match_query_with_minimum( + &self, + q: &str, + min_should_match: usize, + bitset: *mut c_void, + ) -> Result<()> { + let mut tokenizer = self + .index + .tokenizer_for_field(self.field) + .unwrap_or(standard_analyzer(vec![])) + .clone(); + let mut token_stream = tokenizer.token_stream(q); + let mut terms: Vec = Vec::new(); + while token_stream.advance() { + let token = token_stream.token(); + terms.push(Term::from_field_text(self.field, &token.text)); + } + use tantivy::query::{Occur, TermQuery}; + use tantivy::schema::IndexRecordOption; + let mut subqueries: Vec<(Occur, Box)> = Vec::new(); + for term in terms.into_iter() { + subqueries.push(( + Occur::Should, + Box::new(TermQuery::new(term, IndexRecordOption::Basic)), + )); + } + let effective_min = std::cmp::max(1, min_should_match); + let query = BooleanQuery::with_minimum_required_clauses(subqueries, effective_min); + self.search(&query, bitset) + } + // split the query string into multiple tokens using index's default tokenizer, // and then execute the disconjunction of term query. pub(crate) fn phrase_match_query(&self, q: &str, slop: u32, bitset: *mut c_void) -> Result<()> { @@ -148,4 +179,58 @@ mod tests { .unwrap(); assert_eq!(res, (0..100000).collect::>()); } + + #[test] + fn test_min_should_match_match_query() { + let dir = tempfile::TempDir::new().unwrap(); + let mut writer = IndexWriterWrapper::create_text_writer( + "text", + dir.path().to_str().unwrap(), + "default", + "", + 1, + 50_000_000, + false, + TantivyIndexVersion::default_version(), + ) + .unwrap(); + + // doc ids: 0..4 + writer.add("a b", Some(0)).unwrap(); + writer.add("a c", Some(1)).unwrap(); + writer.add("b c", Some(2)).unwrap(); + writer.add("c", Some(3)).unwrap(); + writer.add("a b c", Some(4)).unwrap(); + writer.commit().unwrap(); + + let reader = writer.create_reader(set_bitset).unwrap(); + + // min=1 behaves like union of tokens + let mut res: HashSet = HashSet::new(); + reader + .match_query_with_minimum("a b", 1, &mut res as *mut _ as *mut c_void) + .unwrap(); + assert_eq!(res, vec![0, 1, 2, 4].into_iter().collect::>()); + + // min=2 requires at least two tokens + res.clear(); + reader + .match_query_with_minimum("a b c", 2, &mut res as *mut _ as *mut c_void) + .unwrap(); + assert_eq!(res, vec![0, 1, 2, 4].into_iter().collect::>()); + + // min=3 requires all three tokens + res.clear(); + reader + .match_query_with_minimum("a b c", 3, &mut res as *mut _ as *mut c_void) + .unwrap(); + assert_eq!(res, vec![4].into_iter().collect::>()); + + // large min should yield empty + res.clear(); + reader + .match_query_with_minimum("a b c", 10, &mut res as *mut _ as *mut c_void) + .unwrap(); + assert!(res.is_empty()); + } } diff --git a/internal/core/thirdparty/tantivy/tantivy-binding/src/index_reader_text_c.rs b/internal/core/thirdparty/tantivy/tantivy-binding/src/index_reader_text_c.rs index 871e22f07d..44692e47c4 100644 --- a/internal/core/thirdparty/tantivy/tantivy-binding/src/index_reader_text_c.rs +++ b/internal/core/thirdparty/tantivy/tantivy-binding/src/index_reader_text_c.rs @@ -11,11 +11,20 @@ use crate::{ pub extern "C" fn tantivy_match_query( ptr: *mut c_void, query: *const c_char, + min_should_match: usize, bitset: *mut c_void, ) -> RustResult { let real = ptr as *mut IndexReaderWrapper; let query = cstr_to_str!(query); - unsafe { (*real).match_query(query, bitset).into() } + if min_should_match > 1 { + unsafe { + (*real) + .match_query_with_minimum(query, min_should_match, bitset) + .into() + } + } else { + unsafe { (*real).match_query(query, bitset).into() } + } } #[no_mangle] diff --git a/internal/core/thirdparty/tantivy/tantivy-wrapper.h b/internal/core/thirdparty/tantivy/tantivy-wrapper.h index d686ea4c7d..4f7cd3aefc 100644 --- a/internal/core/thirdparty/tantivy/tantivy-wrapper.h +++ b/internal/core/thirdparty/tantivy/tantivy-wrapper.h @@ -950,8 +950,11 @@ struct TantivyIndexWrapper { } void - match_query(const std::string& query, void* bitset) { - auto array = tantivy_match_query(reader_, query.c_str(), bitset); + match_query(const std::string& query, + uintptr_t min_should_match, + void* bitset) { + auto array = tantivy_match_query( + reader_, query.c_str(), min_should_match, bitset); auto res = RustResultWrapper(array); AssertInfo(res.result_->success, "TantivyIndexWrapper.match_query: {}", diff --git a/internal/parser/planparserv2/Plan.g4 b/internal/parser/planparserv2/Plan.g4 index d4b33b2cef..f99ee136a1 100644 --- a/internal/parser/planparserv2/Plan.g4 +++ b/internal/parser/planparserv2/Plan.g4 @@ -15,7 +15,7 @@ expr: | EmptyArray # EmptyArray | EXISTS expr # Exists | expr LIKE StringLiteral # Like - | TEXTMATCH'('Identifier',' StringLiteral')' # TextMatch + | TEXTMATCH'('Identifier',' StringLiteral (',' textMatchOption)? ')' # TextMatch | PHRASEMATCH'('Identifier',' StringLiteral (',' expr)? ')' # PhraseMatch | RANDOMSAMPLE'(' expr ')' # RandomSample | expr POW expr # Power @@ -50,6 +50,9 @@ expr: | (Identifier | JSONIdentifier) ISNULL # IsNull | (Identifier | JSONIdentifier) ISNOTNULL # IsNotNull; +textMatchOption: + MINIMUM_SHOULD_MATCH ASSIGN IntegerConstant; + // typeName: ty = (BOOL | INT8 | INT16 | INT32 | INT64 | FLOAT | DOUBLE); // BOOL: 'bool'; @@ -76,6 +79,8 @@ PHRASEMATCH: 'phrase_match'|'PHRASE_MATCH'; RANDOMSAMPLE: 'random_sample' | 'RANDOM_SAMPLE'; INTERVAL: 'interval' | 'INTERVAL'; ISO: 'iso' | 'ISO'; +MINIMUM_SHOULD_MATCH: 'minimum_should_match' | 'MINIMUM_SHOULD_MATCH'; +ASSIGN: '='; ADD: '+'; SUB: '-'; diff --git a/internal/parser/planparserv2/generated/Plan.interp b/internal/parser/planparserv2/generated/Plan.interp index 8e23fc1b6d..e1a36daa9e 100644 --- a/internal/parser/planparserv2/generated/Plan.interp +++ b/internal/parser/planparserv2/generated/Plan.interp @@ -20,6 +20,8 @@ null null null null +null +'=' '+' '-' '*' @@ -86,6 +88,8 @@ PHRASEMATCH RANDOMSAMPLE INTERVAL ISO +MINIMUM_SHOULD_MATCH +ASSIGN ADD SUB MUL @@ -132,7 +136,8 @@ Newline rule names: expr +textMatchOption atn: -[4, 1, 63, 230, 2, 0, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 8, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 20, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 39, 8, 0, 10, 0, 12, 0, 42, 9, 0, 1, 0, 3, 0, 45, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 65, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 156, 8, 0, 10, 0, 12, 0, 159, 9, 0, 1, 0, 3, 0, 162, 8, 0, 3, 0, 164, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 171, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 187, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 225, 8, 0, 10, 0, 12, 0, 228, 9, 0, 1, 0, 0, 1, 0, 1, 0, 0, 14, 1, 0, 21, 22, 1, 0, 8, 13, 1, 0, 58, 59, 2, 0, 21, 22, 36, 37, 2, 0, 40, 40, 43, 43, 2, 0, 41, 41, 44, 44, 2, 0, 42, 42, 45, 45, 2, 0, 58, 58, 61, 61, 1, 0, 23, 25, 1, 0, 27, 28, 1, 0, 8, 9, 1, 0, 10, 11, 1, 0, 8, 11, 1, 0, 12, 13, 283, 0, 170, 1, 0, 0, 0, 2, 3, 6, 0, -1, 0, 3, 7, 5, 58, 0, 0, 4, 5, 7, 0, 0, 0, 5, 6, 5, 19, 0, 0, 6, 8, 5, 60, 0, 0, 7, 4, 1, 0, 0, 0, 7, 8, 1, 0, 0, 0, 8, 9, 1, 0, 0, 0, 9, 10, 7, 1, 0, 0, 10, 11, 5, 20, 0, 0, 11, 171, 5, 60, 0, 0, 12, 13, 5, 20, 0, 0, 13, 14, 5, 60, 0, 0, 14, 15, 7, 1, 0, 0, 15, 19, 5, 58, 0, 0, 16, 17, 7, 0, 0, 0, 17, 18, 5, 19, 0, 0, 18, 20, 5, 60, 0, 0, 19, 16, 1, 0, 0, 0, 19, 20, 1, 0, 0, 0, 20, 171, 1, 0, 0, 0, 21, 171, 5, 56, 0, 0, 22, 171, 5, 57, 0, 0, 23, 171, 5, 55, 0, 0, 24, 171, 5, 60, 0, 0, 25, 171, 7, 2, 0, 0, 26, 171, 5, 61, 0, 0, 27, 28, 5, 6, 0, 0, 28, 29, 5, 58, 0, 0, 29, 171, 5, 7, 0, 0, 30, 31, 5, 1, 0, 0, 31, 32, 3, 0, 0, 0, 32, 33, 5, 2, 0, 0, 33, 171, 1, 0, 0, 0, 34, 35, 5, 3, 0, 0, 35, 40, 3, 0, 0, 0, 36, 37, 5, 4, 0, 0, 37, 39, 3, 0, 0, 0, 38, 36, 1, 0, 0, 0, 39, 42, 1, 0, 0, 0, 40, 38, 1, 0, 0, 0, 40, 41, 1, 0, 0, 0, 41, 44, 1, 0, 0, 0, 42, 40, 1, 0, 0, 0, 43, 45, 5, 4, 0, 0, 44, 43, 1, 0, 0, 0, 44, 45, 1, 0, 0, 0, 45, 46, 1, 0, 0, 0, 46, 47, 5, 5, 0, 0, 47, 171, 1, 0, 0, 0, 48, 171, 5, 39, 0, 0, 49, 50, 5, 15, 0, 0, 50, 171, 3, 0, 0, 35, 51, 52, 5, 16, 0, 0, 52, 53, 5, 1, 0, 0, 53, 54, 5, 58, 0, 0, 54, 55, 5, 4, 0, 0, 55, 56, 5, 60, 0, 0, 56, 171, 5, 2, 0, 0, 57, 58, 5, 17, 0, 0, 58, 59, 5, 1, 0, 0, 59, 60, 5, 58, 0, 0, 60, 61, 5, 4, 0, 0, 61, 64, 5, 60, 0, 0, 62, 63, 5, 4, 0, 0, 63, 65, 3, 0, 0, 0, 64, 62, 1, 0, 0, 0, 64, 65, 1, 0, 0, 0, 65, 66, 1, 0, 0, 0, 66, 171, 5, 2, 0, 0, 67, 68, 5, 18, 0, 0, 68, 69, 5, 1, 0, 0, 69, 70, 3, 0, 0, 0, 70, 71, 5, 2, 0, 0, 71, 171, 1, 0, 0, 0, 72, 73, 7, 3, 0, 0, 73, 171, 3, 0, 0, 29, 74, 75, 7, 4, 0, 0, 75, 76, 5, 1, 0, 0, 76, 77, 3, 0, 0, 0, 77, 78, 5, 4, 0, 0, 78, 79, 3, 0, 0, 0, 79, 80, 5, 2, 0, 0, 80, 171, 1, 0, 0, 0, 81, 82, 7, 5, 0, 0, 82, 83, 5, 1, 0, 0, 83, 84, 3, 0, 0, 0, 84, 85, 5, 4, 0, 0, 85, 86, 3, 0, 0, 0, 86, 87, 5, 2, 0, 0, 87, 171, 1, 0, 0, 0, 88, 89, 7, 6, 0, 0, 89, 90, 5, 1, 0, 0, 90, 91, 3, 0, 0, 0, 91, 92, 5, 4, 0, 0, 92, 93, 3, 0, 0, 0, 93, 94, 5, 2, 0, 0, 94, 171, 1, 0, 0, 0, 95, 96, 5, 47, 0, 0, 96, 97, 5, 1, 0, 0, 97, 98, 5, 58, 0, 0, 98, 99, 5, 4, 0, 0, 99, 100, 5, 60, 0, 0, 100, 171, 5, 2, 0, 0, 101, 102, 5, 48, 0, 0, 102, 103, 5, 1, 0, 0, 103, 104, 5, 58, 0, 0, 104, 105, 5, 4, 0, 0, 105, 106, 5, 60, 0, 0, 106, 171, 5, 2, 0, 0, 107, 108, 5, 49, 0, 0, 108, 109, 5, 1, 0, 0, 109, 110, 5, 58, 0, 0, 110, 111, 5, 4, 0, 0, 111, 112, 5, 60, 0, 0, 112, 171, 5, 2, 0, 0, 113, 114, 5, 50, 0, 0, 114, 115, 5, 1, 0, 0, 115, 116, 5, 58, 0, 0, 116, 117, 5, 4, 0, 0, 117, 118, 5, 60, 0, 0, 118, 171, 5, 2, 0, 0, 119, 120, 5, 51, 0, 0, 120, 121, 5, 1, 0, 0, 121, 122, 5, 58, 0, 0, 122, 123, 5, 4, 0, 0, 123, 124, 5, 60, 0, 0, 124, 171, 5, 2, 0, 0, 125, 126, 5, 52, 0, 0, 126, 127, 5, 1, 0, 0, 127, 128, 5, 58, 0, 0, 128, 129, 5, 4, 0, 0, 129, 130, 5, 60, 0, 0, 130, 171, 5, 2, 0, 0, 131, 132, 5, 53, 0, 0, 132, 133, 5, 1, 0, 0, 133, 134, 5, 58, 0, 0, 134, 135, 5, 4, 0, 0, 135, 136, 5, 60, 0, 0, 136, 171, 5, 2, 0, 0, 137, 138, 5, 54, 0, 0, 138, 139, 5, 1, 0, 0, 139, 140, 5, 58, 0, 0, 140, 141, 5, 4, 0, 0, 141, 142, 5, 60, 0, 0, 142, 143, 5, 4, 0, 0, 143, 144, 3, 0, 0, 0, 144, 145, 5, 2, 0, 0, 145, 171, 1, 0, 0, 0, 146, 147, 5, 46, 0, 0, 147, 148, 5, 1, 0, 0, 148, 149, 7, 7, 0, 0, 149, 171, 5, 2, 0, 0, 150, 151, 5, 58, 0, 0, 151, 163, 5, 1, 0, 0, 152, 157, 3, 0, 0, 0, 153, 154, 5, 4, 0, 0, 154, 156, 3, 0, 0, 0, 155, 153, 1, 0, 0, 0, 156, 159, 1, 0, 0, 0, 157, 155, 1, 0, 0, 0, 157, 158, 1, 0, 0, 0, 158, 161, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 160, 162, 5, 4, 0, 0, 161, 160, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 164, 1, 0, 0, 0, 163, 152, 1, 0, 0, 0, 163, 164, 1, 0, 0, 0, 164, 165, 1, 0, 0, 0, 165, 171, 5, 2, 0, 0, 166, 167, 7, 7, 0, 0, 167, 171, 5, 34, 0, 0, 168, 169, 7, 7, 0, 0, 169, 171, 5, 35, 0, 0, 170, 2, 1, 0, 0, 0, 170, 12, 1, 0, 0, 0, 170, 21, 1, 0, 0, 0, 170, 22, 1, 0, 0, 0, 170, 23, 1, 0, 0, 0, 170, 24, 1, 0, 0, 0, 170, 25, 1, 0, 0, 0, 170, 26, 1, 0, 0, 0, 170, 27, 1, 0, 0, 0, 170, 30, 1, 0, 0, 0, 170, 34, 1, 0, 0, 0, 170, 48, 1, 0, 0, 0, 170, 49, 1, 0, 0, 0, 170, 51, 1, 0, 0, 0, 170, 57, 1, 0, 0, 0, 170, 67, 1, 0, 0, 0, 170, 72, 1, 0, 0, 0, 170, 74, 1, 0, 0, 0, 170, 81, 1, 0, 0, 0, 170, 88, 1, 0, 0, 0, 170, 95, 1, 0, 0, 0, 170, 101, 1, 0, 0, 0, 170, 107, 1, 0, 0, 0, 170, 113, 1, 0, 0, 0, 170, 119, 1, 0, 0, 0, 170, 125, 1, 0, 0, 0, 170, 131, 1, 0, 0, 0, 170, 137, 1, 0, 0, 0, 170, 146, 1, 0, 0, 0, 170, 150, 1, 0, 0, 0, 170, 166, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 171, 226, 1, 0, 0, 0, 172, 173, 10, 30, 0, 0, 173, 174, 5, 26, 0, 0, 174, 225, 3, 0, 0, 31, 175, 176, 10, 28, 0, 0, 176, 177, 7, 8, 0, 0, 177, 225, 3, 0, 0, 29, 178, 179, 10, 27, 0, 0, 179, 180, 7, 0, 0, 0, 180, 225, 3, 0, 0, 28, 181, 182, 10, 26, 0, 0, 182, 183, 7, 9, 0, 0, 183, 225, 3, 0, 0, 27, 184, 186, 10, 25, 0, 0, 185, 187, 5, 37, 0, 0, 186, 185, 1, 0, 0, 0, 186, 187, 1, 0, 0, 0, 187, 188, 1, 0, 0, 0, 188, 189, 5, 38, 0, 0, 189, 225, 3, 0, 0, 26, 190, 191, 10, 11, 0, 0, 191, 192, 7, 10, 0, 0, 192, 193, 7, 7, 0, 0, 193, 194, 7, 10, 0, 0, 194, 225, 3, 0, 0, 12, 195, 196, 10, 10, 0, 0, 196, 197, 7, 11, 0, 0, 197, 198, 7, 7, 0, 0, 198, 199, 7, 11, 0, 0, 199, 225, 3, 0, 0, 11, 200, 201, 10, 9, 0, 0, 201, 202, 7, 12, 0, 0, 202, 225, 3, 0, 0, 10, 203, 204, 10, 8, 0, 0, 204, 205, 7, 13, 0, 0, 205, 225, 3, 0, 0, 9, 206, 207, 10, 7, 0, 0, 207, 208, 5, 29, 0, 0, 208, 225, 3, 0, 0, 8, 209, 210, 10, 6, 0, 0, 210, 211, 5, 31, 0, 0, 211, 225, 3, 0, 0, 7, 212, 213, 10, 5, 0, 0, 213, 214, 5, 30, 0, 0, 214, 225, 3, 0, 0, 6, 215, 216, 10, 4, 0, 0, 216, 217, 5, 32, 0, 0, 217, 225, 3, 0, 0, 5, 218, 219, 10, 3, 0, 0, 219, 220, 5, 33, 0, 0, 220, 225, 3, 0, 0, 4, 221, 222, 10, 34, 0, 0, 222, 223, 5, 14, 0, 0, 223, 225, 5, 60, 0, 0, 224, 172, 1, 0, 0, 0, 224, 175, 1, 0, 0, 0, 224, 178, 1, 0, 0, 0, 224, 181, 1, 0, 0, 0, 224, 184, 1, 0, 0, 0, 224, 190, 1, 0, 0, 0, 224, 195, 1, 0, 0, 0, 224, 200, 1, 0, 0, 0, 224, 203, 1, 0, 0, 0, 224, 206, 1, 0, 0, 0, 224, 209, 1, 0, 0, 0, 224, 212, 1, 0, 0, 0, 224, 215, 1, 0, 0, 0, 224, 218, 1, 0, 0, 0, 224, 221, 1, 0, 0, 0, 225, 228, 1, 0, 0, 0, 226, 224, 1, 0, 0, 0, 226, 227, 1, 0, 0, 0, 227, 1, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 12, 7, 19, 40, 44, 64, 157, 161, 163, 170, 186, 224, 226] \ No newline at end of file +[4, 1, 65, 240, 2, 0, 7, 0, 2, 1, 7, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 10, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 22, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 41, 8, 0, 10, 0, 12, 0, 44, 9, 0, 1, 0, 3, 0, 47, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 61, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 71, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 162, 8, 0, 10, 0, 12, 0, 165, 9, 0, 1, 0, 3, 0, 168, 8, 0, 3, 0, 170, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 177, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 193, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 231, 8, 0, 10, 0, 12, 0, 234, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 2, 0, 2, 0, 14, 1, 0, 23, 24, 1, 0, 8, 13, 1, 0, 60, 61, 2, 0, 23, 24, 38, 39, 2, 0, 42, 42, 45, 45, 2, 0, 43, 43, 46, 46, 2, 0, 44, 44, 47, 47, 2, 0, 60, 60, 63, 63, 1, 0, 25, 27, 1, 0, 29, 30, 1, 0, 8, 9, 1, 0, 10, 11, 1, 0, 8, 11, 1, 0, 12, 13, 293, 0, 176, 1, 0, 0, 0, 2, 235, 1, 0, 0, 0, 4, 5, 6, 0, -1, 0, 5, 9, 5, 60, 0, 0, 6, 7, 7, 0, 0, 0, 7, 8, 5, 19, 0, 0, 8, 10, 5, 62, 0, 0, 9, 6, 1, 0, 0, 0, 9, 10, 1, 0, 0, 0, 10, 11, 1, 0, 0, 0, 11, 12, 7, 1, 0, 0, 12, 13, 5, 20, 0, 0, 13, 177, 5, 62, 0, 0, 14, 15, 5, 20, 0, 0, 15, 16, 5, 62, 0, 0, 16, 17, 7, 1, 0, 0, 17, 21, 5, 60, 0, 0, 18, 19, 7, 0, 0, 0, 19, 20, 5, 19, 0, 0, 20, 22, 5, 62, 0, 0, 21, 18, 1, 0, 0, 0, 21, 22, 1, 0, 0, 0, 22, 177, 1, 0, 0, 0, 23, 177, 5, 58, 0, 0, 24, 177, 5, 59, 0, 0, 25, 177, 5, 57, 0, 0, 26, 177, 5, 62, 0, 0, 27, 177, 7, 2, 0, 0, 28, 177, 5, 63, 0, 0, 29, 30, 5, 6, 0, 0, 30, 31, 5, 60, 0, 0, 31, 177, 5, 7, 0, 0, 32, 33, 5, 1, 0, 0, 33, 34, 3, 0, 0, 0, 34, 35, 5, 2, 0, 0, 35, 177, 1, 0, 0, 0, 36, 37, 5, 3, 0, 0, 37, 42, 3, 0, 0, 0, 38, 39, 5, 4, 0, 0, 39, 41, 3, 0, 0, 0, 40, 38, 1, 0, 0, 0, 41, 44, 1, 0, 0, 0, 42, 40, 1, 0, 0, 0, 42, 43, 1, 0, 0, 0, 43, 46, 1, 0, 0, 0, 44, 42, 1, 0, 0, 0, 45, 47, 5, 4, 0, 0, 46, 45, 1, 0, 0, 0, 46, 47, 1, 0, 0, 0, 47, 48, 1, 0, 0, 0, 48, 49, 5, 5, 0, 0, 49, 177, 1, 0, 0, 0, 50, 177, 5, 41, 0, 0, 51, 52, 5, 15, 0, 0, 52, 177, 3, 0, 0, 35, 53, 54, 5, 16, 0, 0, 54, 55, 5, 1, 0, 0, 55, 56, 5, 60, 0, 0, 56, 57, 5, 4, 0, 0, 57, 60, 5, 62, 0, 0, 58, 59, 5, 4, 0, 0, 59, 61, 3, 2, 1, 0, 60, 58, 1, 0, 0, 0, 60, 61, 1, 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 177, 5, 2, 0, 0, 63, 64, 5, 17, 0, 0, 64, 65, 5, 1, 0, 0, 65, 66, 5, 60, 0, 0, 66, 67, 5, 4, 0, 0, 67, 70, 5, 62, 0, 0, 68, 69, 5, 4, 0, 0, 69, 71, 3, 0, 0, 0, 70, 68, 1, 0, 0, 0, 70, 71, 1, 0, 0, 0, 71, 72, 1, 0, 0, 0, 72, 177, 5, 2, 0, 0, 73, 74, 5, 18, 0, 0, 74, 75, 5, 1, 0, 0, 75, 76, 3, 0, 0, 0, 76, 77, 5, 2, 0, 0, 77, 177, 1, 0, 0, 0, 78, 79, 7, 3, 0, 0, 79, 177, 3, 0, 0, 29, 80, 81, 7, 4, 0, 0, 81, 82, 5, 1, 0, 0, 82, 83, 3, 0, 0, 0, 83, 84, 5, 4, 0, 0, 84, 85, 3, 0, 0, 0, 85, 86, 5, 2, 0, 0, 86, 177, 1, 0, 0, 0, 87, 88, 7, 5, 0, 0, 88, 89, 5, 1, 0, 0, 89, 90, 3, 0, 0, 0, 90, 91, 5, 4, 0, 0, 91, 92, 3, 0, 0, 0, 92, 93, 5, 2, 0, 0, 93, 177, 1, 0, 0, 0, 94, 95, 7, 6, 0, 0, 95, 96, 5, 1, 0, 0, 96, 97, 3, 0, 0, 0, 97, 98, 5, 4, 0, 0, 98, 99, 3, 0, 0, 0, 99, 100, 5, 2, 0, 0, 100, 177, 1, 0, 0, 0, 101, 102, 5, 49, 0, 0, 102, 103, 5, 1, 0, 0, 103, 104, 5, 60, 0, 0, 104, 105, 5, 4, 0, 0, 105, 106, 5, 62, 0, 0, 106, 177, 5, 2, 0, 0, 107, 108, 5, 50, 0, 0, 108, 109, 5, 1, 0, 0, 109, 110, 5, 60, 0, 0, 110, 111, 5, 4, 0, 0, 111, 112, 5, 62, 0, 0, 112, 177, 5, 2, 0, 0, 113, 114, 5, 51, 0, 0, 114, 115, 5, 1, 0, 0, 115, 116, 5, 60, 0, 0, 116, 117, 5, 4, 0, 0, 117, 118, 5, 62, 0, 0, 118, 177, 5, 2, 0, 0, 119, 120, 5, 52, 0, 0, 120, 121, 5, 1, 0, 0, 121, 122, 5, 60, 0, 0, 122, 123, 5, 4, 0, 0, 123, 124, 5, 62, 0, 0, 124, 177, 5, 2, 0, 0, 125, 126, 5, 53, 0, 0, 126, 127, 5, 1, 0, 0, 127, 128, 5, 60, 0, 0, 128, 129, 5, 4, 0, 0, 129, 130, 5, 62, 0, 0, 130, 177, 5, 2, 0, 0, 131, 132, 5, 54, 0, 0, 132, 133, 5, 1, 0, 0, 133, 134, 5, 60, 0, 0, 134, 135, 5, 4, 0, 0, 135, 136, 5, 62, 0, 0, 136, 177, 5, 2, 0, 0, 137, 138, 5, 55, 0, 0, 138, 139, 5, 1, 0, 0, 139, 140, 5, 60, 0, 0, 140, 141, 5, 4, 0, 0, 141, 142, 5, 62, 0, 0, 142, 177, 5, 2, 0, 0, 143, 144, 5, 56, 0, 0, 144, 145, 5, 1, 0, 0, 145, 146, 5, 60, 0, 0, 146, 147, 5, 4, 0, 0, 147, 148, 5, 62, 0, 0, 148, 149, 5, 4, 0, 0, 149, 150, 3, 0, 0, 0, 150, 151, 5, 2, 0, 0, 151, 177, 1, 0, 0, 0, 152, 153, 5, 48, 0, 0, 153, 154, 5, 1, 0, 0, 154, 155, 7, 7, 0, 0, 155, 177, 5, 2, 0, 0, 156, 157, 5, 60, 0, 0, 157, 169, 5, 1, 0, 0, 158, 163, 3, 0, 0, 0, 159, 160, 5, 4, 0, 0, 160, 162, 3, 0, 0, 0, 161, 159, 1, 0, 0, 0, 162, 165, 1, 0, 0, 0, 163, 161, 1, 0, 0, 0, 163, 164, 1, 0, 0, 0, 164, 167, 1, 0, 0, 0, 165, 163, 1, 0, 0, 0, 166, 168, 5, 4, 0, 0, 167, 166, 1, 0, 0, 0, 167, 168, 1, 0, 0, 0, 168, 170, 1, 0, 0, 0, 169, 158, 1, 0, 0, 0, 169, 170, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 177, 5, 2, 0, 0, 172, 173, 7, 7, 0, 0, 173, 177, 5, 36, 0, 0, 174, 175, 7, 7, 0, 0, 175, 177, 5, 37, 0, 0, 176, 4, 1, 0, 0, 0, 176, 14, 1, 0, 0, 0, 176, 23, 1, 0, 0, 0, 176, 24, 1, 0, 0, 0, 176, 25, 1, 0, 0, 0, 176, 26, 1, 0, 0, 0, 176, 27, 1, 0, 0, 0, 176, 28, 1, 0, 0, 0, 176, 29, 1, 0, 0, 0, 176, 32, 1, 0, 0, 0, 176, 36, 1, 0, 0, 0, 176, 50, 1, 0, 0, 0, 176, 51, 1, 0, 0, 0, 176, 53, 1, 0, 0, 0, 176, 63, 1, 0, 0, 0, 176, 73, 1, 0, 0, 0, 176, 78, 1, 0, 0, 0, 176, 80, 1, 0, 0, 0, 176, 87, 1, 0, 0, 0, 176, 94, 1, 0, 0, 0, 176, 101, 1, 0, 0, 0, 176, 107, 1, 0, 0, 0, 176, 113, 1, 0, 0, 0, 176, 119, 1, 0, 0, 0, 176, 125, 1, 0, 0, 0, 176, 131, 1, 0, 0, 0, 176, 137, 1, 0, 0, 0, 176, 143, 1, 0, 0, 0, 176, 152, 1, 0, 0, 0, 176, 156, 1, 0, 0, 0, 176, 172, 1, 0, 0, 0, 176, 174, 1, 0, 0, 0, 177, 232, 1, 0, 0, 0, 178, 179, 10, 30, 0, 0, 179, 180, 5, 28, 0, 0, 180, 231, 3, 0, 0, 31, 181, 182, 10, 28, 0, 0, 182, 183, 7, 8, 0, 0, 183, 231, 3, 0, 0, 29, 184, 185, 10, 27, 0, 0, 185, 186, 7, 0, 0, 0, 186, 231, 3, 0, 0, 28, 187, 188, 10, 26, 0, 0, 188, 189, 7, 9, 0, 0, 189, 231, 3, 0, 0, 27, 190, 192, 10, 25, 0, 0, 191, 193, 5, 39, 0, 0, 192, 191, 1, 0, 0, 0, 192, 193, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 195, 5, 40, 0, 0, 195, 231, 3, 0, 0, 26, 196, 197, 10, 11, 0, 0, 197, 198, 7, 10, 0, 0, 198, 199, 7, 7, 0, 0, 199, 200, 7, 10, 0, 0, 200, 231, 3, 0, 0, 12, 201, 202, 10, 10, 0, 0, 202, 203, 7, 11, 0, 0, 203, 204, 7, 7, 0, 0, 204, 205, 7, 11, 0, 0, 205, 231, 3, 0, 0, 11, 206, 207, 10, 9, 0, 0, 207, 208, 7, 12, 0, 0, 208, 231, 3, 0, 0, 10, 209, 210, 10, 8, 0, 0, 210, 211, 7, 13, 0, 0, 211, 231, 3, 0, 0, 9, 212, 213, 10, 7, 0, 0, 213, 214, 5, 31, 0, 0, 214, 231, 3, 0, 0, 8, 215, 216, 10, 6, 0, 0, 216, 217, 5, 33, 0, 0, 217, 231, 3, 0, 0, 7, 218, 219, 10, 5, 0, 0, 219, 220, 5, 32, 0, 0, 220, 231, 3, 0, 0, 6, 221, 222, 10, 4, 0, 0, 222, 223, 5, 34, 0, 0, 223, 231, 3, 0, 0, 5, 224, 225, 10, 3, 0, 0, 225, 226, 5, 35, 0, 0, 226, 231, 3, 0, 0, 4, 227, 228, 10, 34, 0, 0, 228, 229, 5, 14, 0, 0, 229, 231, 5, 62, 0, 0, 230, 178, 1, 0, 0, 0, 230, 181, 1, 0, 0, 0, 230, 184, 1, 0, 0, 0, 230, 187, 1, 0, 0, 0, 230, 190, 1, 0, 0, 0, 230, 196, 1, 0, 0, 0, 230, 201, 1, 0, 0, 0, 230, 206, 1, 0, 0, 0, 230, 209, 1, 0, 0, 0, 230, 212, 1, 0, 0, 0, 230, 215, 1, 0, 0, 0, 230, 218, 1, 0, 0, 0, 230, 221, 1, 0, 0, 0, 230, 224, 1, 0, 0, 0, 230, 227, 1, 0, 0, 0, 231, 234, 1, 0, 0, 0, 232, 230, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 1, 1, 0, 0, 0, 234, 232, 1, 0, 0, 0, 235, 236, 5, 21, 0, 0, 236, 237, 5, 22, 0, 0, 237, 238, 5, 58, 0, 0, 238, 3, 1, 0, 0, 0, 13, 9, 21, 42, 46, 60, 70, 163, 167, 169, 176, 192, 230, 232] \ No newline at end of file diff --git a/internal/parser/planparserv2/generated/Plan.tokens b/internal/parser/planparserv2/generated/Plan.tokens index 4d1e299fda..23e0efa1bf 100644 --- a/internal/parser/planparserv2/generated/Plan.tokens +++ b/internal/parser/planparserv2/generated/Plan.tokens @@ -18,49 +18,51 @@ PHRASEMATCH=17 RANDOMSAMPLE=18 INTERVAL=19 ISO=20 -ADD=21 -SUB=22 -MUL=23 -DIV=24 -MOD=25 -POW=26 -SHL=27 -SHR=28 -BAND=29 -BOR=30 -BXOR=31 -AND=32 -OR=33 -ISNULL=34 -ISNOTNULL=35 -BNOT=36 -NOT=37 -IN=38 -EmptyArray=39 -JSONContains=40 -JSONContainsAll=41 -JSONContainsAny=42 -ArrayContains=43 -ArrayContainsAll=44 -ArrayContainsAny=45 -ArrayLength=46 -STEuqals=47 -STTouches=48 -STOverlaps=49 -STCrosses=50 -STContains=51 -STIntersects=52 -STWithin=53 -STDWithin=54 -BooleanConstant=55 -IntegerConstant=56 -FloatingConstant=57 -Identifier=58 -Meta=59 -StringLiteral=60 -JSONIdentifier=61 -Whitespace=62 -Newline=63 +MINIMUM_SHOULD_MATCH=21 +ASSIGN=22 +ADD=23 +SUB=24 +MUL=25 +DIV=26 +MOD=27 +POW=28 +SHL=29 +SHR=30 +BAND=31 +BOR=32 +BXOR=33 +AND=34 +OR=35 +ISNULL=36 +ISNOTNULL=37 +BNOT=38 +NOT=39 +IN=40 +EmptyArray=41 +JSONContains=42 +JSONContainsAll=43 +JSONContainsAny=44 +ArrayContains=45 +ArrayContainsAll=46 +ArrayContainsAny=47 +ArrayLength=48 +STEuqals=49 +STTouches=50 +STOverlaps=51 +STCrosses=52 +STContains=53 +STIntersects=54 +STWithin=55 +STDWithin=56 +BooleanConstant=57 +IntegerConstant=58 +FloatingConstant=59 +Identifier=60 +Meta=61 +StringLiteral=62 +JSONIdentifier=63 +Whitespace=64 +Newline=65 '('=1 ')'=2 '['=3 @@ -74,16 +76,17 @@ Newline=63 '>='=11 '=='=12 '!='=13 -'+'=21 -'-'=22 -'*'=23 -'/'=24 -'%'=25 -'**'=26 -'<<'=27 -'>>'=28 -'&'=29 -'|'=30 -'^'=31 -'~'=36 -'$meta'=59 +'='=22 +'+'=23 +'-'=24 +'*'=25 +'/'=26 +'%'=27 +'**'=28 +'<<'=29 +'>>'=30 +'&'=31 +'|'=32 +'^'=33 +'~'=38 +'$meta'=61 diff --git a/internal/parser/planparserv2/generated/PlanLexer.interp b/internal/parser/planparserv2/generated/PlanLexer.interp index cdcdd1c512..a41a862e3b 100644 --- a/internal/parser/planparserv2/generated/PlanLexer.interp +++ b/internal/parser/planparserv2/generated/PlanLexer.interp @@ -20,6 +20,8 @@ null null null null +null +'=' '+' '-' '*' @@ -86,6 +88,8 @@ PHRASEMATCH RANDOMSAMPLE INTERVAL ISO +MINIMUM_SHOULD_MATCH +ASSIGN ADD SUB MUL @@ -151,6 +155,8 @@ PHRASEMATCH RANDOMSAMPLE INTERVAL ISO +MINIMUM_SHOULD_MATCH +ASSIGN ADD SUB MUL @@ -228,4 +234,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 63, 1120, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 216, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 230, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 252, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 278, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 306, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 324, 8, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 332, 8, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 367, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 375, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 391, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 415, 8, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 426, 8, 36, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 432, 8, 37, 1, 38, 1, 38, 1, 38, 5, 38, 437, 8, 38, 10, 38, 12, 38, 440, 9, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 470, 8, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 506, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 542, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 572, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 610, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 648, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 674, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 694, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 716, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 740, 8, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 762, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 786, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 814, 8, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 834, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 856, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 885, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 891, 8, 55, 1, 56, 1, 56, 3, 56, 895, 8, 56, 1, 57, 1, 57, 1, 57, 5, 57, 900, 8, 57, 10, 57, 12, 57, 903, 9, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 3, 59, 912, 8, 59, 1, 59, 1, 59, 3, 59, 916, 8, 59, 1, 59, 1, 59, 1, 59, 3, 59, 921, 8, 59, 1, 59, 3, 59, 924, 8, 59, 1, 60, 1, 60, 3, 60, 928, 8, 60, 1, 60, 1, 60, 1, 60, 3, 60, 933, 8, 60, 1, 60, 1, 60, 4, 60, 937, 8, 60, 11, 60, 12, 60, 938, 1, 61, 1, 61, 1, 61, 3, 61, 944, 8, 61, 1, 62, 4, 62, 947, 8, 62, 11, 62, 12, 62, 948, 1, 63, 4, 63, 952, 8, 63, 11, 63, 12, 63, 953, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 963, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 972, 8, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 4, 68, 981, 8, 68, 11, 68, 12, 68, 982, 1, 69, 1, 69, 5, 69, 987, 8, 69, 10, 69, 12, 69, 990, 9, 69, 1, 69, 3, 69, 993, 8, 69, 1, 70, 1, 70, 5, 70, 997, 8, 70, 10, 70, 12, 70, 1000, 9, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 3, 76, 1027, 8, 76, 1, 77, 1, 77, 3, 77, 1031, 8, 77, 1, 77, 1, 77, 1, 77, 3, 77, 1036, 8, 77, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 1042, 8, 78, 1, 78, 1, 78, 1, 79, 3, 79, 1047, 8, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 1054, 8, 79, 1, 80, 1, 80, 3, 80, 1058, 8, 80, 1, 80, 1, 80, 1, 81, 4, 81, 1063, 8, 81, 11, 81, 12, 81, 1064, 1, 82, 3, 82, 1068, 8, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 3, 82, 1075, 8, 82, 1, 83, 4, 83, 1078, 8, 83, 11, 83, 12, 83, 1079, 1, 84, 1, 84, 3, 84, 1084, 8, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 1093, 8, 85, 1, 85, 3, 85, 1096, 8, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 1103, 8, 85, 1, 86, 4, 86, 1106, 8, 86, 11, 86, 12, 86, 1107, 1, 86, 1, 86, 1, 87, 1, 87, 3, 87, 1114, 8, 87, 1, 87, 3, 87, 1117, 8, 87, 1, 87, 1, 87, 0, 0, 88, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 0, 125, 0, 127, 0, 129, 0, 131, 0, 133, 0, 135, 0, 137, 0, 139, 0, 141, 0, 143, 0, 145, 0, 147, 0, 149, 0, 151, 0, 153, 0, 155, 0, 157, 0, 159, 0, 161, 0, 163, 0, 165, 0, 167, 0, 169, 0, 171, 0, 173, 62, 175, 63, 1, 0, 16, 3, 0, 76, 76, 85, 85, 117, 117, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 3, 0, 65, 90, 95, 95, 97, 122, 1, 0, 48, 57, 2, 0, 66, 66, 98, 98, 1, 0, 48, 49, 2, 0, 88, 88, 120, 120, 1, 0, 49, 57, 1, 0, 48, 55, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 2, 0, 80, 80, 112, 112, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 97, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 2, 0, 9, 9, 32, 32, 1178, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 1, 177, 1, 0, 0, 0, 3, 179, 1, 0, 0, 0, 5, 181, 1, 0, 0, 0, 7, 183, 1, 0, 0, 0, 9, 185, 1, 0, 0, 0, 11, 187, 1, 0, 0, 0, 13, 189, 1, 0, 0, 0, 15, 191, 1, 0, 0, 0, 17, 193, 1, 0, 0, 0, 19, 196, 1, 0, 0, 0, 21, 198, 1, 0, 0, 0, 23, 201, 1, 0, 0, 0, 25, 204, 1, 0, 0, 0, 27, 215, 1, 0, 0, 0, 29, 229, 1, 0, 0, 0, 31, 251, 1, 0, 0, 0, 33, 277, 1, 0, 0, 0, 35, 305, 1, 0, 0, 0, 37, 323, 1, 0, 0, 0, 39, 331, 1, 0, 0, 0, 41, 333, 1, 0, 0, 0, 43, 335, 1, 0, 0, 0, 45, 337, 1, 0, 0, 0, 47, 339, 1, 0, 0, 0, 49, 341, 1, 0, 0, 0, 51, 343, 1, 0, 0, 0, 53, 346, 1, 0, 0, 0, 55, 349, 1, 0, 0, 0, 57, 352, 1, 0, 0, 0, 59, 354, 1, 0, 0, 0, 61, 356, 1, 0, 0, 0, 63, 366, 1, 0, 0, 0, 65, 374, 1, 0, 0, 0, 67, 390, 1, 0, 0, 0, 69, 414, 1, 0, 0, 0, 71, 416, 1, 0, 0, 0, 73, 425, 1, 0, 0, 0, 75, 431, 1, 0, 0, 0, 77, 433, 1, 0, 0, 0, 79, 469, 1, 0, 0, 0, 81, 505, 1, 0, 0, 0, 83, 541, 1, 0, 0, 0, 85, 571, 1, 0, 0, 0, 87, 609, 1, 0, 0, 0, 89, 647, 1, 0, 0, 0, 91, 673, 1, 0, 0, 0, 93, 693, 1, 0, 0, 0, 95, 715, 1, 0, 0, 0, 97, 739, 1, 0, 0, 0, 99, 761, 1, 0, 0, 0, 101, 785, 1, 0, 0, 0, 103, 813, 1, 0, 0, 0, 105, 833, 1, 0, 0, 0, 107, 855, 1, 0, 0, 0, 109, 884, 1, 0, 0, 0, 111, 890, 1, 0, 0, 0, 113, 894, 1, 0, 0, 0, 115, 896, 1, 0, 0, 0, 117, 904, 1, 0, 0, 0, 119, 911, 1, 0, 0, 0, 121, 927, 1, 0, 0, 0, 123, 943, 1, 0, 0, 0, 125, 946, 1, 0, 0, 0, 127, 951, 1, 0, 0, 0, 129, 962, 1, 0, 0, 0, 131, 971, 1, 0, 0, 0, 133, 973, 1, 0, 0, 0, 135, 975, 1, 0, 0, 0, 137, 977, 1, 0, 0, 0, 139, 992, 1, 0, 0, 0, 141, 994, 1, 0, 0, 0, 143, 1001, 1, 0, 0, 0, 145, 1005, 1, 0, 0, 0, 147, 1007, 1, 0, 0, 0, 149, 1009, 1, 0, 0, 0, 151, 1011, 1, 0, 0, 0, 153, 1026, 1, 0, 0, 0, 155, 1035, 1, 0, 0, 0, 157, 1037, 1, 0, 0, 0, 159, 1053, 1, 0, 0, 0, 161, 1055, 1, 0, 0, 0, 163, 1062, 1, 0, 0, 0, 165, 1074, 1, 0, 0, 0, 167, 1077, 1, 0, 0, 0, 169, 1081, 1, 0, 0, 0, 171, 1102, 1, 0, 0, 0, 173, 1105, 1, 0, 0, 0, 175, 1116, 1, 0, 0, 0, 177, 178, 5, 40, 0, 0, 178, 2, 1, 0, 0, 0, 179, 180, 5, 41, 0, 0, 180, 4, 1, 0, 0, 0, 181, 182, 5, 91, 0, 0, 182, 6, 1, 0, 0, 0, 183, 184, 5, 44, 0, 0, 184, 8, 1, 0, 0, 0, 185, 186, 5, 93, 0, 0, 186, 10, 1, 0, 0, 0, 187, 188, 5, 123, 0, 0, 188, 12, 1, 0, 0, 0, 189, 190, 5, 125, 0, 0, 190, 14, 1, 0, 0, 0, 191, 192, 5, 60, 0, 0, 192, 16, 1, 0, 0, 0, 193, 194, 5, 60, 0, 0, 194, 195, 5, 61, 0, 0, 195, 18, 1, 0, 0, 0, 196, 197, 5, 62, 0, 0, 197, 20, 1, 0, 0, 0, 198, 199, 5, 62, 0, 0, 199, 200, 5, 61, 0, 0, 200, 22, 1, 0, 0, 0, 201, 202, 5, 61, 0, 0, 202, 203, 5, 61, 0, 0, 203, 24, 1, 0, 0, 0, 204, 205, 5, 33, 0, 0, 205, 206, 5, 61, 0, 0, 206, 26, 1, 0, 0, 0, 207, 208, 5, 108, 0, 0, 208, 209, 5, 105, 0, 0, 209, 210, 5, 107, 0, 0, 210, 216, 5, 101, 0, 0, 211, 212, 5, 76, 0, 0, 212, 213, 5, 73, 0, 0, 213, 214, 5, 75, 0, 0, 214, 216, 5, 69, 0, 0, 215, 207, 1, 0, 0, 0, 215, 211, 1, 0, 0, 0, 216, 28, 1, 0, 0, 0, 217, 218, 5, 101, 0, 0, 218, 219, 5, 120, 0, 0, 219, 220, 5, 105, 0, 0, 220, 221, 5, 115, 0, 0, 221, 222, 5, 116, 0, 0, 222, 230, 5, 115, 0, 0, 223, 224, 5, 69, 0, 0, 224, 225, 5, 88, 0, 0, 225, 226, 5, 73, 0, 0, 226, 227, 5, 83, 0, 0, 227, 228, 5, 84, 0, 0, 228, 230, 5, 83, 0, 0, 229, 217, 1, 0, 0, 0, 229, 223, 1, 0, 0, 0, 230, 30, 1, 0, 0, 0, 231, 232, 5, 116, 0, 0, 232, 233, 5, 101, 0, 0, 233, 234, 5, 120, 0, 0, 234, 235, 5, 116, 0, 0, 235, 236, 5, 95, 0, 0, 236, 237, 5, 109, 0, 0, 237, 238, 5, 97, 0, 0, 238, 239, 5, 116, 0, 0, 239, 240, 5, 99, 0, 0, 240, 252, 5, 104, 0, 0, 241, 242, 5, 84, 0, 0, 242, 243, 5, 69, 0, 0, 243, 244, 5, 88, 0, 0, 244, 245, 5, 84, 0, 0, 245, 246, 5, 95, 0, 0, 246, 247, 5, 77, 0, 0, 247, 248, 5, 65, 0, 0, 248, 249, 5, 84, 0, 0, 249, 250, 5, 67, 0, 0, 250, 252, 5, 72, 0, 0, 251, 231, 1, 0, 0, 0, 251, 241, 1, 0, 0, 0, 252, 32, 1, 0, 0, 0, 253, 254, 5, 112, 0, 0, 254, 255, 5, 104, 0, 0, 255, 256, 5, 114, 0, 0, 256, 257, 5, 97, 0, 0, 257, 258, 5, 115, 0, 0, 258, 259, 5, 101, 0, 0, 259, 260, 5, 95, 0, 0, 260, 261, 5, 109, 0, 0, 261, 262, 5, 97, 0, 0, 262, 263, 5, 116, 0, 0, 263, 264, 5, 99, 0, 0, 264, 278, 5, 104, 0, 0, 265, 266, 5, 80, 0, 0, 266, 267, 5, 72, 0, 0, 267, 268, 5, 82, 0, 0, 268, 269, 5, 65, 0, 0, 269, 270, 5, 83, 0, 0, 270, 271, 5, 69, 0, 0, 271, 272, 5, 95, 0, 0, 272, 273, 5, 77, 0, 0, 273, 274, 5, 65, 0, 0, 274, 275, 5, 84, 0, 0, 275, 276, 5, 67, 0, 0, 276, 278, 5, 72, 0, 0, 277, 253, 1, 0, 0, 0, 277, 265, 1, 0, 0, 0, 278, 34, 1, 0, 0, 0, 279, 280, 5, 114, 0, 0, 280, 281, 5, 97, 0, 0, 281, 282, 5, 110, 0, 0, 282, 283, 5, 100, 0, 0, 283, 284, 5, 111, 0, 0, 284, 285, 5, 109, 0, 0, 285, 286, 5, 95, 0, 0, 286, 287, 5, 115, 0, 0, 287, 288, 5, 97, 0, 0, 288, 289, 5, 109, 0, 0, 289, 290, 5, 112, 0, 0, 290, 291, 5, 108, 0, 0, 291, 306, 5, 101, 0, 0, 292, 293, 5, 82, 0, 0, 293, 294, 5, 65, 0, 0, 294, 295, 5, 78, 0, 0, 295, 296, 5, 68, 0, 0, 296, 297, 5, 79, 0, 0, 297, 298, 5, 77, 0, 0, 298, 299, 5, 95, 0, 0, 299, 300, 5, 83, 0, 0, 300, 301, 5, 65, 0, 0, 301, 302, 5, 77, 0, 0, 302, 303, 5, 80, 0, 0, 303, 304, 5, 76, 0, 0, 304, 306, 5, 69, 0, 0, 305, 279, 1, 0, 0, 0, 305, 292, 1, 0, 0, 0, 306, 36, 1, 0, 0, 0, 307, 308, 5, 105, 0, 0, 308, 309, 5, 110, 0, 0, 309, 310, 5, 116, 0, 0, 310, 311, 5, 101, 0, 0, 311, 312, 5, 114, 0, 0, 312, 313, 5, 118, 0, 0, 313, 314, 5, 97, 0, 0, 314, 324, 5, 108, 0, 0, 315, 316, 5, 73, 0, 0, 316, 317, 5, 78, 0, 0, 317, 318, 5, 84, 0, 0, 318, 319, 5, 69, 0, 0, 319, 320, 5, 82, 0, 0, 320, 321, 5, 86, 0, 0, 321, 322, 5, 65, 0, 0, 322, 324, 5, 76, 0, 0, 323, 307, 1, 0, 0, 0, 323, 315, 1, 0, 0, 0, 324, 38, 1, 0, 0, 0, 325, 326, 5, 105, 0, 0, 326, 327, 5, 115, 0, 0, 327, 332, 5, 111, 0, 0, 328, 329, 5, 73, 0, 0, 329, 330, 5, 83, 0, 0, 330, 332, 5, 79, 0, 0, 331, 325, 1, 0, 0, 0, 331, 328, 1, 0, 0, 0, 332, 40, 1, 0, 0, 0, 333, 334, 5, 43, 0, 0, 334, 42, 1, 0, 0, 0, 335, 336, 5, 45, 0, 0, 336, 44, 1, 0, 0, 0, 337, 338, 5, 42, 0, 0, 338, 46, 1, 0, 0, 0, 339, 340, 5, 47, 0, 0, 340, 48, 1, 0, 0, 0, 341, 342, 5, 37, 0, 0, 342, 50, 1, 0, 0, 0, 343, 344, 5, 42, 0, 0, 344, 345, 5, 42, 0, 0, 345, 52, 1, 0, 0, 0, 346, 347, 5, 60, 0, 0, 347, 348, 5, 60, 0, 0, 348, 54, 1, 0, 0, 0, 349, 350, 5, 62, 0, 0, 350, 351, 5, 62, 0, 0, 351, 56, 1, 0, 0, 0, 352, 353, 5, 38, 0, 0, 353, 58, 1, 0, 0, 0, 354, 355, 5, 124, 0, 0, 355, 60, 1, 0, 0, 0, 356, 357, 5, 94, 0, 0, 357, 62, 1, 0, 0, 0, 358, 359, 5, 38, 0, 0, 359, 367, 5, 38, 0, 0, 360, 361, 5, 97, 0, 0, 361, 362, 5, 110, 0, 0, 362, 367, 5, 100, 0, 0, 363, 364, 5, 65, 0, 0, 364, 365, 5, 78, 0, 0, 365, 367, 5, 68, 0, 0, 366, 358, 1, 0, 0, 0, 366, 360, 1, 0, 0, 0, 366, 363, 1, 0, 0, 0, 367, 64, 1, 0, 0, 0, 368, 369, 5, 124, 0, 0, 369, 375, 5, 124, 0, 0, 370, 371, 5, 111, 0, 0, 371, 375, 5, 114, 0, 0, 372, 373, 5, 79, 0, 0, 373, 375, 5, 82, 0, 0, 374, 368, 1, 0, 0, 0, 374, 370, 1, 0, 0, 0, 374, 372, 1, 0, 0, 0, 375, 66, 1, 0, 0, 0, 376, 377, 5, 105, 0, 0, 377, 378, 5, 115, 0, 0, 378, 379, 5, 32, 0, 0, 379, 380, 5, 110, 0, 0, 380, 381, 5, 117, 0, 0, 381, 382, 5, 108, 0, 0, 382, 391, 5, 108, 0, 0, 383, 384, 5, 73, 0, 0, 384, 385, 5, 83, 0, 0, 385, 386, 5, 32, 0, 0, 386, 387, 5, 78, 0, 0, 387, 388, 5, 85, 0, 0, 388, 389, 5, 76, 0, 0, 389, 391, 5, 76, 0, 0, 390, 376, 1, 0, 0, 0, 390, 383, 1, 0, 0, 0, 391, 68, 1, 0, 0, 0, 392, 393, 5, 105, 0, 0, 393, 394, 5, 115, 0, 0, 394, 395, 5, 32, 0, 0, 395, 396, 5, 110, 0, 0, 396, 397, 5, 111, 0, 0, 397, 398, 5, 116, 0, 0, 398, 399, 5, 32, 0, 0, 399, 400, 5, 110, 0, 0, 400, 401, 5, 117, 0, 0, 401, 402, 5, 108, 0, 0, 402, 415, 5, 108, 0, 0, 403, 404, 5, 73, 0, 0, 404, 405, 5, 83, 0, 0, 405, 406, 5, 32, 0, 0, 406, 407, 5, 78, 0, 0, 407, 408, 5, 79, 0, 0, 408, 409, 5, 84, 0, 0, 409, 410, 5, 32, 0, 0, 410, 411, 5, 78, 0, 0, 411, 412, 5, 85, 0, 0, 412, 413, 5, 76, 0, 0, 413, 415, 5, 76, 0, 0, 414, 392, 1, 0, 0, 0, 414, 403, 1, 0, 0, 0, 415, 70, 1, 0, 0, 0, 416, 417, 5, 126, 0, 0, 417, 72, 1, 0, 0, 0, 418, 426, 5, 33, 0, 0, 419, 420, 5, 110, 0, 0, 420, 421, 5, 111, 0, 0, 421, 426, 5, 116, 0, 0, 422, 423, 5, 78, 0, 0, 423, 424, 5, 79, 0, 0, 424, 426, 5, 84, 0, 0, 425, 418, 1, 0, 0, 0, 425, 419, 1, 0, 0, 0, 425, 422, 1, 0, 0, 0, 426, 74, 1, 0, 0, 0, 427, 428, 5, 105, 0, 0, 428, 432, 5, 110, 0, 0, 429, 430, 5, 73, 0, 0, 430, 432, 5, 78, 0, 0, 431, 427, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, 432, 76, 1, 0, 0, 0, 433, 438, 5, 91, 0, 0, 434, 437, 3, 173, 86, 0, 435, 437, 3, 175, 87, 0, 436, 434, 1, 0, 0, 0, 436, 435, 1, 0, 0, 0, 437, 440, 1, 0, 0, 0, 438, 436, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, 439, 441, 1, 0, 0, 0, 440, 438, 1, 0, 0, 0, 441, 442, 5, 93, 0, 0, 442, 78, 1, 0, 0, 0, 443, 444, 5, 106, 0, 0, 444, 445, 5, 115, 0, 0, 445, 446, 5, 111, 0, 0, 446, 447, 5, 110, 0, 0, 447, 448, 5, 95, 0, 0, 448, 449, 5, 99, 0, 0, 449, 450, 5, 111, 0, 0, 450, 451, 5, 110, 0, 0, 451, 452, 5, 116, 0, 0, 452, 453, 5, 97, 0, 0, 453, 454, 5, 105, 0, 0, 454, 455, 5, 110, 0, 0, 455, 470, 5, 115, 0, 0, 456, 457, 5, 74, 0, 0, 457, 458, 5, 83, 0, 0, 458, 459, 5, 79, 0, 0, 459, 460, 5, 78, 0, 0, 460, 461, 5, 95, 0, 0, 461, 462, 5, 67, 0, 0, 462, 463, 5, 79, 0, 0, 463, 464, 5, 78, 0, 0, 464, 465, 5, 84, 0, 0, 465, 466, 5, 65, 0, 0, 466, 467, 5, 73, 0, 0, 467, 468, 5, 78, 0, 0, 468, 470, 5, 83, 0, 0, 469, 443, 1, 0, 0, 0, 469, 456, 1, 0, 0, 0, 470, 80, 1, 0, 0, 0, 471, 472, 5, 106, 0, 0, 472, 473, 5, 115, 0, 0, 473, 474, 5, 111, 0, 0, 474, 475, 5, 110, 0, 0, 475, 476, 5, 95, 0, 0, 476, 477, 5, 99, 0, 0, 477, 478, 5, 111, 0, 0, 478, 479, 5, 110, 0, 0, 479, 480, 5, 116, 0, 0, 480, 481, 5, 97, 0, 0, 481, 482, 5, 105, 0, 0, 482, 483, 5, 110, 0, 0, 483, 484, 5, 115, 0, 0, 484, 485, 5, 95, 0, 0, 485, 486, 5, 97, 0, 0, 486, 487, 5, 108, 0, 0, 487, 506, 5, 108, 0, 0, 488, 489, 5, 74, 0, 0, 489, 490, 5, 83, 0, 0, 490, 491, 5, 79, 0, 0, 491, 492, 5, 78, 0, 0, 492, 493, 5, 95, 0, 0, 493, 494, 5, 67, 0, 0, 494, 495, 5, 79, 0, 0, 495, 496, 5, 78, 0, 0, 496, 497, 5, 84, 0, 0, 497, 498, 5, 65, 0, 0, 498, 499, 5, 73, 0, 0, 499, 500, 5, 78, 0, 0, 500, 501, 5, 83, 0, 0, 501, 502, 5, 95, 0, 0, 502, 503, 5, 65, 0, 0, 503, 504, 5, 76, 0, 0, 504, 506, 5, 76, 0, 0, 505, 471, 1, 0, 0, 0, 505, 488, 1, 0, 0, 0, 506, 82, 1, 0, 0, 0, 507, 508, 5, 106, 0, 0, 508, 509, 5, 115, 0, 0, 509, 510, 5, 111, 0, 0, 510, 511, 5, 110, 0, 0, 511, 512, 5, 95, 0, 0, 512, 513, 5, 99, 0, 0, 513, 514, 5, 111, 0, 0, 514, 515, 5, 110, 0, 0, 515, 516, 5, 116, 0, 0, 516, 517, 5, 97, 0, 0, 517, 518, 5, 105, 0, 0, 518, 519, 5, 110, 0, 0, 519, 520, 5, 115, 0, 0, 520, 521, 5, 95, 0, 0, 521, 522, 5, 97, 0, 0, 522, 523, 5, 110, 0, 0, 523, 542, 5, 121, 0, 0, 524, 525, 5, 74, 0, 0, 525, 526, 5, 83, 0, 0, 526, 527, 5, 79, 0, 0, 527, 528, 5, 78, 0, 0, 528, 529, 5, 95, 0, 0, 529, 530, 5, 67, 0, 0, 530, 531, 5, 79, 0, 0, 531, 532, 5, 78, 0, 0, 532, 533, 5, 84, 0, 0, 533, 534, 5, 65, 0, 0, 534, 535, 5, 73, 0, 0, 535, 536, 5, 78, 0, 0, 536, 537, 5, 83, 0, 0, 537, 538, 5, 95, 0, 0, 538, 539, 5, 65, 0, 0, 539, 540, 5, 78, 0, 0, 540, 542, 5, 89, 0, 0, 541, 507, 1, 0, 0, 0, 541, 524, 1, 0, 0, 0, 542, 84, 1, 0, 0, 0, 543, 544, 5, 97, 0, 0, 544, 545, 5, 114, 0, 0, 545, 546, 5, 114, 0, 0, 546, 547, 5, 97, 0, 0, 547, 548, 5, 121, 0, 0, 548, 549, 5, 95, 0, 0, 549, 550, 5, 99, 0, 0, 550, 551, 5, 111, 0, 0, 551, 552, 5, 110, 0, 0, 552, 553, 5, 116, 0, 0, 553, 554, 5, 97, 0, 0, 554, 555, 5, 105, 0, 0, 555, 556, 5, 110, 0, 0, 556, 572, 5, 115, 0, 0, 557, 558, 5, 65, 0, 0, 558, 559, 5, 82, 0, 0, 559, 560, 5, 82, 0, 0, 560, 561, 5, 65, 0, 0, 561, 562, 5, 89, 0, 0, 562, 563, 5, 95, 0, 0, 563, 564, 5, 67, 0, 0, 564, 565, 5, 79, 0, 0, 565, 566, 5, 78, 0, 0, 566, 567, 5, 84, 0, 0, 567, 568, 5, 65, 0, 0, 568, 569, 5, 73, 0, 0, 569, 570, 5, 78, 0, 0, 570, 572, 5, 83, 0, 0, 571, 543, 1, 0, 0, 0, 571, 557, 1, 0, 0, 0, 572, 86, 1, 0, 0, 0, 573, 574, 5, 97, 0, 0, 574, 575, 5, 114, 0, 0, 575, 576, 5, 114, 0, 0, 576, 577, 5, 97, 0, 0, 577, 578, 5, 121, 0, 0, 578, 579, 5, 95, 0, 0, 579, 580, 5, 99, 0, 0, 580, 581, 5, 111, 0, 0, 581, 582, 5, 110, 0, 0, 582, 583, 5, 116, 0, 0, 583, 584, 5, 97, 0, 0, 584, 585, 5, 105, 0, 0, 585, 586, 5, 110, 0, 0, 586, 587, 5, 115, 0, 0, 587, 588, 5, 95, 0, 0, 588, 589, 5, 97, 0, 0, 589, 590, 5, 108, 0, 0, 590, 610, 5, 108, 0, 0, 591, 592, 5, 65, 0, 0, 592, 593, 5, 82, 0, 0, 593, 594, 5, 82, 0, 0, 594, 595, 5, 65, 0, 0, 595, 596, 5, 89, 0, 0, 596, 597, 5, 95, 0, 0, 597, 598, 5, 67, 0, 0, 598, 599, 5, 79, 0, 0, 599, 600, 5, 78, 0, 0, 600, 601, 5, 84, 0, 0, 601, 602, 5, 65, 0, 0, 602, 603, 5, 73, 0, 0, 603, 604, 5, 78, 0, 0, 604, 605, 5, 83, 0, 0, 605, 606, 5, 95, 0, 0, 606, 607, 5, 65, 0, 0, 607, 608, 5, 76, 0, 0, 608, 610, 5, 76, 0, 0, 609, 573, 1, 0, 0, 0, 609, 591, 1, 0, 0, 0, 610, 88, 1, 0, 0, 0, 611, 612, 5, 97, 0, 0, 612, 613, 5, 114, 0, 0, 613, 614, 5, 114, 0, 0, 614, 615, 5, 97, 0, 0, 615, 616, 5, 121, 0, 0, 616, 617, 5, 95, 0, 0, 617, 618, 5, 99, 0, 0, 618, 619, 5, 111, 0, 0, 619, 620, 5, 110, 0, 0, 620, 621, 5, 116, 0, 0, 621, 622, 5, 97, 0, 0, 622, 623, 5, 105, 0, 0, 623, 624, 5, 110, 0, 0, 624, 625, 5, 115, 0, 0, 625, 626, 5, 95, 0, 0, 626, 627, 5, 97, 0, 0, 627, 628, 5, 110, 0, 0, 628, 648, 5, 121, 0, 0, 629, 630, 5, 65, 0, 0, 630, 631, 5, 82, 0, 0, 631, 632, 5, 82, 0, 0, 632, 633, 5, 65, 0, 0, 633, 634, 5, 89, 0, 0, 634, 635, 5, 95, 0, 0, 635, 636, 5, 67, 0, 0, 636, 637, 5, 79, 0, 0, 637, 638, 5, 78, 0, 0, 638, 639, 5, 84, 0, 0, 639, 640, 5, 65, 0, 0, 640, 641, 5, 73, 0, 0, 641, 642, 5, 78, 0, 0, 642, 643, 5, 83, 0, 0, 643, 644, 5, 95, 0, 0, 644, 645, 5, 65, 0, 0, 645, 646, 5, 78, 0, 0, 646, 648, 5, 89, 0, 0, 647, 611, 1, 0, 0, 0, 647, 629, 1, 0, 0, 0, 648, 90, 1, 0, 0, 0, 649, 650, 5, 97, 0, 0, 650, 651, 5, 114, 0, 0, 651, 652, 5, 114, 0, 0, 652, 653, 5, 97, 0, 0, 653, 654, 5, 121, 0, 0, 654, 655, 5, 95, 0, 0, 655, 656, 5, 108, 0, 0, 656, 657, 5, 101, 0, 0, 657, 658, 5, 110, 0, 0, 658, 659, 5, 103, 0, 0, 659, 660, 5, 116, 0, 0, 660, 674, 5, 104, 0, 0, 661, 662, 5, 65, 0, 0, 662, 663, 5, 82, 0, 0, 663, 664, 5, 82, 0, 0, 664, 665, 5, 65, 0, 0, 665, 666, 5, 89, 0, 0, 666, 667, 5, 95, 0, 0, 667, 668, 5, 76, 0, 0, 668, 669, 5, 69, 0, 0, 669, 670, 5, 78, 0, 0, 670, 671, 5, 71, 0, 0, 671, 672, 5, 84, 0, 0, 672, 674, 5, 72, 0, 0, 673, 649, 1, 0, 0, 0, 673, 661, 1, 0, 0, 0, 674, 92, 1, 0, 0, 0, 675, 676, 5, 115, 0, 0, 676, 677, 5, 116, 0, 0, 677, 678, 5, 95, 0, 0, 678, 679, 5, 101, 0, 0, 679, 680, 5, 113, 0, 0, 680, 681, 5, 117, 0, 0, 681, 682, 5, 97, 0, 0, 682, 683, 5, 108, 0, 0, 683, 694, 5, 115, 0, 0, 684, 685, 5, 83, 0, 0, 685, 686, 5, 84, 0, 0, 686, 687, 5, 95, 0, 0, 687, 688, 5, 69, 0, 0, 688, 689, 5, 81, 0, 0, 689, 690, 5, 85, 0, 0, 690, 691, 5, 65, 0, 0, 691, 692, 5, 76, 0, 0, 692, 694, 5, 83, 0, 0, 693, 675, 1, 0, 0, 0, 693, 684, 1, 0, 0, 0, 694, 94, 1, 0, 0, 0, 695, 696, 5, 115, 0, 0, 696, 697, 5, 116, 0, 0, 697, 698, 5, 95, 0, 0, 698, 699, 5, 116, 0, 0, 699, 700, 5, 111, 0, 0, 700, 701, 5, 117, 0, 0, 701, 702, 5, 99, 0, 0, 702, 703, 5, 104, 0, 0, 703, 704, 5, 101, 0, 0, 704, 716, 5, 115, 0, 0, 705, 706, 5, 83, 0, 0, 706, 707, 5, 84, 0, 0, 707, 708, 5, 95, 0, 0, 708, 709, 5, 84, 0, 0, 709, 710, 5, 79, 0, 0, 710, 711, 5, 85, 0, 0, 711, 712, 5, 67, 0, 0, 712, 713, 5, 72, 0, 0, 713, 714, 5, 69, 0, 0, 714, 716, 5, 83, 0, 0, 715, 695, 1, 0, 0, 0, 715, 705, 1, 0, 0, 0, 716, 96, 1, 0, 0, 0, 717, 718, 5, 115, 0, 0, 718, 719, 5, 116, 0, 0, 719, 720, 5, 95, 0, 0, 720, 721, 5, 111, 0, 0, 721, 722, 5, 118, 0, 0, 722, 723, 5, 101, 0, 0, 723, 724, 5, 114, 0, 0, 724, 725, 5, 108, 0, 0, 725, 726, 5, 97, 0, 0, 726, 727, 5, 112, 0, 0, 727, 740, 5, 115, 0, 0, 728, 729, 5, 83, 0, 0, 729, 730, 5, 84, 0, 0, 730, 731, 5, 95, 0, 0, 731, 732, 5, 79, 0, 0, 732, 733, 5, 86, 0, 0, 733, 734, 5, 69, 0, 0, 734, 735, 5, 82, 0, 0, 735, 736, 5, 76, 0, 0, 736, 737, 5, 65, 0, 0, 737, 738, 5, 80, 0, 0, 738, 740, 5, 83, 0, 0, 739, 717, 1, 0, 0, 0, 739, 728, 1, 0, 0, 0, 740, 98, 1, 0, 0, 0, 741, 742, 5, 115, 0, 0, 742, 743, 5, 116, 0, 0, 743, 744, 5, 95, 0, 0, 744, 745, 5, 99, 0, 0, 745, 746, 5, 114, 0, 0, 746, 747, 5, 111, 0, 0, 747, 748, 5, 115, 0, 0, 748, 749, 5, 115, 0, 0, 749, 750, 5, 101, 0, 0, 750, 762, 5, 115, 0, 0, 751, 752, 5, 83, 0, 0, 752, 753, 5, 84, 0, 0, 753, 754, 5, 95, 0, 0, 754, 755, 5, 67, 0, 0, 755, 756, 5, 82, 0, 0, 756, 757, 5, 79, 0, 0, 757, 758, 5, 83, 0, 0, 758, 759, 5, 83, 0, 0, 759, 760, 5, 69, 0, 0, 760, 762, 5, 83, 0, 0, 761, 741, 1, 0, 0, 0, 761, 751, 1, 0, 0, 0, 762, 100, 1, 0, 0, 0, 763, 764, 5, 115, 0, 0, 764, 765, 5, 116, 0, 0, 765, 766, 5, 95, 0, 0, 766, 767, 5, 99, 0, 0, 767, 768, 5, 111, 0, 0, 768, 769, 5, 110, 0, 0, 769, 770, 5, 116, 0, 0, 770, 771, 5, 97, 0, 0, 771, 772, 5, 105, 0, 0, 772, 773, 5, 110, 0, 0, 773, 786, 5, 115, 0, 0, 774, 775, 5, 83, 0, 0, 775, 776, 5, 84, 0, 0, 776, 777, 5, 95, 0, 0, 777, 778, 5, 67, 0, 0, 778, 779, 5, 79, 0, 0, 779, 780, 5, 78, 0, 0, 780, 781, 5, 84, 0, 0, 781, 782, 5, 65, 0, 0, 782, 783, 5, 73, 0, 0, 783, 784, 5, 78, 0, 0, 784, 786, 5, 83, 0, 0, 785, 763, 1, 0, 0, 0, 785, 774, 1, 0, 0, 0, 786, 102, 1, 0, 0, 0, 787, 788, 5, 115, 0, 0, 788, 789, 5, 116, 0, 0, 789, 790, 5, 95, 0, 0, 790, 791, 5, 105, 0, 0, 791, 792, 5, 110, 0, 0, 792, 793, 5, 116, 0, 0, 793, 794, 5, 101, 0, 0, 794, 795, 5, 114, 0, 0, 795, 796, 5, 115, 0, 0, 796, 797, 5, 101, 0, 0, 797, 798, 5, 99, 0, 0, 798, 799, 5, 116, 0, 0, 799, 814, 5, 115, 0, 0, 800, 801, 5, 83, 0, 0, 801, 802, 5, 84, 0, 0, 802, 803, 5, 95, 0, 0, 803, 804, 5, 73, 0, 0, 804, 805, 5, 78, 0, 0, 805, 806, 5, 84, 0, 0, 806, 807, 5, 69, 0, 0, 807, 808, 5, 82, 0, 0, 808, 809, 5, 83, 0, 0, 809, 810, 5, 69, 0, 0, 810, 811, 5, 67, 0, 0, 811, 812, 5, 84, 0, 0, 812, 814, 5, 83, 0, 0, 813, 787, 1, 0, 0, 0, 813, 800, 1, 0, 0, 0, 814, 104, 1, 0, 0, 0, 815, 816, 5, 115, 0, 0, 816, 817, 5, 116, 0, 0, 817, 818, 5, 95, 0, 0, 818, 819, 5, 119, 0, 0, 819, 820, 5, 105, 0, 0, 820, 821, 5, 116, 0, 0, 821, 822, 5, 104, 0, 0, 822, 823, 5, 105, 0, 0, 823, 834, 5, 110, 0, 0, 824, 825, 5, 83, 0, 0, 825, 826, 5, 84, 0, 0, 826, 827, 5, 95, 0, 0, 827, 828, 5, 87, 0, 0, 828, 829, 5, 73, 0, 0, 829, 830, 5, 84, 0, 0, 830, 831, 5, 72, 0, 0, 831, 832, 5, 73, 0, 0, 832, 834, 5, 78, 0, 0, 833, 815, 1, 0, 0, 0, 833, 824, 1, 0, 0, 0, 834, 106, 1, 0, 0, 0, 835, 836, 5, 115, 0, 0, 836, 837, 5, 116, 0, 0, 837, 838, 5, 95, 0, 0, 838, 839, 5, 100, 0, 0, 839, 840, 5, 119, 0, 0, 840, 841, 5, 105, 0, 0, 841, 842, 5, 116, 0, 0, 842, 843, 5, 104, 0, 0, 843, 844, 5, 105, 0, 0, 844, 856, 5, 110, 0, 0, 845, 846, 5, 83, 0, 0, 846, 847, 5, 84, 0, 0, 847, 848, 5, 95, 0, 0, 848, 849, 5, 68, 0, 0, 849, 850, 5, 87, 0, 0, 850, 851, 5, 73, 0, 0, 851, 852, 5, 84, 0, 0, 852, 853, 5, 72, 0, 0, 853, 854, 5, 73, 0, 0, 854, 856, 5, 78, 0, 0, 855, 835, 1, 0, 0, 0, 855, 845, 1, 0, 0, 0, 856, 108, 1, 0, 0, 0, 857, 858, 5, 116, 0, 0, 858, 859, 5, 114, 0, 0, 859, 860, 5, 117, 0, 0, 860, 885, 5, 101, 0, 0, 861, 862, 5, 84, 0, 0, 862, 863, 5, 114, 0, 0, 863, 864, 5, 117, 0, 0, 864, 885, 5, 101, 0, 0, 865, 866, 5, 84, 0, 0, 866, 867, 5, 82, 0, 0, 867, 868, 5, 85, 0, 0, 868, 885, 5, 69, 0, 0, 869, 870, 5, 102, 0, 0, 870, 871, 5, 97, 0, 0, 871, 872, 5, 108, 0, 0, 872, 873, 5, 115, 0, 0, 873, 885, 5, 101, 0, 0, 874, 875, 5, 70, 0, 0, 875, 876, 5, 97, 0, 0, 876, 877, 5, 108, 0, 0, 877, 878, 5, 115, 0, 0, 878, 885, 5, 101, 0, 0, 879, 880, 5, 70, 0, 0, 880, 881, 5, 65, 0, 0, 881, 882, 5, 76, 0, 0, 882, 883, 5, 83, 0, 0, 883, 885, 5, 69, 0, 0, 884, 857, 1, 0, 0, 0, 884, 861, 1, 0, 0, 0, 884, 865, 1, 0, 0, 0, 884, 869, 1, 0, 0, 0, 884, 874, 1, 0, 0, 0, 884, 879, 1, 0, 0, 0, 885, 110, 1, 0, 0, 0, 886, 891, 3, 139, 69, 0, 887, 891, 3, 141, 70, 0, 888, 891, 3, 143, 71, 0, 889, 891, 3, 137, 68, 0, 890, 886, 1, 0, 0, 0, 890, 887, 1, 0, 0, 0, 890, 888, 1, 0, 0, 0, 890, 889, 1, 0, 0, 0, 891, 112, 1, 0, 0, 0, 892, 895, 3, 155, 77, 0, 893, 895, 3, 157, 78, 0, 894, 892, 1, 0, 0, 0, 894, 893, 1, 0, 0, 0, 895, 114, 1, 0, 0, 0, 896, 901, 3, 133, 66, 0, 897, 900, 3, 133, 66, 0, 898, 900, 3, 135, 67, 0, 899, 897, 1, 0, 0, 0, 899, 898, 1, 0, 0, 0, 900, 903, 1, 0, 0, 0, 901, 899, 1, 0, 0, 0, 901, 902, 1, 0, 0, 0, 902, 116, 1, 0, 0, 0, 903, 901, 1, 0, 0, 0, 904, 905, 5, 36, 0, 0, 905, 906, 5, 109, 0, 0, 906, 907, 5, 101, 0, 0, 907, 908, 5, 116, 0, 0, 908, 909, 5, 97, 0, 0, 909, 118, 1, 0, 0, 0, 910, 912, 3, 123, 61, 0, 911, 910, 1, 0, 0, 0, 911, 912, 1, 0, 0, 0, 912, 923, 1, 0, 0, 0, 913, 915, 5, 34, 0, 0, 914, 916, 3, 125, 62, 0, 915, 914, 1, 0, 0, 0, 915, 916, 1, 0, 0, 0, 916, 917, 1, 0, 0, 0, 917, 924, 5, 34, 0, 0, 918, 920, 5, 39, 0, 0, 919, 921, 3, 127, 63, 0, 920, 919, 1, 0, 0, 0, 920, 921, 1, 0, 0, 0, 921, 922, 1, 0, 0, 0, 922, 924, 5, 39, 0, 0, 923, 913, 1, 0, 0, 0, 923, 918, 1, 0, 0, 0, 924, 120, 1, 0, 0, 0, 925, 928, 3, 115, 57, 0, 926, 928, 3, 117, 58, 0, 927, 925, 1, 0, 0, 0, 927, 926, 1, 0, 0, 0, 928, 936, 1, 0, 0, 0, 929, 932, 5, 91, 0, 0, 930, 933, 3, 119, 59, 0, 931, 933, 3, 139, 69, 0, 932, 930, 1, 0, 0, 0, 932, 931, 1, 0, 0, 0, 933, 934, 1, 0, 0, 0, 934, 935, 5, 93, 0, 0, 935, 937, 1, 0, 0, 0, 936, 929, 1, 0, 0, 0, 937, 938, 1, 0, 0, 0, 938, 936, 1, 0, 0, 0, 938, 939, 1, 0, 0, 0, 939, 122, 1, 0, 0, 0, 940, 941, 5, 117, 0, 0, 941, 944, 5, 56, 0, 0, 942, 944, 7, 0, 0, 0, 943, 940, 1, 0, 0, 0, 943, 942, 1, 0, 0, 0, 944, 124, 1, 0, 0, 0, 945, 947, 3, 129, 64, 0, 946, 945, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 946, 1, 0, 0, 0, 948, 949, 1, 0, 0, 0, 949, 126, 1, 0, 0, 0, 950, 952, 3, 131, 65, 0, 951, 950, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 951, 1, 0, 0, 0, 953, 954, 1, 0, 0, 0, 954, 128, 1, 0, 0, 0, 955, 963, 8, 1, 0, 0, 956, 963, 3, 171, 85, 0, 957, 958, 5, 92, 0, 0, 958, 963, 5, 10, 0, 0, 959, 960, 5, 92, 0, 0, 960, 961, 5, 13, 0, 0, 961, 963, 5, 10, 0, 0, 962, 955, 1, 0, 0, 0, 962, 956, 1, 0, 0, 0, 962, 957, 1, 0, 0, 0, 962, 959, 1, 0, 0, 0, 963, 130, 1, 0, 0, 0, 964, 972, 8, 2, 0, 0, 965, 972, 3, 171, 85, 0, 966, 967, 5, 92, 0, 0, 967, 972, 5, 10, 0, 0, 968, 969, 5, 92, 0, 0, 969, 970, 5, 13, 0, 0, 970, 972, 5, 10, 0, 0, 971, 964, 1, 0, 0, 0, 971, 965, 1, 0, 0, 0, 971, 966, 1, 0, 0, 0, 971, 968, 1, 0, 0, 0, 972, 132, 1, 0, 0, 0, 973, 974, 7, 3, 0, 0, 974, 134, 1, 0, 0, 0, 975, 976, 7, 4, 0, 0, 976, 136, 1, 0, 0, 0, 977, 978, 5, 48, 0, 0, 978, 980, 7, 5, 0, 0, 979, 981, 7, 6, 0, 0, 980, 979, 1, 0, 0, 0, 981, 982, 1, 0, 0, 0, 982, 980, 1, 0, 0, 0, 982, 983, 1, 0, 0, 0, 983, 138, 1, 0, 0, 0, 984, 988, 3, 145, 72, 0, 985, 987, 3, 135, 67, 0, 986, 985, 1, 0, 0, 0, 987, 990, 1, 0, 0, 0, 988, 986, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 993, 1, 0, 0, 0, 990, 988, 1, 0, 0, 0, 991, 993, 5, 48, 0, 0, 992, 984, 1, 0, 0, 0, 992, 991, 1, 0, 0, 0, 993, 140, 1, 0, 0, 0, 994, 998, 5, 48, 0, 0, 995, 997, 3, 147, 73, 0, 996, 995, 1, 0, 0, 0, 997, 1000, 1, 0, 0, 0, 998, 996, 1, 0, 0, 0, 998, 999, 1, 0, 0, 0, 999, 142, 1, 0, 0, 0, 1000, 998, 1, 0, 0, 0, 1001, 1002, 5, 48, 0, 0, 1002, 1003, 7, 7, 0, 0, 1003, 1004, 3, 167, 83, 0, 1004, 144, 1, 0, 0, 0, 1005, 1006, 7, 8, 0, 0, 1006, 146, 1, 0, 0, 0, 1007, 1008, 7, 9, 0, 0, 1008, 148, 1, 0, 0, 0, 1009, 1010, 7, 10, 0, 0, 1010, 150, 1, 0, 0, 0, 1011, 1012, 3, 149, 74, 0, 1012, 1013, 3, 149, 74, 0, 1013, 1014, 3, 149, 74, 0, 1014, 1015, 3, 149, 74, 0, 1015, 152, 1, 0, 0, 0, 1016, 1017, 5, 92, 0, 0, 1017, 1018, 5, 117, 0, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1027, 3, 151, 75, 0, 1020, 1021, 5, 92, 0, 0, 1021, 1022, 5, 85, 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 3, 151, 75, 0, 1024, 1025, 3, 151, 75, 0, 1025, 1027, 1, 0, 0, 0, 1026, 1016, 1, 0, 0, 0, 1026, 1020, 1, 0, 0, 0, 1027, 154, 1, 0, 0, 0, 1028, 1030, 3, 159, 79, 0, 1029, 1031, 3, 161, 80, 0, 1030, 1029, 1, 0, 0, 0, 1030, 1031, 1, 0, 0, 0, 1031, 1036, 1, 0, 0, 0, 1032, 1033, 3, 163, 81, 0, 1033, 1034, 3, 161, 80, 0, 1034, 1036, 1, 0, 0, 0, 1035, 1028, 1, 0, 0, 0, 1035, 1032, 1, 0, 0, 0, 1036, 156, 1, 0, 0, 0, 1037, 1038, 5, 48, 0, 0, 1038, 1041, 7, 7, 0, 0, 1039, 1042, 3, 165, 82, 0, 1040, 1042, 3, 167, 83, 0, 1041, 1039, 1, 0, 0, 0, 1041, 1040, 1, 0, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1044, 3, 169, 84, 0, 1044, 158, 1, 0, 0, 0, 1045, 1047, 3, 163, 81, 0, 1046, 1045, 1, 0, 0, 0, 1046, 1047, 1, 0, 0, 0, 1047, 1048, 1, 0, 0, 0, 1048, 1049, 5, 46, 0, 0, 1049, 1054, 3, 163, 81, 0, 1050, 1051, 3, 163, 81, 0, 1051, 1052, 5, 46, 0, 0, 1052, 1054, 1, 0, 0, 0, 1053, 1046, 1, 0, 0, 0, 1053, 1050, 1, 0, 0, 0, 1054, 160, 1, 0, 0, 0, 1055, 1057, 7, 11, 0, 0, 1056, 1058, 7, 12, 0, 0, 1057, 1056, 1, 0, 0, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, 1, 0, 0, 0, 1059, 1060, 3, 163, 81, 0, 1060, 162, 1, 0, 0, 0, 1061, 1063, 3, 135, 67, 0, 1062, 1061, 1, 0, 0, 0, 1063, 1064, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1064, 1065, 1, 0, 0, 0, 1065, 164, 1, 0, 0, 0, 1066, 1068, 3, 167, 83, 0, 1067, 1066, 1, 0, 0, 0, 1067, 1068, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1069, 1070, 5, 46, 0, 0, 1070, 1075, 3, 167, 83, 0, 1071, 1072, 3, 167, 83, 0, 1072, 1073, 5, 46, 0, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1067, 1, 0, 0, 0, 1074, 1071, 1, 0, 0, 0, 1075, 166, 1, 0, 0, 0, 1076, 1078, 3, 149, 74, 0, 1077, 1076, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1077, 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 168, 1, 0, 0, 0, 1081, 1083, 7, 13, 0, 0, 1082, 1084, 7, 12, 0, 0, 1083, 1082, 1, 0, 0, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1085, 1, 0, 0, 0, 1085, 1086, 3, 163, 81, 0, 1086, 170, 1, 0, 0, 0, 1087, 1088, 5, 92, 0, 0, 1088, 1103, 7, 14, 0, 0, 1089, 1090, 5, 92, 0, 0, 1090, 1092, 3, 147, 73, 0, 1091, 1093, 3, 147, 73, 0, 1092, 1091, 1, 0, 0, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1095, 1, 0, 0, 0, 1094, 1096, 3, 147, 73, 0, 1095, 1094, 1, 0, 0, 0, 1095, 1096, 1, 0, 0, 0, 1096, 1103, 1, 0, 0, 0, 1097, 1098, 5, 92, 0, 0, 1098, 1099, 5, 120, 0, 0, 1099, 1100, 1, 0, 0, 0, 1100, 1103, 3, 167, 83, 0, 1101, 1103, 3, 153, 76, 0, 1102, 1087, 1, 0, 0, 0, 1102, 1089, 1, 0, 0, 0, 1102, 1097, 1, 0, 0, 0, 1102, 1101, 1, 0, 0, 0, 1103, 172, 1, 0, 0, 0, 1104, 1106, 7, 15, 0, 0, 1105, 1104, 1, 0, 0, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1105, 1, 0, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1109, 1, 0, 0, 0, 1109, 1110, 6, 86, 0, 0, 1110, 174, 1, 0, 0, 0, 1111, 1113, 5, 13, 0, 0, 1112, 1114, 5, 10, 0, 0, 1113, 1112, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1117, 1, 0, 0, 0, 1115, 1117, 5, 10, 0, 0, 1116, 1111, 1, 0, 0, 0, 1116, 1115, 1, 0, 0, 0, 1117, 1118, 1, 0, 0, 0, 1118, 1119, 6, 87, 0, 0, 1119, 176, 1, 0, 0, 0, 70, 0, 215, 229, 251, 277, 305, 323, 331, 366, 374, 390, 414, 425, 431, 436, 438, 469, 505, 541, 571, 609, 647, 673, 693, 715, 739, 761, 785, 813, 833, 855, 884, 890, 894, 899, 901, 911, 915, 920, 923, 927, 932, 938, 943, 948, 953, 962, 971, 982, 988, 992, 998, 1026, 1030, 1035, 1041, 1046, 1053, 1057, 1064, 1067, 1074, 1079, 1083, 1092, 1095, 1102, 1107, 1113, 1116, 1, 6, 0, 0] \ No newline at end of file +[4, 0, 65, 1168, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 220, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 234, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 256, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 282, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 310, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 328, 8, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 336, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 378, 8, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 415, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 423, 8, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 439, 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 463, 8, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 474, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 480, 8, 39, 1, 40, 1, 40, 1, 40, 5, 40, 485, 8, 40, 10, 40, 12, 40, 488, 9, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 518, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 554, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 590, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 620, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 658, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 696, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 722, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 742, 8, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 764, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 788, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 810, 8, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 834, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 862, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 882, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 904, 8, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 933, 8, 56, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 939, 8, 57, 1, 58, 1, 58, 3, 58, 943, 8, 58, 1, 59, 1, 59, 1, 59, 5, 59, 948, 8, 59, 10, 59, 12, 59, 951, 9, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 3, 61, 960, 8, 61, 1, 61, 1, 61, 3, 61, 964, 8, 61, 1, 61, 1, 61, 1, 61, 3, 61, 969, 8, 61, 1, 61, 3, 61, 972, 8, 61, 1, 62, 1, 62, 3, 62, 976, 8, 62, 1, 62, 1, 62, 1, 62, 3, 62, 981, 8, 62, 1, 62, 1, 62, 4, 62, 985, 8, 62, 11, 62, 12, 62, 986, 1, 63, 1, 63, 1, 63, 3, 63, 992, 8, 63, 1, 64, 4, 64, 995, 8, 64, 11, 64, 12, 64, 996, 1, 65, 4, 65, 1000, 8, 65, 11, 65, 12, 65, 1001, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1011, 8, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1020, 8, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 4, 70, 1029, 8, 70, 11, 70, 12, 70, 1030, 1, 71, 1, 71, 5, 71, 1035, 8, 71, 10, 71, 12, 71, 1038, 9, 71, 1, 71, 3, 71, 1041, 8, 71, 1, 72, 1, 72, 5, 72, 1045, 8, 72, 10, 72, 12, 72, 1048, 9, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 1075, 8, 78, 1, 79, 1, 79, 3, 79, 1079, 8, 79, 1, 79, 1, 79, 1, 79, 3, 79, 1084, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 3, 80, 1090, 8, 80, 1, 80, 1, 80, 1, 81, 3, 81, 1095, 8, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 3, 81, 1102, 8, 81, 1, 82, 1, 82, 3, 82, 1106, 8, 82, 1, 82, 1, 82, 1, 83, 4, 83, 1111, 8, 83, 11, 83, 12, 83, 1112, 1, 84, 3, 84, 1116, 8, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 3, 84, 1123, 8, 84, 1, 85, 4, 85, 1126, 8, 85, 11, 85, 12, 85, 1127, 1, 86, 1, 86, 3, 86, 1132, 8, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, 1141, 8, 87, 1, 87, 3, 87, 1144, 8, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, 1151, 8, 87, 1, 88, 4, 88, 1154, 8, 88, 11, 88, 12, 88, 1155, 1, 88, 1, 88, 1, 89, 1, 89, 3, 89, 1162, 8, 89, 1, 89, 3, 89, 1165, 8, 89, 1, 89, 1, 89, 0, 0, 90, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 0, 129, 0, 131, 0, 133, 0, 135, 0, 137, 0, 139, 0, 141, 0, 143, 0, 145, 0, 147, 0, 149, 0, 151, 0, 153, 0, 155, 0, 157, 0, 159, 0, 161, 0, 163, 0, 165, 0, 167, 0, 169, 0, 171, 0, 173, 0, 175, 0, 177, 64, 179, 65, 1, 0, 16, 3, 0, 76, 76, 85, 85, 117, 117, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 3, 0, 65, 90, 95, 95, 97, 122, 1, 0, 48, 57, 2, 0, 66, 66, 98, 98, 1, 0, 48, 49, 2, 0, 88, 88, 120, 120, 1, 0, 49, 57, 1, 0, 48, 55, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 2, 0, 80, 80, 112, 112, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 97, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 2, 0, 9, 9, 32, 32, 1227, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 1, 181, 1, 0, 0, 0, 3, 183, 1, 0, 0, 0, 5, 185, 1, 0, 0, 0, 7, 187, 1, 0, 0, 0, 9, 189, 1, 0, 0, 0, 11, 191, 1, 0, 0, 0, 13, 193, 1, 0, 0, 0, 15, 195, 1, 0, 0, 0, 17, 197, 1, 0, 0, 0, 19, 200, 1, 0, 0, 0, 21, 202, 1, 0, 0, 0, 23, 205, 1, 0, 0, 0, 25, 208, 1, 0, 0, 0, 27, 219, 1, 0, 0, 0, 29, 233, 1, 0, 0, 0, 31, 255, 1, 0, 0, 0, 33, 281, 1, 0, 0, 0, 35, 309, 1, 0, 0, 0, 37, 327, 1, 0, 0, 0, 39, 335, 1, 0, 0, 0, 41, 377, 1, 0, 0, 0, 43, 379, 1, 0, 0, 0, 45, 381, 1, 0, 0, 0, 47, 383, 1, 0, 0, 0, 49, 385, 1, 0, 0, 0, 51, 387, 1, 0, 0, 0, 53, 389, 1, 0, 0, 0, 55, 391, 1, 0, 0, 0, 57, 394, 1, 0, 0, 0, 59, 397, 1, 0, 0, 0, 61, 400, 1, 0, 0, 0, 63, 402, 1, 0, 0, 0, 65, 404, 1, 0, 0, 0, 67, 414, 1, 0, 0, 0, 69, 422, 1, 0, 0, 0, 71, 438, 1, 0, 0, 0, 73, 462, 1, 0, 0, 0, 75, 464, 1, 0, 0, 0, 77, 473, 1, 0, 0, 0, 79, 479, 1, 0, 0, 0, 81, 481, 1, 0, 0, 0, 83, 517, 1, 0, 0, 0, 85, 553, 1, 0, 0, 0, 87, 589, 1, 0, 0, 0, 89, 619, 1, 0, 0, 0, 91, 657, 1, 0, 0, 0, 93, 695, 1, 0, 0, 0, 95, 721, 1, 0, 0, 0, 97, 741, 1, 0, 0, 0, 99, 763, 1, 0, 0, 0, 101, 787, 1, 0, 0, 0, 103, 809, 1, 0, 0, 0, 105, 833, 1, 0, 0, 0, 107, 861, 1, 0, 0, 0, 109, 881, 1, 0, 0, 0, 111, 903, 1, 0, 0, 0, 113, 932, 1, 0, 0, 0, 115, 938, 1, 0, 0, 0, 117, 942, 1, 0, 0, 0, 119, 944, 1, 0, 0, 0, 121, 952, 1, 0, 0, 0, 123, 959, 1, 0, 0, 0, 125, 975, 1, 0, 0, 0, 127, 991, 1, 0, 0, 0, 129, 994, 1, 0, 0, 0, 131, 999, 1, 0, 0, 0, 133, 1010, 1, 0, 0, 0, 135, 1019, 1, 0, 0, 0, 137, 1021, 1, 0, 0, 0, 139, 1023, 1, 0, 0, 0, 141, 1025, 1, 0, 0, 0, 143, 1040, 1, 0, 0, 0, 145, 1042, 1, 0, 0, 0, 147, 1049, 1, 0, 0, 0, 149, 1053, 1, 0, 0, 0, 151, 1055, 1, 0, 0, 0, 153, 1057, 1, 0, 0, 0, 155, 1059, 1, 0, 0, 0, 157, 1074, 1, 0, 0, 0, 159, 1083, 1, 0, 0, 0, 161, 1085, 1, 0, 0, 0, 163, 1101, 1, 0, 0, 0, 165, 1103, 1, 0, 0, 0, 167, 1110, 1, 0, 0, 0, 169, 1122, 1, 0, 0, 0, 171, 1125, 1, 0, 0, 0, 173, 1129, 1, 0, 0, 0, 175, 1150, 1, 0, 0, 0, 177, 1153, 1, 0, 0, 0, 179, 1164, 1, 0, 0, 0, 181, 182, 5, 40, 0, 0, 182, 2, 1, 0, 0, 0, 183, 184, 5, 41, 0, 0, 184, 4, 1, 0, 0, 0, 185, 186, 5, 91, 0, 0, 186, 6, 1, 0, 0, 0, 187, 188, 5, 44, 0, 0, 188, 8, 1, 0, 0, 0, 189, 190, 5, 93, 0, 0, 190, 10, 1, 0, 0, 0, 191, 192, 5, 123, 0, 0, 192, 12, 1, 0, 0, 0, 193, 194, 5, 125, 0, 0, 194, 14, 1, 0, 0, 0, 195, 196, 5, 60, 0, 0, 196, 16, 1, 0, 0, 0, 197, 198, 5, 60, 0, 0, 198, 199, 5, 61, 0, 0, 199, 18, 1, 0, 0, 0, 200, 201, 5, 62, 0, 0, 201, 20, 1, 0, 0, 0, 202, 203, 5, 62, 0, 0, 203, 204, 5, 61, 0, 0, 204, 22, 1, 0, 0, 0, 205, 206, 5, 61, 0, 0, 206, 207, 5, 61, 0, 0, 207, 24, 1, 0, 0, 0, 208, 209, 5, 33, 0, 0, 209, 210, 5, 61, 0, 0, 210, 26, 1, 0, 0, 0, 211, 212, 5, 108, 0, 0, 212, 213, 5, 105, 0, 0, 213, 214, 5, 107, 0, 0, 214, 220, 5, 101, 0, 0, 215, 216, 5, 76, 0, 0, 216, 217, 5, 73, 0, 0, 217, 218, 5, 75, 0, 0, 218, 220, 5, 69, 0, 0, 219, 211, 1, 0, 0, 0, 219, 215, 1, 0, 0, 0, 220, 28, 1, 0, 0, 0, 221, 222, 5, 101, 0, 0, 222, 223, 5, 120, 0, 0, 223, 224, 5, 105, 0, 0, 224, 225, 5, 115, 0, 0, 225, 226, 5, 116, 0, 0, 226, 234, 5, 115, 0, 0, 227, 228, 5, 69, 0, 0, 228, 229, 5, 88, 0, 0, 229, 230, 5, 73, 0, 0, 230, 231, 5, 83, 0, 0, 231, 232, 5, 84, 0, 0, 232, 234, 5, 83, 0, 0, 233, 221, 1, 0, 0, 0, 233, 227, 1, 0, 0, 0, 234, 30, 1, 0, 0, 0, 235, 236, 5, 116, 0, 0, 236, 237, 5, 101, 0, 0, 237, 238, 5, 120, 0, 0, 238, 239, 5, 116, 0, 0, 239, 240, 5, 95, 0, 0, 240, 241, 5, 109, 0, 0, 241, 242, 5, 97, 0, 0, 242, 243, 5, 116, 0, 0, 243, 244, 5, 99, 0, 0, 244, 256, 5, 104, 0, 0, 245, 246, 5, 84, 0, 0, 246, 247, 5, 69, 0, 0, 247, 248, 5, 88, 0, 0, 248, 249, 5, 84, 0, 0, 249, 250, 5, 95, 0, 0, 250, 251, 5, 77, 0, 0, 251, 252, 5, 65, 0, 0, 252, 253, 5, 84, 0, 0, 253, 254, 5, 67, 0, 0, 254, 256, 5, 72, 0, 0, 255, 235, 1, 0, 0, 0, 255, 245, 1, 0, 0, 0, 256, 32, 1, 0, 0, 0, 257, 258, 5, 112, 0, 0, 258, 259, 5, 104, 0, 0, 259, 260, 5, 114, 0, 0, 260, 261, 5, 97, 0, 0, 261, 262, 5, 115, 0, 0, 262, 263, 5, 101, 0, 0, 263, 264, 5, 95, 0, 0, 264, 265, 5, 109, 0, 0, 265, 266, 5, 97, 0, 0, 266, 267, 5, 116, 0, 0, 267, 268, 5, 99, 0, 0, 268, 282, 5, 104, 0, 0, 269, 270, 5, 80, 0, 0, 270, 271, 5, 72, 0, 0, 271, 272, 5, 82, 0, 0, 272, 273, 5, 65, 0, 0, 273, 274, 5, 83, 0, 0, 274, 275, 5, 69, 0, 0, 275, 276, 5, 95, 0, 0, 276, 277, 5, 77, 0, 0, 277, 278, 5, 65, 0, 0, 278, 279, 5, 84, 0, 0, 279, 280, 5, 67, 0, 0, 280, 282, 5, 72, 0, 0, 281, 257, 1, 0, 0, 0, 281, 269, 1, 0, 0, 0, 282, 34, 1, 0, 0, 0, 283, 284, 5, 114, 0, 0, 284, 285, 5, 97, 0, 0, 285, 286, 5, 110, 0, 0, 286, 287, 5, 100, 0, 0, 287, 288, 5, 111, 0, 0, 288, 289, 5, 109, 0, 0, 289, 290, 5, 95, 0, 0, 290, 291, 5, 115, 0, 0, 291, 292, 5, 97, 0, 0, 292, 293, 5, 109, 0, 0, 293, 294, 5, 112, 0, 0, 294, 295, 5, 108, 0, 0, 295, 310, 5, 101, 0, 0, 296, 297, 5, 82, 0, 0, 297, 298, 5, 65, 0, 0, 298, 299, 5, 78, 0, 0, 299, 300, 5, 68, 0, 0, 300, 301, 5, 79, 0, 0, 301, 302, 5, 77, 0, 0, 302, 303, 5, 95, 0, 0, 303, 304, 5, 83, 0, 0, 304, 305, 5, 65, 0, 0, 305, 306, 5, 77, 0, 0, 306, 307, 5, 80, 0, 0, 307, 308, 5, 76, 0, 0, 308, 310, 5, 69, 0, 0, 309, 283, 1, 0, 0, 0, 309, 296, 1, 0, 0, 0, 310, 36, 1, 0, 0, 0, 311, 312, 5, 105, 0, 0, 312, 313, 5, 110, 0, 0, 313, 314, 5, 116, 0, 0, 314, 315, 5, 101, 0, 0, 315, 316, 5, 114, 0, 0, 316, 317, 5, 118, 0, 0, 317, 318, 5, 97, 0, 0, 318, 328, 5, 108, 0, 0, 319, 320, 5, 73, 0, 0, 320, 321, 5, 78, 0, 0, 321, 322, 5, 84, 0, 0, 322, 323, 5, 69, 0, 0, 323, 324, 5, 82, 0, 0, 324, 325, 5, 86, 0, 0, 325, 326, 5, 65, 0, 0, 326, 328, 5, 76, 0, 0, 327, 311, 1, 0, 0, 0, 327, 319, 1, 0, 0, 0, 328, 38, 1, 0, 0, 0, 329, 330, 5, 105, 0, 0, 330, 331, 5, 115, 0, 0, 331, 336, 5, 111, 0, 0, 332, 333, 5, 73, 0, 0, 333, 334, 5, 83, 0, 0, 334, 336, 5, 79, 0, 0, 335, 329, 1, 0, 0, 0, 335, 332, 1, 0, 0, 0, 336, 40, 1, 0, 0, 0, 337, 338, 5, 109, 0, 0, 338, 339, 5, 105, 0, 0, 339, 340, 5, 110, 0, 0, 340, 341, 5, 105, 0, 0, 341, 342, 5, 109, 0, 0, 342, 343, 5, 117, 0, 0, 343, 344, 5, 109, 0, 0, 344, 345, 5, 95, 0, 0, 345, 346, 5, 115, 0, 0, 346, 347, 5, 104, 0, 0, 347, 348, 5, 111, 0, 0, 348, 349, 5, 117, 0, 0, 349, 350, 5, 108, 0, 0, 350, 351, 5, 100, 0, 0, 351, 352, 5, 95, 0, 0, 352, 353, 5, 109, 0, 0, 353, 354, 5, 97, 0, 0, 354, 355, 5, 116, 0, 0, 355, 356, 5, 99, 0, 0, 356, 378, 5, 104, 0, 0, 357, 358, 5, 77, 0, 0, 358, 359, 5, 73, 0, 0, 359, 360, 5, 78, 0, 0, 360, 361, 5, 73, 0, 0, 361, 362, 5, 77, 0, 0, 362, 363, 5, 85, 0, 0, 363, 364, 5, 77, 0, 0, 364, 365, 5, 95, 0, 0, 365, 366, 5, 83, 0, 0, 366, 367, 5, 72, 0, 0, 367, 368, 5, 79, 0, 0, 368, 369, 5, 85, 0, 0, 369, 370, 5, 76, 0, 0, 370, 371, 5, 68, 0, 0, 371, 372, 5, 95, 0, 0, 372, 373, 5, 77, 0, 0, 373, 374, 5, 65, 0, 0, 374, 375, 5, 84, 0, 0, 375, 376, 5, 67, 0, 0, 376, 378, 5, 72, 0, 0, 377, 337, 1, 0, 0, 0, 377, 357, 1, 0, 0, 0, 378, 42, 1, 0, 0, 0, 379, 380, 5, 61, 0, 0, 380, 44, 1, 0, 0, 0, 381, 382, 5, 43, 0, 0, 382, 46, 1, 0, 0, 0, 383, 384, 5, 45, 0, 0, 384, 48, 1, 0, 0, 0, 385, 386, 5, 42, 0, 0, 386, 50, 1, 0, 0, 0, 387, 388, 5, 47, 0, 0, 388, 52, 1, 0, 0, 0, 389, 390, 5, 37, 0, 0, 390, 54, 1, 0, 0, 0, 391, 392, 5, 42, 0, 0, 392, 393, 5, 42, 0, 0, 393, 56, 1, 0, 0, 0, 394, 395, 5, 60, 0, 0, 395, 396, 5, 60, 0, 0, 396, 58, 1, 0, 0, 0, 397, 398, 5, 62, 0, 0, 398, 399, 5, 62, 0, 0, 399, 60, 1, 0, 0, 0, 400, 401, 5, 38, 0, 0, 401, 62, 1, 0, 0, 0, 402, 403, 5, 124, 0, 0, 403, 64, 1, 0, 0, 0, 404, 405, 5, 94, 0, 0, 405, 66, 1, 0, 0, 0, 406, 407, 5, 38, 0, 0, 407, 415, 5, 38, 0, 0, 408, 409, 5, 97, 0, 0, 409, 410, 5, 110, 0, 0, 410, 415, 5, 100, 0, 0, 411, 412, 5, 65, 0, 0, 412, 413, 5, 78, 0, 0, 413, 415, 5, 68, 0, 0, 414, 406, 1, 0, 0, 0, 414, 408, 1, 0, 0, 0, 414, 411, 1, 0, 0, 0, 415, 68, 1, 0, 0, 0, 416, 417, 5, 124, 0, 0, 417, 423, 5, 124, 0, 0, 418, 419, 5, 111, 0, 0, 419, 423, 5, 114, 0, 0, 420, 421, 5, 79, 0, 0, 421, 423, 5, 82, 0, 0, 422, 416, 1, 0, 0, 0, 422, 418, 1, 0, 0, 0, 422, 420, 1, 0, 0, 0, 423, 70, 1, 0, 0, 0, 424, 425, 5, 105, 0, 0, 425, 426, 5, 115, 0, 0, 426, 427, 5, 32, 0, 0, 427, 428, 5, 110, 0, 0, 428, 429, 5, 117, 0, 0, 429, 430, 5, 108, 0, 0, 430, 439, 5, 108, 0, 0, 431, 432, 5, 73, 0, 0, 432, 433, 5, 83, 0, 0, 433, 434, 5, 32, 0, 0, 434, 435, 5, 78, 0, 0, 435, 436, 5, 85, 0, 0, 436, 437, 5, 76, 0, 0, 437, 439, 5, 76, 0, 0, 438, 424, 1, 0, 0, 0, 438, 431, 1, 0, 0, 0, 439, 72, 1, 0, 0, 0, 440, 441, 5, 105, 0, 0, 441, 442, 5, 115, 0, 0, 442, 443, 5, 32, 0, 0, 443, 444, 5, 110, 0, 0, 444, 445, 5, 111, 0, 0, 445, 446, 5, 116, 0, 0, 446, 447, 5, 32, 0, 0, 447, 448, 5, 110, 0, 0, 448, 449, 5, 117, 0, 0, 449, 450, 5, 108, 0, 0, 450, 463, 5, 108, 0, 0, 451, 452, 5, 73, 0, 0, 452, 453, 5, 83, 0, 0, 453, 454, 5, 32, 0, 0, 454, 455, 5, 78, 0, 0, 455, 456, 5, 79, 0, 0, 456, 457, 5, 84, 0, 0, 457, 458, 5, 32, 0, 0, 458, 459, 5, 78, 0, 0, 459, 460, 5, 85, 0, 0, 460, 461, 5, 76, 0, 0, 461, 463, 5, 76, 0, 0, 462, 440, 1, 0, 0, 0, 462, 451, 1, 0, 0, 0, 463, 74, 1, 0, 0, 0, 464, 465, 5, 126, 0, 0, 465, 76, 1, 0, 0, 0, 466, 474, 5, 33, 0, 0, 467, 468, 5, 110, 0, 0, 468, 469, 5, 111, 0, 0, 469, 474, 5, 116, 0, 0, 470, 471, 5, 78, 0, 0, 471, 472, 5, 79, 0, 0, 472, 474, 5, 84, 0, 0, 473, 466, 1, 0, 0, 0, 473, 467, 1, 0, 0, 0, 473, 470, 1, 0, 0, 0, 474, 78, 1, 0, 0, 0, 475, 476, 5, 105, 0, 0, 476, 480, 5, 110, 0, 0, 477, 478, 5, 73, 0, 0, 478, 480, 5, 78, 0, 0, 479, 475, 1, 0, 0, 0, 479, 477, 1, 0, 0, 0, 480, 80, 1, 0, 0, 0, 481, 486, 5, 91, 0, 0, 482, 485, 3, 177, 88, 0, 483, 485, 3, 179, 89, 0, 484, 482, 1, 0, 0, 0, 484, 483, 1, 0, 0, 0, 485, 488, 1, 0, 0, 0, 486, 484, 1, 0, 0, 0, 486, 487, 1, 0, 0, 0, 487, 489, 1, 0, 0, 0, 488, 486, 1, 0, 0, 0, 489, 490, 5, 93, 0, 0, 490, 82, 1, 0, 0, 0, 491, 492, 5, 106, 0, 0, 492, 493, 5, 115, 0, 0, 493, 494, 5, 111, 0, 0, 494, 495, 5, 110, 0, 0, 495, 496, 5, 95, 0, 0, 496, 497, 5, 99, 0, 0, 497, 498, 5, 111, 0, 0, 498, 499, 5, 110, 0, 0, 499, 500, 5, 116, 0, 0, 500, 501, 5, 97, 0, 0, 501, 502, 5, 105, 0, 0, 502, 503, 5, 110, 0, 0, 503, 518, 5, 115, 0, 0, 504, 505, 5, 74, 0, 0, 505, 506, 5, 83, 0, 0, 506, 507, 5, 79, 0, 0, 507, 508, 5, 78, 0, 0, 508, 509, 5, 95, 0, 0, 509, 510, 5, 67, 0, 0, 510, 511, 5, 79, 0, 0, 511, 512, 5, 78, 0, 0, 512, 513, 5, 84, 0, 0, 513, 514, 5, 65, 0, 0, 514, 515, 5, 73, 0, 0, 515, 516, 5, 78, 0, 0, 516, 518, 5, 83, 0, 0, 517, 491, 1, 0, 0, 0, 517, 504, 1, 0, 0, 0, 518, 84, 1, 0, 0, 0, 519, 520, 5, 106, 0, 0, 520, 521, 5, 115, 0, 0, 521, 522, 5, 111, 0, 0, 522, 523, 5, 110, 0, 0, 523, 524, 5, 95, 0, 0, 524, 525, 5, 99, 0, 0, 525, 526, 5, 111, 0, 0, 526, 527, 5, 110, 0, 0, 527, 528, 5, 116, 0, 0, 528, 529, 5, 97, 0, 0, 529, 530, 5, 105, 0, 0, 530, 531, 5, 110, 0, 0, 531, 532, 5, 115, 0, 0, 532, 533, 5, 95, 0, 0, 533, 534, 5, 97, 0, 0, 534, 535, 5, 108, 0, 0, 535, 554, 5, 108, 0, 0, 536, 537, 5, 74, 0, 0, 537, 538, 5, 83, 0, 0, 538, 539, 5, 79, 0, 0, 539, 540, 5, 78, 0, 0, 540, 541, 5, 95, 0, 0, 541, 542, 5, 67, 0, 0, 542, 543, 5, 79, 0, 0, 543, 544, 5, 78, 0, 0, 544, 545, 5, 84, 0, 0, 545, 546, 5, 65, 0, 0, 546, 547, 5, 73, 0, 0, 547, 548, 5, 78, 0, 0, 548, 549, 5, 83, 0, 0, 549, 550, 5, 95, 0, 0, 550, 551, 5, 65, 0, 0, 551, 552, 5, 76, 0, 0, 552, 554, 5, 76, 0, 0, 553, 519, 1, 0, 0, 0, 553, 536, 1, 0, 0, 0, 554, 86, 1, 0, 0, 0, 555, 556, 5, 106, 0, 0, 556, 557, 5, 115, 0, 0, 557, 558, 5, 111, 0, 0, 558, 559, 5, 110, 0, 0, 559, 560, 5, 95, 0, 0, 560, 561, 5, 99, 0, 0, 561, 562, 5, 111, 0, 0, 562, 563, 5, 110, 0, 0, 563, 564, 5, 116, 0, 0, 564, 565, 5, 97, 0, 0, 565, 566, 5, 105, 0, 0, 566, 567, 5, 110, 0, 0, 567, 568, 5, 115, 0, 0, 568, 569, 5, 95, 0, 0, 569, 570, 5, 97, 0, 0, 570, 571, 5, 110, 0, 0, 571, 590, 5, 121, 0, 0, 572, 573, 5, 74, 0, 0, 573, 574, 5, 83, 0, 0, 574, 575, 5, 79, 0, 0, 575, 576, 5, 78, 0, 0, 576, 577, 5, 95, 0, 0, 577, 578, 5, 67, 0, 0, 578, 579, 5, 79, 0, 0, 579, 580, 5, 78, 0, 0, 580, 581, 5, 84, 0, 0, 581, 582, 5, 65, 0, 0, 582, 583, 5, 73, 0, 0, 583, 584, 5, 78, 0, 0, 584, 585, 5, 83, 0, 0, 585, 586, 5, 95, 0, 0, 586, 587, 5, 65, 0, 0, 587, 588, 5, 78, 0, 0, 588, 590, 5, 89, 0, 0, 589, 555, 1, 0, 0, 0, 589, 572, 1, 0, 0, 0, 590, 88, 1, 0, 0, 0, 591, 592, 5, 97, 0, 0, 592, 593, 5, 114, 0, 0, 593, 594, 5, 114, 0, 0, 594, 595, 5, 97, 0, 0, 595, 596, 5, 121, 0, 0, 596, 597, 5, 95, 0, 0, 597, 598, 5, 99, 0, 0, 598, 599, 5, 111, 0, 0, 599, 600, 5, 110, 0, 0, 600, 601, 5, 116, 0, 0, 601, 602, 5, 97, 0, 0, 602, 603, 5, 105, 0, 0, 603, 604, 5, 110, 0, 0, 604, 620, 5, 115, 0, 0, 605, 606, 5, 65, 0, 0, 606, 607, 5, 82, 0, 0, 607, 608, 5, 82, 0, 0, 608, 609, 5, 65, 0, 0, 609, 610, 5, 89, 0, 0, 610, 611, 5, 95, 0, 0, 611, 612, 5, 67, 0, 0, 612, 613, 5, 79, 0, 0, 613, 614, 5, 78, 0, 0, 614, 615, 5, 84, 0, 0, 615, 616, 5, 65, 0, 0, 616, 617, 5, 73, 0, 0, 617, 618, 5, 78, 0, 0, 618, 620, 5, 83, 0, 0, 619, 591, 1, 0, 0, 0, 619, 605, 1, 0, 0, 0, 620, 90, 1, 0, 0, 0, 621, 622, 5, 97, 0, 0, 622, 623, 5, 114, 0, 0, 623, 624, 5, 114, 0, 0, 624, 625, 5, 97, 0, 0, 625, 626, 5, 121, 0, 0, 626, 627, 5, 95, 0, 0, 627, 628, 5, 99, 0, 0, 628, 629, 5, 111, 0, 0, 629, 630, 5, 110, 0, 0, 630, 631, 5, 116, 0, 0, 631, 632, 5, 97, 0, 0, 632, 633, 5, 105, 0, 0, 633, 634, 5, 110, 0, 0, 634, 635, 5, 115, 0, 0, 635, 636, 5, 95, 0, 0, 636, 637, 5, 97, 0, 0, 637, 638, 5, 108, 0, 0, 638, 658, 5, 108, 0, 0, 639, 640, 5, 65, 0, 0, 640, 641, 5, 82, 0, 0, 641, 642, 5, 82, 0, 0, 642, 643, 5, 65, 0, 0, 643, 644, 5, 89, 0, 0, 644, 645, 5, 95, 0, 0, 645, 646, 5, 67, 0, 0, 646, 647, 5, 79, 0, 0, 647, 648, 5, 78, 0, 0, 648, 649, 5, 84, 0, 0, 649, 650, 5, 65, 0, 0, 650, 651, 5, 73, 0, 0, 651, 652, 5, 78, 0, 0, 652, 653, 5, 83, 0, 0, 653, 654, 5, 95, 0, 0, 654, 655, 5, 65, 0, 0, 655, 656, 5, 76, 0, 0, 656, 658, 5, 76, 0, 0, 657, 621, 1, 0, 0, 0, 657, 639, 1, 0, 0, 0, 658, 92, 1, 0, 0, 0, 659, 660, 5, 97, 0, 0, 660, 661, 5, 114, 0, 0, 661, 662, 5, 114, 0, 0, 662, 663, 5, 97, 0, 0, 663, 664, 5, 121, 0, 0, 664, 665, 5, 95, 0, 0, 665, 666, 5, 99, 0, 0, 666, 667, 5, 111, 0, 0, 667, 668, 5, 110, 0, 0, 668, 669, 5, 116, 0, 0, 669, 670, 5, 97, 0, 0, 670, 671, 5, 105, 0, 0, 671, 672, 5, 110, 0, 0, 672, 673, 5, 115, 0, 0, 673, 674, 5, 95, 0, 0, 674, 675, 5, 97, 0, 0, 675, 676, 5, 110, 0, 0, 676, 696, 5, 121, 0, 0, 677, 678, 5, 65, 0, 0, 678, 679, 5, 82, 0, 0, 679, 680, 5, 82, 0, 0, 680, 681, 5, 65, 0, 0, 681, 682, 5, 89, 0, 0, 682, 683, 5, 95, 0, 0, 683, 684, 5, 67, 0, 0, 684, 685, 5, 79, 0, 0, 685, 686, 5, 78, 0, 0, 686, 687, 5, 84, 0, 0, 687, 688, 5, 65, 0, 0, 688, 689, 5, 73, 0, 0, 689, 690, 5, 78, 0, 0, 690, 691, 5, 83, 0, 0, 691, 692, 5, 95, 0, 0, 692, 693, 5, 65, 0, 0, 693, 694, 5, 78, 0, 0, 694, 696, 5, 89, 0, 0, 695, 659, 1, 0, 0, 0, 695, 677, 1, 0, 0, 0, 696, 94, 1, 0, 0, 0, 697, 698, 5, 97, 0, 0, 698, 699, 5, 114, 0, 0, 699, 700, 5, 114, 0, 0, 700, 701, 5, 97, 0, 0, 701, 702, 5, 121, 0, 0, 702, 703, 5, 95, 0, 0, 703, 704, 5, 108, 0, 0, 704, 705, 5, 101, 0, 0, 705, 706, 5, 110, 0, 0, 706, 707, 5, 103, 0, 0, 707, 708, 5, 116, 0, 0, 708, 722, 5, 104, 0, 0, 709, 710, 5, 65, 0, 0, 710, 711, 5, 82, 0, 0, 711, 712, 5, 82, 0, 0, 712, 713, 5, 65, 0, 0, 713, 714, 5, 89, 0, 0, 714, 715, 5, 95, 0, 0, 715, 716, 5, 76, 0, 0, 716, 717, 5, 69, 0, 0, 717, 718, 5, 78, 0, 0, 718, 719, 5, 71, 0, 0, 719, 720, 5, 84, 0, 0, 720, 722, 5, 72, 0, 0, 721, 697, 1, 0, 0, 0, 721, 709, 1, 0, 0, 0, 722, 96, 1, 0, 0, 0, 723, 724, 5, 115, 0, 0, 724, 725, 5, 116, 0, 0, 725, 726, 5, 95, 0, 0, 726, 727, 5, 101, 0, 0, 727, 728, 5, 113, 0, 0, 728, 729, 5, 117, 0, 0, 729, 730, 5, 97, 0, 0, 730, 731, 5, 108, 0, 0, 731, 742, 5, 115, 0, 0, 732, 733, 5, 83, 0, 0, 733, 734, 5, 84, 0, 0, 734, 735, 5, 95, 0, 0, 735, 736, 5, 69, 0, 0, 736, 737, 5, 81, 0, 0, 737, 738, 5, 85, 0, 0, 738, 739, 5, 65, 0, 0, 739, 740, 5, 76, 0, 0, 740, 742, 5, 83, 0, 0, 741, 723, 1, 0, 0, 0, 741, 732, 1, 0, 0, 0, 742, 98, 1, 0, 0, 0, 743, 744, 5, 115, 0, 0, 744, 745, 5, 116, 0, 0, 745, 746, 5, 95, 0, 0, 746, 747, 5, 116, 0, 0, 747, 748, 5, 111, 0, 0, 748, 749, 5, 117, 0, 0, 749, 750, 5, 99, 0, 0, 750, 751, 5, 104, 0, 0, 751, 752, 5, 101, 0, 0, 752, 764, 5, 115, 0, 0, 753, 754, 5, 83, 0, 0, 754, 755, 5, 84, 0, 0, 755, 756, 5, 95, 0, 0, 756, 757, 5, 84, 0, 0, 757, 758, 5, 79, 0, 0, 758, 759, 5, 85, 0, 0, 759, 760, 5, 67, 0, 0, 760, 761, 5, 72, 0, 0, 761, 762, 5, 69, 0, 0, 762, 764, 5, 83, 0, 0, 763, 743, 1, 0, 0, 0, 763, 753, 1, 0, 0, 0, 764, 100, 1, 0, 0, 0, 765, 766, 5, 115, 0, 0, 766, 767, 5, 116, 0, 0, 767, 768, 5, 95, 0, 0, 768, 769, 5, 111, 0, 0, 769, 770, 5, 118, 0, 0, 770, 771, 5, 101, 0, 0, 771, 772, 5, 114, 0, 0, 772, 773, 5, 108, 0, 0, 773, 774, 5, 97, 0, 0, 774, 775, 5, 112, 0, 0, 775, 788, 5, 115, 0, 0, 776, 777, 5, 83, 0, 0, 777, 778, 5, 84, 0, 0, 778, 779, 5, 95, 0, 0, 779, 780, 5, 79, 0, 0, 780, 781, 5, 86, 0, 0, 781, 782, 5, 69, 0, 0, 782, 783, 5, 82, 0, 0, 783, 784, 5, 76, 0, 0, 784, 785, 5, 65, 0, 0, 785, 786, 5, 80, 0, 0, 786, 788, 5, 83, 0, 0, 787, 765, 1, 0, 0, 0, 787, 776, 1, 0, 0, 0, 788, 102, 1, 0, 0, 0, 789, 790, 5, 115, 0, 0, 790, 791, 5, 116, 0, 0, 791, 792, 5, 95, 0, 0, 792, 793, 5, 99, 0, 0, 793, 794, 5, 114, 0, 0, 794, 795, 5, 111, 0, 0, 795, 796, 5, 115, 0, 0, 796, 797, 5, 115, 0, 0, 797, 798, 5, 101, 0, 0, 798, 810, 5, 115, 0, 0, 799, 800, 5, 83, 0, 0, 800, 801, 5, 84, 0, 0, 801, 802, 5, 95, 0, 0, 802, 803, 5, 67, 0, 0, 803, 804, 5, 82, 0, 0, 804, 805, 5, 79, 0, 0, 805, 806, 5, 83, 0, 0, 806, 807, 5, 83, 0, 0, 807, 808, 5, 69, 0, 0, 808, 810, 5, 83, 0, 0, 809, 789, 1, 0, 0, 0, 809, 799, 1, 0, 0, 0, 810, 104, 1, 0, 0, 0, 811, 812, 5, 115, 0, 0, 812, 813, 5, 116, 0, 0, 813, 814, 5, 95, 0, 0, 814, 815, 5, 99, 0, 0, 815, 816, 5, 111, 0, 0, 816, 817, 5, 110, 0, 0, 817, 818, 5, 116, 0, 0, 818, 819, 5, 97, 0, 0, 819, 820, 5, 105, 0, 0, 820, 821, 5, 110, 0, 0, 821, 834, 5, 115, 0, 0, 822, 823, 5, 83, 0, 0, 823, 824, 5, 84, 0, 0, 824, 825, 5, 95, 0, 0, 825, 826, 5, 67, 0, 0, 826, 827, 5, 79, 0, 0, 827, 828, 5, 78, 0, 0, 828, 829, 5, 84, 0, 0, 829, 830, 5, 65, 0, 0, 830, 831, 5, 73, 0, 0, 831, 832, 5, 78, 0, 0, 832, 834, 5, 83, 0, 0, 833, 811, 1, 0, 0, 0, 833, 822, 1, 0, 0, 0, 834, 106, 1, 0, 0, 0, 835, 836, 5, 115, 0, 0, 836, 837, 5, 116, 0, 0, 837, 838, 5, 95, 0, 0, 838, 839, 5, 105, 0, 0, 839, 840, 5, 110, 0, 0, 840, 841, 5, 116, 0, 0, 841, 842, 5, 101, 0, 0, 842, 843, 5, 114, 0, 0, 843, 844, 5, 115, 0, 0, 844, 845, 5, 101, 0, 0, 845, 846, 5, 99, 0, 0, 846, 847, 5, 116, 0, 0, 847, 862, 5, 115, 0, 0, 848, 849, 5, 83, 0, 0, 849, 850, 5, 84, 0, 0, 850, 851, 5, 95, 0, 0, 851, 852, 5, 73, 0, 0, 852, 853, 5, 78, 0, 0, 853, 854, 5, 84, 0, 0, 854, 855, 5, 69, 0, 0, 855, 856, 5, 82, 0, 0, 856, 857, 5, 83, 0, 0, 857, 858, 5, 69, 0, 0, 858, 859, 5, 67, 0, 0, 859, 860, 5, 84, 0, 0, 860, 862, 5, 83, 0, 0, 861, 835, 1, 0, 0, 0, 861, 848, 1, 0, 0, 0, 862, 108, 1, 0, 0, 0, 863, 864, 5, 115, 0, 0, 864, 865, 5, 116, 0, 0, 865, 866, 5, 95, 0, 0, 866, 867, 5, 119, 0, 0, 867, 868, 5, 105, 0, 0, 868, 869, 5, 116, 0, 0, 869, 870, 5, 104, 0, 0, 870, 871, 5, 105, 0, 0, 871, 882, 5, 110, 0, 0, 872, 873, 5, 83, 0, 0, 873, 874, 5, 84, 0, 0, 874, 875, 5, 95, 0, 0, 875, 876, 5, 87, 0, 0, 876, 877, 5, 73, 0, 0, 877, 878, 5, 84, 0, 0, 878, 879, 5, 72, 0, 0, 879, 880, 5, 73, 0, 0, 880, 882, 5, 78, 0, 0, 881, 863, 1, 0, 0, 0, 881, 872, 1, 0, 0, 0, 882, 110, 1, 0, 0, 0, 883, 884, 5, 115, 0, 0, 884, 885, 5, 116, 0, 0, 885, 886, 5, 95, 0, 0, 886, 887, 5, 100, 0, 0, 887, 888, 5, 119, 0, 0, 888, 889, 5, 105, 0, 0, 889, 890, 5, 116, 0, 0, 890, 891, 5, 104, 0, 0, 891, 892, 5, 105, 0, 0, 892, 904, 5, 110, 0, 0, 893, 894, 5, 83, 0, 0, 894, 895, 5, 84, 0, 0, 895, 896, 5, 95, 0, 0, 896, 897, 5, 68, 0, 0, 897, 898, 5, 87, 0, 0, 898, 899, 5, 73, 0, 0, 899, 900, 5, 84, 0, 0, 900, 901, 5, 72, 0, 0, 901, 902, 5, 73, 0, 0, 902, 904, 5, 78, 0, 0, 903, 883, 1, 0, 0, 0, 903, 893, 1, 0, 0, 0, 904, 112, 1, 0, 0, 0, 905, 906, 5, 116, 0, 0, 906, 907, 5, 114, 0, 0, 907, 908, 5, 117, 0, 0, 908, 933, 5, 101, 0, 0, 909, 910, 5, 84, 0, 0, 910, 911, 5, 114, 0, 0, 911, 912, 5, 117, 0, 0, 912, 933, 5, 101, 0, 0, 913, 914, 5, 84, 0, 0, 914, 915, 5, 82, 0, 0, 915, 916, 5, 85, 0, 0, 916, 933, 5, 69, 0, 0, 917, 918, 5, 102, 0, 0, 918, 919, 5, 97, 0, 0, 919, 920, 5, 108, 0, 0, 920, 921, 5, 115, 0, 0, 921, 933, 5, 101, 0, 0, 922, 923, 5, 70, 0, 0, 923, 924, 5, 97, 0, 0, 924, 925, 5, 108, 0, 0, 925, 926, 5, 115, 0, 0, 926, 933, 5, 101, 0, 0, 927, 928, 5, 70, 0, 0, 928, 929, 5, 65, 0, 0, 929, 930, 5, 76, 0, 0, 930, 931, 5, 83, 0, 0, 931, 933, 5, 69, 0, 0, 932, 905, 1, 0, 0, 0, 932, 909, 1, 0, 0, 0, 932, 913, 1, 0, 0, 0, 932, 917, 1, 0, 0, 0, 932, 922, 1, 0, 0, 0, 932, 927, 1, 0, 0, 0, 933, 114, 1, 0, 0, 0, 934, 939, 3, 143, 71, 0, 935, 939, 3, 145, 72, 0, 936, 939, 3, 147, 73, 0, 937, 939, 3, 141, 70, 0, 938, 934, 1, 0, 0, 0, 938, 935, 1, 0, 0, 0, 938, 936, 1, 0, 0, 0, 938, 937, 1, 0, 0, 0, 939, 116, 1, 0, 0, 0, 940, 943, 3, 159, 79, 0, 941, 943, 3, 161, 80, 0, 942, 940, 1, 0, 0, 0, 942, 941, 1, 0, 0, 0, 943, 118, 1, 0, 0, 0, 944, 949, 3, 137, 68, 0, 945, 948, 3, 137, 68, 0, 946, 948, 3, 139, 69, 0, 947, 945, 1, 0, 0, 0, 947, 946, 1, 0, 0, 0, 948, 951, 1, 0, 0, 0, 949, 947, 1, 0, 0, 0, 949, 950, 1, 0, 0, 0, 950, 120, 1, 0, 0, 0, 951, 949, 1, 0, 0, 0, 952, 953, 5, 36, 0, 0, 953, 954, 5, 109, 0, 0, 954, 955, 5, 101, 0, 0, 955, 956, 5, 116, 0, 0, 956, 957, 5, 97, 0, 0, 957, 122, 1, 0, 0, 0, 958, 960, 3, 127, 63, 0, 959, 958, 1, 0, 0, 0, 959, 960, 1, 0, 0, 0, 960, 971, 1, 0, 0, 0, 961, 963, 5, 34, 0, 0, 962, 964, 3, 129, 64, 0, 963, 962, 1, 0, 0, 0, 963, 964, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 972, 5, 34, 0, 0, 966, 968, 5, 39, 0, 0, 967, 969, 3, 131, 65, 0, 968, 967, 1, 0, 0, 0, 968, 969, 1, 0, 0, 0, 969, 970, 1, 0, 0, 0, 970, 972, 5, 39, 0, 0, 971, 961, 1, 0, 0, 0, 971, 966, 1, 0, 0, 0, 972, 124, 1, 0, 0, 0, 973, 976, 3, 119, 59, 0, 974, 976, 3, 121, 60, 0, 975, 973, 1, 0, 0, 0, 975, 974, 1, 0, 0, 0, 976, 984, 1, 0, 0, 0, 977, 980, 5, 91, 0, 0, 978, 981, 3, 123, 61, 0, 979, 981, 3, 143, 71, 0, 980, 978, 1, 0, 0, 0, 980, 979, 1, 0, 0, 0, 981, 982, 1, 0, 0, 0, 982, 983, 5, 93, 0, 0, 983, 985, 1, 0, 0, 0, 984, 977, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 984, 1, 0, 0, 0, 986, 987, 1, 0, 0, 0, 987, 126, 1, 0, 0, 0, 988, 989, 5, 117, 0, 0, 989, 992, 5, 56, 0, 0, 990, 992, 7, 0, 0, 0, 991, 988, 1, 0, 0, 0, 991, 990, 1, 0, 0, 0, 992, 128, 1, 0, 0, 0, 993, 995, 3, 133, 66, 0, 994, 993, 1, 0, 0, 0, 995, 996, 1, 0, 0, 0, 996, 994, 1, 0, 0, 0, 996, 997, 1, 0, 0, 0, 997, 130, 1, 0, 0, 0, 998, 1000, 3, 135, 67, 0, 999, 998, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 999, 1, 0, 0, 0, 1001, 1002, 1, 0, 0, 0, 1002, 132, 1, 0, 0, 0, 1003, 1011, 8, 1, 0, 0, 1004, 1011, 3, 175, 87, 0, 1005, 1006, 5, 92, 0, 0, 1006, 1011, 5, 10, 0, 0, 1007, 1008, 5, 92, 0, 0, 1008, 1009, 5, 13, 0, 0, 1009, 1011, 5, 10, 0, 0, 1010, 1003, 1, 0, 0, 0, 1010, 1004, 1, 0, 0, 0, 1010, 1005, 1, 0, 0, 0, 1010, 1007, 1, 0, 0, 0, 1011, 134, 1, 0, 0, 0, 1012, 1020, 8, 2, 0, 0, 1013, 1020, 3, 175, 87, 0, 1014, 1015, 5, 92, 0, 0, 1015, 1020, 5, 10, 0, 0, 1016, 1017, 5, 92, 0, 0, 1017, 1018, 5, 13, 0, 0, 1018, 1020, 5, 10, 0, 0, 1019, 1012, 1, 0, 0, 0, 1019, 1013, 1, 0, 0, 0, 1019, 1014, 1, 0, 0, 0, 1019, 1016, 1, 0, 0, 0, 1020, 136, 1, 0, 0, 0, 1021, 1022, 7, 3, 0, 0, 1022, 138, 1, 0, 0, 0, 1023, 1024, 7, 4, 0, 0, 1024, 140, 1, 0, 0, 0, 1025, 1026, 5, 48, 0, 0, 1026, 1028, 7, 5, 0, 0, 1027, 1029, 7, 6, 0, 0, 1028, 1027, 1, 0, 0, 0, 1029, 1030, 1, 0, 0, 0, 1030, 1028, 1, 0, 0, 0, 1030, 1031, 1, 0, 0, 0, 1031, 142, 1, 0, 0, 0, 1032, 1036, 3, 149, 74, 0, 1033, 1035, 3, 139, 69, 0, 1034, 1033, 1, 0, 0, 0, 1035, 1038, 1, 0, 0, 0, 1036, 1034, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1041, 1, 0, 0, 0, 1038, 1036, 1, 0, 0, 0, 1039, 1041, 5, 48, 0, 0, 1040, 1032, 1, 0, 0, 0, 1040, 1039, 1, 0, 0, 0, 1041, 144, 1, 0, 0, 0, 1042, 1046, 5, 48, 0, 0, 1043, 1045, 3, 151, 75, 0, 1044, 1043, 1, 0, 0, 0, 1045, 1048, 1, 0, 0, 0, 1046, 1044, 1, 0, 0, 0, 1046, 1047, 1, 0, 0, 0, 1047, 146, 1, 0, 0, 0, 1048, 1046, 1, 0, 0, 0, 1049, 1050, 5, 48, 0, 0, 1050, 1051, 7, 7, 0, 0, 1051, 1052, 3, 171, 85, 0, 1052, 148, 1, 0, 0, 0, 1053, 1054, 7, 8, 0, 0, 1054, 150, 1, 0, 0, 0, 1055, 1056, 7, 9, 0, 0, 1056, 152, 1, 0, 0, 0, 1057, 1058, 7, 10, 0, 0, 1058, 154, 1, 0, 0, 0, 1059, 1060, 3, 153, 76, 0, 1060, 1061, 3, 153, 76, 0, 1061, 1062, 3, 153, 76, 0, 1062, 1063, 3, 153, 76, 0, 1063, 156, 1, 0, 0, 0, 1064, 1065, 5, 92, 0, 0, 1065, 1066, 5, 117, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1075, 3, 155, 77, 0, 1068, 1069, 5, 92, 0, 0, 1069, 1070, 5, 85, 0, 0, 1070, 1071, 1, 0, 0, 0, 1071, 1072, 3, 155, 77, 0, 1072, 1073, 3, 155, 77, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1064, 1, 0, 0, 0, 1074, 1068, 1, 0, 0, 0, 1075, 158, 1, 0, 0, 0, 1076, 1078, 3, 163, 81, 0, 1077, 1079, 3, 165, 82, 0, 1078, 1077, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1084, 1, 0, 0, 0, 1080, 1081, 3, 167, 83, 0, 1081, 1082, 3, 165, 82, 0, 1082, 1084, 1, 0, 0, 0, 1083, 1076, 1, 0, 0, 0, 1083, 1080, 1, 0, 0, 0, 1084, 160, 1, 0, 0, 0, 1085, 1086, 5, 48, 0, 0, 1086, 1089, 7, 7, 0, 0, 1087, 1090, 3, 169, 84, 0, 1088, 1090, 3, 171, 85, 0, 1089, 1087, 1, 0, 0, 0, 1089, 1088, 1, 0, 0, 0, 1090, 1091, 1, 0, 0, 0, 1091, 1092, 3, 173, 86, 0, 1092, 162, 1, 0, 0, 0, 1093, 1095, 3, 167, 83, 0, 1094, 1093, 1, 0, 0, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1096, 1, 0, 0, 0, 1096, 1097, 5, 46, 0, 0, 1097, 1102, 3, 167, 83, 0, 1098, 1099, 3, 167, 83, 0, 1099, 1100, 5, 46, 0, 0, 1100, 1102, 1, 0, 0, 0, 1101, 1094, 1, 0, 0, 0, 1101, 1098, 1, 0, 0, 0, 1102, 164, 1, 0, 0, 0, 1103, 1105, 7, 11, 0, 0, 1104, 1106, 7, 12, 0, 0, 1105, 1104, 1, 0, 0, 0, 1105, 1106, 1, 0, 0, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1108, 3, 167, 83, 0, 1108, 166, 1, 0, 0, 0, 1109, 1111, 3, 139, 69, 0, 1110, 1109, 1, 0, 0, 0, 1111, 1112, 1, 0, 0, 0, 1112, 1110, 1, 0, 0, 0, 1112, 1113, 1, 0, 0, 0, 1113, 168, 1, 0, 0, 0, 1114, 1116, 3, 171, 85, 0, 1115, 1114, 1, 0, 0, 0, 1115, 1116, 1, 0, 0, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 5, 46, 0, 0, 1118, 1123, 3, 171, 85, 0, 1119, 1120, 3, 171, 85, 0, 1120, 1121, 5, 46, 0, 0, 1121, 1123, 1, 0, 0, 0, 1122, 1115, 1, 0, 0, 0, 1122, 1119, 1, 0, 0, 0, 1123, 170, 1, 0, 0, 0, 1124, 1126, 3, 153, 76, 0, 1125, 1124, 1, 0, 0, 0, 1126, 1127, 1, 0, 0, 0, 1127, 1125, 1, 0, 0, 0, 1127, 1128, 1, 0, 0, 0, 1128, 172, 1, 0, 0, 0, 1129, 1131, 7, 13, 0, 0, 1130, 1132, 7, 12, 0, 0, 1131, 1130, 1, 0, 0, 0, 1131, 1132, 1, 0, 0, 0, 1132, 1133, 1, 0, 0, 0, 1133, 1134, 3, 167, 83, 0, 1134, 174, 1, 0, 0, 0, 1135, 1136, 5, 92, 0, 0, 1136, 1151, 7, 14, 0, 0, 1137, 1138, 5, 92, 0, 0, 1138, 1140, 3, 151, 75, 0, 1139, 1141, 3, 151, 75, 0, 1140, 1139, 1, 0, 0, 0, 1140, 1141, 1, 0, 0, 0, 1141, 1143, 1, 0, 0, 0, 1142, 1144, 3, 151, 75, 0, 1143, 1142, 1, 0, 0, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1151, 1, 0, 0, 0, 1145, 1146, 5, 92, 0, 0, 1146, 1147, 5, 120, 0, 0, 1147, 1148, 1, 0, 0, 0, 1148, 1151, 3, 171, 85, 0, 1149, 1151, 3, 157, 78, 0, 1150, 1135, 1, 0, 0, 0, 1150, 1137, 1, 0, 0, 0, 1150, 1145, 1, 0, 0, 0, 1150, 1149, 1, 0, 0, 0, 1151, 176, 1, 0, 0, 0, 1152, 1154, 7, 15, 0, 0, 1153, 1152, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 1153, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1158, 6, 88, 0, 0, 1158, 178, 1, 0, 0, 0, 1159, 1161, 5, 13, 0, 0, 1160, 1162, 5, 10, 0, 0, 1161, 1160, 1, 0, 0, 0, 1161, 1162, 1, 0, 0, 0, 1162, 1165, 1, 0, 0, 0, 1163, 1165, 5, 10, 0, 0, 1164, 1159, 1, 0, 0, 0, 1164, 1163, 1, 0, 0, 0, 1165, 1166, 1, 0, 0, 0, 1166, 1167, 6, 89, 0, 0, 1167, 180, 1, 0, 0, 0, 71, 0, 219, 233, 255, 281, 309, 327, 335, 377, 414, 422, 438, 462, 473, 479, 484, 486, 517, 553, 589, 619, 657, 695, 721, 741, 763, 787, 809, 833, 861, 881, 903, 932, 938, 942, 947, 949, 959, 963, 968, 971, 975, 980, 986, 991, 996, 1001, 1010, 1019, 1030, 1036, 1040, 1046, 1074, 1078, 1083, 1089, 1094, 1101, 1105, 1112, 1115, 1122, 1127, 1131, 1140, 1143, 1150, 1155, 1161, 1164, 1, 6, 0, 0] \ No newline at end of file diff --git a/internal/parser/planparserv2/generated/PlanLexer.tokens b/internal/parser/planparserv2/generated/PlanLexer.tokens index 4d1e299fda..23e0efa1bf 100644 --- a/internal/parser/planparserv2/generated/PlanLexer.tokens +++ b/internal/parser/planparserv2/generated/PlanLexer.tokens @@ -18,49 +18,51 @@ PHRASEMATCH=17 RANDOMSAMPLE=18 INTERVAL=19 ISO=20 -ADD=21 -SUB=22 -MUL=23 -DIV=24 -MOD=25 -POW=26 -SHL=27 -SHR=28 -BAND=29 -BOR=30 -BXOR=31 -AND=32 -OR=33 -ISNULL=34 -ISNOTNULL=35 -BNOT=36 -NOT=37 -IN=38 -EmptyArray=39 -JSONContains=40 -JSONContainsAll=41 -JSONContainsAny=42 -ArrayContains=43 -ArrayContainsAll=44 -ArrayContainsAny=45 -ArrayLength=46 -STEuqals=47 -STTouches=48 -STOverlaps=49 -STCrosses=50 -STContains=51 -STIntersects=52 -STWithin=53 -STDWithin=54 -BooleanConstant=55 -IntegerConstant=56 -FloatingConstant=57 -Identifier=58 -Meta=59 -StringLiteral=60 -JSONIdentifier=61 -Whitespace=62 -Newline=63 +MINIMUM_SHOULD_MATCH=21 +ASSIGN=22 +ADD=23 +SUB=24 +MUL=25 +DIV=26 +MOD=27 +POW=28 +SHL=29 +SHR=30 +BAND=31 +BOR=32 +BXOR=33 +AND=34 +OR=35 +ISNULL=36 +ISNOTNULL=37 +BNOT=38 +NOT=39 +IN=40 +EmptyArray=41 +JSONContains=42 +JSONContainsAll=43 +JSONContainsAny=44 +ArrayContains=45 +ArrayContainsAll=46 +ArrayContainsAny=47 +ArrayLength=48 +STEuqals=49 +STTouches=50 +STOverlaps=51 +STCrosses=52 +STContains=53 +STIntersects=54 +STWithin=55 +STDWithin=56 +BooleanConstant=57 +IntegerConstant=58 +FloatingConstant=59 +Identifier=60 +Meta=61 +StringLiteral=62 +JSONIdentifier=63 +Whitespace=64 +Newline=65 '('=1 ')'=2 '['=3 @@ -74,16 +76,17 @@ Newline=63 '>='=11 '=='=12 '!='=13 -'+'=21 -'-'=22 -'*'=23 -'/'=24 -'%'=25 -'**'=26 -'<<'=27 -'>>'=28 -'&'=29 -'|'=30 -'^'=31 -'~'=36 -'$meta'=59 +'='=22 +'+'=23 +'-'=24 +'*'=25 +'/'=26 +'%'=27 +'**'=28 +'<<'=29 +'>>'=30 +'&'=31 +'|'=32 +'^'=33 +'~'=38 +'$meta'=61 diff --git a/internal/parser/planparserv2/generated/plan_base_visitor.go b/internal/parser/planparserv2/generated/plan_base_visitor.go index a03849c059..8c25da08fb 100644 --- a/internal/parser/planparserv2/generated/plan_base_visitor.go +++ b/internal/parser/planparserv2/generated/plan_base_visitor.go @@ -194,3 +194,7 @@ func (v *BasePlanVisitor) VisitPower(ctx *PowerContext) interface{} { func (v *BasePlanVisitor) VisitSTOverlaps(ctx *STOverlapsContext) interface{} { return v.VisitChildren(ctx) } + +func (v *BasePlanVisitor) VisitTextMatchOption(ctx *TextMatchOptionContext) interface{} { + return v.VisitChildren(ctx) +} diff --git a/internal/parser/planparserv2/generated/plan_lexer.go b/internal/parser/planparserv2/generated/plan_lexer.go index 7cb4968de4..157623c6e6 100644 --- a/internal/parser/planparserv2/generated/plan_lexer.go +++ b/internal/parser/planparserv2/generated/plan_lexer.go @@ -44,44 +44,45 @@ func planlexerLexerInit() { } staticData.LiteralNames = []string{ "", "'('", "')'", "'['", "','", "']'", "'{'", "'}'", "'<'", "'<='", - "'>'", "'>='", "'=='", "'!='", "", "", "", "", "", "", "", "'+'", "'-'", - "'*'", "'/'", "'%'", "'**'", "'<<'", "'>>'", "'&'", "'|'", "'^'", "", - "", "", "", "'~'", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", "'$meta'", + "'>'", "'>='", "'=='", "'!='", "", "", "", "", "", "", "", "", "'='", + "'+'", "'-'", "'*'", "'/'", "'%'", "'**'", "'<<'", "'>>'", "'&'", "'|'", + "'^'", "", "", "", "", "'~'", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "'$meta'", } staticData.SymbolicNames = []string{ "", "", "", "", "", "", "LBRACE", "RBRACE", "LT", "LE", "GT", "GE", "EQ", "NE", "LIKE", "EXISTS", "TEXTMATCH", "PHRASEMATCH", "RANDOMSAMPLE", - "INTERVAL", "ISO", "ADD", "SUB", "MUL", "DIV", "MOD", "POW", "SHL", - "SHR", "BAND", "BOR", "BXOR", "AND", "OR", "ISNULL", "ISNOTNULL", "BNOT", - "NOT", "IN", "EmptyArray", "JSONContains", "JSONContainsAll", "JSONContainsAny", - "ArrayContains", "ArrayContainsAll", "ArrayContainsAny", "ArrayLength", - "STEuqals", "STTouches", "STOverlaps", "STCrosses", "STContains", "STIntersects", - "STWithin", "STDWithin", "BooleanConstant", "IntegerConstant", "FloatingConstant", - "Identifier", "Meta", "StringLiteral", "JSONIdentifier", "Whitespace", - "Newline", + "INTERVAL", "ISO", "MINIMUM_SHOULD_MATCH", "ASSIGN", "ADD", "SUB", "MUL", + "DIV", "MOD", "POW", "SHL", "SHR", "BAND", "BOR", "BXOR", "AND", "OR", + "ISNULL", "ISNOTNULL", "BNOT", "NOT", "IN", "EmptyArray", "JSONContains", + "JSONContainsAll", "JSONContainsAny", "ArrayContains", "ArrayContainsAll", + "ArrayContainsAny", "ArrayLength", "STEuqals", "STTouches", "STOverlaps", + "STCrosses", "STContains", "STIntersects", "STWithin", "STDWithin", + "BooleanConstant", "IntegerConstant", "FloatingConstant", "Identifier", + "Meta", "StringLiteral", "JSONIdentifier", "Whitespace", "Newline", } staticData.RuleNames = []string{ "T__0", "T__1", "T__2", "T__3", "T__4", "LBRACE", "RBRACE", "LT", "LE", "GT", "GE", "EQ", "NE", "LIKE", "EXISTS", "TEXTMATCH", "PHRASEMATCH", - "RANDOMSAMPLE", "INTERVAL", "ISO", "ADD", "SUB", "MUL", "DIV", "MOD", - "POW", "SHL", "SHR", "BAND", "BOR", "BXOR", "AND", "OR", "ISNULL", "ISNOTNULL", - "BNOT", "NOT", "IN", "EmptyArray", "JSONContains", "JSONContainsAll", - "JSONContainsAny", "ArrayContains", "ArrayContainsAll", "ArrayContainsAny", - "ArrayLength", "STEuqals", "STTouches", "STOverlaps", "STCrosses", "STContains", - "STIntersects", "STWithin", "STDWithin", "BooleanConstant", "IntegerConstant", - "FloatingConstant", "Identifier", "Meta", "StringLiteral", "JSONIdentifier", - "EncodingPrefix", "DoubleSCharSequence", "SingleSCharSequence", "DoubleSChar", - "SingleSChar", "Nondigit", "Digit", "BinaryConstant", "DecimalConstant", - "OctalConstant", "HexadecimalConstant", "NonzeroDigit", "OctalDigit", - "HexadecimalDigit", "HexQuad", "UniversalCharacterName", "DecimalFloatingConstant", - "HexadecimalFloatingConstant", "FractionalConstant", "ExponentPart", - "DigitSequence", "HexadecimalFractionalConstant", "HexadecimalDigitSequence", - "BinaryExponentPart", "EscapeSequence", "Whitespace", "Newline", + "RANDOMSAMPLE", "INTERVAL", "ISO", "MINIMUM_SHOULD_MATCH", "ASSIGN", + "ADD", "SUB", "MUL", "DIV", "MOD", "POW", "SHL", "SHR", "BAND", "BOR", + "BXOR", "AND", "OR", "ISNULL", "ISNOTNULL", "BNOT", "NOT", "IN", "EmptyArray", + "JSONContains", "JSONContainsAll", "JSONContainsAny", "ArrayContains", + "ArrayContainsAll", "ArrayContainsAny", "ArrayLength", "STEuqals", "STTouches", + "STOverlaps", "STCrosses", "STContains", "STIntersects", "STWithin", + "STDWithin", "BooleanConstant", "IntegerConstant", "FloatingConstant", + "Identifier", "Meta", "StringLiteral", "JSONIdentifier", "EncodingPrefix", + "DoubleSCharSequence", "SingleSCharSequence", "DoubleSChar", "SingleSChar", + "Nondigit", "Digit", "BinaryConstant", "DecimalConstant", "OctalConstant", + "HexadecimalConstant", "NonzeroDigit", "OctalDigit", "HexadecimalDigit", + "HexQuad", "UniversalCharacterName", "DecimalFloatingConstant", "HexadecimalFloatingConstant", + "FractionalConstant", "ExponentPart", "DigitSequence", "HexadecimalFractionalConstant", + "HexadecimalDigitSequence", "BinaryExponentPart", "EscapeSequence", + "Whitespace", "Newline", } staticData.PredictionContextCache = antlr.NewPredictionContextCache() staticData.serializedATN = []int32{ - 4, 0, 63, 1120, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, + 4, 0, 65, 1168, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, @@ -97,498 +98,520 @@ func planlexerLexerInit() { 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, - 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 1, 0, 1, - 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, - 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, - 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, - 13, 1, 13, 1, 13, 3, 13, 216, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, - 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 230, 8, 14, 1, - 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, - 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 252, - 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, - 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, - 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 278, 8, 16, 1, 17, 1, 17, 1, 17, 1, + 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, + 88, 2, 89, 7, 89, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, + 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, + 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, + 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 220, 8, 13, 1, 14, + 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, + 14, 3, 14, 234, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, + 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, + 15, 1, 15, 1, 15, 3, 15, 256, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, + 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, + 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 282, + 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, - 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, - 17, 1, 17, 3, 17, 306, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, - 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, - 18, 324, 8, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 332, 8, - 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, - 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, - 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, - 1, 31, 1, 31, 3, 31, 367, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, - 32, 3, 32, 375, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, - 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 391, 8, 33, 1, - 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, - 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, - 34, 3, 34, 415, 8, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, - 1, 36, 1, 36, 3, 36, 426, 8, 36, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 432, - 8, 37, 1, 38, 1, 38, 1, 38, 5, 38, 437, 8, 38, 10, 38, 12, 38, 440, 9, - 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, - 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, - 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 470, 8, 39, - 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, - 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, - 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, - 40, 1, 40, 1, 40, 3, 40, 506, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, - 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, + 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 310, 8, 17, 1, 18, 1, + 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, + 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 328, 8, 18, 1, 19, 1, 19, 1, 19, 1, + 19, 1, 19, 1, 19, 3, 19, 336, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, + 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, + 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, + 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, + 20, 1, 20, 1, 20, 1, 20, 3, 20, 378, 8, 20, 1, 21, 1, 21, 1, 22, 1, 22, + 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, + 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, + 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, + 33, 415, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 423, 8, + 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, + 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 439, 8, 35, 1, 36, 1, 36, 1, 36, 1, + 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, + 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 463, 8, + 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, + 474, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 480, 8, 39, 1, 40, 1, 40, + 1, 40, 5, 40, 485, 8, 40, 10, 40, 12, 40, 488, 9, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, - 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 542, 8, - 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, + 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, + 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 518, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, - 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 572, 8, 42, + 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, + 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, + 42, 554, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, - 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, - 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 610, 8, 43, 1, 44, 1, 44, 1, 44, - 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, + 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 590, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, - 44, 1, 44, 3, 44, 648, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, + 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 620, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, - 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 674, 8, 45, + 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, + 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, + 45, 1, 45, 3, 45, 658, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, - 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 694, 8, 46, - 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, - 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, - 716, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, + 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, + 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 696, + 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, + 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, + 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 722, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, - 1, 48, 1, 48, 1, 48, 3, 48, 740, 8, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, + 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 742, 8, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, - 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 762, 8, 49, 1, 50, 1, 50, 1, + 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 764, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, - 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 786, - 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, - 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, - 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 814, 8, 51, 1, 52, 1, - 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, - 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 834, 8, 52, 1, 53, 1, + 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, + 50, 788, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, + 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, + 51, 1, 51, 3, 51, 810, 8, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, + 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, + 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 834, 8, 52, 1, 53, 1, 53, + 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, - 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 856, 8, - 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, - 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, - 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 885, 8, 54, 1, 55, - 1, 55, 1, 55, 1, 55, 3, 55, 891, 8, 55, 1, 56, 1, 56, 3, 56, 895, 8, 56, - 1, 57, 1, 57, 1, 57, 5, 57, 900, 8, 57, 10, 57, 12, 57, 903, 9, 57, 1, - 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 3, 59, 912, 8, 59, 1, 59, - 1, 59, 3, 59, 916, 8, 59, 1, 59, 1, 59, 1, 59, 3, 59, 921, 8, 59, 1, 59, - 3, 59, 924, 8, 59, 1, 60, 1, 60, 3, 60, 928, 8, 60, 1, 60, 1, 60, 1, 60, - 3, 60, 933, 8, 60, 1, 60, 1, 60, 4, 60, 937, 8, 60, 11, 60, 12, 60, 938, - 1, 61, 1, 61, 1, 61, 3, 61, 944, 8, 61, 1, 62, 4, 62, 947, 8, 62, 11, 62, - 12, 62, 948, 1, 63, 4, 63, 952, 8, 63, 11, 63, 12, 63, 953, 1, 64, 1, 64, - 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 963, 8, 64, 1, 65, 1, 65, 1, - 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 972, 8, 65, 1, 66, 1, 66, 1, 67, - 1, 67, 1, 68, 1, 68, 1, 68, 4, 68, 981, 8, 68, 11, 68, 12, 68, 982, 1, - 69, 1, 69, 5, 69, 987, 8, 69, 10, 69, 12, 69, 990, 9, 69, 1, 69, 3, 69, - 993, 8, 69, 1, 70, 1, 70, 5, 70, 997, 8, 70, 10, 70, 12, 70, 1000, 9, 70, - 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, - 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, - 1, 76, 1, 76, 1, 76, 1, 76, 3, 76, 1027, 8, 76, 1, 77, 1, 77, 3, 77, 1031, - 8, 77, 1, 77, 1, 77, 1, 77, 3, 77, 1036, 8, 77, 1, 78, 1, 78, 1, 78, 1, - 78, 3, 78, 1042, 8, 78, 1, 78, 1, 78, 1, 79, 3, 79, 1047, 8, 79, 1, 79, - 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 1054, 8, 79, 1, 80, 1, 80, 3, 80, 1058, - 8, 80, 1, 80, 1, 80, 1, 81, 4, 81, 1063, 8, 81, 11, 81, 12, 81, 1064, 1, - 82, 3, 82, 1068, 8, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 3, 82, 1075, - 8, 82, 1, 83, 4, 83, 1078, 8, 83, 11, 83, 12, 83, 1079, 1, 84, 1, 84, 3, - 84, 1084, 8, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, - 1093, 8, 85, 1, 85, 3, 85, 1096, 8, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, - 85, 3, 85, 1103, 8, 85, 1, 86, 4, 86, 1106, 8, 86, 11, 86, 12, 86, 1107, - 1, 86, 1, 86, 1, 87, 1, 87, 3, 87, 1114, 8, 87, 1, 87, 3, 87, 1117, 8, - 87, 1, 87, 1, 87, 0, 0, 88, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, - 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, - 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, - 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, - 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, - 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, - 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, - 61, 123, 0, 125, 0, 127, 0, 129, 0, 131, 0, 133, 0, 135, 0, 137, 0, 139, + 1, 53, 1, 53, 1, 53, 3, 53, 862, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, + 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, + 1, 54, 1, 54, 1, 54, 3, 54, 882, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, + 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, + 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 904, 8, 55, 1, 56, 1, 56, 1, + 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, + 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, + 56, 1, 56, 1, 56, 1, 56, 3, 56, 933, 8, 56, 1, 57, 1, 57, 1, 57, 1, 57, + 3, 57, 939, 8, 57, 1, 58, 1, 58, 3, 58, 943, 8, 58, 1, 59, 1, 59, 1, 59, + 5, 59, 948, 8, 59, 10, 59, 12, 59, 951, 9, 59, 1, 60, 1, 60, 1, 60, 1, + 60, 1, 60, 1, 60, 1, 61, 3, 61, 960, 8, 61, 1, 61, 1, 61, 3, 61, 964, 8, + 61, 1, 61, 1, 61, 1, 61, 3, 61, 969, 8, 61, 1, 61, 3, 61, 972, 8, 61, 1, + 62, 1, 62, 3, 62, 976, 8, 62, 1, 62, 1, 62, 1, 62, 3, 62, 981, 8, 62, 1, + 62, 1, 62, 4, 62, 985, 8, 62, 11, 62, 12, 62, 986, 1, 63, 1, 63, 1, 63, + 3, 63, 992, 8, 63, 1, 64, 4, 64, 995, 8, 64, 11, 64, 12, 64, 996, 1, 65, + 4, 65, 1000, 8, 65, 11, 65, 12, 65, 1001, 1, 66, 1, 66, 1, 66, 1, 66, 1, + 66, 1, 66, 1, 66, 3, 66, 1011, 8, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, + 1, 67, 1, 67, 3, 67, 1020, 8, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, + 70, 1, 70, 4, 70, 1029, 8, 70, 11, 70, 12, 70, 1030, 1, 71, 1, 71, 5, 71, + 1035, 8, 71, 10, 71, 12, 71, 1038, 9, 71, 1, 71, 3, 71, 1041, 8, 71, 1, + 72, 1, 72, 5, 72, 1045, 8, 72, 10, 72, 12, 72, 1048, 9, 72, 1, 73, 1, 73, + 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, + 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, + 1, 78, 1, 78, 3, 78, 1075, 8, 78, 1, 79, 1, 79, 3, 79, 1079, 8, 79, 1, + 79, 1, 79, 1, 79, 3, 79, 1084, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 3, 80, + 1090, 8, 80, 1, 80, 1, 80, 1, 81, 3, 81, 1095, 8, 81, 1, 81, 1, 81, 1, + 81, 1, 81, 1, 81, 3, 81, 1102, 8, 81, 1, 82, 1, 82, 3, 82, 1106, 8, 82, + 1, 82, 1, 82, 1, 83, 4, 83, 1111, 8, 83, 11, 83, 12, 83, 1112, 1, 84, 3, + 84, 1116, 8, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 3, 84, 1123, 8, 84, + 1, 85, 4, 85, 1126, 8, 85, 11, 85, 12, 85, 1127, 1, 86, 1, 86, 3, 86, 1132, + 8, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, 1141, 8, + 87, 1, 87, 3, 87, 1144, 8, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, + 1151, 8, 87, 1, 88, 4, 88, 1154, 8, 88, 11, 88, 12, 88, 1155, 1, 88, 1, + 88, 1, 89, 1, 89, 3, 89, 1162, 8, 89, 1, 89, 3, 89, 1165, 8, 89, 1, 89, + 1, 89, 0, 0, 90, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, + 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, + 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, + 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, + 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, + 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, + 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, + 123, 62, 125, 63, 127, 0, 129, 0, 131, 0, 133, 0, 135, 0, 137, 0, 139, 0, 141, 0, 143, 0, 145, 0, 147, 0, 149, 0, 151, 0, 153, 0, 155, 0, 157, - 0, 159, 0, 161, 0, 163, 0, 165, 0, 167, 0, 169, 0, 171, 0, 173, 62, 175, - 63, 1, 0, 16, 3, 0, 76, 76, 85, 85, 117, 117, 4, 0, 10, 10, 13, 13, 34, - 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 3, 0, 65, 90, 95, 95, - 97, 122, 1, 0, 48, 57, 2, 0, 66, 66, 98, 98, 1, 0, 48, 49, 2, 0, 88, 88, - 120, 120, 1, 0, 49, 57, 1, 0, 48, 55, 3, 0, 48, 57, 65, 70, 97, 102, 2, - 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 2, 0, 80, 80, 112, 112, 10, - 0, 34, 34, 39, 39, 63, 63, 92, 92, 97, 98, 102, 102, 110, 110, 114, 114, - 116, 116, 118, 118, 2, 0, 9, 9, 32, 32, 1178, 0, 1, 1, 0, 0, 0, 0, 3, 1, - 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, - 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, - 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, - 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, - 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, - 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, - 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, - 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, - 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, - 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, - 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, - 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, - 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, - 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, - 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, - 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, - 175, 1, 0, 0, 0, 1, 177, 1, 0, 0, 0, 3, 179, 1, 0, 0, 0, 5, 181, 1, 0, - 0, 0, 7, 183, 1, 0, 0, 0, 9, 185, 1, 0, 0, 0, 11, 187, 1, 0, 0, 0, 13, - 189, 1, 0, 0, 0, 15, 191, 1, 0, 0, 0, 17, 193, 1, 0, 0, 0, 19, 196, 1, - 0, 0, 0, 21, 198, 1, 0, 0, 0, 23, 201, 1, 0, 0, 0, 25, 204, 1, 0, 0, 0, - 27, 215, 1, 0, 0, 0, 29, 229, 1, 0, 0, 0, 31, 251, 1, 0, 0, 0, 33, 277, - 1, 0, 0, 0, 35, 305, 1, 0, 0, 0, 37, 323, 1, 0, 0, 0, 39, 331, 1, 0, 0, - 0, 41, 333, 1, 0, 0, 0, 43, 335, 1, 0, 0, 0, 45, 337, 1, 0, 0, 0, 47, 339, - 1, 0, 0, 0, 49, 341, 1, 0, 0, 0, 51, 343, 1, 0, 0, 0, 53, 346, 1, 0, 0, - 0, 55, 349, 1, 0, 0, 0, 57, 352, 1, 0, 0, 0, 59, 354, 1, 0, 0, 0, 61, 356, - 1, 0, 0, 0, 63, 366, 1, 0, 0, 0, 65, 374, 1, 0, 0, 0, 67, 390, 1, 0, 0, - 0, 69, 414, 1, 0, 0, 0, 71, 416, 1, 0, 0, 0, 73, 425, 1, 0, 0, 0, 75, 431, - 1, 0, 0, 0, 77, 433, 1, 0, 0, 0, 79, 469, 1, 0, 0, 0, 81, 505, 1, 0, 0, - 0, 83, 541, 1, 0, 0, 0, 85, 571, 1, 0, 0, 0, 87, 609, 1, 0, 0, 0, 89, 647, - 1, 0, 0, 0, 91, 673, 1, 0, 0, 0, 93, 693, 1, 0, 0, 0, 95, 715, 1, 0, 0, - 0, 97, 739, 1, 0, 0, 0, 99, 761, 1, 0, 0, 0, 101, 785, 1, 0, 0, 0, 103, - 813, 1, 0, 0, 0, 105, 833, 1, 0, 0, 0, 107, 855, 1, 0, 0, 0, 109, 884, - 1, 0, 0, 0, 111, 890, 1, 0, 0, 0, 113, 894, 1, 0, 0, 0, 115, 896, 1, 0, - 0, 0, 117, 904, 1, 0, 0, 0, 119, 911, 1, 0, 0, 0, 121, 927, 1, 0, 0, 0, - 123, 943, 1, 0, 0, 0, 125, 946, 1, 0, 0, 0, 127, 951, 1, 0, 0, 0, 129, - 962, 1, 0, 0, 0, 131, 971, 1, 0, 0, 0, 133, 973, 1, 0, 0, 0, 135, 975, - 1, 0, 0, 0, 137, 977, 1, 0, 0, 0, 139, 992, 1, 0, 0, 0, 141, 994, 1, 0, - 0, 0, 143, 1001, 1, 0, 0, 0, 145, 1005, 1, 0, 0, 0, 147, 1007, 1, 0, 0, - 0, 149, 1009, 1, 0, 0, 0, 151, 1011, 1, 0, 0, 0, 153, 1026, 1, 0, 0, 0, - 155, 1035, 1, 0, 0, 0, 157, 1037, 1, 0, 0, 0, 159, 1053, 1, 0, 0, 0, 161, - 1055, 1, 0, 0, 0, 163, 1062, 1, 0, 0, 0, 165, 1074, 1, 0, 0, 0, 167, 1077, - 1, 0, 0, 0, 169, 1081, 1, 0, 0, 0, 171, 1102, 1, 0, 0, 0, 173, 1105, 1, - 0, 0, 0, 175, 1116, 1, 0, 0, 0, 177, 178, 5, 40, 0, 0, 178, 2, 1, 0, 0, - 0, 179, 180, 5, 41, 0, 0, 180, 4, 1, 0, 0, 0, 181, 182, 5, 91, 0, 0, 182, - 6, 1, 0, 0, 0, 183, 184, 5, 44, 0, 0, 184, 8, 1, 0, 0, 0, 185, 186, 5, - 93, 0, 0, 186, 10, 1, 0, 0, 0, 187, 188, 5, 123, 0, 0, 188, 12, 1, 0, 0, - 0, 189, 190, 5, 125, 0, 0, 190, 14, 1, 0, 0, 0, 191, 192, 5, 60, 0, 0, - 192, 16, 1, 0, 0, 0, 193, 194, 5, 60, 0, 0, 194, 195, 5, 61, 0, 0, 195, - 18, 1, 0, 0, 0, 196, 197, 5, 62, 0, 0, 197, 20, 1, 0, 0, 0, 198, 199, 5, - 62, 0, 0, 199, 200, 5, 61, 0, 0, 200, 22, 1, 0, 0, 0, 201, 202, 5, 61, - 0, 0, 202, 203, 5, 61, 0, 0, 203, 24, 1, 0, 0, 0, 204, 205, 5, 33, 0, 0, - 205, 206, 5, 61, 0, 0, 206, 26, 1, 0, 0, 0, 207, 208, 5, 108, 0, 0, 208, - 209, 5, 105, 0, 0, 209, 210, 5, 107, 0, 0, 210, 216, 5, 101, 0, 0, 211, - 212, 5, 76, 0, 0, 212, 213, 5, 73, 0, 0, 213, 214, 5, 75, 0, 0, 214, 216, - 5, 69, 0, 0, 215, 207, 1, 0, 0, 0, 215, 211, 1, 0, 0, 0, 216, 28, 1, 0, - 0, 0, 217, 218, 5, 101, 0, 0, 218, 219, 5, 120, 0, 0, 219, 220, 5, 105, - 0, 0, 220, 221, 5, 115, 0, 0, 221, 222, 5, 116, 0, 0, 222, 230, 5, 115, - 0, 0, 223, 224, 5, 69, 0, 0, 224, 225, 5, 88, 0, 0, 225, 226, 5, 73, 0, - 0, 226, 227, 5, 83, 0, 0, 227, 228, 5, 84, 0, 0, 228, 230, 5, 83, 0, 0, - 229, 217, 1, 0, 0, 0, 229, 223, 1, 0, 0, 0, 230, 30, 1, 0, 0, 0, 231, 232, - 5, 116, 0, 0, 232, 233, 5, 101, 0, 0, 233, 234, 5, 120, 0, 0, 234, 235, - 5, 116, 0, 0, 235, 236, 5, 95, 0, 0, 236, 237, 5, 109, 0, 0, 237, 238, - 5, 97, 0, 0, 238, 239, 5, 116, 0, 0, 239, 240, 5, 99, 0, 0, 240, 252, 5, - 104, 0, 0, 241, 242, 5, 84, 0, 0, 242, 243, 5, 69, 0, 0, 243, 244, 5, 88, - 0, 0, 244, 245, 5, 84, 0, 0, 245, 246, 5, 95, 0, 0, 246, 247, 5, 77, 0, - 0, 247, 248, 5, 65, 0, 0, 248, 249, 5, 84, 0, 0, 249, 250, 5, 67, 0, 0, - 250, 252, 5, 72, 0, 0, 251, 231, 1, 0, 0, 0, 251, 241, 1, 0, 0, 0, 252, - 32, 1, 0, 0, 0, 253, 254, 5, 112, 0, 0, 254, 255, 5, 104, 0, 0, 255, 256, - 5, 114, 0, 0, 256, 257, 5, 97, 0, 0, 257, 258, 5, 115, 0, 0, 258, 259, - 5, 101, 0, 0, 259, 260, 5, 95, 0, 0, 260, 261, 5, 109, 0, 0, 261, 262, - 5, 97, 0, 0, 262, 263, 5, 116, 0, 0, 263, 264, 5, 99, 0, 0, 264, 278, 5, - 104, 0, 0, 265, 266, 5, 80, 0, 0, 266, 267, 5, 72, 0, 0, 267, 268, 5, 82, - 0, 0, 268, 269, 5, 65, 0, 0, 269, 270, 5, 83, 0, 0, 270, 271, 5, 69, 0, - 0, 271, 272, 5, 95, 0, 0, 272, 273, 5, 77, 0, 0, 273, 274, 5, 65, 0, 0, - 274, 275, 5, 84, 0, 0, 275, 276, 5, 67, 0, 0, 276, 278, 5, 72, 0, 0, 277, - 253, 1, 0, 0, 0, 277, 265, 1, 0, 0, 0, 278, 34, 1, 0, 0, 0, 279, 280, 5, - 114, 0, 0, 280, 281, 5, 97, 0, 0, 281, 282, 5, 110, 0, 0, 282, 283, 5, - 100, 0, 0, 283, 284, 5, 111, 0, 0, 284, 285, 5, 109, 0, 0, 285, 286, 5, - 95, 0, 0, 286, 287, 5, 115, 0, 0, 287, 288, 5, 97, 0, 0, 288, 289, 5, 109, - 0, 0, 289, 290, 5, 112, 0, 0, 290, 291, 5, 108, 0, 0, 291, 306, 5, 101, - 0, 0, 292, 293, 5, 82, 0, 0, 293, 294, 5, 65, 0, 0, 294, 295, 5, 78, 0, - 0, 295, 296, 5, 68, 0, 0, 296, 297, 5, 79, 0, 0, 297, 298, 5, 77, 0, 0, - 298, 299, 5, 95, 0, 0, 299, 300, 5, 83, 0, 0, 300, 301, 5, 65, 0, 0, 301, - 302, 5, 77, 0, 0, 302, 303, 5, 80, 0, 0, 303, 304, 5, 76, 0, 0, 304, 306, - 5, 69, 0, 0, 305, 279, 1, 0, 0, 0, 305, 292, 1, 0, 0, 0, 306, 36, 1, 0, - 0, 0, 307, 308, 5, 105, 0, 0, 308, 309, 5, 110, 0, 0, 309, 310, 5, 116, - 0, 0, 310, 311, 5, 101, 0, 0, 311, 312, 5, 114, 0, 0, 312, 313, 5, 118, - 0, 0, 313, 314, 5, 97, 0, 0, 314, 324, 5, 108, 0, 0, 315, 316, 5, 73, 0, - 0, 316, 317, 5, 78, 0, 0, 317, 318, 5, 84, 0, 0, 318, 319, 5, 69, 0, 0, - 319, 320, 5, 82, 0, 0, 320, 321, 5, 86, 0, 0, 321, 322, 5, 65, 0, 0, 322, - 324, 5, 76, 0, 0, 323, 307, 1, 0, 0, 0, 323, 315, 1, 0, 0, 0, 324, 38, - 1, 0, 0, 0, 325, 326, 5, 105, 0, 0, 326, 327, 5, 115, 0, 0, 327, 332, 5, - 111, 0, 0, 328, 329, 5, 73, 0, 0, 329, 330, 5, 83, 0, 0, 330, 332, 5, 79, - 0, 0, 331, 325, 1, 0, 0, 0, 331, 328, 1, 0, 0, 0, 332, 40, 1, 0, 0, 0, - 333, 334, 5, 43, 0, 0, 334, 42, 1, 0, 0, 0, 335, 336, 5, 45, 0, 0, 336, - 44, 1, 0, 0, 0, 337, 338, 5, 42, 0, 0, 338, 46, 1, 0, 0, 0, 339, 340, 5, - 47, 0, 0, 340, 48, 1, 0, 0, 0, 341, 342, 5, 37, 0, 0, 342, 50, 1, 0, 0, - 0, 343, 344, 5, 42, 0, 0, 344, 345, 5, 42, 0, 0, 345, 52, 1, 0, 0, 0, 346, - 347, 5, 60, 0, 0, 347, 348, 5, 60, 0, 0, 348, 54, 1, 0, 0, 0, 349, 350, - 5, 62, 0, 0, 350, 351, 5, 62, 0, 0, 351, 56, 1, 0, 0, 0, 352, 353, 5, 38, - 0, 0, 353, 58, 1, 0, 0, 0, 354, 355, 5, 124, 0, 0, 355, 60, 1, 0, 0, 0, - 356, 357, 5, 94, 0, 0, 357, 62, 1, 0, 0, 0, 358, 359, 5, 38, 0, 0, 359, - 367, 5, 38, 0, 0, 360, 361, 5, 97, 0, 0, 361, 362, 5, 110, 0, 0, 362, 367, - 5, 100, 0, 0, 363, 364, 5, 65, 0, 0, 364, 365, 5, 78, 0, 0, 365, 367, 5, - 68, 0, 0, 366, 358, 1, 0, 0, 0, 366, 360, 1, 0, 0, 0, 366, 363, 1, 0, 0, - 0, 367, 64, 1, 0, 0, 0, 368, 369, 5, 124, 0, 0, 369, 375, 5, 124, 0, 0, - 370, 371, 5, 111, 0, 0, 371, 375, 5, 114, 0, 0, 372, 373, 5, 79, 0, 0, - 373, 375, 5, 82, 0, 0, 374, 368, 1, 0, 0, 0, 374, 370, 1, 0, 0, 0, 374, - 372, 1, 0, 0, 0, 375, 66, 1, 0, 0, 0, 376, 377, 5, 105, 0, 0, 377, 378, - 5, 115, 0, 0, 378, 379, 5, 32, 0, 0, 379, 380, 5, 110, 0, 0, 380, 381, - 5, 117, 0, 0, 381, 382, 5, 108, 0, 0, 382, 391, 5, 108, 0, 0, 383, 384, - 5, 73, 0, 0, 384, 385, 5, 83, 0, 0, 385, 386, 5, 32, 0, 0, 386, 387, 5, - 78, 0, 0, 387, 388, 5, 85, 0, 0, 388, 389, 5, 76, 0, 0, 389, 391, 5, 76, - 0, 0, 390, 376, 1, 0, 0, 0, 390, 383, 1, 0, 0, 0, 391, 68, 1, 0, 0, 0, - 392, 393, 5, 105, 0, 0, 393, 394, 5, 115, 0, 0, 394, 395, 5, 32, 0, 0, - 395, 396, 5, 110, 0, 0, 396, 397, 5, 111, 0, 0, 397, 398, 5, 116, 0, 0, - 398, 399, 5, 32, 0, 0, 399, 400, 5, 110, 0, 0, 400, 401, 5, 117, 0, 0, - 401, 402, 5, 108, 0, 0, 402, 415, 5, 108, 0, 0, 403, 404, 5, 73, 0, 0, - 404, 405, 5, 83, 0, 0, 405, 406, 5, 32, 0, 0, 406, 407, 5, 78, 0, 0, 407, - 408, 5, 79, 0, 0, 408, 409, 5, 84, 0, 0, 409, 410, 5, 32, 0, 0, 410, 411, - 5, 78, 0, 0, 411, 412, 5, 85, 0, 0, 412, 413, 5, 76, 0, 0, 413, 415, 5, - 76, 0, 0, 414, 392, 1, 0, 0, 0, 414, 403, 1, 0, 0, 0, 415, 70, 1, 0, 0, - 0, 416, 417, 5, 126, 0, 0, 417, 72, 1, 0, 0, 0, 418, 426, 5, 33, 0, 0, - 419, 420, 5, 110, 0, 0, 420, 421, 5, 111, 0, 0, 421, 426, 5, 116, 0, 0, - 422, 423, 5, 78, 0, 0, 423, 424, 5, 79, 0, 0, 424, 426, 5, 84, 0, 0, 425, - 418, 1, 0, 0, 0, 425, 419, 1, 0, 0, 0, 425, 422, 1, 0, 0, 0, 426, 74, 1, - 0, 0, 0, 427, 428, 5, 105, 0, 0, 428, 432, 5, 110, 0, 0, 429, 430, 5, 73, - 0, 0, 430, 432, 5, 78, 0, 0, 431, 427, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, - 432, 76, 1, 0, 0, 0, 433, 438, 5, 91, 0, 0, 434, 437, 3, 173, 86, 0, 435, - 437, 3, 175, 87, 0, 436, 434, 1, 0, 0, 0, 436, 435, 1, 0, 0, 0, 437, 440, - 1, 0, 0, 0, 438, 436, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, 439, 441, 1, 0, - 0, 0, 440, 438, 1, 0, 0, 0, 441, 442, 5, 93, 0, 0, 442, 78, 1, 0, 0, 0, - 443, 444, 5, 106, 0, 0, 444, 445, 5, 115, 0, 0, 445, 446, 5, 111, 0, 0, - 446, 447, 5, 110, 0, 0, 447, 448, 5, 95, 0, 0, 448, 449, 5, 99, 0, 0, 449, - 450, 5, 111, 0, 0, 450, 451, 5, 110, 0, 0, 451, 452, 5, 116, 0, 0, 452, - 453, 5, 97, 0, 0, 453, 454, 5, 105, 0, 0, 454, 455, 5, 110, 0, 0, 455, - 470, 5, 115, 0, 0, 456, 457, 5, 74, 0, 0, 457, 458, 5, 83, 0, 0, 458, 459, - 5, 79, 0, 0, 459, 460, 5, 78, 0, 0, 460, 461, 5, 95, 0, 0, 461, 462, 5, - 67, 0, 0, 462, 463, 5, 79, 0, 0, 463, 464, 5, 78, 0, 0, 464, 465, 5, 84, - 0, 0, 465, 466, 5, 65, 0, 0, 466, 467, 5, 73, 0, 0, 467, 468, 5, 78, 0, - 0, 468, 470, 5, 83, 0, 0, 469, 443, 1, 0, 0, 0, 469, 456, 1, 0, 0, 0, 470, - 80, 1, 0, 0, 0, 471, 472, 5, 106, 0, 0, 472, 473, 5, 115, 0, 0, 473, 474, - 5, 111, 0, 0, 474, 475, 5, 110, 0, 0, 475, 476, 5, 95, 0, 0, 476, 477, - 5, 99, 0, 0, 477, 478, 5, 111, 0, 0, 478, 479, 5, 110, 0, 0, 479, 480, - 5, 116, 0, 0, 480, 481, 5, 97, 0, 0, 481, 482, 5, 105, 0, 0, 482, 483, - 5, 110, 0, 0, 483, 484, 5, 115, 0, 0, 484, 485, 5, 95, 0, 0, 485, 486, - 5, 97, 0, 0, 486, 487, 5, 108, 0, 0, 487, 506, 5, 108, 0, 0, 488, 489, - 5, 74, 0, 0, 489, 490, 5, 83, 0, 0, 490, 491, 5, 79, 0, 0, 491, 492, 5, - 78, 0, 0, 492, 493, 5, 95, 0, 0, 493, 494, 5, 67, 0, 0, 494, 495, 5, 79, - 0, 0, 495, 496, 5, 78, 0, 0, 496, 497, 5, 84, 0, 0, 497, 498, 5, 65, 0, - 0, 498, 499, 5, 73, 0, 0, 499, 500, 5, 78, 0, 0, 500, 501, 5, 83, 0, 0, - 501, 502, 5, 95, 0, 0, 502, 503, 5, 65, 0, 0, 503, 504, 5, 76, 0, 0, 504, - 506, 5, 76, 0, 0, 505, 471, 1, 0, 0, 0, 505, 488, 1, 0, 0, 0, 506, 82, - 1, 0, 0, 0, 507, 508, 5, 106, 0, 0, 508, 509, 5, 115, 0, 0, 509, 510, 5, - 111, 0, 0, 510, 511, 5, 110, 0, 0, 511, 512, 5, 95, 0, 0, 512, 513, 5, - 99, 0, 0, 513, 514, 5, 111, 0, 0, 514, 515, 5, 110, 0, 0, 515, 516, 5, - 116, 0, 0, 516, 517, 5, 97, 0, 0, 517, 518, 5, 105, 0, 0, 518, 519, 5, - 110, 0, 0, 519, 520, 5, 115, 0, 0, 520, 521, 5, 95, 0, 0, 521, 522, 5, - 97, 0, 0, 522, 523, 5, 110, 0, 0, 523, 542, 5, 121, 0, 0, 524, 525, 5, - 74, 0, 0, 525, 526, 5, 83, 0, 0, 526, 527, 5, 79, 0, 0, 527, 528, 5, 78, - 0, 0, 528, 529, 5, 95, 0, 0, 529, 530, 5, 67, 0, 0, 530, 531, 5, 79, 0, - 0, 531, 532, 5, 78, 0, 0, 532, 533, 5, 84, 0, 0, 533, 534, 5, 65, 0, 0, - 534, 535, 5, 73, 0, 0, 535, 536, 5, 78, 0, 0, 536, 537, 5, 83, 0, 0, 537, - 538, 5, 95, 0, 0, 538, 539, 5, 65, 0, 0, 539, 540, 5, 78, 0, 0, 540, 542, - 5, 89, 0, 0, 541, 507, 1, 0, 0, 0, 541, 524, 1, 0, 0, 0, 542, 84, 1, 0, - 0, 0, 543, 544, 5, 97, 0, 0, 544, 545, 5, 114, 0, 0, 545, 546, 5, 114, - 0, 0, 546, 547, 5, 97, 0, 0, 547, 548, 5, 121, 0, 0, 548, 549, 5, 95, 0, - 0, 549, 550, 5, 99, 0, 0, 550, 551, 5, 111, 0, 0, 551, 552, 5, 110, 0, - 0, 552, 553, 5, 116, 0, 0, 553, 554, 5, 97, 0, 0, 554, 555, 5, 105, 0, - 0, 555, 556, 5, 110, 0, 0, 556, 572, 5, 115, 0, 0, 557, 558, 5, 65, 0, - 0, 558, 559, 5, 82, 0, 0, 559, 560, 5, 82, 0, 0, 560, 561, 5, 65, 0, 0, - 561, 562, 5, 89, 0, 0, 562, 563, 5, 95, 0, 0, 563, 564, 5, 67, 0, 0, 564, - 565, 5, 79, 0, 0, 565, 566, 5, 78, 0, 0, 566, 567, 5, 84, 0, 0, 567, 568, - 5, 65, 0, 0, 568, 569, 5, 73, 0, 0, 569, 570, 5, 78, 0, 0, 570, 572, 5, - 83, 0, 0, 571, 543, 1, 0, 0, 0, 571, 557, 1, 0, 0, 0, 572, 86, 1, 0, 0, - 0, 573, 574, 5, 97, 0, 0, 574, 575, 5, 114, 0, 0, 575, 576, 5, 114, 0, - 0, 576, 577, 5, 97, 0, 0, 577, 578, 5, 121, 0, 0, 578, 579, 5, 95, 0, 0, - 579, 580, 5, 99, 0, 0, 580, 581, 5, 111, 0, 0, 581, 582, 5, 110, 0, 0, - 582, 583, 5, 116, 0, 0, 583, 584, 5, 97, 0, 0, 584, 585, 5, 105, 0, 0, - 585, 586, 5, 110, 0, 0, 586, 587, 5, 115, 0, 0, 587, 588, 5, 95, 0, 0, - 588, 589, 5, 97, 0, 0, 589, 590, 5, 108, 0, 0, 590, 610, 5, 108, 0, 0, - 591, 592, 5, 65, 0, 0, 592, 593, 5, 82, 0, 0, 593, 594, 5, 82, 0, 0, 594, - 595, 5, 65, 0, 0, 595, 596, 5, 89, 0, 0, 596, 597, 5, 95, 0, 0, 597, 598, - 5, 67, 0, 0, 598, 599, 5, 79, 0, 0, 599, 600, 5, 78, 0, 0, 600, 601, 5, - 84, 0, 0, 601, 602, 5, 65, 0, 0, 602, 603, 5, 73, 0, 0, 603, 604, 5, 78, - 0, 0, 604, 605, 5, 83, 0, 0, 605, 606, 5, 95, 0, 0, 606, 607, 5, 65, 0, - 0, 607, 608, 5, 76, 0, 0, 608, 610, 5, 76, 0, 0, 609, 573, 1, 0, 0, 0, - 609, 591, 1, 0, 0, 0, 610, 88, 1, 0, 0, 0, 611, 612, 5, 97, 0, 0, 612, - 613, 5, 114, 0, 0, 613, 614, 5, 114, 0, 0, 614, 615, 5, 97, 0, 0, 615, - 616, 5, 121, 0, 0, 616, 617, 5, 95, 0, 0, 617, 618, 5, 99, 0, 0, 618, 619, - 5, 111, 0, 0, 619, 620, 5, 110, 0, 0, 620, 621, 5, 116, 0, 0, 621, 622, - 5, 97, 0, 0, 622, 623, 5, 105, 0, 0, 623, 624, 5, 110, 0, 0, 624, 625, - 5, 115, 0, 0, 625, 626, 5, 95, 0, 0, 626, 627, 5, 97, 0, 0, 627, 628, 5, - 110, 0, 0, 628, 648, 5, 121, 0, 0, 629, 630, 5, 65, 0, 0, 630, 631, 5, - 82, 0, 0, 631, 632, 5, 82, 0, 0, 632, 633, 5, 65, 0, 0, 633, 634, 5, 89, - 0, 0, 634, 635, 5, 95, 0, 0, 635, 636, 5, 67, 0, 0, 636, 637, 5, 79, 0, - 0, 637, 638, 5, 78, 0, 0, 638, 639, 5, 84, 0, 0, 639, 640, 5, 65, 0, 0, - 640, 641, 5, 73, 0, 0, 641, 642, 5, 78, 0, 0, 642, 643, 5, 83, 0, 0, 643, - 644, 5, 95, 0, 0, 644, 645, 5, 65, 0, 0, 645, 646, 5, 78, 0, 0, 646, 648, - 5, 89, 0, 0, 647, 611, 1, 0, 0, 0, 647, 629, 1, 0, 0, 0, 648, 90, 1, 0, - 0, 0, 649, 650, 5, 97, 0, 0, 650, 651, 5, 114, 0, 0, 651, 652, 5, 114, - 0, 0, 652, 653, 5, 97, 0, 0, 653, 654, 5, 121, 0, 0, 654, 655, 5, 95, 0, - 0, 655, 656, 5, 108, 0, 0, 656, 657, 5, 101, 0, 0, 657, 658, 5, 110, 0, - 0, 658, 659, 5, 103, 0, 0, 659, 660, 5, 116, 0, 0, 660, 674, 5, 104, 0, - 0, 661, 662, 5, 65, 0, 0, 662, 663, 5, 82, 0, 0, 663, 664, 5, 82, 0, 0, - 664, 665, 5, 65, 0, 0, 665, 666, 5, 89, 0, 0, 666, 667, 5, 95, 0, 0, 667, - 668, 5, 76, 0, 0, 668, 669, 5, 69, 0, 0, 669, 670, 5, 78, 0, 0, 670, 671, - 5, 71, 0, 0, 671, 672, 5, 84, 0, 0, 672, 674, 5, 72, 0, 0, 673, 649, 1, - 0, 0, 0, 673, 661, 1, 0, 0, 0, 674, 92, 1, 0, 0, 0, 675, 676, 5, 115, 0, - 0, 676, 677, 5, 116, 0, 0, 677, 678, 5, 95, 0, 0, 678, 679, 5, 101, 0, - 0, 679, 680, 5, 113, 0, 0, 680, 681, 5, 117, 0, 0, 681, 682, 5, 97, 0, - 0, 682, 683, 5, 108, 0, 0, 683, 694, 5, 115, 0, 0, 684, 685, 5, 83, 0, - 0, 685, 686, 5, 84, 0, 0, 686, 687, 5, 95, 0, 0, 687, 688, 5, 69, 0, 0, - 688, 689, 5, 81, 0, 0, 689, 690, 5, 85, 0, 0, 690, 691, 5, 65, 0, 0, 691, - 692, 5, 76, 0, 0, 692, 694, 5, 83, 0, 0, 693, 675, 1, 0, 0, 0, 693, 684, - 1, 0, 0, 0, 694, 94, 1, 0, 0, 0, 695, 696, 5, 115, 0, 0, 696, 697, 5, 116, - 0, 0, 697, 698, 5, 95, 0, 0, 698, 699, 5, 116, 0, 0, 699, 700, 5, 111, - 0, 0, 700, 701, 5, 117, 0, 0, 701, 702, 5, 99, 0, 0, 702, 703, 5, 104, - 0, 0, 703, 704, 5, 101, 0, 0, 704, 716, 5, 115, 0, 0, 705, 706, 5, 83, - 0, 0, 706, 707, 5, 84, 0, 0, 707, 708, 5, 95, 0, 0, 708, 709, 5, 84, 0, - 0, 709, 710, 5, 79, 0, 0, 710, 711, 5, 85, 0, 0, 711, 712, 5, 67, 0, 0, - 712, 713, 5, 72, 0, 0, 713, 714, 5, 69, 0, 0, 714, 716, 5, 83, 0, 0, 715, - 695, 1, 0, 0, 0, 715, 705, 1, 0, 0, 0, 716, 96, 1, 0, 0, 0, 717, 718, 5, - 115, 0, 0, 718, 719, 5, 116, 0, 0, 719, 720, 5, 95, 0, 0, 720, 721, 5, - 111, 0, 0, 721, 722, 5, 118, 0, 0, 722, 723, 5, 101, 0, 0, 723, 724, 5, - 114, 0, 0, 724, 725, 5, 108, 0, 0, 725, 726, 5, 97, 0, 0, 726, 727, 5, - 112, 0, 0, 727, 740, 5, 115, 0, 0, 728, 729, 5, 83, 0, 0, 729, 730, 5, - 84, 0, 0, 730, 731, 5, 95, 0, 0, 731, 732, 5, 79, 0, 0, 732, 733, 5, 86, - 0, 0, 733, 734, 5, 69, 0, 0, 734, 735, 5, 82, 0, 0, 735, 736, 5, 76, 0, - 0, 736, 737, 5, 65, 0, 0, 737, 738, 5, 80, 0, 0, 738, 740, 5, 83, 0, 0, - 739, 717, 1, 0, 0, 0, 739, 728, 1, 0, 0, 0, 740, 98, 1, 0, 0, 0, 741, 742, - 5, 115, 0, 0, 742, 743, 5, 116, 0, 0, 743, 744, 5, 95, 0, 0, 744, 745, - 5, 99, 0, 0, 745, 746, 5, 114, 0, 0, 746, 747, 5, 111, 0, 0, 747, 748, - 5, 115, 0, 0, 748, 749, 5, 115, 0, 0, 749, 750, 5, 101, 0, 0, 750, 762, - 5, 115, 0, 0, 751, 752, 5, 83, 0, 0, 752, 753, 5, 84, 0, 0, 753, 754, 5, - 95, 0, 0, 754, 755, 5, 67, 0, 0, 755, 756, 5, 82, 0, 0, 756, 757, 5, 79, - 0, 0, 757, 758, 5, 83, 0, 0, 758, 759, 5, 83, 0, 0, 759, 760, 5, 69, 0, - 0, 760, 762, 5, 83, 0, 0, 761, 741, 1, 0, 0, 0, 761, 751, 1, 0, 0, 0, 762, - 100, 1, 0, 0, 0, 763, 764, 5, 115, 0, 0, 764, 765, 5, 116, 0, 0, 765, 766, - 5, 95, 0, 0, 766, 767, 5, 99, 0, 0, 767, 768, 5, 111, 0, 0, 768, 769, 5, - 110, 0, 0, 769, 770, 5, 116, 0, 0, 770, 771, 5, 97, 0, 0, 771, 772, 5, - 105, 0, 0, 772, 773, 5, 110, 0, 0, 773, 786, 5, 115, 0, 0, 774, 775, 5, - 83, 0, 0, 775, 776, 5, 84, 0, 0, 776, 777, 5, 95, 0, 0, 777, 778, 5, 67, - 0, 0, 778, 779, 5, 79, 0, 0, 779, 780, 5, 78, 0, 0, 780, 781, 5, 84, 0, - 0, 781, 782, 5, 65, 0, 0, 782, 783, 5, 73, 0, 0, 783, 784, 5, 78, 0, 0, - 784, 786, 5, 83, 0, 0, 785, 763, 1, 0, 0, 0, 785, 774, 1, 0, 0, 0, 786, - 102, 1, 0, 0, 0, 787, 788, 5, 115, 0, 0, 788, 789, 5, 116, 0, 0, 789, 790, - 5, 95, 0, 0, 790, 791, 5, 105, 0, 0, 791, 792, 5, 110, 0, 0, 792, 793, - 5, 116, 0, 0, 793, 794, 5, 101, 0, 0, 794, 795, 5, 114, 0, 0, 795, 796, - 5, 115, 0, 0, 796, 797, 5, 101, 0, 0, 797, 798, 5, 99, 0, 0, 798, 799, - 5, 116, 0, 0, 799, 814, 5, 115, 0, 0, 800, 801, 5, 83, 0, 0, 801, 802, - 5, 84, 0, 0, 802, 803, 5, 95, 0, 0, 803, 804, 5, 73, 0, 0, 804, 805, 5, - 78, 0, 0, 805, 806, 5, 84, 0, 0, 806, 807, 5, 69, 0, 0, 807, 808, 5, 82, - 0, 0, 808, 809, 5, 83, 0, 0, 809, 810, 5, 69, 0, 0, 810, 811, 5, 67, 0, - 0, 811, 812, 5, 84, 0, 0, 812, 814, 5, 83, 0, 0, 813, 787, 1, 0, 0, 0, - 813, 800, 1, 0, 0, 0, 814, 104, 1, 0, 0, 0, 815, 816, 5, 115, 0, 0, 816, - 817, 5, 116, 0, 0, 817, 818, 5, 95, 0, 0, 818, 819, 5, 119, 0, 0, 819, - 820, 5, 105, 0, 0, 820, 821, 5, 116, 0, 0, 821, 822, 5, 104, 0, 0, 822, - 823, 5, 105, 0, 0, 823, 834, 5, 110, 0, 0, 824, 825, 5, 83, 0, 0, 825, - 826, 5, 84, 0, 0, 826, 827, 5, 95, 0, 0, 827, 828, 5, 87, 0, 0, 828, 829, - 5, 73, 0, 0, 829, 830, 5, 84, 0, 0, 830, 831, 5, 72, 0, 0, 831, 832, 5, - 73, 0, 0, 832, 834, 5, 78, 0, 0, 833, 815, 1, 0, 0, 0, 833, 824, 1, 0, - 0, 0, 834, 106, 1, 0, 0, 0, 835, 836, 5, 115, 0, 0, 836, 837, 5, 116, 0, - 0, 837, 838, 5, 95, 0, 0, 838, 839, 5, 100, 0, 0, 839, 840, 5, 119, 0, - 0, 840, 841, 5, 105, 0, 0, 841, 842, 5, 116, 0, 0, 842, 843, 5, 104, 0, - 0, 843, 844, 5, 105, 0, 0, 844, 856, 5, 110, 0, 0, 845, 846, 5, 83, 0, - 0, 846, 847, 5, 84, 0, 0, 847, 848, 5, 95, 0, 0, 848, 849, 5, 68, 0, 0, - 849, 850, 5, 87, 0, 0, 850, 851, 5, 73, 0, 0, 851, 852, 5, 84, 0, 0, 852, - 853, 5, 72, 0, 0, 853, 854, 5, 73, 0, 0, 854, 856, 5, 78, 0, 0, 855, 835, - 1, 0, 0, 0, 855, 845, 1, 0, 0, 0, 856, 108, 1, 0, 0, 0, 857, 858, 5, 116, - 0, 0, 858, 859, 5, 114, 0, 0, 859, 860, 5, 117, 0, 0, 860, 885, 5, 101, - 0, 0, 861, 862, 5, 84, 0, 0, 862, 863, 5, 114, 0, 0, 863, 864, 5, 117, - 0, 0, 864, 885, 5, 101, 0, 0, 865, 866, 5, 84, 0, 0, 866, 867, 5, 82, 0, - 0, 867, 868, 5, 85, 0, 0, 868, 885, 5, 69, 0, 0, 869, 870, 5, 102, 0, 0, - 870, 871, 5, 97, 0, 0, 871, 872, 5, 108, 0, 0, 872, 873, 5, 115, 0, 0, - 873, 885, 5, 101, 0, 0, 874, 875, 5, 70, 0, 0, 875, 876, 5, 97, 0, 0, 876, - 877, 5, 108, 0, 0, 877, 878, 5, 115, 0, 0, 878, 885, 5, 101, 0, 0, 879, - 880, 5, 70, 0, 0, 880, 881, 5, 65, 0, 0, 881, 882, 5, 76, 0, 0, 882, 883, - 5, 83, 0, 0, 883, 885, 5, 69, 0, 0, 884, 857, 1, 0, 0, 0, 884, 861, 1, - 0, 0, 0, 884, 865, 1, 0, 0, 0, 884, 869, 1, 0, 0, 0, 884, 874, 1, 0, 0, - 0, 884, 879, 1, 0, 0, 0, 885, 110, 1, 0, 0, 0, 886, 891, 3, 139, 69, 0, - 887, 891, 3, 141, 70, 0, 888, 891, 3, 143, 71, 0, 889, 891, 3, 137, 68, - 0, 890, 886, 1, 0, 0, 0, 890, 887, 1, 0, 0, 0, 890, 888, 1, 0, 0, 0, 890, - 889, 1, 0, 0, 0, 891, 112, 1, 0, 0, 0, 892, 895, 3, 155, 77, 0, 893, 895, - 3, 157, 78, 0, 894, 892, 1, 0, 0, 0, 894, 893, 1, 0, 0, 0, 895, 114, 1, - 0, 0, 0, 896, 901, 3, 133, 66, 0, 897, 900, 3, 133, 66, 0, 898, 900, 3, - 135, 67, 0, 899, 897, 1, 0, 0, 0, 899, 898, 1, 0, 0, 0, 900, 903, 1, 0, - 0, 0, 901, 899, 1, 0, 0, 0, 901, 902, 1, 0, 0, 0, 902, 116, 1, 0, 0, 0, - 903, 901, 1, 0, 0, 0, 904, 905, 5, 36, 0, 0, 905, 906, 5, 109, 0, 0, 906, - 907, 5, 101, 0, 0, 907, 908, 5, 116, 0, 0, 908, 909, 5, 97, 0, 0, 909, - 118, 1, 0, 0, 0, 910, 912, 3, 123, 61, 0, 911, 910, 1, 0, 0, 0, 911, 912, - 1, 0, 0, 0, 912, 923, 1, 0, 0, 0, 913, 915, 5, 34, 0, 0, 914, 916, 3, 125, - 62, 0, 915, 914, 1, 0, 0, 0, 915, 916, 1, 0, 0, 0, 916, 917, 1, 0, 0, 0, - 917, 924, 5, 34, 0, 0, 918, 920, 5, 39, 0, 0, 919, 921, 3, 127, 63, 0, - 920, 919, 1, 0, 0, 0, 920, 921, 1, 0, 0, 0, 921, 922, 1, 0, 0, 0, 922, - 924, 5, 39, 0, 0, 923, 913, 1, 0, 0, 0, 923, 918, 1, 0, 0, 0, 924, 120, - 1, 0, 0, 0, 925, 928, 3, 115, 57, 0, 926, 928, 3, 117, 58, 0, 927, 925, - 1, 0, 0, 0, 927, 926, 1, 0, 0, 0, 928, 936, 1, 0, 0, 0, 929, 932, 5, 91, - 0, 0, 930, 933, 3, 119, 59, 0, 931, 933, 3, 139, 69, 0, 932, 930, 1, 0, - 0, 0, 932, 931, 1, 0, 0, 0, 933, 934, 1, 0, 0, 0, 934, 935, 5, 93, 0, 0, - 935, 937, 1, 0, 0, 0, 936, 929, 1, 0, 0, 0, 937, 938, 1, 0, 0, 0, 938, - 936, 1, 0, 0, 0, 938, 939, 1, 0, 0, 0, 939, 122, 1, 0, 0, 0, 940, 941, - 5, 117, 0, 0, 941, 944, 5, 56, 0, 0, 942, 944, 7, 0, 0, 0, 943, 940, 1, - 0, 0, 0, 943, 942, 1, 0, 0, 0, 944, 124, 1, 0, 0, 0, 945, 947, 3, 129, - 64, 0, 946, 945, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 946, 1, 0, 0, 0, - 948, 949, 1, 0, 0, 0, 949, 126, 1, 0, 0, 0, 950, 952, 3, 131, 65, 0, 951, - 950, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 951, 1, 0, 0, 0, 953, 954, - 1, 0, 0, 0, 954, 128, 1, 0, 0, 0, 955, 963, 8, 1, 0, 0, 956, 963, 3, 171, - 85, 0, 957, 958, 5, 92, 0, 0, 958, 963, 5, 10, 0, 0, 959, 960, 5, 92, 0, - 0, 960, 961, 5, 13, 0, 0, 961, 963, 5, 10, 0, 0, 962, 955, 1, 0, 0, 0, - 962, 956, 1, 0, 0, 0, 962, 957, 1, 0, 0, 0, 962, 959, 1, 0, 0, 0, 963, - 130, 1, 0, 0, 0, 964, 972, 8, 2, 0, 0, 965, 972, 3, 171, 85, 0, 966, 967, - 5, 92, 0, 0, 967, 972, 5, 10, 0, 0, 968, 969, 5, 92, 0, 0, 969, 970, 5, - 13, 0, 0, 970, 972, 5, 10, 0, 0, 971, 964, 1, 0, 0, 0, 971, 965, 1, 0, - 0, 0, 971, 966, 1, 0, 0, 0, 971, 968, 1, 0, 0, 0, 972, 132, 1, 0, 0, 0, - 973, 974, 7, 3, 0, 0, 974, 134, 1, 0, 0, 0, 975, 976, 7, 4, 0, 0, 976, - 136, 1, 0, 0, 0, 977, 978, 5, 48, 0, 0, 978, 980, 7, 5, 0, 0, 979, 981, - 7, 6, 0, 0, 980, 979, 1, 0, 0, 0, 981, 982, 1, 0, 0, 0, 982, 980, 1, 0, - 0, 0, 982, 983, 1, 0, 0, 0, 983, 138, 1, 0, 0, 0, 984, 988, 3, 145, 72, - 0, 985, 987, 3, 135, 67, 0, 986, 985, 1, 0, 0, 0, 987, 990, 1, 0, 0, 0, - 988, 986, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 993, 1, 0, 0, 0, 990, - 988, 1, 0, 0, 0, 991, 993, 5, 48, 0, 0, 992, 984, 1, 0, 0, 0, 992, 991, - 1, 0, 0, 0, 993, 140, 1, 0, 0, 0, 994, 998, 5, 48, 0, 0, 995, 997, 3, 147, - 73, 0, 996, 995, 1, 0, 0, 0, 997, 1000, 1, 0, 0, 0, 998, 996, 1, 0, 0, - 0, 998, 999, 1, 0, 0, 0, 999, 142, 1, 0, 0, 0, 1000, 998, 1, 0, 0, 0, 1001, - 1002, 5, 48, 0, 0, 1002, 1003, 7, 7, 0, 0, 1003, 1004, 3, 167, 83, 0, 1004, - 144, 1, 0, 0, 0, 1005, 1006, 7, 8, 0, 0, 1006, 146, 1, 0, 0, 0, 1007, 1008, - 7, 9, 0, 0, 1008, 148, 1, 0, 0, 0, 1009, 1010, 7, 10, 0, 0, 1010, 150, - 1, 0, 0, 0, 1011, 1012, 3, 149, 74, 0, 1012, 1013, 3, 149, 74, 0, 1013, - 1014, 3, 149, 74, 0, 1014, 1015, 3, 149, 74, 0, 1015, 152, 1, 0, 0, 0, - 1016, 1017, 5, 92, 0, 0, 1017, 1018, 5, 117, 0, 0, 1018, 1019, 1, 0, 0, - 0, 1019, 1027, 3, 151, 75, 0, 1020, 1021, 5, 92, 0, 0, 1021, 1022, 5, 85, - 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 3, 151, 75, 0, 1024, 1025, 3, - 151, 75, 0, 1025, 1027, 1, 0, 0, 0, 1026, 1016, 1, 0, 0, 0, 1026, 1020, - 1, 0, 0, 0, 1027, 154, 1, 0, 0, 0, 1028, 1030, 3, 159, 79, 0, 1029, 1031, - 3, 161, 80, 0, 1030, 1029, 1, 0, 0, 0, 1030, 1031, 1, 0, 0, 0, 1031, 1036, - 1, 0, 0, 0, 1032, 1033, 3, 163, 81, 0, 1033, 1034, 3, 161, 80, 0, 1034, - 1036, 1, 0, 0, 0, 1035, 1028, 1, 0, 0, 0, 1035, 1032, 1, 0, 0, 0, 1036, - 156, 1, 0, 0, 0, 1037, 1038, 5, 48, 0, 0, 1038, 1041, 7, 7, 0, 0, 1039, - 1042, 3, 165, 82, 0, 1040, 1042, 3, 167, 83, 0, 1041, 1039, 1, 0, 0, 0, - 1041, 1040, 1, 0, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1044, 3, 169, 84, - 0, 1044, 158, 1, 0, 0, 0, 1045, 1047, 3, 163, 81, 0, 1046, 1045, 1, 0, - 0, 0, 1046, 1047, 1, 0, 0, 0, 1047, 1048, 1, 0, 0, 0, 1048, 1049, 5, 46, - 0, 0, 1049, 1054, 3, 163, 81, 0, 1050, 1051, 3, 163, 81, 0, 1051, 1052, - 5, 46, 0, 0, 1052, 1054, 1, 0, 0, 0, 1053, 1046, 1, 0, 0, 0, 1053, 1050, - 1, 0, 0, 0, 1054, 160, 1, 0, 0, 0, 1055, 1057, 7, 11, 0, 0, 1056, 1058, - 7, 12, 0, 0, 1057, 1056, 1, 0, 0, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, - 1, 0, 0, 0, 1059, 1060, 3, 163, 81, 0, 1060, 162, 1, 0, 0, 0, 1061, 1063, - 3, 135, 67, 0, 1062, 1061, 1, 0, 0, 0, 1063, 1064, 1, 0, 0, 0, 1064, 1062, - 1, 0, 0, 0, 1064, 1065, 1, 0, 0, 0, 1065, 164, 1, 0, 0, 0, 1066, 1068, - 3, 167, 83, 0, 1067, 1066, 1, 0, 0, 0, 1067, 1068, 1, 0, 0, 0, 1068, 1069, - 1, 0, 0, 0, 1069, 1070, 5, 46, 0, 0, 1070, 1075, 3, 167, 83, 0, 1071, 1072, - 3, 167, 83, 0, 1072, 1073, 5, 46, 0, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1067, - 1, 0, 0, 0, 1074, 1071, 1, 0, 0, 0, 1075, 166, 1, 0, 0, 0, 1076, 1078, - 3, 149, 74, 0, 1077, 1076, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1077, - 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 168, 1, 0, 0, 0, 1081, 1083, - 7, 13, 0, 0, 1082, 1084, 7, 12, 0, 0, 1083, 1082, 1, 0, 0, 0, 1083, 1084, - 1, 0, 0, 0, 1084, 1085, 1, 0, 0, 0, 1085, 1086, 3, 163, 81, 0, 1086, 170, - 1, 0, 0, 0, 1087, 1088, 5, 92, 0, 0, 1088, 1103, 7, 14, 0, 0, 1089, 1090, - 5, 92, 0, 0, 1090, 1092, 3, 147, 73, 0, 1091, 1093, 3, 147, 73, 0, 1092, - 1091, 1, 0, 0, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1095, 1, 0, 0, 0, 1094, - 1096, 3, 147, 73, 0, 1095, 1094, 1, 0, 0, 0, 1095, 1096, 1, 0, 0, 0, 1096, - 1103, 1, 0, 0, 0, 1097, 1098, 5, 92, 0, 0, 1098, 1099, 5, 120, 0, 0, 1099, - 1100, 1, 0, 0, 0, 1100, 1103, 3, 167, 83, 0, 1101, 1103, 3, 153, 76, 0, - 1102, 1087, 1, 0, 0, 0, 1102, 1089, 1, 0, 0, 0, 1102, 1097, 1, 0, 0, 0, - 1102, 1101, 1, 0, 0, 0, 1103, 172, 1, 0, 0, 0, 1104, 1106, 7, 15, 0, 0, - 1105, 1104, 1, 0, 0, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1105, 1, 0, 0, 0, - 1107, 1108, 1, 0, 0, 0, 1108, 1109, 1, 0, 0, 0, 1109, 1110, 6, 86, 0, 0, - 1110, 174, 1, 0, 0, 0, 1111, 1113, 5, 13, 0, 0, 1112, 1114, 5, 10, 0, 0, - 1113, 1112, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1117, 1, 0, 0, 0, - 1115, 1117, 5, 10, 0, 0, 1116, 1111, 1, 0, 0, 0, 1116, 1115, 1, 0, 0, 0, - 1117, 1118, 1, 0, 0, 0, 1118, 1119, 6, 87, 0, 0, 1119, 176, 1, 0, 0, 0, - 70, 0, 215, 229, 251, 277, 305, 323, 331, 366, 374, 390, 414, 425, 431, - 436, 438, 469, 505, 541, 571, 609, 647, 673, 693, 715, 739, 761, 785, 813, - 833, 855, 884, 890, 894, 899, 901, 911, 915, 920, 923, 927, 932, 938, 943, - 948, 953, 962, 971, 982, 988, 992, 998, 1026, 1030, 1035, 1041, 1046, 1053, - 1057, 1064, 1067, 1074, 1079, 1083, 1092, 1095, 1102, 1107, 1113, 1116, - 1, 6, 0, 0, + 0, 159, 0, 161, 0, 163, 0, 165, 0, 167, 0, 169, 0, 171, 0, 173, 0, 175, + 0, 177, 64, 179, 65, 1, 0, 16, 3, 0, 76, 76, 85, 85, 117, 117, 4, 0, 10, + 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 3, 0, + 65, 90, 95, 95, 97, 122, 1, 0, 48, 57, 2, 0, 66, 66, 98, 98, 1, 0, 48, + 49, 2, 0, 88, 88, 120, 120, 1, 0, 49, 57, 1, 0, 48, 55, 3, 0, 48, 57, 65, + 70, 97, 102, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 2, 0, 80, 80, + 112, 112, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 97, 98, 102, 102, 110, + 110, 114, 114, 116, 116, 118, 118, 2, 0, 9, 9, 32, 32, 1227, 0, 1, 1, 0, + 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, + 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, + 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, + 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, + 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, + 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, + 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, + 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, + 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, + 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, + 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, + 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, + 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, + 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, + 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, + 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, + 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, + 1, 181, 1, 0, 0, 0, 3, 183, 1, 0, 0, 0, 5, 185, 1, 0, 0, 0, 7, 187, 1, + 0, 0, 0, 9, 189, 1, 0, 0, 0, 11, 191, 1, 0, 0, 0, 13, 193, 1, 0, 0, 0, + 15, 195, 1, 0, 0, 0, 17, 197, 1, 0, 0, 0, 19, 200, 1, 0, 0, 0, 21, 202, + 1, 0, 0, 0, 23, 205, 1, 0, 0, 0, 25, 208, 1, 0, 0, 0, 27, 219, 1, 0, 0, + 0, 29, 233, 1, 0, 0, 0, 31, 255, 1, 0, 0, 0, 33, 281, 1, 0, 0, 0, 35, 309, + 1, 0, 0, 0, 37, 327, 1, 0, 0, 0, 39, 335, 1, 0, 0, 0, 41, 377, 1, 0, 0, + 0, 43, 379, 1, 0, 0, 0, 45, 381, 1, 0, 0, 0, 47, 383, 1, 0, 0, 0, 49, 385, + 1, 0, 0, 0, 51, 387, 1, 0, 0, 0, 53, 389, 1, 0, 0, 0, 55, 391, 1, 0, 0, + 0, 57, 394, 1, 0, 0, 0, 59, 397, 1, 0, 0, 0, 61, 400, 1, 0, 0, 0, 63, 402, + 1, 0, 0, 0, 65, 404, 1, 0, 0, 0, 67, 414, 1, 0, 0, 0, 69, 422, 1, 0, 0, + 0, 71, 438, 1, 0, 0, 0, 73, 462, 1, 0, 0, 0, 75, 464, 1, 0, 0, 0, 77, 473, + 1, 0, 0, 0, 79, 479, 1, 0, 0, 0, 81, 481, 1, 0, 0, 0, 83, 517, 1, 0, 0, + 0, 85, 553, 1, 0, 0, 0, 87, 589, 1, 0, 0, 0, 89, 619, 1, 0, 0, 0, 91, 657, + 1, 0, 0, 0, 93, 695, 1, 0, 0, 0, 95, 721, 1, 0, 0, 0, 97, 741, 1, 0, 0, + 0, 99, 763, 1, 0, 0, 0, 101, 787, 1, 0, 0, 0, 103, 809, 1, 0, 0, 0, 105, + 833, 1, 0, 0, 0, 107, 861, 1, 0, 0, 0, 109, 881, 1, 0, 0, 0, 111, 903, + 1, 0, 0, 0, 113, 932, 1, 0, 0, 0, 115, 938, 1, 0, 0, 0, 117, 942, 1, 0, + 0, 0, 119, 944, 1, 0, 0, 0, 121, 952, 1, 0, 0, 0, 123, 959, 1, 0, 0, 0, + 125, 975, 1, 0, 0, 0, 127, 991, 1, 0, 0, 0, 129, 994, 1, 0, 0, 0, 131, + 999, 1, 0, 0, 0, 133, 1010, 1, 0, 0, 0, 135, 1019, 1, 0, 0, 0, 137, 1021, + 1, 0, 0, 0, 139, 1023, 1, 0, 0, 0, 141, 1025, 1, 0, 0, 0, 143, 1040, 1, + 0, 0, 0, 145, 1042, 1, 0, 0, 0, 147, 1049, 1, 0, 0, 0, 149, 1053, 1, 0, + 0, 0, 151, 1055, 1, 0, 0, 0, 153, 1057, 1, 0, 0, 0, 155, 1059, 1, 0, 0, + 0, 157, 1074, 1, 0, 0, 0, 159, 1083, 1, 0, 0, 0, 161, 1085, 1, 0, 0, 0, + 163, 1101, 1, 0, 0, 0, 165, 1103, 1, 0, 0, 0, 167, 1110, 1, 0, 0, 0, 169, + 1122, 1, 0, 0, 0, 171, 1125, 1, 0, 0, 0, 173, 1129, 1, 0, 0, 0, 175, 1150, + 1, 0, 0, 0, 177, 1153, 1, 0, 0, 0, 179, 1164, 1, 0, 0, 0, 181, 182, 5, + 40, 0, 0, 182, 2, 1, 0, 0, 0, 183, 184, 5, 41, 0, 0, 184, 4, 1, 0, 0, 0, + 185, 186, 5, 91, 0, 0, 186, 6, 1, 0, 0, 0, 187, 188, 5, 44, 0, 0, 188, + 8, 1, 0, 0, 0, 189, 190, 5, 93, 0, 0, 190, 10, 1, 0, 0, 0, 191, 192, 5, + 123, 0, 0, 192, 12, 1, 0, 0, 0, 193, 194, 5, 125, 0, 0, 194, 14, 1, 0, + 0, 0, 195, 196, 5, 60, 0, 0, 196, 16, 1, 0, 0, 0, 197, 198, 5, 60, 0, 0, + 198, 199, 5, 61, 0, 0, 199, 18, 1, 0, 0, 0, 200, 201, 5, 62, 0, 0, 201, + 20, 1, 0, 0, 0, 202, 203, 5, 62, 0, 0, 203, 204, 5, 61, 0, 0, 204, 22, + 1, 0, 0, 0, 205, 206, 5, 61, 0, 0, 206, 207, 5, 61, 0, 0, 207, 24, 1, 0, + 0, 0, 208, 209, 5, 33, 0, 0, 209, 210, 5, 61, 0, 0, 210, 26, 1, 0, 0, 0, + 211, 212, 5, 108, 0, 0, 212, 213, 5, 105, 0, 0, 213, 214, 5, 107, 0, 0, + 214, 220, 5, 101, 0, 0, 215, 216, 5, 76, 0, 0, 216, 217, 5, 73, 0, 0, 217, + 218, 5, 75, 0, 0, 218, 220, 5, 69, 0, 0, 219, 211, 1, 0, 0, 0, 219, 215, + 1, 0, 0, 0, 220, 28, 1, 0, 0, 0, 221, 222, 5, 101, 0, 0, 222, 223, 5, 120, + 0, 0, 223, 224, 5, 105, 0, 0, 224, 225, 5, 115, 0, 0, 225, 226, 5, 116, + 0, 0, 226, 234, 5, 115, 0, 0, 227, 228, 5, 69, 0, 0, 228, 229, 5, 88, 0, + 0, 229, 230, 5, 73, 0, 0, 230, 231, 5, 83, 0, 0, 231, 232, 5, 84, 0, 0, + 232, 234, 5, 83, 0, 0, 233, 221, 1, 0, 0, 0, 233, 227, 1, 0, 0, 0, 234, + 30, 1, 0, 0, 0, 235, 236, 5, 116, 0, 0, 236, 237, 5, 101, 0, 0, 237, 238, + 5, 120, 0, 0, 238, 239, 5, 116, 0, 0, 239, 240, 5, 95, 0, 0, 240, 241, + 5, 109, 0, 0, 241, 242, 5, 97, 0, 0, 242, 243, 5, 116, 0, 0, 243, 244, + 5, 99, 0, 0, 244, 256, 5, 104, 0, 0, 245, 246, 5, 84, 0, 0, 246, 247, 5, + 69, 0, 0, 247, 248, 5, 88, 0, 0, 248, 249, 5, 84, 0, 0, 249, 250, 5, 95, + 0, 0, 250, 251, 5, 77, 0, 0, 251, 252, 5, 65, 0, 0, 252, 253, 5, 84, 0, + 0, 253, 254, 5, 67, 0, 0, 254, 256, 5, 72, 0, 0, 255, 235, 1, 0, 0, 0, + 255, 245, 1, 0, 0, 0, 256, 32, 1, 0, 0, 0, 257, 258, 5, 112, 0, 0, 258, + 259, 5, 104, 0, 0, 259, 260, 5, 114, 0, 0, 260, 261, 5, 97, 0, 0, 261, + 262, 5, 115, 0, 0, 262, 263, 5, 101, 0, 0, 263, 264, 5, 95, 0, 0, 264, + 265, 5, 109, 0, 0, 265, 266, 5, 97, 0, 0, 266, 267, 5, 116, 0, 0, 267, + 268, 5, 99, 0, 0, 268, 282, 5, 104, 0, 0, 269, 270, 5, 80, 0, 0, 270, 271, + 5, 72, 0, 0, 271, 272, 5, 82, 0, 0, 272, 273, 5, 65, 0, 0, 273, 274, 5, + 83, 0, 0, 274, 275, 5, 69, 0, 0, 275, 276, 5, 95, 0, 0, 276, 277, 5, 77, + 0, 0, 277, 278, 5, 65, 0, 0, 278, 279, 5, 84, 0, 0, 279, 280, 5, 67, 0, + 0, 280, 282, 5, 72, 0, 0, 281, 257, 1, 0, 0, 0, 281, 269, 1, 0, 0, 0, 282, + 34, 1, 0, 0, 0, 283, 284, 5, 114, 0, 0, 284, 285, 5, 97, 0, 0, 285, 286, + 5, 110, 0, 0, 286, 287, 5, 100, 0, 0, 287, 288, 5, 111, 0, 0, 288, 289, + 5, 109, 0, 0, 289, 290, 5, 95, 0, 0, 290, 291, 5, 115, 0, 0, 291, 292, + 5, 97, 0, 0, 292, 293, 5, 109, 0, 0, 293, 294, 5, 112, 0, 0, 294, 295, + 5, 108, 0, 0, 295, 310, 5, 101, 0, 0, 296, 297, 5, 82, 0, 0, 297, 298, + 5, 65, 0, 0, 298, 299, 5, 78, 0, 0, 299, 300, 5, 68, 0, 0, 300, 301, 5, + 79, 0, 0, 301, 302, 5, 77, 0, 0, 302, 303, 5, 95, 0, 0, 303, 304, 5, 83, + 0, 0, 304, 305, 5, 65, 0, 0, 305, 306, 5, 77, 0, 0, 306, 307, 5, 80, 0, + 0, 307, 308, 5, 76, 0, 0, 308, 310, 5, 69, 0, 0, 309, 283, 1, 0, 0, 0, + 309, 296, 1, 0, 0, 0, 310, 36, 1, 0, 0, 0, 311, 312, 5, 105, 0, 0, 312, + 313, 5, 110, 0, 0, 313, 314, 5, 116, 0, 0, 314, 315, 5, 101, 0, 0, 315, + 316, 5, 114, 0, 0, 316, 317, 5, 118, 0, 0, 317, 318, 5, 97, 0, 0, 318, + 328, 5, 108, 0, 0, 319, 320, 5, 73, 0, 0, 320, 321, 5, 78, 0, 0, 321, 322, + 5, 84, 0, 0, 322, 323, 5, 69, 0, 0, 323, 324, 5, 82, 0, 0, 324, 325, 5, + 86, 0, 0, 325, 326, 5, 65, 0, 0, 326, 328, 5, 76, 0, 0, 327, 311, 1, 0, + 0, 0, 327, 319, 1, 0, 0, 0, 328, 38, 1, 0, 0, 0, 329, 330, 5, 105, 0, 0, + 330, 331, 5, 115, 0, 0, 331, 336, 5, 111, 0, 0, 332, 333, 5, 73, 0, 0, + 333, 334, 5, 83, 0, 0, 334, 336, 5, 79, 0, 0, 335, 329, 1, 0, 0, 0, 335, + 332, 1, 0, 0, 0, 336, 40, 1, 0, 0, 0, 337, 338, 5, 109, 0, 0, 338, 339, + 5, 105, 0, 0, 339, 340, 5, 110, 0, 0, 340, 341, 5, 105, 0, 0, 341, 342, + 5, 109, 0, 0, 342, 343, 5, 117, 0, 0, 343, 344, 5, 109, 0, 0, 344, 345, + 5, 95, 0, 0, 345, 346, 5, 115, 0, 0, 346, 347, 5, 104, 0, 0, 347, 348, + 5, 111, 0, 0, 348, 349, 5, 117, 0, 0, 349, 350, 5, 108, 0, 0, 350, 351, + 5, 100, 0, 0, 351, 352, 5, 95, 0, 0, 352, 353, 5, 109, 0, 0, 353, 354, + 5, 97, 0, 0, 354, 355, 5, 116, 0, 0, 355, 356, 5, 99, 0, 0, 356, 378, 5, + 104, 0, 0, 357, 358, 5, 77, 0, 0, 358, 359, 5, 73, 0, 0, 359, 360, 5, 78, + 0, 0, 360, 361, 5, 73, 0, 0, 361, 362, 5, 77, 0, 0, 362, 363, 5, 85, 0, + 0, 363, 364, 5, 77, 0, 0, 364, 365, 5, 95, 0, 0, 365, 366, 5, 83, 0, 0, + 366, 367, 5, 72, 0, 0, 367, 368, 5, 79, 0, 0, 368, 369, 5, 85, 0, 0, 369, + 370, 5, 76, 0, 0, 370, 371, 5, 68, 0, 0, 371, 372, 5, 95, 0, 0, 372, 373, + 5, 77, 0, 0, 373, 374, 5, 65, 0, 0, 374, 375, 5, 84, 0, 0, 375, 376, 5, + 67, 0, 0, 376, 378, 5, 72, 0, 0, 377, 337, 1, 0, 0, 0, 377, 357, 1, 0, + 0, 0, 378, 42, 1, 0, 0, 0, 379, 380, 5, 61, 0, 0, 380, 44, 1, 0, 0, 0, + 381, 382, 5, 43, 0, 0, 382, 46, 1, 0, 0, 0, 383, 384, 5, 45, 0, 0, 384, + 48, 1, 0, 0, 0, 385, 386, 5, 42, 0, 0, 386, 50, 1, 0, 0, 0, 387, 388, 5, + 47, 0, 0, 388, 52, 1, 0, 0, 0, 389, 390, 5, 37, 0, 0, 390, 54, 1, 0, 0, + 0, 391, 392, 5, 42, 0, 0, 392, 393, 5, 42, 0, 0, 393, 56, 1, 0, 0, 0, 394, + 395, 5, 60, 0, 0, 395, 396, 5, 60, 0, 0, 396, 58, 1, 0, 0, 0, 397, 398, + 5, 62, 0, 0, 398, 399, 5, 62, 0, 0, 399, 60, 1, 0, 0, 0, 400, 401, 5, 38, + 0, 0, 401, 62, 1, 0, 0, 0, 402, 403, 5, 124, 0, 0, 403, 64, 1, 0, 0, 0, + 404, 405, 5, 94, 0, 0, 405, 66, 1, 0, 0, 0, 406, 407, 5, 38, 0, 0, 407, + 415, 5, 38, 0, 0, 408, 409, 5, 97, 0, 0, 409, 410, 5, 110, 0, 0, 410, 415, + 5, 100, 0, 0, 411, 412, 5, 65, 0, 0, 412, 413, 5, 78, 0, 0, 413, 415, 5, + 68, 0, 0, 414, 406, 1, 0, 0, 0, 414, 408, 1, 0, 0, 0, 414, 411, 1, 0, 0, + 0, 415, 68, 1, 0, 0, 0, 416, 417, 5, 124, 0, 0, 417, 423, 5, 124, 0, 0, + 418, 419, 5, 111, 0, 0, 419, 423, 5, 114, 0, 0, 420, 421, 5, 79, 0, 0, + 421, 423, 5, 82, 0, 0, 422, 416, 1, 0, 0, 0, 422, 418, 1, 0, 0, 0, 422, + 420, 1, 0, 0, 0, 423, 70, 1, 0, 0, 0, 424, 425, 5, 105, 0, 0, 425, 426, + 5, 115, 0, 0, 426, 427, 5, 32, 0, 0, 427, 428, 5, 110, 0, 0, 428, 429, + 5, 117, 0, 0, 429, 430, 5, 108, 0, 0, 430, 439, 5, 108, 0, 0, 431, 432, + 5, 73, 0, 0, 432, 433, 5, 83, 0, 0, 433, 434, 5, 32, 0, 0, 434, 435, 5, + 78, 0, 0, 435, 436, 5, 85, 0, 0, 436, 437, 5, 76, 0, 0, 437, 439, 5, 76, + 0, 0, 438, 424, 1, 0, 0, 0, 438, 431, 1, 0, 0, 0, 439, 72, 1, 0, 0, 0, + 440, 441, 5, 105, 0, 0, 441, 442, 5, 115, 0, 0, 442, 443, 5, 32, 0, 0, + 443, 444, 5, 110, 0, 0, 444, 445, 5, 111, 0, 0, 445, 446, 5, 116, 0, 0, + 446, 447, 5, 32, 0, 0, 447, 448, 5, 110, 0, 0, 448, 449, 5, 117, 0, 0, + 449, 450, 5, 108, 0, 0, 450, 463, 5, 108, 0, 0, 451, 452, 5, 73, 0, 0, + 452, 453, 5, 83, 0, 0, 453, 454, 5, 32, 0, 0, 454, 455, 5, 78, 0, 0, 455, + 456, 5, 79, 0, 0, 456, 457, 5, 84, 0, 0, 457, 458, 5, 32, 0, 0, 458, 459, + 5, 78, 0, 0, 459, 460, 5, 85, 0, 0, 460, 461, 5, 76, 0, 0, 461, 463, 5, + 76, 0, 0, 462, 440, 1, 0, 0, 0, 462, 451, 1, 0, 0, 0, 463, 74, 1, 0, 0, + 0, 464, 465, 5, 126, 0, 0, 465, 76, 1, 0, 0, 0, 466, 474, 5, 33, 0, 0, + 467, 468, 5, 110, 0, 0, 468, 469, 5, 111, 0, 0, 469, 474, 5, 116, 0, 0, + 470, 471, 5, 78, 0, 0, 471, 472, 5, 79, 0, 0, 472, 474, 5, 84, 0, 0, 473, + 466, 1, 0, 0, 0, 473, 467, 1, 0, 0, 0, 473, 470, 1, 0, 0, 0, 474, 78, 1, + 0, 0, 0, 475, 476, 5, 105, 0, 0, 476, 480, 5, 110, 0, 0, 477, 478, 5, 73, + 0, 0, 478, 480, 5, 78, 0, 0, 479, 475, 1, 0, 0, 0, 479, 477, 1, 0, 0, 0, + 480, 80, 1, 0, 0, 0, 481, 486, 5, 91, 0, 0, 482, 485, 3, 177, 88, 0, 483, + 485, 3, 179, 89, 0, 484, 482, 1, 0, 0, 0, 484, 483, 1, 0, 0, 0, 485, 488, + 1, 0, 0, 0, 486, 484, 1, 0, 0, 0, 486, 487, 1, 0, 0, 0, 487, 489, 1, 0, + 0, 0, 488, 486, 1, 0, 0, 0, 489, 490, 5, 93, 0, 0, 490, 82, 1, 0, 0, 0, + 491, 492, 5, 106, 0, 0, 492, 493, 5, 115, 0, 0, 493, 494, 5, 111, 0, 0, + 494, 495, 5, 110, 0, 0, 495, 496, 5, 95, 0, 0, 496, 497, 5, 99, 0, 0, 497, + 498, 5, 111, 0, 0, 498, 499, 5, 110, 0, 0, 499, 500, 5, 116, 0, 0, 500, + 501, 5, 97, 0, 0, 501, 502, 5, 105, 0, 0, 502, 503, 5, 110, 0, 0, 503, + 518, 5, 115, 0, 0, 504, 505, 5, 74, 0, 0, 505, 506, 5, 83, 0, 0, 506, 507, + 5, 79, 0, 0, 507, 508, 5, 78, 0, 0, 508, 509, 5, 95, 0, 0, 509, 510, 5, + 67, 0, 0, 510, 511, 5, 79, 0, 0, 511, 512, 5, 78, 0, 0, 512, 513, 5, 84, + 0, 0, 513, 514, 5, 65, 0, 0, 514, 515, 5, 73, 0, 0, 515, 516, 5, 78, 0, + 0, 516, 518, 5, 83, 0, 0, 517, 491, 1, 0, 0, 0, 517, 504, 1, 0, 0, 0, 518, + 84, 1, 0, 0, 0, 519, 520, 5, 106, 0, 0, 520, 521, 5, 115, 0, 0, 521, 522, + 5, 111, 0, 0, 522, 523, 5, 110, 0, 0, 523, 524, 5, 95, 0, 0, 524, 525, + 5, 99, 0, 0, 525, 526, 5, 111, 0, 0, 526, 527, 5, 110, 0, 0, 527, 528, + 5, 116, 0, 0, 528, 529, 5, 97, 0, 0, 529, 530, 5, 105, 0, 0, 530, 531, + 5, 110, 0, 0, 531, 532, 5, 115, 0, 0, 532, 533, 5, 95, 0, 0, 533, 534, + 5, 97, 0, 0, 534, 535, 5, 108, 0, 0, 535, 554, 5, 108, 0, 0, 536, 537, + 5, 74, 0, 0, 537, 538, 5, 83, 0, 0, 538, 539, 5, 79, 0, 0, 539, 540, 5, + 78, 0, 0, 540, 541, 5, 95, 0, 0, 541, 542, 5, 67, 0, 0, 542, 543, 5, 79, + 0, 0, 543, 544, 5, 78, 0, 0, 544, 545, 5, 84, 0, 0, 545, 546, 5, 65, 0, + 0, 546, 547, 5, 73, 0, 0, 547, 548, 5, 78, 0, 0, 548, 549, 5, 83, 0, 0, + 549, 550, 5, 95, 0, 0, 550, 551, 5, 65, 0, 0, 551, 552, 5, 76, 0, 0, 552, + 554, 5, 76, 0, 0, 553, 519, 1, 0, 0, 0, 553, 536, 1, 0, 0, 0, 554, 86, + 1, 0, 0, 0, 555, 556, 5, 106, 0, 0, 556, 557, 5, 115, 0, 0, 557, 558, 5, + 111, 0, 0, 558, 559, 5, 110, 0, 0, 559, 560, 5, 95, 0, 0, 560, 561, 5, + 99, 0, 0, 561, 562, 5, 111, 0, 0, 562, 563, 5, 110, 0, 0, 563, 564, 5, + 116, 0, 0, 564, 565, 5, 97, 0, 0, 565, 566, 5, 105, 0, 0, 566, 567, 5, + 110, 0, 0, 567, 568, 5, 115, 0, 0, 568, 569, 5, 95, 0, 0, 569, 570, 5, + 97, 0, 0, 570, 571, 5, 110, 0, 0, 571, 590, 5, 121, 0, 0, 572, 573, 5, + 74, 0, 0, 573, 574, 5, 83, 0, 0, 574, 575, 5, 79, 0, 0, 575, 576, 5, 78, + 0, 0, 576, 577, 5, 95, 0, 0, 577, 578, 5, 67, 0, 0, 578, 579, 5, 79, 0, + 0, 579, 580, 5, 78, 0, 0, 580, 581, 5, 84, 0, 0, 581, 582, 5, 65, 0, 0, + 582, 583, 5, 73, 0, 0, 583, 584, 5, 78, 0, 0, 584, 585, 5, 83, 0, 0, 585, + 586, 5, 95, 0, 0, 586, 587, 5, 65, 0, 0, 587, 588, 5, 78, 0, 0, 588, 590, + 5, 89, 0, 0, 589, 555, 1, 0, 0, 0, 589, 572, 1, 0, 0, 0, 590, 88, 1, 0, + 0, 0, 591, 592, 5, 97, 0, 0, 592, 593, 5, 114, 0, 0, 593, 594, 5, 114, + 0, 0, 594, 595, 5, 97, 0, 0, 595, 596, 5, 121, 0, 0, 596, 597, 5, 95, 0, + 0, 597, 598, 5, 99, 0, 0, 598, 599, 5, 111, 0, 0, 599, 600, 5, 110, 0, + 0, 600, 601, 5, 116, 0, 0, 601, 602, 5, 97, 0, 0, 602, 603, 5, 105, 0, + 0, 603, 604, 5, 110, 0, 0, 604, 620, 5, 115, 0, 0, 605, 606, 5, 65, 0, + 0, 606, 607, 5, 82, 0, 0, 607, 608, 5, 82, 0, 0, 608, 609, 5, 65, 0, 0, + 609, 610, 5, 89, 0, 0, 610, 611, 5, 95, 0, 0, 611, 612, 5, 67, 0, 0, 612, + 613, 5, 79, 0, 0, 613, 614, 5, 78, 0, 0, 614, 615, 5, 84, 0, 0, 615, 616, + 5, 65, 0, 0, 616, 617, 5, 73, 0, 0, 617, 618, 5, 78, 0, 0, 618, 620, 5, + 83, 0, 0, 619, 591, 1, 0, 0, 0, 619, 605, 1, 0, 0, 0, 620, 90, 1, 0, 0, + 0, 621, 622, 5, 97, 0, 0, 622, 623, 5, 114, 0, 0, 623, 624, 5, 114, 0, + 0, 624, 625, 5, 97, 0, 0, 625, 626, 5, 121, 0, 0, 626, 627, 5, 95, 0, 0, + 627, 628, 5, 99, 0, 0, 628, 629, 5, 111, 0, 0, 629, 630, 5, 110, 0, 0, + 630, 631, 5, 116, 0, 0, 631, 632, 5, 97, 0, 0, 632, 633, 5, 105, 0, 0, + 633, 634, 5, 110, 0, 0, 634, 635, 5, 115, 0, 0, 635, 636, 5, 95, 0, 0, + 636, 637, 5, 97, 0, 0, 637, 638, 5, 108, 0, 0, 638, 658, 5, 108, 0, 0, + 639, 640, 5, 65, 0, 0, 640, 641, 5, 82, 0, 0, 641, 642, 5, 82, 0, 0, 642, + 643, 5, 65, 0, 0, 643, 644, 5, 89, 0, 0, 644, 645, 5, 95, 0, 0, 645, 646, + 5, 67, 0, 0, 646, 647, 5, 79, 0, 0, 647, 648, 5, 78, 0, 0, 648, 649, 5, + 84, 0, 0, 649, 650, 5, 65, 0, 0, 650, 651, 5, 73, 0, 0, 651, 652, 5, 78, + 0, 0, 652, 653, 5, 83, 0, 0, 653, 654, 5, 95, 0, 0, 654, 655, 5, 65, 0, + 0, 655, 656, 5, 76, 0, 0, 656, 658, 5, 76, 0, 0, 657, 621, 1, 0, 0, 0, + 657, 639, 1, 0, 0, 0, 658, 92, 1, 0, 0, 0, 659, 660, 5, 97, 0, 0, 660, + 661, 5, 114, 0, 0, 661, 662, 5, 114, 0, 0, 662, 663, 5, 97, 0, 0, 663, + 664, 5, 121, 0, 0, 664, 665, 5, 95, 0, 0, 665, 666, 5, 99, 0, 0, 666, 667, + 5, 111, 0, 0, 667, 668, 5, 110, 0, 0, 668, 669, 5, 116, 0, 0, 669, 670, + 5, 97, 0, 0, 670, 671, 5, 105, 0, 0, 671, 672, 5, 110, 0, 0, 672, 673, + 5, 115, 0, 0, 673, 674, 5, 95, 0, 0, 674, 675, 5, 97, 0, 0, 675, 676, 5, + 110, 0, 0, 676, 696, 5, 121, 0, 0, 677, 678, 5, 65, 0, 0, 678, 679, 5, + 82, 0, 0, 679, 680, 5, 82, 0, 0, 680, 681, 5, 65, 0, 0, 681, 682, 5, 89, + 0, 0, 682, 683, 5, 95, 0, 0, 683, 684, 5, 67, 0, 0, 684, 685, 5, 79, 0, + 0, 685, 686, 5, 78, 0, 0, 686, 687, 5, 84, 0, 0, 687, 688, 5, 65, 0, 0, + 688, 689, 5, 73, 0, 0, 689, 690, 5, 78, 0, 0, 690, 691, 5, 83, 0, 0, 691, + 692, 5, 95, 0, 0, 692, 693, 5, 65, 0, 0, 693, 694, 5, 78, 0, 0, 694, 696, + 5, 89, 0, 0, 695, 659, 1, 0, 0, 0, 695, 677, 1, 0, 0, 0, 696, 94, 1, 0, + 0, 0, 697, 698, 5, 97, 0, 0, 698, 699, 5, 114, 0, 0, 699, 700, 5, 114, + 0, 0, 700, 701, 5, 97, 0, 0, 701, 702, 5, 121, 0, 0, 702, 703, 5, 95, 0, + 0, 703, 704, 5, 108, 0, 0, 704, 705, 5, 101, 0, 0, 705, 706, 5, 110, 0, + 0, 706, 707, 5, 103, 0, 0, 707, 708, 5, 116, 0, 0, 708, 722, 5, 104, 0, + 0, 709, 710, 5, 65, 0, 0, 710, 711, 5, 82, 0, 0, 711, 712, 5, 82, 0, 0, + 712, 713, 5, 65, 0, 0, 713, 714, 5, 89, 0, 0, 714, 715, 5, 95, 0, 0, 715, + 716, 5, 76, 0, 0, 716, 717, 5, 69, 0, 0, 717, 718, 5, 78, 0, 0, 718, 719, + 5, 71, 0, 0, 719, 720, 5, 84, 0, 0, 720, 722, 5, 72, 0, 0, 721, 697, 1, + 0, 0, 0, 721, 709, 1, 0, 0, 0, 722, 96, 1, 0, 0, 0, 723, 724, 5, 115, 0, + 0, 724, 725, 5, 116, 0, 0, 725, 726, 5, 95, 0, 0, 726, 727, 5, 101, 0, + 0, 727, 728, 5, 113, 0, 0, 728, 729, 5, 117, 0, 0, 729, 730, 5, 97, 0, + 0, 730, 731, 5, 108, 0, 0, 731, 742, 5, 115, 0, 0, 732, 733, 5, 83, 0, + 0, 733, 734, 5, 84, 0, 0, 734, 735, 5, 95, 0, 0, 735, 736, 5, 69, 0, 0, + 736, 737, 5, 81, 0, 0, 737, 738, 5, 85, 0, 0, 738, 739, 5, 65, 0, 0, 739, + 740, 5, 76, 0, 0, 740, 742, 5, 83, 0, 0, 741, 723, 1, 0, 0, 0, 741, 732, + 1, 0, 0, 0, 742, 98, 1, 0, 0, 0, 743, 744, 5, 115, 0, 0, 744, 745, 5, 116, + 0, 0, 745, 746, 5, 95, 0, 0, 746, 747, 5, 116, 0, 0, 747, 748, 5, 111, + 0, 0, 748, 749, 5, 117, 0, 0, 749, 750, 5, 99, 0, 0, 750, 751, 5, 104, + 0, 0, 751, 752, 5, 101, 0, 0, 752, 764, 5, 115, 0, 0, 753, 754, 5, 83, + 0, 0, 754, 755, 5, 84, 0, 0, 755, 756, 5, 95, 0, 0, 756, 757, 5, 84, 0, + 0, 757, 758, 5, 79, 0, 0, 758, 759, 5, 85, 0, 0, 759, 760, 5, 67, 0, 0, + 760, 761, 5, 72, 0, 0, 761, 762, 5, 69, 0, 0, 762, 764, 5, 83, 0, 0, 763, + 743, 1, 0, 0, 0, 763, 753, 1, 0, 0, 0, 764, 100, 1, 0, 0, 0, 765, 766, + 5, 115, 0, 0, 766, 767, 5, 116, 0, 0, 767, 768, 5, 95, 0, 0, 768, 769, + 5, 111, 0, 0, 769, 770, 5, 118, 0, 0, 770, 771, 5, 101, 0, 0, 771, 772, + 5, 114, 0, 0, 772, 773, 5, 108, 0, 0, 773, 774, 5, 97, 0, 0, 774, 775, + 5, 112, 0, 0, 775, 788, 5, 115, 0, 0, 776, 777, 5, 83, 0, 0, 777, 778, + 5, 84, 0, 0, 778, 779, 5, 95, 0, 0, 779, 780, 5, 79, 0, 0, 780, 781, 5, + 86, 0, 0, 781, 782, 5, 69, 0, 0, 782, 783, 5, 82, 0, 0, 783, 784, 5, 76, + 0, 0, 784, 785, 5, 65, 0, 0, 785, 786, 5, 80, 0, 0, 786, 788, 5, 83, 0, + 0, 787, 765, 1, 0, 0, 0, 787, 776, 1, 0, 0, 0, 788, 102, 1, 0, 0, 0, 789, + 790, 5, 115, 0, 0, 790, 791, 5, 116, 0, 0, 791, 792, 5, 95, 0, 0, 792, + 793, 5, 99, 0, 0, 793, 794, 5, 114, 0, 0, 794, 795, 5, 111, 0, 0, 795, + 796, 5, 115, 0, 0, 796, 797, 5, 115, 0, 0, 797, 798, 5, 101, 0, 0, 798, + 810, 5, 115, 0, 0, 799, 800, 5, 83, 0, 0, 800, 801, 5, 84, 0, 0, 801, 802, + 5, 95, 0, 0, 802, 803, 5, 67, 0, 0, 803, 804, 5, 82, 0, 0, 804, 805, 5, + 79, 0, 0, 805, 806, 5, 83, 0, 0, 806, 807, 5, 83, 0, 0, 807, 808, 5, 69, + 0, 0, 808, 810, 5, 83, 0, 0, 809, 789, 1, 0, 0, 0, 809, 799, 1, 0, 0, 0, + 810, 104, 1, 0, 0, 0, 811, 812, 5, 115, 0, 0, 812, 813, 5, 116, 0, 0, 813, + 814, 5, 95, 0, 0, 814, 815, 5, 99, 0, 0, 815, 816, 5, 111, 0, 0, 816, 817, + 5, 110, 0, 0, 817, 818, 5, 116, 0, 0, 818, 819, 5, 97, 0, 0, 819, 820, + 5, 105, 0, 0, 820, 821, 5, 110, 0, 0, 821, 834, 5, 115, 0, 0, 822, 823, + 5, 83, 0, 0, 823, 824, 5, 84, 0, 0, 824, 825, 5, 95, 0, 0, 825, 826, 5, + 67, 0, 0, 826, 827, 5, 79, 0, 0, 827, 828, 5, 78, 0, 0, 828, 829, 5, 84, + 0, 0, 829, 830, 5, 65, 0, 0, 830, 831, 5, 73, 0, 0, 831, 832, 5, 78, 0, + 0, 832, 834, 5, 83, 0, 0, 833, 811, 1, 0, 0, 0, 833, 822, 1, 0, 0, 0, 834, + 106, 1, 0, 0, 0, 835, 836, 5, 115, 0, 0, 836, 837, 5, 116, 0, 0, 837, 838, + 5, 95, 0, 0, 838, 839, 5, 105, 0, 0, 839, 840, 5, 110, 0, 0, 840, 841, + 5, 116, 0, 0, 841, 842, 5, 101, 0, 0, 842, 843, 5, 114, 0, 0, 843, 844, + 5, 115, 0, 0, 844, 845, 5, 101, 0, 0, 845, 846, 5, 99, 0, 0, 846, 847, + 5, 116, 0, 0, 847, 862, 5, 115, 0, 0, 848, 849, 5, 83, 0, 0, 849, 850, + 5, 84, 0, 0, 850, 851, 5, 95, 0, 0, 851, 852, 5, 73, 0, 0, 852, 853, 5, + 78, 0, 0, 853, 854, 5, 84, 0, 0, 854, 855, 5, 69, 0, 0, 855, 856, 5, 82, + 0, 0, 856, 857, 5, 83, 0, 0, 857, 858, 5, 69, 0, 0, 858, 859, 5, 67, 0, + 0, 859, 860, 5, 84, 0, 0, 860, 862, 5, 83, 0, 0, 861, 835, 1, 0, 0, 0, + 861, 848, 1, 0, 0, 0, 862, 108, 1, 0, 0, 0, 863, 864, 5, 115, 0, 0, 864, + 865, 5, 116, 0, 0, 865, 866, 5, 95, 0, 0, 866, 867, 5, 119, 0, 0, 867, + 868, 5, 105, 0, 0, 868, 869, 5, 116, 0, 0, 869, 870, 5, 104, 0, 0, 870, + 871, 5, 105, 0, 0, 871, 882, 5, 110, 0, 0, 872, 873, 5, 83, 0, 0, 873, + 874, 5, 84, 0, 0, 874, 875, 5, 95, 0, 0, 875, 876, 5, 87, 0, 0, 876, 877, + 5, 73, 0, 0, 877, 878, 5, 84, 0, 0, 878, 879, 5, 72, 0, 0, 879, 880, 5, + 73, 0, 0, 880, 882, 5, 78, 0, 0, 881, 863, 1, 0, 0, 0, 881, 872, 1, 0, + 0, 0, 882, 110, 1, 0, 0, 0, 883, 884, 5, 115, 0, 0, 884, 885, 5, 116, 0, + 0, 885, 886, 5, 95, 0, 0, 886, 887, 5, 100, 0, 0, 887, 888, 5, 119, 0, + 0, 888, 889, 5, 105, 0, 0, 889, 890, 5, 116, 0, 0, 890, 891, 5, 104, 0, + 0, 891, 892, 5, 105, 0, 0, 892, 904, 5, 110, 0, 0, 893, 894, 5, 83, 0, + 0, 894, 895, 5, 84, 0, 0, 895, 896, 5, 95, 0, 0, 896, 897, 5, 68, 0, 0, + 897, 898, 5, 87, 0, 0, 898, 899, 5, 73, 0, 0, 899, 900, 5, 84, 0, 0, 900, + 901, 5, 72, 0, 0, 901, 902, 5, 73, 0, 0, 902, 904, 5, 78, 0, 0, 903, 883, + 1, 0, 0, 0, 903, 893, 1, 0, 0, 0, 904, 112, 1, 0, 0, 0, 905, 906, 5, 116, + 0, 0, 906, 907, 5, 114, 0, 0, 907, 908, 5, 117, 0, 0, 908, 933, 5, 101, + 0, 0, 909, 910, 5, 84, 0, 0, 910, 911, 5, 114, 0, 0, 911, 912, 5, 117, + 0, 0, 912, 933, 5, 101, 0, 0, 913, 914, 5, 84, 0, 0, 914, 915, 5, 82, 0, + 0, 915, 916, 5, 85, 0, 0, 916, 933, 5, 69, 0, 0, 917, 918, 5, 102, 0, 0, + 918, 919, 5, 97, 0, 0, 919, 920, 5, 108, 0, 0, 920, 921, 5, 115, 0, 0, + 921, 933, 5, 101, 0, 0, 922, 923, 5, 70, 0, 0, 923, 924, 5, 97, 0, 0, 924, + 925, 5, 108, 0, 0, 925, 926, 5, 115, 0, 0, 926, 933, 5, 101, 0, 0, 927, + 928, 5, 70, 0, 0, 928, 929, 5, 65, 0, 0, 929, 930, 5, 76, 0, 0, 930, 931, + 5, 83, 0, 0, 931, 933, 5, 69, 0, 0, 932, 905, 1, 0, 0, 0, 932, 909, 1, + 0, 0, 0, 932, 913, 1, 0, 0, 0, 932, 917, 1, 0, 0, 0, 932, 922, 1, 0, 0, + 0, 932, 927, 1, 0, 0, 0, 933, 114, 1, 0, 0, 0, 934, 939, 3, 143, 71, 0, + 935, 939, 3, 145, 72, 0, 936, 939, 3, 147, 73, 0, 937, 939, 3, 141, 70, + 0, 938, 934, 1, 0, 0, 0, 938, 935, 1, 0, 0, 0, 938, 936, 1, 0, 0, 0, 938, + 937, 1, 0, 0, 0, 939, 116, 1, 0, 0, 0, 940, 943, 3, 159, 79, 0, 941, 943, + 3, 161, 80, 0, 942, 940, 1, 0, 0, 0, 942, 941, 1, 0, 0, 0, 943, 118, 1, + 0, 0, 0, 944, 949, 3, 137, 68, 0, 945, 948, 3, 137, 68, 0, 946, 948, 3, + 139, 69, 0, 947, 945, 1, 0, 0, 0, 947, 946, 1, 0, 0, 0, 948, 951, 1, 0, + 0, 0, 949, 947, 1, 0, 0, 0, 949, 950, 1, 0, 0, 0, 950, 120, 1, 0, 0, 0, + 951, 949, 1, 0, 0, 0, 952, 953, 5, 36, 0, 0, 953, 954, 5, 109, 0, 0, 954, + 955, 5, 101, 0, 0, 955, 956, 5, 116, 0, 0, 956, 957, 5, 97, 0, 0, 957, + 122, 1, 0, 0, 0, 958, 960, 3, 127, 63, 0, 959, 958, 1, 0, 0, 0, 959, 960, + 1, 0, 0, 0, 960, 971, 1, 0, 0, 0, 961, 963, 5, 34, 0, 0, 962, 964, 3, 129, + 64, 0, 963, 962, 1, 0, 0, 0, 963, 964, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, + 965, 972, 5, 34, 0, 0, 966, 968, 5, 39, 0, 0, 967, 969, 3, 131, 65, 0, + 968, 967, 1, 0, 0, 0, 968, 969, 1, 0, 0, 0, 969, 970, 1, 0, 0, 0, 970, + 972, 5, 39, 0, 0, 971, 961, 1, 0, 0, 0, 971, 966, 1, 0, 0, 0, 972, 124, + 1, 0, 0, 0, 973, 976, 3, 119, 59, 0, 974, 976, 3, 121, 60, 0, 975, 973, + 1, 0, 0, 0, 975, 974, 1, 0, 0, 0, 976, 984, 1, 0, 0, 0, 977, 980, 5, 91, + 0, 0, 978, 981, 3, 123, 61, 0, 979, 981, 3, 143, 71, 0, 980, 978, 1, 0, + 0, 0, 980, 979, 1, 0, 0, 0, 981, 982, 1, 0, 0, 0, 982, 983, 5, 93, 0, 0, + 983, 985, 1, 0, 0, 0, 984, 977, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, + 984, 1, 0, 0, 0, 986, 987, 1, 0, 0, 0, 987, 126, 1, 0, 0, 0, 988, 989, + 5, 117, 0, 0, 989, 992, 5, 56, 0, 0, 990, 992, 7, 0, 0, 0, 991, 988, 1, + 0, 0, 0, 991, 990, 1, 0, 0, 0, 992, 128, 1, 0, 0, 0, 993, 995, 3, 133, + 66, 0, 994, 993, 1, 0, 0, 0, 995, 996, 1, 0, 0, 0, 996, 994, 1, 0, 0, 0, + 996, 997, 1, 0, 0, 0, 997, 130, 1, 0, 0, 0, 998, 1000, 3, 135, 67, 0, 999, + 998, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 999, 1, 0, 0, 0, 1001, 1002, + 1, 0, 0, 0, 1002, 132, 1, 0, 0, 0, 1003, 1011, 8, 1, 0, 0, 1004, 1011, + 3, 175, 87, 0, 1005, 1006, 5, 92, 0, 0, 1006, 1011, 5, 10, 0, 0, 1007, + 1008, 5, 92, 0, 0, 1008, 1009, 5, 13, 0, 0, 1009, 1011, 5, 10, 0, 0, 1010, + 1003, 1, 0, 0, 0, 1010, 1004, 1, 0, 0, 0, 1010, 1005, 1, 0, 0, 0, 1010, + 1007, 1, 0, 0, 0, 1011, 134, 1, 0, 0, 0, 1012, 1020, 8, 2, 0, 0, 1013, + 1020, 3, 175, 87, 0, 1014, 1015, 5, 92, 0, 0, 1015, 1020, 5, 10, 0, 0, + 1016, 1017, 5, 92, 0, 0, 1017, 1018, 5, 13, 0, 0, 1018, 1020, 5, 10, 0, + 0, 1019, 1012, 1, 0, 0, 0, 1019, 1013, 1, 0, 0, 0, 1019, 1014, 1, 0, 0, + 0, 1019, 1016, 1, 0, 0, 0, 1020, 136, 1, 0, 0, 0, 1021, 1022, 7, 3, 0, + 0, 1022, 138, 1, 0, 0, 0, 1023, 1024, 7, 4, 0, 0, 1024, 140, 1, 0, 0, 0, + 1025, 1026, 5, 48, 0, 0, 1026, 1028, 7, 5, 0, 0, 1027, 1029, 7, 6, 0, 0, + 1028, 1027, 1, 0, 0, 0, 1029, 1030, 1, 0, 0, 0, 1030, 1028, 1, 0, 0, 0, + 1030, 1031, 1, 0, 0, 0, 1031, 142, 1, 0, 0, 0, 1032, 1036, 3, 149, 74, + 0, 1033, 1035, 3, 139, 69, 0, 1034, 1033, 1, 0, 0, 0, 1035, 1038, 1, 0, + 0, 0, 1036, 1034, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1041, 1, 0, + 0, 0, 1038, 1036, 1, 0, 0, 0, 1039, 1041, 5, 48, 0, 0, 1040, 1032, 1, 0, + 0, 0, 1040, 1039, 1, 0, 0, 0, 1041, 144, 1, 0, 0, 0, 1042, 1046, 5, 48, + 0, 0, 1043, 1045, 3, 151, 75, 0, 1044, 1043, 1, 0, 0, 0, 1045, 1048, 1, + 0, 0, 0, 1046, 1044, 1, 0, 0, 0, 1046, 1047, 1, 0, 0, 0, 1047, 146, 1, + 0, 0, 0, 1048, 1046, 1, 0, 0, 0, 1049, 1050, 5, 48, 0, 0, 1050, 1051, 7, + 7, 0, 0, 1051, 1052, 3, 171, 85, 0, 1052, 148, 1, 0, 0, 0, 1053, 1054, + 7, 8, 0, 0, 1054, 150, 1, 0, 0, 0, 1055, 1056, 7, 9, 0, 0, 1056, 152, 1, + 0, 0, 0, 1057, 1058, 7, 10, 0, 0, 1058, 154, 1, 0, 0, 0, 1059, 1060, 3, + 153, 76, 0, 1060, 1061, 3, 153, 76, 0, 1061, 1062, 3, 153, 76, 0, 1062, + 1063, 3, 153, 76, 0, 1063, 156, 1, 0, 0, 0, 1064, 1065, 5, 92, 0, 0, 1065, + 1066, 5, 117, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1075, 3, 155, 77, 0, + 1068, 1069, 5, 92, 0, 0, 1069, 1070, 5, 85, 0, 0, 1070, 1071, 1, 0, 0, + 0, 1071, 1072, 3, 155, 77, 0, 1072, 1073, 3, 155, 77, 0, 1073, 1075, 1, + 0, 0, 0, 1074, 1064, 1, 0, 0, 0, 1074, 1068, 1, 0, 0, 0, 1075, 158, 1, + 0, 0, 0, 1076, 1078, 3, 163, 81, 0, 1077, 1079, 3, 165, 82, 0, 1078, 1077, + 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1084, 1, 0, 0, 0, 1080, 1081, + 3, 167, 83, 0, 1081, 1082, 3, 165, 82, 0, 1082, 1084, 1, 0, 0, 0, 1083, + 1076, 1, 0, 0, 0, 1083, 1080, 1, 0, 0, 0, 1084, 160, 1, 0, 0, 0, 1085, + 1086, 5, 48, 0, 0, 1086, 1089, 7, 7, 0, 0, 1087, 1090, 3, 169, 84, 0, 1088, + 1090, 3, 171, 85, 0, 1089, 1087, 1, 0, 0, 0, 1089, 1088, 1, 0, 0, 0, 1090, + 1091, 1, 0, 0, 0, 1091, 1092, 3, 173, 86, 0, 1092, 162, 1, 0, 0, 0, 1093, + 1095, 3, 167, 83, 0, 1094, 1093, 1, 0, 0, 0, 1094, 1095, 1, 0, 0, 0, 1095, + 1096, 1, 0, 0, 0, 1096, 1097, 5, 46, 0, 0, 1097, 1102, 3, 167, 83, 0, 1098, + 1099, 3, 167, 83, 0, 1099, 1100, 5, 46, 0, 0, 1100, 1102, 1, 0, 0, 0, 1101, + 1094, 1, 0, 0, 0, 1101, 1098, 1, 0, 0, 0, 1102, 164, 1, 0, 0, 0, 1103, + 1105, 7, 11, 0, 0, 1104, 1106, 7, 12, 0, 0, 1105, 1104, 1, 0, 0, 0, 1105, + 1106, 1, 0, 0, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1108, 3, 167, 83, 0, 1108, + 166, 1, 0, 0, 0, 1109, 1111, 3, 139, 69, 0, 1110, 1109, 1, 0, 0, 0, 1111, + 1112, 1, 0, 0, 0, 1112, 1110, 1, 0, 0, 0, 1112, 1113, 1, 0, 0, 0, 1113, + 168, 1, 0, 0, 0, 1114, 1116, 3, 171, 85, 0, 1115, 1114, 1, 0, 0, 0, 1115, + 1116, 1, 0, 0, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 5, 46, 0, 0, 1118, + 1123, 3, 171, 85, 0, 1119, 1120, 3, 171, 85, 0, 1120, 1121, 5, 46, 0, 0, + 1121, 1123, 1, 0, 0, 0, 1122, 1115, 1, 0, 0, 0, 1122, 1119, 1, 0, 0, 0, + 1123, 170, 1, 0, 0, 0, 1124, 1126, 3, 153, 76, 0, 1125, 1124, 1, 0, 0, + 0, 1126, 1127, 1, 0, 0, 0, 1127, 1125, 1, 0, 0, 0, 1127, 1128, 1, 0, 0, + 0, 1128, 172, 1, 0, 0, 0, 1129, 1131, 7, 13, 0, 0, 1130, 1132, 7, 12, 0, + 0, 1131, 1130, 1, 0, 0, 0, 1131, 1132, 1, 0, 0, 0, 1132, 1133, 1, 0, 0, + 0, 1133, 1134, 3, 167, 83, 0, 1134, 174, 1, 0, 0, 0, 1135, 1136, 5, 92, + 0, 0, 1136, 1151, 7, 14, 0, 0, 1137, 1138, 5, 92, 0, 0, 1138, 1140, 3, + 151, 75, 0, 1139, 1141, 3, 151, 75, 0, 1140, 1139, 1, 0, 0, 0, 1140, 1141, + 1, 0, 0, 0, 1141, 1143, 1, 0, 0, 0, 1142, 1144, 3, 151, 75, 0, 1143, 1142, + 1, 0, 0, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1151, 1, 0, 0, 0, 1145, 1146, + 5, 92, 0, 0, 1146, 1147, 5, 120, 0, 0, 1147, 1148, 1, 0, 0, 0, 1148, 1151, + 3, 171, 85, 0, 1149, 1151, 3, 157, 78, 0, 1150, 1135, 1, 0, 0, 0, 1150, + 1137, 1, 0, 0, 0, 1150, 1145, 1, 0, 0, 0, 1150, 1149, 1, 0, 0, 0, 1151, + 176, 1, 0, 0, 0, 1152, 1154, 7, 15, 0, 0, 1153, 1152, 1, 0, 0, 0, 1154, + 1155, 1, 0, 0, 0, 1155, 1153, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, + 1157, 1, 0, 0, 0, 1157, 1158, 6, 88, 0, 0, 1158, 178, 1, 0, 0, 0, 1159, + 1161, 5, 13, 0, 0, 1160, 1162, 5, 10, 0, 0, 1161, 1160, 1, 0, 0, 0, 1161, + 1162, 1, 0, 0, 0, 1162, 1165, 1, 0, 0, 0, 1163, 1165, 5, 10, 0, 0, 1164, + 1159, 1, 0, 0, 0, 1164, 1163, 1, 0, 0, 0, 1165, 1166, 1, 0, 0, 0, 1166, + 1167, 6, 89, 0, 0, 1167, 180, 1, 0, 0, 0, 71, 0, 219, 233, 255, 281, 309, + 327, 335, 377, 414, 422, 438, 462, 473, 479, 484, 486, 517, 553, 589, 619, + 657, 695, 721, 741, 763, 787, 809, 833, 861, 881, 903, 932, 938, 942, 947, + 949, 959, 963, 968, 971, 975, 980, 986, 991, 996, 1001, 1010, 1019, 1030, + 1036, 1040, 1046, 1074, 1078, 1083, 1089, 1094, 1101, 1105, 1112, 1115, + 1122, 1127, 1131, 1140, 1143, 1150, 1155, 1161, 1164, 1, 6, 0, 0, } deserializer := antlr.NewATNDeserializer(nil) staticData.atn = deserializer.Deserialize(staticData.serializedATN) @@ -629,67 +652,69 @@ func NewPlanLexer(input antlr.CharStream) *PlanLexer { // PlanLexer tokens. const ( - PlanLexerT__0 = 1 - PlanLexerT__1 = 2 - PlanLexerT__2 = 3 - PlanLexerT__3 = 4 - PlanLexerT__4 = 5 - PlanLexerLBRACE = 6 - PlanLexerRBRACE = 7 - PlanLexerLT = 8 - PlanLexerLE = 9 - PlanLexerGT = 10 - PlanLexerGE = 11 - PlanLexerEQ = 12 - PlanLexerNE = 13 - PlanLexerLIKE = 14 - PlanLexerEXISTS = 15 - PlanLexerTEXTMATCH = 16 - PlanLexerPHRASEMATCH = 17 - PlanLexerRANDOMSAMPLE = 18 - PlanLexerINTERVAL = 19 - PlanLexerISO = 20 - PlanLexerADD = 21 - PlanLexerSUB = 22 - PlanLexerMUL = 23 - PlanLexerDIV = 24 - PlanLexerMOD = 25 - PlanLexerPOW = 26 - PlanLexerSHL = 27 - PlanLexerSHR = 28 - PlanLexerBAND = 29 - PlanLexerBOR = 30 - PlanLexerBXOR = 31 - PlanLexerAND = 32 - PlanLexerOR = 33 - PlanLexerISNULL = 34 - PlanLexerISNOTNULL = 35 - PlanLexerBNOT = 36 - PlanLexerNOT = 37 - PlanLexerIN = 38 - PlanLexerEmptyArray = 39 - PlanLexerJSONContains = 40 - PlanLexerJSONContainsAll = 41 - PlanLexerJSONContainsAny = 42 - PlanLexerArrayContains = 43 - PlanLexerArrayContainsAll = 44 - PlanLexerArrayContainsAny = 45 - PlanLexerArrayLength = 46 - PlanLexerSTEuqals = 47 - PlanLexerSTTouches = 48 - PlanLexerSTOverlaps = 49 - PlanLexerSTCrosses = 50 - PlanLexerSTContains = 51 - PlanLexerSTIntersects = 52 - PlanLexerSTWithin = 53 - PlanLexerSTDWithin = 54 - PlanLexerBooleanConstant = 55 - PlanLexerIntegerConstant = 56 - PlanLexerFloatingConstant = 57 - PlanLexerIdentifier = 58 - PlanLexerMeta = 59 - PlanLexerStringLiteral = 60 - PlanLexerJSONIdentifier = 61 - PlanLexerWhitespace = 62 - PlanLexerNewline = 63 + PlanLexerT__0 = 1 + PlanLexerT__1 = 2 + PlanLexerT__2 = 3 + PlanLexerT__3 = 4 + PlanLexerT__4 = 5 + PlanLexerLBRACE = 6 + PlanLexerRBRACE = 7 + PlanLexerLT = 8 + PlanLexerLE = 9 + PlanLexerGT = 10 + PlanLexerGE = 11 + PlanLexerEQ = 12 + PlanLexerNE = 13 + PlanLexerLIKE = 14 + PlanLexerEXISTS = 15 + PlanLexerTEXTMATCH = 16 + PlanLexerPHRASEMATCH = 17 + PlanLexerRANDOMSAMPLE = 18 + PlanLexerINTERVAL = 19 + PlanLexerISO = 20 + PlanLexerMINIMUM_SHOULD_MATCH = 21 + PlanLexerASSIGN = 22 + PlanLexerADD = 23 + PlanLexerSUB = 24 + PlanLexerMUL = 25 + PlanLexerDIV = 26 + PlanLexerMOD = 27 + PlanLexerPOW = 28 + PlanLexerSHL = 29 + PlanLexerSHR = 30 + PlanLexerBAND = 31 + PlanLexerBOR = 32 + PlanLexerBXOR = 33 + PlanLexerAND = 34 + PlanLexerOR = 35 + PlanLexerISNULL = 36 + PlanLexerISNOTNULL = 37 + PlanLexerBNOT = 38 + PlanLexerNOT = 39 + PlanLexerIN = 40 + PlanLexerEmptyArray = 41 + PlanLexerJSONContains = 42 + PlanLexerJSONContainsAll = 43 + PlanLexerJSONContainsAny = 44 + PlanLexerArrayContains = 45 + PlanLexerArrayContainsAll = 46 + PlanLexerArrayContainsAny = 47 + PlanLexerArrayLength = 48 + PlanLexerSTEuqals = 49 + PlanLexerSTTouches = 50 + PlanLexerSTOverlaps = 51 + PlanLexerSTCrosses = 52 + PlanLexerSTContains = 53 + PlanLexerSTIntersects = 54 + PlanLexerSTWithin = 55 + PlanLexerSTDWithin = 56 + PlanLexerBooleanConstant = 57 + PlanLexerIntegerConstant = 58 + PlanLexerFloatingConstant = 59 + PlanLexerIdentifier = 60 + PlanLexerMeta = 61 + PlanLexerStringLiteral = 62 + PlanLexerJSONIdentifier = 63 + PlanLexerWhitespace = 64 + PlanLexerNewline = 65 ) diff --git a/internal/parser/planparserv2/generated/plan_parser.go b/internal/parser/planparserv2/generated/plan_parser.go index 29099400d8..47b0218a02 100644 --- a/internal/parser/planparserv2/generated/plan_parser.go +++ b/internal/parser/planparserv2/generated/plan_parser.go @@ -33,34 +33,35 @@ func planParserInit() { staticData := &PlanParserStaticData staticData.LiteralNames = []string{ "", "'('", "')'", "'['", "','", "']'", "'{'", "'}'", "'<'", "'<='", - "'>'", "'>='", "'=='", "'!='", "", "", "", "", "", "", "", "'+'", "'-'", - "'*'", "'/'", "'%'", "'**'", "'<<'", "'>>'", "'&'", "'|'", "'^'", "", - "", "", "", "'~'", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", "'$meta'", + "'>'", "'>='", "'=='", "'!='", "", "", "", "", "", "", "", "", "'='", + "'+'", "'-'", "'*'", "'/'", "'%'", "'**'", "'<<'", "'>>'", "'&'", "'|'", + "'^'", "", "", "", "", "'~'", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "'$meta'", } staticData.SymbolicNames = []string{ "", "", "", "", "", "", "LBRACE", "RBRACE", "LT", "LE", "GT", "GE", "EQ", "NE", "LIKE", "EXISTS", "TEXTMATCH", "PHRASEMATCH", "RANDOMSAMPLE", - "INTERVAL", "ISO", "ADD", "SUB", "MUL", "DIV", "MOD", "POW", "SHL", - "SHR", "BAND", "BOR", "BXOR", "AND", "OR", "ISNULL", "ISNOTNULL", "BNOT", - "NOT", "IN", "EmptyArray", "JSONContains", "JSONContainsAll", "JSONContainsAny", - "ArrayContains", "ArrayContainsAll", "ArrayContainsAny", "ArrayLength", - "STEuqals", "STTouches", "STOverlaps", "STCrosses", "STContains", "STIntersects", - "STWithin", "STDWithin", "BooleanConstant", "IntegerConstant", "FloatingConstant", - "Identifier", "Meta", "StringLiteral", "JSONIdentifier", "Whitespace", - "Newline", + "INTERVAL", "ISO", "MINIMUM_SHOULD_MATCH", "ASSIGN", "ADD", "SUB", "MUL", + "DIV", "MOD", "POW", "SHL", "SHR", "BAND", "BOR", "BXOR", "AND", "OR", + "ISNULL", "ISNOTNULL", "BNOT", "NOT", "IN", "EmptyArray", "JSONContains", + "JSONContainsAll", "JSONContainsAny", "ArrayContains", "ArrayContainsAll", + "ArrayContainsAny", "ArrayLength", "STEuqals", "STTouches", "STOverlaps", + "STCrosses", "STContains", "STIntersects", "STWithin", "STDWithin", + "BooleanConstant", "IntegerConstant", "FloatingConstant", "Identifier", + "Meta", "StringLiteral", "JSONIdentifier", "Whitespace", "Newline", } staticData.RuleNames = []string{ - "expr", + "expr", "textMatchOption", } staticData.PredictionContextCache = antlr.NewPredictionContextCache() staticData.serializedATN = []int32{ - 4, 1, 63, 230, 2, 0, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 8, 8, 0, - 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 20, 8, - 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, - 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 39, 8, 0, 10, 0, 12, 0, 42, 9, 0, - 1, 0, 3, 0, 45, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, - 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 65, 8, 0, + 4, 1, 65, 240, 2, 0, 7, 0, 2, 1, 7, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, + 0, 10, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 3, 0, 22, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 41, 8, 0, 10, 0, 12, + 0, 44, 9, 0, 1, 0, 3, 0, 47, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 61, 8, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 71, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, @@ -68,102 +69,106 @@ func planParserInit() { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, - 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 156, 8, 0, 10, 0, 12, 0, 159, 9, 0, - 1, 0, 3, 0, 162, 8, 0, 3, 0, 164, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, - 0, 171, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, - 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 187, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 5, 0, 162, 8, 0, 10, 0, 12, 0, 165, 9, 0, 1, 0, 3, 0, 168, 8, 0, 3, 0, + 170, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 177, 8, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, + 0, 193, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, - 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 225, 8, 0, 10, 0, 12, - 0, 228, 9, 0, 1, 0, 0, 1, 0, 1, 0, 0, 14, 1, 0, 21, 22, 1, 0, 8, 13, 1, - 0, 58, 59, 2, 0, 21, 22, 36, 37, 2, 0, 40, 40, 43, 43, 2, 0, 41, 41, 44, - 44, 2, 0, 42, 42, 45, 45, 2, 0, 58, 58, 61, 61, 1, 0, 23, 25, 1, 0, 27, - 28, 1, 0, 8, 9, 1, 0, 10, 11, 1, 0, 8, 11, 1, 0, 12, 13, 283, 0, 170, 1, - 0, 0, 0, 2, 3, 6, 0, -1, 0, 3, 7, 5, 58, 0, 0, 4, 5, 7, 0, 0, 0, 5, 6, - 5, 19, 0, 0, 6, 8, 5, 60, 0, 0, 7, 4, 1, 0, 0, 0, 7, 8, 1, 0, 0, 0, 8, - 9, 1, 0, 0, 0, 9, 10, 7, 1, 0, 0, 10, 11, 5, 20, 0, 0, 11, 171, 5, 60, - 0, 0, 12, 13, 5, 20, 0, 0, 13, 14, 5, 60, 0, 0, 14, 15, 7, 1, 0, 0, 15, - 19, 5, 58, 0, 0, 16, 17, 7, 0, 0, 0, 17, 18, 5, 19, 0, 0, 18, 20, 5, 60, - 0, 0, 19, 16, 1, 0, 0, 0, 19, 20, 1, 0, 0, 0, 20, 171, 1, 0, 0, 0, 21, - 171, 5, 56, 0, 0, 22, 171, 5, 57, 0, 0, 23, 171, 5, 55, 0, 0, 24, 171, - 5, 60, 0, 0, 25, 171, 7, 2, 0, 0, 26, 171, 5, 61, 0, 0, 27, 28, 5, 6, 0, - 0, 28, 29, 5, 58, 0, 0, 29, 171, 5, 7, 0, 0, 30, 31, 5, 1, 0, 0, 31, 32, - 3, 0, 0, 0, 32, 33, 5, 2, 0, 0, 33, 171, 1, 0, 0, 0, 34, 35, 5, 3, 0, 0, - 35, 40, 3, 0, 0, 0, 36, 37, 5, 4, 0, 0, 37, 39, 3, 0, 0, 0, 38, 36, 1, - 0, 0, 0, 39, 42, 1, 0, 0, 0, 40, 38, 1, 0, 0, 0, 40, 41, 1, 0, 0, 0, 41, - 44, 1, 0, 0, 0, 42, 40, 1, 0, 0, 0, 43, 45, 5, 4, 0, 0, 44, 43, 1, 0, 0, - 0, 44, 45, 1, 0, 0, 0, 45, 46, 1, 0, 0, 0, 46, 47, 5, 5, 0, 0, 47, 171, - 1, 0, 0, 0, 48, 171, 5, 39, 0, 0, 49, 50, 5, 15, 0, 0, 50, 171, 3, 0, 0, - 35, 51, 52, 5, 16, 0, 0, 52, 53, 5, 1, 0, 0, 53, 54, 5, 58, 0, 0, 54, 55, - 5, 4, 0, 0, 55, 56, 5, 60, 0, 0, 56, 171, 5, 2, 0, 0, 57, 58, 5, 17, 0, - 0, 58, 59, 5, 1, 0, 0, 59, 60, 5, 58, 0, 0, 60, 61, 5, 4, 0, 0, 61, 64, - 5, 60, 0, 0, 62, 63, 5, 4, 0, 0, 63, 65, 3, 0, 0, 0, 64, 62, 1, 0, 0, 0, - 64, 65, 1, 0, 0, 0, 65, 66, 1, 0, 0, 0, 66, 171, 5, 2, 0, 0, 67, 68, 5, - 18, 0, 0, 68, 69, 5, 1, 0, 0, 69, 70, 3, 0, 0, 0, 70, 71, 5, 2, 0, 0, 71, - 171, 1, 0, 0, 0, 72, 73, 7, 3, 0, 0, 73, 171, 3, 0, 0, 29, 74, 75, 7, 4, - 0, 0, 75, 76, 5, 1, 0, 0, 76, 77, 3, 0, 0, 0, 77, 78, 5, 4, 0, 0, 78, 79, - 3, 0, 0, 0, 79, 80, 5, 2, 0, 0, 80, 171, 1, 0, 0, 0, 81, 82, 7, 5, 0, 0, - 82, 83, 5, 1, 0, 0, 83, 84, 3, 0, 0, 0, 84, 85, 5, 4, 0, 0, 85, 86, 3, - 0, 0, 0, 86, 87, 5, 2, 0, 0, 87, 171, 1, 0, 0, 0, 88, 89, 7, 6, 0, 0, 89, - 90, 5, 1, 0, 0, 90, 91, 3, 0, 0, 0, 91, 92, 5, 4, 0, 0, 92, 93, 3, 0, 0, - 0, 93, 94, 5, 2, 0, 0, 94, 171, 1, 0, 0, 0, 95, 96, 5, 47, 0, 0, 96, 97, - 5, 1, 0, 0, 97, 98, 5, 58, 0, 0, 98, 99, 5, 4, 0, 0, 99, 100, 5, 60, 0, - 0, 100, 171, 5, 2, 0, 0, 101, 102, 5, 48, 0, 0, 102, 103, 5, 1, 0, 0, 103, - 104, 5, 58, 0, 0, 104, 105, 5, 4, 0, 0, 105, 106, 5, 60, 0, 0, 106, 171, - 5, 2, 0, 0, 107, 108, 5, 49, 0, 0, 108, 109, 5, 1, 0, 0, 109, 110, 5, 58, - 0, 0, 110, 111, 5, 4, 0, 0, 111, 112, 5, 60, 0, 0, 112, 171, 5, 2, 0, 0, - 113, 114, 5, 50, 0, 0, 114, 115, 5, 1, 0, 0, 115, 116, 5, 58, 0, 0, 116, - 117, 5, 4, 0, 0, 117, 118, 5, 60, 0, 0, 118, 171, 5, 2, 0, 0, 119, 120, - 5, 51, 0, 0, 120, 121, 5, 1, 0, 0, 121, 122, 5, 58, 0, 0, 122, 123, 5, - 4, 0, 0, 123, 124, 5, 60, 0, 0, 124, 171, 5, 2, 0, 0, 125, 126, 5, 52, - 0, 0, 126, 127, 5, 1, 0, 0, 127, 128, 5, 58, 0, 0, 128, 129, 5, 4, 0, 0, - 129, 130, 5, 60, 0, 0, 130, 171, 5, 2, 0, 0, 131, 132, 5, 53, 0, 0, 132, - 133, 5, 1, 0, 0, 133, 134, 5, 58, 0, 0, 134, 135, 5, 4, 0, 0, 135, 136, - 5, 60, 0, 0, 136, 171, 5, 2, 0, 0, 137, 138, 5, 54, 0, 0, 138, 139, 5, - 1, 0, 0, 139, 140, 5, 58, 0, 0, 140, 141, 5, 4, 0, 0, 141, 142, 5, 60, - 0, 0, 142, 143, 5, 4, 0, 0, 143, 144, 3, 0, 0, 0, 144, 145, 5, 2, 0, 0, - 145, 171, 1, 0, 0, 0, 146, 147, 5, 46, 0, 0, 147, 148, 5, 1, 0, 0, 148, - 149, 7, 7, 0, 0, 149, 171, 5, 2, 0, 0, 150, 151, 5, 58, 0, 0, 151, 163, - 5, 1, 0, 0, 152, 157, 3, 0, 0, 0, 153, 154, 5, 4, 0, 0, 154, 156, 3, 0, - 0, 0, 155, 153, 1, 0, 0, 0, 156, 159, 1, 0, 0, 0, 157, 155, 1, 0, 0, 0, - 157, 158, 1, 0, 0, 0, 158, 161, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 160, - 162, 5, 4, 0, 0, 161, 160, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 164, - 1, 0, 0, 0, 163, 152, 1, 0, 0, 0, 163, 164, 1, 0, 0, 0, 164, 165, 1, 0, - 0, 0, 165, 171, 5, 2, 0, 0, 166, 167, 7, 7, 0, 0, 167, 171, 5, 34, 0, 0, - 168, 169, 7, 7, 0, 0, 169, 171, 5, 35, 0, 0, 170, 2, 1, 0, 0, 0, 170, 12, - 1, 0, 0, 0, 170, 21, 1, 0, 0, 0, 170, 22, 1, 0, 0, 0, 170, 23, 1, 0, 0, - 0, 170, 24, 1, 0, 0, 0, 170, 25, 1, 0, 0, 0, 170, 26, 1, 0, 0, 0, 170, - 27, 1, 0, 0, 0, 170, 30, 1, 0, 0, 0, 170, 34, 1, 0, 0, 0, 170, 48, 1, 0, - 0, 0, 170, 49, 1, 0, 0, 0, 170, 51, 1, 0, 0, 0, 170, 57, 1, 0, 0, 0, 170, - 67, 1, 0, 0, 0, 170, 72, 1, 0, 0, 0, 170, 74, 1, 0, 0, 0, 170, 81, 1, 0, - 0, 0, 170, 88, 1, 0, 0, 0, 170, 95, 1, 0, 0, 0, 170, 101, 1, 0, 0, 0, 170, - 107, 1, 0, 0, 0, 170, 113, 1, 0, 0, 0, 170, 119, 1, 0, 0, 0, 170, 125, - 1, 0, 0, 0, 170, 131, 1, 0, 0, 0, 170, 137, 1, 0, 0, 0, 170, 146, 1, 0, - 0, 0, 170, 150, 1, 0, 0, 0, 170, 166, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, - 171, 226, 1, 0, 0, 0, 172, 173, 10, 30, 0, 0, 173, 174, 5, 26, 0, 0, 174, - 225, 3, 0, 0, 31, 175, 176, 10, 28, 0, 0, 176, 177, 7, 8, 0, 0, 177, 225, - 3, 0, 0, 29, 178, 179, 10, 27, 0, 0, 179, 180, 7, 0, 0, 0, 180, 225, 3, - 0, 0, 28, 181, 182, 10, 26, 0, 0, 182, 183, 7, 9, 0, 0, 183, 225, 3, 0, - 0, 27, 184, 186, 10, 25, 0, 0, 185, 187, 5, 37, 0, 0, 186, 185, 1, 0, 0, - 0, 186, 187, 1, 0, 0, 0, 187, 188, 1, 0, 0, 0, 188, 189, 5, 38, 0, 0, 189, - 225, 3, 0, 0, 26, 190, 191, 10, 11, 0, 0, 191, 192, 7, 10, 0, 0, 192, 193, - 7, 7, 0, 0, 193, 194, 7, 10, 0, 0, 194, 225, 3, 0, 0, 12, 195, 196, 10, - 10, 0, 0, 196, 197, 7, 11, 0, 0, 197, 198, 7, 7, 0, 0, 198, 199, 7, 11, - 0, 0, 199, 225, 3, 0, 0, 11, 200, 201, 10, 9, 0, 0, 201, 202, 7, 12, 0, - 0, 202, 225, 3, 0, 0, 10, 203, 204, 10, 8, 0, 0, 204, 205, 7, 13, 0, 0, - 205, 225, 3, 0, 0, 9, 206, 207, 10, 7, 0, 0, 207, 208, 5, 29, 0, 0, 208, - 225, 3, 0, 0, 8, 209, 210, 10, 6, 0, 0, 210, 211, 5, 31, 0, 0, 211, 225, - 3, 0, 0, 7, 212, 213, 10, 5, 0, 0, 213, 214, 5, 30, 0, 0, 214, 225, 3, - 0, 0, 6, 215, 216, 10, 4, 0, 0, 216, 217, 5, 32, 0, 0, 217, 225, 3, 0, - 0, 5, 218, 219, 10, 3, 0, 0, 219, 220, 5, 33, 0, 0, 220, 225, 3, 0, 0, - 4, 221, 222, 10, 34, 0, 0, 222, 223, 5, 14, 0, 0, 223, 225, 5, 60, 0, 0, - 224, 172, 1, 0, 0, 0, 224, 175, 1, 0, 0, 0, 224, 178, 1, 0, 0, 0, 224, - 181, 1, 0, 0, 0, 224, 184, 1, 0, 0, 0, 224, 190, 1, 0, 0, 0, 224, 195, - 1, 0, 0, 0, 224, 200, 1, 0, 0, 0, 224, 203, 1, 0, 0, 0, 224, 206, 1, 0, - 0, 0, 224, 209, 1, 0, 0, 0, 224, 212, 1, 0, 0, 0, 224, 215, 1, 0, 0, 0, - 224, 218, 1, 0, 0, 0, 224, 221, 1, 0, 0, 0, 225, 228, 1, 0, 0, 0, 226, - 224, 1, 0, 0, 0, 226, 227, 1, 0, 0, 0, 227, 1, 1, 0, 0, 0, 228, 226, 1, - 0, 0, 0, 12, 7, 19, 40, 44, 64, 157, 161, 163, 170, 186, 224, 226, + 0, 1, 0, 1, 0, 5, 0, 231, 8, 0, 10, 0, 12, 0, 234, 9, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 0, 2, 0, 2, 0, 14, 1, 0, 23, 24, 1, 0, 8, 13, 1, 0, + 60, 61, 2, 0, 23, 24, 38, 39, 2, 0, 42, 42, 45, 45, 2, 0, 43, 43, 46, 46, + 2, 0, 44, 44, 47, 47, 2, 0, 60, 60, 63, 63, 1, 0, 25, 27, 1, 0, 29, 30, + 1, 0, 8, 9, 1, 0, 10, 11, 1, 0, 8, 11, 1, 0, 12, 13, 293, 0, 176, 1, 0, + 0, 0, 2, 235, 1, 0, 0, 0, 4, 5, 6, 0, -1, 0, 5, 9, 5, 60, 0, 0, 6, 7, 7, + 0, 0, 0, 7, 8, 5, 19, 0, 0, 8, 10, 5, 62, 0, 0, 9, 6, 1, 0, 0, 0, 9, 10, + 1, 0, 0, 0, 10, 11, 1, 0, 0, 0, 11, 12, 7, 1, 0, 0, 12, 13, 5, 20, 0, 0, + 13, 177, 5, 62, 0, 0, 14, 15, 5, 20, 0, 0, 15, 16, 5, 62, 0, 0, 16, 17, + 7, 1, 0, 0, 17, 21, 5, 60, 0, 0, 18, 19, 7, 0, 0, 0, 19, 20, 5, 19, 0, + 0, 20, 22, 5, 62, 0, 0, 21, 18, 1, 0, 0, 0, 21, 22, 1, 0, 0, 0, 22, 177, + 1, 0, 0, 0, 23, 177, 5, 58, 0, 0, 24, 177, 5, 59, 0, 0, 25, 177, 5, 57, + 0, 0, 26, 177, 5, 62, 0, 0, 27, 177, 7, 2, 0, 0, 28, 177, 5, 63, 0, 0, + 29, 30, 5, 6, 0, 0, 30, 31, 5, 60, 0, 0, 31, 177, 5, 7, 0, 0, 32, 33, 5, + 1, 0, 0, 33, 34, 3, 0, 0, 0, 34, 35, 5, 2, 0, 0, 35, 177, 1, 0, 0, 0, 36, + 37, 5, 3, 0, 0, 37, 42, 3, 0, 0, 0, 38, 39, 5, 4, 0, 0, 39, 41, 3, 0, 0, + 0, 40, 38, 1, 0, 0, 0, 41, 44, 1, 0, 0, 0, 42, 40, 1, 0, 0, 0, 42, 43, + 1, 0, 0, 0, 43, 46, 1, 0, 0, 0, 44, 42, 1, 0, 0, 0, 45, 47, 5, 4, 0, 0, + 46, 45, 1, 0, 0, 0, 46, 47, 1, 0, 0, 0, 47, 48, 1, 0, 0, 0, 48, 49, 5, + 5, 0, 0, 49, 177, 1, 0, 0, 0, 50, 177, 5, 41, 0, 0, 51, 52, 5, 15, 0, 0, + 52, 177, 3, 0, 0, 35, 53, 54, 5, 16, 0, 0, 54, 55, 5, 1, 0, 0, 55, 56, + 5, 60, 0, 0, 56, 57, 5, 4, 0, 0, 57, 60, 5, 62, 0, 0, 58, 59, 5, 4, 0, + 0, 59, 61, 3, 2, 1, 0, 60, 58, 1, 0, 0, 0, 60, 61, 1, 0, 0, 0, 61, 62, + 1, 0, 0, 0, 62, 177, 5, 2, 0, 0, 63, 64, 5, 17, 0, 0, 64, 65, 5, 1, 0, + 0, 65, 66, 5, 60, 0, 0, 66, 67, 5, 4, 0, 0, 67, 70, 5, 62, 0, 0, 68, 69, + 5, 4, 0, 0, 69, 71, 3, 0, 0, 0, 70, 68, 1, 0, 0, 0, 70, 71, 1, 0, 0, 0, + 71, 72, 1, 0, 0, 0, 72, 177, 5, 2, 0, 0, 73, 74, 5, 18, 0, 0, 74, 75, 5, + 1, 0, 0, 75, 76, 3, 0, 0, 0, 76, 77, 5, 2, 0, 0, 77, 177, 1, 0, 0, 0, 78, + 79, 7, 3, 0, 0, 79, 177, 3, 0, 0, 29, 80, 81, 7, 4, 0, 0, 81, 82, 5, 1, + 0, 0, 82, 83, 3, 0, 0, 0, 83, 84, 5, 4, 0, 0, 84, 85, 3, 0, 0, 0, 85, 86, + 5, 2, 0, 0, 86, 177, 1, 0, 0, 0, 87, 88, 7, 5, 0, 0, 88, 89, 5, 1, 0, 0, + 89, 90, 3, 0, 0, 0, 90, 91, 5, 4, 0, 0, 91, 92, 3, 0, 0, 0, 92, 93, 5, + 2, 0, 0, 93, 177, 1, 0, 0, 0, 94, 95, 7, 6, 0, 0, 95, 96, 5, 1, 0, 0, 96, + 97, 3, 0, 0, 0, 97, 98, 5, 4, 0, 0, 98, 99, 3, 0, 0, 0, 99, 100, 5, 2, + 0, 0, 100, 177, 1, 0, 0, 0, 101, 102, 5, 49, 0, 0, 102, 103, 5, 1, 0, 0, + 103, 104, 5, 60, 0, 0, 104, 105, 5, 4, 0, 0, 105, 106, 5, 62, 0, 0, 106, + 177, 5, 2, 0, 0, 107, 108, 5, 50, 0, 0, 108, 109, 5, 1, 0, 0, 109, 110, + 5, 60, 0, 0, 110, 111, 5, 4, 0, 0, 111, 112, 5, 62, 0, 0, 112, 177, 5, + 2, 0, 0, 113, 114, 5, 51, 0, 0, 114, 115, 5, 1, 0, 0, 115, 116, 5, 60, + 0, 0, 116, 117, 5, 4, 0, 0, 117, 118, 5, 62, 0, 0, 118, 177, 5, 2, 0, 0, + 119, 120, 5, 52, 0, 0, 120, 121, 5, 1, 0, 0, 121, 122, 5, 60, 0, 0, 122, + 123, 5, 4, 0, 0, 123, 124, 5, 62, 0, 0, 124, 177, 5, 2, 0, 0, 125, 126, + 5, 53, 0, 0, 126, 127, 5, 1, 0, 0, 127, 128, 5, 60, 0, 0, 128, 129, 5, + 4, 0, 0, 129, 130, 5, 62, 0, 0, 130, 177, 5, 2, 0, 0, 131, 132, 5, 54, + 0, 0, 132, 133, 5, 1, 0, 0, 133, 134, 5, 60, 0, 0, 134, 135, 5, 4, 0, 0, + 135, 136, 5, 62, 0, 0, 136, 177, 5, 2, 0, 0, 137, 138, 5, 55, 0, 0, 138, + 139, 5, 1, 0, 0, 139, 140, 5, 60, 0, 0, 140, 141, 5, 4, 0, 0, 141, 142, + 5, 62, 0, 0, 142, 177, 5, 2, 0, 0, 143, 144, 5, 56, 0, 0, 144, 145, 5, + 1, 0, 0, 145, 146, 5, 60, 0, 0, 146, 147, 5, 4, 0, 0, 147, 148, 5, 62, + 0, 0, 148, 149, 5, 4, 0, 0, 149, 150, 3, 0, 0, 0, 150, 151, 5, 2, 0, 0, + 151, 177, 1, 0, 0, 0, 152, 153, 5, 48, 0, 0, 153, 154, 5, 1, 0, 0, 154, + 155, 7, 7, 0, 0, 155, 177, 5, 2, 0, 0, 156, 157, 5, 60, 0, 0, 157, 169, + 5, 1, 0, 0, 158, 163, 3, 0, 0, 0, 159, 160, 5, 4, 0, 0, 160, 162, 3, 0, + 0, 0, 161, 159, 1, 0, 0, 0, 162, 165, 1, 0, 0, 0, 163, 161, 1, 0, 0, 0, + 163, 164, 1, 0, 0, 0, 164, 167, 1, 0, 0, 0, 165, 163, 1, 0, 0, 0, 166, + 168, 5, 4, 0, 0, 167, 166, 1, 0, 0, 0, 167, 168, 1, 0, 0, 0, 168, 170, + 1, 0, 0, 0, 169, 158, 1, 0, 0, 0, 169, 170, 1, 0, 0, 0, 170, 171, 1, 0, + 0, 0, 171, 177, 5, 2, 0, 0, 172, 173, 7, 7, 0, 0, 173, 177, 5, 36, 0, 0, + 174, 175, 7, 7, 0, 0, 175, 177, 5, 37, 0, 0, 176, 4, 1, 0, 0, 0, 176, 14, + 1, 0, 0, 0, 176, 23, 1, 0, 0, 0, 176, 24, 1, 0, 0, 0, 176, 25, 1, 0, 0, + 0, 176, 26, 1, 0, 0, 0, 176, 27, 1, 0, 0, 0, 176, 28, 1, 0, 0, 0, 176, + 29, 1, 0, 0, 0, 176, 32, 1, 0, 0, 0, 176, 36, 1, 0, 0, 0, 176, 50, 1, 0, + 0, 0, 176, 51, 1, 0, 0, 0, 176, 53, 1, 0, 0, 0, 176, 63, 1, 0, 0, 0, 176, + 73, 1, 0, 0, 0, 176, 78, 1, 0, 0, 0, 176, 80, 1, 0, 0, 0, 176, 87, 1, 0, + 0, 0, 176, 94, 1, 0, 0, 0, 176, 101, 1, 0, 0, 0, 176, 107, 1, 0, 0, 0, + 176, 113, 1, 0, 0, 0, 176, 119, 1, 0, 0, 0, 176, 125, 1, 0, 0, 0, 176, + 131, 1, 0, 0, 0, 176, 137, 1, 0, 0, 0, 176, 143, 1, 0, 0, 0, 176, 152, + 1, 0, 0, 0, 176, 156, 1, 0, 0, 0, 176, 172, 1, 0, 0, 0, 176, 174, 1, 0, + 0, 0, 177, 232, 1, 0, 0, 0, 178, 179, 10, 30, 0, 0, 179, 180, 5, 28, 0, + 0, 180, 231, 3, 0, 0, 31, 181, 182, 10, 28, 0, 0, 182, 183, 7, 8, 0, 0, + 183, 231, 3, 0, 0, 29, 184, 185, 10, 27, 0, 0, 185, 186, 7, 0, 0, 0, 186, + 231, 3, 0, 0, 28, 187, 188, 10, 26, 0, 0, 188, 189, 7, 9, 0, 0, 189, 231, + 3, 0, 0, 27, 190, 192, 10, 25, 0, 0, 191, 193, 5, 39, 0, 0, 192, 191, 1, + 0, 0, 0, 192, 193, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 195, 5, 40, 0, + 0, 195, 231, 3, 0, 0, 26, 196, 197, 10, 11, 0, 0, 197, 198, 7, 10, 0, 0, + 198, 199, 7, 7, 0, 0, 199, 200, 7, 10, 0, 0, 200, 231, 3, 0, 0, 12, 201, + 202, 10, 10, 0, 0, 202, 203, 7, 11, 0, 0, 203, 204, 7, 7, 0, 0, 204, 205, + 7, 11, 0, 0, 205, 231, 3, 0, 0, 11, 206, 207, 10, 9, 0, 0, 207, 208, 7, + 12, 0, 0, 208, 231, 3, 0, 0, 10, 209, 210, 10, 8, 0, 0, 210, 211, 7, 13, + 0, 0, 211, 231, 3, 0, 0, 9, 212, 213, 10, 7, 0, 0, 213, 214, 5, 31, 0, + 0, 214, 231, 3, 0, 0, 8, 215, 216, 10, 6, 0, 0, 216, 217, 5, 33, 0, 0, + 217, 231, 3, 0, 0, 7, 218, 219, 10, 5, 0, 0, 219, 220, 5, 32, 0, 0, 220, + 231, 3, 0, 0, 6, 221, 222, 10, 4, 0, 0, 222, 223, 5, 34, 0, 0, 223, 231, + 3, 0, 0, 5, 224, 225, 10, 3, 0, 0, 225, 226, 5, 35, 0, 0, 226, 231, 3, + 0, 0, 4, 227, 228, 10, 34, 0, 0, 228, 229, 5, 14, 0, 0, 229, 231, 5, 62, + 0, 0, 230, 178, 1, 0, 0, 0, 230, 181, 1, 0, 0, 0, 230, 184, 1, 0, 0, 0, + 230, 187, 1, 0, 0, 0, 230, 190, 1, 0, 0, 0, 230, 196, 1, 0, 0, 0, 230, + 201, 1, 0, 0, 0, 230, 206, 1, 0, 0, 0, 230, 209, 1, 0, 0, 0, 230, 212, + 1, 0, 0, 0, 230, 215, 1, 0, 0, 0, 230, 218, 1, 0, 0, 0, 230, 221, 1, 0, + 0, 0, 230, 224, 1, 0, 0, 0, 230, 227, 1, 0, 0, 0, 231, 234, 1, 0, 0, 0, + 232, 230, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 1, 1, 0, 0, 0, 234, 232, + 1, 0, 0, 0, 235, 236, 5, 21, 0, 0, 236, 237, 5, 22, 0, 0, 237, 238, 5, + 58, 0, 0, 238, 3, 1, 0, 0, 0, 13, 9, 21, 42, 46, 60, 70, 163, 167, 169, + 176, 192, 230, 232, } deserializer := antlr.NewATNDeserializer(nil) staticData.atn = deserializer.Deserialize(staticData.serializedATN) @@ -201,74 +206,79 @@ func NewPlanParser(input antlr.TokenStream) *PlanParser { // PlanParser tokens. const ( - PlanParserEOF = antlr.TokenEOF - PlanParserT__0 = 1 - PlanParserT__1 = 2 - PlanParserT__2 = 3 - PlanParserT__3 = 4 - PlanParserT__4 = 5 - PlanParserLBRACE = 6 - PlanParserRBRACE = 7 - PlanParserLT = 8 - PlanParserLE = 9 - PlanParserGT = 10 - PlanParserGE = 11 - PlanParserEQ = 12 - PlanParserNE = 13 - PlanParserLIKE = 14 - PlanParserEXISTS = 15 - PlanParserTEXTMATCH = 16 - PlanParserPHRASEMATCH = 17 - PlanParserRANDOMSAMPLE = 18 - PlanParserINTERVAL = 19 - PlanParserISO = 20 - PlanParserADD = 21 - PlanParserSUB = 22 - PlanParserMUL = 23 - PlanParserDIV = 24 - PlanParserMOD = 25 - PlanParserPOW = 26 - PlanParserSHL = 27 - PlanParserSHR = 28 - PlanParserBAND = 29 - PlanParserBOR = 30 - PlanParserBXOR = 31 - PlanParserAND = 32 - PlanParserOR = 33 - PlanParserISNULL = 34 - PlanParserISNOTNULL = 35 - PlanParserBNOT = 36 - PlanParserNOT = 37 - PlanParserIN = 38 - PlanParserEmptyArray = 39 - PlanParserJSONContains = 40 - PlanParserJSONContainsAll = 41 - PlanParserJSONContainsAny = 42 - PlanParserArrayContains = 43 - PlanParserArrayContainsAll = 44 - PlanParserArrayContainsAny = 45 - PlanParserArrayLength = 46 - PlanParserSTEuqals = 47 - PlanParserSTTouches = 48 - PlanParserSTOverlaps = 49 - PlanParserSTCrosses = 50 - PlanParserSTContains = 51 - PlanParserSTIntersects = 52 - PlanParserSTWithin = 53 - PlanParserSTDWithin = 54 - PlanParserBooleanConstant = 55 - PlanParserIntegerConstant = 56 - PlanParserFloatingConstant = 57 - PlanParserIdentifier = 58 - PlanParserMeta = 59 - PlanParserStringLiteral = 60 - PlanParserJSONIdentifier = 61 - PlanParserWhitespace = 62 - PlanParserNewline = 63 + PlanParserEOF = antlr.TokenEOF + PlanParserT__0 = 1 + PlanParserT__1 = 2 + PlanParserT__2 = 3 + PlanParserT__3 = 4 + PlanParserT__4 = 5 + PlanParserLBRACE = 6 + PlanParserRBRACE = 7 + PlanParserLT = 8 + PlanParserLE = 9 + PlanParserGT = 10 + PlanParserGE = 11 + PlanParserEQ = 12 + PlanParserNE = 13 + PlanParserLIKE = 14 + PlanParserEXISTS = 15 + PlanParserTEXTMATCH = 16 + PlanParserPHRASEMATCH = 17 + PlanParserRANDOMSAMPLE = 18 + PlanParserINTERVAL = 19 + PlanParserISO = 20 + PlanParserMINIMUM_SHOULD_MATCH = 21 + PlanParserASSIGN = 22 + PlanParserADD = 23 + PlanParserSUB = 24 + PlanParserMUL = 25 + PlanParserDIV = 26 + PlanParserMOD = 27 + PlanParserPOW = 28 + PlanParserSHL = 29 + PlanParserSHR = 30 + PlanParserBAND = 31 + PlanParserBOR = 32 + PlanParserBXOR = 33 + PlanParserAND = 34 + PlanParserOR = 35 + PlanParserISNULL = 36 + PlanParserISNOTNULL = 37 + PlanParserBNOT = 38 + PlanParserNOT = 39 + PlanParserIN = 40 + PlanParserEmptyArray = 41 + PlanParserJSONContains = 42 + PlanParserJSONContainsAll = 43 + PlanParserJSONContainsAny = 44 + PlanParserArrayContains = 45 + PlanParserArrayContainsAll = 46 + PlanParserArrayContainsAny = 47 + PlanParserArrayLength = 48 + PlanParserSTEuqals = 49 + PlanParserSTTouches = 50 + PlanParserSTOverlaps = 51 + PlanParserSTCrosses = 52 + PlanParserSTContains = 53 + PlanParserSTIntersects = 54 + PlanParserSTWithin = 55 + PlanParserSTDWithin = 56 + PlanParserBooleanConstant = 57 + PlanParserIntegerConstant = 58 + PlanParserFloatingConstant = 59 + PlanParserIdentifier = 60 + PlanParserMeta = 61 + PlanParserStringLiteral = 62 + PlanParserJSONIdentifier = 63 + PlanParserWhitespace = 64 + PlanParserNewline = 65 ) -// PlanParserRULE_expr is the PlanParser rule. -const PlanParserRULE_expr = 0 +// PlanParser rules. +const ( + PlanParserRULE_expr = 0 + PlanParserRULE_textMatchOption = 1 +) // IExprContext is an interface to support dynamic dispatch. type IExprContext interface { @@ -2100,6 +2110,22 @@ func (s *TextMatchContext) StringLiteral() antlr.TerminalNode { return s.GetToken(PlanParserStringLiteral, 0) } +func (s *TextMatchContext) TextMatchOption() ITextMatchOptionContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(ITextMatchOptionContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(ITextMatchOptionContext) +} + func (s *TextMatchContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { switch t := visitor.(type) { case PlanVisitor: @@ -3140,27 +3166,27 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { var _alt int p.EnterOuterAlt(localctx, 1) - p.SetState(170) + p.SetState(176) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } - switch p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 8, p.GetParserRuleContext()) { + switch p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 9, p.GetParserRuleContext()) { case 1: localctx = NewTimestamptzCompareForwardContext(p, localctx) p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(3) + p.SetState(5) p.Match(PlanParserIdentifier) if p.HasError() { // Recognition error - abort rule goto errorExit } } - p.SetState(7) + p.SetState(9) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -3169,7 +3195,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { if _la == PlanParserADD || _la == PlanParserSUB { { - p.SetState(4) + p.SetState(6) var _lt = p.GetTokenStream().LT(1) @@ -3187,7 +3213,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(5) + p.SetState(7) p.Match(PlanParserINTERVAL) if p.HasError() { // Recognition error - abort rule @@ -3195,7 +3221,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(6) + p.SetState(8) var _m = p.Match(PlanParserStringLiteral) @@ -3208,7 +3234,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } { - p.SetState(9) + p.SetState(11) var _lt = p.GetTokenStream().LT(1) @@ -3226,7 +3252,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(10) + p.SetState(12) p.Match(PlanParserISO) if p.HasError() { // Recognition error - abort rule @@ -3234,7 +3260,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(11) + p.SetState(13) var _m = p.Match(PlanParserStringLiteral) @@ -3250,7 +3276,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(12) + p.SetState(14) p.Match(PlanParserISO) if p.HasError() { // Recognition error - abort rule @@ -3258,7 +3284,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(13) + p.SetState(15) var _m = p.Match(PlanParserStringLiteral) @@ -3269,7 +3295,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(14) + p.SetState(16) var _lt = p.GetTokenStream().LT(1) @@ -3287,19 +3313,19 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(15) + p.SetState(17) p.Match(PlanParserIdentifier) if p.HasError() { // Recognition error - abort rule goto errorExit } } - p.SetState(19) + p.SetState(21) p.GetErrorHandler().Sync(p) if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 1, p.GetParserRuleContext()) == 1 { { - p.SetState(16) + p.SetState(18) var _lt = p.GetTokenStream().LT(1) @@ -3317,7 +3343,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(17) + p.SetState(19) p.Match(PlanParserINTERVAL) if p.HasError() { // Recognition error - abort rule @@ -3325,7 +3351,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(18) + p.SetState(20) var _m = p.Match(PlanParserStringLiteral) @@ -3345,7 +3371,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(21) + p.SetState(23) p.Match(PlanParserIntegerConstant) if p.HasError() { // Recognition error - abort rule @@ -3358,7 +3384,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(22) + p.SetState(24) p.Match(PlanParserFloatingConstant) if p.HasError() { // Recognition error - abort rule @@ -3371,7 +3397,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(23) + p.SetState(25) p.Match(PlanParserBooleanConstant) if p.HasError() { // Recognition error - abort rule @@ -3384,7 +3410,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(24) + p.SetState(26) p.Match(PlanParserStringLiteral) if p.HasError() { // Recognition error - abort rule @@ -3397,7 +3423,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(25) + p.SetState(27) _la = p.GetTokenStream().LA(1) if !(_la == PlanParserIdentifier || _la == PlanParserMeta) { @@ -3413,7 +3439,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(26) + p.SetState(28) p.Match(PlanParserJSONIdentifier) if p.HasError() { // Recognition error - abort rule @@ -3426,7 +3452,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(27) + p.SetState(29) p.Match(PlanParserLBRACE) if p.HasError() { // Recognition error - abort rule @@ -3434,7 +3460,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(28) + p.SetState(30) p.Match(PlanParserIdentifier) if p.HasError() { // Recognition error - abort rule @@ -3442,7 +3468,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(29) + p.SetState(31) p.Match(PlanParserRBRACE) if p.HasError() { // Recognition error - abort rule @@ -3455,7 +3481,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(30) + p.SetState(32) p.Match(PlanParserT__0) if p.HasError() { // Recognition error - abort rule @@ -3463,11 +3489,11 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(31) + p.SetState(33) p.expr(0) } { - p.SetState(32) + p.SetState(34) p.Match(PlanParserT__1) if p.HasError() { // Recognition error - abort rule @@ -3480,7 +3506,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(34) + p.SetState(36) p.Match(PlanParserT__2) if p.HasError() { // Recognition error - abort rule @@ -3488,10 +3514,10 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(35) + p.SetState(37) p.expr(0) } - p.SetState(40) + p.SetState(42) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -3503,7 +3529,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { { - p.SetState(36) + p.SetState(38) p.Match(PlanParserT__3) if p.HasError() { // Recognition error - abort rule @@ -3511,12 +3537,12 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(37) + p.SetState(39) p.expr(0) } } - p.SetState(42) + p.SetState(44) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -3526,7 +3552,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { goto errorExit } } - p.SetState(44) + p.SetState(46) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -3535,7 +3561,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { if _la == PlanParserT__3 { { - p.SetState(43) + p.SetState(45) p.Match(PlanParserT__3) if p.HasError() { // Recognition error - abort rule @@ -3545,7 +3571,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } { - p.SetState(46) + p.SetState(48) p.Match(PlanParserT__4) if p.HasError() { // Recognition error - abort rule @@ -3558,7 +3584,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(48) + p.SetState(50) p.Match(PlanParserEmptyArray) if p.HasError() { // Recognition error - abort rule @@ -3571,7 +3597,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(49) + p.SetState(51) p.Match(PlanParserEXISTS) if p.HasError() { // Recognition error - abort rule @@ -3579,7 +3605,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(50) + p.SetState(52) p.expr(35) } @@ -3588,7 +3614,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(51) + p.SetState(53) p.Match(PlanParserTEXTMATCH) if p.HasError() { // Recognition error - abort rule @@ -3596,7 +3622,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(52) + p.SetState(54) p.Match(PlanParserT__0) if p.HasError() { // Recognition error - abort rule @@ -3604,7 +3630,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(53) + p.SetState(55) p.Match(PlanParserIdentifier) if p.HasError() { // Recognition error - abort rule @@ -3612,7 +3638,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(54) + p.SetState(56) p.Match(PlanParserT__3) if p.HasError() { // Recognition error - abort rule @@ -3620,15 +3646,37 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(55) + p.SetState(57) p.Match(PlanParserStringLiteral) if p.HasError() { // Recognition error - abort rule goto errorExit } } + p.SetState(60) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + + if _la == PlanParserT__3 { + { + p.SetState(58) + p.Match(PlanParserT__3) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(59) + p.TextMatchOption() + } + + } { - p.SetState(56) + p.SetState(62) p.Match(PlanParserT__1) if p.HasError() { // Recognition error - abort rule @@ -3641,7 +3689,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(57) + p.SetState(63) p.Match(PlanParserPHRASEMATCH) if p.HasError() { // Recognition error - abort rule @@ -3649,7 +3697,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(58) + p.SetState(64) p.Match(PlanParserT__0) if p.HasError() { // Recognition error - abort rule @@ -3657,7 +3705,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(59) + p.SetState(65) p.Match(PlanParserIdentifier) if p.HasError() { // Recognition error - abort rule @@ -3665,7 +3713,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(60) + p.SetState(66) p.Match(PlanParserT__3) if p.HasError() { // Recognition error - abort rule @@ -3673,14 +3721,14 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(61) + p.SetState(67) p.Match(PlanParserStringLiteral) if p.HasError() { // Recognition error - abort rule goto errorExit } } - p.SetState(64) + p.SetState(70) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -3689,7 +3737,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { if _la == PlanParserT__3 { { - p.SetState(62) + p.SetState(68) p.Match(PlanParserT__3) if p.HasError() { // Recognition error - abort rule @@ -3697,13 +3745,13 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(63) + p.SetState(69) p.expr(0) } } { - p.SetState(66) + p.SetState(72) p.Match(PlanParserT__1) if p.HasError() { // Recognition error - abort rule @@ -3716,7 +3764,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(67) + p.SetState(73) p.Match(PlanParserRANDOMSAMPLE) if p.HasError() { // Recognition error - abort rule @@ -3724,7 +3772,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(68) + p.SetState(74) p.Match(PlanParserT__0) if p.HasError() { // Recognition error - abort rule @@ -3732,11 +3780,11 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(69) + p.SetState(75) p.expr(0) } { - p.SetState(70) + p.SetState(76) p.Match(PlanParserT__1) if p.HasError() { // Recognition error - abort rule @@ -3749,7 +3797,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(72) + p.SetState(78) var _lt = p.GetTokenStream().LT(1) @@ -3757,7 +3805,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { _la = p.GetTokenStream().LA(1) - if !((int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&206164721664) != 0) { + if !((int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&824658886656) != 0) { var _ri = p.GetErrorHandler().RecoverInline(p) localctx.(*UnaryContext).op = _ri @@ -3767,7 +3815,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(73) + p.SetState(79) p.expr(29) } @@ -3776,7 +3824,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(74) + p.SetState(80) _la = p.GetTokenStream().LA(1) if !(_la == PlanParserJSONContains || _la == PlanParserArrayContains) { @@ -3787,7 +3835,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(75) + p.SetState(81) p.Match(PlanParserT__0) if p.HasError() { // Recognition error - abort rule @@ -3795,11 +3843,11 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(76) + p.SetState(82) p.expr(0) } { - p.SetState(77) + p.SetState(83) p.Match(PlanParserT__3) if p.HasError() { // Recognition error - abort rule @@ -3807,11 +3855,11 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(78) + p.SetState(84) p.expr(0) } { - p.SetState(79) + p.SetState(85) p.Match(PlanParserT__1) if p.HasError() { // Recognition error - abort rule @@ -3824,7 +3872,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(81) + p.SetState(87) _la = p.GetTokenStream().LA(1) if !(_la == PlanParserJSONContainsAll || _la == PlanParserArrayContainsAll) { @@ -3835,7 +3883,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(82) + p.SetState(88) p.Match(PlanParserT__0) if p.HasError() { // Recognition error - abort rule @@ -3843,11 +3891,11 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(83) + p.SetState(89) p.expr(0) } { - p.SetState(84) + p.SetState(90) p.Match(PlanParserT__3) if p.HasError() { // Recognition error - abort rule @@ -3855,11 +3903,11 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(85) + p.SetState(91) p.expr(0) } { - p.SetState(86) + p.SetState(92) p.Match(PlanParserT__1) if p.HasError() { // Recognition error - abort rule @@ -3872,7 +3920,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(88) + p.SetState(94) _la = p.GetTokenStream().LA(1) if !(_la == PlanParserJSONContainsAny || _la == PlanParserArrayContainsAny) { @@ -3883,7 +3931,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(89) + p.SetState(95) p.Match(PlanParserT__0) if p.HasError() { // Recognition error - abort rule @@ -3891,11 +3939,11 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(90) + p.SetState(96) p.expr(0) } { - p.SetState(91) + p.SetState(97) p.Match(PlanParserT__3) if p.HasError() { // Recognition error - abort rule @@ -3903,11 +3951,11 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(92) + p.SetState(98) p.expr(0) } { - p.SetState(93) + p.SetState(99) p.Match(PlanParserT__1) if p.HasError() { // Recognition error - abort rule @@ -3919,62 +3967,9 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { localctx = NewSTEuqalsContext(p, localctx) p.SetParserRuleContext(localctx) _prevctx = localctx - { - p.SetState(95) - p.Match(PlanParserSTEuqals) - if p.HasError() { - // Recognition error - abort rule - goto errorExit - } - } - { - p.SetState(96) - p.Match(PlanParserT__0) - if p.HasError() { - // Recognition error - abort rule - goto errorExit - } - } - { - p.SetState(97) - p.Match(PlanParserIdentifier) - if p.HasError() { - // Recognition error - abort rule - goto errorExit - } - } - { - p.SetState(98) - p.Match(PlanParserT__3) - if p.HasError() { - // Recognition error - abort rule - goto errorExit - } - } - { - p.SetState(99) - p.Match(PlanParserStringLiteral) - if p.HasError() { - // Recognition error - abort rule - goto errorExit - } - } - { - p.SetState(100) - p.Match(PlanParserT__1) - if p.HasError() { - // Recognition error - abort rule - goto errorExit - } - } - - case 22: - localctx = NewSTTouchesContext(p, localctx) - p.SetParserRuleContext(localctx) - _prevctx = localctx { p.SetState(101) - p.Match(PlanParserSTTouches) + p.Match(PlanParserSTEuqals) if p.HasError() { // Recognition error - abort rule goto errorExit @@ -4021,13 +4016,13 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } - case 23: - localctx = NewSTOverlapsContext(p, localctx) + case 22: + localctx = NewSTTouchesContext(p, localctx) p.SetParserRuleContext(localctx) _prevctx = localctx { p.SetState(107) - p.Match(PlanParserSTOverlaps) + p.Match(PlanParserSTTouches) if p.HasError() { // Recognition error - abort rule goto errorExit @@ -4074,13 +4069,13 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } - case 24: - localctx = NewSTCrossesContext(p, localctx) + case 23: + localctx = NewSTOverlapsContext(p, localctx) p.SetParserRuleContext(localctx) _prevctx = localctx { p.SetState(113) - p.Match(PlanParserSTCrosses) + p.Match(PlanParserSTOverlaps) if p.HasError() { // Recognition error - abort rule goto errorExit @@ -4127,13 +4122,13 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } - case 25: - localctx = NewSTContainsContext(p, localctx) + case 24: + localctx = NewSTCrossesContext(p, localctx) p.SetParserRuleContext(localctx) _prevctx = localctx { p.SetState(119) - p.Match(PlanParserSTContains) + p.Match(PlanParserSTCrosses) if p.HasError() { // Recognition error - abort rule goto errorExit @@ -4180,13 +4175,13 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } - case 26: - localctx = NewSTIntersectsContext(p, localctx) + case 25: + localctx = NewSTContainsContext(p, localctx) p.SetParserRuleContext(localctx) _prevctx = localctx { p.SetState(125) - p.Match(PlanParserSTIntersects) + p.Match(PlanParserSTContains) if p.HasError() { // Recognition error - abort rule goto errorExit @@ -4233,13 +4228,13 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } - case 27: - localctx = NewSTWithinContext(p, localctx) + case 26: + localctx = NewSTIntersectsContext(p, localctx) p.SetParserRuleContext(localctx) _prevctx = localctx { p.SetState(131) - p.Match(PlanParserSTWithin) + p.Match(PlanParserSTIntersects) if p.HasError() { // Recognition error - abort rule goto errorExit @@ -4286,13 +4281,13 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } - case 28: - localctx = NewSTDWithinContext(p, localctx) + case 27: + localctx = NewSTWithinContext(p, localctx) p.SetParserRuleContext(localctx) _prevctx = localctx { p.SetState(137) - p.Match(PlanParserSTDWithin) + p.Match(PlanParserSTWithin) if p.HasError() { // Recognition error - abort rule goto errorExit @@ -4332,6 +4327,43 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } { p.SetState(142) + p.Match(PlanParserT__1) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + + case 28: + localctx = NewSTDWithinContext(p, localctx) + p.SetParserRuleContext(localctx) + _prevctx = localctx + { + p.SetState(143) + p.Match(PlanParserSTDWithin) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(144) + p.Match(PlanParserT__0) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(145) + p.Match(PlanParserIdentifier) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(146) p.Match(PlanParserT__3) if p.HasError() { // Recognition error - abort rule @@ -4339,11 +4371,27 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(143) + p.SetState(147) + p.Match(PlanParserStringLiteral) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(148) + p.Match(PlanParserT__3) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(149) p.expr(0) } { - p.SetState(144) + p.SetState(150) p.Match(PlanParserT__1) if p.HasError() { // Recognition error - abort rule @@ -4356,7 +4404,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(146) + p.SetState(152) p.Match(PlanParserArrayLength) if p.HasError() { // Recognition error - abort rule @@ -4364,7 +4412,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(147) + p.SetState(153) p.Match(PlanParserT__0) if p.HasError() { // Recognition error - abort rule @@ -4372,7 +4420,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(148) + p.SetState(154) _la = p.GetTokenStream().LA(1) if !(_la == PlanParserIdentifier || _la == PlanParserJSONIdentifier) { @@ -4383,7 +4431,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(149) + p.SetState(155) p.Match(PlanParserT__1) if p.HasError() { // Recognition error - abort rule @@ -4396,7 +4444,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(150) + p.SetState(156) p.Match(PlanParserIdentifier) if p.HasError() { // Recognition error - abort rule @@ -4404,38 +4452,38 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(151) + p.SetState(157) p.Match(PlanParserT__0) if p.HasError() { // Recognition error - abort rule goto errorExit } } - p.SetState(163) + p.SetState(169) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - if (int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&4611685674837835850) != 0 { + if (int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&-1374362828726) != 0 { { - p.SetState(152) + p.SetState(158) p.expr(0) } - p.SetState(157) + p.SetState(163) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } - _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 5, p.GetParserRuleContext()) + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 6, p.GetParserRuleContext()) if p.HasError() { goto errorExit } for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { { - p.SetState(153) + p.SetState(159) p.Match(PlanParserT__3) if p.HasError() { // Recognition error - abort rule @@ -4443,22 +4491,22 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(154) + p.SetState(160) p.expr(0) } } - p.SetState(159) + p.SetState(165) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } - _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 5, p.GetParserRuleContext()) + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 6, p.GetParserRuleContext()) if p.HasError() { goto errorExit } } - p.SetState(161) + p.SetState(167) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -4467,7 +4515,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { if _la == PlanParserT__3 { { - p.SetState(160) + p.SetState(166) p.Match(PlanParserT__3) if p.HasError() { // Recognition error - abort rule @@ -4479,7 +4527,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } { - p.SetState(165) + p.SetState(171) p.Match(PlanParserT__1) if p.HasError() { // Recognition error - abort rule @@ -4492,7 +4540,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(166) + p.SetState(172) _la = p.GetTokenStream().LA(1) if !(_la == PlanParserIdentifier || _la == PlanParserJSONIdentifier) { @@ -4503,7 +4551,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(167) + p.SetState(173) p.Match(PlanParserISNULL) if p.HasError() { // Recognition error - abort rule @@ -4516,7 +4564,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(168) + p.SetState(174) _la = p.GetTokenStream().LA(1) if !(_la == PlanParserIdentifier || _la == PlanParserJSONIdentifier) { @@ -4527,7 +4575,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(169) + p.SetState(175) p.Match(PlanParserISNOTNULL) if p.HasError() { // Recognition error - abort rule @@ -4539,12 +4587,12 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { goto errorExit } p.GetParserRuleContext().SetStop(p.GetTokenStream().LT(-1)) - p.SetState(226) + p.SetState(232) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } - _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 11, p.GetParserRuleContext()) + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 12, p.GetParserRuleContext()) if p.HasError() { goto errorExit } @@ -4554,24 +4602,24 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.TriggerExitRuleEvent() } _prevctx = localctx - p.SetState(224) + p.SetState(230) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } - switch p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 10, p.GetParserRuleContext()) { + switch p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 11, p.GetParserRuleContext()) { case 1: localctx = NewPowerContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(172) + p.SetState(178) if !(p.Precpred(p.GetParserRuleContext(), 30)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 30)", "")) goto errorExit } { - p.SetState(173) + p.SetState(179) p.Match(PlanParserPOW) if p.HasError() { // Recognition error - abort rule @@ -4579,21 +4627,21 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(174) + p.SetState(180) p.expr(31) } case 2: localctx = NewMulDivModContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(175) + p.SetState(181) if !(p.Precpred(p.GetParserRuleContext(), 28)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 28)", "")) goto errorExit } { - p.SetState(176) + p.SetState(182) var _lt = p.GetTokenStream().LT(1) @@ -4601,7 +4649,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { _la = p.GetTokenStream().LA(1) - if !((int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&58720256) != 0) { + if !((int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&234881024) != 0) { var _ri = p.GetErrorHandler().RecoverInline(p) localctx.(*MulDivModContext).op = _ri @@ -4611,21 +4659,21 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(177) + p.SetState(183) p.expr(29) } case 3: localctx = NewAddSubContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(178) + p.SetState(184) if !(p.Precpred(p.GetParserRuleContext(), 27)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 27)", "")) goto errorExit } { - p.SetState(179) + p.SetState(185) var _lt = p.GetTokenStream().LT(1) @@ -4643,21 +4691,21 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(180) + p.SetState(186) p.expr(28) } case 4: localctx = NewShiftContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(181) + p.SetState(187) if !(p.Precpred(p.GetParserRuleContext(), 26)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 26)", "")) goto errorExit } { - p.SetState(182) + p.SetState(188) var _lt = p.GetTokenStream().LT(1) @@ -4675,20 +4723,20 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(183) + p.SetState(189) p.expr(27) } case 5: localctx = NewTermContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(184) + p.SetState(190) if !(p.Precpred(p.GetParserRuleContext(), 25)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 25)", "")) goto errorExit } - p.SetState(186) + p.SetState(192) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -4697,7 +4745,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { if _la == PlanParserNOT { { - p.SetState(185) + p.SetState(191) var _m = p.Match(PlanParserNOT) @@ -4710,7 +4758,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } { - p.SetState(188) + p.SetState(194) p.Match(PlanParserIN) if p.HasError() { // Recognition error - abort rule @@ -4718,21 +4766,21 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(189) + p.SetState(195) p.expr(26) } case 6: localctx = NewRangeContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(190) + p.SetState(196) if !(p.Precpred(p.GetParserRuleContext(), 11)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 11)", "")) goto errorExit } { - p.SetState(191) + p.SetState(197) var _lt = p.GetTokenStream().LT(1) @@ -4750,7 +4798,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(192) + p.SetState(198) _la = p.GetTokenStream().LA(1) if !(_la == PlanParserIdentifier || _la == PlanParserJSONIdentifier) { @@ -4761,7 +4809,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(193) + p.SetState(199) var _lt = p.GetTokenStream().LT(1) @@ -4779,21 +4827,21 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(194) + p.SetState(200) p.expr(12) } case 7: localctx = NewReverseRangeContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(195) + p.SetState(201) if !(p.Precpred(p.GetParserRuleContext(), 10)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 10)", "")) goto errorExit } { - p.SetState(196) + p.SetState(202) var _lt = p.GetTokenStream().LT(1) @@ -4811,7 +4859,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(197) + p.SetState(203) _la = p.GetTokenStream().LA(1) if !(_la == PlanParserIdentifier || _la == PlanParserJSONIdentifier) { @@ -4822,7 +4870,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(198) + p.SetState(204) var _lt = p.GetTokenStream().LT(1) @@ -4840,21 +4888,21 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(199) + p.SetState(205) p.expr(11) } case 8: localctx = NewRelationalContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(200) + p.SetState(206) if !(p.Precpred(p.GetParserRuleContext(), 9)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 9)", "")) goto errorExit } { - p.SetState(201) + p.SetState(207) var _lt = p.GetTokenStream().LT(1) @@ -4872,21 +4920,21 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(202) + p.SetState(208) p.expr(10) } case 9: localctx = NewEqualityContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(203) + p.SetState(209) if !(p.Precpred(p.GetParserRuleContext(), 8)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 8)", "")) goto errorExit } { - p.SetState(204) + p.SetState(210) var _lt = p.GetTokenStream().LT(1) @@ -4904,21 +4952,21 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(205) + p.SetState(211) p.expr(9) } case 10: localctx = NewBitAndContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(206) + p.SetState(212) if !(p.Precpred(p.GetParserRuleContext(), 7)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 7)", "")) goto errorExit } { - p.SetState(207) + p.SetState(213) p.Match(PlanParserBAND) if p.HasError() { // Recognition error - abort rule @@ -4926,21 +4974,21 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(208) + p.SetState(214) p.expr(8) } case 11: localctx = NewBitXorContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(209) + p.SetState(215) if !(p.Precpred(p.GetParserRuleContext(), 6)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 6)", "")) goto errorExit } { - p.SetState(210) + p.SetState(216) p.Match(PlanParserBXOR) if p.HasError() { // Recognition error - abort rule @@ -4948,21 +4996,21 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(211) + p.SetState(217) p.expr(7) } case 12: localctx = NewBitOrContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(212) + p.SetState(218) if !(p.Precpred(p.GetParserRuleContext(), 5)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 5)", "")) goto errorExit } { - p.SetState(213) + p.SetState(219) p.Match(PlanParserBOR) if p.HasError() { // Recognition error - abort rule @@ -4970,21 +5018,21 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(214) + p.SetState(220) p.expr(6) } case 13: localctx = NewLogicalAndContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(215) + p.SetState(221) if !(p.Precpred(p.GetParserRuleContext(), 4)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 4)", "")) goto errorExit } { - p.SetState(216) + p.SetState(222) p.Match(PlanParserAND) if p.HasError() { // Recognition error - abort rule @@ -4992,21 +5040,21 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(217) + p.SetState(223) p.expr(5) } case 14: localctx = NewLogicalOrContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(218) + p.SetState(224) if !(p.Precpred(p.GetParserRuleContext(), 3)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 3)", "")) goto errorExit } { - p.SetState(219) + p.SetState(225) p.Match(PlanParserOR) if p.HasError() { // Recognition error - abort rule @@ -5014,21 +5062,21 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(220) + p.SetState(226) p.expr(4) } case 15: localctx = NewLikeContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(221) + p.SetState(227) if !(p.Precpred(p.GetParserRuleContext(), 34)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 34)", "")) goto errorExit } { - p.SetState(222) + p.SetState(228) p.Match(PlanParserLIKE) if p.HasError() { // Recognition error - abort rule @@ -5036,7 +5084,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(223) + p.SetState(229) p.Match(PlanParserStringLiteral) if p.HasError() { // Recognition error - abort rule @@ -5049,12 +5097,12 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } - p.SetState(228) + p.SetState(234) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } - _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 11, p.GetParserRuleContext()) + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 12, p.GetParserRuleContext()) if p.HasError() { goto errorExit } @@ -5073,6 +5121,126 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } +// ITextMatchOptionContext is an interface to support dynamic dispatch. +type ITextMatchOptionContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + MINIMUM_SHOULD_MATCH() antlr.TerminalNode + ASSIGN() antlr.TerminalNode + IntegerConstant() antlr.TerminalNode + + // IsTextMatchOptionContext differentiates from other interfaces. + IsTextMatchOptionContext() +} + +type TextMatchOptionContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyTextMatchOptionContext() *TextMatchOptionContext { + var p = new(TextMatchOptionContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = PlanParserRULE_textMatchOption + return p +} + +func InitEmptyTextMatchOptionContext(p *TextMatchOptionContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = PlanParserRULE_textMatchOption +} + +func (*TextMatchOptionContext) IsTextMatchOptionContext() {} + +func NewTextMatchOptionContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *TextMatchOptionContext { + var p = new(TextMatchOptionContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = PlanParserRULE_textMatchOption + + return p +} + +func (s *TextMatchOptionContext) GetParser() antlr.Parser { return s.parser } + +func (s *TextMatchOptionContext) MINIMUM_SHOULD_MATCH() antlr.TerminalNode { + return s.GetToken(PlanParserMINIMUM_SHOULD_MATCH, 0) +} + +func (s *TextMatchOptionContext) ASSIGN() antlr.TerminalNode { + return s.GetToken(PlanParserASSIGN, 0) +} + +func (s *TextMatchOptionContext) IntegerConstant() antlr.TerminalNode { + return s.GetToken(PlanParserIntegerConstant, 0) +} + +func (s *TextMatchOptionContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *TextMatchOptionContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *TextMatchOptionContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case PlanVisitor: + return t.VisitTextMatchOption(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *PlanParser) TextMatchOption() (localctx ITextMatchOptionContext) { + localctx = NewTextMatchOptionContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 2, PlanParserRULE_textMatchOption) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(235) + p.Match(PlanParserMINIMUM_SHOULD_MATCH) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(236) + p.Match(PlanParserASSIGN) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(237) + p.Match(PlanParserIntegerConstant) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + func (p *PlanParser) Sempred(localctx antlr.RuleContext, ruleIndex, predIndex int) bool { switch ruleIndex { case 0: diff --git a/internal/parser/planparserv2/generated/plan_visitor.go b/internal/parser/planparserv2/generated/plan_visitor.go index 156325f054..1dd30cc361 100644 --- a/internal/parser/planparserv2/generated/plan_visitor.go +++ b/internal/parser/planparserv2/generated/plan_visitor.go @@ -147,4 +147,7 @@ type PlanVisitor interface { // Visit a parse tree produced by PlanParser#STOverlaps. VisitSTOverlaps(ctx *STOverlapsContext) interface{} + + // Visit a parse tree produced by PlanParser#textMatchOption. + VisitTextMatchOption(ctx *TextMatchOptionContext) interface{} } diff --git a/internal/parser/planparserv2/parser_visitor.go b/internal/parser/planparserv2/parser_visitor.go index 0f451be12b..d8b2134be1 100644 --- a/internal/parser/planparserv2/parser_visitor.go +++ b/internal/parser/planparserv2/parser_visitor.go @@ -527,13 +527,28 @@ func (v *ParserVisitor) VisitTextMatch(ctx *parser.TextMatchContext) interface{} return err } + // Handle optional min_should_match parameter + var extraValues []*planpb.GenericValue + if ctx.TextMatchOption() != nil { + minShouldMatchExpr := ctx.TextMatchOption().Accept(v) + if err, ok := minShouldMatchExpr.(error); ok { + return err + } + extraVal, err := validateAndExtractMinShouldMatch(minShouldMatchExpr) + if err != nil { + return err + } + extraValues = extraVal + } + return &ExprWithType{ expr: &planpb.Expr{ Expr: &planpb.Expr_UnaryRangeExpr{ UnaryRangeExpr: &planpb.UnaryRangeExpr{ - ColumnInfo: columnInfo, - Op: planpb.OpType_TextMatch, - Value: NewString(queryText), + ColumnInfo: columnInfo, + Op: planpb.OpType_TextMatch, + Value: NewString(queryText), + ExtraValues: extraValues, }, }, }, @@ -541,6 +556,26 @@ func (v *ParserVisitor) VisitTextMatch(ctx *parser.TextMatchContext) interface{} } } +func (v *ParserVisitor) VisitTextMatchOption(ctx *parser.TextMatchOptionContext) interface{} { + // Parse the integer constant for minimum_should_match + integerConstant := ctx.IntegerConstant().GetText() + value, err := strconv.ParseInt(integerConstant, 0, 64) + if err != nil { + return fmt.Errorf("invalid minimum_should_match value: %s", integerConstant) + } + + return &ExprWithType{ + expr: &planpb.Expr{ + Expr: &planpb.Expr_ValueExpr{ + ValueExpr: &planpb.ValueExpr{ + Value: NewInt(value), + }, + }, + }, + dataType: schemapb.DataType_Int64, + } +} + func (v *ParserVisitor) VisitPhraseMatch(ctx *parser.PhraseMatchContext) interface{} { identifier := ctx.Identifier().GetText() column, err := v.translateIdentifier(identifier) @@ -2060,3 +2095,21 @@ func reverseCompareOp(op planpb.OpType) planpb.OpType { return planpb.OpType_Invalid } } + +func validateAndExtractMinShouldMatch(minShouldMatchExpr interface{}) ([]*planpb.GenericValue, error) { + if minShouldMatchValue, ok := minShouldMatchExpr.(*ExprWithType); ok { + valueExpr := getValueExpr(minShouldMatchValue) + if valueExpr == nil || valueExpr.GetValue() == nil { + return nil, fmt.Errorf("minimum_should_match should be a const integer expression") + } + minShouldMatch := valueExpr.GetValue().GetInt64Val() + if minShouldMatch < 1 { + return nil, fmt.Errorf("minimum_should_match should be >= 1, got %d", minShouldMatch) + } + if minShouldMatch > 1000 { + return nil, fmt.Errorf("minimum_should_match should be <= 1000, got %d", minShouldMatch) + } + return []*planpb.GenericValue{NewInt(minShouldMatch)}, nil + } + return nil, nil +} diff --git a/internal/parser/planparserv2/plan_parser_v2_test.go b/internal/parser/planparserv2/plan_parser_v2_test.go index 688e7498fe..92ab6876d2 100644 --- a/internal/parser/planparserv2/plan_parser_v2_test.go +++ b/internal/parser/planparserv2/plan_parser_v2_test.go @@ -291,6 +291,272 @@ func TestExpr_TextMatch(t *testing.T) { } } +func TestExpr_TextMatch_MinShouldMatch(t *testing.T) { + schema := newTestSchema(true) + enableMatch(schema) + helper, err := typeutil.CreateSchemaHelper(schema) + assert.NoError(t, err) + + for _, v := range []int64{1, 2, 1000} { + expr := fmt.Sprintf(`text_match(VarCharField, "query", minimum_should_match=%d)`, v) + plan, err := CreateSearchPlan(helper, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 10, + MetricType: "L2", + SearchParams: "", + RoundDecimal: 0, + }, nil, nil) + assert.NoError(t, err, expr) + assert.NotNil(t, plan) + + predicates := plan.GetVectorAnns().GetPredicates() + assert.NotNil(t, predicates) + ure := predicates.GetUnaryRangeExpr() + assert.NotNil(t, ure) + assert.Equal(t, planpb.OpType_TextMatch, ure.GetOp()) + assert.Equal(t, "query", ure.GetValue().GetStringVal()) + extra := ure.GetExtraValues() + assert.Equal(t, 1, len(extra)) + assert.Equal(t, v, extra[0].GetInt64Val()) + } + + { + expr := `text_match(VarCharField, "query", minimum_should_match=0)` + _, err := CreateSearchPlan(helper, expr, "FloatVectorField", &planpb.QueryInfo{}, nil, nil) + assert.Error(t, err) + assert.Contains(t, err.Error(), "minimum_should_match should be >= 1") + } + + { + expr := `text_match(VarCharField, "query", minimum_should_match=1001)` + _, err := CreateSearchPlan(helper, expr, "FloatVectorField", &planpb.QueryInfo{}, nil, nil) + assert.Error(t, err) + assert.Contains(t, err.Error(), "minimum_should_match should be <= 1000") + } + + { + expr := `text_match(VarCharField, "query", minimum_should_match=1.5)` + _, err := CreateSearchPlan(helper, expr, "FloatVectorField", &planpb.QueryInfo{}, nil, nil) + assert.Error(t, err) + } + + { + expr := `text_match(VarCharField, "query", minimum_should_match={min})` + _, err := CreateSearchPlan(helper, expr, "FloatVectorField", &planpb.QueryInfo{}, nil, nil) + assert.Error(t, err) + // grammar rejects placeholder before visitor; accept either parse error or visitor error + errMsg := err.Error() + assert.True(t, strings.Contains(errMsg, "mismatched input") || strings.Contains(errMsg, "minimum_should_match should be a const integer expression"), errMsg) + } + + { + expr := `text_match(VarCharField, "query", minimum_should_match=9223372036854775808)` + _, err := CreateSearchPlan(helper, expr, "FloatVectorField", &planpb.QueryInfo{}, nil, nil) + assert.Error(t, err) + assert.Contains(t, err.Error(), "invalid minimum_should_match value") + } + + { + expr := `text_match(VarCharField, "\中国")` + _, err := CreateSearchPlan(helper, expr, "FloatVectorField", &planpb.QueryInfo{}, nil, nil) + assert.Error(t, err) + } + + { + expr := `text_match(VarCharField, "query", minimum_should_match=9223372036854775808)` + _, err := CreateSearchPlan(helper, expr, "FloatVectorField", &planpb.QueryInfo{}, nil, nil) + assert.Error(t, err) + assert.Contains(t, err.Error(), "invalid minimum_should_match value") + } + + { + expr := `text_match(VarCharField, "\中国")` + _, err := CreateSearchPlan(helper, expr, "FloatVectorField", &planpb.QueryInfo{}, nil, nil) + assert.Error(t, err) + } +} + +func TestExpr_TextMatch_MinShouldMatch_NilValue_Coverage(t *testing.T) { + // This test is specifically to cover the error case in validateAndExtractMinShouldMatch + // which handles the edge case where minShouldMatchExpr is an ExprWithType + + // Test case 1: ExprWithType with a ColumnExpr + // This will make getValueExpr return nil + exprWithColumnExpr := &ExprWithType{ + expr: &planpb.Expr{ + Expr: &planpb.Expr_ColumnExpr{ + ColumnExpr: &planpb.ColumnExpr{ + Info: &planpb.ColumnInfo{ + FieldId: 100, + DataType: schemapb.DataType_Int64, + }, + }, + }, + }, + dataType: schemapb.DataType_Int64, + } + + _, err := validateAndExtractMinShouldMatch(exprWithColumnExpr) + assert.Error(t, err) + assert.Contains(t, err.Error(), "minimum_should_match should be a const integer expression") + + // Test case 2: ExprWithType with a ValueExpr but nil Value + // This will make getValueExpr return a non-nil ValueExpr but GetValue() returns nil + exprWithNilValue := &ExprWithType{ + expr: &planpb.Expr{ + Expr: &planpb.Expr_ValueExpr{ + ValueExpr: &planpb.ValueExpr{ + Value: nil, + }, + }, + }, + dataType: schemapb.DataType_Int64, + } + + _, err = validateAndExtractMinShouldMatch(exprWithNilValue) + assert.Error(t, err) + assert.Contains(t, err.Error(), "minimum_should_match should be a const integer expression") + + // Test case 3: Valid ExprWithType with proper value + validExpr := &ExprWithType{ + expr: &planpb.Expr{ + Expr: &planpb.Expr_ValueExpr{ + ValueExpr: &planpb.ValueExpr{ + Value: NewInt(10), + }, + }, + }, + dataType: schemapb.DataType_Int64, + } + + extraVals, err := validateAndExtractMinShouldMatch(validExpr) + assert.NoError(t, err) + assert.NotNil(t, extraVals) + assert.Equal(t, 1, len(extraVals)) + assert.Equal(t, int64(10), extraVals[0].GetInt64Val()) +} + +func TestExpr_TextMatch_MinShouldMatch_Omitted(t *testing.T) { + schema := newTestSchema(true) + enableMatch(schema) + helper, err := typeutil.CreateSchemaHelper(schema) + assert.NoError(t, err) + + expr := `text_match(VarCharField, "query")` + plan, err := CreateSearchPlan(helper, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 10, + MetricType: "L2", + SearchParams: "", + RoundDecimal: 0, + }, nil, nil) + assert.NoError(t, err) + assert.NotNil(t, plan) + + predicates := plan.GetVectorAnns().GetPredicates() + assert.NotNil(t, predicates) + ure := predicates.GetUnaryRangeExpr() + assert.NotNil(t, ure) + assert.Equal(t, planpb.OpType_TextMatch, ure.GetOp()) + assert.Equal(t, "query", ure.GetValue().GetStringVal()) + // When omitted, ExtraValues should be empty + assert.Equal(t, 0, len(ure.GetExtraValues())) +} + +func TestExpr_TextMatch_MinShouldMatch_IntegerConstant(t *testing.T) { + schema := newTestSchema(true) + enableMatch(schema) + helper, err := typeutil.CreateSchemaHelper(schema) + assert.NoError(t, err) + + expr := `text_match(VarCharField, "query", minimum_should_match=10)` + plan, err := CreateSearchPlan(helper, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 10, + MetricType: "L2", + SearchParams: "", + RoundDecimal: 0, + }, nil, nil) + assert.NoError(t, err) + assert.NotNil(t, plan) + + predicates := plan.GetVectorAnns().GetPredicates() + assert.NotNil(t, predicates) + ure := predicates.GetUnaryRangeExpr() + assert.NotNil(t, ure) + assert.Equal(t, planpb.OpType_TextMatch, ure.GetOp()) + assert.Equal(t, "query", ure.GetValue().GetStringVal()) + extra := ure.GetExtraValues() + assert.Equal(t, 1, len(extra)) + assert.Equal(t, int64(10), extra[0].GetInt64Val()) +} + +func TestExpr_TextMatch_MinShouldMatch_NameTypos(t *testing.T) { + schema := newTestSchema(true) + enableMatch(schema) + helper, err := typeutil.CreateSchemaHelper(schema) + assert.NoError(t, err) + + invalid := []string{ + `text_match(VarCharField, "q", minimum_shouldmatch=1)`, + `text_match(VarCharField, "q", min_should_match=1)`, + `text_match(VarCharField, "q", minimumShouldMatch=1)`, + `text_match(VarCharField, "q", minimum-should-match=1)`, + `text_match(VarCharField, "q", minimum_should_matchx=1)`, + } + for _, expr := range invalid { + _, err := CreateSearchPlan(helper, expr, "FloatVectorField", &planpb.QueryInfo{}, nil, nil) + assert.Error(t, err, expr) + } +} + +func TestExpr_TextMatch_MinShouldMatch_InvalidValueTypes(t *testing.T) { + schema := newTestSchema(true) + enableMatch(schema) + helper, err := typeutil.CreateSchemaHelper(schema) + assert.NoError(t, err) + + invalid := []string{ + `text_match(VarCharField, "q", minimum_should_match=10*10)`, + `text_match(VarCharField, "q", minimum_should_match=nil)`, + `text_match(VarCharField, "q", minimum_should_match=)`, + `text_match(VarCharField, "q", minimum_should_match="10")`, + `text_match(VarCharField, "q", minimum_should_match=true)`, + `text_match(VarCharField, "q", minimum_should_match=a)`, + `text_match(VarCharField, "q", minimum_should_match={min})`, + `text_match(VarCharField, "q", minimum_should_match=1.0)`, + `text_match(VarCharField, "q", minimum_should_match=-1)`, + } + for _, expr := range invalid { + _, err := CreateSearchPlan(helper, expr, "FloatVectorField", &planpb.QueryInfo{}, nil, nil) + assert.Error(t, err, expr) + } +} + +func TestExpr_TextMatch_MinShouldMatch_LeadingZerosAndOctal(t *testing.T) { + schema := newTestSchema(true) + enableMatch(schema) + helper, err := typeutil.CreateSchemaHelper(schema) + assert.NoError(t, err) + { + expr := `text_match(VarCharField, "query", minimum_should_match=001)` + plan, err := CreateSearchPlan(helper, expr, "FloatVectorField", &planpb.QueryInfo{Topk: 10}, nil, nil) + assert.NoError(t, err) + ure := plan.GetVectorAnns().GetPredicates().GetUnaryRangeExpr() + extra := ure.GetExtraValues() + assert.Equal(t, 1, len(extra)) + assert.Equal(t, int64(1), extra[0].GetInt64Val()) + } +} + +func TestExpr_TextMatch_MinShouldMatch_DuplicateOption(t *testing.T) { + schema := newTestSchema(true) + enableMatch(schema) + helper, err := typeutil.CreateSchemaHelper(schema) + assert.NoError(t, err) + + expr := `text_match(VarCharField, "query", minimum_should_match=2, minimum_should_match=3)` + _, err = CreateSearchPlan(helper, expr, "FloatVectorField", &planpb.QueryInfo{}, nil, nil) + assert.Error(t, err) +} + func TestExpr_PhraseMatch(t *testing.T) { schema := newTestSchema(true) helper, err := typeutil.CreateSchemaHelper(schema) diff --git a/tests/go_client/testcases/full_text_search_test.go b/tests/go_client/testcases/full_text_search_test.go index 9b653c9a06..add96c5cc1 100644 --- a/tests/go_client/testcases/full_text_search_test.go +++ b/tests/go_client/testcases/full_text_search_test.go @@ -340,3 +340,42 @@ func TestFullTextSearchDefaultValue(t *testing.T) { } } } + +// TestTextMatchMinimumShouldMatch verifies text_match(..., minimum_should_match=N) +func TestTextMatchMinimumShouldMatch(t *testing.T) { + ctx := hp.CreateContext(t, time.Second*common.DefaultTimeout) + mc := hp.CreateDefaultMilvusClient(ctx, t) + + function := hp.TNewBM25Function(common.DefaultTextFieldName, common.DefaultTextSparseVecFieldName) + // Provide valid field options instead of nil to satisfy CreateCollection's type check + analyzerParams := map[string]any{"tokenizer": "standard"} + fieldsOption := hp.TNewFieldsOption().TWithAnalyzerParams(analyzerParams) + prepare, schema := hp.CollPrepare.CreateCollection(ctx, t, mc, hp.NewCreateCollectionParams(hp.FullTextSearch), fieldsOption, hp.TNewSchemaOption().TWithFunction(function)) + + docs := []string{"a b", "a c", "b c", "c", "a b c"} + insertOption := hp.TNewDataOption().TWithTextLang(common.DefaultTextLang).TWithTextData(docs) + prepare.InsertData(ctx, t, mc, hp.NewInsertParams(schema), insertOption) + prepare.FlushData(ctx, t, mc, schema.CollectionName) + + indexparams := hp.TNewIndexParams(schema).TWithFieldIndex(map[string]index.Index{common.DefaultTextSparseVecFieldName: index.NewSparseInvertedIndex(entity.BM25, 0.1)}) + prepare.CreateIndex(ctx, t, mc, indexparams) + prepare.Load(ctx, t, mc, hp.NewLoadParams(schema.CollectionName)) + + // min=1 should return docs containing any token from "a b c" + expr1 := fmt.Sprintf("text_match(%s, \"%s\", minimum_should_match=%d)", common.DefaultTextFieldName, "a b c", 1) + res1, err := mc.Query(ctx, milvusclient.NewQueryOption(schema.CollectionName).WithFilter(expr1)) + require.NoError(t, err) + require.GreaterOrEqual(t, res1.ResultCount, 4) + + // min=3 should return only the doc containing all three tokens + expr3 := fmt.Sprintf("text_match(%s, \"%s\", minimum_should_match=%d)", common.DefaultTextFieldName, "a b c", 3) + res3, err := mc.Query(ctx, milvusclient.NewQueryOption(schema.CollectionName).WithFilter(expr3)) + require.NoError(t, err) + require.GreaterOrEqual(t, res3.ResultCount, 1) + + // min large (e.g. 10) should return 0 + exprLarge := fmt.Sprintf("text_match(%s, \"%s\", minimum_should_match=%d)", common.DefaultTextFieldName, "a b c", 10) + resLarge, err := mc.Query(ctx, milvusclient.NewQueryOption(schema.CollectionName).WithFilter(exprLarge)) + require.NoError(t, err) + require.Equal(t, 0, resLarge.ResultCount) +}