diff --git a/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/avg-salaries-where.md b/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/avg-salaries-where.md index 812d576ec831e..74d9db28a5115 100644 --- a/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/avg-salaries-where.md +++ b/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/avg-salaries-where.md @@ -3,9 +3,9 @@ ```esql FROM employees | KEEP emp_no, salary -| INLINESTATS avg_lt_50 = ROUND(AVG(salary)) WHERE salary < 50000, - avg_lt_60 = ROUND(AVG(salary)) WHERE salary >=50000 AND salary < 60000, - avg_gt_60 = ROUND(AVG(salary)) WHERE salary >= 60000 +| INLINE STATS avg_lt_50 = ROUND(AVG(salary)) WHERE salary < 50000, + avg_lt_60 = ROUND(AVG(salary)) WHERE salary >=50000 AND salary < 60000, + avg_gt_60 = ROUND(AVG(salary)) WHERE salary >= 60000 ``` | emp_no:integer | salary:integer | avg_lt_50:double | avg_lt_60:double | avg_gt_60:double | diff --git a/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/max-salary-without-by.md b/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/max-salary-without-by.md index cc1b624fe7396..a0d6248d42bdc 100644 --- a/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/max-salary-without-by.md +++ b/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/max-salary-without-by.md @@ -3,7 +3,7 @@ ```esql FROM employees | KEEP emp_no, languages, salary -| INLINESTATS max_salary = MAX(salary) +| INLINE STATS max_salary = MAX(salary) ``` | emp_no:integer | languages:integer | salary:integer | max_salary:integer | diff --git a/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/max-salary.md b/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/max-salary.md index a734873fd27a7..0001656ad9bf1 100644 --- a/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/max-salary.md +++ b/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/max-salary.md @@ -3,7 +3,7 @@ ```esql FROM employees | KEEP emp_no, languages, salary -| INLINESTATS max_salary = MAX(salary) BY languages +| INLINE STATS max_salary = MAX(salary) BY languages ``` | emp_no:integer | salary:integer | max_salary:integer | languages:integer | diff --git a/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/multi-agg-multi-grouping.md b/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/multi-agg-multi-grouping.md index fc2e5fa65d8a7..5b134e1f676a4 100644 --- a/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/multi-agg-multi-grouping.md +++ b/docs/reference/query-languages/esql/_snippets/commands/examples/inlinestats.csv-spec/multi-agg-multi-grouping.md @@ -6,7 +6,7 @@ FROM employees | KEEP emp_no, languages, salary, hire_date | EVAL tenure = DATE_DIFF("year", hire_date, now()) | DROP hire_date -| INLINESTATS avg_salary = AVG(salary), count = count(*) BY languages, tenure +| INLINE STATS avg_salary = AVG(salary), count = count(*) BY languages, tenure ``` | emp_no:integer | salary:integer | avg_salary:double | count:long | languages:integer | tenure:integer | diff --git a/docs/reference/query-languages/esql/kibana/definition/commands/inline_stats.json b/docs/reference/query-languages/esql/kibana/definition/commands/inline_stats.json new file mode 100644 index 0000000000000..cbc1cdf1b2216 --- /dev/null +++ b/docs/reference/query-languages/esql/kibana/definition/commands/inline_stats.json @@ -0,0 +1,5 @@ +{ + "comment" : "This is generated by ESQL’s DocsV3Support. Do not edit it. See ../README.md for how to regenerate it.", + "type" : "command", + "name" : "inline_stats" +} diff --git a/x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/MultiClusterSpecIT.java b/x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/MultiClusterSpecIT.java index 22756ee1d1e68..a65b759b53558 100644 --- a/x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/MultiClusterSpecIT.java +++ b/x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/MultiClusterSpecIT.java @@ -51,9 +51,8 @@ import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.ENABLE_FORK_FOR_REMOTE_INDICES; import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.ENABLE_LOOKUP_JOIN_ON_REMOTE; import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.FORK_V9; -import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.INLINESTATS; -import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.INLINESTATS_SUPPORTS_REMOTE; -import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.INLINESTATS_V11; +import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.INLINE_STATS; +import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.INLINE_STATS_SUPPORTS_REMOTE; import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.JOIN_LOOKUP_V12; import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.JOIN_PLANNING_V1; import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.METADATA_FIELDS_REMOTE_TEST; @@ -140,16 +139,15 @@ protected void shouldSkipTest(String testName) throws IOException { assumeFalse("can't test with _index metadata", (remoteMetadata == false) && hasIndexMetadata(testCase.query)); Version oldVersion = Version.min(Clusters.localClusterVersion(), Clusters.remoteClusterVersion()); assumeTrue("Test " + testName + " is skipped on " + oldVersion, isEnabled(testName, instructions, oldVersion)); - if (testCase.requiredCapabilities.contains(INLINESTATS.capabilityName()) - || testCase.requiredCapabilities.contains(INLINESTATS_V11.capabilityName()) + if (testCase.requiredCapabilities.contains(INLINE_STATS.capabilityName()) || testCase.requiredCapabilities.contains(JOIN_PLANNING_V1.capabilityName())) { assumeTrue( - "INLINESTATS in CCS not supported for this version", - hasCapabilities(adminClient(), List.of(INLINESTATS_SUPPORTS_REMOTE.capabilityName())) + "INLINE STATS in CCS not supported for this version", + hasCapabilities(adminClient(), List.of(INLINE_STATS_SUPPORTS_REMOTE.capabilityName())) ); assumeTrue( - "INLINESTATS in CCS not supported for this version", - hasCapabilities(remoteClusterClient(), List.of(INLINESTATS_SUPPORTS_REMOTE.capabilityName())) + "INLINE STATS in CCS not supported for this version", + hasCapabilities(remoteClusterClient(), List.of(INLINE_STATS_SUPPORTS_REMOTE.capabilityName())) ); } if (testCase.requiredCapabilities.contains(JOIN_LOOKUP_V12.capabilityName())) { diff --git a/x-pack/plugin/esql/qa/server/single-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/single_node/RestEsqlIT.java b/x-pack/plugin/esql/qa/server/single-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/single_node/RestEsqlIT.java index 458fffaa7f2b7..09ecd7a260109 100644 --- a/x-pack/plugin/esql/qa/server/single-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/single_node/RestEsqlIT.java +++ b/x-pack/plugin/esql/qa/server/single-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/single_node/RestEsqlIT.java @@ -466,10 +466,10 @@ public void assertDriverData(Map driverMetadata, Mapcan group on {@code NOW()}. It's a little silly, but + * INLINE STATS can group on {@code NOW()}. It's a little silly, but * doing something like {@code DATE_TRUNC(1 YEAR, NOW() - 1970-01-01T00:00:00Z)} is * much more sensible. But just grouping on {@code NOW()} is enough to test this. *

@@ -1221,11 +1221,11 @@ public void testComplexFieldNames() throws IOException { *

*/ public void testInlineStatsNow() throws IOException { - assumeTrue("INLINESTATS only available on snapshots", Build.current().isSnapshot()); + assumeTrue("INLINE STATS only available on snapshots", Build.current().isSnapshot()); indexTimestampData(1); RequestObjectBuilder builder = requestObjectBuilder().query( - fromIndex() + " | EVAL now=NOW() | INLINESTATS AVG(value) BY now | SORT value ASC" + fromIndex() + " | EVAL now=NOW() | INLINE STATS AVG(value) BY now | SORT value ASC" ); Map result = runEsql(builder); ListMatcher values = matchesList(); diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/fork.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/fork.csv-spec index 53c4343c96f26..3947c21dcf333 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/fork.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/fork.csv-spec @@ -688,15 +688,16 @@ emp_no:integer | job_positions:keyword | _fork:keyword 10087 | Junior Developer | fork2 ; -// INLINESTATS is under development, we enable this once it will be available +// INLINE STATS is under development, we enable this once it will be available forkBeforeInlineStats-Ignore required_capability: fork_v9 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, gender | FORK (WHERE emp_no == 10048 OR emp_no == 10081) (WHERE emp_no == 10081 OR emp_no == 10087) -| INLINESTATS max_lang = MAX(languages) BY gender +| INLINE STATS max_lang = MAX(languages) BY gender | SORT emp_no, gender, _fork | LIMIT 5 ; @@ -705,16 +706,17 @@ emp_no:integer | languages:integer | _fork:keyword | max_lang:integer | gender:k 1 | 2 | 3 | 4 | 5 ; -// INLINESTATS is under development, we enable this once it will be available +// INLINE STATS is under development, we enable this once it will be available forkBranchWithInlineStats-Ignore required_capability: fork_v9 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, gender | FORK (WHERE emp_no == 10048 OR emp_no == 10081 - | INLINESTATS x = MAX(languages) BY gender) + | INLINE STATS x = MAX(languages) BY gender) (WHERE emp_no == 10081 OR emp_no == 10087 - | INLINESTATS x = MIN(languages)) + | INLINE STATS x = MIN(languages)) (WHERE emp_no == 10012 OR emp_no == 10012) | SORT emp_no, gender, _fork ; @@ -727,13 +729,14 @@ emp_no:integer | languages:integer | x:integer | gender:keyword | _fork:keyword 10087 | 5 | 2 | F | fork2 ; -// INLINESTATS is under development, we enable this once it will be available +// INLINE STATS is under development, we enable this once it will be available forkAfterInlineStats-Ignore required_capability: fork_v9 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, gender -| INLINESTATS max_lang = MAX(languages) BY gender +| INLINE STATS max_lang = MAX(languages) BY gender | FORK (WHERE emp_no == 10048 OR emp_no == 10081) (WHERE emp_no == 10081 OR emp_no == 10087) | SORT emp_no, gender, _fork diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/inlinestats.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/inlinestats.csv-spec index 55a656ecf5fb9..40bd716be6d64 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/inlinestats.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/inlinestats.csv-spec @@ -1,8 +1,8 @@ allFieldsReturned -required_capability: inlinestats_v11 +required_capability: inline_stats FROM hosts METADATA _index -| INLINESTATS c = COUNT(*) BY host_group +| INLINE STATS c = COUNT(*) BY host_group | SORT c | LIMIT 1 ; @@ -12,10 +12,10 @@ eth0 |epsilon gw instance|epsilon |[fe80::cae2:65ff:fece:feb9, ; allFieldsReturnedNoIndex -required_capability: inlinestats_v11 +required_capability: inline_stats FROM hosts -| INLINESTATS c = COUNT(*) BY host_group +| INLINE STATS c = COUNT(*) BY host_group | SORT c | LIMIT 1 ; @@ -25,11 +25,11 @@ eth0 |epsilon gw instance|epsilon |[fe80::cae2:65ff:fece:feb9, ; maxOfInt -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages -| INLINESTATS max_lang = MAX(languages) +| INLINE STATS max_lang = MAX(languages) | WHERE max_lang == languages | SORT emp_no ASC | LIMIT 5 @@ -44,11 +44,11 @@ emp_no:integer | languages:integer | max_lang:integer ; docsMaxWithoutBy -required_capability: inlinestats_v11 +required_capability: inline_stats // tag::max-salary-without-by[] FROM employees | KEEP emp_no, languages, salary -| INLINESTATS max_salary = MAX(salary) +| INLINE STATS max_salary = MAX(salary) // end::max-salary-without-by[] | SORT emp_no ASC | LIMIT 5 @@ -65,11 +65,11 @@ emp_no:integer | languages:integer | salary:integer | max_salary:integer ; docsMax -required_capability: inlinestats_v11 +required_capability: inline_stats // tag::max-salary[] FROM employees | KEEP emp_no, languages, salary -| INLINESTATS max_salary = MAX(salary) BY languages +| INLINE STATS max_salary = MAX(salary) BY languages // end::max-salary[] | SORT emp_no ASC | LIMIT 5 @@ -86,14 +86,14 @@ emp_no:integer | salary:integer | max_salary:integer | languages:integer ; docsMultiAggsMultiGroupings -required_capability: inlinestats_v11 +required_capability: inline_stats // tag::multi-agg-multi-grouping[] FROM employees | WHERE still_hired | KEEP emp_no, languages, salary, hire_date | EVAL tenure = DATE_DIFF("year", hire_date, now()) | DROP hire_date -| INLINESTATS avg_salary = AVG(salary), count = count(*) BY languages, tenure +| INLINE STATS avg_salary = AVG(salary), count = count(*) BY languages, tenure // end::multi-agg-multi-grouping[] | SORT emp_no | LIMIT 5 @@ -110,13 +110,13 @@ FROM employees ; docsInlinestatsWithWhere -required_capability: inlinestats_v11 +required_capability: inline_stats // tag::avg-salaries-where[] FROM employees | KEEP emp_no, salary -| INLINESTATS avg_lt_50 = ROUND(AVG(salary)) WHERE salary < 50000, - avg_lt_60 = ROUND(AVG(salary)) WHERE salary >=50000 AND salary < 60000, - avg_gt_60 = ROUND(AVG(salary)) WHERE salary >= 60000 +| INLINE STATS avg_lt_50 = ROUND(AVG(salary)) WHERE salary < 50000, + avg_lt_60 = ROUND(AVG(salary)) WHERE salary >=50000 AND salary < 60000, + avg_gt_60 = ROUND(AVG(salary)) WHERE salary >= 60000 // end::avg-salaries-where[] | SORT emp_no | LIMIT 5 @@ -133,11 +133,11 @@ FROM employees ; maxOfIntByKeyword -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, gender -| INLINESTATS max_lang = MAX(languages) BY gender +| INLINE STATS max_lang = MAX(languages) BY gender | WHERE max_lang == languages | SORT emp_no ASC | LIMIT 5 @@ -151,14 +151,14 @@ emp_no:integer | languages:integer | max_lang:integer | gender:keyword 10014 | 5 | 5 | null ; -// check that the `LIMIT 1` isn't pushed into the INLINESTATS's source +// check that the `LIMIT 1` isn't pushed into the INLINE STATS's source maxOfIntByKeywordLimit1Aggd -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, gender // | SORT emp_no -| INLINESTATS max_lang = MAX(languages) BY gender +| INLINE STATS max_lang = MAX(languages) BY gender | LIMIT 1 | STATS v = VALUES(max_lang) ; @@ -168,10 +168,10 @@ v:integer ; simpleAvg -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| INLINESTATS a = AVG(salary) +| INLINE STATS a = AVG(salary) | LIMIT 2 | KEEP a; @@ -181,11 +181,11 @@ a:double ; maxOfLongByKeyword -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, avg_worked_seconds, gender -| INLINESTATS max_avg_worked_seconds = MAX(avg_worked_seconds) BY gender +| INLINE STATS max_avg_worked_seconds = MAX(avg_worked_seconds) BY gender | WHERE max_avg_worked_seconds == avg_worked_seconds | SORT emp_no ASC; @@ -196,11 +196,11 @@ emp_no:integer | avg_worked_seconds:long | max_avg_worked_seconds:long | gender: ; maxOfLong -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, avg_worked_seconds, gender -| INLINESTATS max_avg_worked_seconds = MAX(avg_worked_seconds) +| INLINE STATS max_avg_worked_seconds = MAX(avg_worked_seconds) | WHERE max_avg_worked_seconds == avg_worked_seconds | SORT emp_no ASC; @@ -209,11 +209,11 @@ emp_no:integer | avg_worked_seconds:long | gender:keyword | max_avg_worked_secon ; maxOfLongByCalculatedKeyword -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, avg_worked_seconds, last_name -| INLINESTATS max_avg_worked_seconds = MAX(avg_worked_seconds) BY SUBSTRING(last_name, 0, 1) +| INLINE STATS max_avg_worked_seconds = MAX(avg_worked_seconds) BY SUBSTRING(last_name, 0, 1) | WHERE max_avg_worked_seconds == avg_worked_seconds | SORT last_name ASC | LIMIT 5 @@ -228,11 +228,11 @@ emp_no:integer | avg_worked_seconds:long | last_name:keyword | max_avg_worked_se ; maxOfLongByCalculatedNamedKeyword -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, avg_worked_seconds, last_name -| INLINESTATS max_avg_worked_seconds = MAX(avg_worked_seconds) BY l = SUBSTRING(last_name, 0, 1) +| INLINE STATS max_avg_worked_seconds = MAX(avg_worked_seconds) BY l = SUBSTRING(last_name, 0, 1) | WHERE max_avg_worked_seconds == avg_worked_seconds | SORT last_name ASC | LIMIT 5 @@ -247,10 +247,10 @@ emp_no:integer | avg_worked_seconds:long | last_name:keyword | max_avg_worked_se ; maxOfLongByCalculatedDroppedKeyword -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| INLINESTATS max_avg_worked_seconds = MAX(avg_worked_seconds) BY l = SUBSTRING(last_name, 0, 1) +| INLINE STATS max_avg_worked_seconds = MAX(avg_worked_seconds) BY l = SUBSTRING(last_name, 0, 1) | WHERE max_avg_worked_seconds == avg_worked_seconds | KEEP emp_no, avg_worked_seconds, last_name, max_avg_worked_seconds | SORT last_name ASC @@ -266,12 +266,12 @@ emp_no:integer | avg_worked_seconds:long | last_name:keyword | max_avg_worked_se ; maxOfLongByEvaledKeyword -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | EVAL l = SUBSTRING(last_name, 0, 1) | KEEP emp_no, avg_worked_seconds, l -| INLINESTATS max_avg_worked_seconds = MAX(avg_worked_seconds) BY l +| INLINE STATS max_avg_worked_seconds = MAX(avg_worked_seconds) BY l | WHERE max_avg_worked_seconds == avg_worked_seconds | SORT l ASC | LIMIT 5 @@ -286,11 +286,11 @@ emp_no:integer | avg_worked_seconds:long | max_avg_worked_seconds:long | l:keywo ; maxOfLongByInt -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, avg_worked_seconds, languages -| INLINESTATS max_avg_worked_seconds = MAX(avg_worked_seconds) BY languages +| INLINE STATS max_avg_worked_seconds = MAX(avg_worked_seconds) BY languages | WHERE max_avg_worked_seconds == avg_worked_seconds | SORT languages ASC; @@ -304,12 +304,12 @@ emp_no:integer | avg_worked_seconds:long | max_avg_worked_seconds:long | languag ; maxOfLongByIntDouble -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, avg_worked_seconds, languages, height | EVAL height=ROUND(height, 1) -| INLINESTATS max_avg_worked_seconds = MAX(avg_worked_seconds) BY languages, height +| INLINE STATS max_avg_worked_seconds = MAX(avg_worked_seconds) BY languages, height | WHERE max_avg_worked_seconds == avg_worked_seconds | SORT languages, height ASC | LIMIT 4; @@ -322,13 +322,13 @@ emp_no:integer | avg_worked_seconds:long | max_avg_worked_seconds:long | languag ; two -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, avg_worked_seconds, gender -| INLINESTATS avg_avg_worked_seconds = AVG(avg_worked_seconds) BY languages +| INLINE STATS avg_avg_worked_seconds = AVG(avg_worked_seconds) BY languages | WHERE avg_worked_seconds > avg_avg_worked_seconds -| INLINESTATS max_languages = MAX(languages) BY gender +| INLINE STATS max_languages = MAX(languages) BY gender | SORT emp_no ASC | LIMIT 10; @@ -346,16 +346,16 @@ emp_no:integer |avg_worked_seconds:long|avg_avg_worked_seconds:double|languages: ; three -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, avg_worked_seconds, gender -| INLINESTATS avg_avg_worked_seconds = AVG(avg_worked_seconds) BY languages +| INLINE STATS avg_avg_worked_seconds = AVG(avg_worked_seconds) BY languages | WHERE avg_worked_seconds > avg_avg_worked_seconds -| INLINESTATS max_languages = MAX(languages) BY gender +| INLINE STATS max_languages = MAX(languages) BY gender | SORT emp_no ASC | LIMIT 10 -| INLINESTATS min(languages), max(languages) by gender +| INLINE STATS min(languages), max(languages) by gender ; emp_no:integer |avg_worked_seconds:long|avg_avg_worked_seconds:double|languages:integer|max_languages:integer|min(languages):integer|max(languages):integer|gender:keyword @@ -371,14 +371,14 @@ emp_no:integer |avg_worked_seconds:long|avg_avg_worked_seconds:double|languages: 10023 |330870342 |3.181719481E8 |null |5 |3 |5 |F ; -// TODO: INLINESTATS unit test needed for this one +// TODO: INLINE STATS unit test needed for this one // https://github.com/elastic/elasticsearch/issues/113727 pushDownSort_To_LeftSideOnly-Ignore -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | sort emp_no -| inlinestats avg = avg(salary) by languages +| inline stats avg = avg(salary) by languages | limit 5 | keep emp_no, avg, languages, gender ; @@ -392,10 +392,10 @@ from employees ; byMultivaluedSimple -required_capability: inlinestats_v11 +required_capability: inline_stats FROM airports -| INLINESTATS min_scalerank=MIN(scalerank) BY type +| INLINE STATS min_scalerank=MIN(scalerank) BY type | EVAL type=MV_SORT(type), min_scalerank=MV_SORT(min_scalerank) | KEEP abbrev, type, scalerank, min_scalerank | WHERE abbrev == "GWL" @@ -406,12 +406,12 @@ abbrev:keyword | type:keyword | scalerank:integer | min_scalerank:integer ; byMultivaluedMvExpand -required_capability: inlinestats_v11 +required_capability: inline_stats FROM airports | KEEP abbrev, type, scalerank | MV_EXPAND type -| INLINESTATS min_scalerank=MIN(scalerank) BY type +| INLINE STATS min_scalerank=MIN(scalerank) BY type | SORT min_scalerank ASC | WHERE abbrev == "GWL" ; @@ -422,12 +422,12 @@ GWL |9 |4 |military ; byMvExpand -required_capability: inlinestats_v11 +required_capability: inline_stats FROM airports | MV_EXPAND type | EVAL lat = ST_Y(location) -| INLINESTATS most_northern=MAX(lat), most_southern=MIN(lat) BY type +| INLINE STATS most_northern=MAX(lat), most_southern=MIN(lat) BY type | WHERE lat == most_northern OR lat == most_southern | SORT lat DESC | KEEP type, name, location @@ -447,11 +447,11 @@ FROM airports ; mvMinMvExpand -required_capability: inlinestats_v11 +required_capability: inline_stats FROM airports | EVAL original_type = type -| INLINESTATS min_scalerank=MIN(scalerank) BY type +| INLINE STATS min_scalerank=MIN(scalerank) BY type | MV_EXPAND type | EVAL mvMin_scalerank = MV_MIN(scalerank) | WHERE scalerank == MV_MIN(scalerank) @@ -470,11 +470,11 @@ ZAR |Zaria |POINT (7.7 11.0667) |Nigeria |POINT ( ; afterStats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM airports | STATS count=COUNT(*) BY country -| INLINESTATS avg=AVG(count) +| INLINE STATS avg=AVG(count) | WHERE count > avg * 3 | SORT count DESC, country ASC ; @@ -493,11 +493,11 @@ count:long | country:keyword | avg:double ; afterWhere -required_capability: inlinestats_v11 +required_capability: inline_stats FROM airports | WHERE country != "United States" -| INLINESTATS count=COUNT(*) BY country +| INLINE STATS count=COUNT(*) BY country | SORT count DESC, abbrev ASC | KEEP abbrev, country, count | LIMIT 4 @@ -511,7 +511,7 @@ abbrev:keyword | country:keyword | count:long ; afterLookup -required_capability: inlinestats_v11 +required_capability: inline_stats required_capability: join_lookup_v12 FROM airports @@ -520,7 +520,7 @@ FROM airports | LOOKUP JOIN languages_lookup ON language_code | RENAME language_name as scalerank | DROP language_code -| INLINESTATS count=COUNT(*) BY scalerank +| INLINE STATS count=COUNT(*) BY scalerank | SORT abbrev DESC | KEEP abbrev, *scalerank | LIMIT 5 @@ -535,7 +535,7 @@ ZNZ |4 |German ; afterEnrich -required_capability: inlinestats_v11 +required_capability: inline_stats required_capability: enrich_load FROM airports @@ -543,7 +543,7 @@ FROM airports | WHERE abbrev NOT IN ("ADJ", "ATQ") // Skip airports in regions with right-to-left text which the test file isn't good with | ENRICH city_names ON city WITH region | WHERE MV_COUNT(region) == 1 -| INLINESTATS COUNT(*) BY region +| INLINE STATS COUNT(*) BY region | SORT abbrev ASC | WHERE `COUNT(*)` > 1 | LIMIT 3 @@ -556,11 +556,11 @@ abbrev:keyword | city:keyword | "COUNT(*)":long | region:text ; beforeStats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM airports | EVAL lat = ST_Y(location) -| INLINESTATS avg_lat=AVG(lat) +| INLINE STATS avg_lat=AVG(lat) | STATS northern=COUNT(lat > avg_lat OR NULL), southern=COUNT(lat < avg_lat OR NULL) ; @@ -569,10 +569,10 @@ northern:long | southern:long ; beforeKeepSort -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| INLINESTATS max_salary = MAX(salary) by languages +| INLINE STATS max_salary = MAX(salary) by languages | KEEP emp_no, languages, max_salary | SORT emp_no ASC | LIMIT 3; @@ -584,10 +584,10 @@ emp_no:integer | languages:integer | max_salary:integer ; beforeKeepWhere -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| INLINESTATS max_salary = MAX(salary) by languages +| INLINE STATS max_salary = MAX(salary) by languages | KEEP emp_no, languages, max_salary | WHERE emp_no == 10003; @@ -597,12 +597,12 @@ emp_no:integer | languages:integer | max_salary:integer ; beforeEnrich -required_capability: inlinestats_v11 +required_capability: inline_stats required_capability: enrich_load FROM airports | KEEP abbrev, type, city -| INLINESTATS COUNT(*) BY type +| INLINE STATS COUNT(*) BY type | ENRICH city_names ON city WITH region | WHERE MV_COUNT(region) == 1 | SORT abbrev ASC @@ -616,15 +616,15 @@ ACA |Acapulco de Juárez|385 |major |Acapulco de ; beforeAndAfterEnrich -required_capability: inlinestats_v11 +required_capability: inline_stats required_capability: enrich_load FROM airports | KEEP abbrev, type, city -| INLINESTATS COUNT(*) BY type +| INLINE STATS COUNT(*) BY type | ENRICH city_names ON city WITH region | WHERE MV_COUNT(region) == 1 -| INLINESTATS count_region=COUNT(*) BY region +| INLINE STATS count_region=COUNT(*) BY region | SORT abbrev ASC | WHERE STARTS_WITH(abbrev, "AL") | LIMIT 5 @@ -639,10 +639,10 @@ ALL |Albenga |499 |mid |1 ; shadowing -required_capability: inlinestats_v11 +required_capability: inline_stats ROW left = "left", client_ip = "172.21.0.5", env = "env", right = "right" -| INLINESTATS env = VALUES(right) BY client_ip +| INLINE STATS env = VALUES(right) BY client_ip ; left:keyword | right:keyword | env:keyword | client_ip:keyword @@ -650,10 +650,10 @@ left | right | right | 172.21.0.5 ; shadowingMulti -required_capability: inlinestats_v11 +required_capability: inline_stats ROW left = "left", airport = "Zurich Airport ZRH", city = "Zürich", middle = "middle", region = "North-East Switzerland", right = "right" -| INLINESTATS airport=VALUES(left), region=VALUES(left), city_boundary=VALUES(left) BY city +| INLINE STATS airport=VALUES(left), region=VALUES(left), city_boundary=VALUES(left) BY city ; left:keyword | middle:keyword | right:keyword | airport:keyword | region:keyword | city_boundary:keyword | city:keyword @@ -661,10 +661,10 @@ left | middle | right | left | left ; shadowingSelf -required_capability: inlinestats_v11 +required_capability: inline_stats ROW city = "Raleigh" -| INLINESTATS city = COUNT(city) +| INLINE STATS city = COUNT(city) ; city:long @@ -672,37 +672,37 @@ city:long ; shadowingSelfBySelf -required_capability: inlinestats_v11 +required_capability: inline_stats ROW city = "Raleigh" -| INLINESTATS city = COUNT(city) BY city +| INLINE STATS city = COUNT(city) BY city ; -warning:Line 2:15: Field 'city' shadowed by field at line 2:37 +warning:Line 2:16: Field 'city' shadowed by field at line 2:38 city:keyword Raleigh ; shadowingInternal -required_capability: inlinestats_v11 +required_capability: inline_stats ROW city = "Zürich" -| INLINESTATS x = VALUES(city), x = VALUES(city) +| INLINE STATS x = VALUES(city), x = VALUES(city) ; -warning:Line 2:15: Field 'x' shadowed by field at line 2:33 +warning:Line 2:16: Field 'x' shadowed by field at line 2:34 city:keyword | x:keyword Zürich | Zürich ; multiInlinestatsWithRow -required_capability: inlinestats_v11 +required_capability: inline_stats row x = 1 -| inlinestats x = max(x) + min(x) +| inline stats x = max(x) + min(x) | eval y = x + 1 -| inlinestats sum(y) -| inlinestats count(y), count(x) +| inline stats sum(y) +| inline stats count(y), count(x) ; x:integer | y:integer | sum(y):long | count(y):long | count(x):long @@ -710,10 +710,10 @@ row x = 1 ; ignoreUnusedEvaledValue_AndInlineStats -required_capability: inlinestats_v11 +required_capability: inline_stats ROW x = 1 -| INLINESTATS max(x) +| INLINE STATS max(x) | EVAL y = x + 1 | KEEP x ; @@ -723,10 +723,10 @@ x:integer ; ignoreUnusedEvaledValue_AndInlineStats2 -required_capability: inlinestats_v11 +required_capability: inline_stats ROW x = 1, z = 2 -| INLINESTATS max(x) +| INLINE STATS max(x) | EVAL a = x + 1, b = z + 2 | KEEP x, z ; @@ -736,10 +736,10 @@ x:integer | z:integer ; ignoreUnusedEvaledValue_AndInlineStats3 -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats max(salary) +| inline stats max(salary) | eval y = salary + 1 | keep salary | sort salary desc @@ -751,10 +751,10 @@ from employees ; ignoreUnusedEvaledValue_AndInlineStats4 -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats max(salary), m = min(salary) by gender +| inline stats max(salary), m = min(salary) by gender | eval y = concat(gender, "") | keep emp_no | sort emp_no desc @@ -766,10 +766,10 @@ emp_no:integer ; ignoreUnusedEvaledValue_AndInlineStats5 -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats max(salary), m = min(salary) by gender +| inline stats max(salary), m = min(salary) by gender | eval y = m / 2 | keep emp_no | sort emp_no desc @@ -781,10 +781,10 @@ emp_no:integer ; shadowEntireInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| INLINESTATS x = avg(salary), y = min(salary) BY emp_no +| INLINE STATS x = avg(salary), y = min(salary) BY emp_no | EVAL x = emp_no, y = x | SORT x | KEEP x, y, emp_no @@ -796,11 +796,11 @@ x:integer |y:integer |emp_no:integer ; byConstant -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages -| INLINESTATS max_lang = MAX(languages) BY y=1 +| INLINE STATS max_lang = MAX(languages) BY y=1 | WHERE max_lang == languages | SORT emp_no ASC | LIMIT 5 @@ -815,11 +815,11 @@ emp_no:integer | languages:integer | max_lang:integer | y:integer ; aggConstant -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no -| INLINESTATS one = MAX(1) BY emp_no +| INLINE STATS one = MAX(1) BY emp_no | SORT emp_no ASC | LIMIT 5 ; @@ -833,11 +833,11 @@ one:integer | emp_no:integer ; percentile -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, salary -| INLINESTATS ninety_fifth_salary = PERCENTILE(salary, 95) +| INLINE STATS ninety_fifth_salary = PERCENTILE(salary, 95) | WHERE salary > ninety_fifth_salary | SORT emp_no ASC | LIMIT 5 @@ -852,12 +852,12 @@ emp_no:integer | salary:integer | ninety_fifth_salary:double ; byTwoCalculated -required_capability: inlinestats_v11 +required_capability: inline_stats FROM airports | WHERE abbrev IS NOT NULL | KEEP abbrev, scalerank, location -| INLINESTATS min_sl=MIN(scalerank) +| INLINE STATS min_sl=MIN(scalerank) BY lat_10 = ROUND(ST_Y(location), -1) , lon_10 = ROUND(ST_X(location), -1) | SORT abbrev DESC @@ -872,12 +872,12 @@ abbrev:keyword | scalerank:integer | location:geo_point byTwoCalculatedSecondOverwrites required_capability: stats_alias_collision_warnings -required_capability: inlinestats_v11 +required_capability: inline_stats FROM airports | WHERE abbrev IS NOT NULL | KEEP abbrev, scalerank, location -| INLINESTATS min_sl=MIN(scalerank) +| INLINE STATS min_sl=MIN(scalerank) BY x = ROUND(ST_Y(location), -1) , x = ROUND(ST_X(location), -1) | SORT abbrev DESC @@ -893,13 +893,13 @@ abbrev:keyword | scalerank:integer | location:geo_point byTwoCalculatedSecondOverwritesReferencingFirst required_capability: stats_alias_collision_warnings -required_capability: inlinestats_v11 +required_capability: inline_stats FROM airports | WHERE abbrev IS NOT NULL | KEEP abbrev, scalerank, location | EVAL x = ST_X(location) -| INLINESTATS min_sl=MIN(scalerank) +| INLINE STATS min_sl=MIN(scalerank) BY x = ROUND(x, -1) , x = ROUND(x, -1) | SORT abbrev DESC @@ -916,18 +916,18 @@ abbrev:keyword | scalerank:integer | location:geo_point groupShadowsAgg required_capability: stats_alias_collision_warnings -required_capability: inlinestats_v11 +required_capability: inline_stats FROM airports | WHERE abbrev IS NOT NULL | KEEP abbrev, scalerank, location -| INLINESTATS min_sl=MIN(scalerank) +| INLINE STATS min_sl=MIN(scalerank) BY min_sl = ROUND(ST_Y(location), -1) , lon_10 = ROUND(ST_X(location), -1) | SORT abbrev DESC | LIMIT 3 ; -warning:Line 4:15: Field 'min_sl' shadowed by field at line 5:4 +warning:Line 4:16: Field 'min_sl' shadowed by field at line 5:4 abbrev:keyword | scalerank:integer | location:geo_point | min_sl:double | lon_10:double ZRH | 3 | POINT(8.56221279534765 47.4523895064915) | 50 | 10 @@ -936,11 +936,11 @@ abbrev:keyword | scalerank:integer | location:geo_point ; groupShadowsField -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, salary, hire_date -| INLINESTATS avg_salary = AVG(salary) +| INLINE STATS avg_salary = AVG(salary) BY hire_date = DATE_TRUNC(1 year, hire_date) | WHERE salary > avg_salary | SORT emp_no ASC @@ -955,11 +955,11 @@ emp_no:integer | salary:integer | avg_salary:double | hire_date:datetime ; groupByExpression_And_ExistentField -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, gender | EVAL x = "ABC" -| INLINESTATS max_lang = MAX(languages) BY y = to_lower(x), gender +| INLINE STATS max_lang = MAX(languages) BY y = to_lower(x), gender | SORT emp_no ASC | LIMIT 5 ; @@ -973,10 +973,10 @@ emp_no:integer | languages:integer | x:keyword | max_lang:integer | y:keyword | ; groupByRenamedColumn -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, gender -| INLINESTATS max_lang = MAX(languages) BY y = gender +| INLINE STATS max_lang = MAX(languages) BY y = gender | WHERE max_lang == languages | SORT emp_no ASC | LIMIT 5 @@ -991,11 +991,11 @@ emp_no:integer | languages:integer | gender:keyword | max_lang:integer | y:keywo ; groupByMultipleRenamedColumns_AndOneExpression_Last -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, gender, first_name -| INLINESTATS max_lang = MAX(languages) BY y = gender, l = languages, f = left(first_name,1) +| INLINE STATS max_lang = MAX(languages) BY y = gender, l = languages, f = left(first_name,1) | SORT emp_no | LIMIT 10 ; @@ -1014,11 +1014,11 @@ emp_no:integer | languages:integer | gender:keyword|first_name:keyword|max_lang: ; groupByMultipleRenamedColumns_AndTwoExpressions -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, gender, first_name -| INLINESTATS max_lang = MAX(languages) BY f1 = left(first_name, 1), y = gender, f2 = left(first_name, 1), l = languages +| INLINE STATS max_lang = MAX(languages) BY f1 = left(first_name, 1), y = gender, f2 = left(first_name, 1), l = languages | SORT emp_no | LIMIT 10 ; @@ -1037,12 +1037,12 @@ emp_no:integer | languages:integer | gender:keyword|first_name:keyword|max_lang: ; groupByMultipleRenamedColumns_AndMultipleRenames -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, gender, first_name | RENAME first_name as f -| INLINESTATS max_lang = MAX(languages) BY y = gender, l = languages, first_name = left(f, 1) +| INLINE STATS max_lang = MAX(languages) BY y = gender, l = languages, first_name = left(f, 1) | SORT emp_no | LIMIT 10 ; @@ -1061,12 +1061,12 @@ emp_no:integer | languages:integer | gender:keyword| f:keyword |max_lang: ; groupByMultipleRenamedColumns_AndSameNameExpressionGroupingOverride -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, gender, first_name | RENAME first_name as f -| INLINESTATS max_lang = MAX(languages) BY y = gender, l = languages, f = left(f, 1) +| INLINE STATS max_lang = MAX(languages) BY y = gender, l = languages, f = left(f, 1) | SORT emp_no | LIMIT 10 ; @@ -1085,12 +1085,12 @@ emp_no:integer | languages:integer | gender:keyword|max_lang:integer| y:keyword ; twoAggregatesGroupedBy_AField_And_AnExpression -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, gender, last_name | WHERE gender IS NOT NULL -| INLINESTATS max_lang = MAX(languages), min_lang = MIN(languages) BY f = left(last_name, 1), gender +| INLINE STATS max_lang = MAX(languages), min_lang = MIN(languages) BY f = left(last_name, 1), gender | SORT last_name DESC | LIMIT 8 ; @@ -1107,11 +1107,11 @@ emp_no:integer |languages:integer|last_name:keyword|max_lang:integer|min_lang:in ; groupByMultipleRenamedColumns_InversedOrder -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, still_hired, gender -| INLINESTATS max_lang = MAX(languages) BY y = gender, z = still_hired +| INLINE STATS max_lang = MAX(languages) BY y = gender, z = still_hired | SORT emp_no ASC | LIMIT 5 ; @@ -1125,12 +1125,12 @@ emp_no:integer |languages:integer|still_hired:boolean| gender:keyword|max_lang:i ; groupByMultipleRenamedColumns_InversedOrder_ComplexEval -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, still_hired, gender | EVAL multilingual = CASE(languages <= 1, "monolingual", languages <= 2, "bilingual", "polyglot") -| INLINESTATS max_lang = MAX(languages) BY y = gender, z = still_hired +| INLINE STATS max_lang = MAX(languages) BY y = gender, z = still_hired | SORT emp_no ASC | LIMIT 5 ; @@ -1144,12 +1144,12 @@ emp_no:integer |languages:integer|still_hired:boolean| gender:keyword|multilingu ; groupByMultipleRenamedColumns_AndComplexEval -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, still_hired, gender | EVAL multilingual = CASE(languages <= 1, "monolingual", languages <= 2, "bilingual", "polyglot") -| INLINESTATS max_lang = MAX(languages) BY y = gender, z = still_hired, m = multilingual +| INLINE STATS max_lang = MAX(languages) BY y = gender, z = still_hired, m = multilingual | SORT emp_no ASC | LIMIT 5 ; @@ -1163,12 +1163,12 @@ emp_no:integer |languages:integer|still_hired:boolean| gender:keyword|multilingu ; groupByMultipleRenamedColumns_AndConstantValue -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, gender, first_name | EVAL x = "ABC" -| INLINESTATS max_lang = MAX(languages) BY y = gender, l = languages, f = to_lower(x) +| INLINE STATS max_lang = MAX(languages) BY y = gender, l = languages, f = to_lower(x) | SORT emp_no | LIMIT 10 ; @@ -1187,12 +1187,12 @@ emp_no:integer |languages:integer|gender:keyword |first_name:keyword | x:keyw ; groupByRenamedExpression -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP emp_no, languages, gender, last_name | WHERE gender IS NOT NULL -| INLINESTATS max_lang = MAX(languages), min_lang = MIN(languages) BY f = left(last_name, 1), gender +| INLINE STATS max_lang = MAX(languages), min_lang = MIN(languages) BY f = left(last_name, 1), gender | SORT last_name DESC | LIMIT 8 ; @@ -1209,10 +1209,10 @@ emp_no:integer |languages:integer|last_name:keyword|max_lang:integer|min_lang:in ; doubleFilterOnLeftAndRight_InlineStats_Sides -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| INLINESTATS max_salary = MAX(salary), min_salary = MIN(salary) by languages +| INLINE STATS max_salary = MAX(salary), min_salary = MIN(salary) by languages | KEEP emp_no, languages, *salary | WHERE salary > 65000 and languages > 2 | SORT emp_no @@ -1230,10 +1230,10 @@ emp_no:integer |languages:integer|salary:integer |max_salary:integer|min_salary: ; filterOnInlineStatsAggs -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| INLINESTATS max_salary = MAX(salary), min_salary = MIN(salary) by languages +| INLINE STATS max_salary = MAX(salary), min_salary = MIN(salary) by languages | KEEP emp_no, languages, *salary | WHERE min_salary > 27000 or max_salary < 70000 | sort salary desc @@ -1249,10 +1249,10 @@ emp_no:integer |languages:integer|salary:integer |max_salary:integer|min_salary: ; filterOnInlineStatsAggsValues_And_Groupings -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| INLINESTATS max_salary = MAX(salary), min_salary = MIN(salary) by languages +| INLINE STATS max_salary = MAX(salary), min_salary = MIN(salary) by languages | KEEP emp_no, languages, *salary | WHERE (min_salary > 27000 or max_salary < 70000) and languages > 3 | sort salary @@ -1268,11 +1268,11 @@ emp_no:integer |languages:integer|salary:integer |max_salary:integer|min_salary: ; inlineStatsOverrideEVALed_FieldWithSameName -required_capability: inlinestats_v11 +required_capability: inline_stats FROM hosts METADATA _index | EVAL x = ip1 -| INLINESTATS ip1 = COUNT(*) BY host_group, card +| INLINE STATS ip1 = COUNT(*) BY host_group, card | SORT ip1 DESC, x | LIMIT 1 ; @@ -1282,11 +1282,11 @@ beta k8s server |beta |127.0.0.1 |hosts |127.0.0.2|2 ; inlineStatsOverrideEVALed_FieldWithSameNameNoIndex -required_capability: inlinestats_v11 +required_capability: inline_stats FROM hosts | EVAL x = ip1 -| INLINESTATS ip1 = COUNT(*) BY host_group, card +| INLINE STATS ip1 = COUNT(*) BY host_group, card | SORT ip1 DESC, x | LIMIT 1 ; @@ -1296,11 +1296,11 @@ beta k8s server |beta |127.0.0.1 |127.0.0.2|2 |Kubernetes ; doubleShadowing -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| INLINESTATS salary = min(salary) BY gender -| INLINESTATS salary = max(salary) BY gender +| INLINE STATS salary = min(salary) BY gender +| INLINE STATS salary = max(salary) BY gender | KEEP salary, gender | SORT salary DESC, gender | LIMIT 5 @@ -1315,13 +1315,13 @@ salary:integer |gender:keyword ; doubleShadowing_WithIntertwinedFilters -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | WHERE salary > 30000 -| INLINESTATS salary = min(salary) BY gender +| INLINE STATS salary = min(salary) BY gender | WHERE salary > 31000 -| INLINESTATS salary = max(salary) BY gender +| INLINE STATS salary = max(salary) BY gender | WHERE salary < 31500 | KEEP salary, gender | SORT salary DESC, gender @@ -1340,12 +1340,12 @@ salary:integer |gender:keyword ; shadowingAggregateByNextGrouping -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP gender, languages, emp_no, salary -| INLINESTATS gender = count_distinct(gender) BY languages -| INLINESTATS avg(salary) BY gender +| INLINE STATS gender = count_distinct(gender) BY languages +| INLINE STATS avg(salary) BY gender | SORT emp_no | LIMIT 3 ; @@ -1357,12 +1357,12 @@ emp_no:integer |salary:integer |languages:integer|avg(salary):double|gender:long ; doubleShadowingWithEval -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | eval salary = salary/100 -| inlinestats salary=min(salary) by gender -| inlinestats salary=max(salary) by gender +| inline stats salary=min(salary) by gender +| inline stats salary=max(salary) by gender | keep salary, gender | sort salary desc, gender | limit 5 @@ -1377,13 +1377,13 @@ salary:integer|gender:keyword ; doubleShadowingWithDoubleStats -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | stats salary=min(salary) by gender | stats salary=max(salary) by gender -| inlinestats salary=min(salary) -| inlinestats salary=max(salary) +| inline stats salary=min(salary) +| inline stats salary=max(salary) ; ignoreOrder:true @@ -1394,11 +1394,11 @@ M |25324 ; renamingGroupingWithItself -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | EVAL x = gender -| INLINESTATS min_sl = MIN(salary) BY x = x +| INLINE STATS min_sl = MIN(salary) BY x = x | SORT salary DESC | KEEP salary, x, gender, min_sl, emp_no | LIMIT 5 @@ -1413,15 +1413,15 @@ salary:integer |x:keyword|gender:keyword |min_sl:integer |emp_no:integer ; overridingGroupings -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| INLINESTATS min_sl = MIN(salary) BY x = gender, x = languages +| INLINE STATS min_sl = MIN(salary) BY x = gender, x = languages | KEEP salary, x, gender, min_sl, emp_no | SORT salary | LIMIT 5 ; -warning:Line 2:39: Field 'x' shadowed by field at line 2:51 +warning:Line 2:40: Field 'x' shadowed by field at line 2:52 salary:integer |x:integer |gender:keyword |min_sl:integer |emp_no:integer 25324 |5 |null |25324 |10015 @@ -1432,15 +1432,15 @@ salary:integer |x:integer |gender:keyword |min_sl:integer |emp_no:integer ; overridingExpressionGroupings -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| INLINESTATS min_sl = MIN(salary) BY x = TO_LOWER(gender), x = CONCAT(gender, gender) +| INLINE STATS min_sl = MIN(salary) BY x = TO_LOWER(gender), x = CONCAT(gender, gender) | SORT salary DESC | KEEP salary, x, gender, min_sl, emp_no | LIMIT 5 ; -warning:Line 2:39: Field 'x' shadowed by field at line 2:61 +warning:Line 2:40: Field 'x' shadowed by field at line 2:62 salary:integer |x:keyword |gender:keyword |min_sl:integer |emp_no:integer 74999 |MM |M |25945 |10029 @@ -1451,12 +1451,12 @@ salary:integer |x:keyword |gender:keyword |min_sl:integer |emp_no:integer ; reusingEvalExpressions_UsedInGroupings -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | KEEP salary, gender, emp_no | EVAL x = TO_LOWER(gender), x = CONCAT(x, " ", x) -| INLINESTATS min_sl = MIN(salary) BY x +| INLINE STATS min_sl = MIN(salary) BY x | SORT salary DESC | LIMIT 5 ; @@ -1470,11 +1470,11 @@ salary:integer |gender:keyword |emp_no:integer |min_sl:integer | x:keyword ; statsBeforeInlinestatsWithTopAndBucket1 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM books | STATS avg_rating = AVG(ratings) BY decade = BUCKET(year, 10) -| INLINESTATS decades = TOP(decade, 3, "DESC") +| INLINE STATS decades = TOP(decade, 3, "DESC") | SORT avg_rating DESC | LIMIT 10 ; @@ -1490,11 +1490,11 @@ avg_rating:double | decade:double | decades:double ; statsBeforeInlinestatsWithTopAndBucket2 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data | STATS total_duration = SUM(event_duration) BY day = BUCKET(@timestamp, 1 HOUR) -| INLINESTATS days = TOP(day, 2, "ASC") +| INLINE STATS days = TOP(day, 2, "ASC") | SORT total_duration ASC | LIMIT 5 ; @@ -1505,12 +1505,12 @@ total_duration:long | day:date | days:date ; evalBeforeDoubleInlinestats1 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | EVAL salaryK = salary/1000 -| INLINESTATS count = COUNT(*) BY salaryK -| INLINESTATS min = MIN(MV_COUNT(languages)) BY salaryK +| INLINE STATS count = COUNT(*) BY salaryK +| INLINE STATS min = MIN(MV_COUNT(languages)) BY salaryK | SORT emp_no | KEEP emp_no, still_hired, count | LIMIT 5 @@ -1525,12 +1525,12 @@ emp_no:integer |still_hired:boolean|count:long ; evalBeforeDoubleInlinestats2 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | EVAL jobs = MV_COUNT(job_positions) -| INLINESTATS count = COUNT(*) BY jobs -| INLINESTATS min = MIN(MV_COUNT(languages)) BY jobs +| INLINE STATS count = COUNT(*) BY jobs +| INLINE STATS min = MIN(MV_COUNT(languages)) BY jobs | SORT emp_no | KEEP emp_no, jobs, count, min | LIMIT 5 @@ -1545,12 +1545,12 @@ emp_no:integer |jobs:integer|count:long|min:integer ; evalBeforeInlinestatsAndKeepAfter1 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | WHERE still_hired == false | EVAL sal = salary/1000 -| INLINESTATS totalK = SUM(sal), count=COUNT(*) BY gender +| INLINE STATS totalK = SUM(sal), count=COUNT(*) BY gender | KEEP emp_no, still_hired, totalK, count | SORT emp_no | LIMIT 5 @@ -1565,11 +1565,11 @@ emp_no:integer |still_hired:boolean|totalK:long|count:long ; evalBeforeInlinestatsAndKeepAfter2 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | EVAL salaryK = salary/1000 -| INLINESTATS total = SUM(salaryK), count=COUNT(*) BY gender +| INLINE STATS total = SUM(salaryK), count=COUNT(*) BY gender | KEEP emp_no, still_hired, total, count | WHERE still_hired == false | SORT emp_no @@ -1585,11 +1585,11 @@ emp_no:integer |still_hired:boolean|total:long|count:long ; evalBeforeInlinestatsAndKeepAfter3 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | EVAL salaryK = salary/1000 -| INLINESTATS total = SUM(salaryK) BY gender +| INLINE STATS total = SUM(salaryK) BY gender | KEEP emp_no, still_hired, total | SORT emp_no | LIMIT 5 @@ -1604,11 +1604,11 @@ emp_no:integer |still_hired:boolean|total:long ; evalBeforeInlinestatsAndKeepAfter4 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | EVAL salaryK = salary/1000 -| INLINESTATS count = COUNT(*) BY salaryK +| INLINE STATS count = COUNT(*) BY salaryK | KEEP emp_no, still_hired, count | SORT emp_no | LIMIT 5 @@ -1623,11 +1623,11 @@ emp_no:integer |still_hired:boolean|count:long ; evalBeforeInlinestatsAndKeepAfter5 -required_capability: inlinestats_v11 +required_capability: inline_stats ROW salary = 12300, emp_no = 5, gender = "F" | EVAL salaryK = salary/1000 -| INLINESTATS sum = SUM(salaryK) BY gender +| INLINE STATS sum = SUM(salaryK) BY gender | KEEP emp_no ; @@ -1635,15 +1635,15 @@ emp_no:integer 5 ; /////////////////////////// -// inlinestats with filters +// INLINE STATS with filters /////////////////////////// doubleFilterOnInlineStats -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | keep salary, gender -| inlinestats max1 = max(salary) where salary < 60000, +| inline stats max1 = max(salary) where salary < 60000, max2 = max(salary) where salary < 70000 AND salary >= 60000, max3 = max(salary) where salary >= 70000 by gender @@ -1665,9 +1665,9 @@ salary:integer | max1:integer | max2:integer | max3:integer | gender:keyword ; inlinestatsWithFiltering -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats max = max(salary), max_f = max(salary) where salary < 50000, max_a = max(salary) where salary > 100, +| inline stats max = max(salary), max_f = max(salary) where salary < 50000, max_a = max(salary) where salary > 100, min = min(salary), min_f = min(salary) where salary > 50000, min_a = min(salary) where salary > 100 | keep max*, min*, salary | sort salary asc @@ -1681,9 +1681,9 @@ max:integer |max_f:integer |max_a:integer | min:integer | min_f:integer | min_a: ; inlinestatsWithEverythingFiltered -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats max = max(salary), max_a = max(salary) where salary < 100, +| inline stats max = max(salary), max_a = max(salary) where salary < 100, min = min(salary), min_a = min(salary) where salary > 99999 | keep max*, min*, emp_no*, salary | sort emp_no desc @@ -1699,9 +1699,9 @@ max:integer |max_a:integer|min:integer | min_a:integer | emp_no:integer|salary:i ; inlinestatsWithNullFilter -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats max = max(salary), max_a = max(salary) where null, +| inline stats max = max(salary), max_a = max(salary) where null, min = min(salary), min_a = min(salary) where to_string(null) == "abc" | keep max*, min*, emp_no | sort emp_no @@ -1715,9 +1715,9 @@ max:integer |max_a:integer|min:integer | min_a:integer | emp_no:integer ; inlinestatsWithAllFiltersFalse -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats max = max(height.float) where false, +| inline stats max = max(height.float) where false, min = min(height.float) where to_string(null) == "abc", count = count(height.float) where false, count_distinct = count_distinct(salary) where to_string(null) == "def" @@ -1733,9 +1733,9 @@ emp_no:integer|salary:integer| max:double |min:double |count:long |count_distinc ; inlinestatsWithAllFiltersFalse_GroupByOneField -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats max = max(height.float) where false, +| inline stats max = max(height.float) where false, min = min(height.float) where to_string(null) == "abc", count = count(height.float) where false, count_distinct = count_distinct(salary) where to_string(null) == "def" by gender @@ -1753,9 +1753,9 @@ from employees ; inlinestatsWithAllFiltersFalse_GroupByTwoFields -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats max = max(height.float) where false, +| inline stats max = max(height.float) where false, min = min(height.float) where to_string(null) == "abc", count = count(height.float) where false, count_distinct = count_distinct(salary) where to_string(null) == "def" by gender, languages @@ -1773,13 +1773,13 @@ from employees ; prunedInlinestatsFollowedByInlinestats_GroupByOneFieldEach_DifferentFields -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | eval my_length = length(concat(first_name, null)) -| inlinestats count = count(my_length) where false, +| inline stats count = count(my_length) where false, values = mv_slice(values(first_name), 0, 1) where my_length > 0 by languages | keep emp_no, first_name, *length, count, values, languages, gender -| inlinestats count_distinct = count_distinct(count) by gender +| inline stats count_distinct = count_distinct(count) by gender | sort emp_no | limit 3 ; @@ -1791,13 +1791,13 @@ from employees ; prunedInlinestatsFollowedByInlinestats_GroupByOneFieldEach_SameFields -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | eval my_length = length(concat(first_name, null)) -| inlinestats count = count(my_length) where false, +| inline stats count = count(my_length) where false, values = mv_slice(values(first_name), 0, 1) where my_length > 0 by languages | keep emp_no, first_name, *length, count, values, languages, gender -| inlinestats count_distinct = count_distinct(count) by languages +| inline stats count_distinct = count_distinct(count) by languages | sort emp_no | limit 3 ; @@ -1810,13 +1810,13 @@ from employees prunedInlinestatsFollowedByInlinestats_GroupByOneFieldOnSecondInlinestats-Ignore // values doesn't end up as null -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | eval my_length = length(concat(first_name, null)) -| inlinestats count = count(my_length) where false, +| inline stats count = count(my_length) where false, values = mv_slice(values(first_name), 0, 1) where my_length > 0 | keep emp_no, first_name, *length, count, values, languages, gender -| inlinestats count_distinct = count_distinct(count) by languages +| inline stats count_distinct = count_distinct(count) by languages | sort emp_no | limit 3 ; @@ -1828,13 +1828,13 @@ from employees ; partial_PrunedInlinestatsFollowedByInlinestats_GroupByOneFieldOnFirstInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | eval my_length = length(concat(first_name, null)) -| inlinestats count = count(is_rehired) where true, +| inline stats count = count(is_rehired) where true, values = mv_slice(values(first_name), 0, 1) where my_length > 0 by gender | keep emp_no, first_name, *length, count, values, languages, gender -| inlinestats count_distinct = count_distinct(count) +| inline stats count_distinct = count_distinct(count) | sort emp_no | limit 10 ; @@ -1854,14 +1854,14 @@ from employees partial_PrunedInlinestatsFollowedByInlinestats_GroupByOneFieldOnFirstInlinestats2 -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | eval my_length = length(concat(first_name, null)) -| inlinestats count = count(is_rehired) where true, +| inline stats count = count(is_rehired) where true, values = mv_slice(values(first_name), 0, 1) where my_length > 0, count_d = count_distinct(is_rehired) by gender | keep emp_no, first_name, *length, count*, values, languages, gender -| inlinestats count_distinct = count_distinct(count) +| inline stats count_distinct = count_distinct(count) | sort emp_no | limit 10 ; @@ -1881,11 +1881,11 @@ from employees inlinestatsWithExpressionsAllFiltersFalse -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | keep height.f*, emp_no | sort emp_no desc -| inlinestats max = max(height.float + 1) where null, +| inline stats max = max(height.float + 1) where null, count = count(height.float) + 2 where false, mix = min(height.float + 1) + count_distinct(emp_no) + 2 where length(null) == 3 | limit 3 @@ -1899,9 +1899,9 @@ from employees ; inlinestatsWithFalseFilterAndGroup -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats max = max(height.float + 1) where null, +| inline stats max = max(height.float + 1) where null, count = count(height.float) + 2 where false by job_positions | sort emp_no desc @@ -1917,10 +1917,10 @@ from employees ; inlinestatsWithFalseFiltersAndGroups -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | eval my_length = length(concat(first_name, null)) -| inlinestats count_distinct = count_distinct(height.float + 1) where null, +| inline stats count_distinct = count_distinct(height.float + 1) where null, count = count(height.float) + 2 where false, values = values(first_name) where my_length > 3 by job_positions, is_rehired @@ -1943,10 +1943,10 @@ from employees ; inlinestatsWithFalseFiltersAndGroups_DropEvaledValue -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | eval my_length = length(concat(first_name, null)) -| inlinestats count_distinct = count_distinct(height.float + 1) where null, +| inline stats count_distinct = count_distinct(height.float + 1) where null, count = count(height.float) + 2 where false, values = values(first_name) where my_length > 3 by job_positions, is_rehired @@ -1970,10 +1970,10 @@ from employees ; inlinestatsWithMixedFiltersAndGroup -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | eval my_length = length(concat(first_name, null)) -| inlinestats count = count(my_length) where false, +| inline stats count = count(my_length) where false, values = mv_slice(mv_sort(values(first_name)), 0, 1) by job_positions | sort emp_no @@ -1990,13 +1990,13 @@ null |[0, 0, 0, 0] |[Berni, Chirstian, Amabile, Berni, Bojan, Chir prunedInlinestatsFollowedByinlinestats-Ignore // values doesn't end up as null -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | eval my_length = length(concat(first_name, null)) -| inlinestats count = count(my_length) where false, +| inline stats count = count(my_length) where false, values = mv_slice(values(first_name), 0, 1) where my_length > 0 | keep emp_no, first_name, *length, count, values -| inlinestats count_distinct = count_distinct(count) +| inline stats count_distinct = count_distinct(count) | sort emp_no | limit 3 ; @@ -2014,9 +2014,9 @@ inlinestatsWithFalseFiltersFromRow // null |3 // null |4 // TODO: add docs about whatever behavior is decided here -required_capability: inlinestats_v11 +required_capability: inline_stats row x = null, a = 1, b = [2,3,4] -| inlinestats c=max(a) where x +| inline stats c=max(a) where x by b ; @@ -2025,9 +2025,9 @@ null |1 |null |[2, 3, 4] ; inlinestatsWithBasicExpressionFiltered -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats max = max(salary), max_f = max(salary) where salary < 50000, +| inline stats max = max(salary), max_f = max(salary) where salary < 50000, min = min(salary), min_f = min(salary) where salary > 50000, exp_p = max(salary) + 10000 where salary < 50000, exp_m = min(salary) % 10000 where salary > 50000 @@ -2041,9 +2041,9 @@ from employees ; inlinestatsWithExpressionOverFilters -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats max = max(salary), max_f = max(salary) where salary < 50000, +| inline stats max = max(salary), max_f = max(salary) where salary < 50000, min = min(salary), min_f = min(salary) where salary > 50000, exp_gt = max(salary) - min(salary) where salary > 50000, exp_lt = max(salary) - min(salary) where salary < 50000 @@ -2060,9 +2060,9 @@ from employees inlinestatsWithExpressionOfExpressionsOverFilters -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats max = max(salary + 1), max_f = max(salary + 2) where salary < 50000, +| inline stats max = max(salary + 1), max_f = max(salary + 2) where salary < 50000, min = min(salary - 1), min_f = min(salary - 2) where salary > 50000, exp_gt = max(salary + 3) - min(salary - 3) where salary > 50000, exp_lt = max(salary + 4) - min(salary - 4) where salary < 50000 @@ -2078,9 +2078,9 @@ from employees ; inlinestatsWithSubstitutedExpressionOverFilters -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats sum = sum(salary), s_l = sum(salary) where salary < 50000, s_u = sum(salary) where salary > 50000, +| inline stats sum = sum(salary), s_l = sum(salary) where salary < 50000, s_u = sum(salary) where salary > 50000, count = count(salary), c_l = count(salary) where salary < 50000, c_u = count(salary) where salary > 50000, avg = round(avg(salary), 2), a_l = round(avg(salary), 2) where salary < 50000, a_u = round(avg(salary),2) where salary > 50000 | keep sum, s_*, count, c_*, avg, a_*, emp_no @@ -2096,10 +2096,10 @@ from employees inlinestatsWithFilterAndGroupBy -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | keep height, gender, is_rehired, emp_no -| inlinestats m = max(height), m_f = max(height + 1) where gender == "M" OR is_rehired is null BY gender, is_rehired +| inline stats m = max(height), m_f = max(height + 1) where gender == "M" OR is_rehired is null BY gender, is_rehired | sort emp_no | drop height | limit 10 @@ -2120,9 +2120,9 @@ from employees inlinestatsWithFilterOnGroupBy -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats m_f = max(height) where gender == "M" BY gender +| inline stats m_f = max(height) where gender == "M" BY gender | sort emp_no | keep gender, m_f | limit 10 @@ -2142,9 +2142,9 @@ null |null ; inlinestatsWithGroupByLiteral -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats m = max(languages) by salary = 2 +| inline stats m = max(languages) by salary = 2 | sort salary | keep m, salary | limit 3 @@ -2158,9 +2158,9 @@ from employees inlinestatsWithFilterOnSameColumn -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats m = max(languages), m_f = max(languages) where salary > 50000 by salary = 2 +| inline stats m = max(languages), m_f = max(languages) where salary > 50000 by salary = 2 | sort salary | keep m, m_f, salary | limit 3 @@ -2173,9 +2173,9 @@ from employees ; inlinestatsWithFilteringAndGrouping -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats c = count(), c_f = count(languages) where l > 1, +| inline stats c = count(), c_f = count(languages) where l > 1, m_f = max(height) where salary > 50000 by l = languages | sort salary @@ -2198,12 +2198,12 @@ from employees multiinlinestatsWithFiltering -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats c = count(), c_f = count(languages) where l > 1, +| inline stats c = count(), c_f = count(languages) where l > 1, m_f = max(height) where salary > 50000 by l = languages -| inlinestats c2 = count(), c2_f = count() where m_f > 2.06 , m2 = max(l), m2_f = max(l) where l > 1 by c +| inline stats c2 = count(), c2_f = count() where m_f > 2.06 , m2 = max(l), m2_f = max(l) where l > 1 by c | sort emp_no | where emp_no >= 10029 and emp_no <= 10039 | keep c, *_f, l, c2, m2 @@ -2225,9 +2225,9 @@ from employees simpleCountOnFieldWithFilteringAndNoGrouping -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats c1 = count(emp_no) where emp_no < 10042 +| inline stats c1 = count(emp_no) where emp_no < 10042 | keep emp_no, c1 | sort emp_no | limit 3 @@ -2240,9 +2240,9 @@ emp_no:integer | c1:long ; simpleCountOnFieldWithFilteringOnDifferentFieldAndNoGrouping -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats c1 = count(hire_date) where emp_no < 10042 +| inline stats c1 = count(hire_date) where emp_no < 10042 | keep emp_no, c1 | sort emp_no | limit 3 @@ -2255,9 +2255,9 @@ emp_no:integer | c1:long ; simpleCountOnStarWithFilteringAndNoGrouping -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats c1 = count(*) where emp_no < 10042 +| inline stats c1 = count(*) where emp_no < 10042 | keep emp_no, c1 | sort emp_no | limit 3 @@ -2270,9 +2270,9 @@ emp_no:integer | c1:long ; simpleCountWithFilteringAndNoGroupingOnFieldWithNulls -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats c1 = count(birth_date) where emp_no <= 10050 +| inline stats c1 = count(birth_date) where emp_no <= 10050 | keep emp_no, c1 | sort emp_no | limit 3 @@ -2286,9 +2286,9 @@ emp_no:integer | c1:long simpleCountWithFilteringAndNoGroupingOnFieldWithMultivalues -required_capability: inlinestats_v11 +required_capability: inline_stats from employees -| inlinestats c1 = count(job_positions) where emp_no <= 10003 +| inline stats c1 = count(job_positions) where emp_no <= 10003 | keep emp_no, c1 | sort emp_no | limit 3 @@ -2301,11 +2301,11 @@ from employees ; commonFilterExtractionWithAliasing -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | eval eno = emp_no | drop emp_no -| inlinestats min_sal = min(salary) where eno <= 10010, +| inline stats min_sal = min(salary) where eno <= 10010, min_hei = min(height) where eno <= 10010 | keep eno, min_* | sort eno @@ -2319,10 +2319,10 @@ from employees ; commonFilterExtractionWithAliasAndOriginal -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | eval eno = emp_no -| inlinestats min_sal = min(salary) where eno <= 10010, +| inline stats min_sal = min(salary) where eno <= 10010, min_hei = min(height) where emp_no <= 10010 | keep emp_no, min_* | sort emp_no @@ -2337,10 +2337,10 @@ from employees commonFilterExtractionWithAliasAndOriginalNeedingNormalization -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | eval eno = emp_no -| inlinestats min_sal = min(salary) where eno <= 10010, +| inline stats min_sal = min(salary) where eno <= 10010, min_hei = min(height) where emp_no <= 10010, max_hei = max(height) where 10010 >= emp_no | keep eno, min*, max* @@ -2357,10 +2357,10 @@ from employees ; commonFilterExtractionWithAliasAndOriginalNeedingNormalizationAndSimplification -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | eval eno = emp_no -| inlinestats min_sal = min(salary) where eno <= 10010, +| inline stats min_sal = min(salary) where eno <= 10010, min_hei = min(height) where not (emp_no > 10010), max_hei = max(height) where 10010 >= emp_no | keep eno, min*, max* @@ -2377,9 +2377,9 @@ from employees ; filterIsAlwaysTrue -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| inlinestats max = max(salary) WHERE salary > 0 +| inline stats max = max(salary) WHERE salary > 0 | keep max, salary, emp_no | sort emp_no | limit 3 @@ -2392,9 +2392,9 @@ FROM employees ; filterIsAlwaysFalse -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| inlinestats max = max(salary) WHERE first_name == "" +| inline stats max = max(salary) WHERE first_name == "" | sort emp_no | keep max, first_name | limit 10 @@ -2415,9 +2415,9 @@ null |Duangkaew filterSometimesMatches -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| inlinestats max = max(salary) WHERE first_name IS NULL +| inline stats max = max(salary) WHERE first_name IS NULL | sort emp_no | keep max, first_name | limit 10 @@ -2437,10 +2437,10 @@ FROM employees ; groupingFilterIsAlwaysTrue -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | MV_EXPAND job_positions -| inlinestats max = max(salary) WHERE salary > 0 BY job_positions = SUBSTRING(job_positions, 1, 1) +| inline stats max = max(salary) WHERE salary > 0 BY job_positions = SUBSTRING(job_positions, 1, 1) | SORT job_positions, emp_no | LIMIT 4 | keep max, salary, first_name, job_positions, emp_no @@ -2455,10 +2455,10 @@ FROM employees groupingFilterIsAlwaysFalse -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | MV_EXPAND job_positions -| inlinestats max = max(salary) WHERE first_name == "" BY job_positions = SUBSTRING(job_positions, 1, 1) +| inline stats max = max(salary) WHERE first_name == "" BY job_positions = SUBSTRING(job_positions, 1, 1) | SORT job_positions, emp_no | LIMIT 4 | keep max, salary, first_name, job_positions, emp_no @@ -2473,10 +2473,10 @@ null |48942 |Patricio |A |10012 groupingFilterSometimesMatches -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | MV_EXPAND job_positions -| inlinestats max = max(salary) WHERE first_name IS NULL BY job_positions = SUBSTRING(job_positions, 1, 1) +| inline stats max = max(salary) WHERE first_name IS NULL BY job_positions = SUBSTRING(job_positions, 1, 1) | SORT job_positions, emp_no | LIMIT 4 | keep max, salary, first_name, job_positions, emp_no @@ -2490,9 +2490,9 @@ FROM employees ; groupingByOrdinalsFilterIsAlwaysTrue -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| inlinestats max = max(salary) WHERE salary > 0 BY job_positions +| inline stats max = max(salary) WHERE salary > 0 BY job_positions | SORT job_positions ASC, salary DESC | LIMIT 4 | keep max, salary, job_positions, emp_no @@ -2506,10 +2506,10 @@ FROM employees ; groupingByOrdinalsFilterIsAlwaysFalse -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| inlinestats max = max(salary) WHERE first_name == "" BY job_positions +| inline stats max = max(salary) WHERE first_name == "" BY job_positions | SORT job_positions DESC NULLS last, emp_no | LIMIT 4 | keep first_name, salary, emp_no, job_positions, max @@ -2523,11 +2523,11 @@ Mary |31120 |10011 |[Architect, Reporting Analyst, S ; groupingByOrdinalsFilterSometimesMatches -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees | keep salary, first_name, job_positions, emp_no -| inlinestats max = max(salary) WHERE first_name IS NULL BY job_positions +| inline stats max = max(salary) WHERE first_name IS NULL BY job_positions | SORT emp_no | LIMIT 4 ; @@ -2540,9 +2540,9 @@ FROM employees ; stdDevFilter -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees -| inlinestats greater_than = STD_DEV(salary_change) WHERE languages > 3 +| inline stats greater_than = STD_DEV(salary_change) WHERE languages > 3 , less_than = STD_DEV(salary_change) WHERE languages <= 3 , salary = STD_DEV(salary * 2) , count = COUNT(*) BY gender @@ -2565,13 +2565,13 @@ FROM employees ; twoConsecutiveInlinestatsWithFalseFilters -required_capability: inlinestats_v11 +required_capability: inline_stats from employees | keep emp_no | sort emp_no | limit 3 -| inlinestats count = count(*) where false -| inlinestats cc = count_distinct(emp_no) where false +| inline stats count = count(*) where false +| inline stats cc = count_distinct(emp_no) where false ; emp_no:i | count:l | cc:l @@ -2585,11 +2585,11 @@ from employees //////////////////////////////// singleIndexIpInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data | EVAL client_ip = client_ip::ip -| INLINESTATS count=count(*) BY client_ip +| INLINE STATS count=count(*) BY client_ip | SORT count DESC, client_ip ASC | KEEP count, client_ip ; @@ -2605,11 +2605,11 @@ count:long | client_ip:ip ; singleIndexIpStringInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data_str | EVAL client_ip = client_ip::ip -| INLINESTATS count=count(*) BY client_ip +| INLINE STATS count=count(*) BY client_ip | SORT count DESC, client_ip ASC | KEEP count, client_ip ; @@ -2625,11 +2625,11 @@ count:long | client_ip:ip ; singleIndexIpStringInlinestats Inline -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data_str -| INLINESTATS count=count(*) BY client_ip::ip -| INLINESTATS mc=count(count) BY count +| INLINE STATS count=count(*) BY client_ip::ip +| INLINE STATS mc=count(count) BY count | SORT mc DESC, count ASC | KEEP mc, count ; @@ -2646,10 +2646,10 @@ mc:l | count:l singleIndexIpStringInlinestatsInline_SecondStats // same as above but the second agg is a STATS one -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data_str -| INLINESTATS count=count(*) BY client_ip::ip +| INLINE STATS count=count(*) BY client_ip::ip | STATS mc=count(count) BY count | SORT mc DESC, count ASC | KEEP mc, count @@ -2661,11 +2661,11 @@ mc:l | count:l ; multiIndexIpStringInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str | EVAL client_ip = client_ip::ip -| INLINESTATS count=count(*) BY client_ip +| INLINE STATS count=count(*) BY client_ip | SORT count DESC, client_ip ASC | KEEP count, client_ip ; @@ -2688,11 +2688,11 @@ count:long | client_ip:ip ; multiIndexIpStringRenameInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str | EVAL host_ip = client_ip::ip -| INLINESTATS count=count(*) BY host_ip +| INLINE STATS count=count(*) BY host_ip | SORT count DESC, host_ip ASC | KEEP count, host_ip ; @@ -2715,11 +2715,11 @@ count:long | host_ip:ip ; multiIndexIpStringRenameToStringInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str | EVAL host_ip = TO_STRING(TO_IP(client_ip)) -| INLINESTATS count=count(*) BY host_ip +| INLINE STATS count=count(*) BY host_ip | SORT count DESC, host_ip ASC | KEEP count, host_ip ; @@ -2742,10 +2742,10 @@ count:long | host_ip:keyword ; multiIndexIpStringInlinestats Drop -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str -| INLINESTATS count=count(*) BY client_ip::ip +| INLINE STATS count=count(*) BY client_ip::ip | KEEP count | SORT count DESC ; @@ -2768,10 +2768,10 @@ count:long ; multiIndexIpStringInlinestats Inline -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str -| INLINESTATS count=count(*) BY client_ip = TO_IP(client_ip) +| INLINE STATS count=count(*) BY client_ip = TO_IP(client_ip) | SORT count DESC, client_ip ASC | KEEP count, client_ip ; @@ -2794,10 +2794,10 @@ count:long | client_ip:ip ; statsUnionAggInline -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str -| INLINESTATS count = COUNT(CIDR_MATCH(TO_IP(client_ip), "172.21.0.0/24") OR NULL) +| INLINE STATS count = COUNT(CIDR_MATCH(TO_IP(client_ip), "172.21.0.0/24") OR NULL) BY @timestamp = DATE_TRUNC(10 minutes, @timestamp) | SORT count DESC, @timestamp ASC, event_duration @@ -2816,10 +2816,10 @@ null |725448 |Connection error |0 ; multiIndexIpInlinestats_NonPushableCount -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str -| INLINESTATS count=count(client_ip::ip) +| INLINE STATS count=count(client_ip::ip) | SORT event_duration DESC | LIMIT 2 ; @@ -2830,11 +2830,11 @@ FROM sample_data, sample_data_str ; multiIndexIpInlinestats_NonPushableCountEval -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str | EVAL client_ip = client_ip::ip -| INLINESTATS count=count(client_ip) +| INLINE STATS count=count(client_ip) | SORT event_duration DESC | LIMIT 2 ; @@ -2845,10 +2845,10 @@ FROM sample_data, sample_data_str ; multiIndexIpInlinestats_NonPushableCountWithFilter -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long -| INLINESTATS count_matching=count(@timestamp::long) WHERE @timestamp::long >= 1698069301543, +| INLINE STATS count_matching=count(@timestamp::long) WHERE @timestamp::long >= 1698069301543, total_count=count(@timestamp::long) | SORT client_ip | LIMIT 4 @@ -2862,10 +2862,10 @@ null |172.21.2.113 |2764889 |Connected to 10.1.0. ; multiIndexIpInlinestats_PushableCount -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long -| INLINESTATS count=count(@timestamp::long) +| INLINE STATS count=count(@timestamp::long) | KEEP count | LIMIT 2 ; @@ -2876,11 +2876,11 @@ count:long ; multiIndexIpInlinestats_PushableCountEval -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long | EVAL @timestamp = @timestamp::long -| INLINESTATS count=count(@timestamp) +| INLINE STATS count=count(@timestamp) | KEEP count | LIMIT 2 ; @@ -2891,10 +2891,10 @@ count:long ; multiIndexIpStringInlinestats_Inline2 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str -| INLINESTATS count=count(*) BY client_ip::ip +| INLINE STATS count=count(*) BY client_ip::ip | SORT count DESC, `client_ip::ip` ASC | KEEP count, `client_ip::ip` ; @@ -2917,11 +2917,11 @@ count:long | client_ip::ip:ip ; multiIndexIpStringInlinestats_Inline3 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str -| INLINESTATS count=count(*) BY client_ip::ip -| INLINESTATS mc=count(count) BY count +| INLINE STATS count=count(*) BY client_ip::ip +| INLINE STATS mc=count(count) BY count | SORT mc DESC, count ASC, event_duration | KEEP mc, count, event_duration ; @@ -2944,14 +2944,14 @@ mc:l | count:l | event_duration:l ; multiIndexIpStringInlinestats_Inline4 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str | SORT @timestamp | LIMIT 1000 -| INLINESTATS count=count(*) BY client_ip::ip +| INLINE STATS count=count(*) BY client_ip::ip | LIMIT 5 -| INLINESTATS mc=count(count) BY count +| INLINE STATS mc=count(count) BY count | SORT mc DESC, count ASC, event_duration | KEEP mc, count, event_duration ; @@ -2965,11 +2965,11 @@ mc:l | count:l | event_duration:l ; multiIndexWhereIpStringInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str | WHERE STARTS_WITH(TO_STRING(client_ip), "172.21.2") -| INLINESTATS count=count(*) BY message +| INLINE STATS count=count(*) BY message | SORT count DESC, message ASC | KEEP count, message ; @@ -2982,11 +2982,11 @@ count:long | message:keyword ; multiIndexTsLongInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long | EVAL @timestamp = DATE_TRUNC(1 hour, TO_DATETIME(@timestamp)) -| INLINESTATS count=count(*) BY @timestamp +| INLINE STATS count=count(*) BY @timestamp | SORT count DESC, @timestamp ASC | KEEP count, @timestamp ; @@ -3009,11 +3009,11 @@ count:long | @timestamp:date ; multiIndexTsNanosToDatetimeInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_nanos | EVAL @timestamp = DATE_TRUNC(1 hour, TO_DATETIME(@timestamp)) -| INLINESTATS count=count(*) BY @timestamp +| INLINE STATS count=count(*) BY @timestamp | KEEP count, @timestamp | STATS count=count(*) BY @timestamp | SORT count DESC, @timestamp ASC @@ -3025,11 +3025,11 @@ count:long | @timestamp:date ; multiIndexMillisToNanosStats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_nanos | EVAL @timestamp = DATE_TRUNC(1 hour, TO_DATE_NANOS(@timestamp)) -| INLINESTATS count=count(*) BY @timestamp +| INLINE STATS count=count(*) BY @timestamp | KEEP count, @timestamp | STATS count=count(*) BY @timestamp | SORT count DESC, @timestamp ASC @@ -3042,10 +3042,10 @@ count:long | @timestamp:date_nanos multiIndexTsLongInlinestatsDrop -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long, sample_data_ts_nanos -| INLINESTATS count=count(*) BY @timestamp::datetime +| INLINE STATS count=count(*) BY @timestamp::datetime | KEEP count | LIMIT 2 ; @@ -3056,10 +3056,10 @@ count:long ; multiIndexTsLongInlinestatsInline2 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long, sample_data_ts_nanos -| INLINESTATS count=count(*) BY @timestamp::datetime +| INLINE STATS count=count(*) BY @timestamp::datetime | SORT `@timestamp::datetime` DESC, event_duration | LIMIT 6 ; @@ -3074,11 +3074,11 @@ null |172.21.3.15 |5033755 |Connection error ; multiIndexTsLongInlinestatsInline3 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long -| INLINESTATS count=count(*) BY @timestamp::datetime -| INLINESTATS mc=count(count) BY count +| INLINE STATS count=count(*) BY @timestamp::datetime +| INLINE STATS mc=count(count) BY count | SORT client_ip DESC | LIMIT 1 | KEEP mc, count @@ -3089,12 +3089,12 @@ mc:l | count:l ; multiIndexTsLongInlinestatsInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long | EVAL ts = TO_STRING(@timestamp) -| INLINESTATS count = COUNT(*) BY ts -| INLINESTATS mc = COUNT(count) BY count +| INLINE STATS count = COUNT(*) BY ts +| INLINE STATS mc = COUNT(count) BY count | SORT ts | LIMIT 1 ; @@ -3104,11 +3104,11 @@ null |172.21.2.162 |3450233 |Connected to 10.1.0.3 ; multiIndexTsLongRenameInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long | EVAL hour = DATE_TRUNC(1 hour, TO_DATETIME(@timestamp)) -| INLINESTATS count=count(*) BY hour +| INLINE STATS count=count(*) BY hour | SORT count DESC, hour ASC | KEEP count, hour ; @@ -3131,11 +3131,11 @@ count:long | hour:date ; multiIndexTsLongRenameToDatetimeToStringInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long | EVAL hour = LEFT(TO_STRING(TO_DATETIME(@timestamp)), 13) -| INLINESTATS count=count(*) BY hour +| INLINE STATS count=count(*) BY hour | STATS count_distinct(count) BY count, hour | SORT count DESC, hour ASC | KEEP count, hour @@ -3147,11 +3147,11 @@ count:long | hour:keyword ; multiIndexTsLongRenameToStringInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long | EVAL mess = LEFT(TO_STRING(@timestamp), 7) -| INLINESTATS count=count(*) BY mess +| INLINE STATS count=count(*) BY mess | SORT count DESC, mess DESC | KEEP count, mess ; @@ -3174,10 +3174,10 @@ count:long | mess:keyword ; multiIndexTsLongInlinestatsInline -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long -| INLINESTATS count=COUNT(*), max=MAX(TO_DATETIME(@timestamp)) +| INLINE STATS count=COUNT(*), max=MAX(TO_DATETIME(@timestamp)) | KEEP count, max | LIMIT 3 ; @@ -3189,10 +3189,10 @@ count:long | max:date ; multiIndexTsLongInlinestatsInlineDropped -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long -| INLINESTATS count=COUNT(*), max=MAX(TO_DATETIME(@timestamp)) +| INLINE STATS count=COUNT(*), max=MAX(TO_DATETIME(@timestamp)) | KEEP count | LIMIT 2 ; @@ -3203,11 +3203,11 @@ count:long ; multiIndexWhereTsLongInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long | WHERE TO_LONG(@timestamp) < 1698068014937 -| INLINESTATS count=count(*) BY message +| INLINE STATS count=count(*) BY message | SORT count DESC, message ASC | KEEP count, message ; @@ -3220,11 +3220,11 @@ count:long | message:keyword ; multiIndexWhereIpStringTsLongInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data* | WHERE TO_LONG(@timestamp) < 1698068014937 AND TO_STRING(client_ip) == "172.21.2.162" -| INLINESTATS count=count(*) BY message +| INLINE STATS count=count(*) BY message | SORT count DESC, message ASC | KEEP count, message ; @@ -3236,11 +3236,11 @@ count:long | message:keyword ; multiIndexWhereIpStringLikeTsLongInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data* | WHERE TO_LONG(@timestamp) < 1698068014937 AND TO_STRING(client_ip) LIKE "172.21.2.16?" -| INLINESTATS count=count(*) BY message +| INLINE STATS count=count(*) BY message | SORT count DESC, message ASC | KEEP count, message ; @@ -3252,10 +3252,10 @@ count:long | message:keyword ; multiIndexInlinestatsOfMultiTypedField -required_capability: inlinestats_v11 +required_capability: inline_stats // https://github.com/elastic/elasticsearch/issues/133973 FROM apps, apps_short -| INLINESTATS s = sum(id::integer) +| INLINE STATS s = sum(id::integer) | SORT name, version | LIMIT 5 ; @@ -3269,10 +3269,10 @@ null |bbbbb |2.1 |210 ; inlineStatsUnionGroup -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long -| INLINESTATS count = COUNT(*) +| INLINE STATS count = COUNT(*) BY @timestamp = SUBSTRING(TO_STRING(@timestamp), 0, 7) | SORT client_ip ASC, @timestamp ASC | LIMIT 4 @@ -3286,11 +3286,11 @@ client_ip:ip | event_duration:long | message:keyword | count:long| @timest ; inlineStatsUnionGroupWithEval -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long | EVAL @timestamp = SUBSTRING(TO_STRING(@timestamp), 0, 7) -| INLINESTATS count = COUNT(*) BY @timestamp +| INLINE STATS count = COUNT(*) BY @timestamp | SORT client_ip ASC, @timestamp ASC | LIMIT 4 ; @@ -3303,10 +3303,10 @@ client_ip:ip | event_duration:long | message:keyword | count:long| @timest ; inlineStatsUnionGroupTogether -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long -| INLINESTATS count = COUNT(*) +| INLINE STATS count = COUNT(*) BY @timestamp = TO_STRING(TO_DATETIME(@timestamp)) | SORT client_ip ASC, @timestamp ASC | LIMIT 4 @@ -3320,10 +3320,10 @@ client_ip:ip | event_duration:long | message:keyword |count:long| @time ; multiIndexIndirectUseOfUnionTypesInInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long -| INLINESTATS foo = max(event_duration) BY client_ip +| INLINE STATS foo = max(event_duration) BY client_ip | RENAME event_duration AS e | SORT client_ip ASC, e | LIMIT 8 @@ -3342,10 +3342,10 @@ null |725448 |Connection error |8268153 |172.21.3.15 multiIndexIndirectUseOfUnionTypesInInlineStats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_ts_long -| INLINESTATS foo = max(event_duration) +| INLINE STATS foo = max(event_duration) | SORT client_ip ASC, event_duration | LIMIT 1 ; @@ -3355,11 +3355,11 @@ FROM sample_data, sample_data_ts_long ; shortIntegerWideningInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM apps, apps_short | EVAL id = id::integer -| INLINESTATS count=count() BY name, id +| INLINE STATS count=count() BY name, id | KEEP id, name, count | SORT id ASC, name ASC | LIMIT 5 @@ -3374,10 +3374,10 @@ id:integer | name:keyword | count:long ; ImplicitCastingMultiTypedFieldsInlinestats_ByNumeric -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees, employees_incompatible -| INLINESTATS x=max(hire_date), y = min(hire_date) BY languages = languages::integer +| INLINE STATS x=max(hire_date), y = min(hire_date) BY languages = languages::integer | SORT languages | KEEP emp_no, languages, x, y | LIMIT 3 @@ -3390,10 +3390,10 @@ null |1 |1999-04-30T00:00:00.000Z|1985-02-18T00:00:0 ; ImplicitCastingMultiTypedFieldsInlinestats_ByNumericWithFilter -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees, employees_incompatible -| INLINESTATS x=max(hire_date) where hire_date < "1993-08-03", y = min(hire_date) where hire_date >= "1993-08-03" BY languages = languages::integer +| INLINE STATS x=max(hire_date) where hire_date < "1993-08-03", y = min(hire_date) where hire_date >= "1993-08-03" BY languages = languages::integer | SORT languages | LIMIT 3 | KEEP emp_no, languages, x, y @@ -3406,10 +3406,10 @@ null |1 |1990-10-20T00:00:00.000Z|1994-05-21T00:00:0 ; ImplicitCastingMultiTypedFieldsInlinestats_ByDateNanos -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees, employees_incompatible -| INLINESTATS x=count(emp_no::long), y=avg(salary_change::double), z=max(height::double) BY hire_date +| INLINE STATS x=count(emp_no::long), y=avg(salary_change::double), z=max(height::double) BY hire_date | EVAL y = round(y, 1), z = round(z, 1) | KEEP x, y, z, hire_date | SORT hire_date @@ -3432,10 +3432,10 @@ FROM employees, employees_incompatible ; ImplicitCastingMultiTypedFieldsInlinestats_ByDateNanosWithFilter -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees, employees_incompatible -| INLINESTATS x=count(emp_no::long) where hire_date > "1985-05-01", y=avg(salary_change::double) where hire_date > "1985-05-01", z=max(height::double) where hire_date > "1985-05-01" BY hire_date +| INLINE STATS x=count(emp_no::long) where hire_date > "1985-05-01", y=avg(salary_change::double) where hire_date > "1985-05-01", z=max(height::double) where hire_date > "1985-05-01" BY hire_date | EVAL y = round(y, 1), z = round(z, 1) | KEEP x, y, z, hire_date | SORT hire_date @@ -3456,10 +3456,10 @@ FROM employees, employees_incompatible ; ImplicitCastingMultiTypedMVFieldsInlinestats_MaxMin -required_capability: inlinestats_v11 +required_capability: inline_stats FROM date_nanos, date_nanos_union_types -| INLINESTATS max = MAX(millis), min = MIN(nanos) +| INLINE STATS max = MAX(millis), min = MIN(nanos) | SORT millis DESC | LIMIT 5 ; @@ -3476,10 +3476,10 @@ warningRegex:java.lang.IllegalArgumentException: milliSeconds \[-1457696696640\] ; ImplicitCastingMultiTypedMVFieldsInlinestats_Values -required_capability: inlinestats_v11 +required_capability: inline_stats FROM date_nanos, date_nanos_union_types -| INLINESTATS c = MV_COUNT(VALUES(nanos)) +| INLINE STATS c = MV_COUNT(VALUES(nanos)) | SORT millis DESC | LIMIT 5 ; @@ -3496,13 +3496,13 @@ warningRegex:java.lang.IllegalArgumentException: milliSeconds \[-1457696696640\] ; ImplicitCastingMultiTypedDateTruncInlinestats_By-Ignore -required_capability: inlinestats_v11 +required_capability: inline_stats // https://github.com/elastic/elasticsearch/issues/133973 // optimized incorrectly due to missing references [$$emp_no$converted_to$long{f$}# FROM employees, employees_incompatible | KEEP emp_no, hire_date -| INLINESTATS c = count(emp_no::long) BY yr = DATE_TRUNC(1 year, hire_date) +| INLINE STATS c = count(emp_no::long) BY yr = DATE_TRUNC(1 year, hire_date) | SORT yr DESC | LIMIT 5 ; @@ -3516,13 +3516,13 @@ c:long | yr:date_nanos ; ImplicitCastingMultiTypedDateTruncInlinestats_ByWithFilter-Ignore -required_capability: inlinestats_v11 +required_capability: inline_stats // https://github.com/elastic/elasticsearch/issues/133973 // optimized incorrectly due to missing references [$$emp_no$converted_to$long{f$}# FROM employees, employees_incompatible | KEEP emp_no, hire_date -| INLINESTATS c = count(emp_no::long) where hire_date > "1996-01-01" BY yr = DATE_TRUNC(1 year, hire_date) +| INLINE STATS c = count(emp_no::long) where hire_date > "1996-01-01" BY yr = DATE_TRUNC(1 year, hire_date) | SORT yr DESC | LIMIT 5 ; @@ -3536,14 +3536,14 @@ c:long | yr:date_nanos ; ImplicitCastingMultiTypedDateTruncInlinestats_ByWithEval-Ignore -required_capability: inlinestats_v11 +required_capability: inline_stats // https://github.com/elastic/elasticsearch/issues/133973 // optimized incorrectly due to missing references [$$emp_no$converted_to$long{f$}# FROM employees, employees_incompatible | KEEP emp_no, hire_date | EVAL yr = DATE_TRUNC(1 year, hire_date) -| INLINESTATS c = count(emp_no::long) BY yr +| INLINE STATS c = count(emp_no::long) BY yr | SORT yr DESC | LIMIT 5 ; @@ -3557,14 +3557,14 @@ c:long | yr:date_nanos ; ImplicitCastingMultiTypedDateTruncInlinestats_ByWithEvalWithFilter-Ignore -required_capability: inlinestats_v11 +required_capability: inline_stats // https://github.com/elastic/elasticsearch/issues/133973 // optimized incorrectly due to missing references [$$emp_no$converted_to$long{f$}# FROM employees, employees_incompatible | KEEP emp_no, hire_date | EVAL yr = DATE_TRUNC(1 year, hire_date) -| INLINESTATS c = count(emp_no::long) where hire_date > "1991-01-01" BY yr +| INLINE STATS c = count(emp_no::long) where hire_date > "1991-01-01" BY yr | SORT yr DESC | LIMIT 5 ; @@ -3578,11 +3578,11 @@ c:long | yr:date_nanos ; ImplicitCastingMultiTypedBucketDateNanosByYear -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees, employees_incompatible | KEEP emp_no, hire_date, gender -| INLINESTATS c = count(*) BY yr = BUCKET(hire_date, 1 year) +| INLINE STATS c = count(*) BY yr = BUCKET(hire_date, 1 year) | SORT yr DESC, c, hire_date | LIMIT 10 ; @@ -3601,11 +3601,11 @@ null |1995-03-13T00:00:00.000Z|null |10 |1 ; ImplicitCastingMultiTypedBucketDateNanosByYearWithFilter -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees, employees_incompatible | KEEP emp_no, hire_date, gender -| INLINESTATS c = count(*) where hire_date > "1995-02-01" BY yr = BUCKET(hire_date, 1 year) +| INLINE STATS c = count(*) where hire_date > "1995-02-01" BY yr = BUCKET(hire_date, 1 year) | SORT yr DESC, c, hire_date | LIMIT 10 ; @@ -3624,10 +3624,10 @@ null |1995-03-13T00:00:00.000Z|null |8 |1 ; ImplicitCastingMultiTypedBucketDateNanosByMonth -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees, employees_incompatible -| INLINESTATS c = count(*) BY mo = BUCKET(hire_date, 20, "1986-01-01", "1999-12-31") +| INLINE STATS c = count(*) BY mo = BUCKET(hire_date, 20, "1986-01-01", "1999-12-31") | KEEP emp_no, hire_date, c, mo | SORT mo DESC, c, hire_date | LIMIT 10 @@ -3647,10 +3647,10 @@ null |1995-03-13T00:00:00.000Z|10 |1995-01-01T00:00:00. ; ImplicitCastingMultiTypedBucketDateNanos_In_BothInlinestats_AndBy -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees, employees_incompatible -| INLINESTATS c = count(*), b = BUCKET(hire_date, 1 year) + 1 year BY yr = BUCKET(hire_date, 1 year) +| INLINE STATS c = count(*), b = BUCKET(hire_date, 1 year) + 1 year BY yr = BUCKET(hire_date, 1 year) | SORT yr DESC, c, hire_date | KEEP emp_no, hire_date, c, b, yr | LIMIT 10 @@ -3670,11 +3670,11 @@ null |1995-03-13T00:00:00.000Z|10 |1996-01-01T00:00:00. ; ImplicitCastingMultiTypedBucketDateNanos_In_BothInlinestats_AndByWithAlias -required_capability: inlinestats_v11 +required_capability: inline_stats FROM employees, employees_incompatible | KEEP emp_no, hire_date -| INLINESTATS c = count(*), b = yr + 1 year BY yr = BUCKET(hire_date, 1 year) +| INLINE STATS c = count(*), b = yr + 1 year BY yr = BUCKET(hire_date, 1 year) | SORT hire_date DESC | LIMIT 10 ; @@ -3693,11 +3693,11 @@ null |1995-08-22T00:00:00.000Z|10 |1996-01-01T00:00:00. ; multiInlinestatsWithUnionTypes1 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str | EVAL one_ip = client_ip::ip -| INLINESTATS count1=count(client_ip::ip), count2=count(one_ip), max(one_ip), min(client_ip::ip) +| INLINE STATS count1=count(client_ip::ip), count2=count(one_ip), max(one_ip), min(client_ip::ip) | SORT @timestamp | LIMIT 3 ; @@ -3709,13 +3709,13 @@ FROM sample_data, sample_data_str ; multiInlinestatsWithUnionTypes2 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str | EVAL one_ip = client_ip::ip -| INLINESTATS count1=count(client_ip::ip), count2=count(one_ip), max=max(one_ip), min=min(client_ip::ip) +| INLINE STATS count1=count(client_ip::ip), count2=count(one_ip), max=max(one_ip), min=min(client_ip::ip) | RENAME one_ip AS client_ip -| INLINESTATS max(event_duration) BY client_ip +| INLINE STATS max(event_duration) BY client_ip | SORT @timestamp | LIMIT 5 ; @@ -3729,15 +3729,15 @@ FROM sample_data, sample_data_str ; multiInlinestatsWithUnionTypes3 -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str | EVAL one_ip = client_ip::ip -| INLINESTATS avg_duration = AVG(event_duration) BY one_ip +| INLINE STATS avg_duration = AVG(event_duration) BY one_ip | RENAME one_ip AS client_ip | WHERE CIDR_MATCH(client_ip, "172.21.2.0/24") -| INLINESTATS count1=count(client_ip::ip), count2=count(client_ip), max=max(client_ip), min=min(client_ip::ip) -| INLINESTATS avg_total_duration = AVG(event_duration) +| INLINE STATS count1=count(client_ip::ip), count2=count(client_ip), max=max(client_ip), min=min(client_ip::ip) +| INLINE STATS avg_total_duration = AVG(event_duration) | SORT @timestamp ; @@ -3749,12 +3749,12 @@ FROM sample_data, sample_data_str ; unionTypeDroppedBeforeInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str | EVAL one_ip = client_ip::ip | DROP one_ip -| INLINESTATS avg(event_duration) BY client_ip::ip +| INLINE STATS avg(event_duration) BY client_ip::ip | SORT @timestamp ; @@ -3776,15 +3776,15 @@ FROM sample_data, sample_data_str ; inlinestatsWithUnionTypesAs_InlinestatsCondition -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str | EVAL temp_ip = client_ip::ip | EVAL ip1 = CIDR_MATCH(temp_ip, "172.21.2.0/24"), ip2 = CIDR_MATCH(temp_ip, "172.21.0.0/24"), ip3 = CIDR_MATCH(temp_ip, "172.21.3.0/24") | EVAL client_ip = temp_ip -| INLINESTATS avg_ip1 = avg(event_duration) WHERE ip1 +| INLINE STATS avg_ip1 = avg(event_duration) WHERE ip1 | DROP client_ip -| INLINESTATS avg_ip2 = avg(event_duration) WHERE ip2, avg_ip3 = avg(event_duration) WHERE ip3 +| INLINE STATS avg_ip2 = avg(event_duration) WHERE ip2, avg_ip3 = avg(event_duration) WHERE ip3 | SORT @timestamp | DROP @timestamp ; @@ -3807,12 +3807,12 @@ event_duration:long | message:keyword | temp_ip:ip | ip1:boolean | i ; inlinestatsWithOverwrittenUnionType -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str | EVAL client_ip = client_ip::ip | EVAL client_ip = 123 -| INLINESTATS a = avg(event_duration) BY client_ip::integer +| INLINE STATS a = avg(event_duration) BY client_ip::integer | SORT @timestamp ; @@ -3834,13 +3834,13 @@ FROM sample_data, sample_data_str ; overwriteAndDropUnionTypeBeforeInlinestats -required_capability: inlinestats_v11 +required_capability: inline_stats FROM sample_data, sample_data_str | EVAL temp = client_ip::string | EVAL client_ip = temp | DROP temp -| INLINESTATS avg(event_duration) BY client_ip +| INLINE STATS avg(event_duration) BY client_ip | SORT @timestamp | DROP @timestamp ; @@ -3861,3 +3861,16 @@ event_duration:long| message:keyword | avg(event_duration):double| clien 1756467 | Connected to 10.1.0.1 | 3945955.75 | 172.21.3.15 1756467 | Connected to 10.1.0.1 | 3945955.75 | 172.21.3.15 ; + +useOfDeprecatedInlinestats +required_capability: inline_stats +ROW city = "Raleigh" +| INLINESTATS c = COUNT(city) +; + +warning:Line 2:3: INLINESTATS is deprecated, use INLINE STATS instead + +city:keyword|c:long +Raleigh |1 +; + diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/union_types.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/union_types.csv-spec index 6802874d36ad8..5b9da2f13aa59 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/union_types.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/union_types.csv-spec @@ -375,7 +375,6 @@ count:long | client_ip:ip statsUnionAggInline required_capability: union_types -required_capability: inlinestats FROM sample_data, sample_data_str | STATS @@ -1398,11 +1397,11 @@ event_duration:long | _index:keyword | ts:date | ts_str: ; multiIndexInlinestatsOfMultiTypedField -required_capability: inlinestats_v11 +required_capability: inline_stats required_capability: fork_union_types // https://github.com/elastic/elasticsearch/issues/133973 FROM apps, apps_short -| INLINESTATS s = sum(id::integer) +| INLINE STATS s = sum(id::integer) | SORT name, version | LIMIT 5 ; diff --git a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/AbstractCrossClusterTestCase.java b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/AbstractCrossClusterTestCase.java index cfaa234d39a00..d0327bfda97d2 100644 --- a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/AbstractCrossClusterTestCase.java +++ b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/AbstractCrossClusterTestCase.java @@ -45,7 +45,7 @@ import java.util.concurrent.atomic.AtomicLong; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; -import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.INLINESTATS_SUPPORTS_REMOTE; +import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.INLINE_STATS_SUPPORTS_REMOTE; import static org.hamcrest.Matchers.aMapWithSize; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThanOrEqualTo; @@ -370,6 +370,6 @@ protected static Exception randomFailure() { } protected static String randomStats() { - return INLINESTATS_SUPPORTS_REMOTE.isEnabled() ? randomFrom("STATS", "INLINESTATS") : "STATS"; + return INLINE_STATS_SUPPORTS_REMOTE.isEnabled() ? randomFrom("STATS", "INLINE STATS") : "STATS"; } } diff --git a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/CrossClusterAsyncQueryStopIT.java b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/CrossClusterAsyncQueryStopIT.java index bc202a5328120..ab4079e12b969 100644 --- a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/CrossClusterAsyncQueryStopIT.java +++ b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/CrossClusterAsyncQueryStopIT.java @@ -271,7 +271,7 @@ public void testStopQueryLocalNoRemotes() throws Exception { // What happens here is when we run stop on subquery, the main query will still finish. // TODO: should we have a way to stop the main query as well? - public void testStopQueryInlinestats() throws Exception { + public void testStopQueryInlineStats() throws Exception { assumeTrue("Pragma does not work in release builds", Build.current().isSnapshot()); Map testClusterInfo = setupClusters(3); // Create large index so we could be sure we're stopping before the end @@ -282,7 +282,7 @@ public void testStopQueryInlinestats() throws Exception { final String asyncExecutionId = startAsyncQueryWithPragmas( client(), - "FROM logs-*,remote-b:blocking | INLINESTATS total=sum(coalesce(const,v)) | KEEP total,foo | LIMIT 100", + "FROM logs-*,remote-b:blocking | INLINE STATS total=sum(coalesce(const,v)) | KEEP total,foo | LIMIT 100", includeCCSMetadata.v1(), Map.of("page_size", 1, "data_partitioning", "shard", "task_concurrency", 1) ); diff --git a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/CrossClusterQueryIT.java b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/CrossClusterQueryIT.java index f3ba9b3ba34fc..6ca33f52273fc 100644 --- a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/CrossClusterQueryIT.java +++ b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/CrossClusterQueryIT.java @@ -791,12 +791,12 @@ public void testRemoteFailureSkipUnavailableTrue() throws IOException { } public void testRemoteFailureInlinestats() throws IOException { - assumeTrue("requires inlinestats", EsqlCapabilities.Cap.INLINESTATS_SUPPORTS_REMOTE.isEnabled()); + assumeTrue("requires inlinestats", EsqlCapabilities.Cap.INLINE_STATS_SUPPORTS_REMOTE.isEnabled()); Map testClusterInfo = setupFailClusters(); String localIndex = (String) testClusterInfo.get("local.index"); String remote1Index = (String) testClusterInfo.get("remote.index"); // This will fail in the main plan - String q = Strings.format("FROM %s,cluster-a:%s* | INLINESTATS SUM(v) | SORT v", localIndex, remote1Index); + String q = Strings.format("FROM %s,cluster-a:%s* | INLINE STATS SUM(v) | SORT v", localIndex, remote1Index); try (EsqlQueryResponse resp = runQuery(q, randomBoolean())) { EsqlExecutionInfo executionInfo = resp.getExecutionInfo(); @@ -809,8 +809,8 @@ public void testRemoteFailureInlinestats() throws IOException { assertClusterInfoSkipped(remoteCluster); assertThat(remoteCluster.getFailures().getFirst().reason(), containsString("Accessing failing field")); } - // This will fail in the INLINESTATS subplan, skipping should still work the same - q = Strings.format("FROM cluster-a:%s* | INLINESTATS SUM(fail_me) | SORT fail_me", remote1Index); + // This will fail in the INLINE STATS subplan, skipping should still work the same + q = Strings.format("FROM cluster-a:%s* | INLINE STATS SUM(fail_me) | SORT fail_me", remote1Index); try (EsqlQueryResponse resp = runQuery(q, randomBoolean())) { EsqlExecutionInfo executionInfo = resp.getExecutionInfo(); diff --git a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/CrossClusterQueryUnavailableRemotesIT.java b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/CrossClusterQueryUnavailableRemotesIT.java index 4cc90a3ed7220..913d88233d469 100644 --- a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/CrossClusterQueryUnavailableRemotesIT.java +++ b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/CrossClusterQueryUnavailableRemotesIT.java @@ -158,8 +158,8 @@ public void testCCSAgainstDisconnectedRemoteWithSkipUnavailableTrue() throws Exc } } - public void testCCSAgainstDisconnectedRemoteWithSkipUnavailableTrueInlinestats() throws Exception { - assumeTrue("requires inlinestats", EsqlCapabilities.Cap.INLINESTATS_SUPPORTS_REMOTE.isEnabled()); + public void testCCSAgainstDisconnectedRemoteWithSkipUnavailableTrueInlineStats() throws Exception { + assumeTrue("requires inlinestats", EsqlCapabilities.Cap.INLINE_STATS_SUPPORTS_REMOTE.isEnabled()); int numClusters = 3; Map testClusterInfo = setupClusters(numClusters); int localNumShards = (Integer) testClusterInfo.get("local.num_shards"); @@ -175,7 +175,7 @@ public void testCCSAgainstDisconnectedRemoteWithSkipUnavailableTrueInlinestats() // close remote-cluster-1 so that it is unavailable cluster(REMOTE_CLUSTER_1).close(); - try (EsqlQueryResponse resp = runQuery("FROM logs-*,*:logs-* | INLINESTATS sum (v) | SORT v", requestIncludeMeta)) { + try (EsqlQueryResponse resp = runQuery("FROM logs-*,*:logs-* | INLINE STATS sum (v) | SORT v", requestIncludeMeta)) { List> values = getValuesList(resp); // 20 is local + cluster2 but not cluster1 assertThat(values, hasSize(20)); @@ -208,7 +208,7 @@ public void testCCSAgainstDisconnectedRemoteWithSkipUnavailableTrueInlinestats() // 1) the local cluster indexExpression and REMOTE_CLUSTER_2 indexExpression match no indices // 2) the REMOTE_CLUSTER_1 is unavailable // 3) both remotes are marked as skip_un=true - String query = "FROM nomatch*," + REMOTE_CLUSTER_1 + ":logs-*," + REMOTE_CLUSTER_2 + ":nomatch* | INLINESTATS sum (v)"; + String query = "FROM nomatch*," + REMOTE_CLUSTER_1 + ":logs-*," + REMOTE_CLUSTER_2 + ":nomatch* | INLINE STATS sum (v)"; try (EsqlQueryResponse resp = runQuery(query, requestIncludeMeta)) { List> values = getValuesList(resp); assertThat(values, hasSize(0)); @@ -244,7 +244,7 @@ public void testCCSAgainstDisconnectedRemoteWithSkipUnavailableTrueInlinestats() // close remote-cluster-2 so that it is also unavailable cluster(REMOTE_CLUSTER_2).close(); - try (EsqlQueryResponse resp = runQuery("FROM logs-*,*:logs-* | INLINESTATS sum (v) | SORT v", requestIncludeMeta)) { + try (EsqlQueryResponse resp = runQuery("FROM logs-*,*:logs-* | INLINE STATS sum (v) | SORT v", requestIncludeMeta)) { List> values = getValuesList(resp); assertThat(values, hasSize(10)); values.forEach(row -> assertThat(row.get(4), equalTo(45L))); diff --git a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/TelemetryIT.java b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/TelemetryIT.java index 6943775a75f69..0845faf8e0f10 100644 --- a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/TelemetryIT.java +++ b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/TelemetryIT.java @@ -165,9 +165,9 @@ public static Iterable parameters() { """ FROM idx | EVAL ip = TO_IP(host), x = TO_STRING(host), y = TO_STRING(host) - | INLINESTATS MAX(id) + | INLINE STATS MAX(id) """, - Build.current().isSnapshot() ? Map.of("FROM", 1, "EVAL", 1, "INLINESTATS", 1) : Collections.emptyMap(), + Build.current().isSnapshot() ? Map.of("FROM", 1, "EVAL", 1, "INLINE STATS", 1) : Collections.emptyMap(), Build.current().isSnapshot() ? Map.ofEntries(Map.entry("MAX", 1), Map.entry("TO_IP", 1), Map.entry("TO_STRING", 2)) : Collections.emptyMap(), diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 index aa2e99d35555f..72c9173918012 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 @@ -61,6 +61,7 @@ import ChangePoint, From, Fork, Fuse, + Inline, Join, Lookup, MvExpand, diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens index 1da58a9ec5851..3d82384fd8a64 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens @@ -15,132 +15,137 @@ SAMPLE=14 SORT=15 STATS=16 WHERE=17 -DEV_INLINESTATS=18 -FROM=19 -TS=20 -FORK=21 -DEV_FUSE=22 -JOIN_LOOKUP=23 -DEV_JOIN_FULL=24 -DEV_JOIN_LEFT=25 -DEV_JOIN_RIGHT=26 -DEV_LOOKUP=27 -MV_EXPAND=28 -DROP=29 -KEEP=30 -DEV_INSIST=31 -RENAME=32 -SET=33 -SHOW=34 -UNKNOWN_CMD=35 -CHANGE_POINT_LINE_COMMENT=36 -CHANGE_POINT_MULTILINE_COMMENT=37 -CHANGE_POINT_WS=38 -ENRICH_POLICY_NAME=39 -ENRICH_LINE_COMMENT=40 -ENRICH_MULTILINE_COMMENT=41 -ENRICH_WS=42 -ENRICH_FIELD_LINE_COMMENT=43 -ENRICH_FIELD_MULTILINE_COMMENT=44 -ENRICH_FIELD_WS=45 -EXPLAIN_WS=46 -EXPLAIN_LINE_COMMENT=47 -EXPLAIN_MULTILINE_COMMENT=48 -PIPE=49 -QUOTED_STRING=50 -INTEGER_LITERAL=51 -DECIMAL_LITERAL=52 -AND=53 -ASC=54 -ASSIGN=55 -BY=56 -CAST_OP=57 -COLON=58 -SEMICOLON=59 -COMMA=60 -DESC=61 -DOT=62 -FALSE=63 -FIRST=64 -IN=65 -IS=66 -LAST=67 -LIKE=68 -NOT=69 -NULL=70 -NULLS=71 -ON=72 -OR=73 -PARAM=74 -RLIKE=75 -TRUE=76 -WITH=77 -EQ=78 -CIEQ=79 -NEQ=80 -LT=81 -LTE=82 -GT=83 -GTE=84 -PLUS=85 -MINUS=86 -ASTERISK=87 -SLASH=88 -PERCENT=89 -LEFT_BRACES=90 -RIGHT_BRACES=91 -DOUBLE_PARAMS=92 -NAMED_OR_POSITIONAL_PARAM=93 -NAMED_OR_POSITIONAL_DOUBLE_PARAMS=94 -OPENING_BRACKET=95 -CLOSING_BRACKET=96 -LP=97 -RP=98 -UNQUOTED_IDENTIFIER=99 -QUOTED_IDENTIFIER=100 -EXPR_LINE_COMMENT=101 -EXPR_MULTILINE_COMMENT=102 -EXPR_WS=103 -METADATA=104 -UNQUOTED_SOURCE=105 -FROM_LINE_COMMENT=106 -FROM_MULTILINE_COMMENT=107 -FROM_WS=108 -FORK_WS=109 -FORK_LINE_COMMENT=110 -FORK_MULTILINE_COMMENT=111 -FUSE_LINE_COMMENT=112 -FUSE_MULTILINE_COMMENT=113 -FUSE_WS=114 -JOIN=115 -USING=116 -JOIN_LINE_COMMENT=117 -JOIN_MULTILINE_COMMENT=118 -JOIN_WS=119 -LOOKUP_LINE_COMMENT=120 -LOOKUP_MULTILINE_COMMENT=121 -LOOKUP_WS=122 -LOOKUP_FIELD_LINE_COMMENT=123 -LOOKUP_FIELD_MULTILINE_COMMENT=124 -LOOKUP_FIELD_WS=125 -MVEXPAND_LINE_COMMENT=126 -MVEXPAND_MULTILINE_COMMENT=127 -MVEXPAND_WS=128 -ID_PATTERN=129 -PROJECT_LINE_COMMENT=130 -PROJECT_MULTILINE_COMMENT=131 -PROJECT_WS=132 -AS=133 -RENAME_LINE_COMMENT=134 -RENAME_MULTILINE_COMMENT=135 -RENAME_WS=136 -SET_LINE_COMMENT=137 -SET_MULTILINE_COMMENT=138 -SET_WS=139 -INFO=140 -SHOW_LINE_COMMENT=141 -SHOW_MULTILINE_COMMENT=142 -SHOW_WS=143 +FROM=18 +TS=19 +FORK=20 +DEV_FUSE=21 +DEV_INLINE=22 +DEV_INLINESTATS=23 +JOIN_LOOKUP=24 +DEV_JOIN_FULL=25 +DEV_JOIN_LEFT=26 +DEV_JOIN_RIGHT=27 +DEV_LOOKUP=28 +MV_EXPAND=29 +DROP=30 +KEEP=31 +DEV_INSIST=32 +RENAME=33 +SET=34 +SHOW=35 +UNKNOWN_CMD=36 +CHANGE_POINT_LINE_COMMENT=37 +CHANGE_POINT_MULTILINE_COMMENT=38 +CHANGE_POINT_WS=39 +ENRICH_POLICY_NAME=40 +ENRICH_LINE_COMMENT=41 +ENRICH_MULTILINE_COMMENT=42 +ENRICH_WS=43 +ENRICH_FIELD_LINE_COMMENT=44 +ENRICH_FIELD_MULTILINE_COMMENT=45 +ENRICH_FIELD_WS=46 +EXPLAIN_WS=47 +EXPLAIN_LINE_COMMENT=48 +EXPLAIN_MULTILINE_COMMENT=49 +PIPE=50 +QUOTED_STRING=51 +INTEGER_LITERAL=52 +DECIMAL_LITERAL=53 +AND=54 +ASC=55 +ASSIGN=56 +BY=57 +CAST_OP=58 +COLON=59 +SEMICOLON=60 +COMMA=61 +DESC=62 +DOT=63 +FALSE=64 +FIRST=65 +IN=66 +IS=67 +LAST=68 +LIKE=69 +NOT=70 +NULL=71 +NULLS=72 +ON=73 +OR=74 +PARAM=75 +RLIKE=76 +TRUE=77 +WITH=78 +EQ=79 +CIEQ=80 +NEQ=81 +LT=82 +LTE=83 +GT=84 +GTE=85 +PLUS=86 +MINUS=87 +ASTERISK=88 +SLASH=89 +PERCENT=90 +LEFT_BRACES=91 +RIGHT_BRACES=92 +DOUBLE_PARAMS=93 +NAMED_OR_POSITIONAL_PARAM=94 +NAMED_OR_POSITIONAL_DOUBLE_PARAMS=95 +OPENING_BRACKET=96 +CLOSING_BRACKET=97 +LP=98 +RP=99 +UNQUOTED_IDENTIFIER=100 +QUOTED_IDENTIFIER=101 +EXPR_LINE_COMMENT=102 +EXPR_MULTILINE_COMMENT=103 +EXPR_WS=104 +METADATA=105 +UNQUOTED_SOURCE=106 +FROM_LINE_COMMENT=107 +FROM_MULTILINE_COMMENT=108 +FROM_WS=109 +FORK_WS=110 +FORK_LINE_COMMENT=111 +FORK_MULTILINE_COMMENT=112 +FUSE_LINE_COMMENT=113 +FUSE_MULTILINE_COMMENT=114 +FUSE_WS=115 +INLINE_STATS=116 +INLINE_LINE_COMMENT=117 +INLINE_MULTILINE_COMMENT=118 +INLINE_WS=119 +JOIN=120 +USING=121 +JOIN_LINE_COMMENT=122 +JOIN_MULTILINE_COMMENT=123 +JOIN_WS=124 +LOOKUP_LINE_COMMENT=125 +LOOKUP_MULTILINE_COMMENT=126 +LOOKUP_WS=127 +LOOKUP_FIELD_LINE_COMMENT=128 +LOOKUP_FIELD_MULTILINE_COMMENT=129 +LOOKUP_FIELD_WS=130 +MVEXPAND_LINE_COMMENT=131 +MVEXPAND_MULTILINE_COMMENT=132 +MVEXPAND_WS=133 +ID_PATTERN=134 +PROJECT_LINE_COMMENT=135 +PROJECT_MULTILINE_COMMENT=136 +PROJECT_WS=137 +AS=138 +RENAME_LINE_COMMENT=139 +RENAME_MULTILINE_COMMENT=140 +RENAME_WS=141 +SET_LINE_COMMENT=142 +SET_MULTILINE_COMMENT=143 +SET_WS=144 +INFO=145 +SHOW_LINE_COMMENT=146 +SHOW_MULTILINE_COMMENT=147 +SHOW_WS=148 'change_point'=4 'enrich'=5 'completion'=7 @@ -152,63 +157,62 @@ SHOW_WS=143 'row'=13 'sample'=14 'sort'=15 -'stats'=16 'where'=17 -'from'=19 -'ts'=20 -'fork'=21 -'lookup'=23 -'mv_expand'=28 -'drop'=29 -'keep'=30 -'rename'=32 -'set'=33 -'show'=34 -'|'=49 -'and'=53 -'asc'=54 -'='=55 -'by'=56 -'::'=57 -':'=58 -';'=59 -','=60 -'desc'=61 -'.'=62 -'false'=63 -'first'=64 -'in'=65 -'is'=66 -'last'=67 -'like'=68 -'not'=69 -'null'=70 -'nulls'=71 -'on'=72 -'or'=73 -'?'=74 -'rlike'=75 -'true'=76 -'with'=77 -'=='=78 -'=~'=79 -'!='=80 -'<'=81 -'<='=82 -'>'=83 -'>='=84 -'+'=85 -'-'=86 -'*'=87 -'/'=88 -'%'=89 -'{'=90 -'}'=91 -'??'=92 -']'=96 -')'=98 -'metadata'=104 -'join'=115 -'USING'=116 -'as'=133 -'info'=140 +'from'=18 +'ts'=19 +'fork'=20 +'lookup'=24 +'mv_expand'=29 +'drop'=30 +'keep'=31 +'rename'=33 +'set'=34 +'show'=35 +'|'=50 +'and'=54 +'asc'=55 +'='=56 +'by'=57 +'::'=58 +':'=59 +';'=60 +','=61 +'desc'=62 +'.'=63 +'false'=64 +'first'=65 +'in'=66 +'is'=67 +'last'=68 +'like'=69 +'not'=70 +'null'=71 +'nulls'=72 +'on'=73 +'or'=74 +'?'=75 +'rlike'=76 +'true'=77 +'with'=78 +'=='=79 +'=~'=80 +'!='=81 +'<'=82 +'<='=83 +'>'=84 +'>='=85 +'+'=86 +'-'=87 +'*'=88 +'/'=89 +'%'=90 +'{'=91 +'}'=92 +'??'=93 +']'=97 +')'=99 +'metadata'=105 +'join'=120 +'USING'=121 +'as'=138 +'info'=145 diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 index cc1c8ba73fbdc..2e9a3aabbd7fb 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 @@ -66,7 +66,7 @@ processingCommand | forkCommand | rerankCommand // in development - | {this.isDevVersion()}? inlinestatsCommand + | {this.isDevVersion()}? inlineStatsCommand | {this.isDevVersion()}? lookupCommand | {this.isDevVersion()}? insistCommand | {this.isDevVersion()}? fuseCommand @@ -327,8 +327,10 @@ lookupCommand : DEV_LOOKUP tableName=indexPattern ON matchFields=qualifiedNamePatterns ; -inlinestatsCommand - : DEV_INLINESTATS stats=aggFields (BY grouping=fields)? +inlineStatsCommand + : DEV_INLINE INLINE_STATS stats=aggFields (BY grouping=fields)? + // TODO: drop after next minor release + | DEV_INLINESTATS stats=aggFields (BY grouping=fields)? ; insistCommand diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens index 1da58a9ec5851..3d82384fd8a64 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens @@ -15,132 +15,137 @@ SAMPLE=14 SORT=15 STATS=16 WHERE=17 -DEV_INLINESTATS=18 -FROM=19 -TS=20 -FORK=21 -DEV_FUSE=22 -JOIN_LOOKUP=23 -DEV_JOIN_FULL=24 -DEV_JOIN_LEFT=25 -DEV_JOIN_RIGHT=26 -DEV_LOOKUP=27 -MV_EXPAND=28 -DROP=29 -KEEP=30 -DEV_INSIST=31 -RENAME=32 -SET=33 -SHOW=34 -UNKNOWN_CMD=35 -CHANGE_POINT_LINE_COMMENT=36 -CHANGE_POINT_MULTILINE_COMMENT=37 -CHANGE_POINT_WS=38 -ENRICH_POLICY_NAME=39 -ENRICH_LINE_COMMENT=40 -ENRICH_MULTILINE_COMMENT=41 -ENRICH_WS=42 -ENRICH_FIELD_LINE_COMMENT=43 -ENRICH_FIELD_MULTILINE_COMMENT=44 -ENRICH_FIELD_WS=45 -EXPLAIN_WS=46 -EXPLAIN_LINE_COMMENT=47 -EXPLAIN_MULTILINE_COMMENT=48 -PIPE=49 -QUOTED_STRING=50 -INTEGER_LITERAL=51 -DECIMAL_LITERAL=52 -AND=53 -ASC=54 -ASSIGN=55 -BY=56 -CAST_OP=57 -COLON=58 -SEMICOLON=59 -COMMA=60 -DESC=61 -DOT=62 -FALSE=63 -FIRST=64 -IN=65 -IS=66 -LAST=67 -LIKE=68 -NOT=69 -NULL=70 -NULLS=71 -ON=72 -OR=73 -PARAM=74 -RLIKE=75 -TRUE=76 -WITH=77 -EQ=78 -CIEQ=79 -NEQ=80 -LT=81 -LTE=82 -GT=83 -GTE=84 -PLUS=85 -MINUS=86 -ASTERISK=87 -SLASH=88 -PERCENT=89 -LEFT_BRACES=90 -RIGHT_BRACES=91 -DOUBLE_PARAMS=92 -NAMED_OR_POSITIONAL_PARAM=93 -NAMED_OR_POSITIONAL_DOUBLE_PARAMS=94 -OPENING_BRACKET=95 -CLOSING_BRACKET=96 -LP=97 -RP=98 -UNQUOTED_IDENTIFIER=99 -QUOTED_IDENTIFIER=100 -EXPR_LINE_COMMENT=101 -EXPR_MULTILINE_COMMENT=102 -EXPR_WS=103 -METADATA=104 -UNQUOTED_SOURCE=105 -FROM_LINE_COMMENT=106 -FROM_MULTILINE_COMMENT=107 -FROM_WS=108 -FORK_WS=109 -FORK_LINE_COMMENT=110 -FORK_MULTILINE_COMMENT=111 -FUSE_LINE_COMMENT=112 -FUSE_MULTILINE_COMMENT=113 -FUSE_WS=114 -JOIN=115 -USING=116 -JOIN_LINE_COMMENT=117 -JOIN_MULTILINE_COMMENT=118 -JOIN_WS=119 -LOOKUP_LINE_COMMENT=120 -LOOKUP_MULTILINE_COMMENT=121 -LOOKUP_WS=122 -LOOKUP_FIELD_LINE_COMMENT=123 -LOOKUP_FIELD_MULTILINE_COMMENT=124 -LOOKUP_FIELD_WS=125 -MVEXPAND_LINE_COMMENT=126 -MVEXPAND_MULTILINE_COMMENT=127 -MVEXPAND_WS=128 -ID_PATTERN=129 -PROJECT_LINE_COMMENT=130 -PROJECT_MULTILINE_COMMENT=131 -PROJECT_WS=132 -AS=133 -RENAME_LINE_COMMENT=134 -RENAME_MULTILINE_COMMENT=135 -RENAME_WS=136 -SET_LINE_COMMENT=137 -SET_MULTILINE_COMMENT=138 -SET_WS=139 -INFO=140 -SHOW_LINE_COMMENT=141 -SHOW_MULTILINE_COMMENT=142 -SHOW_WS=143 +FROM=18 +TS=19 +FORK=20 +DEV_FUSE=21 +DEV_INLINE=22 +DEV_INLINESTATS=23 +JOIN_LOOKUP=24 +DEV_JOIN_FULL=25 +DEV_JOIN_LEFT=26 +DEV_JOIN_RIGHT=27 +DEV_LOOKUP=28 +MV_EXPAND=29 +DROP=30 +KEEP=31 +DEV_INSIST=32 +RENAME=33 +SET=34 +SHOW=35 +UNKNOWN_CMD=36 +CHANGE_POINT_LINE_COMMENT=37 +CHANGE_POINT_MULTILINE_COMMENT=38 +CHANGE_POINT_WS=39 +ENRICH_POLICY_NAME=40 +ENRICH_LINE_COMMENT=41 +ENRICH_MULTILINE_COMMENT=42 +ENRICH_WS=43 +ENRICH_FIELD_LINE_COMMENT=44 +ENRICH_FIELD_MULTILINE_COMMENT=45 +ENRICH_FIELD_WS=46 +EXPLAIN_WS=47 +EXPLAIN_LINE_COMMENT=48 +EXPLAIN_MULTILINE_COMMENT=49 +PIPE=50 +QUOTED_STRING=51 +INTEGER_LITERAL=52 +DECIMAL_LITERAL=53 +AND=54 +ASC=55 +ASSIGN=56 +BY=57 +CAST_OP=58 +COLON=59 +SEMICOLON=60 +COMMA=61 +DESC=62 +DOT=63 +FALSE=64 +FIRST=65 +IN=66 +IS=67 +LAST=68 +LIKE=69 +NOT=70 +NULL=71 +NULLS=72 +ON=73 +OR=74 +PARAM=75 +RLIKE=76 +TRUE=77 +WITH=78 +EQ=79 +CIEQ=80 +NEQ=81 +LT=82 +LTE=83 +GT=84 +GTE=85 +PLUS=86 +MINUS=87 +ASTERISK=88 +SLASH=89 +PERCENT=90 +LEFT_BRACES=91 +RIGHT_BRACES=92 +DOUBLE_PARAMS=93 +NAMED_OR_POSITIONAL_PARAM=94 +NAMED_OR_POSITIONAL_DOUBLE_PARAMS=95 +OPENING_BRACKET=96 +CLOSING_BRACKET=97 +LP=98 +RP=99 +UNQUOTED_IDENTIFIER=100 +QUOTED_IDENTIFIER=101 +EXPR_LINE_COMMENT=102 +EXPR_MULTILINE_COMMENT=103 +EXPR_WS=104 +METADATA=105 +UNQUOTED_SOURCE=106 +FROM_LINE_COMMENT=107 +FROM_MULTILINE_COMMENT=108 +FROM_WS=109 +FORK_WS=110 +FORK_LINE_COMMENT=111 +FORK_MULTILINE_COMMENT=112 +FUSE_LINE_COMMENT=113 +FUSE_MULTILINE_COMMENT=114 +FUSE_WS=115 +INLINE_STATS=116 +INLINE_LINE_COMMENT=117 +INLINE_MULTILINE_COMMENT=118 +INLINE_WS=119 +JOIN=120 +USING=121 +JOIN_LINE_COMMENT=122 +JOIN_MULTILINE_COMMENT=123 +JOIN_WS=124 +LOOKUP_LINE_COMMENT=125 +LOOKUP_MULTILINE_COMMENT=126 +LOOKUP_WS=127 +LOOKUP_FIELD_LINE_COMMENT=128 +LOOKUP_FIELD_MULTILINE_COMMENT=129 +LOOKUP_FIELD_WS=130 +MVEXPAND_LINE_COMMENT=131 +MVEXPAND_MULTILINE_COMMENT=132 +MVEXPAND_WS=133 +ID_PATTERN=134 +PROJECT_LINE_COMMENT=135 +PROJECT_MULTILINE_COMMENT=136 +PROJECT_WS=137 +AS=138 +RENAME_LINE_COMMENT=139 +RENAME_MULTILINE_COMMENT=140 +RENAME_WS=141 +SET_LINE_COMMENT=142 +SET_MULTILINE_COMMENT=143 +SET_WS=144 +INFO=145 +SHOW_LINE_COMMENT=146 +SHOW_MULTILINE_COMMENT=147 +SHOW_WS=148 'change_point'=4 'enrich'=5 'completion'=7 @@ -152,63 +157,62 @@ SHOW_WS=143 'row'=13 'sample'=14 'sort'=15 -'stats'=16 'where'=17 -'from'=19 -'ts'=20 -'fork'=21 -'lookup'=23 -'mv_expand'=28 -'drop'=29 -'keep'=30 -'rename'=32 -'set'=33 -'show'=34 -'|'=49 -'and'=53 -'asc'=54 -'='=55 -'by'=56 -'::'=57 -':'=58 -';'=59 -','=60 -'desc'=61 -'.'=62 -'false'=63 -'first'=64 -'in'=65 -'is'=66 -'last'=67 -'like'=68 -'not'=69 -'null'=70 -'nulls'=71 -'on'=72 -'or'=73 -'?'=74 -'rlike'=75 -'true'=76 -'with'=77 -'=='=78 -'=~'=79 -'!='=80 -'<'=81 -'<='=82 -'>'=83 -'>='=84 -'+'=85 -'-'=86 -'*'=87 -'/'=88 -'%'=89 -'{'=90 -'}'=91 -'??'=92 -']'=96 -')'=98 -'metadata'=104 -'join'=115 -'USING'=116 -'as'=133 -'info'=140 +'from'=18 +'ts'=19 +'fork'=20 +'lookup'=24 +'mv_expand'=29 +'drop'=30 +'keep'=31 +'rename'=33 +'set'=34 +'show'=35 +'|'=50 +'and'=54 +'asc'=55 +'='=56 +'by'=57 +'::'=58 +':'=59 +';'=60 +','=61 +'desc'=62 +'.'=63 +'false'=64 +'first'=65 +'in'=66 +'is'=67 +'last'=68 +'like'=69 +'not'=70 +'null'=71 +'nulls'=72 +'on'=73 +'or'=74 +'?'=75 +'rlike'=76 +'true'=77 +'with'=78 +'=='=79 +'=~'=80 +'!='=81 +'<'=82 +'<='=83 +'>'=84 +'>='=85 +'+'=86 +'-'=87 +'*'=88 +'/'=89 +'%'=90 +'{'=91 +'}'=92 +'??'=93 +']'=97 +')'=99 +'metadata'=105 +'join'=120 +'USING'=121 +'as'=138 +'info'=145 diff --git a/x-pack/plugin/esql/src/main/antlr/lexer/Expression.g4 b/x-pack/plugin/esql/src/main/antlr/lexer/Expression.g4 index 0764849304d15..1d0dff47d8456 100644 --- a/x-pack/plugin/esql/src/main/antlr/lexer/Expression.g4 +++ b/x-pack/plugin/esql/src/main/antlr/lexer/Expression.g4 @@ -21,8 +21,6 @@ SORT : 'sort' -> pushMode(EXPRESSION_MODE); STATS : 'stats' -> pushMode(EXPRESSION_MODE); WHERE : 'where' -> pushMode(EXPRESSION_MODE); -DEV_INLINESTATS : {this.isDevVersion()}? 'inlinestats' -> pushMode(EXPRESSION_MODE); - mode EXPRESSION_MODE; PIPE : '|' -> popMode; diff --git a/x-pack/plugin/esql/src/main/antlr/lexer/Inline.g4 b/x-pack/plugin/esql/src/main/antlr/lexer/Inline.g4 new file mode 100644 index 0000000000000..93dc0774fa92c --- /dev/null +++ b/x-pack/plugin/esql/src/main/antlr/lexer/Inline.g4 @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +lexer grammar Inline; + +DEV_INLINE : {this.isDevVersion()}? 'inline' -> pushMode(INLINE_MODE); +DEV_INLINESTATS : {this.isDevVersion()}? 'inlinestats' -> pushMode(EXPRESSION_MODE); // TODO: drop after next minor release + +mode INLINE_MODE; + +INLINE_STATS: 'stats' -> popMode, pushMode(EXPRESSION_MODE); + +INLINE_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +INLINE_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +INLINE_WS + : WS -> channel(HIDDEN) + ; + + diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java index bca523a6b8769..607ff3faeb6d9 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java @@ -269,12 +269,12 @@ public enum Cap { /** * Support for the {@code INLINESTATS} syntax. */ - INLINESTATS(EsqlPlugin.INLINESTATS_FEATURE_FLAG), + INLINESTATS(EsqlPlugin.INLINE_STATS_FEATURE_FLAG), /** * Support for the expressions in grouping in {@code INLINESTATS} syntax. */ - INLINESTATS_V2(EsqlPlugin.INLINESTATS_FEATURE_FLAG), + INLINESTATS_V2(EsqlPlugin.INLINE_STATS_FEATURE_FLAG), /** * Support for aggregation function {@code TOP}. @@ -988,7 +988,12 @@ public enum Cap { * Fixes a series of issues with inlinestats which had an incomplete implementation after lookup and inlinestats * were refactored. */ - INLINESTATS_V11(EsqlPlugin.INLINESTATS_FEATURE_FLAG), + INLINESTATS_V11(EsqlPlugin.INLINE_STATS_FEATURE_FLAG), + + /** + * Renamed `INLINESTATS` to `INLINE STATS`. + */ + INLINE_STATS(EsqlPlugin.INLINE_STATS_FEATURE_FLAG), /** * Support partial_results @@ -1510,8 +1515,8 @@ public enum Cap { */ ABSENT_OVER_TIME(Build.current().isSnapshot()), - /** INLINESTATS supports remote indices */ - INLINESTATS_SUPPORTS_REMOTE(INLINESTATS_V11.enabled), + /** INLINE STATS supports remote indices */ + INLINE_STATS_SUPPORTS_REMOTE(INLINESTATS_V11.enabled), /** * Support TS command in non-snapshot builds diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlExecutionInfo.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlExecutionInfo.java index 5fdf94474fa80..664d632ea877a 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlExecutionInfo.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlExecutionInfo.java @@ -152,7 +152,7 @@ public boolean includeCCSMetadata() { /** * Call when ES|QL "planning" phase is complete and query execution (in ComputeService) is about to start. - * Note this is currently only built for a single phase planning/execution model. When INLINESTATS + * Note this is currently only built for a single phase planning/execution model. When INLINE STATS * moves towards GA we may need to revisit this model. Currently, it should never be called more than once. */ public void markEndPlanning() { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Analyzer.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Analyzer.java index cf63ba5c33c9b..f7bd49b75b4c5 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Analyzer.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Analyzer.java @@ -1494,7 +1494,7 @@ private BitSet gatherPreAnalysisMetrics(LogicalPlan plan, BitSet b) { b.set(LIMIT.ordinal()); } - // count only the Aggregate (STATS command) that is "standalone" not also the one that is part of an INLINESTATS command + // count only the Aggregate (STATS command) that is "standalone" not also the one that is part of an INLINE STATS command if (plan instanceof Aggregate) { b.set(STATS.ordinal()); } else { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/capabilities/PostOptimizationPlanVerificationAware.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/capabilities/PostOptimizationPlanVerificationAware.java index ac4fea4f4994e..b3243fddb1301 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/capabilities/PostOptimizationPlanVerificationAware.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/capabilities/PostOptimizationPlanVerificationAware.java @@ -29,7 +29,7 @@ public interface PostOptimizationPlanVerificationAware { * Example: the SORT command, {@code OrderBy}, can only be executed currently if it can be associated with a LIMIT {@code Limit} * and together transformed into a {@code TopN} (which is executable). The replacement of the LIMIT+SORT into a TopN is done at * the end of the optimization phase. This means that any SORT still existing in the plan post optimization is an error. - * However, there can be a LIMIT in the plan, but separated from the SORT by an INLINESTATS; in this case, the LIMIT cannot be + * However, there can be a LIMIT in the plan, but separated from the SORT by an INLINE STATS; in this case, the LIMIT cannot be * pushed down near the SORT. To inform the user how they need to modify the query so it can be run, we implement this: *
      *     {@code
@@ -42,7 +42,7 @@ public interface PostOptimizationPlanVerificationAware {
      *                      failures.add(
      *                          fail(
      *                              inlineJoin,
-     *                              "unbounded sort [{}] not supported before inlinestats [{}], move the sort after the inlinestats",
+     *                              "unbounded SORT [{}] not supported before INLINE STATS [{}], move the sort after the INLINE STATS",
      *                              orderBy.sourceText(),
      *                              inlineJoin.sourceText()
      *                          )
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/grouping/Categorize.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/grouping/Categorize.java
index 74b191e0132ea..d6d61983c26ba 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/grouping/Categorize.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/grouping/Categorize.java
@@ -266,7 +266,7 @@ public BiConsumer postAnalysisPlanVerification() {
                         failures.add(
                             fail(
                                 categorize,
-                                "CATEGORIZE [{}] is not yet supported with INLINESTATS [{}]",
+                                "CATEGORIZE [{}] is not yet supported with INLINE STATS [{}]",
                                 categorize.sourceText(),
                                 inlineStats.sourceText()
                             )
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PropagateInlineEvals.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PropagateInlineEvals.java
index c83e4b319763a..0a0bf71f5fa19 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PropagateInlineEvals.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PropagateInlineEvals.java
@@ -23,7 +23,7 @@
 
 /**
  * Replace any evaluation from the inlined aggregation side (right side) to the left side (source) to perform the matching.
- * In INLINESTATS m = MIN(x) BY a + b the right side contains STATS m = MIN(X) BY a + b.
+ * In INLINE STATS m = MIN(x) BY a + b the right side contains STATS m = MIN(X) BY a + b.
  * As the grouping key is used to perform the join, the evaluation required for creating it has to be copied to the left side
  * as well.
  */
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PruneColumns.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PruneColumns.java
index d4b580739c3e3..f73edeb2ec37d 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PruneColumns.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PruneColumns.java
@@ -49,7 +49,7 @@ private static LogicalPlan pruneColumns(LogicalPlan plan, AttributeSet.Builder u
 
         // while going top-to-bottom (upstream)
         return plan.transformDown(p -> {
-            // Note: It is NOT required to do anything special for binary plans like JOINs, except INLINESTATS. It is perfectly fine that
+            // Note: It is NOT required to do anything special for binary plans like JOINs, except INLINE STATS. It is perfectly fine that
             // transformDown descends first into the left side, adding all kinds of attributes to the `used` set, and then descends into
             // the right side - even though the `used` set will contain stuff only used in the left hand side. That's because any attribute
             // that is used in the left hand side must have been created in the left side as well. Even field attributes belonging to the
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFilters.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFilters.java
index 7a38ae14f87e3..29a9f10270b0d 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFilters.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFilters.java
@@ -105,9 +105,9 @@ protected LogicalPlan rule(Filter filter, LogicalOptimizerContext ctx) {
             // swap the filter with its child
             plan = orderBy.replaceChild(filter.with(orderBy.child(), condition));
         } else if (child instanceof Join join && child instanceof InlineJoin == false) {
-            // TODO: could we do better here about pushing down filters for inlinestats?
+            // TODO: could we do better here about pushing down filters for inline stats?
             // See also https://github.com/elastic/elasticsearch/issues/127497
-            // Push down past INLINESTATS if the condition is on the groupings
+            // Push down past INLINE STATS if the condition is on the groupings
             return pushDownPastJoin(filter, join, ctx.foldCtx());
         }
         // cannot push past a Limit, this could change the tailing result set returned
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownJoinPastProject.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownJoinPastProject.java
index 004f421c49ad0..2eef217b5fa03 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownJoinPastProject.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownJoinPastProject.java
@@ -42,10 +42,10 @@ public final class PushDownJoinPastProject extends OptimizerRules.OptimizerRule<
     @Override
     protected LogicalPlan rule(Join join) {
         if (join instanceof InlineJoin) {
-            // Do not apply to INLINESTATS; this rule could be expanded to include INLINESTATS, but the StubRelation refers to the left
+            // Do not apply to INLINE STATS; this rule could be expanded to include INLINE STATS, but the StubRelation refers to the left
             // child - so pulling out a Project from the left child would require us to also update the StubRelation (and the Aggregate
             // on top of it)
-            // TODO: figure out how to push down in case of INLINESTATS
+            // TODO: figure out how to push down in case of INLINE STATS
             return join;
         }
 
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/RemoveStatsOverride.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/RemoveStatsOverride.java
index 97659f2a77813..d881dff18dcc3 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/RemoveStatsOverride.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/RemoveStatsOverride.java
@@ -26,9 +26,9 @@
  * becomes
  * {@code STATS BY x = c + 10}
  * and
- * {@code INLINESTATS x = COUNT(*), x = MIN(a) BY x = b + 1, x = c + 10}
+ * {@code INLINE STATS x = COUNT(*), x = MIN(a) BY x = b + 1, x = c + 10}
  * becomes
- * {@code INLINESTATS BY x = c + 10}
+ * {@code INLINE STATS BY x = c + 10}
  * This is "last one wins", with groups having priority over aggregates.
  * Separately, it replaces expressions used as group keys inside the aggregates with references:
  * {@code STATS max(a + b + 1) BY a + b}
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/ReplaceAggregateNestedExpressionWithEval.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/ReplaceAggregateNestedExpressionWithEval.java
index 8fe9ccc18c006..830220d3f8dbd 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/ReplaceAggregateNestedExpressionWithEval.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/ReplaceAggregateNestedExpressionWithEval.java
@@ -30,9 +30,9 @@
  * becomes
  * {@code EVAL `a + 1` = a + 1, `x % 2` = x % 2 | STATS SUM(`a+1`_ref) BY `x % 2`_ref}
  * and
- * {@code INLINESTATS SUM(a + 1) BY x % 2}
+ * {@code INLINE STATS SUM(a + 1) BY x % 2}
  * becomes
- * {@code EVAL `a + 1` = a + 1, `x % 2` = x % 2 | INLINESTATS SUM(`a+1`_ref) BY `x % 2`_ref}
+ * {@code EVAL `a + 1` = a + 1, `x % 2` = x % 2 | INLINE STATS SUM(`a+1`_ref) BY `x % 2`_ref}
  */
 public final class ReplaceAggregateNestedExpressionWithEval extends OptimizerRules.OptimizerRule {
 
diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/ReplaceStatsFilteredAggWithEval.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/ReplaceStatsFilteredAggWithEval.java
index fcc59b4268348..62ee81f04c892 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/ReplaceStatsFilteredAggWithEval.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/ReplaceStatsFilteredAggWithEval.java
@@ -33,9 +33,9 @@
 /**
  * Replaces an aggregation function having a false/null filter with an EVAL node.
  * 
- *     ... | STATS/INLINESTATS x = someAgg(y) WHERE FALSE {BY z} | ...
+ *     ... | STATS/INLINE STATS x = someAgg(y) WHERE FALSE {BY z} | ...
  *     =>
- *     ... | STATS/INLINESTATS x = someAgg(y) {BY z} > | EVAL x = NULL | KEEP x{, z} | ...
+ *     ... | STATS/INLINE STATS x = someAgg(y) {BY z} > | EVAL x = NULL | KEEP x{, z} | ...
  * 
* * This rule is applied to both STATS' {@link Aggregate} and {@link InlineJoin} right-hand side {@link Aggregate} plans. @@ -92,7 +92,7 @@ protected LogicalPlan rule(LogicalPlan plan) { agg -> agg == aggregate ? new Eval(aggregate.source(), aggregate.child(), newEvals) : agg ); // Remove the StubRelation since the right-hand side of the join is now part of the main plan - // and it won't be executed separately by the EsqlSession inlinestats planning. + // and it won't be executed separately by the EsqlSession INLINE STATS planning. newRight = InlineJoin.replaceStub(leftHandSide, newRight); // project the correct output (the one of the former inlinejoin) and remove the InlineJoin altogether, diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp index d21c87f8b96f6..c9bb565a3b7f8 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp @@ -15,13 +15,14 @@ null 'row' 'sample' 'sort' -'stats' -'where' null +'where' 'from' 'ts' 'fork' null +null +null 'lookup' null null @@ -114,6 +115,10 @@ null null null null +null +null +null +null 'join' 'USING' null @@ -163,11 +168,12 @@ SAMPLE SORT STATS WHERE -DEV_INLINESTATS FROM TS FORK DEV_FUSE +DEV_INLINE +DEV_INLINESTATS JOIN_LOOKUP DEV_JOIN_FULL DEV_JOIN_LEFT @@ -260,6 +266,10 @@ FORK_MULTILINE_COMMENT FUSE_LINE_COMMENT FUSE_MULTILINE_COMMENT FUSE_WS +INLINE_STATS +INLINE_LINE_COMMENT +INLINE_MULTILINE_COMMENT +INLINE_WS JOIN USING JOIN_LINE_COMMENT @@ -308,11 +318,12 @@ SAMPLE SORT STATS WHERE -DEV_INLINESTATS FROM TS FORK DEV_FUSE +DEV_INLINE +DEV_INLINESTATS JOIN_LOOKUP DEV_JOIN_FULL DEV_JOIN_LEFT @@ -468,6 +479,10 @@ FUSE_UNQUOTED_IDENTIFIER FUSE_LINE_COMMENT FUSE_MULTILINE_COMMENT FUSE_WS +INLINE_STATS +INLINE_LINE_COMMENT +INLINE_MULTILINE_COMMENT +INLINE_WS JOIN_PIPE JOIN JOIN_AS @@ -586,6 +601,7 @@ EXPRESSION_MODE FROM_MODE FORK_MODE FUSE_MODE +INLINE_MODE JOIN_MODE LOOKUP_MODE LOOKUP_FIELD_MODE @@ -596,4 +612,4 @@ SET_MODE SHOW_MODE atn: -[4, 0, 143, 2053, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 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, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 582, 8, 0, 10, 0, 12, 0, 585, 9, 0, 1, 0, 3, 0, 588, 8, 0, 1, 0, 3, 0, 591, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 600, 8, 1, 10, 1, 12, 1, 603, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 611, 8, 2, 11, 2, 12, 2, 612, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 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, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 4, 34, 893, 8, 34, 11, 34, 12, 34, 894, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 4, 53, 978, 8, 53, 11, 53, 12, 53, 979, 1, 53, 1, 53, 3, 53, 984, 8, 53, 1, 53, 4, 53, 987, 8, 53, 11, 53, 12, 53, 988, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 3, 86, 1121, 8, 86, 1, 86, 4, 86, 1124, 8, 86, 11, 86, 12, 86, 1125, 1, 87, 1, 87, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 3, 89, 1135, 8, 89, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 3, 91, 1142, 8, 91, 1, 92, 1, 92, 1, 92, 5, 92, 1147, 8, 92, 10, 92, 12, 92, 1150, 9, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 5, 92, 1158, 8, 92, 10, 92, 12, 92, 1161, 9, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 3, 92, 1168, 8, 92, 1, 92, 3, 92, 1171, 8, 92, 3, 92, 1173, 8, 92, 1, 93, 4, 93, 1176, 8, 93, 11, 93, 12, 93, 1177, 1, 94, 4, 94, 1181, 8, 94, 11, 94, 12, 94, 1182, 1, 94, 1, 94, 5, 94, 1187, 8, 94, 10, 94, 12, 94, 1190, 9, 94, 1, 94, 1, 94, 4, 94, 1194, 8, 94, 11, 94, 12, 94, 1195, 1, 94, 4, 94, 1199, 8, 94, 11, 94, 12, 94, 1200, 1, 94, 1, 94, 5, 94, 1205, 8, 94, 10, 94, 12, 94, 1208, 9, 94, 3, 94, 1210, 8, 94, 1, 94, 1, 94, 1, 94, 1, 94, 4, 94, 1216, 8, 94, 11, 94, 12, 94, 1217, 1, 94, 1, 94, 3, 94, 1222, 8, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 101, 1, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 128, 1, 128, 1, 129, 1, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 3, 136, 1363, 8, 136, 1, 136, 5, 136, 1366, 8, 136, 10, 136, 12, 136, 1369, 9, 136, 1, 136, 1, 136, 4, 136, 1373, 8, 136, 11, 136, 12, 136, 1374, 3, 136, 1377, 8, 136, 1, 137, 1, 137, 1, 137, 3, 137, 1382, 8, 137, 1, 137, 5, 137, 1385, 8, 137, 10, 137, 12, 137, 1388, 9, 137, 1, 137, 1, 137, 4, 137, 1392, 8, 137, 11, 137, 12, 137, 1393, 3, 137, 1396, 8, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 5, 142, 1420, 8, 142, 10, 142, 12, 142, 1423, 9, 142, 1, 142, 1, 142, 3, 142, 1427, 8, 142, 1, 142, 4, 142, 1430, 8, 142, 11, 142, 12, 142, 1431, 3, 142, 1434, 8, 142, 1, 143, 1, 143, 4, 143, 1438, 8, 143, 11, 143, 12, 143, 1439, 1, 143, 1, 143, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 3, 155, 1496, 8, 155, 1, 156, 4, 156, 1499, 8, 156, 11, 156, 12, 156, 1500, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 206, 1, 206, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 209, 1, 209, 1, 209, 1, 209, 1, 210, 1, 210, 1, 210, 1, 210, 1, 211, 1, 211, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 3, 231, 1836, 8, 231, 1, 232, 1, 232, 3, 232, 1840, 8, 232, 1, 232, 5, 232, 1843, 8, 232, 10, 232, 12, 232, 1846, 9, 232, 1, 232, 1, 232, 3, 232, 1850, 8, 232, 1, 232, 4, 232, 1853, 8, 232, 11, 232, 12, 232, 1854, 3, 232, 1857, 8, 232, 1, 233, 1, 233, 4, 233, 1861, 8, 233, 11, 233, 12, 233, 1862, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 240, 1, 240, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 253, 1, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 259, 1, 259, 1, 259, 1, 259, 1, 260, 1, 260, 1, 260, 1, 260, 1, 261, 1, 261, 1, 261, 1, 261, 1, 262, 1, 262, 1, 262, 1, 262, 1, 263, 1, 263, 1, 263, 1, 263, 1, 264, 1, 264, 1, 264, 1, 264, 1, 265, 1, 265, 1, 265, 1, 265, 1, 266, 1, 266, 1, 266, 1, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 1, 272, 1, 272, 1, 272, 1, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 274, 1, 274, 1, 274, 1, 274, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 277, 1, 277, 1, 277, 1, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 279, 1, 279, 1, 279, 1, 279, 2, 601, 1159, 0, 280, 17, 1, 19, 2, 21, 3, 23, 4, 25, 5, 27, 6, 29, 7, 31, 8, 33, 9, 35, 10, 37, 11, 39, 12, 41, 13, 43, 14, 45, 15, 47, 16, 49, 17, 51, 18, 53, 19, 55, 20, 57, 21, 59, 22, 61, 23, 63, 24, 65, 25, 67, 26, 69, 27, 71, 28, 73, 29, 75, 30, 77, 31, 79, 32, 81, 33, 83, 34, 85, 35, 87, 0, 89, 0, 91, 0, 93, 0, 95, 0, 97, 0, 99, 0, 101, 0, 103, 0, 105, 0, 107, 36, 109, 37, 111, 38, 113, 0, 115, 0, 117, 0, 119, 0, 121, 0, 123, 39, 125, 0, 127, 0, 129, 40, 131, 41, 133, 42, 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, 43, 165, 44, 167, 45, 169, 0, 171, 0, 173, 46, 175, 47, 177, 48, 179, 49, 181, 0, 183, 0, 185, 0, 187, 0, 189, 0, 191, 0, 193, 0, 195, 0, 197, 0, 199, 0, 201, 50, 203, 51, 205, 52, 207, 53, 209, 54, 211, 55, 213, 56, 215, 57, 217, 58, 219, 59, 221, 60, 223, 61, 225, 62, 227, 63, 229, 64, 231, 65, 233, 66, 235, 67, 237, 68, 239, 69, 241, 70, 243, 71, 245, 72, 247, 73, 249, 74, 251, 75, 253, 76, 255, 77, 257, 78, 259, 79, 261, 80, 263, 81, 265, 82, 267, 83, 269, 84, 271, 85, 273, 86, 275, 87, 277, 88, 279, 89, 281, 90, 283, 91, 285, 92, 287, 0, 289, 93, 291, 94, 293, 95, 295, 96, 297, 97, 299, 98, 301, 99, 303, 0, 305, 100, 307, 101, 309, 102, 311, 103, 313, 0, 315, 0, 317, 0, 319, 0, 321, 0, 323, 104, 325, 0, 327, 0, 329, 105, 331, 0, 333, 0, 335, 106, 337, 107, 339, 108, 341, 0, 343, 0, 345, 0, 347, 109, 349, 110, 351, 111, 353, 0, 355, 0, 357, 0, 359, 0, 361, 0, 363, 0, 365, 112, 367, 113, 369, 114, 371, 0, 373, 115, 375, 0, 377, 0, 379, 116, 381, 0, 383, 0, 385, 0, 387, 117, 389, 118, 391, 119, 393, 0, 395, 0, 397, 0, 399, 0, 401, 0, 403, 0, 405, 0, 407, 0, 409, 120, 411, 121, 413, 122, 415, 0, 417, 0, 419, 0, 421, 0, 423, 0, 425, 123, 427, 124, 429, 125, 431, 0, 433, 0, 435, 0, 437, 0, 439, 0, 441, 0, 443, 0, 445, 0, 447, 0, 449, 0, 451, 0, 453, 126, 455, 127, 457, 128, 459, 0, 461, 0, 463, 0, 465, 0, 467, 0, 469, 0, 471, 0, 473, 0, 475, 0, 477, 0, 479, 0, 481, 0, 483, 129, 485, 130, 487, 131, 489, 132, 491, 0, 493, 0, 495, 0, 497, 0, 499, 0, 501, 0, 503, 0, 505, 0, 507, 0, 509, 0, 511, 0, 513, 133, 515, 0, 517, 134, 519, 135, 521, 136, 523, 0, 525, 0, 527, 0, 529, 0, 531, 0, 533, 0, 535, 0, 537, 0, 539, 0, 541, 0, 543, 0, 545, 0, 547, 0, 549, 0, 551, 0, 553, 0, 555, 0, 557, 0, 559, 0, 561, 137, 563, 138, 565, 139, 567, 0, 569, 140, 571, 141, 573, 142, 575, 143, 17, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 36, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 2, 0, 67, 67, 99, 99, 2, 0, 72, 72, 104, 104, 2, 0, 65, 65, 97, 97, 2, 0, 78, 78, 110, 110, 2, 0, 71, 71, 103, 103, 2, 0, 69, 69, 101, 101, 2, 0, 80, 80, 112, 112, 2, 0, 79, 79, 111, 111, 2, 0, 73, 73, 105, 105, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 88, 88, 120, 120, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 68, 68, 100, 100, 2, 0, 83, 83, 115, 115, 2, 0, 86, 86, 118, 118, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 70, 70, 102, 102, 2, 0, 85, 85, 117, 117, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 12, 0, 9, 10, 13, 13, 32, 32, 34, 35, 40, 41, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 12, 0, 9, 10, 13, 13, 32, 32, 34, 34, 40, 41, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 2, 0, 74, 74, 106, 106, 2078, 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, 1, 87, 1, 0, 0, 0, 1, 89, 1, 0, 0, 0, 1, 91, 1, 0, 0, 0, 1, 93, 1, 0, 0, 0, 1, 95, 1, 0, 0, 0, 1, 97, 1, 0, 0, 0, 1, 99, 1, 0, 0, 0, 1, 101, 1, 0, 0, 0, 1, 103, 1, 0, 0, 0, 1, 105, 1, 0, 0, 0, 1, 107, 1, 0, 0, 0, 1, 109, 1, 0, 0, 0, 1, 111, 1, 0, 0, 0, 2, 113, 1, 0, 0, 0, 2, 115, 1, 0, 0, 0, 2, 117, 1, 0, 0, 0, 2, 119, 1, 0, 0, 0, 2, 123, 1, 0, 0, 0, 2, 125, 1, 0, 0, 0, 2, 127, 1, 0, 0, 0, 2, 129, 1, 0, 0, 0, 2, 131, 1, 0, 0, 0, 2, 133, 1, 0, 0, 0, 3, 135, 1, 0, 0, 0, 3, 137, 1, 0, 0, 0, 3, 139, 1, 0, 0, 0, 3, 141, 1, 0, 0, 0, 3, 143, 1, 0, 0, 0, 3, 145, 1, 0, 0, 0, 3, 147, 1, 0, 0, 0, 3, 149, 1, 0, 0, 0, 3, 151, 1, 0, 0, 0, 3, 153, 1, 0, 0, 0, 3, 155, 1, 0, 0, 0, 3, 157, 1, 0, 0, 0, 3, 159, 1, 0, 0, 0, 3, 161, 1, 0, 0, 0, 3, 163, 1, 0, 0, 0, 3, 165, 1, 0, 0, 0, 3, 167, 1, 0, 0, 0, 4, 169, 1, 0, 0, 0, 4, 171, 1, 0, 0, 0, 4, 173, 1, 0, 0, 0, 4, 175, 1, 0, 0, 0, 4, 177, 1, 0, 0, 0, 5, 179, 1, 0, 0, 0, 5, 201, 1, 0, 0, 0, 5, 203, 1, 0, 0, 0, 5, 205, 1, 0, 0, 0, 5, 207, 1, 0, 0, 0, 5, 209, 1, 0, 0, 0, 5, 211, 1, 0, 0, 0, 5, 213, 1, 0, 0, 0, 5, 215, 1, 0, 0, 0, 5, 217, 1, 0, 0, 0, 5, 219, 1, 0, 0, 0, 5, 221, 1, 0, 0, 0, 5, 223, 1, 0, 0, 0, 5, 225, 1, 0, 0, 0, 5, 227, 1, 0, 0, 0, 5, 229, 1, 0, 0, 0, 5, 231, 1, 0, 0, 0, 5, 233, 1, 0, 0, 0, 5, 235, 1, 0, 0, 0, 5, 237, 1, 0, 0, 0, 5, 239, 1, 0, 0, 0, 5, 241, 1, 0, 0, 0, 5, 243, 1, 0, 0, 0, 5, 245, 1, 0, 0, 0, 5, 247, 1, 0, 0, 0, 5, 249, 1, 0, 0, 0, 5, 251, 1, 0, 0, 0, 5, 253, 1, 0, 0, 0, 5, 255, 1, 0, 0, 0, 5, 257, 1, 0, 0, 0, 5, 259, 1, 0, 0, 0, 5, 261, 1, 0, 0, 0, 5, 263, 1, 0, 0, 0, 5, 265, 1, 0, 0, 0, 5, 267, 1, 0, 0, 0, 5, 269, 1, 0, 0, 0, 5, 271, 1, 0, 0, 0, 5, 273, 1, 0, 0, 0, 5, 275, 1, 0, 0, 0, 5, 277, 1, 0, 0, 0, 5, 279, 1, 0, 0, 0, 5, 281, 1, 0, 0, 0, 5, 283, 1, 0, 0, 0, 5, 285, 1, 0, 0, 0, 5, 287, 1, 0, 0, 0, 5, 289, 1, 0, 0, 0, 5, 291, 1, 0, 0, 0, 5, 293, 1, 0, 0, 0, 5, 295, 1, 0, 0, 0, 5, 297, 1, 0, 0, 0, 5, 299, 1, 0, 0, 0, 5, 301, 1, 0, 0, 0, 5, 305, 1, 0, 0, 0, 5, 307, 1, 0, 0, 0, 5, 309, 1, 0, 0, 0, 5, 311, 1, 0, 0, 0, 6, 313, 1, 0, 0, 0, 6, 315, 1, 0, 0, 0, 6, 317, 1, 0, 0, 0, 6, 319, 1, 0, 0, 0, 6, 321, 1, 0, 0, 0, 6, 323, 1, 0, 0, 0, 6, 325, 1, 0, 0, 0, 6, 329, 1, 0, 0, 0, 6, 331, 1, 0, 0, 0, 6, 333, 1, 0, 0, 0, 6, 335, 1, 0, 0, 0, 6, 337, 1, 0, 0, 0, 6, 339, 1, 0, 0, 0, 7, 341, 1, 0, 0, 0, 7, 343, 1, 0, 0, 0, 7, 345, 1, 0, 0, 0, 7, 347, 1, 0, 0, 0, 7, 349, 1, 0, 0, 0, 7, 351, 1, 0, 0, 0, 8, 353, 1, 0, 0, 0, 8, 355, 1, 0, 0, 0, 8, 357, 1, 0, 0, 0, 8, 359, 1, 0, 0, 0, 8, 361, 1, 0, 0, 0, 8, 363, 1, 0, 0, 0, 8, 365, 1, 0, 0, 0, 8, 367, 1, 0, 0, 0, 8, 369, 1, 0, 0, 0, 9, 371, 1, 0, 0, 0, 9, 373, 1, 0, 0, 0, 9, 375, 1, 0, 0, 0, 9, 377, 1, 0, 0, 0, 9, 379, 1, 0, 0, 0, 9, 381, 1, 0, 0, 0, 9, 383, 1, 0, 0, 0, 9, 385, 1, 0, 0, 0, 9, 387, 1, 0, 0, 0, 9, 389, 1, 0, 0, 0, 9, 391, 1, 0, 0, 0, 10, 393, 1, 0, 0, 0, 10, 395, 1, 0, 0, 0, 10, 397, 1, 0, 0, 0, 10, 399, 1, 0, 0, 0, 10, 401, 1, 0, 0, 0, 10, 403, 1, 0, 0, 0, 10, 405, 1, 0, 0, 0, 10, 407, 1, 0, 0, 0, 10, 409, 1, 0, 0, 0, 10, 411, 1, 0, 0, 0, 10, 413, 1, 0, 0, 0, 11, 415, 1, 0, 0, 0, 11, 417, 1, 0, 0, 0, 11, 419, 1, 0, 0, 0, 11, 421, 1, 0, 0, 0, 11, 423, 1, 0, 0, 0, 11, 425, 1, 0, 0, 0, 11, 427, 1, 0, 0, 0, 11, 429, 1, 0, 0, 0, 12, 431, 1, 0, 0, 0, 12, 433, 1, 0, 0, 0, 12, 435, 1, 0, 0, 0, 12, 437, 1, 0, 0, 0, 12, 439, 1, 0, 0, 0, 12, 441, 1, 0, 0, 0, 12, 443, 1, 0, 0, 0, 12, 445, 1, 0, 0, 0, 12, 447, 1, 0, 0, 0, 12, 449, 1, 0, 0, 0, 12, 451, 1, 0, 0, 0, 12, 453, 1, 0, 0, 0, 12, 455, 1, 0, 0, 0, 12, 457, 1, 0, 0, 0, 13, 459, 1, 0, 0, 0, 13, 461, 1, 0, 0, 0, 13, 463, 1, 0, 0, 0, 13, 465, 1, 0, 0, 0, 13, 467, 1, 0, 0, 0, 13, 469, 1, 0, 0, 0, 13, 471, 1, 0, 0, 0, 13, 473, 1, 0, 0, 0, 13, 475, 1, 0, 0, 0, 13, 477, 1, 0, 0, 0, 13, 483, 1, 0, 0, 0, 13, 485, 1, 0, 0, 0, 13, 487, 1, 0, 0, 0, 13, 489, 1, 0, 0, 0, 14, 491, 1, 0, 0, 0, 14, 493, 1, 0, 0, 0, 14, 495, 1, 0, 0, 0, 14, 497, 1, 0, 0, 0, 14, 499, 1, 0, 0, 0, 14, 501, 1, 0, 0, 0, 14, 503, 1, 0, 0, 0, 14, 505, 1, 0, 0, 0, 14, 507, 1, 0, 0, 0, 14, 509, 1, 0, 0, 0, 14, 511, 1, 0, 0, 0, 14, 513, 1, 0, 0, 0, 14, 515, 1, 0, 0, 0, 14, 517, 1, 0, 0, 0, 14, 519, 1, 0, 0, 0, 14, 521, 1, 0, 0, 0, 15, 523, 1, 0, 0, 0, 15, 525, 1, 0, 0, 0, 15, 527, 1, 0, 0, 0, 15, 529, 1, 0, 0, 0, 15, 531, 1, 0, 0, 0, 15, 533, 1, 0, 0, 0, 15, 535, 1, 0, 0, 0, 15, 537, 1, 0, 0, 0, 15, 539, 1, 0, 0, 0, 15, 541, 1, 0, 0, 0, 15, 543, 1, 0, 0, 0, 15, 545, 1, 0, 0, 0, 15, 547, 1, 0, 0, 0, 15, 549, 1, 0, 0, 0, 15, 551, 1, 0, 0, 0, 15, 553, 1, 0, 0, 0, 15, 555, 1, 0, 0, 0, 15, 557, 1, 0, 0, 0, 15, 559, 1, 0, 0, 0, 15, 561, 1, 0, 0, 0, 15, 563, 1, 0, 0, 0, 15, 565, 1, 0, 0, 0, 16, 567, 1, 0, 0, 0, 16, 569, 1, 0, 0, 0, 16, 571, 1, 0, 0, 0, 16, 573, 1, 0, 0, 0, 16, 575, 1, 0, 0, 0, 17, 577, 1, 0, 0, 0, 19, 594, 1, 0, 0, 0, 21, 610, 1, 0, 0, 0, 23, 616, 1, 0, 0, 0, 25, 631, 1, 0, 0, 0, 27, 640, 1, 0, 0, 0, 29, 651, 1, 0, 0, 0, 31, 664, 1, 0, 0, 0, 33, 674, 1, 0, 0, 0, 35, 681, 1, 0, 0, 0, 37, 688, 1, 0, 0, 0, 39, 696, 1, 0, 0, 0, 41, 705, 1, 0, 0, 0, 43, 711, 1, 0, 0, 0, 45, 720, 1, 0, 0, 0, 47, 727, 1, 0, 0, 0, 49, 735, 1, 0, 0, 0, 51, 743, 1, 0, 0, 0, 53, 758, 1, 0, 0, 0, 55, 765, 1, 0, 0, 0, 57, 770, 1, 0, 0, 0, 59, 777, 1, 0, 0, 0, 61, 785, 1, 0, 0, 0, 63, 794, 1, 0, 0, 0, 65, 802, 1, 0, 0, 0, 67, 810, 1, 0, 0, 0, 69, 819, 1, 0, 0, 0, 71, 831, 1, 0, 0, 0, 73, 843, 1, 0, 0, 0, 75, 850, 1, 0, 0, 0, 77, 857, 1, 0, 0, 0, 79, 869, 1, 0, 0, 0, 81, 878, 1, 0, 0, 0, 83, 884, 1, 0, 0, 0, 85, 892, 1, 0, 0, 0, 87, 898, 1, 0, 0, 0, 89, 903, 1, 0, 0, 0, 91, 909, 1, 0, 0, 0, 93, 913, 1, 0, 0, 0, 95, 917, 1, 0, 0, 0, 97, 921, 1, 0, 0, 0, 99, 925, 1, 0, 0, 0, 101, 929, 1, 0, 0, 0, 103, 933, 1, 0, 0, 0, 105, 937, 1, 0, 0, 0, 107, 941, 1, 0, 0, 0, 109, 945, 1, 0, 0, 0, 111, 949, 1, 0, 0, 0, 113, 953, 1, 0, 0, 0, 115, 958, 1, 0, 0, 0, 117, 964, 1, 0, 0, 0, 119, 969, 1, 0, 0, 0, 121, 974, 1, 0, 0, 0, 123, 983, 1, 0, 0, 0, 125, 990, 1, 0, 0, 0, 127, 994, 1, 0, 0, 0, 129, 998, 1, 0, 0, 0, 131, 1002, 1, 0, 0, 0, 133, 1006, 1, 0, 0, 0, 135, 1010, 1, 0, 0, 0, 137, 1016, 1, 0, 0, 0, 139, 1023, 1, 0, 0, 0, 141, 1027, 1, 0, 0, 0, 143, 1031, 1, 0, 0, 0, 145, 1035, 1, 0, 0, 0, 147, 1039, 1, 0, 0, 0, 149, 1043, 1, 0, 0, 0, 151, 1047, 1, 0, 0, 0, 153, 1051, 1, 0, 0, 0, 155, 1055, 1, 0, 0, 0, 157, 1059, 1, 0, 0, 0, 159, 1063, 1, 0, 0, 0, 161, 1067, 1, 0, 0, 0, 163, 1071, 1, 0, 0, 0, 165, 1075, 1, 0, 0, 0, 167, 1079, 1, 0, 0, 0, 169, 1083, 1, 0, 0, 0, 171, 1088, 1, 0, 0, 0, 173, 1093, 1, 0, 0, 0, 175, 1097, 1, 0, 0, 0, 177, 1101, 1, 0, 0, 0, 179, 1105, 1, 0, 0, 0, 181, 1109, 1, 0, 0, 0, 183, 1111, 1, 0, 0, 0, 185, 1113, 1, 0, 0, 0, 187, 1116, 1, 0, 0, 0, 189, 1118, 1, 0, 0, 0, 191, 1127, 1, 0, 0, 0, 193, 1129, 1, 0, 0, 0, 195, 1134, 1, 0, 0, 0, 197, 1136, 1, 0, 0, 0, 199, 1141, 1, 0, 0, 0, 201, 1172, 1, 0, 0, 0, 203, 1175, 1, 0, 0, 0, 205, 1221, 1, 0, 0, 0, 207, 1223, 1, 0, 0, 0, 209, 1227, 1, 0, 0, 0, 211, 1231, 1, 0, 0, 0, 213, 1233, 1, 0, 0, 0, 215, 1236, 1, 0, 0, 0, 217, 1239, 1, 0, 0, 0, 219, 1241, 1, 0, 0, 0, 221, 1243, 1, 0, 0, 0, 223, 1245, 1, 0, 0, 0, 225, 1250, 1, 0, 0, 0, 227, 1252, 1, 0, 0, 0, 229, 1258, 1, 0, 0, 0, 231, 1264, 1, 0, 0, 0, 233, 1267, 1, 0, 0, 0, 235, 1270, 1, 0, 0, 0, 237, 1275, 1, 0, 0, 0, 239, 1280, 1, 0, 0, 0, 241, 1284, 1, 0, 0, 0, 243, 1289, 1, 0, 0, 0, 245, 1295, 1, 0, 0, 0, 247, 1298, 1, 0, 0, 0, 249, 1301, 1, 0, 0, 0, 251, 1303, 1, 0, 0, 0, 253, 1309, 1, 0, 0, 0, 255, 1314, 1, 0, 0, 0, 257, 1319, 1, 0, 0, 0, 259, 1322, 1, 0, 0, 0, 261, 1325, 1, 0, 0, 0, 263, 1328, 1, 0, 0, 0, 265, 1330, 1, 0, 0, 0, 267, 1333, 1, 0, 0, 0, 269, 1335, 1, 0, 0, 0, 271, 1338, 1, 0, 0, 0, 273, 1340, 1, 0, 0, 0, 275, 1342, 1, 0, 0, 0, 277, 1344, 1, 0, 0, 0, 279, 1346, 1, 0, 0, 0, 281, 1348, 1, 0, 0, 0, 283, 1350, 1, 0, 0, 0, 285, 1352, 1, 0, 0, 0, 287, 1355, 1, 0, 0, 0, 289, 1376, 1, 0, 0, 0, 291, 1395, 1, 0, 0, 0, 293, 1397, 1, 0, 0, 0, 295, 1402, 1, 0, 0, 0, 297, 1407, 1, 0, 0, 0, 299, 1412, 1, 0, 0, 0, 301, 1433, 1, 0, 0, 0, 303, 1435, 1, 0, 0, 0, 305, 1443, 1, 0, 0, 0, 307, 1445, 1, 0, 0, 0, 309, 1449, 1, 0, 0, 0, 311, 1453, 1, 0, 0, 0, 313, 1457, 1, 0, 0, 0, 315, 1462, 1, 0, 0, 0, 317, 1466, 1, 0, 0, 0, 319, 1470, 1, 0, 0, 0, 321, 1474, 1, 0, 0, 0, 323, 1478, 1, 0, 0, 0, 325, 1487, 1, 0, 0, 0, 327, 1495, 1, 0, 0, 0, 329, 1498, 1, 0, 0, 0, 331, 1502, 1, 0, 0, 0, 333, 1506, 1, 0, 0, 0, 335, 1510, 1, 0, 0, 0, 337, 1514, 1, 0, 0, 0, 339, 1518, 1, 0, 0, 0, 341, 1522, 1, 0, 0, 0, 343, 1527, 1, 0, 0, 0, 345, 1533, 1, 0, 0, 0, 347, 1538, 1, 0, 0, 0, 349, 1542, 1, 0, 0, 0, 351, 1546, 1, 0, 0, 0, 353, 1550, 1, 0, 0, 0, 355, 1555, 1, 0, 0, 0, 357, 1561, 1, 0, 0, 0, 359, 1567, 1, 0, 0, 0, 361, 1571, 1, 0, 0, 0, 363, 1575, 1, 0, 0, 0, 365, 1579, 1, 0, 0, 0, 367, 1583, 1, 0, 0, 0, 369, 1587, 1, 0, 0, 0, 371, 1591, 1, 0, 0, 0, 373, 1596, 1, 0, 0, 0, 375, 1601, 1, 0, 0, 0, 377, 1605, 1, 0, 0, 0, 379, 1611, 1, 0, 0, 0, 381, 1620, 1, 0, 0, 0, 383, 1624, 1, 0, 0, 0, 385, 1628, 1, 0, 0, 0, 387, 1632, 1, 0, 0, 0, 389, 1636, 1, 0, 0, 0, 391, 1640, 1, 0, 0, 0, 393, 1644, 1, 0, 0, 0, 395, 1649, 1, 0, 0, 0, 397, 1655, 1, 0, 0, 0, 399, 1659, 1, 0, 0, 0, 401, 1663, 1, 0, 0, 0, 403, 1667, 1, 0, 0, 0, 405, 1672, 1, 0, 0, 0, 407, 1676, 1, 0, 0, 0, 409, 1680, 1, 0, 0, 0, 411, 1684, 1, 0, 0, 0, 413, 1688, 1, 0, 0, 0, 415, 1692, 1, 0, 0, 0, 417, 1698, 1, 0, 0, 0, 419, 1705, 1, 0, 0, 0, 421, 1709, 1, 0, 0, 0, 423, 1713, 1, 0, 0, 0, 425, 1717, 1, 0, 0, 0, 427, 1721, 1, 0, 0, 0, 429, 1725, 1, 0, 0, 0, 431, 1729, 1, 0, 0, 0, 433, 1734, 1, 0, 0, 0, 435, 1740, 1, 0, 0, 0, 437, 1744, 1, 0, 0, 0, 439, 1748, 1, 0, 0, 0, 441, 1752, 1, 0, 0, 0, 443, 1756, 1, 0, 0, 0, 445, 1760, 1, 0, 0, 0, 447, 1764, 1, 0, 0, 0, 449, 1768, 1, 0, 0, 0, 451, 1772, 1, 0, 0, 0, 453, 1776, 1, 0, 0, 0, 455, 1780, 1, 0, 0, 0, 457, 1784, 1, 0, 0, 0, 459, 1788, 1, 0, 0, 0, 461, 1793, 1, 0, 0, 0, 463, 1799, 1, 0, 0, 0, 465, 1803, 1, 0, 0, 0, 467, 1807, 1, 0, 0, 0, 469, 1811, 1, 0, 0, 0, 471, 1815, 1, 0, 0, 0, 473, 1819, 1, 0, 0, 0, 475, 1823, 1, 0, 0, 0, 477, 1827, 1, 0, 0, 0, 479, 1835, 1, 0, 0, 0, 481, 1856, 1, 0, 0, 0, 483, 1860, 1, 0, 0, 0, 485, 1864, 1, 0, 0, 0, 487, 1868, 1, 0, 0, 0, 489, 1872, 1, 0, 0, 0, 491, 1876, 1, 0, 0, 0, 493, 1881, 1, 0, 0, 0, 495, 1887, 1, 0, 0, 0, 497, 1891, 1, 0, 0, 0, 499, 1895, 1, 0, 0, 0, 501, 1899, 1, 0, 0, 0, 503, 1903, 1, 0, 0, 0, 505, 1907, 1, 0, 0, 0, 507, 1911, 1, 0, 0, 0, 509, 1915, 1, 0, 0, 0, 511, 1919, 1, 0, 0, 0, 513, 1923, 1, 0, 0, 0, 515, 1926, 1, 0, 0, 0, 517, 1930, 1, 0, 0, 0, 519, 1934, 1, 0, 0, 0, 521, 1938, 1, 0, 0, 0, 523, 1942, 1, 0, 0, 0, 525, 1946, 1, 0, 0, 0, 527, 1950, 1, 0, 0, 0, 529, 1954, 1, 0, 0, 0, 531, 1959, 1, 0, 0, 0, 533, 1963, 1, 0, 0, 0, 535, 1967, 1, 0, 0, 0, 537, 1971, 1, 0, 0, 0, 539, 1975, 1, 0, 0, 0, 541, 1979, 1, 0, 0, 0, 543, 1983, 1, 0, 0, 0, 545, 1987, 1, 0, 0, 0, 547, 1991, 1, 0, 0, 0, 549, 1995, 1, 0, 0, 0, 551, 1999, 1, 0, 0, 0, 553, 2003, 1, 0, 0, 0, 555, 2007, 1, 0, 0, 0, 557, 2011, 1, 0, 0, 0, 559, 2015, 1, 0, 0, 0, 561, 2019, 1, 0, 0, 0, 563, 2023, 1, 0, 0, 0, 565, 2027, 1, 0, 0, 0, 567, 2031, 1, 0, 0, 0, 569, 2036, 1, 0, 0, 0, 571, 2041, 1, 0, 0, 0, 573, 2045, 1, 0, 0, 0, 575, 2049, 1, 0, 0, 0, 577, 578, 5, 47, 0, 0, 578, 579, 5, 47, 0, 0, 579, 583, 1, 0, 0, 0, 580, 582, 8, 0, 0, 0, 581, 580, 1, 0, 0, 0, 582, 585, 1, 0, 0, 0, 583, 581, 1, 0, 0, 0, 583, 584, 1, 0, 0, 0, 584, 587, 1, 0, 0, 0, 585, 583, 1, 0, 0, 0, 586, 588, 5, 13, 0, 0, 587, 586, 1, 0, 0, 0, 587, 588, 1, 0, 0, 0, 588, 590, 1, 0, 0, 0, 589, 591, 5, 10, 0, 0, 590, 589, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 593, 6, 0, 0, 0, 593, 18, 1, 0, 0, 0, 594, 595, 5, 47, 0, 0, 595, 596, 5, 42, 0, 0, 596, 601, 1, 0, 0, 0, 597, 600, 3, 19, 1, 0, 598, 600, 9, 0, 0, 0, 599, 597, 1, 0, 0, 0, 599, 598, 1, 0, 0, 0, 600, 603, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 601, 599, 1, 0, 0, 0, 602, 604, 1, 0, 0, 0, 603, 601, 1, 0, 0, 0, 604, 605, 5, 42, 0, 0, 605, 606, 5, 47, 0, 0, 606, 607, 1, 0, 0, 0, 607, 608, 6, 1, 0, 0, 608, 20, 1, 0, 0, 0, 609, 611, 7, 1, 0, 0, 610, 609, 1, 0, 0, 0, 611, 612, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 6, 2, 0, 0, 615, 22, 1, 0, 0, 0, 616, 617, 7, 2, 0, 0, 617, 618, 7, 3, 0, 0, 618, 619, 7, 4, 0, 0, 619, 620, 7, 5, 0, 0, 620, 621, 7, 6, 0, 0, 621, 622, 7, 7, 0, 0, 622, 623, 5, 95, 0, 0, 623, 624, 7, 8, 0, 0, 624, 625, 7, 9, 0, 0, 625, 626, 7, 10, 0, 0, 626, 627, 7, 5, 0, 0, 627, 628, 7, 11, 0, 0, 628, 629, 1, 0, 0, 0, 629, 630, 6, 3, 1, 0, 630, 24, 1, 0, 0, 0, 631, 632, 7, 7, 0, 0, 632, 633, 7, 5, 0, 0, 633, 634, 7, 12, 0, 0, 634, 635, 7, 10, 0, 0, 635, 636, 7, 2, 0, 0, 636, 637, 7, 3, 0, 0, 637, 638, 1, 0, 0, 0, 638, 639, 6, 4, 2, 0, 639, 26, 1, 0, 0, 0, 640, 641, 4, 5, 0, 0, 641, 642, 7, 7, 0, 0, 642, 643, 7, 13, 0, 0, 643, 644, 7, 8, 0, 0, 644, 645, 7, 14, 0, 0, 645, 646, 7, 4, 0, 0, 646, 647, 7, 10, 0, 0, 647, 648, 7, 5, 0, 0, 648, 649, 1, 0, 0, 0, 649, 650, 6, 5, 3, 0, 650, 28, 1, 0, 0, 0, 651, 652, 7, 2, 0, 0, 652, 653, 7, 9, 0, 0, 653, 654, 7, 15, 0, 0, 654, 655, 7, 8, 0, 0, 655, 656, 7, 14, 0, 0, 656, 657, 7, 7, 0, 0, 657, 658, 7, 11, 0, 0, 658, 659, 7, 10, 0, 0, 659, 660, 7, 9, 0, 0, 660, 661, 7, 5, 0, 0, 661, 662, 1, 0, 0, 0, 662, 663, 6, 6, 4, 0, 663, 30, 1, 0, 0, 0, 664, 665, 7, 16, 0, 0, 665, 666, 7, 10, 0, 0, 666, 667, 7, 17, 0, 0, 667, 668, 7, 17, 0, 0, 668, 669, 7, 7, 0, 0, 669, 670, 7, 2, 0, 0, 670, 671, 7, 11, 0, 0, 671, 672, 1, 0, 0, 0, 672, 673, 6, 7, 4, 0, 673, 32, 1, 0, 0, 0, 674, 675, 7, 7, 0, 0, 675, 676, 7, 18, 0, 0, 676, 677, 7, 4, 0, 0, 677, 678, 7, 14, 0, 0, 678, 679, 1, 0, 0, 0, 679, 680, 6, 8, 4, 0, 680, 34, 1, 0, 0, 0, 681, 682, 7, 6, 0, 0, 682, 683, 7, 12, 0, 0, 683, 684, 7, 9, 0, 0, 684, 685, 7, 19, 0, 0, 685, 686, 1, 0, 0, 0, 686, 687, 6, 9, 4, 0, 687, 36, 1, 0, 0, 0, 688, 689, 7, 14, 0, 0, 689, 690, 7, 10, 0, 0, 690, 691, 7, 15, 0, 0, 691, 692, 7, 10, 0, 0, 692, 693, 7, 11, 0, 0, 693, 694, 1, 0, 0, 0, 694, 695, 6, 10, 4, 0, 695, 38, 1, 0, 0, 0, 696, 697, 7, 12, 0, 0, 697, 698, 7, 7, 0, 0, 698, 699, 7, 12, 0, 0, 699, 700, 7, 4, 0, 0, 700, 701, 7, 5, 0, 0, 701, 702, 7, 19, 0, 0, 702, 703, 1, 0, 0, 0, 703, 704, 6, 11, 4, 0, 704, 40, 1, 0, 0, 0, 705, 706, 7, 12, 0, 0, 706, 707, 7, 9, 0, 0, 707, 708, 7, 20, 0, 0, 708, 709, 1, 0, 0, 0, 709, 710, 6, 12, 4, 0, 710, 42, 1, 0, 0, 0, 711, 712, 7, 17, 0, 0, 712, 713, 7, 4, 0, 0, 713, 714, 7, 15, 0, 0, 714, 715, 7, 8, 0, 0, 715, 716, 7, 14, 0, 0, 716, 717, 7, 7, 0, 0, 717, 718, 1, 0, 0, 0, 718, 719, 6, 13, 4, 0, 719, 44, 1, 0, 0, 0, 720, 721, 7, 17, 0, 0, 721, 722, 7, 9, 0, 0, 722, 723, 7, 12, 0, 0, 723, 724, 7, 11, 0, 0, 724, 725, 1, 0, 0, 0, 725, 726, 6, 14, 4, 0, 726, 46, 1, 0, 0, 0, 727, 728, 7, 17, 0, 0, 728, 729, 7, 11, 0, 0, 729, 730, 7, 4, 0, 0, 730, 731, 7, 11, 0, 0, 731, 732, 7, 17, 0, 0, 732, 733, 1, 0, 0, 0, 733, 734, 6, 15, 4, 0, 734, 48, 1, 0, 0, 0, 735, 736, 7, 20, 0, 0, 736, 737, 7, 3, 0, 0, 737, 738, 7, 7, 0, 0, 738, 739, 7, 12, 0, 0, 739, 740, 7, 7, 0, 0, 740, 741, 1, 0, 0, 0, 741, 742, 6, 16, 4, 0, 742, 50, 1, 0, 0, 0, 743, 744, 4, 17, 1, 0, 744, 745, 7, 10, 0, 0, 745, 746, 7, 5, 0, 0, 746, 747, 7, 14, 0, 0, 747, 748, 7, 10, 0, 0, 748, 749, 7, 5, 0, 0, 749, 750, 7, 7, 0, 0, 750, 751, 7, 17, 0, 0, 751, 752, 7, 11, 0, 0, 752, 753, 7, 4, 0, 0, 753, 754, 7, 11, 0, 0, 754, 755, 7, 17, 0, 0, 755, 756, 1, 0, 0, 0, 756, 757, 6, 17, 4, 0, 757, 52, 1, 0, 0, 0, 758, 759, 7, 21, 0, 0, 759, 760, 7, 12, 0, 0, 760, 761, 7, 9, 0, 0, 761, 762, 7, 15, 0, 0, 762, 763, 1, 0, 0, 0, 763, 764, 6, 18, 5, 0, 764, 54, 1, 0, 0, 0, 765, 766, 7, 11, 0, 0, 766, 767, 7, 17, 0, 0, 767, 768, 1, 0, 0, 0, 768, 769, 6, 19, 5, 0, 769, 56, 1, 0, 0, 0, 770, 771, 7, 21, 0, 0, 771, 772, 7, 9, 0, 0, 772, 773, 7, 12, 0, 0, 773, 774, 7, 19, 0, 0, 774, 775, 1, 0, 0, 0, 775, 776, 6, 20, 6, 0, 776, 58, 1, 0, 0, 0, 777, 778, 4, 21, 2, 0, 778, 779, 7, 21, 0, 0, 779, 780, 7, 22, 0, 0, 780, 781, 7, 17, 0, 0, 781, 782, 7, 7, 0, 0, 782, 783, 1, 0, 0, 0, 783, 784, 6, 21, 7, 0, 784, 60, 1, 0, 0, 0, 785, 786, 7, 14, 0, 0, 786, 787, 7, 9, 0, 0, 787, 788, 7, 9, 0, 0, 788, 789, 7, 19, 0, 0, 789, 790, 7, 22, 0, 0, 790, 791, 7, 8, 0, 0, 791, 792, 1, 0, 0, 0, 792, 793, 6, 22, 8, 0, 793, 62, 1, 0, 0, 0, 794, 795, 4, 23, 3, 0, 795, 796, 7, 21, 0, 0, 796, 797, 7, 22, 0, 0, 797, 798, 7, 14, 0, 0, 798, 799, 7, 14, 0, 0, 799, 800, 1, 0, 0, 0, 800, 801, 6, 23, 8, 0, 801, 64, 1, 0, 0, 0, 802, 803, 4, 24, 4, 0, 803, 804, 7, 14, 0, 0, 804, 805, 7, 7, 0, 0, 805, 806, 7, 21, 0, 0, 806, 807, 7, 11, 0, 0, 807, 808, 1, 0, 0, 0, 808, 809, 6, 24, 8, 0, 809, 66, 1, 0, 0, 0, 810, 811, 4, 25, 5, 0, 811, 812, 7, 12, 0, 0, 812, 813, 7, 10, 0, 0, 813, 814, 7, 6, 0, 0, 814, 815, 7, 3, 0, 0, 815, 816, 7, 11, 0, 0, 816, 817, 1, 0, 0, 0, 817, 818, 6, 25, 8, 0, 818, 68, 1, 0, 0, 0, 819, 820, 4, 26, 6, 0, 820, 821, 7, 14, 0, 0, 821, 822, 7, 9, 0, 0, 822, 823, 7, 9, 0, 0, 823, 824, 7, 19, 0, 0, 824, 825, 7, 22, 0, 0, 825, 826, 7, 8, 0, 0, 826, 827, 5, 95, 0, 0, 827, 828, 5, 128020, 0, 0, 828, 829, 1, 0, 0, 0, 829, 830, 6, 26, 9, 0, 830, 70, 1, 0, 0, 0, 831, 832, 7, 15, 0, 0, 832, 833, 7, 18, 0, 0, 833, 834, 5, 95, 0, 0, 834, 835, 7, 7, 0, 0, 835, 836, 7, 13, 0, 0, 836, 837, 7, 8, 0, 0, 837, 838, 7, 4, 0, 0, 838, 839, 7, 5, 0, 0, 839, 840, 7, 16, 0, 0, 840, 841, 1, 0, 0, 0, 841, 842, 6, 27, 10, 0, 842, 72, 1, 0, 0, 0, 843, 844, 7, 16, 0, 0, 844, 845, 7, 12, 0, 0, 845, 846, 7, 9, 0, 0, 846, 847, 7, 8, 0, 0, 847, 848, 1, 0, 0, 0, 848, 849, 6, 28, 11, 0, 849, 74, 1, 0, 0, 0, 850, 851, 7, 19, 0, 0, 851, 852, 7, 7, 0, 0, 852, 853, 7, 7, 0, 0, 853, 854, 7, 8, 0, 0, 854, 855, 1, 0, 0, 0, 855, 856, 6, 29, 11, 0, 856, 76, 1, 0, 0, 0, 857, 858, 4, 30, 7, 0, 858, 859, 7, 10, 0, 0, 859, 860, 7, 5, 0, 0, 860, 861, 7, 17, 0, 0, 861, 862, 7, 10, 0, 0, 862, 863, 7, 17, 0, 0, 863, 864, 7, 11, 0, 0, 864, 865, 5, 95, 0, 0, 865, 866, 5, 128020, 0, 0, 866, 867, 1, 0, 0, 0, 867, 868, 6, 30, 11, 0, 868, 78, 1, 0, 0, 0, 869, 870, 7, 12, 0, 0, 870, 871, 7, 7, 0, 0, 871, 872, 7, 5, 0, 0, 872, 873, 7, 4, 0, 0, 873, 874, 7, 15, 0, 0, 874, 875, 7, 7, 0, 0, 875, 876, 1, 0, 0, 0, 876, 877, 6, 31, 12, 0, 877, 80, 1, 0, 0, 0, 878, 879, 7, 17, 0, 0, 879, 880, 7, 7, 0, 0, 880, 881, 7, 11, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 6, 32, 13, 0, 883, 82, 1, 0, 0, 0, 884, 885, 7, 17, 0, 0, 885, 886, 7, 3, 0, 0, 886, 887, 7, 9, 0, 0, 887, 888, 7, 20, 0, 0, 888, 889, 1, 0, 0, 0, 889, 890, 6, 33, 14, 0, 890, 84, 1, 0, 0, 0, 891, 893, 8, 23, 0, 0, 892, 891, 1, 0, 0, 0, 893, 894, 1, 0, 0, 0, 894, 892, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 897, 6, 34, 4, 0, 897, 86, 1, 0, 0, 0, 898, 899, 3, 179, 81, 0, 899, 900, 1, 0, 0, 0, 900, 901, 6, 35, 15, 0, 901, 902, 6, 35, 16, 0, 902, 88, 1, 0, 0, 0, 903, 904, 3, 299, 141, 0, 904, 905, 1, 0, 0, 0, 905, 906, 6, 36, 17, 0, 906, 907, 6, 36, 16, 0, 907, 908, 6, 36, 16, 0, 908, 90, 1, 0, 0, 0, 909, 910, 3, 245, 114, 0, 910, 911, 1, 0, 0, 0, 911, 912, 6, 37, 18, 0, 912, 92, 1, 0, 0, 0, 913, 914, 3, 513, 248, 0, 914, 915, 1, 0, 0, 0, 915, 916, 6, 38, 19, 0, 916, 94, 1, 0, 0, 0, 917, 918, 3, 225, 104, 0, 918, 919, 1, 0, 0, 0, 919, 920, 6, 39, 20, 0, 920, 96, 1, 0, 0, 0, 921, 922, 3, 221, 102, 0, 922, 923, 1, 0, 0, 0, 923, 924, 6, 40, 21, 0, 924, 98, 1, 0, 0, 0, 925, 926, 3, 293, 138, 0, 926, 927, 1, 0, 0, 0, 927, 928, 6, 41, 22, 0, 928, 100, 1, 0, 0, 0, 929, 930, 3, 295, 139, 0, 930, 931, 1, 0, 0, 0, 931, 932, 6, 42, 23, 0, 932, 102, 1, 0, 0, 0, 933, 934, 3, 305, 144, 0, 934, 935, 1, 0, 0, 0, 935, 936, 6, 43, 24, 0, 936, 104, 1, 0, 0, 0, 937, 938, 3, 301, 142, 0, 938, 939, 1, 0, 0, 0, 939, 940, 6, 44, 25, 0, 940, 106, 1, 0, 0, 0, 941, 942, 3, 17, 0, 0, 942, 943, 1, 0, 0, 0, 943, 944, 6, 45, 0, 0, 944, 108, 1, 0, 0, 0, 945, 946, 3, 19, 1, 0, 946, 947, 1, 0, 0, 0, 947, 948, 6, 46, 0, 0, 948, 110, 1, 0, 0, 0, 949, 950, 3, 21, 2, 0, 950, 951, 1, 0, 0, 0, 951, 952, 6, 47, 0, 0, 952, 112, 1, 0, 0, 0, 953, 954, 3, 179, 81, 0, 954, 955, 1, 0, 0, 0, 955, 956, 6, 48, 15, 0, 956, 957, 6, 48, 16, 0, 957, 114, 1, 0, 0, 0, 958, 959, 3, 299, 141, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 49, 17, 0, 961, 962, 6, 49, 16, 0, 962, 963, 6, 49, 16, 0, 963, 116, 1, 0, 0, 0, 964, 965, 3, 245, 114, 0, 965, 966, 1, 0, 0, 0, 966, 967, 6, 50, 18, 0, 967, 968, 6, 50, 26, 0, 968, 118, 1, 0, 0, 0, 969, 970, 3, 255, 119, 0, 970, 971, 1, 0, 0, 0, 971, 972, 6, 51, 27, 0, 972, 973, 6, 51, 26, 0, 973, 120, 1, 0, 0, 0, 974, 975, 8, 24, 0, 0, 975, 122, 1, 0, 0, 0, 976, 978, 3, 121, 52, 0, 977, 976, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 977, 1, 0, 0, 0, 979, 980, 1, 0, 0, 0, 980, 981, 1, 0, 0, 0, 981, 982, 3, 217, 100, 0, 982, 984, 1, 0, 0, 0, 983, 977, 1, 0, 0, 0, 983, 984, 1, 0, 0, 0, 984, 986, 1, 0, 0, 0, 985, 987, 3, 121, 52, 0, 986, 985, 1, 0, 0, 0, 987, 988, 1, 0, 0, 0, 988, 986, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 124, 1, 0, 0, 0, 990, 991, 3, 123, 53, 0, 991, 992, 1, 0, 0, 0, 992, 993, 6, 54, 28, 0, 993, 126, 1, 0, 0, 0, 994, 995, 3, 201, 92, 0, 995, 996, 1, 0, 0, 0, 996, 997, 6, 55, 29, 0, 997, 128, 1, 0, 0, 0, 998, 999, 3, 17, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 1001, 6, 56, 0, 0, 1001, 130, 1, 0, 0, 0, 1002, 1003, 3, 19, 1, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 6, 57, 0, 0, 1005, 132, 1, 0, 0, 0, 1006, 1007, 3, 21, 2, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1009, 6, 58, 0, 0, 1009, 134, 1, 0, 0, 0, 1010, 1011, 3, 179, 81, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 6, 59, 15, 0, 1013, 1014, 6, 59, 16, 0, 1014, 1015, 6, 59, 16, 0, 1015, 136, 1, 0, 0, 0, 1016, 1017, 3, 299, 141, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1019, 6, 60, 17, 0, 1019, 1020, 6, 60, 16, 0, 1020, 1021, 6, 60, 16, 0, 1021, 1022, 6, 60, 16, 0, 1022, 138, 1, 0, 0, 0, 1023, 1024, 3, 293, 138, 0, 1024, 1025, 1, 0, 0, 0, 1025, 1026, 6, 61, 22, 0, 1026, 140, 1, 0, 0, 0, 1027, 1028, 3, 295, 139, 0, 1028, 1029, 1, 0, 0, 0, 1029, 1030, 6, 62, 23, 0, 1030, 142, 1, 0, 0, 0, 1031, 1032, 3, 211, 97, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1034, 6, 63, 30, 0, 1034, 144, 1, 0, 0, 0, 1035, 1036, 3, 221, 102, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1038, 6, 64, 21, 0, 1038, 146, 1, 0, 0, 0, 1039, 1040, 3, 225, 104, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1042, 6, 65, 20, 0, 1042, 148, 1, 0, 0, 0, 1043, 1044, 3, 255, 119, 0, 1044, 1045, 1, 0, 0, 0, 1045, 1046, 6, 66, 27, 0, 1046, 150, 1, 0, 0, 0, 1047, 1048, 3, 483, 233, 0, 1048, 1049, 1, 0, 0, 0, 1049, 1050, 6, 67, 31, 0, 1050, 152, 1, 0, 0, 0, 1051, 1052, 3, 305, 144, 0, 1052, 1053, 1, 0, 0, 0, 1053, 1054, 6, 68, 24, 0, 1054, 154, 1, 0, 0, 0, 1055, 1056, 3, 249, 116, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1058, 6, 69, 32, 0, 1058, 156, 1, 0, 0, 0, 1059, 1060, 3, 289, 136, 0, 1060, 1061, 1, 0, 0, 0, 1061, 1062, 6, 70, 33, 0, 1062, 158, 1, 0, 0, 0, 1063, 1064, 3, 285, 134, 0, 1064, 1065, 1, 0, 0, 0, 1065, 1066, 6, 71, 34, 0, 1066, 160, 1, 0, 0, 0, 1067, 1068, 3, 291, 137, 0, 1068, 1069, 1, 0, 0, 0, 1069, 1070, 6, 72, 35, 0, 1070, 162, 1, 0, 0, 0, 1071, 1072, 3, 17, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1074, 6, 73, 0, 0, 1074, 164, 1, 0, 0, 0, 1075, 1076, 3, 19, 1, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1078, 6, 74, 0, 0, 1078, 166, 1, 0, 0, 0, 1079, 1080, 3, 21, 2, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 6, 75, 0, 0, 1082, 168, 1, 0, 0, 0, 1083, 1084, 3, 297, 140, 0, 1084, 1085, 1, 0, 0, 0, 1085, 1086, 6, 76, 36, 0, 1086, 1087, 6, 76, 37, 0, 1087, 170, 1, 0, 0, 0, 1088, 1089, 3, 179, 81, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 6, 77, 15, 0, 1091, 1092, 6, 77, 16, 0, 1092, 172, 1, 0, 0, 0, 1093, 1094, 3, 21, 2, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1096, 6, 78, 0, 0, 1096, 174, 1, 0, 0, 0, 1097, 1098, 3, 17, 0, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 6, 79, 0, 0, 1100, 176, 1, 0, 0, 0, 1101, 1102, 3, 19, 1, 0, 1102, 1103, 1, 0, 0, 0, 1103, 1104, 6, 80, 0, 0, 1104, 178, 1, 0, 0, 0, 1105, 1106, 5, 124, 0, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1108, 6, 81, 16, 0, 1108, 180, 1, 0, 0, 0, 1109, 1110, 7, 25, 0, 0, 1110, 182, 1, 0, 0, 0, 1111, 1112, 7, 26, 0, 0, 1112, 184, 1, 0, 0, 0, 1113, 1114, 5, 92, 0, 0, 1114, 1115, 7, 27, 0, 0, 1115, 186, 1, 0, 0, 0, 1116, 1117, 8, 28, 0, 0, 1117, 188, 1, 0, 0, 0, 1118, 1120, 7, 7, 0, 0, 1119, 1121, 7, 29, 0, 0, 1120, 1119, 1, 0, 0, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1123, 1, 0, 0, 0, 1122, 1124, 3, 181, 82, 0, 1123, 1122, 1, 0, 0, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1123, 1, 0, 0, 0, 1125, 1126, 1, 0, 0, 0, 1126, 190, 1, 0, 0, 0, 1127, 1128, 5, 64, 0, 0, 1128, 192, 1, 0, 0, 0, 1129, 1130, 5, 96, 0, 0, 1130, 194, 1, 0, 0, 0, 1131, 1135, 8, 30, 0, 0, 1132, 1133, 5, 96, 0, 0, 1133, 1135, 5, 96, 0, 0, 1134, 1131, 1, 0, 0, 0, 1134, 1132, 1, 0, 0, 0, 1135, 196, 1, 0, 0, 0, 1136, 1137, 5, 95, 0, 0, 1137, 198, 1, 0, 0, 0, 1138, 1142, 3, 183, 83, 0, 1139, 1142, 3, 181, 82, 0, 1140, 1142, 3, 197, 90, 0, 1141, 1138, 1, 0, 0, 0, 1141, 1139, 1, 0, 0, 0, 1141, 1140, 1, 0, 0, 0, 1142, 200, 1, 0, 0, 0, 1143, 1148, 5, 34, 0, 0, 1144, 1147, 3, 185, 84, 0, 1145, 1147, 3, 187, 85, 0, 1146, 1144, 1, 0, 0, 0, 1146, 1145, 1, 0, 0, 0, 1147, 1150, 1, 0, 0, 0, 1148, 1146, 1, 0, 0, 0, 1148, 1149, 1, 0, 0, 0, 1149, 1151, 1, 0, 0, 0, 1150, 1148, 1, 0, 0, 0, 1151, 1173, 5, 34, 0, 0, 1152, 1153, 5, 34, 0, 0, 1153, 1154, 5, 34, 0, 0, 1154, 1155, 5, 34, 0, 0, 1155, 1159, 1, 0, 0, 0, 1156, 1158, 8, 0, 0, 0, 1157, 1156, 1, 0, 0, 0, 1158, 1161, 1, 0, 0, 0, 1159, 1160, 1, 0, 0, 0, 1159, 1157, 1, 0, 0, 0, 1160, 1162, 1, 0, 0, 0, 1161, 1159, 1, 0, 0, 0, 1162, 1163, 5, 34, 0, 0, 1163, 1164, 5, 34, 0, 0, 1164, 1165, 5, 34, 0, 0, 1165, 1167, 1, 0, 0, 0, 1166, 1168, 5, 34, 0, 0, 1167, 1166, 1, 0, 0, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1170, 1, 0, 0, 0, 1169, 1171, 5, 34, 0, 0, 1170, 1169, 1, 0, 0, 0, 1170, 1171, 1, 0, 0, 0, 1171, 1173, 1, 0, 0, 0, 1172, 1143, 1, 0, 0, 0, 1172, 1152, 1, 0, 0, 0, 1173, 202, 1, 0, 0, 0, 1174, 1176, 3, 181, 82, 0, 1175, 1174, 1, 0, 0, 0, 1176, 1177, 1, 0, 0, 0, 1177, 1175, 1, 0, 0, 0, 1177, 1178, 1, 0, 0, 0, 1178, 204, 1, 0, 0, 0, 1179, 1181, 3, 181, 82, 0, 1180, 1179, 1, 0, 0, 0, 1181, 1182, 1, 0, 0, 0, 1182, 1180, 1, 0, 0, 0, 1182, 1183, 1, 0, 0, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1188, 3, 225, 104, 0, 1185, 1187, 3, 181, 82, 0, 1186, 1185, 1, 0, 0, 0, 1187, 1190, 1, 0, 0, 0, 1188, 1186, 1, 0, 0, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1222, 1, 0, 0, 0, 1190, 1188, 1, 0, 0, 0, 1191, 1193, 3, 225, 104, 0, 1192, 1194, 3, 181, 82, 0, 1193, 1192, 1, 0, 0, 0, 1194, 1195, 1, 0, 0, 0, 1195, 1193, 1, 0, 0, 0, 1195, 1196, 1, 0, 0, 0, 1196, 1222, 1, 0, 0, 0, 1197, 1199, 3, 181, 82, 0, 1198, 1197, 1, 0, 0, 0, 1199, 1200, 1, 0, 0, 0, 1200, 1198, 1, 0, 0, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1209, 1, 0, 0, 0, 1202, 1206, 3, 225, 104, 0, 1203, 1205, 3, 181, 82, 0, 1204, 1203, 1, 0, 0, 0, 1205, 1208, 1, 0, 0, 0, 1206, 1204, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1210, 1, 0, 0, 0, 1208, 1206, 1, 0, 0, 0, 1209, 1202, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1211, 1, 0, 0, 0, 1211, 1212, 3, 189, 86, 0, 1212, 1222, 1, 0, 0, 0, 1213, 1215, 3, 225, 104, 0, 1214, 1216, 3, 181, 82, 0, 1215, 1214, 1, 0, 0, 0, 1216, 1217, 1, 0, 0, 0, 1217, 1215, 1, 0, 0, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1219, 1, 0, 0, 0, 1219, 1220, 3, 189, 86, 0, 1220, 1222, 1, 0, 0, 0, 1221, 1180, 1, 0, 0, 0, 1221, 1191, 1, 0, 0, 0, 1221, 1198, 1, 0, 0, 0, 1221, 1213, 1, 0, 0, 0, 1222, 206, 1, 0, 0, 0, 1223, 1224, 7, 4, 0, 0, 1224, 1225, 7, 5, 0, 0, 1225, 1226, 7, 16, 0, 0, 1226, 208, 1, 0, 0, 0, 1227, 1228, 7, 4, 0, 0, 1228, 1229, 7, 17, 0, 0, 1229, 1230, 7, 2, 0, 0, 1230, 210, 1, 0, 0, 0, 1231, 1232, 5, 61, 0, 0, 1232, 212, 1, 0, 0, 0, 1233, 1234, 7, 31, 0, 0, 1234, 1235, 7, 32, 0, 0, 1235, 214, 1, 0, 0, 0, 1236, 1237, 5, 58, 0, 0, 1237, 1238, 5, 58, 0, 0, 1238, 216, 1, 0, 0, 0, 1239, 1240, 5, 58, 0, 0, 1240, 218, 1, 0, 0, 0, 1241, 1242, 5, 59, 0, 0, 1242, 220, 1, 0, 0, 0, 1243, 1244, 5, 44, 0, 0, 1244, 222, 1, 0, 0, 0, 1245, 1246, 7, 16, 0, 0, 1246, 1247, 7, 7, 0, 0, 1247, 1248, 7, 17, 0, 0, 1248, 1249, 7, 2, 0, 0, 1249, 224, 1, 0, 0, 0, 1250, 1251, 5, 46, 0, 0, 1251, 226, 1, 0, 0, 0, 1252, 1253, 7, 21, 0, 0, 1253, 1254, 7, 4, 0, 0, 1254, 1255, 7, 14, 0, 0, 1255, 1256, 7, 17, 0, 0, 1256, 1257, 7, 7, 0, 0, 1257, 228, 1, 0, 0, 0, 1258, 1259, 7, 21, 0, 0, 1259, 1260, 7, 10, 0, 0, 1260, 1261, 7, 12, 0, 0, 1261, 1262, 7, 17, 0, 0, 1262, 1263, 7, 11, 0, 0, 1263, 230, 1, 0, 0, 0, 1264, 1265, 7, 10, 0, 0, 1265, 1266, 7, 5, 0, 0, 1266, 232, 1, 0, 0, 0, 1267, 1268, 7, 10, 0, 0, 1268, 1269, 7, 17, 0, 0, 1269, 234, 1, 0, 0, 0, 1270, 1271, 7, 14, 0, 0, 1271, 1272, 7, 4, 0, 0, 1272, 1273, 7, 17, 0, 0, 1273, 1274, 7, 11, 0, 0, 1274, 236, 1, 0, 0, 0, 1275, 1276, 7, 14, 0, 0, 1276, 1277, 7, 10, 0, 0, 1277, 1278, 7, 19, 0, 0, 1278, 1279, 7, 7, 0, 0, 1279, 238, 1, 0, 0, 0, 1280, 1281, 7, 5, 0, 0, 1281, 1282, 7, 9, 0, 0, 1282, 1283, 7, 11, 0, 0, 1283, 240, 1, 0, 0, 0, 1284, 1285, 7, 5, 0, 0, 1285, 1286, 7, 22, 0, 0, 1286, 1287, 7, 14, 0, 0, 1287, 1288, 7, 14, 0, 0, 1288, 242, 1, 0, 0, 0, 1289, 1290, 7, 5, 0, 0, 1290, 1291, 7, 22, 0, 0, 1291, 1292, 7, 14, 0, 0, 1292, 1293, 7, 14, 0, 0, 1293, 1294, 7, 17, 0, 0, 1294, 244, 1, 0, 0, 0, 1295, 1296, 7, 9, 0, 0, 1296, 1297, 7, 5, 0, 0, 1297, 246, 1, 0, 0, 0, 1298, 1299, 7, 9, 0, 0, 1299, 1300, 7, 12, 0, 0, 1300, 248, 1, 0, 0, 0, 1301, 1302, 5, 63, 0, 0, 1302, 250, 1, 0, 0, 0, 1303, 1304, 7, 12, 0, 0, 1304, 1305, 7, 14, 0, 0, 1305, 1306, 7, 10, 0, 0, 1306, 1307, 7, 19, 0, 0, 1307, 1308, 7, 7, 0, 0, 1308, 252, 1, 0, 0, 0, 1309, 1310, 7, 11, 0, 0, 1310, 1311, 7, 12, 0, 0, 1311, 1312, 7, 22, 0, 0, 1312, 1313, 7, 7, 0, 0, 1313, 254, 1, 0, 0, 0, 1314, 1315, 7, 20, 0, 0, 1315, 1316, 7, 10, 0, 0, 1316, 1317, 7, 11, 0, 0, 1317, 1318, 7, 3, 0, 0, 1318, 256, 1, 0, 0, 0, 1319, 1320, 5, 61, 0, 0, 1320, 1321, 5, 61, 0, 0, 1321, 258, 1, 0, 0, 0, 1322, 1323, 5, 61, 0, 0, 1323, 1324, 5, 126, 0, 0, 1324, 260, 1, 0, 0, 0, 1325, 1326, 5, 33, 0, 0, 1326, 1327, 5, 61, 0, 0, 1327, 262, 1, 0, 0, 0, 1328, 1329, 5, 60, 0, 0, 1329, 264, 1, 0, 0, 0, 1330, 1331, 5, 60, 0, 0, 1331, 1332, 5, 61, 0, 0, 1332, 266, 1, 0, 0, 0, 1333, 1334, 5, 62, 0, 0, 1334, 268, 1, 0, 0, 0, 1335, 1336, 5, 62, 0, 0, 1336, 1337, 5, 61, 0, 0, 1337, 270, 1, 0, 0, 0, 1338, 1339, 5, 43, 0, 0, 1339, 272, 1, 0, 0, 0, 1340, 1341, 5, 45, 0, 0, 1341, 274, 1, 0, 0, 0, 1342, 1343, 5, 42, 0, 0, 1343, 276, 1, 0, 0, 0, 1344, 1345, 5, 47, 0, 0, 1345, 278, 1, 0, 0, 0, 1346, 1347, 5, 37, 0, 0, 1347, 280, 1, 0, 0, 0, 1348, 1349, 5, 123, 0, 0, 1349, 282, 1, 0, 0, 0, 1350, 1351, 5, 125, 0, 0, 1351, 284, 1, 0, 0, 0, 1352, 1353, 5, 63, 0, 0, 1353, 1354, 5, 63, 0, 0, 1354, 286, 1, 0, 0, 0, 1355, 1356, 3, 49, 16, 0, 1356, 1357, 1, 0, 0, 0, 1357, 1358, 6, 135, 38, 0, 1358, 288, 1, 0, 0, 0, 1359, 1362, 3, 249, 116, 0, 1360, 1363, 3, 183, 83, 0, 1361, 1363, 3, 197, 90, 0, 1362, 1360, 1, 0, 0, 0, 1362, 1361, 1, 0, 0, 0, 1363, 1367, 1, 0, 0, 0, 1364, 1366, 3, 199, 91, 0, 1365, 1364, 1, 0, 0, 0, 1366, 1369, 1, 0, 0, 0, 1367, 1365, 1, 0, 0, 0, 1367, 1368, 1, 0, 0, 0, 1368, 1377, 1, 0, 0, 0, 1369, 1367, 1, 0, 0, 0, 1370, 1372, 3, 249, 116, 0, 1371, 1373, 3, 181, 82, 0, 1372, 1371, 1, 0, 0, 0, 1373, 1374, 1, 0, 0, 0, 1374, 1372, 1, 0, 0, 0, 1374, 1375, 1, 0, 0, 0, 1375, 1377, 1, 0, 0, 0, 1376, 1359, 1, 0, 0, 0, 1376, 1370, 1, 0, 0, 0, 1377, 290, 1, 0, 0, 0, 1378, 1381, 3, 285, 134, 0, 1379, 1382, 3, 183, 83, 0, 1380, 1382, 3, 197, 90, 0, 1381, 1379, 1, 0, 0, 0, 1381, 1380, 1, 0, 0, 0, 1382, 1386, 1, 0, 0, 0, 1383, 1385, 3, 199, 91, 0, 1384, 1383, 1, 0, 0, 0, 1385, 1388, 1, 0, 0, 0, 1386, 1384, 1, 0, 0, 0, 1386, 1387, 1, 0, 0, 0, 1387, 1396, 1, 0, 0, 0, 1388, 1386, 1, 0, 0, 0, 1389, 1391, 3, 285, 134, 0, 1390, 1392, 3, 181, 82, 0, 1391, 1390, 1, 0, 0, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1391, 1, 0, 0, 0, 1393, 1394, 1, 0, 0, 0, 1394, 1396, 1, 0, 0, 0, 1395, 1378, 1, 0, 0, 0, 1395, 1389, 1, 0, 0, 0, 1396, 292, 1, 0, 0, 0, 1397, 1398, 5, 91, 0, 0, 1398, 1399, 1, 0, 0, 0, 1399, 1400, 6, 138, 4, 0, 1400, 1401, 6, 138, 4, 0, 1401, 294, 1, 0, 0, 0, 1402, 1403, 5, 93, 0, 0, 1403, 1404, 1, 0, 0, 0, 1404, 1405, 6, 139, 16, 0, 1405, 1406, 6, 139, 16, 0, 1406, 296, 1, 0, 0, 0, 1407, 1408, 5, 40, 0, 0, 1408, 1409, 1, 0, 0, 0, 1409, 1410, 6, 140, 4, 0, 1410, 1411, 6, 140, 4, 0, 1411, 298, 1, 0, 0, 0, 1412, 1413, 5, 41, 0, 0, 1413, 1414, 1, 0, 0, 0, 1414, 1415, 6, 141, 16, 0, 1415, 1416, 6, 141, 16, 0, 1416, 300, 1, 0, 0, 0, 1417, 1421, 3, 183, 83, 0, 1418, 1420, 3, 199, 91, 0, 1419, 1418, 1, 0, 0, 0, 1420, 1423, 1, 0, 0, 0, 1421, 1419, 1, 0, 0, 0, 1421, 1422, 1, 0, 0, 0, 1422, 1434, 1, 0, 0, 0, 1423, 1421, 1, 0, 0, 0, 1424, 1427, 3, 197, 90, 0, 1425, 1427, 3, 191, 87, 0, 1426, 1424, 1, 0, 0, 0, 1426, 1425, 1, 0, 0, 0, 1427, 1429, 1, 0, 0, 0, 1428, 1430, 3, 199, 91, 0, 1429, 1428, 1, 0, 0, 0, 1430, 1431, 1, 0, 0, 0, 1431, 1429, 1, 0, 0, 0, 1431, 1432, 1, 0, 0, 0, 1432, 1434, 1, 0, 0, 0, 1433, 1417, 1, 0, 0, 0, 1433, 1426, 1, 0, 0, 0, 1434, 302, 1, 0, 0, 0, 1435, 1437, 3, 193, 88, 0, 1436, 1438, 3, 195, 89, 0, 1437, 1436, 1, 0, 0, 0, 1438, 1439, 1, 0, 0, 0, 1439, 1437, 1, 0, 0, 0, 1439, 1440, 1, 0, 0, 0, 1440, 1441, 1, 0, 0, 0, 1441, 1442, 3, 193, 88, 0, 1442, 304, 1, 0, 0, 0, 1443, 1444, 3, 303, 143, 0, 1444, 306, 1, 0, 0, 0, 1445, 1446, 3, 17, 0, 0, 1446, 1447, 1, 0, 0, 0, 1447, 1448, 6, 145, 0, 0, 1448, 308, 1, 0, 0, 0, 1449, 1450, 3, 19, 1, 0, 1450, 1451, 1, 0, 0, 0, 1451, 1452, 6, 146, 0, 0, 1452, 310, 1, 0, 0, 0, 1453, 1454, 3, 21, 2, 0, 1454, 1455, 1, 0, 0, 0, 1455, 1456, 6, 147, 0, 0, 1456, 312, 1, 0, 0, 0, 1457, 1458, 3, 179, 81, 0, 1458, 1459, 1, 0, 0, 0, 1459, 1460, 6, 148, 15, 0, 1460, 1461, 6, 148, 16, 0, 1461, 314, 1, 0, 0, 0, 1462, 1463, 3, 217, 100, 0, 1463, 1464, 1, 0, 0, 0, 1464, 1465, 6, 149, 39, 0, 1465, 316, 1, 0, 0, 0, 1466, 1467, 3, 215, 99, 0, 1467, 1468, 1, 0, 0, 0, 1468, 1469, 6, 150, 40, 0, 1469, 318, 1, 0, 0, 0, 1470, 1471, 3, 221, 102, 0, 1471, 1472, 1, 0, 0, 0, 1472, 1473, 6, 151, 21, 0, 1473, 320, 1, 0, 0, 0, 1474, 1475, 3, 211, 97, 0, 1475, 1476, 1, 0, 0, 0, 1476, 1477, 6, 152, 30, 0, 1477, 322, 1, 0, 0, 0, 1478, 1479, 7, 15, 0, 0, 1479, 1480, 7, 7, 0, 0, 1480, 1481, 7, 11, 0, 0, 1481, 1482, 7, 4, 0, 0, 1482, 1483, 7, 16, 0, 0, 1483, 1484, 7, 4, 0, 0, 1484, 1485, 7, 11, 0, 0, 1485, 1486, 7, 4, 0, 0, 1486, 324, 1, 0, 0, 0, 1487, 1488, 3, 299, 141, 0, 1488, 1489, 1, 0, 0, 0, 1489, 1490, 6, 154, 17, 0, 1490, 1491, 6, 154, 16, 0, 1491, 326, 1, 0, 0, 0, 1492, 1496, 8, 33, 0, 0, 1493, 1494, 5, 47, 0, 0, 1494, 1496, 8, 34, 0, 0, 1495, 1492, 1, 0, 0, 0, 1495, 1493, 1, 0, 0, 0, 1496, 328, 1, 0, 0, 0, 1497, 1499, 3, 327, 155, 0, 1498, 1497, 1, 0, 0, 0, 1499, 1500, 1, 0, 0, 0, 1500, 1498, 1, 0, 0, 0, 1500, 1501, 1, 0, 0, 0, 1501, 330, 1, 0, 0, 0, 1502, 1503, 3, 329, 156, 0, 1503, 1504, 1, 0, 0, 0, 1504, 1505, 6, 157, 41, 0, 1505, 332, 1, 0, 0, 0, 1506, 1507, 3, 201, 92, 0, 1507, 1508, 1, 0, 0, 0, 1508, 1509, 6, 158, 29, 0, 1509, 334, 1, 0, 0, 0, 1510, 1511, 3, 17, 0, 0, 1511, 1512, 1, 0, 0, 0, 1512, 1513, 6, 159, 0, 0, 1513, 336, 1, 0, 0, 0, 1514, 1515, 3, 19, 1, 0, 1515, 1516, 1, 0, 0, 0, 1516, 1517, 6, 160, 0, 0, 1517, 338, 1, 0, 0, 0, 1518, 1519, 3, 21, 2, 0, 1519, 1520, 1, 0, 0, 0, 1520, 1521, 6, 161, 0, 0, 1521, 340, 1, 0, 0, 0, 1522, 1523, 3, 297, 140, 0, 1523, 1524, 1, 0, 0, 0, 1524, 1525, 6, 162, 36, 0, 1525, 1526, 6, 162, 37, 0, 1526, 342, 1, 0, 0, 0, 1527, 1528, 3, 299, 141, 0, 1528, 1529, 1, 0, 0, 0, 1529, 1530, 6, 163, 17, 0, 1530, 1531, 6, 163, 16, 0, 1531, 1532, 6, 163, 16, 0, 1532, 344, 1, 0, 0, 0, 1533, 1534, 3, 179, 81, 0, 1534, 1535, 1, 0, 0, 0, 1535, 1536, 6, 164, 15, 0, 1536, 1537, 6, 164, 16, 0, 1537, 346, 1, 0, 0, 0, 1538, 1539, 3, 21, 2, 0, 1539, 1540, 1, 0, 0, 0, 1540, 1541, 6, 165, 0, 0, 1541, 348, 1, 0, 0, 0, 1542, 1543, 3, 17, 0, 0, 1543, 1544, 1, 0, 0, 0, 1544, 1545, 6, 166, 0, 0, 1545, 350, 1, 0, 0, 0, 1546, 1547, 3, 19, 1, 0, 1547, 1548, 1, 0, 0, 0, 1548, 1549, 6, 167, 0, 0, 1549, 352, 1, 0, 0, 0, 1550, 1551, 3, 179, 81, 0, 1551, 1552, 1, 0, 0, 0, 1552, 1553, 6, 168, 15, 0, 1553, 1554, 6, 168, 16, 0, 1554, 354, 1, 0, 0, 0, 1555, 1556, 3, 299, 141, 0, 1556, 1557, 1, 0, 0, 0, 1557, 1558, 6, 169, 17, 0, 1558, 1559, 6, 169, 16, 0, 1559, 1560, 6, 169, 16, 0, 1560, 356, 1, 0, 0, 0, 1561, 1562, 3, 255, 119, 0, 1562, 1563, 1, 0, 0, 0, 1563, 1564, 6, 170, 27, 0, 1564, 1565, 6, 170, 16, 0, 1565, 1566, 6, 170, 4, 0, 1566, 358, 1, 0, 0, 0, 1567, 1568, 3, 221, 102, 0, 1568, 1569, 1, 0, 0, 0, 1569, 1570, 6, 171, 21, 0, 1570, 360, 1, 0, 0, 0, 1571, 1572, 3, 305, 144, 0, 1572, 1573, 1, 0, 0, 0, 1573, 1574, 6, 172, 24, 0, 1574, 362, 1, 0, 0, 0, 1575, 1576, 3, 301, 142, 0, 1576, 1577, 1, 0, 0, 0, 1577, 1578, 6, 173, 25, 0, 1578, 364, 1, 0, 0, 0, 1579, 1580, 3, 17, 0, 0, 1580, 1581, 1, 0, 0, 0, 1581, 1582, 6, 174, 0, 0, 1582, 366, 1, 0, 0, 0, 1583, 1584, 3, 19, 1, 0, 1584, 1585, 1, 0, 0, 0, 1585, 1586, 6, 175, 0, 0, 1586, 368, 1, 0, 0, 0, 1587, 1588, 3, 21, 2, 0, 1588, 1589, 1, 0, 0, 0, 1589, 1590, 6, 176, 0, 0, 1590, 370, 1, 0, 0, 0, 1591, 1592, 3, 179, 81, 0, 1592, 1593, 1, 0, 0, 0, 1593, 1594, 6, 177, 15, 0, 1594, 1595, 6, 177, 16, 0, 1595, 372, 1, 0, 0, 0, 1596, 1597, 7, 35, 0, 0, 1597, 1598, 7, 9, 0, 0, 1598, 1599, 7, 10, 0, 0, 1599, 1600, 7, 5, 0, 0, 1600, 374, 1, 0, 0, 0, 1601, 1602, 3, 513, 248, 0, 1602, 1603, 1, 0, 0, 0, 1603, 1604, 6, 179, 19, 0, 1604, 376, 1, 0, 0, 0, 1605, 1606, 3, 245, 114, 0, 1606, 1607, 1, 0, 0, 0, 1607, 1608, 6, 180, 18, 0, 1608, 1609, 6, 180, 16, 0, 1609, 1610, 6, 180, 4, 0, 1610, 378, 1, 0, 0, 0, 1611, 1612, 7, 22, 0, 0, 1612, 1613, 7, 17, 0, 0, 1613, 1614, 7, 10, 0, 0, 1614, 1615, 7, 5, 0, 0, 1615, 1616, 7, 6, 0, 0, 1616, 1617, 1, 0, 0, 0, 1617, 1618, 6, 181, 16, 0, 1618, 1619, 6, 181, 4, 0, 1619, 380, 1, 0, 0, 0, 1620, 1621, 3, 329, 156, 0, 1621, 1622, 1, 0, 0, 0, 1622, 1623, 6, 182, 41, 0, 1623, 382, 1, 0, 0, 0, 1624, 1625, 3, 201, 92, 0, 1625, 1626, 1, 0, 0, 0, 1626, 1627, 6, 183, 29, 0, 1627, 384, 1, 0, 0, 0, 1628, 1629, 3, 217, 100, 0, 1629, 1630, 1, 0, 0, 0, 1630, 1631, 6, 184, 39, 0, 1631, 386, 1, 0, 0, 0, 1632, 1633, 3, 17, 0, 0, 1633, 1634, 1, 0, 0, 0, 1634, 1635, 6, 185, 0, 0, 1635, 388, 1, 0, 0, 0, 1636, 1637, 3, 19, 1, 0, 1637, 1638, 1, 0, 0, 0, 1638, 1639, 6, 186, 0, 0, 1639, 390, 1, 0, 0, 0, 1640, 1641, 3, 21, 2, 0, 1641, 1642, 1, 0, 0, 0, 1642, 1643, 6, 187, 0, 0, 1643, 392, 1, 0, 0, 0, 1644, 1645, 3, 179, 81, 0, 1645, 1646, 1, 0, 0, 0, 1646, 1647, 6, 188, 15, 0, 1647, 1648, 6, 188, 16, 0, 1648, 394, 1, 0, 0, 0, 1649, 1650, 3, 299, 141, 0, 1650, 1651, 1, 0, 0, 0, 1651, 1652, 6, 189, 17, 0, 1652, 1653, 6, 189, 16, 0, 1653, 1654, 6, 189, 16, 0, 1654, 396, 1, 0, 0, 0, 1655, 1656, 3, 217, 100, 0, 1656, 1657, 1, 0, 0, 0, 1657, 1658, 6, 190, 39, 0, 1658, 398, 1, 0, 0, 0, 1659, 1660, 3, 221, 102, 0, 1660, 1661, 1, 0, 0, 0, 1661, 1662, 6, 191, 21, 0, 1662, 400, 1, 0, 0, 0, 1663, 1664, 3, 225, 104, 0, 1664, 1665, 1, 0, 0, 0, 1665, 1666, 6, 192, 20, 0, 1666, 402, 1, 0, 0, 0, 1667, 1668, 3, 245, 114, 0, 1668, 1669, 1, 0, 0, 0, 1669, 1670, 6, 193, 18, 0, 1670, 1671, 6, 193, 42, 0, 1671, 404, 1, 0, 0, 0, 1672, 1673, 3, 329, 156, 0, 1673, 1674, 1, 0, 0, 0, 1674, 1675, 6, 194, 41, 0, 1675, 406, 1, 0, 0, 0, 1676, 1677, 3, 201, 92, 0, 1677, 1678, 1, 0, 0, 0, 1678, 1679, 6, 195, 29, 0, 1679, 408, 1, 0, 0, 0, 1680, 1681, 3, 17, 0, 0, 1681, 1682, 1, 0, 0, 0, 1682, 1683, 6, 196, 0, 0, 1683, 410, 1, 0, 0, 0, 1684, 1685, 3, 19, 1, 0, 1685, 1686, 1, 0, 0, 0, 1686, 1687, 6, 197, 0, 0, 1687, 412, 1, 0, 0, 0, 1688, 1689, 3, 21, 2, 0, 1689, 1690, 1, 0, 0, 0, 1690, 1691, 6, 198, 0, 0, 1691, 414, 1, 0, 0, 0, 1692, 1693, 3, 179, 81, 0, 1693, 1694, 1, 0, 0, 0, 1694, 1695, 6, 199, 15, 0, 1695, 1696, 6, 199, 16, 0, 1696, 1697, 6, 199, 16, 0, 1697, 416, 1, 0, 0, 0, 1698, 1699, 3, 299, 141, 0, 1699, 1700, 1, 0, 0, 0, 1700, 1701, 6, 200, 17, 0, 1701, 1702, 6, 200, 16, 0, 1702, 1703, 6, 200, 16, 0, 1703, 1704, 6, 200, 16, 0, 1704, 418, 1, 0, 0, 0, 1705, 1706, 3, 221, 102, 0, 1706, 1707, 1, 0, 0, 0, 1707, 1708, 6, 201, 21, 0, 1708, 420, 1, 0, 0, 0, 1709, 1710, 3, 225, 104, 0, 1710, 1711, 1, 0, 0, 0, 1711, 1712, 6, 202, 20, 0, 1712, 422, 1, 0, 0, 0, 1713, 1714, 3, 483, 233, 0, 1714, 1715, 1, 0, 0, 0, 1715, 1716, 6, 203, 31, 0, 1716, 424, 1, 0, 0, 0, 1717, 1718, 3, 17, 0, 0, 1718, 1719, 1, 0, 0, 0, 1719, 1720, 6, 204, 0, 0, 1720, 426, 1, 0, 0, 0, 1721, 1722, 3, 19, 1, 0, 1722, 1723, 1, 0, 0, 0, 1723, 1724, 6, 205, 0, 0, 1724, 428, 1, 0, 0, 0, 1725, 1726, 3, 21, 2, 0, 1726, 1727, 1, 0, 0, 0, 1727, 1728, 6, 206, 0, 0, 1728, 430, 1, 0, 0, 0, 1729, 1730, 3, 179, 81, 0, 1730, 1731, 1, 0, 0, 0, 1731, 1732, 6, 207, 15, 0, 1732, 1733, 6, 207, 16, 0, 1733, 432, 1, 0, 0, 0, 1734, 1735, 3, 299, 141, 0, 1735, 1736, 1, 0, 0, 0, 1736, 1737, 6, 208, 17, 0, 1737, 1738, 6, 208, 16, 0, 1738, 1739, 6, 208, 16, 0, 1739, 434, 1, 0, 0, 0, 1740, 1741, 3, 293, 138, 0, 1741, 1742, 1, 0, 0, 0, 1742, 1743, 6, 209, 22, 0, 1743, 436, 1, 0, 0, 0, 1744, 1745, 3, 295, 139, 0, 1745, 1746, 1, 0, 0, 0, 1746, 1747, 6, 210, 23, 0, 1747, 438, 1, 0, 0, 0, 1748, 1749, 3, 225, 104, 0, 1749, 1750, 1, 0, 0, 0, 1750, 1751, 6, 211, 20, 0, 1751, 440, 1, 0, 0, 0, 1752, 1753, 3, 249, 116, 0, 1753, 1754, 1, 0, 0, 0, 1754, 1755, 6, 212, 32, 0, 1755, 442, 1, 0, 0, 0, 1756, 1757, 3, 289, 136, 0, 1757, 1758, 1, 0, 0, 0, 1758, 1759, 6, 213, 33, 0, 1759, 444, 1, 0, 0, 0, 1760, 1761, 3, 285, 134, 0, 1761, 1762, 1, 0, 0, 0, 1762, 1763, 6, 214, 34, 0, 1763, 446, 1, 0, 0, 0, 1764, 1765, 3, 291, 137, 0, 1765, 1766, 1, 0, 0, 0, 1766, 1767, 6, 215, 35, 0, 1767, 448, 1, 0, 0, 0, 1768, 1769, 3, 305, 144, 0, 1769, 1770, 1, 0, 0, 0, 1770, 1771, 6, 216, 24, 0, 1771, 450, 1, 0, 0, 0, 1772, 1773, 3, 301, 142, 0, 1773, 1774, 1, 0, 0, 0, 1774, 1775, 6, 217, 25, 0, 1775, 452, 1, 0, 0, 0, 1776, 1777, 3, 17, 0, 0, 1777, 1778, 1, 0, 0, 0, 1778, 1779, 6, 218, 0, 0, 1779, 454, 1, 0, 0, 0, 1780, 1781, 3, 19, 1, 0, 1781, 1782, 1, 0, 0, 0, 1782, 1783, 6, 219, 0, 0, 1783, 456, 1, 0, 0, 0, 1784, 1785, 3, 21, 2, 0, 1785, 1786, 1, 0, 0, 0, 1786, 1787, 6, 220, 0, 0, 1787, 458, 1, 0, 0, 0, 1788, 1789, 3, 179, 81, 0, 1789, 1790, 1, 0, 0, 0, 1790, 1791, 6, 221, 15, 0, 1791, 1792, 6, 221, 16, 0, 1792, 460, 1, 0, 0, 0, 1793, 1794, 3, 299, 141, 0, 1794, 1795, 1, 0, 0, 0, 1795, 1796, 6, 222, 17, 0, 1796, 1797, 6, 222, 16, 0, 1797, 1798, 6, 222, 16, 0, 1798, 462, 1, 0, 0, 0, 1799, 1800, 3, 225, 104, 0, 1800, 1801, 1, 0, 0, 0, 1801, 1802, 6, 223, 20, 0, 1802, 464, 1, 0, 0, 0, 1803, 1804, 3, 293, 138, 0, 1804, 1805, 1, 0, 0, 0, 1805, 1806, 6, 224, 22, 0, 1806, 466, 1, 0, 0, 0, 1807, 1808, 3, 295, 139, 0, 1808, 1809, 1, 0, 0, 0, 1809, 1810, 6, 225, 23, 0, 1810, 468, 1, 0, 0, 0, 1811, 1812, 3, 221, 102, 0, 1812, 1813, 1, 0, 0, 0, 1813, 1814, 6, 226, 21, 0, 1814, 470, 1, 0, 0, 0, 1815, 1816, 3, 249, 116, 0, 1816, 1817, 1, 0, 0, 0, 1817, 1818, 6, 227, 32, 0, 1818, 472, 1, 0, 0, 0, 1819, 1820, 3, 289, 136, 0, 1820, 1821, 1, 0, 0, 0, 1821, 1822, 6, 228, 33, 0, 1822, 474, 1, 0, 0, 0, 1823, 1824, 3, 285, 134, 0, 1824, 1825, 1, 0, 0, 0, 1825, 1826, 6, 229, 34, 0, 1826, 476, 1, 0, 0, 0, 1827, 1828, 3, 291, 137, 0, 1828, 1829, 1, 0, 0, 0, 1829, 1830, 6, 230, 35, 0, 1830, 478, 1, 0, 0, 0, 1831, 1836, 3, 183, 83, 0, 1832, 1836, 3, 181, 82, 0, 1833, 1836, 3, 197, 90, 0, 1834, 1836, 3, 275, 129, 0, 1835, 1831, 1, 0, 0, 0, 1835, 1832, 1, 0, 0, 0, 1835, 1833, 1, 0, 0, 0, 1835, 1834, 1, 0, 0, 0, 1836, 480, 1, 0, 0, 0, 1837, 1840, 3, 183, 83, 0, 1838, 1840, 3, 275, 129, 0, 1839, 1837, 1, 0, 0, 0, 1839, 1838, 1, 0, 0, 0, 1840, 1844, 1, 0, 0, 0, 1841, 1843, 3, 479, 231, 0, 1842, 1841, 1, 0, 0, 0, 1843, 1846, 1, 0, 0, 0, 1844, 1842, 1, 0, 0, 0, 1844, 1845, 1, 0, 0, 0, 1845, 1857, 1, 0, 0, 0, 1846, 1844, 1, 0, 0, 0, 1847, 1850, 3, 197, 90, 0, 1848, 1850, 3, 191, 87, 0, 1849, 1847, 1, 0, 0, 0, 1849, 1848, 1, 0, 0, 0, 1850, 1852, 1, 0, 0, 0, 1851, 1853, 3, 479, 231, 0, 1852, 1851, 1, 0, 0, 0, 1853, 1854, 1, 0, 0, 0, 1854, 1852, 1, 0, 0, 0, 1854, 1855, 1, 0, 0, 0, 1855, 1857, 1, 0, 0, 0, 1856, 1839, 1, 0, 0, 0, 1856, 1849, 1, 0, 0, 0, 1857, 482, 1, 0, 0, 0, 1858, 1861, 3, 481, 232, 0, 1859, 1861, 3, 303, 143, 0, 1860, 1858, 1, 0, 0, 0, 1860, 1859, 1, 0, 0, 0, 1861, 1862, 1, 0, 0, 0, 1862, 1860, 1, 0, 0, 0, 1862, 1863, 1, 0, 0, 0, 1863, 484, 1, 0, 0, 0, 1864, 1865, 3, 17, 0, 0, 1865, 1866, 1, 0, 0, 0, 1866, 1867, 6, 234, 0, 0, 1867, 486, 1, 0, 0, 0, 1868, 1869, 3, 19, 1, 0, 1869, 1870, 1, 0, 0, 0, 1870, 1871, 6, 235, 0, 0, 1871, 488, 1, 0, 0, 0, 1872, 1873, 3, 21, 2, 0, 1873, 1874, 1, 0, 0, 0, 1874, 1875, 6, 236, 0, 0, 1875, 490, 1, 0, 0, 0, 1876, 1877, 3, 179, 81, 0, 1877, 1878, 1, 0, 0, 0, 1878, 1879, 6, 237, 15, 0, 1879, 1880, 6, 237, 16, 0, 1880, 492, 1, 0, 0, 0, 1881, 1882, 3, 299, 141, 0, 1882, 1883, 1, 0, 0, 0, 1883, 1884, 6, 238, 17, 0, 1884, 1885, 6, 238, 16, 0, 1885, 1886, 6, 238, 16, 0, 1886, 494, 1, 0, 0, 0, 1887, 1888, 3, 293, 138, 0, 1888, 1889, 1, 0, 0, 0, 1889, 1890, 6, 239, 22, 0, 1890, 496, 1, 0, 0, 0, 1891, 1892, 3, 295, 139, 0, 1892, 1893, 1, 0, 0, 0, 1893, 1894, 6, 240, 23, 0, 1894, 498, 1, 0, 0, 0, 1895, 1896, 3, 211, 97, 0, 1896, 1897, 1, 0, 0, 0, 1897, 1898, 6, 241, 30, 0, 1898, 500, 1, 0, 0, 0, 1899, 1900, 3, 221, 102, 0, 1900, 1901, 1, 0, 0, 0, 1901, 1902, 6, 242, 21, 0, 1902, 502, 1, 0, 0, 0, 1903, 1904, 3, 225, 104, 0, 1904, 1905, 1, 0, 0, 0, 1905, 1906, 6, 243, 20, 0, 1906, 504, 1, 0, 0, 0, 1907, 1908, 3, 249, 116, 0, 1908, 1909, 1, 0, 0, 0, 1909, 1910, 6, 244, 32, 0, 1910, 506, 1, 0, 0, 0, 1911, 1912, 3, 289, 136, 0, 1912, 1913, 1, 0, 0, 0, 1913, 1914, 6, 245, 33, 0, 1914, 508, 1, 0, 0, 0, 1915, 1916, 3, 285, 134, 0, 1916, 1917, 1, 0, 0, 0, 1917, 1918, 6, 246, 34, 0, 1918, 510, 1, 0, 0, 0, 1919, 1920, 3, 291, 137, 0, 1920, 1921, 1, 0, 0, 0, 1921, 1922, 6, 247, 35, 0, 1922, 512, 1, 0, 0, 0, 1923, 1924, 7, 4, 0, 0, 1924, 1925, 7, 17, 0, 0, 1925, 514, 1, 0, 0, 0, 1926, 1927, 3, 483, 233, 0, 1927, 1928, 1, 0, 0, 0, 1928, 1929, 6, 249, 31, 0, 1929, 516, 1, 0, 0, 0, 1930, 1931, 3, 17, 0, 0, 1931, 1932, 1, 0, 0, 0, 1932, 1933, 6, 250, 0, 0, 1933, 518, 1, 0, 0, 0, 1934, 1935, 3, 19, 1, 0, 1935, 1936, 1, 0, 0, 0, 1936, 1937, 6, 251, 0, 0, 1937, 520, 1, 0, 0, 0, 1938, 1939, 3, 21, 2, 0, 1939, 1940, 1, 0, 0, 0, 1940, 1941, 6, 252, 0, 0, 1941, 522, 1, 0, 0, 0, 1942, 1943, 3, 253, 118, 0, 1943, 1944, 1, 0, 0, 0, 1944, 1945, 6, 253, 43, 0, 1945, 524, 1, 0, 0, 0, 1946, 1947, 3, 227, 105, 0, 1947, 1948, 1, 0, 0, 0, 1948, 1949, 6, 254, 44, 0, 1949, 526, 1, 0, 0, 0, 1950, 1951, 3, 241, 112, 0, 1951, 1952, 1, 0, 0, 0, 1952, 1953, 6, 255, 45, 0, 1953, 528, 1, 0, 0, 0, 1954, 1955, 3, 219, 101, 0, 1955, 1956, 1, 0, 0, 0, 1956, 1957, 6, 256, 46, 0, 1957, 1958, 6, 256, 16, 0, 1958, 530, 1, 0, 0, 0, 1959, 1960, 3, 211, 97, 0, 1960, 1961, 1, 0, 0, 0, 1961, 1962, 6, 257, 30, 0, 1962, 532, 1, 0, 0, 0, 1963, 1964, 3, 201, 92, 0, 1964, 1965, 1, 0, 0, 0, 1965, 1966, 6, 258, 29, 0, 1966, 534, 1, 0, 0, 0, 1967, 1968, 3, 301, 142, 0, 1968, 1969, 1, 0, 0, 0, 1969, 1970, 6, 259, 25, 0, 1970, 536, 1, 0, 0, 0, 1971, 1972, 3, 305, 144, 0, 1972, 1973, 1, 0, 0, 0, 1973, 1974, 6, 260, 24, 0, 1974, 538, 1, 0, 0, 0, 1975, 1976, 3, 205, 94, 0, 1976, 1977, 1, 0, 0, 0, 1977, 1978, 6, 261, 47, 0, 1978, 540, 1, 0, 0, 0, 1979, 1980, 3, 203, 93, 0, 1980, 1981, 1, 0, 0, 0, 1981, 1982, 6, 262, 48, 0, 1982, 542, 1, 0, 0, 0, 1983, 1984, 3, 221, 102, 0, 1984, 1985, 1, 0, 0, 0, 1985, 1986, 6, 263, 21, 0, 1986, 544, 1, 0, 0, 0, 1987, 1988, 3, 225, 104, 0, 1988, 1989, 1, 0, 0, 0, 1989, 1990, 6, 264, 20, 0, 1990, 546, 1, 0, 0, 0, 1991, 1992, 3, 249, 116, 0, 1992, 1993, 1, 0, 0, 0, 1993, 1994, 6, 265, 32, 0, 1994, 548, 1, 0, 0, 0, 1995, 1996, 3, 289, 136, 0, 1996, 1997, 1, 0, 0, 0, 1997, 1998, 6, 266, 33, 0, 1998, 550, 1, 0, 0, 0, 1999, 2000, 3, 285, 134, 0, 2000, 2001, 1, 0, 0, 0, 2001, 2002, 6, 267, 34, 0, 2002, 552, 1, 0, 0, 0, 2003, 2004, 3, 291, 137, 0, 2004, 2005, 1, 0, 0, 0, 2005, 2006, 6, 268, 35, 0, 2006, 554, 1, 0, 0, 0, 2007, 2008, 3, 293, 138, 0, 2008, 2009, 1, 0, 0, 0, 2009, 2010, 6, 269, 22, 0, 2010, 556, 1, 0, 0, 0, 2011, 2012, 3, 295, 139, 0, 2012, 2013, 1, 0, 0, 0, 2013, 2014, 6, 270, 23, 0, 2014, 558, 1, 0, 0, 0, 2015, 2016, 3, 483, 233, 0, 2016, 2017, 1, 0, 0, 0, 2017, 2018, 6, 271, 31, 0, 2018, 560, 1, 0, 0, 0, 2019, 2020, 3, 17, 0, 0, 2020, 2021, 1, 0, 0, 0, 2021, 2022, 6, 272, 0, 0, 2022, 562, 1, 0, 0, 0, 2023, 2024, 3, 19, 1, 0, 2024, 2025, 1, 0, 0, 0, 2025, 2026, 6, 273, 0, 0, 2026, 564, 1, 0, 0, 0, 2027, 2028, 3, 21, 2, 0, 2028, 2029, 1, 0, 0, 0, 2029, 2030, 6, 274, 0, 0, 2030, 566, 1, 0, 0, 0, 2031, 2032, 3, 179, 81, 0, 2032, 2033, 1, 0, 0, 0, 2033, 2034, 6, 275, 15, 0, 2034, 2035, 6, 275, 16, 0, 2035, 568, 1, 0, 0, 0, 2036, 2037, 7, 10, 0, 0, 2037, 2038, 7, 5, 0, 0, 2038, 2039, 7, 21, 0, 0, 2039, 2040, 7, 9, 0, 0, 2040, 570, 1, 0, 0, 0, 2041, 2042, 3, 17, 0, 0, 2042, 2043, 1, 0, 0, 0, 2043, 2044, 6, 277, 0, 0, 2044, 572, 1, 0, 0, 0, 2045, 2046, 3, 19, 1, 0, 2046, 2047, 1, 0, 0, 0, 2047, 2048, 6, 278, 0, 0, 2048, 574, 1, 0, 0, 0, 2049, 2050, 3, 21, 2, 0, 2050, 2051, 1, 0, 0, 0, 2051, 2052, 6, 279, 0, 0, 2052, 576, 1, 0, 0, 0, 69, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 583, 587, 590, 599, 601, 612, 894, 979, 983, 988, 1120, 1125, 1134, 1141, 1146, 1148, 1159, 1167, 1170, 1172, 1177, 1182, 1188, 1195, 1200, 1206, 1209, 1217, 1221, 1362, 1367, 1374, 1376, 1381, 1386, 1393, 1395, 1421, 1426, 1431, 1433, 1439, 1495, 1500, 1835, 1839, 1844, 1849, 1854, 1856, 1860, 1862, 49, 0, 1, 0, 5, 1, 0, 5, 2, 0, 5, 4, 0, 5, 5, 0, 5, 6, 0, 5, 7, 0, 5, 8, 0, 5, 9, 0, 5, 10, 0, 5, 12, 0, 5, 13, 0, 5, 14, 0, 5, 15, 0, 5, 16, 0, 7, 49, 0, 4, 0, 0, 7, 98, 0, 7, 72, 0, 7, 133, 0, 7, 62, 0, 7, 60, 0, 7, 95, 0, 7, 96, 0, 7, 100, 0, 7, 99, 0, 5, 3, 0, 7, 77, 0, 7, 39, 0, 7, 50, 0, 7, 55, 0, 7, 129, 0, 7, 74, 0, 7, 93, 0, 7, 92, 0, 7, 94, 0, 7, 97, 0, 5, 0, 0, 7, 17, 0, 7, 58, 0, 7, 57, 0, 7, 105, 0, 5, 11, 0, 7, 76, 0, 7, 63, 0, 7, 70, 0, 7, 59, 0, 7, 52, 0, 7, 51, 0] \ No newline at end of file +[4, 0, 148, 2095, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 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, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 593, 8, 0, 10, 0, 12, 0, 596, 9, 0, 1, 0, 3, 0, 599, 8, 0, 1, 0, 3, 0, 602, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 611, 8, 1, 10, 1, 12, 1, 614, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 622, 8, 2, 11, 2, 12, 2, 623, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 4, 35, 914, 8, 35, 11, 35, 12, 35, 915, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 4, 54, 999, 8, 54, 11, 54, 12, 54, 1000, 1, 54, 1, 54, 3, 54, 1005, 8, 54, 1, 54, 4, 54, 1008, 8, 54, 11, 54, 12, 54, 1009, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 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, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 3, 87, 1142, 8, 87, 1, 87, 4, 87, 1145, 8, 87, 11, 87, 12, 87, 1146, 1, 88, 1, 88, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 3, 90, 1156, 8, 90, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 3, 92, 1163, 8, 92, 1, 93, 1, 93, 1, 93, 5, 93, 1168, 8, 93, 10, 93, 12, 93, 1171, 9, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 5, 93, 1179, 8, 93, 10, 93, 12, 93, 1182, 9, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 3, 93, 1189, 8, 93, 1, 93, 3, 93, 1192, 8, 93, 3, 93, 1194, 8, 93, 1, 94, 4, 94, 1197, 8, 94, 11, 94, 12, 94, 1198, 1, 95, 4, 95, 1202, 8, 95, 11, 95, 12, 95, 1203, 1, 95, 1, 95, 5, 95, 1208, 8, 95, 10, 95, 12, 95, 1211, 9, 95, 1, 95, 1, 95, 4, 95, 1215, 8, 95, 11, 95, 12, 95, 1216, 1, 95, 4, 95, 1220, 8, 95, 11, 95, 12, 95, 1221, 1, 95, 1, 95, 5, 95, 1226, 8, 95, 10, 95, 12, 95, 1229, 9, 95, 3, 95, 1231, 8, 95, 1, 95, 1, 95, 1, 95, 1, 95, 4, 95, 1237, 8, 95, 11, 95, 12, 95, 1238, 1, 95, 1, 95, 3, 95, 1243, 8, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 129, 1, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 3, 137, 1384, 8, 137, 1, 137, 5, 137, 1387, 8, 137, 10, 137, 12, 137, 1390, 9, 137, 1, 137, 1, 137, 4, 137, 1394, 8, 137, 11, 137, 12, 137, 1395, 3, 137, 1398, 8, 137, 1, 138, 1, 138, 1, 138, 3, 138, 1403, 8, 138, 1, 138, 5, 138, 1406, 8, 138, 10, 138, 12, 138, 1409, 9, 138, 1, 138, 1, 138, 4, 138, 1413, 8, 138, 11, 138, 12, 138, 1414, 3, 138, 1417, 8, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 5, 143, 1441, 8, 143, 10, 143, 12, 143, 1444, 9, 143, 1, 143, 1, 143, 3, 143, 1448, 8, 143, 1, 143, 4, 143, 1451, 8, 143, 11, 143, 12, 143, 1452, 3, 143, 1455, 8, 143, 1, 144, 1, 144, 4, 144, 1459, 8, 144, 11, 144, 12, 144, 1460, 1, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 3, 156, 1517, 8, 156, 1, 157, 4, 157, 1520, 8, 157, 11, 157, 12, 157, 1521, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 206, 1, 206, 1, 207, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 208, 1, 208, 1, 209, 1, 209, 1, 209, 1, 209, 1, 210, 1, 210, 1, 210, 1, 210, 1, 211, 1, 211, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 232, 1, 233, 1, 233, 1, 233, 1, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 3, 236, 1878, 8, 236, 1, 237, 1, 237, 3, 237, 1882, 8, 237, 1, 237, 5, 237, 1885, 8, 237, 10, 237, 12, 237, 1888, 9, 237, 1, 237, 1, 237, 3, 237, 1892, 8, 237, 1, 237, 4, 237, 1895, 8, 237, 11, 237, 12, 237, 1896, 3, 237, 1899, 8, 237, 1, 238, 1, 238, 4, 238, 1903, 8, 238, 11, 238, 12, 238, 1904, 1, 239, 1, 239, 1, 239, 1, 239, 1, 240, 1, 240, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 259, 1, 259, 1, 259, 1, 259, 1, 260, 1, 260, 1, 260, 1, 260, 1, 261, 1, 261, 1, 261, 1, 261, 1, 261, 1, 262, 1, 262, 1, 262, 1, 262, 1, 263, 1, 263, 1, 263, 1, 263, 1, 264, 1, 264, 1, 264, 1, 264, 1, 265, 1, 265, 1, 265, 1, 265, 1, 266, 1, 266, 1, 266, 1, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 1, 272, 1, 272, 1, 272, 1, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 274, 1, 274, 1, 274, 1, 274, 1, 275, 1, 275, 1, 275, 1, 275, 1, 276, 1, 276, 1, 276, 1, 276, 1, 277, 1, 277, 1, 277, 1, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 279, 1, 279, 1, 279, 1, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 282, 1, 282, 1, 282, 1, 282, 1, 283, 1, 283, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, 2, 612, 1180, 0, 285, 18, 1, 20, 2, 22, 3, 24, 4, 26, 5, 28, 6, 30, 7, 32, 8, 34, 9, 36, 10, 38, 11, 40, 12, 42, 13, 44, 14, 46, 15, 48, 16, 50, 17, 52, 18, 54, 19, 56, 20, 58, 21, 60, 22, 62, 23, 64, 24, 66, 25, 68, 26, 70, 27, 72, 28, 74, 29, 76, 30, 78, 31, 80, 32, 82, 33, 84, 34, 86, 35, 88, 36, 90, 0, 92, 0, 94, 0, 96, 0, 98, 0, 100, 0, 102, 0, 104, 0, 106, 0, 108, 0, 110, 37, 112, 38, 114, 39, 116, 0, 118, 0, 120, 0, 122, 0, 124, 0, 126, 40, 128, 0, 130, 0, 132, 41, 134, 42, 136, 43, 138, 0, 140, 0, 142, 0, 144, 0, 146, 0, 148, 0, 150, 0, 152, 0, 154, 0, 156, 0, 158, 0, 160, 0, 162, 0, 164, 0, 166, 44, 168, 45, 170, 46, 172, 0, 174, 0, 176, 47, 178, 48, 180, 49, 182, 50, 184, 0, 186, 0, 188, 0, 190, 0, 192, 0, 194, 0, 196, 0, 198, 0, 200, 0, 202, 0, 204, 51, 206, 52, 208, 53, 210, 54, 212, 55, 214, 56, 216, 57, 218, 58, 220, 59, 222, 60, 224, 61, 226, 62, 228, 63, 230, 64, 232, 65, 234, 66, 236, 67, 238, 68, 240, 69, 242, 70, 244, 71, 246, 72, 248, 73, 250, 74, 252, 75, 254, 76, 256, 77, 258, 78, 260, 79, 262, 80, 264, 81, 266, 82, 268, 83, 270, 84, 272, 85, 274, 86, 276, 87, 278, 88, 280, 89, 282, 90, 284, 91, 286, 92, 288, 93, 290, 0, 292, 94, 294, 95, 296, 96, 298, 97, 300, 98, 302, 99, 304, 100, 306, 0, 308, 101, 310, 102, 312, 103, 314, 104, 316, 0, 318, 0, 320, 0, 322, 0, 324, 0, 326, 105, 328, 0, 330, 0, 332, 106, 334, 0, 336, 0, 338, 107, 340, 108, 342, 109, 344, 0, 346, 0, 348, 0, 350, 110, 352, 111, 354, 112, 356, 0, 358, 0, 360, 0, 362, 0, 364, 0, 366, 0, 368, 113, 370, 114, 372, 115, 374, 116, 376, 117, 378, 118, 380, 119, 382, 0, 384, 120, 386, 0, 388, 0, 390, 121, 392, 0, 394, 0, 396, 0, 398, 122, 400, 123, 402, 124, 404, 0, 406, 0, 408, 0, 410, 0, 412, 0, 414, 0, 416, 0, 418, 0, 420, 125, 422, 126, 424, 127, 426, 0, 428, 0, 430, 0, 432, 0, 434, 0, 436, 128, 438, 129, 440, 130, 442, 0, 444, 0, 446, 0, 448, 0, 450, 0, 452, 0, 454, 0, 456, 0, 458, 0, 460, 0, 462, 0, 464, 131, 466, 132, 468, 133, 470, 0, 472, 0, 474, 0, 476, 0, 478, 0, 480, 0, 482, 0, 484, 0, 486, 0, 488, 0, 490, 0, 492, 0, 494, 134, 496, 135, 498, 136, 500, 137, 502, 0, 504, 0, 506, 0, 508, 0, 510, 0, 512, 0, 514, 0, 516, 0, 518, 0, 520, 0, 522, 0, 524, 138, 526, 0, 528, 139, 530, 140, 532, 141, 534, 0, 536, 0, 538, 0, 540, 0, 542, 0, 544, 0, 546, 0, 548, 0, 550, 0, 552, 0, 554, 0, 556, 0, 558, 0, 560, 0, 562, 0, 564, 0, 566, 0, 568, 0, 570, 0, 572, 142, 574, 143, 576, 144, 578, 0, 580, 145, 582, 146, 584, 147, 586, 148, 18, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 36, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 2, 0, 67, 67, 99, 99, 2, 0, 72, 72, 104, 104, 2, 0, 65, 65, 97, 97, 2, 0, 78, 78, 110, 110, 2, 0, 71, 71, 103, 103, 2, 0, 69, 69, 101, 101, 2, 0, 80, 80, 112, 112, 2, 0, 79, 79, 111, 111, 2, 0, 73, 73, 105, 105, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 88, 88, 120, 120, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 68, 68, 100, 100, 2, 0, 83, 83, 115, 115, 2, 0, 86, 86, 118, 118, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 70, 70, 102, 102, 2, 0, 85, 85, 117, 117, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 12, 0, 9, 10, 13, 13, 32, 32, 34, 35, 40, 41, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 12, 0, 9, 10, 13, 13, 32, 32, 34, 34, 40, 41, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 2, 0, 74, 74, 106, 106, 2119, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 1, 90, 1, 0, 0, 0, 1, 92, 1, 0, 0, 0, 1, 94, 1, 0, 0, 0, 1, 96, 1, 0, 0, 0, 1, 98, 1, 0, 0, 0, 1, 100, 1, 0, 0, 0, 1, 102, 1, 0, 0, 0, 1, 104, 1, 0, 0, 0, 1, 106, 1, 0, 0, 0, 1, 108, 1, 0, 0, 0, 1, 110, 1, 0, 0, 0, 1, 112, 1, 0, 0, 0, 1, 114, 1, 0, 0, 0, 2, 116, 1, 0, 0, 0, 2, 118, 1, 0, 0, 0, 2, 120, 1, 0, 0, 0, 2, 122, 1, 0, 0, 0, 2, 126, 1, 0, 0, 0, 2, 128, 1, 0, 0, 0, 2, 130, 1, 0, 0, 0, 2, 132, 1, 0, 0, 0, 2, 134, 1, 0, 0, 0, 2, 136, 1, 0, 0, 0, 3, 138, 1, 0, 0, 0, 3, 140, 1, 0, 0, 0, 3, 142, 1, 0, 0, 0, 3, 144, 1, 0, 0, 0, 3, 146, 1, 0, 0, 0, 3, 148, 1, 0, 0, 0, 3, 150, 1, 0, 0, 0, 3, 152, 1, 0, 0, 0, 3, 154, 1, 0, 0, 0, 3, 156, 1, 0, 0, 0, 3, 158, 1, 0, 0, 0, 3, 160, 1, 0, 0, 0, 3, 162, 1, 0, 0, 0, 3, 164, 1, 0, 0, 0, 3, 166, 1, 0, 0, 0, 3, 168, 1, 0, 0, 0, 3, 170, 1, 0, 0, 0, 4, 172, 1, 0, 0, 0, 4, 174, 1, 0, 0, 0, 4, 176, 1, 0, 0, 0, 4, 178, 1, 0, 0, 0, 4, 180, 1, 0, 0, 0, 5, 182, 1, 0, 0, 0, 5, 204, 1, 0, 0, 0, 5, 206, 1, 0, 0, 0, 5, 208, 1, 0, 0, 0, 5, 210, 1, 0, 0, 0, 5, 212, 1, 0, 0, 0, 5, 214, 1, 0, 0, 0, 5, 216, 1, 0, 0, 0, 5, 218, 1, 0, 0, 0, 5, 220, 1, 0, 0, 0, 5, 222, 1, 0, 0, 0, 5, 224, 1, 0, 0, 0, 5, 226, 1, 0, 0, 0, 5, 228, 1, 0, 0, 0, 5, 230, 1, 0, 0, 0, 5, 232, 1, 0, 0, 0, 5, 234, 1, 0, 0, 0, 5, 236, 1, 0, 0, 0, 5, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 5, 250, 1, 0, 0, 0, 5, 252, 1, 0, 0, 0, 5, 254, 1, 0, 0, 0, 5, 256, 1, 0, 0, 0, 5, 258, 1, 0, 0, 0, 5, 260, 1, 0, 0, 0, 5, 262, 1, 0, 0, 0, 5, 264, 1, 0, 0, 0, 5, 266, 1, 0, 0, 0, 5, 268, 1, 0, 0, 0, 5, 270, 1, 0, 0, 0, 5, 272, 1, 0, 0, 0, 5, 274, 1, 0, 0, 0, 5, 276, 1, 0, 0, 0, 5, 278, 1, 0, 0, 0, 5, 280, 1, 0, 0, 0, 5, 282, 1, 0, 0, 0, 5, 284, 1, 0, 0, 0, 5, 286, 1, 0, 0, 0, 5, 288, 1, 0, 0, 0, 5, 290, 1, 0, 0, 0, 5, 292, 1, 0, 0, 0, 5, 294, 1, 0, 0, 0, 5, 296, 1, 0, 0, 0, 5, 298, 1, 0, 0, 0, 5, 300, 1, 0, 0, 0, 5, 302, 1, 0, 0, 0, 5, 304, 1, 0, 0, 0, 5, 308, 1, 0, 0, 0, 5, 310, 1, 0, 0, 0, 5, 312, 1, 0, 0, 0, 5, 314, 1, 0, 0, 0, 6, 316, 1, 0, 0, 0, 6, 318, 1, 0, 0, 0, 6, 320, 1, 0, 0, 0, 6, 322, 1, 0, 0, 0, 6, 324, 1, 0, 0, 0, 6, 326, 1, 0, 0, 0, 6, 328, 1, 0, 0, 0, 6, 332, 1, 0, 0, 0, 6, 334, 1, 0, 0, 0, 6, 336, 1, 0, 0, 0, 6, 338, 1, 0, 0, 0, 6, 340, 1, 0, 0, 0, 6, 342, 1, 0, 0, 0, 7, 344, 1, 0, 0, 0, 7, 346, 1, 0, 0, 0, 7, 348, 1, 0, 0, 0, 7, 350, 1, 0, 0, 0, 7, 352, 1, 0, 0, 0, 7, 354, 1, 0, 0, 0, 8, 356, 1, 0, 0, 0, 8, 358, 1, 0, 0, 0, 8, 360, 1, 0, 0, 0, 8, 362, 1, 0, 0, 0, 8, 364, 1, 0, 0, 0, 8, 366, 1, 0, 0, 0, 8, 368, 1, 0, 0, 0, 8, 370, 1, 0, 0, 0, 8, 372, 1, 0, 0, 0, 9, 374, 1, 0, 0, 0, 9, 376, 1, 0, 0, 0, 9, 378, 1, 0, 0, 0, 9, 380, 1, 0, 0, 0, 10, 382, 1, 0, 0, 0, 10, 384, 1, 0, 0, 0, 10, 386, 1, 0, 0, 0, 10, 388, 1, 0, 0, 0, 10, 390, 1, 0, 0, 0, 10, 392, 1, 0, 0, 0, 10, 394, 1, 0, 0, 0, 10, 396, 1, 0, 0, 0, 10, 398, 1, 0, 0, 0, 10, 400, 1, 0, 0, 0, 10, 402, 1, 0, 0, 0, 11, 404, 1, 0, 0, 0, 11, 406, 1, 0, 0, 0, 11, 408, 1, 0, 0, 0, 11, 410, 1, 0, 0, 0, 11, 412, 1, 0, 0, 0, 11, 414, 1, 0, 0, 0, 11, 416, 1, 0, 0, 0, 11, 418, 1, 0, 0, 0, 11, 420, 1, 0, 0, 0, 11, 422, 1, 0, 0, 0, 11, 424, 1, 0, 0, 0, 12, 426, 1, 0, 0, 0, 12, 428, 1, 0, 0, 0, 12, 430, 1, 0, 0, 0, 12, 432, 1, 0, 0, 0, 12, 434, 1, 0, 0, 0, 12, 436, 1, 0, 0, 0, 12, 438, 1, 0, 0, 0, 12, 440, 1, 0, 0, 0, 13, 442, 1, 0, 0, 0, 13, 444, 1, 0, 0, 0, 13, 446, 1, 0, 0, 0, 13, 448, 1, 0, 0, 0, 13, 450, 1, 0, 0, 0, 13, 452, 1, 0, 0, 0, 13, 454, 1, 0, 0, 0, 13, 456, 1, 0, 0, 0, 13, 458, 1, 0, 0, 0, 13, 460, 1, 0, 0, 0, 13, 462, 1, 0, 0, 0, 13, 464, 1, 0, 0, 0, 13, 466, 1, 0, 0, 0, 13, 468, 1, 0, 0, 0, 14, 470, 1, 0, 0, 0, 14, 472, 1, 0, 0, 0, 14, 474, 1, 0, 0, 0, 14, 476, 1, 0, 0, 0, 14, 478, 1, 0, 0, 0, 14, 480, 1, 0, 0, 0, 14, 482, 1, 0, 0, 0, 14, 484, 1, 0, 0, 0, 14, 486, 1, 0, 0, 0, 14, 488, 1, 0, 0, 0, 14, 494, 1, 0, 0, 0, 14, 496, 1, 0, 0, 0, 14, 498, 1, 0, 0, 0, 14, 500, 1, 0, 0, 0, 15, 502, 1, 0, 0, 0, 15, 504, 1, 0, 0, 0, 15, 506, 1, 0, 0, 0, 15, 508, 1, 0, 0, 0, 15, 510, 1, 0, 0, 0, 15, 512, 1, 0, 0, 0, 15, 514, 1, 0, 0, 0, 15, 516, 1, 0, 0, 0, 15, 518, 1, 0, 0, 0, 15, 520, 1, 0, 0, 0, 15, 522, 1, 0, 0, 0, 15, 524, 1, 0, 0, 0, 15, 526, 1, 0, 0, 0, 15, 528, 1, 0, 0, 0, 15, 530, 1, 0, 0, 0, 15, 532, 1, 0, 0, 0, 16, 534, 1, 0, 0, 0, 16, 536, 1, 0, 0, 0, 16, 538, 1, 0, 0, 0, 16, 540, 1, 0, 0, 0, 16, 542, 1, 0, 0, 0, 16, 544, 1, 0, 0, 0, 16, 546, 1, 0, 0, 0, 16, 548, 1, 0, 0, 0, 16, 550, 1, 0, 0, 0, 16, 552, 1, 0, 0, 0, 16, 554, 1, 0, 0, 0, 16, 556, 1, 0, 0, 0, 16, 558, 1, 0, 0, 0, 16, 560, 1, 0, 0, 0, 16, 562, 1, 0, 0, 0, 16, 564, 1, 0, 0, 0, 16, 566, 1, 0, 0, 0, 16, 568, 1, 0, 0, 0, 16, 570, 1, 0, 0, 0, 16, 572, 1, 0, 0, 0, 16, 574, 1, 0, 0, 0, 16, 576, 1, 0, 0, 0, 17, 578, 1, 0, 0, 0, 17, 580, 1, 0, 0, 0, 17, 582, 1, 0, 0, 0, 17, 584, 1, 0, 0, 0, 17, 586, 1, 0, 0, 0, 18, 588, 1, 0, 0, 0, 20, 605, 1, 0, 0, 0, 22, 621, 1, 0, 0, 0, 24, 627, 1, 0, 0, 0, 26, 642, 1, 0, 0, 0, 28, 651, 1, 0, 0, 0, 30, 662, 1, 0, 0, 0, 32, 675, 1, 0, 0, 0, 34, 685, 1, 0, 0, 0, 36, 692, 1, 0, 0, 0, 38, 699, 1, 0, 0, 0, 40, 707, 1, 0, 0, 0, 42, 716, 1, 0, 0, 0, 44, 722, 1, 0, 0, 0, 46, 731, 1, 0, 0, 0, 48, 738, 1, 0, 0, 0, 50, 746, 1, 0, 0, 0, 52, 754, 1, 0, 0, 0, 54, 761, 1, 0, 0, 0, 56, 766, 1, 0, 0, 0, 58, 773, 1, 0, 0, 0, 60, 781, 1, 0, 0, 0, 62, 791, 1, 0, 0, 0, 64, 806, 1, 0, 0, 0, 66, 815, 1, 0, 0, 0, 68, 823, 1, 0, 0, 0, 70, 831, 1, 0, 0, 0, 72, 840, 1, 0, 0, 0, 74, 852, 1, 0, 0, 0, 76, 864, 1, 0, 0, 0, 78, 871, 1, 0, 0, 0, 80, 878, 1, 0, 0, 0, 82, 890, 1, 0, 0, 0, 84, 899, 1, 0, 0, 0, 86, 905, 1, 0, 0, 0, 88, 913, 1, 0, 0, 0, 90, 919, 1, 0, 0, 0, 92, 924, 1, 0, 0, 0, 94, 930, 1, 0, 0, 0, 96, 934, 1, 0, 0, 0, 98, 938, 1, 0, 0, 0, 100, 942, 1, 0, 0, 0, 102, 946, 1, 0, 0, 0, 104, 950, 1, 0, 0, 0, 106, 954, 1, 0, 0, 0, 108, 958, 1, 0, 0, 0, 110, 962, 1, 0, 0, 0, 112, 966, 1, 0, 0, 0, 114, 970, 1, 0, 0, 0, 116, 974, 1, 0, 0, 0, 118, 979, 1, 0, 0, 0, 120, 985, 1, 0, 0, 0, 122, 990, 1, 0, 0, 0, 124, 995, 1, 0, 0, 0, 126, 1004, 1, 0, 0, 0, 128, 1011, 1, 0, 0, 0, 130, 1015, 1, 0, 0, 0, 132, 1019, 1, 0, 0, 0, 134, 1023, 1, 0, 0, 0, 136, 1027, 1, 0, 0, 0, 138, 1031, 1, 0, 0, 0, 140, 1037, 1, 0, 0, 0, 142, 1044, 1, 0, 0, 0, 144, 1048, 1, 0, 0, 0, 146, 1052, 1, 0, 0, 0, 148, 1056, 1, 0, 0, 0, 150, 1060, 1, 0, 0, 0, 152, 1064, 1, 0, 0, 0, 154, 1068, 1, 0, 0, 0, 156, 1072, 1, 0, 0, 0, 158, 1076, 1, 0, 0, 0, 160, 1080, 1, 0, 0, 0, 162, 1084, 1, 0, 0, 0, 164, 1088, 1, 0, 0, 0, 166, 1092, 1, 0, 0, 0, 168, 1096, 1, 0, 0, 0, 170, 1100, 1, 0, 0, 0, 172, 1104, 1, 0, 0, 0, 174, 1109, 1, 0, 0, 0, 176, 1114, 1, 0, 0, 0, 178, 1118, 1, 0, 0, 0, 180, 1122, 1, 0, 0, 0, 182, 1126, 1, 0, 0, 0, 184, 1130, 1, 0, 0, 0, 186, 1132, 1, 0, 0, 0, 188, 1134, 1, 0, 0, 0, 190, 1137, 1, 0, 0, 0, 192, 1139, 1, 0, 0, 0, 194, 1148, 1, 0, 0, 0, 196, 1150, 1, 0, 0, 0, 198, 1155, 1, 0, 0, 0, 200, 1157, 1, 0, 0, 0, 202, 1162, 1, 0, 0, 0, 204, 1193, 1, 0, 0, 0, 206, 1196, 1, 0, 0, 0, 208, 1242, 1, 0, 0, 0, 210, 1244, 1, 0, 0, 0, 212, 1248, 1, 0, 0, 0, 214, 1252, 1, 0, 0, 0, 216, 1254, 1, 0, 0, 0, 218, 1257, 1, 0, 0, 0, 220, 1260, 1, 0, 0, 0, 222, 1262, 1, 0, 0, 0, 224, 1264, 1, 0, 0, 0, 226, 1266, 1, 0, 0, 0, 228, 1271, 1, 0, 0, 0, 230, 1273, 1, 0, 0, 0, 232, 1279, 1, 0, 0, 0, 234, 1285, 1, 0, 0, 0, 236, 1288, 1, 0, 0, 0, 238, 1291, 1, 0, 0, 0, 240, 1296, 1, 0, 0, 0, 242, 1301, 1, 0, 0, 0, 244, 1305, 1, 0, 0, 0, 246, 1310, 1, 0, 0, 0, 248, 1316, 1, 0, 0, 0, 250, 1319, 1, 0, 0, 0, 252, 1322, 1, 0, 0, 0, 254, 1324, 1, 0, 0, 0, 256, 1330, 1, 0, 0, 0, 258, 1335, 1, 0, 0, 0, 260, 1340, 1, 0, 0, 0, 262, 1343, 1, 0, 0, 0, 264, 1346, 1, 0, 0, 0, 266, 1349, 1, 0, 0, 0, 268, 1351, 1, 0, 0, 0, 270, 1354, 1, 0, 0, 0, 272, 1356, 1, 0, 0, 0, 274, 1359, 1, 0, 0, 0, 276, 1361, 1, 0, 0, 0, 278, 1363, 1, 0, 0, 0, 280, 1365, 1, 0, 0, 0, 282, 1367, 1, 0, 0, 0, 284, 1369, 1, 0, 0, 0, 286, 1371, 1, 0, 0, 0, 288, 1373, 1, 0, 0, 0, 290, 1376, 1, 0, 0, 0, 292, 1397, 1, 0, 0, 0, 294, 1416, 1, 0, 0, 0, 296, 1418, 1, 0, 0, 0, 298, 1423, 1, 0, 0, 0, 300, 1428, 1, 0, 0, 0, 302, 1433, 1, 0, 0, 0, 304, 1454, 1, 0, 0, 0, 306, 1456, 1, 0, 0, 0, 308, 1464, 1, 0, 0, 0, 310, 1466, 1, 0, 0, 0, 312, 1470, 1, 0, 0, 0, 314, 1474, 1, 0, 0, 0, 316, 1478, 1, 0, 0, 0, 318, 1483, 1, 0, 0, 0, 320, 1487, 1, 0, 0, 0, 322, 1491, 1, 0, 0, 0, 324, 1495, 1, 0, 0, 0, 326, 1499, 1, 0, 0, 0, 328, 1508, 1, 0, 0, 0, 330, 1516, 1, 0, 0, 0, 332, 1519, 1, 0, 0, 0, 334, 1523, 1, 0, 0, 0, 336, 1527, 1, 0, 0, 0, 338, 1531, 1, 0, 0, 0, 340, 1535, 1, 0, 0, 0, 342, 1539, 1, 0, 0, 0, 344, 1543, 1, 0, 0, 0, 346, 1548, 1, 0, 0, 0, 348, 1554, 1, 0, 0, 0, 350, 1559, 1, 0, 0, 0, 352, 1563, 1, 0, 0, 0, 354, 1567, 1, 0, 0, 0, 356, 1571, 1, 0, 0, 0, 358, 1576, 1, 0, 0, 0, 360, 1582, 1, 0, 0, 0, 362, 1588, 1, 0, 0, 0, 364, 1592, 1, 0, 0, 0, 366, 1596, 1, 0, 0, 0, 368, 1600, 1, 0, 0, 0, 370, 1604, 1, 0, 0, 0, 372, 1608, 1, 0, 0, 0, 374, 1612, 1, 0, 0, 0, 376, 1621, 1, 0, 0, 0, 378, 1625, 1, 0, 0, 0, 380, 1629, 1, 0, 0, 0, 382, 1633, 1, 0, 0, 0, 384, 1638, 1, 0, 0, 0, 386, 1643, 1, 0, 0, 0, 388, 1647, 1, 0, 0, 0, 390, 1653, 1, 0, 0, 0, 392, 1662, 1, 0, 0, 0, 394, 1666, 1, 0, 0, 0, 396, 1670, 1, 0, 0, 0, 398, 1674, 1, 0, 0, 0, 400, 1678, 1, 0, 0, 0, 402, 1682, 1, 0, 0, 0, 404, 1686, 1, 0, 0, 0, 406, 1691, 1, 0, 0, 0, 408, 1697, 1, 0, 0, 0, 410, 1701, 1, 0, 0, 0, 412, 1705, 1, 0, 0, 0, 414, 1709, 1, 0, 0, 0, 416, 1714, 1, 0, 0, 0, 418, 1718, 1, 0, 0, 0, 420, 1722, 1, 0, 0, 0, 422, 1726, 1, 0, 0, 0, 424, 1730, 1, 0, 0, 0, 426, 1734, 1, 0, 0, 0, 428, 1740, 1, 0, 0, 0, 430, 1747, 1, 0, 0, 0, 432, 1751, 1, 0, 0, 0, 434, 1755, 1, 0, 0, 0, 436, 1759, 1, 0, 0, 0, 438, 1763, 1, 0, 0, 0, 440, 1767, 1, 0, 0, 0, 442, 1771, 1, 0, 0, 0, 444, 1776, 1, 0, 0, 0, 446, 1782, 1, 0, 0, 0, 448, 1786, 1, 0, 0, 0, 450, 1790, 1, 0, 0, 0, 452, 1794, 1, 0, 0, 0, 454, 1798, 1, 0, 0, 0, 456, 1802, 1, 0, 0, 0, 458, 1806, 1, 0, 0, 0, 460, 1810, 1, 0, 0, 0, 462, 1814, 1, 0, 0, 0, 464, 1818, 1, 0, 0, 0, 466, 1822, 1, 0, 0, 0, 468, 1826, 1, 0, 0, 0, 470, 1830, 1, 0, 0, 0, 472, 1835, 1, 0, 0, 0, 474, 1841, 1, 0, 0, 0, 476, 1845, 1, 0, 0, 0, 478, 1849, 1, 0, 0, 0, 480, 1853, 1, 0, 0, 0, 482, 1857, 1, 0, 0, 0, 484, 1861, 1, 0, 0, 0, 486, 1865, 1, 0, 0, 0, 488, 1869, 1, 0, 0, 0, 490, 1877, 1, 0, 0, 0, 492, 1898, 1, 0, 0, 0, 494, 1902, 1, 0, 0, 0, 496, 1906, 1, 0, 0, 0, 498, 1910, 1, 0, 0, 0, 500, 1914, 1, 0, 0, 0, 502, 1918, 1, 0, 0, 0, 504, 1923, 1, 0, 0, 0, 506, 1929, 1, 0, 0, 0, 508, 1933, 1, 0, 0, 0, 510, 1937, 1, 0, 0, 0, 512, 1941, 1, 0, 0, 0, 514, 1945, 1, 0, 0, 0, 516, 1949, 1, 0, 0, 0, 518, 1953, 1, 0, 0, 0, 520, 1957, 1, 0, 0, 0, 522, 1961, 1, 0, 0, 0, 524, 1965, 1, 0, 0, 0, 526, 1968, 1, 0, 0, 0, 528, 1972, 1, 0, 0, 0, 530, 1976, 1, 0, 0, 0, 532, 1980, 1, 0, 0, 0, 534, 1984, 1, 0, 0, 0, 536, 1988, 1, 0, 0, 0, 538, 1992, 1, 0, 0, 0, 540, 1996, 1, 0, 0, 0, 542, 2001, 1, 0, 0, 0, 544, 2005, 1, 0, 0, 0, 546, 2009, 1, 0, 0, 0, 548, 2013, 1, 0, 0, 0, 550, 2017, 1, 0, 0, 0, 552, 2021, 1, 0, 0, 0, 554, 2025, 1, 0, 0, 0, 556, 2029, 1, 0, 0, 0, 558, 2033, 1, 0, 0, 0, 560, 2037, 1, 0, 0, 0, 562, 2041, 1, 0, 0, 0, 564, 2045, 1, 0, 0, 0, 566, 2049, 1, 0, 0, 0, 568, 2053, 1, 0, 0, 0, 570, 2057, 1, 0, 0, 0, 572, 2061, 1, 0, 0, 0, 574, 2065, 1, 0, 0, 0, 576, 2069, 1, 0, 0, 0, 578, 2073, 1, 0, 0, 0, 580, 2078, 1, 0, 0, 0, 582, 2083, 1, 0, 0, 0, 584, 2087, 1, 0, 0, 0, 586, 2091, 1, 0, 0, 0, 588, 589, 5, 47, 0, 0, 589, 590, 5, 47, 0, 0, 590, 594, 1, 0, 0, 0, 591, 593, 8, 0, 0, 0, 592, 591, 1, 0, 0, 0, 593, 596, 1, 0, 0, 0, 594, 592, 1, 0, 0, 0, 594, 595, 1, 0, 0, 0, 595, 598, 1, 0, 0, 0, 596, 594, 1, 0, 0, 0, 597, 599, 5, 13, 0, 0, 598, 597, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 601, 1, 0, 0, 0, 600, 602, 5, 10, 0, 0, 601, 600, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 6, 0, 0, 0, 604, 19, 1, 0, 0, 0, 605, 606, 5, 47, 0, 0, 606, 607, 5, 42, 0, 0, 607, 612, 1, 0, 0, 0, 608, 611, 3, 20, 1, 0, 609, 611, 9, 0, 0, 0, 610, 608, 1, 0, 0, 0, 610, 609, 1, 0, 0, 0, 611, 614, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 613, 615, 1, 0, 0, 0, 614, 612, 1, 0, 0, 0, 615, 616, 5, 42, 0, 0, 616, 617, 5, 47, 0, 0, 617, 618, 1, 0, 0, 0, 618, 619, 6, 1, 0, 0, 619, 21, 1, 0, 0, 0, 620, 622, 7, 1, 0, 0, 621, 620, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 621, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 626, 6, 2, 0, 0, 626, 23, 1, 0, 0, 0, 627, 628, 7, 2, 0, 0, 628, 629, 7, 3, 0, 0, 629, 630, 7, 4, 0, 0, 630, 631, 7, 5, 0, 0, 631, 632, 7, 6, 0, 0, 632, 633, 7, 7, 0, 0, 633, 634, 5, 95, 0, 0, 634, 635, 7, 8, 0, 0, 635, 636, 7, 9, 0, 0, 636, 637, 7, 10, 0, 0, 637, 638, 7, 5, 0, 0, 638, 639, 7, 11, 0, 0, 639, 640, 1, 0, 0, 0, 640, 641, 6, 3, 1, 0, 641, 25, 1, 0, 0, 0, 642, 643, 7, 7, 0, 0, 643, 644, 7, 5, 0, 0, 644, 645, 7, 12, 0, 0, 645, 646, 7, 10, 0, 0, 646, 647, 7, 2, 0, 0, 647, 648, 7, 3, 0, 0, 648, 649, 1, 0, 0, 0, 649, 650, 6, 4, 2, 0, 650, 27, 1, 0, 0, 0, 651, 652, 4, 5, 0, 0, 652, 653, 7, 7, 0, 0, 653, 654, 7, 13, 0, 0, 654, 655, 7, 8, 0, 0, 655, 656, 7, 14, 0, 0, 656, 657, 7, 4, 0, 0, 657, 658, 7, 10, 0, 0, 658, 659, 7, 5, 0, 0, 659, 660, 1, 0, 0, 0, 660, 661, 6, 5, 3, 0, 661, 29, 1, 0, 0, 0, 662, 663, 7, 2, 0, 0, 663, 664, 7, 9, 0, 0, 664, 665, 7, 15, 0, 0, 665, 666, 7, 8, 0, 0, 666, 667, 7, 14, 0, 0, 667, 668, 7, 7, 0, 0, 668, 669, 7, 11, 0, 0, 669, 670, 7, 10, 0, 0, 670, 671, 7, 9, 0, 0, 671, 672, 7, 5, 0, 0, 672, 673, 1, 0, 0, 0, 673, 674, 6, 6, 4, 0, 674, 31, 1, 0, 0, 0, 675, 676, 7, 16, 0, 0, 676, 677, 7, 10, 0, 0, 677, 678, 7, 17, 0, 0, 678, 679, 7, 17, 0, 0, 679, 680, 7, 7, 0, 0, 680, 681, 7, 2, 0, 0, 681, 682, 7, 11, 0, 0, 682, 683, 1, 0, 0, 0, 683, 684, 6, 7, 4, 0, 684, 33, 1, 0, 0, 0, 685, 686, 7, 7, 0, 0, 686, 687, 7, 18, 0, 0, 687, 688, 7, 4, 0, 0, 688, 689, 7, 14, 0, 0, 689, 690, 1, 0, 0, 0, 690, 691, 6, 8, 4, 0, 691, 35, 1, 0, 0, 0, 692, 693, 7, 6, 0, 0, 693, 694, 7, 12, 0, 0, 694, 695, 7, 9, 0, 0, 695, 696, 7, 19, 0, 0, 696, 697, 1, 0, 0, 0, 697, 698, 6, 9, 4, 0, 698, 37, 1, 0, 0, 0, 699, 700, 7, 14, 0, 0, 700, 701, 7, 10, 0, 0, 701, 702, 7, 15, 0, 0, 702, 703, 7, 10, 0, 0, 703, 704, 7, 11, 0, 0, 704, 705, 1, 0, 0, 0, 705, 706, 6, 10, 4, 0, 706, 39, 1, 0, 0, 0, 707, 708, 7, 12, 0, 0, 708, 709, 7, 7, 0, 0, 709, 710, 7, 12, 0, 0, 710, 711, 7, 4, 0, 0, 711, 712, 7, 5, 0, 0, 712, 713, 7, 19, 0, 0, 713, 714, 1, 0, 0, 0, 714, 715, 6, 11, 4, 0, 715, 41, 1, 0, 0, 0, 716, 717, 7, 12, 0, 0, 717, 718, 7, 9, 0, 0, 718, 719, 7, 20, 0, 0, 719, 720, 1, 0, 0, 0, 720, 721, 6, 12, 4, 0, 721, 43, 1, 0, 0, 0, 722, 723, 7, 17, 0, 0, 723, 724, 7, 4, 0, 0, 724, 725, 7, 15, 0, 0, 725, 726, 7, 8, 0, 0, 726, 727, 7, 14, 0, 0, 727, 728, 7, 7, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 6, 13, 4, 0, 730, 45, 1, 0, 0, 0, 731, 732, 7, 17, 0, 0, 732, 733, 7, 9, 0, 0, 733, 734, 7, 12, 0, 0, 734, 735, 7, 11, 0, 0, 735, 736, 1, 0, 0, 0, 736, 737, 6, 14, 4, 0, 737, 47, 1, 0, 0, 0, 738, 739, 7, 17, 0, 0, 739, 740, 7, 11, 0, 0, 740, 741, 7, 4, 0, 0, 741, 742, 7, 11, 0, 0, 742, 743, 7, 17, 0, 0, 743, 744, 1, 0, 0, 0, 744, 745, 6, 15, 4, 0, 745, 49, 1, 0, 0, 0, 746, 747, 7, 20, 0, 0, 747, 748, 7, 3, 0, 0, 748, 749, 7, 7, 0, 0, 749, 750, 7, 12, 0, 0, 750, 751, 7, 7, 0, 0, 751, 752, 1, 0, 0, 0, 752, 753, 6, 16, 4, 0, 753, 51, 1, 0, 0, 0, 754, 755, 7, 21, 0, 0, 755, 756, 7, 12, 0, 0, 756, 757, 7, 9, 0, 0, 757, 758, 7, 15, 0, 0, 758, 759, 1, 0, 0, 0, 759, 760, 6, 17, 5, 0, 760, 53, 1, 0, 0, 0, 761, 762, 7, 11, 0, 0, 762, 763, 7, 17, 0, 0, 763, 764, 1, 0, 0, 0, 764, 765, 6, 18, 5, 0, 765, 55, 1, 0, 0, 0, 766, 767, 7, 21, 0, 0, 767, 768, 7, 9, 0, 0, 768, 769, 7, 12, 0, 0, 769, 770, 7, 19, 0, 0, 770, 771, 1, 0, 0, 0, 771, 772, 6, 19, 6, 0, 772, 57, 1, 0, 0, 0, 773, 774, 4, 20, 1, 0, 774, 775, 7, 21, 0, 0, 775, 776, 7, 22, 0, 0, 776, 777, 7, 17, 0, 0, 777, 778, 7, 7, 0, 0, 778, 779, 1, 0, 0, 0, 779, 780, 6, 20, 7, 0, 780, 59, 1, 0, 0, 0, 781, 782, 4, 21, 2, 0, 782, 783, 7, 10, 0, 0, 783, 784, 7, 5, 0, 0, 784, 785, 7, 14, 0, 0, 785, 786, 7, 10, 0, 0, 786, 787, 7, 5, 0, 0, 787, 788, 7, 7, 0, 0, 788, 789, 1, 0, 0, 0, 789, 790, 6, 21, 8, 0, 790, 61, 1, 0, 0, 0, 791, 792, 4, 22, 3, 0, 792, 793, 7, 10, 0, 0, 793, 794, 7, 5, 0, 0, 794, 795, 7, 14, 0, 0, 795, 796, 7, 10, 0, 0, 796, 797, 7, 5, 0, 0, 797, 798, 7, 7, 0, 0, 798, 799, 7, 17, 0, 0, 799, 800, 7, 11, 0, 0, 800, 801, 7, 4, 0, 0, 801, 802, 7, 11, 0, 0, 802, 803, 7, 17, 0, 0, 803, 804, 1, 0, 0, 0, 804, 805, 6, 22, 4, 0, 805, 63, 1, 0, 0, 0, 806, 807, 7, 14, 0, 0, 807, 808, 7, 9, 0, 0, 808, 809, 7, 9, 0, 0, 809, 810, 7, 19, 0, 0, 810, 811, 7, 22, 0, 0, 811, 812, 7, 8, 0, 0, 812, 813, 1, 0, 0, 0, 813, 814, 6, 23, 9, 0, 814, 65, 1, 0, 0, 0, 815, 816, 4, 24, 4, 0, 816, 817, 7, 21, 0, 0, 817, 818, 7, 22, 0, 0, 818, 819, 7, 14, 0, 0, 819, 820, 7, 14, 0, 0, 820, 821, 1, 0, 0, 0, 821, 822, 6, 24, 9, 0, 822, 67, 1, 0, 0, 0, 823, 824, 4, 25, 5, 0, 824, 825, 7, 14, 0, 0, 825, 826, 7, 7, 0, 0, 826, 827, 7, 21, 0, 0, 827, 828, 7, 11, 0, 0, 828, 829, 1, 0, 0, 0, 829, 830, 6, 25, 9, 0, 830, 69, 1, 0, 0, 0, 831, 832, 4, 26, 6, 0, 832, 833, 7, 12, 0, 0, 833, 834, 7, 10, 0, 0, 834, 835, 7, 6, 0, 0, 835, 836, 7, 3, 0, 0, 836, 837, 7, 11, 0, 0, 837, 838, 1, 0, 0, 0, 838, 839, 6, 26, 9, 0, 839, 71, 1, 0, 0, 0, 840, 841, 4, 27, 7, 0, 841, 842, 7, 14, 0, 0, 842, 843, 7, 9, 0, 0, 843, 844, 7, 9, 0, 0, 844, 845, 7, 19, 0, 0, 845, 846, 7, 22, 0, 0, 846, 847, 7, 8, 0, 0, 847, 848, 5, 95, 0, 0, 848, 849, 5, 128020, 0, 0, 849, 850, 1, 0, 0, 0, 850, 851, 6, 27, 10, 0, 851, 73, 1, 0, 0, 0, 852, 853, 7, 15, 0, 0, 853, 854, 7, 18, 0, 0, 854, 855, 5, 95, 0, 0, 855, 856, 7, 7, 0, 0, 856, 857, 7, 13, 0, 0, 857, 858, 7, 8, 0, 0, 858, 859, 7, 4, 0, 0, 859, 860, 7, 5, 0, 0, 860, 861, 7, 16, 0, 0, 861, 862, 1, 0, 0, 0, 862, 863, 6, 28, 11, 0, 863, 75, 1, 0, 0, 0, 864, 865, 7, 16, 0, 0, 865, 866, 7, 12, 0, 0, 866, 867, 7, 9, 0, 0, 867, 868, 7, 8, 0, 0, 868, 869, 1, 0, 0, 0, 869, 870, 6, 29, 12, 0, 870, 77, 1, 0, 0, 0, 871, 872, 7, 19, 0, 0, 872, 873, 7, 7, 0, 0, 873, 874, 7, 7, 0, 0, 874, 875, 7, 8, 0, 0, 875, 876, 1, 0, 0, 0, 876, 877, 6, 30, 12, 0, 877, 79, 1, 0, 0, 0, 878, 879, 4, 31, 8, 0, 879, 880, 7, 10, 0, 0, 880, 881, 7, 5, 0, 0, 881, 882, 7, 17, 0, 0, 882, 883, 7, 10, 0, 0, 883, 884, 7, 17, 0, 0, 884, 885, 7, 11, 0, 0, 885, 886, 5, 95, 0, 0, 886, 887, 5, 128020, 0, 0, 887, 888, 1, 0, 0, 0, 888, 889, 6, 31, 12, 0, 889, 81, 1, 0, 0, 0, 890, 891, 7, 12, 0, 0, 891, 892, 7, 7, 0, 0, 892, 893, 7, 5, 0, 0, 893, 894, 7, 4, 0, 0, 894, 895, 7, 15, 0, 0, 895, 896, 7, 7, 0, 0, 896, 897, 1, 0, 0, 0, 897, 898, 6, 32, 13, 0, 898, 83, 1, 0, 0, 0, 899, 900, 7, 17, 0, 0, 900, 901, 7, 7, 0, 0, 901, 902, 7, 11, 0, 0, 902, 903, 1, 0, 0, 0, 903, 904, 6, 33, 14, 0, 904, 85, 1, 0, 0, 0, 905, 906, 7, 17, 0, 0, 906, 907, 7, 3, 0, 0, 907, 908, 7, 9, 0, 0, 908, 909, 7, 20, 0, 0, 909, 910, 1, 0, 0, 0, 910, 911, 6, 34, 15, 0, 911, 87, 1, 0, 0, 0, 912, 914, 8, 23, 0, 0, 913, 912, 1, 0, 0, 0, 914, 915, 1, 0, 0, 0, 915, 913, 1, 0, 0, 0, 915, 916, 1, 0, 0, 0, 916, 917, 1, 0, 0, 0, 917, 918, 6, 35, 4, 0, 918, 89, 1, 0, 0, 0, 919, 920, 3, 182, 82, 0, 920, 921, 1, 0, 0, 0, 921, 922, 6, 36, 16, 0, 922, 923, 6, 36, 17, 0, 923, 91, 1, 0, 0, 0, 924, 925, 3, 302, 142, 0, 925, 926, 1, 0, 0, 0, 926, 927, 6, 37, 18, 0, 927, 928, 6, 37, 17, 0, 928, 929, 6, 37, 17, 0, 929, 93, 1, 0, 0, 0, 930, 931, 3, 248, 115, 0, 931, 932, 1, 0, 0, 0, 932, 933, 6, 38, 19, 0, 933, 95, 1, 0, 0, 0, 934, 935, 3, 524, 253, 0, 935, 936, 1, 0, 0, 0, 936, 937, 6, 39, 20, 0, 937, 97, 1, 0, 0, 0, 938, 939, 3, 228, 105, 0, 939, 940, 1, 0, 0, 0, 940, 941, 6, 40, 21, 0, 941, 99, 1, 0, 0, 0, 942, 943, 3, 224, 103, 0, 943, 944, 1, 0, 0, 0, 944, 945, 6, 41, 22, 0, 945, 101, 1, 0, 0, 0, 946, 947, 3, 296, 139, 0, 947, 948, 1, 0, 0, 0, 948, 949, 6, 42, 23, 0, 949, 103, 1, 0, 0, 0, 950, 951, 3, 298, 140, 0, 951, 952, 1, 0, 0, 0, 952, 953, 6, 43, 24, 0, 953, 105, 1, 0, 0, 0, 954, 955, 3, 308, 145, 0, 955, 956, 1, 0, 0, 0, 956, 957, 6, 44, 25, 0, 957, 107, 1, 0, 0, 0, 958, 959, 3, 304, 143, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 45, 26, 0, 961, 109, 1, 0, 0, 0, 962, 963, 3, 18, 0, 0, 963, 964, 1, 0, 0, 0, 964, 965, 6, 46, 0, 0, 965, 111, 1, 0, 0, 0, 966, 967, 3, 20, 1, 0, 967, 968, 1, 0, 0, 0, 968, 969, 6, 47, 0, 0, 969, 113, 1, 0, 0, 0, 970, 971, 3, 22, 2, 0, 971, 972, 1, 0, 0, 0, 972, 973, 6, 48, 0, 0, 973, 115, 1, 0, 0, 0, 974, 975, 3, 182, 82, 0, 975, 976, 1, 0, 0, 0, 976, 977, 6, 49, 16, 0, 977, 978, 6, 49, 17, 0, 978, 117, 1, 0, 0, 0, 979, 980, 3, 302, 142, 0, 980, 981, 1, 0, 0, 0, 981, 982, 6, 50, 18, 0, 982, 983, 6, 50, 17, 0, 983, 984, 6, 50, 17, 0, 984, 119, 1, 0, 0, 0, 985, 986, 3, 248, 115, 0, 986, 987, 1, 0, 0, 0, 987, 988, 6, 51, 19, 0, 988, 989, 6, 51, 27, 0, 989, 121, 1, 0, 0, 0, 990, 991, 3, 258, 120, 0, 991, 992, 1, 0, 0, 0, 992, 993, 6, 52, 28, 0, 993, 994, 6, 52, 27, 0, 994, 123, 1, 0, 0, 0, 995, 996, 8, 24, 0, 0, 996, 125, 1, 0, 0, 0, 997, 999, 3, 124, 53, 0, 998, 997, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 998, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1003, 3, 220, 101, 0, 1003, 1005, 1, 0, 0, 0, 1004, 998, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1007, 1, 0, 0, 0, 1006, 1008, 3, 124, 53, 0, 1007, 1006, 1, 0, 0, 0, 1008, 1009, 1, 0, 0, 0, 1009, 1007, 1, 0, 0, 0, 1009, 1010, 1, 0, 0, 0, 1010, 127, 1, 0, 0, 0, 1011, 1012, 3, 126, 54, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1014, 6, 55, 29, 0, 1014, 129, 1, 0, 0, 0, 1015, 1016, 3, 204, 93, 0, 1016, 1017, 1, 0, 0, 0, 1017, 1018, 6, 56, 30, 0, 1018, 131, 1, 0, 0, 0, 1019, 1020, 3, 18, 0, 0, 1020, 1021, 1, 0, 0, 0, 1021, 1022, 6, 57, 0, 0, 1022, 133, 1, 0, 0, 0, 1023, 1024, 3, 20, 1, 0, 1024, 1025, 1, 0, 0, 0, 1025, 1026, 6, 58, 0, 0, 1026, 135, 1, 0, 0, 0, 1027, 1028, 3, 22, 2, 0, 1028, 1029, 1, 0, 0, 0, 1029, 1030, 6, 59, 0, 0, 1030, 137, 1, 0, 0, 0, 1031, 1032, 3, 182, 82, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1034, 6, 60, 16, 0, 1034, 1035, 6, 60, 17, 0, 1035, 1036, 6, 60, 17, 0, 1036, 139, 1, 0, 0, 0, 1037, 1038, 3, 302, 142, 0, 1038, 1039, 1, 0, 0, 0, 1039, 1040, 6, 61, 18, 0, 1040, 1041, 6, 61, 17, 0, 1041, 1042, 6, 61, 17, 0, 1042, 1043, 6, 61, 17, 0, 1043, 141, 1, 0, 0, 0, 1044, 1045, 3, 296, 139, 0, 1045, 1046, 1, 0, 0, 0, 1046, 1047, 6, 62, 23, 0, 1047, 143, 1, 0, 0, 0, 1048, 1049, 3, 298, 140, 0, 1049, 1050, 1, 0, 0, 0, 1050, 1051, 6, 63, 24, 0, 1051, 145, 1, 0, 0, 0, 1052, 1053, 3, 214, 98, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1055, 6, 64, 31, 0, 1055, 147, 1, 0, 0, 0, 1056, 1057, 3, 224, 103, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, 6, 65, 22, 0, 1059, 149, 1, 0, 0, 0, 1060, 1061, 3, 228, 105, 0, 1061, 1062, 1, 0, 0, 0, 1062, 1063, 6, 66, 21, 0, 1063, 151, 1, 0, 0, 0, 1064, 1065, 3, 258, 120, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 6, 67, 28, 0, 1067, 153, 1, 0, 0, 0, 1068, 1069, 3, 494, 238, 0, 1069, 1070, 1, 0, 0, 0, 1070, 1071, 6, 68, 32, 0, 1071, 155, 1, 0, 0, 0, 1072, 1073, 3, 308, 145, 0, 1073, 1074, 1, 0, 0, 0, 1074, 1075, 6, 69, 25, 0, 1075, 157, 1, 0, 0, 0, 1076, 1077, 3, 252, 117, 0, 1077, 1078, 1, 0, 0, 0, 1078, 1079, 6, 70, 33, 0, 1079, 159, 1, 0, 0, 0, 1080, 1081, 3, 292, 137, 0, 1081, 1082, 1, 0, 0, 0, 1082, 1083, 6, 71, 34, 0, 1083, 161, 1, 0, 0, 0, 1084, 1085, 3, 288, 135, 0, 1085, 1086, 1, 0, 0, 0, 1086, 1087, 6, 72, 35, 0, 1087, 163, 1, 0, 0, 0, 1088, 1089, 3, 294, 138, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 6, 73, 36, 0, 1091, 165, 1, 0, 0, 0, 1092, 1093, 3, 18, 0, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1095, 6, 74, 0, 0, 1095, 167, 1, 0, 0, 0, 1096, 1097, 3, 20, 1, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 6, 75, 0, 0, 1099, 169, 1, 0, 0, 0, 1100, 1101, 3, 22, 2, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1103, 6, 76, 0, 0, 1103, 171, 1, 0, 0, 0, 1104, 1105, 3, 300, 141, 0, 1105, 1106, 1, 0, 0, 0, 1106, 1107, 6, 77, 37, 0, 1107, 1108, 6, 77, 38, 0, 1108, 173, 1, 0, 0, 0, 1109, 1110, 3, 182, 82, 0, 1110, 1111, 1, 0, 0, 0, 1111, 1112, 6, 78, 16, 0, 1112, 1113, 6, 78, 17, 0, 1113, 175, 1, 0, 0, 0, 1114, 1115, 3, 22, 2, 0, 1115, 1116, 1, 0, 0, 0, 1116, 1117, 6, 79, 0, 0, 1117, 177, 1, 0, 0, 0, 1118, 1119, 3, 18, 0, 0, 1119, 1120, 1, 0, 0, 0, 1120, 1121, 6, 80, 0, 0, 1121, 179, 1, 0, 0, 0, 1122, 1123, 3, 20, 1, 0, 1123, 1124, 1, 0, 0, 0, 1124, 1125, 6, 81, 0, 0, 1125, 181, 1, 0, 0, 0, 1126, 1127, 5, 124, 0, 0, 1127, 1128, 1, 0, 0, 0, 1128, 1129, 6, 82, 17, 0, 1129, 183, 1, 0, 0, 0, 1130, 1131, 7, 25, 0, 0, 1131, 185, 1, 0, 0, 0, 1132, 1133, 7, 26, 0, 0, 1133, 187, 1, 0, 0, 0, 1134, 1135, 5, 92, 0, 0, 1135, 1136, 7, 27, 0, 0, 1136, 189, 1, 0, 0, 0, 1137, 1138, 8, 28, 0, 0, 1138, 191, 1, 0, 0, 0, 1139, 1141, 7, 7, 0, 0, 1140, 1142, 7, 29, 0, 0, 1141, 1140, 1, 0, 0, 0, 1141, 1142, 1, 0, 0, 0, 1142, 1144, 1, 0, 0, 0, 1143, 1145, 3, 184, 83, 0, 1144, 1143, 1, 0, 0, 0, 1145, 1146, 1, 0, 0, 0, 1146, 1144, 1, 0, 0, 0, 1146, 1147, 1, 0, 0, 0, 1147, 193, 1, 0, 0, 0, 1148, 1149, 5, 64, 0, 0, 1149, 195, 1, 0, 0, 0, 1150, 1151, 5, 96, 0, 0, 1151, 197, 1, 0, 0, 0, 1152, 1156, 8, 30, 0, 0, 1153, 1154, 5, 96, 0, 0, 1154, 1156, 5, 96, 0, 0, 1155, 1152, 1, 0, 0, 0, 1155, 1153, 1, 0, 0, 0, 1156, 199, 1, 0, 0, 0, 1157, 1158, 5, 95, 0, 0, 1158, 201, 1, 0, 0, 0, 1159, 1163, 3, 186, 84, 0, 1160, 1163, 3, 184, 83, 0, 1161, 1163, 3, 200, 91, 0, 1162, 1159, 1, 0, 0, 0, 1162, 1160, 1, 0, 0, 0, 1162, 1161, 1, 0, 0, 0, 1163, 203, 1, 0, 0, 0, 1164, 1169, 5, 34, 0, 0, 1165, 1168, 3, 188, 85, 0, 1166, 1168, 3, 190, 86, 0, 1167, 1165, 1, 0, 0, 0, 1167, 1166, 1, 0, 0, 0, 1168, 1171, 1, 0, 0, 0, 1169, 1167, 1, 0, 0, 0, 1169, 1170, 1, 0, 0, 0, 1170, 1172, 1, 0, 0, 0, 1171, 1169, 1, 0, 0, 0, 1172, 1194, 5, 34, 0, 0, 1173, 1174, 5, 34, 0, 0, 1174, 1175, 5, 34, 0, 0, 1175, 1176, 5, 34, 0, 0, 1176, 1180, 1, 0, 0, 0, 1177, 1179, 8, 0, 0, 0, 1178, 1177, 1, 0, 0, 0, 1179, 1182, 1, 0, 0, 0, 1180, 1181, 1, 0, 0, 0, 1180, 1178, 1, 0, 0, 0, 1181, 1183, 1, 0, 0, 0, 1182, 1180, 1, 0, 0, 0, 1183, 1184, 5, 34, 0, 0, 1184, 1185, 5, 34, 0, 0, 1185, 1186, 5, 34, 0, 0, 1186, 1188, 1, 0, 0, 0, 1187, 1189, 5, 34, 0, 0, 1188, 1187, 1, 0, 0, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1191, 1, 0, 0, 0, 1190, 1192, 5, 34, 0, 0, 1191, 1190, 1, 0, 0, 0, 1191, 1192, 1, 0, 0, 0, 1192, 1194, 1, 0, 0, 0, 1193, 1164, 1, 0, 0, 0, 1193, 1173, 1, 0, 0, 0, 1194, 205, 1, 0, 0, 0, 1195, 1197, 3, 184, 83, 0, 1196, 1195, 1, 0, 0, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1196, 1, 0, 0, 0, 1198, 1199, 1, 0, 0, 0, 1199, 207, 1, 0, 0, 0, 1200, 1202, 3, 184, 83, 0, 1201, 1200, 1, 0, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1201, 1, 0, 0, 0, 1203, 1204, 1, 0, 0, 0, 1204, 1205, 1, 0, 0, 0, 1205, 1209, 3, 228, 105, 0, 1206, 1208, 3, 184, 83, 0, 1207, 1206, 1, 0, 0, 0, 1208, 1211, 1, 0, 0, 0, 1209, 1207, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1243, 1, 0, 0, 0, 1211, 1209, 1, 0, 0, 0, 1212, 1214, 3, 228, 105, 0, 1213, 1215, 3, 184, 83, 0, 1214, 1213, 1, 0, 0, 0, 1215, 1216, 1, 0, 0, 0, 1216, 1214, 1, 0, 0, 0, 1216, 1217, 1, 0, 0, 0, 1217, 1243, 1, 0, 0, 0, 1218, 1220, 3, 184, 83, 0, 1219, 1218, 1, 0, 0, 0, 1220, 1221, 1, 0, 0, 0, 1221, 1219, 1, 0, 0, 0, 1221, 1222, 1, 0, 0, 0, 1222, 1230, 1, 0, 0, 0, 1223, 1227, 3, 228, 105, 0, 1224, 1226, 3, 184, 83, 0, 1225, 1224, 1, 0, 0, 0, 1226, 1229, 1, 0, 0, 0, 1227, 1225, 1, 0, 0, 0, 1227, 1228, 1, 0, 0, 0, 1228, 1231, 1, 0, 0, 0, 1229, 1227, 1, 0, 0, 0, 1230, 1223, 1, 0, 0, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 1, 0, 0, 0, 1232, 1233, 3, 192, 87, 0, 1233, 1243, 1, 0, 0, 0, 1234, 1236, 3, 228, 105, 0, 1235, 1237, 3, 184, 83, 0, 1236, 1235, 1, 0, 0, 0, 1237, 1238, 1, 0, 0, 0, 1238, 1236, 1, 0, 0, 0, 1238, 1239, 1, 0, 0, 0, 1239, 1240, 1, 0, 0, 0, 1240, 1241, 3, 192, 87, 0, 1241, 1243, 1, 0, 0, 0, 1242, 1201, 1, 0, 0, 0, 1242, 1212, 1, 0, 0, 0, 1242, 1219, 1, 0, 0, 0, 1242, 1234, 1, 0, 0, 0, 1243, 209, 1, 0, 0, 0, 1244, 1245, 7, 4, 0, 0, 1245, 1246, 7, 5, 0, 0, 1246, 1247, 7, 16, 0, 0, 1247, 211, 1, 0, 0, 0, 1248, 1249, 7, 4, 0, 0, 1249, 1250, 7, 17, 0, 0, 1250, 1251, 7, 2, 0, 0, 1251, 213, 1, 0, 0, 0, 1252, 1253, 5, 61, 0, 0, 1253, 215, 1, 0, 0, 0, 1254, 1255, 7, 31, 0, 0, 1255, 1256, 7, 32, 0, 0, 1256, 217, 1, 0, 0, 0, 1257, 1258, 5, 58, 0, 0, 1258, 1259, 5, 58, 0, 0, 1259, 219, 1, 0, 0, 0, 1260, 1261, 5, 58, 0, 0, 1261, 221, 1, 0, 0, 0, 1262, 1263, 5, 59, 0, 0, 1263, 223, 1, 0, 0, 0, 1264, 1265, 5, 44, 0, 0, 1265, 225, 1, 0, 0, 0, 1266, 1267, 7, 16, 0, 0, 1267, 1268, 7, 7, 0, 0, 1268, 1269, 7, 17, 0, 0, 1269, 1270, 7, 2, 0, 0, 1270, 227, 1, 0, 0, 0, 1271, 1272, 5, 46, 0, 0, 1272, 229, 1, 0, 0, 0, 1273, 1274, 7, 21, 0, 0, 1274, 1275, 7, 4, 0, 0, 1275, 1276, 7, 14, 0, 0, 1276, 1277, 7, 17, 0, 0, 1277, 1278, 7, 7, 0, 0, 1278, 231, 1, 0, 0, 0, 1279, 1280, 7, 21, 0, 0, 1280, 1281, 7, 10, 0, 0, 1281, 1282, 7, 12, 0, 0, 1282, 1283, 7, 17, 0, 0, 1283, 1284, 7, 11, 0, 0, 1284, 233, 1, 0, 0, 0, 1285, 1286, 7, 10, 0, 0, 1286, 1287, 7, 5, 0, 0, 1287, 235, 1, 0, 0, 0, 1288, 1289, 7, 10, 0, 0, 1289, 1290, 7, 17, 0, 0, 1290, 237, 1, 0, 0, 0, 1291, 1292, 7, 14, 0, 0, 1292, 1293, 7, 4, 0, 0, 1293, 1294, 7, 17, 0, 0, 1294, 1295, 7, 11, 0, 0, 1295, 239, 1, 0, 0, 0, 1296, 1297, 7, 14, 0, 0, 1297, 1298, 7, 10, 0, 0, 1298, 1299, 7, 19, 0, 0, 1299, 1300, 7, 7, 0, 0, 1300, 241, 1, 0, 0, 0, 1301, 1302, 7, 5, 0, 0, 1302, 1303, 7, 9, 0, 0, 1303, 1304, 7, 11, 0, 0, 1304, 243, 1, 0, 0, 0, 1305, 1306, 7, 5, 0, 0, 1306, 1307, 7, 22, 0, 0, 1307, 1308, 7, 14, 0, 0, 1308, 1309, 7, 14, 0, 0, 1309, 245, 1, 0, 0, 0, 1310, 1311, 7, 5, 0, 0, 1311, 1312, 7, 22, 0, 0, 1312, 1313, 7, 14, 0, 0, 1313, 1314, 7, 14, 0, 0, 1314, 1315, 7, 17, 0, 0, 1315, 247, 1, 0, 0, 0, 1316, 1317, 7, 9, 0, 0, 1317, 1318, 7, 5, 0, 0, 1318, 249, 1, 0, 0, 0, 1319, 1320, 7, 9, 0, 0, 1320, 1321, 7, 12, 0, 0, 1321, 251, 1, 0, 0, 0, 1322, 1323, 5, 63, 0, 0, 1323, 253, 1, 0, 0, 0, 1324, 1325, 7, 12, 0, 0, 1325, 1326, 7, 14, 0, 0, 1326, 1327, 7, 10, 0, 0, 1327, 1328, 7, 19, 0, 0, 1328, 1329, 7, 7, 0, 0, 1329, 255, 1, 0, 0, 0, 1330, 1331, 7, 11, 0, 0, 1331, 1332, 7, 12, 0, 0, 1332, 1333, 7, 22, 0, 0, 1333, 1334, 7, 7, 0, 0, 1334, 257, 1, 0, 0, 0, 1335, 1336, 7, 20, 0, 0, 1336, 1337, 7, 10, 0, 0, 1337, 1338, 7, 11, 0, 0, 1338, 1339, 7, 3, 0, 0, 1339, 259, 1, 0, 0, 0, 1340, 1341, 5, 61, 0, 0, 1341, 1342, 5, 61, 0, 0, 1342, 261, 1, 0, 0, 0, 1343, 1344, 5, 61, 0, 0, 1344, 1345, 5, 126, 0, 0, 1345, 263, 1, 0, 0, 0, 1346, 1347, 5, 33, 0, 0, 1347, 1348, 5, 61, 0, 0, 1348, 265, 1, 0, 0, 0, 1349, 1350, 5, 60, 0, 0, 1350, 267, 1, 0, 0, 0, 1351, 1352, 5, 60, 0, 0, 1352, 1353, 5, 61, 0, 0, 1353, 269, 1, 0, 0, 0, 1354, 1355, 5, 62, 0, 0, 1355, 271, 1, 0, 0, 0, 1356, 1357, 5, 62, 0, 0, 1357, 1358, 5, 61, 0, 0, 1358, 273, 1, 0, 0, 0, 1359, 1360, 5, 43, 0, 0, 1360, 275, 1, 0, 0, 0, 1361, 1362, 5, 45, 0, 0, 1362, 277, 1, 0, 0, 0, 1363, 1364, 5, 42, 0, 0, 1364, 279, 1, 0, 0, 0, 1365, 1366, 5, 47, 0, 0, 1366, 281, 1, 0, 0, 0, 1367, 1368, 5, 37, 0, 0, 1368, 283, 1, 0, 0, 0, 1369, 1370, 5, 123, 0, 0, 1370, 285, 1, 0, 0, 0, 1371, 1372, 5, 125, 0, 0, 1372, 287, 1, 0, 0, 0, 1373, 1374, 5, 63, 0, 0, 1374, 1375, 5, 63, 0, 0, 1375, 289, 1, 0, 0, 0, 1376, 1377, 3, 50, 16, 0, 1377, 1378, 1, 0, 0, 0, 1378, 1379, 6, 136, 39, 0, 1379, 291, 1, 0, 0, 0, 1380, 1383, 3, 252, 117, 0, 1381, 1384, 3, 186, 84, 0, 1382, 1384, 3, 200, 91, 0, 1383, 1381, 1, 0, 0, 0, 1383, 1382, 1, 0, 0, 0, 1384, 1388, 1, 0, 0, 0, 1385, 1387, 3, 202, 92, 0, 1386, 1385, 1, 0, 0, 0, 1387, 1390, 1, 0, 0, 0, 1388, 1386, 1, 0, 0, 0, 1388, 1389, 1, 0, 0, 0, 1389, 1398, 1, 0, 0, 0, 1390, 1388, 1, 0, 0, 0, 1391, 1393, 3, 252, 117, 0, 1392, 1394, 3, 184, 83, 0, 1393, 1392, 1, 0, 0, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1393, 1, 0, 0, 0, 1395, 1396, 1, 0, 0, 0, 1396, 1398, 1, 0, 0, 0, 1397, 1380, 1, 0, 0, 0, 1397, 1391, 1, 0, 0, 0, 1398, 293, 1, 0, 0, 0, 1399, 1402, 3, 288, 135, 0, 1400, 1403, 3, 186, 84, 0, 1401, 1403, 3, 200, 91, 0, 1402, 1400, 1, 0, 0, 0, 1402, 1401, 1, 0, 0, 0, 1403, 1407, 1, 0, 0, 0, 1404, 1406, 3, 202, 92, 0, 1405, 1404, 1, 0, 0, 0, 1406, 1409, 1, 0, 0, 0, 1407, 1405, 1, 0, 0, 0, 1407, 1408, 1, 0, 0, 0, 1408, 1417, 1, 0, 0, 0, 1409, 1407, 1, 0, 0, 0, 1410, 1412, 3, 288, 135, 0, 1411, 1413, 3, 184, 83, 0, 1412, 1411, 1, 0, 0, 0, 1413, 1414, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1414, 1415, 1, 0, 0, 0, 1415, 1417, 1, 0, 0, 0, 1416, 1399, 1, 0, 0, 0, 1416, 1410, 1, 0, 0, 0, 1417, 295, 1, 0, 0, 0, 1418, 1419, 5, 91, 0, 0, 1419, 1420, 1, 0, 0, 0, 1420, 1421, 6, 139, 4, 0, 1421, 1422, 6, 139, 4, 0, 1422, 297, 1, 0, 0, 0, 1423, 1424, 5, 93, 0, 0, 1424, 1425, 1, 0, 0, 0, 1425, 1426, 6, 140, 17, 0, 1426, 1427, 6, 140, 17, 0, 1427, 299, 1, 0, 0, 0, 1428, 1429, 5, 40, 0, 0, 1429, 1430, 1, 0, 0, 0, 1430, 1431, 6, 141, 4, 0, 1431, 1432, 6, 141, 4, 0, 1432, 301, 1, 0, 0, 0, 1433, 1434, 5, 41, 0, 0, 1434, 1435, 1, 0, 0, 0, 1435, 1436, 6, 142, 17, 0, 1436, 1437, 6, 142, 17, 0, 1437, 303, 1, 0, 0, 0, 1438, 1442, 3, 186, 84, 0, 1439, 1441, 3, 202, 92, 0, 1440, 1439, 1, 0, 0, 0, 1441, 1444, 1, 0, 0, 0, 1442, 1440, 1, 0, 0, 0, 1442, 1443, 1, 0, 0, 0, 1443, 1455, 1, 0, 0, 0, 1444, 1442, 1, 0, 0, 0, 1445, 1448, 3, 200, 91, 0, 1446, 1448, 3, 194, 88, 0, 1447, 1445, 1, 0, 0, 0, 1447, 1446, 1, 0, 0, 0, 1448, 1450, 1, 0, 0, 0, 1449, 1451, 3, 202, 92, 0, 1450, 1449, 1, 0, 0, 0, 1451, 1452, 1, 0, 0, 0, 1452, 1450, 1, 0, 0, 0, 1452, 1453, 1, 0, 0, 0, 1453, 1455, 1, 0, 0, 0, 1454, 1438, 1, 0, 0, 0, 1454, 1447, 1, 0, 0, 0, 1455, 305, 1, 0, 0, 0, 1456, 1458, 3, 196, 89, 0, 1457, 1459, 3, 198, 90, 0, 1458, 1457, 1, 0, 0, 0, 1459, 1460, 1, 0, 0, 0, 1460, 1458, 1, 0, 0, 0, 1460, 1461, 1, 0, 0, 0, 1461, 1462, 1, 0, 0, 0, 1462, 1463, 3, 196, 89, 0, 1463, 307, 1, 0, 0, 0, 1464, 1465, 3, 306, 144, 0, 1465, 309, 1, 0, 0, 0, 1466, 1467, 3, 18, 0, 0, 1467, 1468, 1, 0, 0, 0, 1468, 1469, 6, 146, 0, 0, 1469, 311, 1, 0, 0, 0, 1470, 1471, 3, 20, 1, 0, 1471, 1472, 1, 0, 0, 0, 1472, 1473, 6, 147, 0, 0, 1473, 313, 1, 0, 0, 0, 1474, 1475, 3, 22, 2, 0, 1475, 1476, 1, 0, 0, 0, 1476, 1477, 6, 148, 0, 0, 1477, 315, 1, 0, 0, 0, 1478, 1479, 3, 182, 82, 0, 1479, 1480, 1, 0, 0, 0, 1480, 1481, 6, 149, 16, 0, 1481, 1482, 6, 149, 17, 0, 1482, 317, 1, 0, 0, 0, 1483, 1484, 3, 220, 101, 0, 1484, 1485, 1, 0, 0, 0, 1485, 1486, 6, 150, 40, 0, 1486, 319, 1, 0, 0, 0, 1487, 1488, 3, 218, 100, 0, 1488, 1489, 1, 0, 0, 0, 1489, 1490, 6, 151, 41, 0, 1490, 321, 1, 0, 0, 0, 1491, 1492, 3, 224, 103, 0, 1492, 1493, 1, 0, 0, 0, 1493, 1494, 6, 152, 22, 0, 1494, 323, 1, 0, 0, 0, 1495, 1496, 3, 214, 98, 0, 1496, 1497, 1, 0, 0, 0, 1497, 1498, 6, 153, 31, 0, 1498, 325, 1, 0, 0, 0, 1499, 1500, 7, 15, 0, 0, 1500, 1501, 7, 7, 0, 0, 1501, 1502, 7, 11, 0, 0, 1502, 1503, 7, 4, 0, 0, 1503, 1504, 7, 16, 0, 0, 1504, 1505, 7, 4, 0, 0, 1505, 1506, 7, 11, 0, 0, 1506, 1507, 7, 4, 0, 0, 1507, 327, 1, 0, 0, 0, 1508, 1509, 3, 302, 142, 0, 1509, 1510, 1, 0, 0, 0, 1510, 1511, 6, 155, 18, 0, 1511, 1512, 6, 155, 17, 0, 1512, 329, 1, 0, 0, 0, 1513, 1517, 8, 33, 0, 0, 1514, 1515, 5, 47, 0, 0, 1515, 1517, 8, 34, 0, 0, 1516, 1513, 1, 0, 0, 0, 1516, 1514, 1, 0, 0, 0, 1517, 331, 1, 0, 0, 0, 1518, 1520, 3, 330, 156, 0, 1519, 1518, 1, 0, 0, 0, 1520, 1521, 1, 0, 0, 0, 1521, 1519, 1, 0, 0, 0, 1521, 1522, 1, 0, 0, 0, 1522, 333, 1, 0, 0, 0, 1523, 1524, 3, 332, 157, 0, 1524, 1525, 1, 0, 0, 0, 1525, 1526, 6, 158, 42, 0, 1526, 335, 1, 0, 0, 0, 1527, 1528, 3, 204, 93, 0, 1528, 1529, 1, 0, 0, 0, 1529, 1530, 6, 159, 30, 0, 1530, 337, 1, 0, 0, 0, 1531, 1532, 3, 18, 0, 0, 1532, 1533, 1, 0, 0, 0, 1533, 1534, 6, 160, 0, 0, 1534, 339, 1, 0, 0, 0, 1535, 1536, 3, 20, 1, 0, 1536, 1537, 1, 0, 0, 0, 1537, 1538, 6, 161, 0, 0, 1538, 341, 1, 0, 0, 0, 1539, 1540, 3, 22, 2, 0, 1540, 1541, 1, 0, 0, 0, 1541, 1542, 6, 162, 0, 0, 1542, 343, 1, 0, 0, 0, 1543, 1544, 3, 300, 141, 0, 1544, 1545, 1, 0, 0, 0, 1545, 1546, 6, 163, 37, 0, 1546, 1547, 6, 163, 38, 0, 1547, 345, 1, 0, 0, 0, 1548, 1549, 3, 302, 142, 0, 1549, 1550, 1, 0, 0, 0, 1550, 1551, 6, 164, 18, 0, 1551, 1552, 6, 164, 17, 0, 1552, 1553, 6, 164, 17, 0, 1553, 347, 1, 0, 0, 0, 1554, 1555, 3, 182, 82, 0, 1555, 1556, 1, 0, 0, 0, 1556, 1557, 6, 165, 16, 0, 1557, 1558, 6, 165, 17, 0, 1558, 349, 1, 0, 0, 0, 1559, 1560, 3, 22, 2, 0, 1560, 1561, 1, 0, 0, 0, 1561, 1562, 6, 166, 0, 0, 1562, 351, 1, 0, 0, 0, 1563, 1564, 3, 18, 0, 0, 1564, 1565, 1, 0, 0, 0, 1565, 1566, 6, 167, 0, 0, 1566, 353, 1, 0, 0, 0, 1567, 1568, 3, 20, 1, 0, 1568, 1569, 1, 0, 0, 0, 1569, 1570, 6, 168, 0, 0, 1570, 355, 1, 0, 0, 0, 1571, 1572, 3, 182, 82, 0, 1572, 1573, 1, 0, 0, 0, 1573, 1574, 6, 169, 16, 0, 1574, 1575, 6, 169, 17, 0, 1575, 357, 1, 0, 0, 0, 1576, 1577, 3, 302, 142, 0, 1577, 1578, 1, 0, 0, 0, 1578, 1579, 6, 170, 18, 0, 1579, 1580, 6, 170, 17, 0, 1580, 1581, 6, 170, 17, 0, 1581, 359, 1, 0, 0, 0, 1582, 1583, 3, 258, 120, 0, 1583, 1584, 1, 0, 0, 0, 1584, 1585, 6, 171, 28, 0, 1585, 1586, 6, 171, 17, 0, 1586, 1587, 6, 171, 4, 0, 1587, 361, 1, 0, 0, 0, 1588, 1589, 3, 224, 103, 0, 1589, 1590, 1, 0, 0, 0, 1590, 1591, 6, 172, 22, 0, 1591, 363, 1, 0, 0, 0, 1592, 1593, 3, 308, 145, 0, 1593, 1594, 1, 0, 0, 0, 1594, 1595, 6, 173, 25, 0, 1595, 365, 1, 0, 0, 0, 1596, 1597, 3, 304, 143, 0, 1597, 1598, 1, 0, 0, 0, 1598, 1599, 6, 174, 26, 0, 1599, 367, 1, 0, 0, 0, 1600, 1601, 3, 18, 0, 0, 1601, 1602, 1, 0, 0, 0, 1602, 1603, 6, 175, 0, 0, 1603, 369, 1, 0, 0, 0, 1604, 1605, 3, 20, 1, 0, 1605, 1606, 1, 0, 0, 0, 1606, 1607, 6, 176, 0, 0, 1607, 371, 1, 0, 0, 0, 1608, 1609, 3, 22, 2, 0, 1609, 1610, 1, 0, 0, 0, 1610, 1611, 6, 177, 0, 0, 1611, 373, 1, 0, 0, 0, 1612, 1613, 7, 17, 0, 0, 1613, 1614, 7, 11, 0, 0, 1614, 1615, 7, 4, 0, 0, 1615, 1616, 7, 11, 0, 0, 1616, 1617, 7, 17, 0, 0, 1617, 1618, 1, 0, 0, 0, 1618, 1619, 6, 178, 17, 0, 1619, 1620, 6, 178, 4, 0, 1620, 375, 1, 0, 0, 0, 1621, 1622, 3, 18, 0, 0, 1622, 1623, 1, 0, 0, 0, 1623, 1624, 6, 179, 0, 0, 1624, 377, 1, 0, 0, 0, 1625, 1626, 3, 20, 1, 0, 1626, 1627, 1, 0, 0, 0, 1627, 1628, 6, 180, 0, 0, 1628, 379, 1, 0, 0, 0, 1629, 1630, 3, 22, 2, 0, 1630, 1631, 1, 0, 0, 0, 1631, 1632, 6, 181, 0, 0, 1632, 381, 1, 0, 0, 0, 1633, 1634, 3, 182, 82, 0, 1634, 1635, 1, 0, 0, 0, 1635, 1636, 6, 182, 16, 0, 1636, 1637, 6, 182, 17, 0, 1637, 383, 1, 0, 0, 0, 1638, 1639, 7, 35, 0, 0, 1639, 1640, 7, 9, 0, 0, 1640, 1641, 7, 10, 0, 0, 1641, 1642, 7, 5, 0, 0, 1642, 385, 1, 0, 0, 0, 1643, 1644, 3, 524, 253, 0, 1644, 1645, 1, 0, 0, 0, 1645, 1646, 6, 184, 20, 0, 1646, 387, 1, 0, 0, 0, 1647, 1648, 3, 248, 115, 0, 1648, 1649, 1, 0, 0, 0, 1649, 1650, 6, 185, 19, 0, 1650, 1651, 6, 185, 17, 0, 1651, 1652, 6, 185, 4, 0, 1652, 389, 1, 0, 0, 0, 1653, 1654, 7, 22, 0, 0, 1654, 1655, 7, 17, 0, 0, 1655, 1656, 7, 10, 0, 0, 1656, 1657, 7, 5, 0, 0, 1657, 1658, 7, 6, 0, 0, 1658, 1659, 1, 0, 0, 0, 1659, 1660, 6, 186, 17, 0, 1660, 1661, 6, 186, 4, 0, 1661, 391, 1, 0, 0, 0, 1662, 1663, 3, 332, 157, 0, 1663, 1664, 1, 0, 0, 0, 1664, 1665, 6, 187, 42, 0, 1665, 393, 1, 0, 0, 0, 1666, 1667, 3, 204, 93, 0, 1667, 1668, 1, 0, 0, 0, 1668, 1669, 6, 188, 30, 0, 1669, 395, 1, 0, 0, 0, 1670, 1671, 3, 220, 101, 0, 1671, 1672, 1, 0, 0, 0, 1672, 1673, 6, 189, 40, 0, 1673, 397, 1, 0, 0, 0, 1674, 1675, 3, 18, 0, 0, 1675, 1676, 1, 0, 0, 0, 1676, 1677, 6, 190, 0, 0, 1677, 399, 1, 0, 0, 0, 1678, 1679, 3, 20, 1, 0, 1679, 1680, 1, 0, 0, 0, 1680, 1681, 6, 191, 0, 0, 1681, 401, 1, 0, 0, 0, 1682, 1683, 3, 22, 2, 0, 1683, 1684, 1, 0, 0, 0, 1684, 1685, 6, 192, 0, 0, 1685, 403, 1, 0, 0, 0, 1686, 1687, 3, 182, 82, 0, 1687, 1688, 1, 0, 0, 0, 1688, 1689, 6, 193, 16, 0, 1689, 1690, 6, 193, 17, 0, 1690, 405, 1, 0, 0, 0, 1691, 1692, 3, 302, 142, 0, 1692, 1693, 1, 0, 0, 0, 1693, 1694, 6, 194, 18, 0, 1694, 1695, 6, 194, 17, 0, 1695, 1696, 6, 194, 17, 0, 1696, 407, 1, 0, 0, 0, 1697, 1698, 3, 220, 101, 0, 1698, 1699, 1, 0, 0, 0, 1699, 1700, 6, 195, 40, 0, 1700, 409, 1, 0, 0, 0, 1701, 1702, 3, 224, 103, 0, 1702, 1703, 1, 0, 0, 0, 1703, 1704, 6, 196, 22, 0, 1704, 411, 1, 0, 0, 0, 1705, 1706, 3, 228, 105, 0, 1706, 1707, 1, 0, 0, 0, 1707, 1708, 6, 197, 21, 0, 1708, 413, 1, 0, 0, 0, 1709, 1710, 3, 248, 115, 0, 1710, 1711, 1, 0, 0, 0, 1711, 1712, 6, 198, 19, 0, 1712, 1713, 6, 198, 43, 0, 1713, 415, 1, 0, 0, 0, 1714, 1715, 3, 332, 157, 0, 1715, 1716, 1, 0, 0, 0, 1716, 1717, 6, 199, 42, 0, 1717, 417, 1, 0, 0, 0, 1718, 1719, 3, 204, 93, 0, 1719, 1720, 1, 0, 0, 0, 1720, 1721, 6, 200, 30, 0, 1721, 419, 1, 0, 0, 0, 1722, 1723, 3, 18, 0, 0, 1723, 1724, 1, 0, 0, 0, 1724, 1725, 6, 201, 0, 0, 1725, 421, 1, 0, 0, 0, 1726, 1727, 3, 20, 1, 0, 1727, 1728, 1, 0, 0, 0, 1728, 1729, 6, 202, 0, 0, 1729, 423, 1, 0, 0, 0, 1730, 1731, 3, 22, 2, 0, 1731, 1732, 1, 0, 0, 0, 1732, 1733, 6, 203, 0, 0, 1733, 425, 1, 0, 0, 0, 1734, 1735, 3, 182, 82, 0, 1735, 1736, 1, 0, 0, 0, 1736, 1737, 6, 204, 16, 0, 1737, 1738, 6, 204, 17, 0, 1738, 1739, 6, 204, 17, 0, 1739, 427, 1, 0, 0, 0, 1740, 1741, 3, 302, 142, 0, 1741, 1742, 1, 0, 0, 0, 1742, 1743, 6, 205, 18, 0, 1743, 1744, 6, 205, 17, 0, 1744, 1745, 6, 205, 17, 0, 1745, 1746, 6, 205, 17, 0, 1746, 429, 1, 0, 0, 0, 1747, 1748, 3, 224, 103, 0, 1748, 1749, 1, 0, 0, 0, 1749, 1750, 6, 206, 22, 0, 1750, 431, 1, 0, 0, 0, 1751, 1752, 3, 228, 105, 0, 1752, 1753, 1, 0, 0, 0, 1753, 1754, 6, 207, 21, 0, 1754, 433, 1, 0, 0, 0, 1755, 1756, 3, 494, 238, 0, 1756, 1757, 1, 0, 0, 0, 1757, 1758, 6, 208, 32, 0, 1758, 435, 1, 0, 0, 0, 1759, 1760, 3, 18, 0, 0, 1760, 1761, 1, 0, 0, 0, 1761, 1762, 6, 209, 0, 0, 1762, 437, 1, 0, 0, 0, 1763, 1764, 3, 20, 1, 0, 1764, 1765, 1, 0, 0, 0, 1765, 1766, 6, 210, 0, 0, 1766, 439, 1, 0, 0, 0, 1767, 1768, 3, 22, 2, 0, 1768, 1769, 1, 0, 0, 0, 1769, 1770, 6, 211, 0, 0, 1770, 441, 1, 0, 0, 0, 1771, 1772, 3, 182, 82, 0, 1772, 1773, 1, 0, 0, 0, 1773, 1774, 6, 212, 16, 0, 1774, 1775, 6, 212, 17, 0, 1775, 443, 1, 0, 0, 0, 1776, 1777, 3, 302, 142, 0, 1777, 1778, 1, 0, 0, 0, 1778, 1779, 6, 213, 18, 0, 1779, 1780, 6, 213, 17, 0, 1780, 1781, 6, 213, 17, 0, 1781, 445, 1, 0, 0, 0, 1782, 1783, 3, 296, 139, 0, 1783, 1784, 1, 0, 0, 0, 1784, 1785, 6, 214, 23, 0, 1785, 447, 1, 0, 0, 0, 1786, 1787, 3, 298, 140, 0, 1787, 1788, 1, 0, 0, 0, 1788, 1789, 6, 215, 24, 0, 1789, 449, 1, 0, 0, 0, 1790, 1791, 3, 228, 105, 0, 1791, 1792, 1, 0, 0, 0, 1792, 1793, 6, 216, 21, 0, 1793, 451, 1, 0, 0, 0, 1794, 1795, 3, 252, 117, 0, 1795, 1796, 1, 0, 0, 0, 1796, 1797, 6, 217, 33, 0, 1797, 453, 1, 0, 0, 0, 1798, 1799, 3, 292, 137, 0, 1799, 1800, 1, 0, 0, 0, 1800, 1801, 6, 218, 34, 0, 1801, 455, 1, 0, 0, 0, 1802, 1803, 3, 288, 135, 0, 1803, 1804, 1, 0, 0, 0, 1804, 1805, 6, 219, 35, 0, 1805, 457, 1, 0, 0, 0, 1806, 1807, 3, 294, 138, 0, 1807, 1808, 1, 0, 0, 0, 1808, 1809, 6, 220, 36, 0, 1809, 459, 1, 0, 0, 0, 1810, 1811, 3, 308, 145, 0, 1811, 1812, 1, 0, 0, 0, 1812, 1813, 6, 221, 25, 0, 1813, 461, 1, 0, 0, 0, 1814, 1815, 3, 304, 143, 0, 1815, 1816, 1, 0, 0, 0, 1816, 1817, 6, 222, 26, 0, 1817, 463, 1, 0, 0, 0, 1818, 1819, 3, 18, 0, 0, 1819, 1820, 1, 0, 0, 0, 1820, 1821, 6, 223, 0, 0, 1821, 465, 1, 0, 0, 0, 1822, 1823, 3, 20, 1, 0, 1823, 1824, 1, 0, 0, 0, 1824, 1825, 6, 224, 0, 0, 1825, 467, 1, 0, 0, 0, 1826, 1827, 3, 22, 2, 0, 1827, 1828, 1, 0, 0, 0, 1828, 1829, 6, 225, 0, 0, 1829, 469, 1, 0, 0, 0, 1830, 1831, 3, 182, 82, 0, 1831, 1832, 1, 0, 0, 0, 1832, 1833, 6, 226, 16, 0, 1833, 1834, 6, 226, 17, 0, 1834, 471, 1, 0, 0, 0, 1835, 1836, 3, 302, 142, 0, 1836, 1837, 1, 0, 0, 0, 1837, 1838, 6, 227, 18, 0, 1838, 1839, 6, 227, 17, 0, 1839, 1840, 6, 227, 17, 0, 1840, 473, 1, 0, 0, 0, 1841, 1842, 3, 228, 105, 0, 1842, 1843, 1, 0, 0, 0, 1843, 1844, 6, 228, 21, 0, 1844, 475, 1, 0, 0, 0, 1845, 1846, 3, 296, 139, 0, 1846, 1847, 1, 0, 0, 0, 1847, 1848, 6, 229, 23, 0, 1848, 477, 1, 0, 0, 0, 1849, 1850, 3, 298, 140, 0, 1850, 1851, 1, 0, 0, 0, 1851, 1852, 6, 230, 24, 0, 1852, 479, 1, 0, 0, 0, 1853, 1854, 3, 224, 103, 0, 1854, 1855, 1, 0, 0, 0, 1855, 1856, 6, 231, 22, 0, 1856, 481, 1, 0, 0, 0, 1857, 1858, 3, 252, 117, 0, 1858, 1859, 1, 0, 0, 0, 1859, 1860, 6, 232, 33, 0, 1860, 483, 1, 0, 0, 0, 1861, 1862, 3, 292, 137, 0, 1862, 1863, 1, 0, 0, 0, 1863, 1864, 6, 233, 34, 0, 1864, 485, 1, 0, 0, 0, 1865, 1866, 3, 288, 135, 0, 1866, 1867, 1, 0, 0, 0, 1867, 1868, 6, 234, 35, 0, 1868, 487, 1, 0, 0, 0, 1869, 1870, 3, 294, 138, 0, 1870, 1871, 1, 0, 0, 0, 1871, 1872, 6, 235, 36, 0, 1872, 489, 1, 0, 0, 0, 1873, 1878, 3, 186, 84, 0, 1874, 1878, 3, 184, 83, 0, 1875, 1878, 3, 200, 91, 0, 1876, 1878, 3, 278, 130, 0, 1877, 1873, 1, 0, 0, 0, 1877, 1874, 1, 0, 0, 0, 1877, 1875, 1, 0, 0, 0, 1877, 1876, 1, 0, 0, 0, 1878, 491, 1, 0, 0, 0, 1879, 1882, 3, 186, 84, 0, 1880, 1882, 3, 278, 130, 0, 1881, 1879, 1, 0, 0, 0, 1881, 1880, 1, 0, 0, 0, 1882, 1886, 1, 0, 0, 0, 1883, 1885, 3, 490, 236, 0, 1884, 1883, 1, 0, 0, 0, 1885, 1888, 1, 0, 0, 0, 1886, 1884, 1, 0, 0, 0, 1886, 1887, 1, 0, 0, 0, 1887, 1899, 1, 0, 0, 0, 1888, 1886, 1, 0, 0, 0, 1889, 1892, 3, 200, 91, 0, 1890, 1892, 3, 194, 88, 0, 1891, 1889, 1, 0, 0, 0, 1891, 1890, 1, 0, 0, 0, 1892, 1894, 1, 0, 0, 0, 1893, 1895, 3, 490, 236, 0, 1894, 1893, 1, 0, 0, 0, 1895, 1896, 1, 0, 0, 0, 1896, 1894, 1, 0, 0, 0, 1896, 1897, 1, 0, 0, 0, 1897, 1899, 1, 0, 0, 0, 1898, 1881, 1, 0, 0, 0, 1898, 1891, 1, 0, 0, 0, 1899, 493, 1, 0, 0, 0, 1900, 1903, 3, 492, 237, 0, 1901, 1903, 3, 306, 144, 0, 1902, 1900, 1, 0, 0, 0, 1902, 1901, 1, 0, 0, 0, 1903, 1904, 1, 0, 0, 0, 1904, 1902, 1, 0, 0, 0, 1904, 1905, 1, 0, 0, 0, 1905, 495, 1, 0, 0, 0, 1906, 1907, 3, 18, 0, 0, 1907, 1908, 1, 0, 0, 0, 1908, 1909, 6, 239, 0, 0, 1909, 497, 1, 0, 0, 0, 1910, 1911, 3, 20, 1, 0, 1911, 1912, 1, 0, 0, 0, 1912, 1913, 6, 240, 0, 0, 1913, 499, 1, 0, 0, 0, 1914, 1915, 3, 22, 2, 0, 1915, 1916, 1, 0, 0, 0, 1916, 1917, 6, 241, 0, 0, 1917, 501, 1, 0, 0, 0, 1918, 1919, 3, 182, 82, 0, 1919, 1920, 1, 0, 0, 0, 1920, 1921, 6, 242, 16, 0, 1921, 1922, 6, 242, 17, 0, 1922, 503, 1, 0, 0, 0, 1923, 1924, 3, 302, 142, 0, 1924, 1925, 1, 0, 0, 0, 1925, 1926, 6, 243, 18, 0, 1926, 1927, 6, 243, 17, 0, 1927, 1928, 6, 243, 17, 0, 1928, 505, 1, 0, 0, 0, 1929, 1930, 3, 296, 139, 0, 1930, 1931, 1, 0, 0, 0, 1931, 1932, 6, 244, 23, 0, 1932, 507, 1, 0, 0, 0, 1933, 1934, 3, 298, 140, 0, 1934, 1935, 1, 0, 0, 0, 1935, 1936, 6, 245, 24, 0, 1936, 509, 1, 0, 0, 0, 1937, 1938, 3, 214, 98, 0, 1938, 1939, 1, 0, 0, 0, 1939, 1940, 6, 246, 31, 0, 1940, 511, 1, 0, 0, 0, 1941, 1942, 3, 224, 103, 0, 1942, 1943, 1, 0, 0, 0, 1943, 1944, 6, 247, 22, 0, 1944, 513, 1, 0, 0, 0, 1945, 1946, 3, 228, 105, 0, 1946, 1947, 1, 0, 0, 0, 1947, 1948, 6, 248, 21, 0, 1948, 515, 1, 0, 0, 0, 1949, 1950, 3, 252, 117, 0, 1950, 1951, 1, 0, 0, 0, 1951, 1952, 6, 249, 33, 0, 1952, 517, 1, 0, 0, 0, 1953, 1954, 3, 292, 137, 0, 1954, 1955, 1, 0, 0, 0, 1955, 1956, 6, 250, 34, 0, 1956, 519, 1, 0, 0, 0, 1957, 1958, 3, 288, 135, 0, 1958, 1959, 1, 0, 0, 0, 1959, 1960, 6, 251, 35, 0, 1960, 521, 1, 0, 0, 0, 1961, 1962, 3, 294, 138, 0, 1962, 1963, 1, 0, 0, 0, 1963, 1964, 6, 252, 36, 0, 1964, 523, 1, 0, 0, 0, 1965, 1966, 7, 4, 0, 0, 1966, 1967, 7, 17, 0, 0, 1967, 525, 1, 0, 0, 0, 1968, 1969, 3, 494, 238, 0, 1969, 1970, 1, 0, 0, 0, 1970, 1971, 6, 254, 32, 0, 1971, 527, 1, 0, 0, 0, 1972, 1973, 3, 18, 0, 0, 1973, 1974, 1, 0, 0, 0, 1974, 1975, 6, 255, 0, 0, 1975, 529, 1, 0, 0, 0, 1976, 1977, 3, 20, 1, 0, 1977, 1978, 1, 0, 0, 0, 1978, 1979, 6, 256, 0, 0, 1979, 531, 1, 0, 0, 0, 1980, 1981, 3, 22, 2, 0, 1981, 1982, 1, 0, 0, 0, 1982, 1983, 6, 257, 0, 0, 1983, 533, 1, 0, 0, 0, 1984, 1985, 3, 256, 119, 0, 1985, 1986, 1, 0, 0, 0, 1986, 1987, 6, 258, 44, 0, 1987, 535, 1, 0, 0, 0, 1988, 1989, 3, 230, 106, 0, 1989, 1990, 1, 0, 0, 0, 1990, 1991, 6, 259, 45, 0, 1991, 537, 1, 0, 0, 0, 1992, 1993, 3, 244, 113, 0, 1993, 1994, 1, 0, 0, 0, 1994, 1995, 6, 260, 46, 0, 1995, 539, 1, 0, 0, 0, 1996, 1997, 3, 222, 102, 0, 1997, 1998, 1, 0, 0, 0, 1998, 1999, 6, 261, 47, 0, 1999, 2000, 6, 261, 17, 0, 2000, 541, 1, 0, 0, 0, 2001, 2002, 3, 214, 98, 0, 2002, 2003, 1, 0, 0, 0, 2003, 2004, 6, 262, 31, 0, 2004, 543, 1, 0, 0, 0, 2005, 2006, 3, 204, 93, 0, 2006, 2007, 1, 0, 0, 0, 2007, 2008, 6, 263, 30, 0, 2008, 545, 1, 0, 0, 0, 2009, 2010, 3, 304, 143, 0, 2010, 2011, 1, 0, 0, 0, 2011, 2012, 6, 264, 26, 0, 2012, 547, 1, 0, 0, 0, 2013, 2014, 3, 308, 145, 0, 2014, 2015, 1, 0, 0, 0, 2015, 2016, 6, 265, 25, 0, 2016, 549, 1, 0, 0, 0, 2017, 2018, 3, 208, 95, 0, 2018, 2019, 1, 0, 0, 0, 2019, 2020, 6, 266, 48, 0, 2020, 551, 1, 0, 0, 0, 2021, 2022, 3, 206, 94, 0, 2022, 2023, 1, 0, 0, 0, 2023, 2024, 6, 267, 49, 0, 2024, 553, 1, 0, 0, 0, 2025, 2026, 3, 224, 103, 0, 2026, 2027, 1, 0, 0, 0, 2027, 2028, 6, 268, 22, 0, 2028, 555, 1, 0, 0, 0, 2029, 2030, 3, 228, 105, 0, 2030, 2031, 1, 0, 0, 0, 2031, 2032, 6, 269, 21, 0, 2032, 557, 1, 0, 0, 0, 2033, 2034, 3, 252, 117, 0, 2034, 2035, 1, 0, 0, 0, 2035, 2036, 6, 270, 33, 0, 2036, 559, 1, 0, 0, 0, 2037, 2038, 3, 292, 137, 0, 2038, 2039, 1, 0, 0, 0, 2039, 2040, 6, 271, 34, 0, 2040, 561, 1, 0, 0, 0, 2041, 2042, 3, 288, 135, 0, 2042, 2043, 1, 0, 0, 0, 2043, 2044, 6, 272, 35, 0, 2044, 563, 1, 0, 0, 0, 2045, 2046, 3, 294, 138, 0, 2046, 2047, 1, 0, 0, 0, 2047, 2048, 6, 273, 36, 0, 2048, 565, 1, 0, 0, 0, 2049, 2050, 3, 296, 139, 0, 2050, 2051, 1, 0, 0, 0, 2051, 2052, 6, 274, 23, 0, 2052, 567, 1, 0, 0, 0, 2053, 2054, 3, 298, 140, 0, 2054, 2055, 1, 0, 0, 0, 2055, 2056, 6, 275, 24, 0, 2056, 569, 1, 0, 0, 0, 2057, 2058, 3, 494, 238, 0, 2058, 2059, 1, 0, 0, 0, 2059, 2060, 6, 276, 32, 0, 2060, 571, 1, 0, 0, 0, 2061, 2062, 3, 18, 0, 0, 2062, 2063, 1, 0, 0, 0, 2063, 2064, 6, 277, 0, 0, 2064, 573, 1, 0, 0, 0, 2065, 2066, 3, 20, 1, 0, 2066, 2067, 1, 0, 0, 0, 2067, 2068, 6, 278, 0, 0, 2068, 575, 1, 0, 0, 0, 2069, 2070, 3, 22, 2, 0, 2070, 2071, 1, 0, 0, 0, 2071, 2072, 6, 279, 0, 0, 2072, 577, 1, 0, 0, 0, 2073, 2074, 3, 182, 82, 0, 2074, 2075, 1, 0, 0, 0, 2075, 2076, 6, 280, 16, 0, 2076, 2077, 6, 280, 17, 0, 2077, 579, 1, 0, 0, 0, 2078, 2079, 7, 10, 0, 0, 2079, 2080, 7, 5, 0, 0, 2080, 2081, 7, 21, 0, 0, 2081, 2082, 7, 9, 0, 0, 2082, 581, 1, 0, 0, 0, 2083, 2084, 3, 18, 0, 0, 2084, 2085, 1, 0, 0, 0, 2085, 2086, 6, 282, 0, 0, 2086, 583, 1, 0, 0, 0, 2087, 2088, 3, 20, 1, 0, 2088, 2089, 1, 0, 0, 0, 2089, 2090, 6, 283, 0, 0, 2090, 585, 1, 0, 0, 0, 2091, 2092, 3, 22, 2, 0, 2092, 2093, 1, 0, 0, 0, 2093, 2094, 6, 284, 0, 0, 2094, 587, 1, 0, 0, 0, 70, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 594, 598, 601, 610, 612, 623, 915, 1000, 1004, 1009, 1141, 1146, 1155, 1162, 1167, 1169, 1180, 1188, 1191, 1193, 1198, 1203, 1209, 1216, 1221, 1227, 1230, 1238, 1242, 1383, 1388, 1395, 1397, 1402, 1407, 1414, 1416, 1442, 1447, 1452, 1454, 1460, 1516, 1521, 1877, 1881, 1886, 1891, 1896, 1898, 1902, 1904, 50, 0, 1, 0, 5, 1, 0, 5, 2, 0, 5, 4, 0, 5, 5, 0, 5, 6, 0, 5, 7, 0, 5, 8, 0, 5, 9, 0, 5, 10, 0, 5, 11, 0, 5, 13, 0, 5, 14, 0, 5, 15, 0, 5, 16, 0, 5, 17, 0, 7, 50, 0, 4, 0, 0, 7, 99, 0, 7, 73, 0, 7, 138, 0, 7, 63, 0, 7, 61, 0, 7, 96, 0, 7, 97, 0, 7, 101, 0, 7, 100, 0, 5, 3, 0, 7, 78, 0, 7, 40, 0, 7, 51, 0, 7, 56, 0, 7, 134, 0, 7, 75, 0, 7, 94, 0, 7, 93, 0, 7, 95, 0, 7, 98, 0, 5, 0, 0, 7, 17, 0, 7, 59, 0, 7, 58, 0, 7, 106, 0, 5, 12, 0, 7, 77, 0, 7, 64, 0, 7, 71, 0, 7, 60, 0, 7, 53, 0, 7, 52, 0] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java index 0cd0141731fd3..b441a73cf51f0 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java @@ -27,38 +27,39 @@ public class EsqlBaseLexer extends LexerConfig { public static final int LINE_COMMENT=1, MULTILINE_COMMENT=2, WS=3, CHANGE_POINT=4, ENRICH=5, DEV_EXPLAIN=6, COMPLETION=7, DISSECT=8, EVAL=9, GROK=10, LIMIT=11, RERANK=12, ROW=13, - SAMPLE=14, SORT=15, STATS=16, WHERE=17, DEV_INLINESTATS=18, FROM=19, TS=20, - FORK=21, DEV_FUSE=22, JOIN_LOOKUP=23, DEV_JOIN_FULL=24, DEV_JOIN_LEFT=25, - DEV_JOIN_RIGHT=26, DEV_LOOKUP=27, MV_EXPAND=28, DROP=29, KEEP=30, DEV_INSIST=31, - RENAME=32, SET=33, SHOW=34, UNKNOWN_CMD=35, CHANGE_POINT_LINE_COMMENT=36, - CHANGE_POINT_MULTILINE_COMMENT=37, CHANGE_POINT_WS=38, ENRICH_POLICY_NAME=39, - ENRICH_LINE_COMMENT=40, ENRICH_MULTILINE_COMMENT=41, ENRICH_WS=42, ENRICH_FIELD_LINE_COMMENT=43, - ENRICH_FIELD_MULTILINE_COMMENT=44, ENRICH_FIELD_WS=45, EXPLAIN_WS=46, - EXPLAIN_LINE_COMMENT=47, EXPLAIN_MULTILINE_COMMENT=48, PIPE=49, QUOTED_STRING=50, - INTEGER_LITERAL=51, DECIMAL_LITERAL=52, AND=53, ASC=54, ASSIGN=55, BY=56, - CAST_OP=57, COLON=58, SEMICOLON=59, COMMA=60, DESC=61, DOT=62, FALSE=63, - FIRST=64, IN=65, IS=66, LAST=67, LIKE=68, NOT=69, NULL=70, NULLS=71, ON=72, - OR=73, PARAM=74, RLIKE=75, TRUE=76, WITH=77, EQ=78, CIEQ=79, NEQ=80, LT=81, - LTE=82, GT=83, GTE=84, PLUS=85, MINUS=86, ASTERISK=87, SLASH=88, PERCENT=89, - LEFT_BRACES=90, RIGHT_BRACES=91, DOUBLE_PARAMS=92, NAMED_OR_POSITIONAL_PARAM=93, - NAMED_OR_POSITIONAL_DOUBLE_PARAMS=94, OPENING_BRACKET=95, CLOSING_BRACKET=96, - LP=97, RP=98, UNQUOTED_IDENTIFIER=99, QUOTED_IDENTIFIER=100, EXPR_LINE_COMMENT=101, - EXPR_MULTILINE_COMMENT=102, EXPR_WS=103, METADATA=104, UNQUOTED_SOURCE=105, - FROM_LINE_COMMENT=106, FROM_MULTILINE_COMMENT=107, FROM_WS=108, FORK_WS=109, - FORK_LINE_COMMENT=110, FORK_MULTILINE_COMMENT=111, FUSE_LINE_COMMENT=112, - FUSE_MULTILINE_COMMENT=113, FUSE_WS=114, JOIN=115, USING=116, JOIN_LINE_COMMENT=117, - JOIN_MULTILINE_COMMENT=118, JOIN_WS=119, LOOKUP_LINE_COMMENT=120, LOOKUP_MULTILINE_COMMENT=121, - LOOKUP_WS=122, LOOKUP_FIELD_LINE_COMMENT=123, LOOKUP_FIELD_MULTILINE_COMMENT=124, - LOOKUP_FIELD_WS=125, MVEXPAND_LINE_COMMENT=126, MVEXPAND_MULTILINE_COMMENT=127, - MVEXPAND_WS=128, ID_PATTERN=129, PROJECT_LINE_COMMENT=130, PROJECT_MULTILINE_COMMENT=131, - PROJECT_WS=132, AS=133, RENAME_LINE_COMMENT=134, RENAME_MULTILINE_COMMENT=135, - RENAME_WS=136, SET_LINE_COMMENT=137, SET_MULTILINE_COMMENT=138, SET_WS=139, - INFO=140, SHOW_LINE_COMMENT=141, SHOW_MULTILINE_COMMENT=142, SHOW_WS=143; + SAMPLE=14, SORT=15, STATS=16, WHERE=17, FROM=18, TS=19, FORK=20, DEV_FUSE=21, + DEV_INLINE=22, DEV_INLINESTATS=23, JOIN_LOOKUP=24, DEV_JOIN_FULL=25, DEV_JOIN_LEFT=26, + DEV_JOIN_RIGHT=27, DEV_LOOKUP=28, MV_EXPAND=29, DROP=30, KEEP=31, DEV_INSIST=32, + RENAME=33, SET=34, SHOW=35, UNKNOWN_CMD=36, CHANGE_POINT_LINE_COMMENT=37, + CHANGE_POINT_MULTILINE_COMMENT=38, CHANGE_POINT_WS=39, ENRICH_POLICY_NAME=40, + ENRICH_LINE_COMMENT=41, ENRICH_MULTILINE_COMMENT=42, ENRICH_WS=43, ENRICH_FIELD_LINE_COMMENT=44, + ENRICH_FIELD_MULTILINE_COMMENT=45, ENRICH_FIELD_WS=46, EXPLAIN_WS=47, + EXPLAIN_LINE_COMMENT=48, EXPLAIN_MULTILINE_COMMENT=49, PIPE=50, QUOTED_STRING=51, + INTEGER_LITERAL=52, DECIMAL_LITERAL=53, AND=54, ASC=55, ASSIGN=56, BY=57, + CAST_OP=58, COLON=59, SEMICOLON=60, COMMA=61, DESC=62, DOT=63, FALSE=64, + FIRST=65, IN=66, IS=67, LAST=68, LIKE=69, NOT=70, NULL=71, NULLS=72, ON=73, + OR=74, PARAM=75, RLIKE=76, TRUE=77, WITH=78, EQ=79, CIEQ=80, NEQ=81, LT=82, + LTE=83, GT=84, GTE=85, PLUS=86, MINUS=87, ASTERISK=88, SLASH=89, PERCENT=90, + LEFT_BRACES=91, RIGHT_BRACES=92, DOUBLE_PARAMS=93, NAMED_OR_POSITIONAL_PARAM=94, + NAMED_OR_POSITIONAL_DOUBLE_PARAMS=95, OPENING_BRACKET=96, CLOSING_BRACKET=97, + LP=98, RP=99, UNQUOTED_IDENTIFIER=100, QUOTED_IDENTIFIER=101, EXPR_LINE_COMMENT=102, + EXPR_MULTILINE_COMMENT=103, EXPR_WS=104, METADATA=105, UNQUOTED_SOURCE=106, + FROM_LINE_COMMENT=107, FROM_MULTILINE_COMMENT=108, FROM_WS=109, FORK_WS=110, + FORK_LINE_COMMENT=111, FORK_MULTILINE_COMMENT=112, FUSE_LINE_COMMENT=113, + FUSE_MULTILINE_COMMENT=114, FUSE_WS=115, INLINE_STATS=116, INLINE_LINE_COMMENT=117, + INLINE_MULTILINE_COMMENT=118, INLINE_WS=119, JOIN=120, USING=121, JOIN_LINE_COMMENT=122, + JOIN_MULTILINE_COMMENT=123, JOIN_WS=124, LOOKUP_LINE_COMMENT=125, LOOKUP_MULTILINE_COMMENT=126, + LOOKUP_WS=127, LOOKUP_FIELD_LINE_COMMENT=128, LOOKUP_FIELD_MULTILINE_COMMENT=129, + LOOKUP_FIELD_WS=130, MVEXPAND_LINE_COMMENT=131, MVEXPAND_MULTILINE_COMMENT=132, + MVEXPAND_WS=133, ID_PATTERN=134, PROJECT_LINE_COMMENT=135, PROJECT_MULTILINE_COMMENT=136, + PROJECT_WS=137, AS=138, RENAME_LINE_COMMENT=139, RENAME_MULTILINE_COMMENT=140, + RENAME_WS=141, SET_LINE_COMMENT=142, SET_MULTILINE_COMMENT=143, SET_WS=144, + INFO=145, SHOW_LINE_COMMENT=146, SHOW_MULTILINE_COMMENT=147, SHOW_WS=148; public static final int CHANGE_POINT_MODE=1, ENRICH_MODE=2, ENRICH_FIELD_MODE=3, EXPLAIN_MODE=4, - EXPRESSION_MODE=5, FROM_MODE=6, FORK_MODE=7, FUSE_MODE=8, JOIN_MODE=9, - LOOKUP_MODE=10, LOOKUP_FIELD_MODE=11, MVEXPAND_MODE=12, PROJECT_MODE=13, - RENAME_MODE=14, SET_MODE=15, SHOW_MODE=16; + EXPRESSION_MODE=5, FROM_MODE=6, FORK_MODE=7, FUSE_MODE=8, INLINE_MODE=9, + JOIN_MODE=10, LOOKUP_MODE=11, LOOKUP_FIELD_MODE=12, MVEXPAND_MODE=13, + PROJECT_MODE=14, RENAME_MODE=15, SET_MODE=16, SHOW_MODE=17; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -66,16 +67,16 @@ public class EsqlBaseLexer extends LexerConfig { public static String[] modeNames = { "DEFAULT_MODE", "CHANGE_POINT_MODE", "ENRICH_MODE", "ENRICH_FIELD_MODE", "EXPLAIN_MODE", "EXPRESSION_MODE", "FROM_MODE", "FORK_MODE", "FUSE_MODE", - "JOIN_MODE", "LOOKUP_MODE", "LOOKUP_FIELD_MODE", "MVEXPAND_MODE", "PROJECT_MODE", - "RENAME_MODE", "SET_MODE", "SHOW_MODE" + "INLINE_MODE", "JOIN_MODE", "LOOKUP_MODE", "LOOKUP_FIELD_MODE", "MVEXPAND_MODE", + "PROJECT_MODE", "RENAME_MODE", "SET_MODE", "SHOW_MODE" }; private static String[] makeRuleNames() { return new String[] { "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "CHANGE_POINT", "ENRICH", "DEV_EXPLAIN", "COMPLETION", "DISSECT", "EVAL", "GROK", "LIMIT", "RERANK", - "ROW", "SAMPLE", "SORT", "STATS", "WHERE", "DEV_INLINESTATS", "FROM", - "TS", "FORK", "DEV_FUSE", "JOIN_LOOKUP", "DEV_JOIN_FULL", "DEV_JOIN_LEFT", + "ROW", "SAMPLE", "SORT", "STATS", "WHERE", "FROM", "TS", "FORK", "DEV_FUSE", + "DEV_INLINE", "DEV_INLINESTATS", "JOIN_LOOKUP", "DEV_JOIN_FULL", "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "DEV_LOOKUP", "MV_EXPAND", "DROP", "KEEP", "DEV_INSIST", "RENAME", "SET", "SHOW", "UNKNOWN_CMD", "CHANGE_POINT_PIPE", "CHANGE_POINT_RP", "CHANGE_POINT_ON", "CHANGE_POINT_AS", "CHANGE_POINT_DOT", "CHANGE_POINT_COMMA", @@ -108,7 +109,8 @@ private static String[] makeRuleNames() { "FROM_WS", "FORK_LP", "FORK_RP", "FORK_PIPE", "FORK_WS", "FORK_LINE_COMMENT", "FORK_MULTILINE_COMMENT", "FUSE_PIPE", "FUSE_RP", "FUSE_WITH", "FUSE_COMMA", "FUSE_QUOTED_IDENTIFIER", "FUSE_UNQUOTED_IDENTIFIER", "FUSE_LINE_COMMENT", - "FUSE_MULTILINE_COMMENT", "FUSE_WS", "JOIN_PIPE", "JOIN", "JOIN_AS", + "FUSE_MULTILINE_COMMENT", "FUSE_WS", "INLINE_STATS", "INLINE_LINE_COMMENT", + "INLINE_MULTILINE_COMMENT", "INLINE_WS", "JOIN_PIPE", "JOIN", "JOIN_AS", "JOIN_ON", "USING", "JOIN_UNQUOTED_SOURCE", "JOIN_QUOTED_SOURCE", "JOIN_COLON", "JOIN_LINE_COMMENT", "JOIN_MULTILINE_COMMENT", "JOIN_WS", "LOOKUP_PIPE", "LOOKUP_RP", "LOOKUP_COLON", "LOOKUP_COMMA", "LOOKUP_DOT", "LOOKUP_ON", @@ -145,7 +147,7 @@ private static String[] makeLiteralNames() { return new String[] { null, null, null, null, "'change_point'", "'enrich'", null, "'completion'", "'dissect'", "'eval'", "'grok'", "'limit'", "'rerank'", "'row'", "'sample'", - "'sort'", "'stats'", "'where'", null, "'from'", "'ts'", "'fork'", null, + "'sort'", null, "'where'", "'from'", "'ts'", "'fork'", null, null, null, "'lookup'", null, null, null, null, "'mv_expand'", "'drop'", "'keep'", null, "'rename'", "'set'", "'show'", null, null, null, null, null, null, null, null, null, null, null, null, null, null, "'|'", null, null, null, @@ -155,9 +157,9 @@ private static String[] makeLiteralNames() { "'=='", "'=~'", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", "'??'", null, null, null, "']'", null, "')'", null, null, null, null, null, "'metadata'", null, null, null, null, null, - null, null, null, null, null, "'join'", "'USING'", null, null, null, + null, null, null, null, null, null, null, null, null, "'join'", "'USING'", null, null, null, null, null, null, null, null, null, null, null, null, - null, "'as'", null, null, null, null, null, null, "'info'" + null, null, null, null, "'as'", null, null, null, null, null, null, "'info'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -165,8 +167,8 @@ private static String[] makeSymbolicNames() { return new String[] { null, "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "CHANGE_POINT", "ENRICH", "DEV_EXPLAIN", "COMPLETION", "DISSECT", "EVAL", "GROK", "LIMIT", "RERANK", - "ROW", "SAMPLE", "SORT", "STATS", "WHERE", "DEV_INLINESTATS", "FROM", - "TS", "FORK", "DEV_FUSE", "JOIN_LOOKUP", "DEV_JOIN_FULL", "DEV_JOIN_LEFT", + "ROW", "SAMPLE", "SORT", "STATS", "WHERE", "FROM", "TS", "FORK", "DEV_FUSE", + "DEV_INLINE", "DEV_INLINESTATS", "JOIN_LOOKUP", "DEV_JOIN_FULL", "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "DEV_LOOKUP", "MV_EXPAND", "DROP", "KEEP", "DEV_INSIST", "RENAME", "SET", "SHOW", "UNKNOWN_CMD", "CHANGE_POINT_LINE_COMMENT", "CHANGE_POINT_MULTILINE_COMMENT", "CHANGE_POINT_WS", "ENRICH_POLICY_NAME", @@ -183,7 +185,8 @@ private static String[] makeSymbolicNames() { "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", "FORK_WS", "FORK_LINE_COMMENT", "FORK_MULTILINE_COMMENT", "FUSE_LINE_COMMENT", - "FUSE_MULTILINE_COMMENT", "FUSE_WS", "JOIN", "USING", "JOIN_LINE_COMMENT", + "FUSE_MULTILINE_COMMENT", "FUSE_WS", "INLINE_STATS", "INLINE_LINE_COMMENT", + "INLINE_MULTILINE_COMMENT", "INLINE_WS", "JOIN", "USING", "JOIN_LINE_COMMENT", "JOIN_MULTILINE_COMMENT", "JOIN_WS", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", "LOOKUP_WS", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", "LOOKUP_FIELD_WS", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", @@ -257,19 +260,21 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { case 5: return DEV_EXPLAIN_sempred((RuleContext)_localctx, predIndex); - case 17: - return DEV_INLINESTATS_sempred((RuleContext)_localctx, predIndex); - case 21: + case 20: return DEV_FUSE_sempred((RuleContext)_localctx, predIndex); - case 23: - return DEV_JOIN_FULL_sempred((RuleContext)_localctx, predIndex); + case 21: + return DEV_INLINE_sempred((RuleContext)_localctx, predIndex); + case 22: + return DEV_INLINESTATS_sempred((RuleContext)_localctx, predIndex); case 24: - return DEV_JOIN_LEFT_sempred((RuleContext)_localctx, predIndex); + return DEV_JOIN_FULL_sempred((RuleContext)_localctx, predIndex); case 25: - return DEV_JOIN_RIGHT_sempred((RuleContext)_localctx, predIndex); + return DEV_JOIN_LEFT_sempred((RuleContext)_localctx, predIndex); case 26: + return DEV_JOIN_RIGHT_sempred((RuleContext)_localctx, predIndex); + case 27: return DEV_LOOKUP_sempred((RuleContext)_localctx, predIndex); - case 30: + case 31: return DEV_INSIST_sempred((RuleContext)_localctx, predIndex); } return true; @@ -281,159 +286,168 @@ private boolean DEV_EXPLAIN_sempred(RuleContext _localctx, int predIndex) { } return true; } - private boolean DEV_INLINESTATS_sempred(RuleContext _localctx, int predIndex) { + private boolean DEV_FUSE_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 1: return this.isDevVersion(); } return true; } - private boolean DEV_FUSE_sempred(RuleContext _localctx, int predIndex) { + private boolean DEV_INLINE_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 2: return this.isDevVersion(); } return true; } - private boolean DEV_JOIN_FULL_sempred(RuleContext _localctx, int predIndex) { + private boolean DEV_INLINESTATS_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 3: return this.isDevVersion(); } return true; } - private boolean DEV_JOIN_LEFT_sempred(RuleContext _localctx, int predIndex) { + private boolean DEV_JOIN_FULL_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 4: return this.isDevVersion(); } return true; } - private boolean DEV_JOIN_RIGHT_sempred(RuleContext _localctx, int predIndex) { + private boolean DEV_JOIN_LEFT_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 5: return this.isDevVersion(); } return true; } - private boolean DEV_LOOKUP_sempred(RuleContext _localctx, int predIndex) { + private boolean DEV_JOIN_RIGHT_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 6: return this.isDevVersion(); } return true; } - private boolean DEV_INSIST_sempred(RuleContext _localctx, int predIndex) { + private boolean DEV_LOOKUP_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 7: return this.isDevVersion(); } return true; } + private boolean DEV_INSIST_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 8: + return this.isDevVersion(); + } + return true; + } public static final String _serializedATN = - "\u0004\u0000\u008f\u0805\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ + "\u0004\u0000\u0094\u082f\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ - "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002"+ - "\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002"+ - "\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002"+ - "\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002"+ - "\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e"+ - "\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011"+ - "\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014"+ - "\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017"+ - "\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a"+ - "\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d"+ - "\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!"+ - "\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002"+ - "&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002"+ - "+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u0002"+ - "0\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u0002"+ - "5\u00075\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002"+ - ":\u0007:\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002"+ - "?\u0007?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002"+ - "D\u0007D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002"+ - "I\u0007I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002"+ - "N\u0007N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002"+ - "S\u0007S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002"+ - "X\u0007X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002"+ - "]\u0007]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002"+ - "b\u0007b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002"+ - "g\u0007g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002"+ - "l\u0007l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002"+ - "q\u0007q\u0002r\u0007r\u0002s\u0007s\u0002t\u0007t\u0002u\u0007u\u0002"+ - "v\u0007v\u0002w\u0007w\u0002x\u0007x\u0002y\u0007y\u0002z\u0007z\u0002"+ - "{\u0007{\u0002|\u0007|\u0002}\u0007}\u0002~\u0007~\u0002\u007f\u0007\u007f"+ - "\u0002\u0080\u0007\u0080\u0002\u0081\u0007\u0081\u0002\u0082\u0007\u0082"+ - "\u0002\u0083\u0007\u0083\u0002\u0084\u0007\u0084\u0002\u0085\u0007\u0085"+ - "\u0002\u0086\u0007\u0086\u0002\u0087\u0007\u0087\u0002\u0088\u0007\u0088"+ - "\u0002\u0089\u0007\u0089\u0002\u008a\u0007\u008a\u0002\u008b\u0007\u008b"+ - "\u0002\u008c\u0007\u008c\u0002\u008d\u0007\u008d\u0002\u008e\u0007\u008e"+ - "\u0002\u008f\u0007\u008f\u0002\u0090\u0007\u0090\u0002\u0091\u0007\u0091"+ - "\u0002\u0092\u0007\u0092\u0002\u0093\u0007\u0093\u0002\u0094\u0007\u0094"+ - "\u0002\u0095\u0007\u0095\u0002\u0096\u0007\u0096\u0002\u0097\u0007\u0097"+ - "\u0002\u0098\u0007\u0098\u0002\u0099\u0007\u0099\u0002\u009a\u0007\u009a"+ - "\u0002\u009b\u0007\u009b\u0002\u009c\u0007\u009c\u0002\u009d\u0007\u009d"+ - "\u0002\u009e\u0007\u009e\u0002\u009f\u0007\u009f\u0002\u00a0\u0007\u00a0"+ - "\u0002\u00a1\u0007\u00a1\u0002\u00a2\u0007\u00a2\u0002\u00a3\u0007\u00a3"+ - "\u0002\u00a4\u0007\u00a4\u0002\u00a5\u0007\u00a5\u0002\u00a6\u0007\u00a6"+ - "\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002\u00a9\u0007\u00a9"+ - "\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002\u00ac\u0007\u00ac"+ - "\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0002\u00af\u0007\u00af"+ - "\u0002\u00b0\u0007\u00b0\u0002\u00b1\u0007\u00b1\u0002\u00b2\u0007\u00b2"+ - "\u0002\u00b3\u0007\u00b3\u0002\u00b4\u0007\u00b4\u0002\u00b5\u0007\u00b5"+ - "\u0002\u00b6\u0007\u00b6\u0002\u00b7\u0007\u00b7\u0002\u00b8\u0007\u00b8"+ - "\u0002\u00b9\u0007\u00b9\u0002\u00ba\u0007\u00ba\u0002\u00bb\u0007\u00bb"+ - "\u0002\u00bc\u0007\u00bc\u0002\u00bd\u0007\u00bd\u0002\u00be\u0007\u00be"+ - "\u0002\u00bf\u0007\u00bf\u0002\u00c0\u0007\u00c0\u0002\u00c1\u0007\u00c1"+ - "\u0002\u00c2\u0007\u00c2\u0002\u00c3\u0007\u00c3\u0002\u00c4\u0007\u00c4"+ - "\u0002\u00c5\u0007\u00c5\u0002\u00c6\u0007\u00c6\u0002\u00c7\u0007\u00c7"+ - "\u0002\u00c8\u0007\u00c8\u0002\u00c9\u0007\u00c9\u0002\u00ca\u0007\u00ca"+ - "\u0002\u00cb\u0007\u00cb\u0002\u00cc\u0007\u00cc\u0002\u00cd\u0007\u00cd"+ - "\u0002\u00ce\u0007\u00ce\u0002\u00cf\u0007\u00cf\u0002\u00d0\u0007\u00d0"+ - "\u0002\u00d1\u0007\u00d1\u0002\u00d2\u0007\u00d2\u0002\u00d3\u0007\u00d3"+ - "\u0002\u00d4\u0007\u00d4\u0002\u00d5\u0007\u00d5\u0002\u00d6\u0007\u00d6"+ - "\u0002\u00d7\u0007\u00d7\u0002\u00d8\u0007\u00d8\u0002\u00d9\u0007\u00d9"+ - "\u0002\u00da\u0007\u00da\u0002\u00db\u0007\u00db\u0002\u00dc\u0007\u00dc"+ - "\u0002\u00dd\u0007\u00dd\u0002\u00de\u0007\u00de\u0002\u00df\u0007\u00df"+ - "\u0002\u00e0\u0007\u00e0\u0002\u00e1\u0007\u00e1\u0002\u00e2\u0007\u00e2"+ - "\u0002\u00e3\u0007\u00e3\u0002\u00e4\u0007\u00e4\u0002\u00e5\u0007\u00e5"+ - "\u0002\u00e6\u0007\u00e6\u0002\u00e7\u0007\u00e7\u0002\u00e8\u0007\u00e8"+ - "\u0002\u00e9\u0007\u00e9\u0002\u00ea\u0007\u00ea\u0002\u00eb\u0007\u00eb"+ - "\u0002\u00ec\u0007\u00ec\u0002\u00ed\u0007\u00ed\u0002\u00ee\u0007\u00ee"+ - "\u0002\u00ef\u0007\u00ef\u0002\u00f0\u0007\u00f0\u0002\u00f1\u0007\u00f1"+ - "\u0002\u00f2\u0007\u00f2\u0002\u00f3\u0007\u00f3\u0002\u00f4\u0007\u00f4"+ - "\u0002\u00f5\u0007\u00f5\u0002\u00f6\u0007\u00f6\u0002\u00f7\u0007\u00f7"+ - "\u0002\u00f8\u0007\u00f8\u0002\u00f9\u0007\u00f9\u0002\u00fa\u0007\u00fa"+ - "\u0002\u00fb\u0007\u00fb\u0002\u00fc\u0007\u00fc\u0002\u00fd\u0007\u00fd"+ - "\u0002\u00fe\u0007\u00fe\u0002\u00ff\u0007\u00ff\u0002\u0100\u0007\u0100"+ - "\u0002\u0101\u0007\u0101\u0002\u0102\u0007\u0102\u0002\u0103\u0007\u0103"+ - "\u0002\u0104\u0007\u0104\u0002\u0105\u0007\u0105\u0002\u0106\u0007\u0106"+ - "\u0002\u0107\u0007\u0107\u0002\u0108\u0007\u0108\u0002\u0109\u0007\u0109"+ - "\u0002\u010a\u0007\u010a\u0002\u010b\u0007\u010b\u0002\u010c\u0007\u010c"+ - "\u0002\u010d\u0007\u010d\u0002\u010e\u0007\u010e\u0002\u010f\u0007\u010f"+ - "\u0002\u0110\u0007\u0110\u0002\u0111\u0007\u0111\u0002\u0112\u0007\u0112"+ - "\u0002\u0113\u0007\u0113\u0002\u0114\u0007\u0114\u0002\u0115\u0007\u0115"+ - "\u0002\u0116\u0007\u0116\u0002\u0117\u0007\u0117\u0001\u0000\u0001\u0000"+ - "\u0001\u0000\u0001\u0000\u0005\u0000\u0246\b\u0000\n\u0000\f\u0000\u0249"+ - "\t\u0000\u0001\u0000\u0003\u0000\u024c\b\u0000\u0001\u0000\u0003\u0000"+ - "\u024f\b\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0005\u0001\u0258\b\u0001\n\u0001\f\u0001\u025b"+ - "\t\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0002\u0004\u0002\u0263\b\u0002\u000b\u0002\f\u0002\u0264\u0001\u0002"+ - "\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004"+ - "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ - "\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+ - "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+ - "\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001"+ + "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ + "\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003"+ + "\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006"+ + "\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002"+ + "\n\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ + "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002"+ + "\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002"+ + "\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002"+ + "\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002"+ + "\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002"+ + "\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002"+ + " \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002"+ + "%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002"+ + "*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002"+ + "/\u0007/\u00020\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u0002"+ + "4\u00074\u00025\u00075\u00026\u00076\u00027\u00077\u00028\u00078\u0002"+ + "9\u00079\u0002:\u0007:\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002"+ + ">\u0007>\u0002?\u0007?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002"+ + "C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002"+ + "H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002"+ + "M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002"+ + "R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002"+ + "W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002"+ + "\\\u0007\\\u0002]\u0007]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002"+ + "a\u0007a\u0002b\u0007b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002"+ + "f\u0007f\u0002g\u0007g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002"+ + "k\u0007k\u0002l\u0007l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002"+ + "p\u0007p\u0002q\u0007q\u0002r\u0007r\u0002s\u0007s\u0002t\u0007t\u0002"+ + "u\u0007u\u0002v\u0007v\u0002w\u0007w\u0002x\u0007x\u0002y\u0007y\u0002"+ + "z\u0007z\u0002{\u0007{\u0002|\u0007|\u0002}\u0007}\u0002~\u0007~\u0002"+ + "\u007f\u0007\u007f\u0002\u0080\u0007\u0080\u0002\u0081\u0007\u0081\u0002"+ + "\u0082\u0007\u0082\u0002\u0083\u0007\u0083\u0002\u0084\u0007\u0084\u0002"+ + "\u0085\u0007\u0085\u0002\u0086\u0007\u0086\u0002\u0087\u0007\u0087\u0002"+ + "\u0088\u0007\u0088\u0002\u0089\u0007\u0089\u0002\u008a\u0007\u008a\u0002"+ + "\u008b\u0007\u008b\u0002\u008c\u0007\u008c\u0002\u008d\u0007\u008d\u0002"+ + "\u008e\u0007\u008e\u0002\u008f\u0007\u008f\u0002\u0090\u0007\u0090\u0002"+ + "\u0091\u0007\u0091\u0002\u0092\u0007\u0092\u0002\u0093\u0007\u0093\u0002"+ + "\u0094\u0007\u0094\u0002\u0095\u0007\u0095\u0002\u0096\u0007\u0096\u0002"+ + "\u0097\u0007\u0097\u0002\u0098\u0007\u0098\u0002\u0099\u0007\u0099\u0002"+ + "\u009a\u0007\u009a\u0002\u009b\u0007\u009b\u0002\u009c\u0007\u009c\u0002"+ + "\u009d\u0007\u009d\u0002\u009e\u0007\u009e\u0002\u009f\u0007\u009f\u0002"+ + "\u00a0\u0007\u00a0\u0002\u00a1\u0007\u00a1\u0002\u00a2\u0007\u00a2\u0002"+ + "\u00a3\u0007\u00a3\u0002\u00a4\u0007\u00a4\u0002\u00a5\u0007\u00a5\u0002"+ + "\u00a6\u0007\u00a6\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002"+ + "\u00a9\u0007\u00a9\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002"+ + "\u00ac\u0007\u00ac\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0002"+ + "\u00af\u0007\u00af\u0002\u00b0\u0007\u00b0\u0002\u00b1\u0007\u00b1\u0002"+ + "\u00b2\u0007\u00b2\u0002\u00b3\u0007\u00b3\u0002\u00b4\u0007\u00b4\u0002"+ + "\u00b5\u0007\u00b5\u0002\u00b6\u0007\u00b6\u0002\u00b7\u0007\u00b7\u0002"+ + "\u00b8\u0007\u00b8\u0002\u00b9\u0007\u00b9\u0002\u00ba\u0007\u00ba\u0002"+ + "\u00bb\u0007\u00bb\u0002\u00bc\u0007\u00bc\u0002\u00bd\u0007\u00bd\u0002"+ + "\u00be\u0007\u00be\u0002\u00bf\u0007\u00bf\u0002\u00c0\u0007\u00c0\u0002"+ + "\u00c1\u0007\u00c1\u0002\u00c2\u0007\u00c2\u0002\u00c3\u0007\u00c3\u0002"+ + "\u00c4\u0007\u00c4\u0002\u00c5\u0007\u00c5\u0002\u00c6\u0007\u00c6\u0002"+ + "\u00c7\u0007\u00c7\u0002\u00c8\u0007\u00c8\u0002\u00c9\u0007\u00c9\u0002"+ + "\u00ca\u0007\u00ca\u0002\u00cb\u0007\u00cb\u0002\u00cc\u0007\u00cc\u0002"+ + "\u00cd\u0007\u00cd\u0002\u00ce\u0007\u00ce\u0002\u00cf\u0007\u00cf\u0002"+ + "\u00d0\u0007\u00d0\u0002\u00d1\u0007\u00d1\u0002\u00d2\u0007\u00d2\u0002"+ + "\u00d3\u0007\u00d3\u0002\u00d4\u0007\u00d4\u0002\u00d5\u0007\u00d5\u0002"+ + "\u00d6\u0007\u00d6\u0002\u00d7\u0007\u00d7\u0002\u00d8\u0007\u00d8\u0002"+ + "\u00d9\u0007\u00d9\u0002\u00da\u0007\u00da\u0002\u00db\u0007\u00db\u0002"+ + "\u00dc\u0007\u00dc\u0002\u00dd\u0007\u00dd\u0002\u00de\u0007\u00de\u0002"+ + "\u00df\u0007\u00df\u0002\u00e0\u0007\u00e0\u0002\u00e1\u0007\u00e1\u0002"+ + "\u00e2\u0007\u00e2\u0002\u00e3\u0007\u00e3\u0002\u00e4\u0007\u00e4\u0002"+ + "\u00e5\u0007\u00e5\u0002\u00e6\u0007\u00e6\u0002\u00e7\u0007\u00e7\u0002"+ + "\u00e8\u0007\u00e8\u0002\u00e9\u0007\u00e9\u0002\u00ea\u0007\u00ea\u0002"+ + "\u00eb\u0007\u00eb\u0002\u00ec\u0007\u00ec\u0002\u00ed\u0007\u00ed\u0002"+ + "\u00ee\u0007\u00ee\u0002\u00ef\u0007\u00ef\u0002\u00f0\u0007\u00f0\u0002"+ + "\u00f1\u0007\u00f1\u0002\u00f2\u0007\u00f2\u0002\u00f3\u0007\u00f3\u0002"+ + "\u00f4\u0007\u00f4\u0002\u00f5\u0007\u00f5\u0002\u00f6\u0007\u00f6\u0002"+ + "\u00f7\u0007\u00f7\u0002\u00f8\u0007\u00f8\u0002\u00f9\u0007\u00f9\u0002"+ + "\u00fa\u0007\u00fa\u0002\u00fb\u0007\u00fb\u0002\u00fc\u0007\u00fc\u0002"+ + "\u00fd\u0007\u00fd\u0002\u00fe\u0007\u00fe\u0002\u00ff\u0007\u00ff\u0002"+ + "\u0100\u0007\u0100\u0002\u0101\u0007\u0101\u0002\u0102\u0007\u0102\u0002"+ + "\u0103\u0007\u0103\u0002\u0104\u0007\u0104\u0002\u0105\u0007\u0105\u0002"+ + "\u0106\u0007\u0106\u0002\u0107\u0007\u0107\u0002\u0108\u0007\u0108\u0002"+ + "\u0109\u0007\u0109\u0002\u010a\u0007\u010a\u0002\u010b\u0007\u010b\u0002"+ + "\u010c\u0007\u010c\u0002\u010d\u0007\u010d\u0002\u010e\u0007\u010e\u0002"+ + "\u010f\u0007\u010f\u0002\u0110\u0007\u0110\u0002\u0111\u0007\u0111\u0002"+ + "\u0112\u0007\u0112\u0002\u0113\u0007\u0113\u0002\u0114\u0007\u0114\u0002"+ + "\u0115\u0007\u0115\u0002\u0116\u0007\u0116\u0002\u0117\u0007\u0117\u0002"+ + "\u0118\u0007\u0118\u0002\u0119\u0007\u0119\u0002\u011a\u0007\u011a\u0002"+ + "\u011b\u0007\u011b\u0002\u011c\u0007\u011c\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0005\u0000\u0251\b\u0000\n\u0000\f\u0000\u0254\t\u0000"+ + "\u0001\u0000\u0003\u0000\u0257\b\u0000\u0001\u0000\u0003\u0000\u025a\b"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0005\u0001\u0263\b\u0001\n\u0001\f\u0001\u0266\t\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002"+ + "\u0004\u0002\u026e\b\u0002\u000b\u0002\f\u0002\u026f\u0001\u0002\u0001"+ + "\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b"+ + "\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001"+ "\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ "\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f"+ @@ -443,1257 +457,1283 @@ private boolean DEV_INSIST_sempred(RuleContext _localctx, int predIndex) { "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ "\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ - "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ - "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014"+ - "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015"+ "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ - "\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ - "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017"+ + "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ - "\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019"+ "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ + "\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b"+ "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c"+ "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ - "\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ - "\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e"+ "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ - "\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001"+ - " \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ - "!\u0001!\u0001\"\u0004\"\u037d\b\"\u000b\"\f\"\u037e\u0001\"\u0001\"\u0001"+ - "#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001"+ - "$\u0001%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001"+ - "\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001"+ - ")\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001,\u0001"+ - ",\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001"+ - ".\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u0001"+ - "1\u00011\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u0001"+ - "2\u00013\u00013\u00013\u00013\u00013\u00014\u00014\u00015\u00045\u03d2"+ - "\b5\u000b5\f5\u03d3\u00015\u00015\u00035\u03d8\b5\u00015\u00045\u03db"+ - "\b5\u000b5\f5\u03dc\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u0001"+ - "7\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u00019\u0001:\u0001"+ - ":\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001"+ - "<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001"+ - ">\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001"+ - "@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001"+ - "C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001"+ - "E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001"+ - "H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001"+ - "J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001"+ - "L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001"+ - "O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001"+ - "Q\u0001Q\u0001R\u0001R\u0001S\u0001S\u0001T\u0001T\u0001T\u0001U\u0001"+ - "U\u0001V\u0001V\u0003V\u0461\bV\u0001V\u0004V\u0464\bV\u000bV\fV\u0465"+ - "\u0001W\u0001W\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0003Y\u046f\bY\u0001"+ - "Z\u0001Z\u0001[\u0001[\u0001[\u0003[\u0476\b[\u0001\\\u0001\\\u0001\\"+ - "\u0005\\\u047b\b\\\n\\\f\\\u047e\t\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+ - "\\\u0001\\\u0005\\\u0486\b\\\n\\\f\\\u0489\t\\\u0001\\\u0001\\\u0001\\"+ - "\u0001\\\u0001\\\u0003\\\u0490\b\\\u0001\\\u0003\\\u0493\b\\\u0003\\\u0495"+ - "\b\\\u0001]\u0004]\u0498\b]\u000b]\f]\u0499\u0001^\u0004^\u049d\b^\u000b"+ - "^\f^\u049e\u0001^\u0001^\u0005^\u04a3\b^\n^\f^\u04a6\t^\u0001^\u0001^"+ - "\u0004^\u04aa\b^\u000b^\f^\u04ab\u0001^\u0004^\u04af\b^\u000b^\f^\u04b0"+ - "\u0001^\u0001^\u0005^\u04b5\b^\n^\f^\u04b8\t^\u0003^\u04ba\b^\u0001^\u0001"+ - "^\u0001^\u0001^\u0004^\u04c0\b^\u000b^\f^\u04c1\u0001^\u0001^\u0003^\u04c6"+ - "\b^\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001a\u0001"+ - "a\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001d\u0001d\u0001e\u0001"+ - "e\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001"+ - "i\u0001i\u0001i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0001"+ - "j\u0001j\u0001k\u0001k\u0001k\u0001l\u0001l\u0001l\u0001m\u0001m\u0001"+ - "m\u0001m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001"+ - "o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001p\u0001q\u0001q\u0001q\u0001"+ - "q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001t\u0001"+ - "t\u0001u\u0001u\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001"+ - "v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001"+ - "y\u0001y\u0001y\u0001z\u0001z\u0001z\u0001{\u0001{\u0001|\u0001|\u0001"+ - "|\u0001}\u0001}\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u0080"+ - "\u0001\u0080\u0001\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0083"+ - "\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0086"+ - "\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087"+ - "\u0001\u0088\u0001\u0088\u0001\u0088\u0003\u0088\u0553\b\u0088\u0001\u0088"+ - "\u0005\u0088\u0556\b\u0088\n\u0088\f\u0088\u0559\t\u0088\u0001\u0088\u0001"+ - "\u0088\u0004\u0088\u055d\b\u0088\u000b\u0088\f\u0088\u055e\u0003\u0088"+ - "\u0561\b\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0003\u0089\u0566\b"+ - "\u0089\u0001\u0089\u0005\u0089\u0569\b\u0089\n\u0089\f\u0089\u056c\t\u0089"+ - "\u0001\u0089\u0001\u0089\u0004\u0089\u0570\b\u0089\u000b\u0089\f\u0089"+ - "\u0571\u0003\u0089\u0574\b\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001"+ - "\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001"+ - "\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001"+ - "\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008e\u0001"+ - "\u008e\u0005\u008e\u058c\b\u008e\n\u008e\f\u008e\u058f\t\u008e\u0001\u008e"+ - "\u0001\u008e\u0003\u008e\u0593\b\u008e\u0001\u008e\u0004\u008e\u0596\b"+ - "\u008e\u000b\u008e\f\u008e\u0597\u0003\u008e\u059a\b\u008e\u0001\u008f"+ - "\u0001\u008f\u0004\u008f\u059e\b\u008f\u000b\u008f\f\u008f\u059f\u0001"+ - "\u008f\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0001"+ - "\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001"+ - "\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094\u0001"+ - "\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001\u0095\u0001\u0095\u0001"+ - "\u0095\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0001"+ - "\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001"+ - "\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+ - "\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001"+ - "\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0003"+ - "\u009b\u05d8\b\u009b\u0001\u009c\u0004\u009c\u05db\b\u009c\u000b\u009c"+ - "\f\u009c\u05dc\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e"+ - "\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f"+ - "\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1"+ - "\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2"+ - "\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ + "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0001\"\u0001#\u0004#\u0392\b#\u000b#\f#\u0393\u0001#\u0001"+ + "#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001"+ + "%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001"+ + "*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001"+ + "-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001"+ + "/\u0001/\u00010\u00010\u00010\u00010\u00011\u00011\u00011\u00011\u0001"+ + "1\u00012\u00012\u00012\u00012\u00012\u00012\u00013\u00013\u00013\u0001"+ + "3\u00013\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u00016\u0004"+ + "6\u03e7\b6\u000b6\f6\u03e8\u00016\u00016\u00036\u03ed\b6\u00016\u0004"+ + "6\u03f0\b6\u000b6\f6\u03f1\u00017\u00017\u00017\u00017\u00018\u00018\u0001"+ + "8\u00018\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001"+ + ";\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001"+ + "=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001"+ + ">\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001A\u0001"+ + "A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001"+ + "C\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001F\u0001"+ + "F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001"+ + "H\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001K\u0001"+ + "K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001"+ + "M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001"+ + "O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001"+ + "R\u0001R\u0001R\u0001S\u0001S\u0001T\u0001T\u0001U\u0001U\u0001U\u0001"+ + "V\u0001V\u0001W\u0001W\u0003W\u0476\bW\u0001W\u0004W\u0479\bW\u000bW\f"+ + "W\u047a\u0001X\u0001X\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0003Z\u0484"+ + "\bZ\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0003\\\u048b\b\\\u0001]\u0001"+ + "]\u0001]\u0005]\u0490\b]\n]\f]\u0493\t]\u0001]\u0001]\u0001]\u0001]\u0001"+ + "]\u0001]\u0005]\u049b\b]\n]\f]\u049e\t]\u0001]\u0001]\u0001]\u0001]\u0001"+ + "]\u0003]\u04a5\b]\u0001]\u0003]\u04a8\b]\u0003]\u04aa\b]\u0001^\u0004"+ + "^\u04ad\b^\u000b^\f^\u04ae\u0001_\u0004_\u04b2\b_\u000b_\f_\u04b3\u0001"+ + "_\u0001_\u0005_\u04b8\b_\n_\f_\u04bb\t_\u0001_\u0001_\u0004_\u04bf\b_"+ + "\u000b_\f_\u04c0\u0001_\u0004_\u04c4\b_\u000b_\f_\u04c5\u0001_\u0001_"+ + "\u0005_\u04ca\b_\n_\f_\u04cd\t_\u0003_\u04cf\b_\u0001_\u0001_\u0001_\u0001"+ + "_\u0004_\u04d5\b_\u000b_\f_\u04d6\u0001_\u0001_\u0003_\u04db\b_\u0001"+ + "`\u0001`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001"+ + "c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001e\u0001e\u0001f\u0001f\u0001"+ + "g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001j\u0001"+ + "j\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001k\u0001"+ + "k\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001n\u0001n\u0001n\u0001"+ + "n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001"+ + "p\u0001q\u0001q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001"+ + "r\u0001r\u0001s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001u\u0001u\u0001"+ + "v\u0001v\u0001v\u0001v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001"+ + "w\u0001x\u0001x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001z\u0001"+ + "z\u0001z\u0001{\u0001{\u0001{\u0001|\u0001|\u0001}\u0001}\u0001}\u0001"+ + "~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001"+ + "\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001"+ + "\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001"+ + "\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088\u0001"+ + "\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0003\u0089\u0568\b\u0089\u0001"+ + "\u0089\u0005\u0089\u056b\b\u0089\n\u0089\f\u0089\u056e\t\u0089\u0001\u0089"+ + "\u0001\u0089\u0004\u0089\u0572\b\u0089\u000b\u0089\f\u0089\u0573\u0003"+ + "\u0089\u0576\b\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0003\u008a\u057b"+ + "\b\u008a\u0001\u008a\u0005\u008a\u057e\b\u008a\n\u008a\f\u008a\u0581\t"+ + "\u008a\u0001\u008a\u0001\u008a\u0004\u008a\u0585\b\u008a\u000b\u008a\f"+ + "\u008a\u0586\u0003\u008a\u0589\b\u008a\u0001\u008b\u0001\u008b\u0001\u008b"+ + "\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c"+ + "\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d"+ + "\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008f"+ + "\u0001\u008f\u0005\u008f\u05a1\b\u008f\n\u008f\f\u008f\u05a4\t\u008f\u0001"+ + "\u008f\u0001\u008f\u0003\u008f\u05a8\b\u008f\u0001\u008f\u0004\u008f\u05ab"+ + "\b\u008f\u000b\u008f\f\u008f\u05ac\u0003\u008f\u05af\b\u008f\u0001\u0090"+ + "\u0001\u0090\u0004\u0090\u05b3\b\u0090\u000b\u0090\f\u0090\u05b4\u0001"+ + "\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001"+ + "\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001"+ + "\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001\u0095\u0001"+ + "\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0001\u0096\u0001"+ + "\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001"+ + "\u0098\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+ + "\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001"+ + "\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001"+ + "\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0003"+ + "\u009c\u05ed\b\u009c\u0001\u009d\u0004\u009d\u05f0\b\u009d\u000b\u009d"+ + "\f\u009d\u05f1\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f"+ + "\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0"+ + "\u0001\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a2"+ + "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3"+ "\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4"+ - "\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6"+ - "\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ - "\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8"+ - "\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9"+ + "\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ + "\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7"+ + "\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8"+ + "\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9"+ "\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ - "\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac"+ - "\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ - "\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af"+ - "\u0001\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0"+ - "\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2"+ - "\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3"+ - "\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4"+ - "\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5"+ - "\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6"+ - "\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7"+ + "\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ + "\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad"+ + "\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae"+ + "\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0"+ + "\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1"+ + "\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2"+ + "\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3"+ + "\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5"+ + "\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6"+ + "\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7"+ "\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9"+ - "\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba"+ - "\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc"+ + "\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba"+ + "\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba"+ + "\u0001\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb"+ "\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd"+ - "\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be"+ - "\u0001\u00be\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf"+ - "\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001\u00c1"+ - "\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001\u00c2"+ + "\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be"+ + "\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0"+ + "\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c1"+ + "\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2"+ "\u0001\u00c2\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c4"+ "\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c5\u0001\u00c5\u0001\u00c5"+ - "\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c7"+ - "\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c8"+ - "\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8"+ - "\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00ca\u0001\u00ca"+ - "\u0001\u00ca\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb"+ - "\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cd\u0001\u00cd"+ - "\u0001\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001\u00ce\u0001\u00ce"+ - "\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00d0"+ - "\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d1"+ - "\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001\u00d2\u0001\u00d2\u0001\u00d2"+ - "\u0001\u00d2\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d4"+ - "\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5\u0001\u00d5\u0001\u00d5"+ - "\u0001\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d7"+ - "\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8\u0001\u00d8\u0001\u00d8"+ - "\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00da"+ - "\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00db\u0001\u00db\u0001\u00db"+ - "\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dd"+ + "\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c6"+ + "\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c8\u0001\u00c8"+ + "\u0001\u00c8\u0001\u00c8\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9"+ + "\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00cb\u0001\u00cb"+ + "\u0001\u00cb\u0001\u00cb\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc"+ + "\u0001\u00cc\u0001\u00cc\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd"+ + "\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001\u00ce"+ + "\u0001\u00ce\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00d0"+ + "\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1"+ + "\u0001\u00d1\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d3"+ + "\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d4\u0001\u00d4\u0001\u00d4"+ + "\u0001\u00d4\u0001\u00d4\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d5"+ + "\u0001\u00d5\u0001\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6"+ + "\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8\u0001\u00d8"+ + "\u0001\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00d9"+ + "\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00db\u0001\u00db"+ + "\u0001\u00db\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc"+ "\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00de\u0001\u00de"+ - "\u0001\u00de\u0001\u00de\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df"+ - "\u0001\u00df\u0001\u00df\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0"+ - "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e2\u0001\u00e2"+ - "\u0001\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e3"+ - "\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e5\u0001\u00e5"+ - "\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6\u0001\u00e6\u0001\u00e6"+ - "\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0003\u00e7\u072c\b\u00e7"+ - "\u0001\u00e8\u0001\u00e8\u0003\u00e8\u0730\b\u00e8\u0001\u00e8\u0005\u00e8"+ - "\u0733\b\u00e8\n\u00e8\f\u00e8\u0736\t\u00e8\u0001\u00e8\u0001\u00e8\u0003"+ - "\u00e8\u073a\b\u00e8\u0001\u00e8\u0004\u00e8\u073d\b\u00e8\u000b\u00e8"+ - "\f\u00e8\u073e\u0003\u00e8\u0741\b\u00e8\u0001\u00e9\u0001\u00e9\u0004"+ - "\u00e9\u0745\b\u00e9\u000b\u00e9\f\u00e9\u0746\u0001\u00ea\u0001\u00ea"+ - "\u0001\u00ea\u0001\u00ea\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00eb"+ - "\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ed\u0001\u00ed"+ - "\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ee\u0001\u00ee\u0001\u00ee"+ - "\u0001\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ef\u0001\u00ef\u0001\u00ef"+ - "\u0001\u00ef\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f1"+ - "\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f2\u0001\u00f2\u0001\u00f2"+ - "\u0001\u00f2\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f4"+ - "\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f5\u0001\u00f5\u0001\u00f5"+ - "\u0001\u00f5\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f7"+ - "\u0001\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f8\u0001\u00f8\u0001\u00f8"+ - "\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00fa\u0001\u00fa"+ - "\u0001\u00fa\u0001\u00fa\u0001\u00fb\u0001\u00fb\u0001\u00fb\u0001\u00fb"+ - "\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd\u0001\u00fd"+ - "\u0001\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001\u00fe"+ - "\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u0100\u0001\u0100"+ + "\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00df"+ + "\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e1\u0001\u00e1"+ + "\u0001\u00e1\u0001\u00e1\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e2"+ + "\u0001\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e3"+ + "\u0001\u00e3\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e5"+ + "\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6\u0001\u00e6"+ + "\u0001\u00e6\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e8"+ + "\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e9\u0001\u00e9\u0001\u00e9"+ + "\u0001\u00e9\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00eb"+ + "\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00ec\u0001\u00ec\u0001\u00ec"+ + "\u0001\u00ec\u0003\u00ec\u0756\b\u00ec\u0001\u00ed\u0001\u00ed\u0003\u00ed"+ + "\u075a\b\u00ed\u0001\u00ed\u0005\u00ed\u075d\b\u00ed\n\u00ed\f\u00ed\u0760"+ + "\t\u00ed\u0001\u00ed\u0001\u00ed\u0003\u00ed\u0764\b\u00ed\u0001\u00ed"+ + "\u0004\u00ed\u0767\b\u00ed\u000b\u00ed\f\u00ed\u0768\u0003\u00ed\u076b"+ + "\b\u00ed\u0001\u00ee\u0001\u00ee\u0004\u00ee\u076f\b\u00ee\u000b\u00ee"+ + "\f\u00ee\u0770\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00f0"+ + "\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f1\u0001\u00f1\u0001\u00f1"+ + "\u0001\u00f1\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2"+ + "\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3"+ + "\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f5\u0001\u00f5"+ + "\u0001\u00f5\u0001\u00f5\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6"+ + "\u0001\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f8\u0001\u00f8"+ + "\u0001\u00f8\u0001\u00f8\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9"+ + "\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fb\u0001\u00fb"+ + "\u0001\u00fb\u0001\u00fb\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc"+ + "\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001\u00fe"+ + "\u0001\u00fe\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u0100"+ "\u0001\u0100\u0001\u0100\u0001\u0100\u0001\u0101\u0001\u0101\u0001\u0101"+ "\u0001\u0101\u0001\u0102\u0001\u0102\u0001\u0102\u0001\u0102\u0001\u0103"+ "\u0001\u0103\u0001\u0103\u0001\u0103\u0001\u0104\u0001\u0104\u0001\u0104"+ - "\u0001\u0104\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0106"+ - "\u0001\u0106\u0001\u0106\u0001\u0106\u0001\u0107\u0001\u0107\u0001\u0107"+ - "\u0001\u0107\u0001\u0108\u0001\u0108\u0001\u0108\u0001\u0108\u0001\u0109"+ - "\u0001\u0109\u0001\u0109\u0001\u0109\u0001\u010a\u0001\u010a\u0001\u010a"+ - "\u0001\u010a\u0001\u010b\u0001\u010b\u0001\u010b\u0001\u010b\u0001\u010c"+ - "\u0001\u010c\u0001\u010c\u0001\u010c\u0001\u010d\u0001\u010d\u0001\u010d"+ - "\u0001\u010d\u0001\u010e\u0001\u010e\u0001\u010e\u0001\u010e\u0001\u010f"+ - "\u0001\u010f\u0001\u010f\u0001\u010f\u0001\u0110\u0001\u0110\u0001\u0110"+ - "\u0001\u0110\u0001\u0111\u0001\u0111\u0001\u0111\u0001\u0111\u0001\u0112"+ - "\u0001\u0112\u0001\u0112\u0001\u0112\u0001\u0113\u0001\u0113\u0001\u0113"+ + "\u0001\u0104\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0105"+ + "\u0001\u0106\u0001\u0106\u0001\u0106\u0001\u0106\u0001\u0107\u0001\u0107"+ + "\u0001\u0107\u0001\u0107\u0001\u0108\u0001\u0108\u0001\u0108\u0001\u0108"+ + "\u0001\u0109\u0001\u0109\u0001\u0109\u0001\u0109\u0001\u010a\u0001\u010a"+ + "\u0001\u010a\u0001\u010a\u0001\u010b\u0001\u010b\u0001\u010b\u0001\u010b"+ + "\u0001\u010c\u0001\u010c\u0001\u010c\u0001\u010c\u0001\u010d\u0001\u010d"+ + "\u0001\u010d\u0001\u010d\u0001\u010e\u0001\u010e\u0001\u010e\u0001\u010e"+ + "\u0001\u010f\u0001\u010f\u0001\u010f\u0001\u010f\u0001\u0110\u0001\u0110"+ + "\u0001\u0110\u0001\u0110\u0001\u0111\u0001\u0111\u0001\u0111\u0001\u0111"+ + "\u0001\u0112\u0001\u0112\u0001\u0112\u0001\u0112\u0001\u0113\u0001\u0113"+ "\u0001\u0113\u0001\u0113\u0001\u0114\u0001\u0114\u0001\u0114\u0001\u0114"+ - "\u0001\u0114\u0001\u0115\u0001\u0115\u0001\u0115\u0001\u0115\u0001\u0116"+ - "\u0001\u0116\u0001\u0116\u0001\u0116\u0001\u0117\u0001\u0117\u0001\u0117"+ - "\u0001\u0117\u0002\u0259\u0487\u0000\u0118\u0011\u0001\u0013\u0002\u0015"+ - "\u0003\u0017\u0004\u0019\u0005\u001b\u0006\u001d\u0007\u001f\b!\t#\n%"+ - "\u000b\'\f)\r+\u000e-\u000f/\u00101\u00113\u00125\u00137\u00149\u0015"+ - ";\u0016=\u0017?\u0018A\u0019C\u001aE\u001bG\u001cI\u001dK\u001eM\u001f"+ - "O Q!S\"U#W\u0000Y\u0000[\u0000]\u0000_\u0000a\u0000c\u0000e\u0000g\u0000"+ - "i\u0000k$m%o&q\u0000s\u0000u\u0000w\u0000y\u0000{\'}\u0000\u007f\u0000"+ - "\u0081(\u0083)\u0085*\u0087\u0000\u0089\u0000\u008b\u0000\u008d\u0000"+ - "\u008f\u0000\u0091\u0000\u0093\u0000\u0095\u0000\u0097\u0000\u0099\u0000"+ - "\u009b\u0000\u009d\u0000\u009f\u0000\u00a1\u0000\u00a3+\u00a5,\u00a7-"+ - "\u00a9\u0000\u00ab\u0000\u00ad.\u00af/\u00b10\u00b31\u00b5\u0000\u00b7"+ - "\u0000\u00b9\u0000\u00bb\u0000\u00bd\u0000\u00bf\u0000\u00c1\u0000\u00c3"+ - "\u0000\u00c5\u0000\u00c7\u0000\u00c92\u00cb3\u00cd4\u00cf5\u00d16\u00d3"+ - "7\u00d58\u00d79\u00d9:\u00db;\u00dd<\u00df=\u00e1>\u00e3?\u00e5@\u00e7"+ - "A\u00e9B\u00ebC\u00edD\u00efE\u00f1F\u00f3G\u00f5H\u00f7I\u00f9J\u00fb"+ - "K\u00fdL\u00ffM\u0101N\u0103O\u0105P\u0107Q\u0109R\u010bS\u010dT\u010f"+ - "U\u0111V\u0113W\u0115X\u0117Y\u0119Z\u011b[\u011d\\\u011f\u0000\u0121"+ - "]\u0123^\u0125_\u0127`\u0129a\u012bb\u012dc\u012f\u0000\u0131d\u0133e"+ - "\u0135f\u0137g\u0139\u0000\u013b\u0000\u013d\u0000\u013f\u0000\u0141\u0000"+ - "\u0143h\u0145\u0000\u0147\u0000\u0149i\u014b\u0000\u014d\u0000\u014fj"+ - "\u0151k\u0153l\u0155\u0000\u0157\u0000\u0159\u0000\u015bm\u015dn\u015f"+ - "o\u0161\u0000\u0163\u0000\u0165\u0000\u0167\u0000\u0169\u0000\u016b\u0000"+ - "\u016dp\u016fq\u0171r\u0173\u0000\u0175s\u0177\u0000\u0179\u0000\u017b"+ - "t\u017d\u0000\u017f\u0000\u0181\u0000\u0183u\u0185v\u0187w\u0189\u0000"+ - "\u018b\u0000\u018d\u0000\u018f\u0000\u0191\u0000\u0193\u0000\u0195\u0000"+ - "\u0197\u0000\u0199x\u019by\u019dz\u019f\u0000\u01a1\u0000\u01a3\u0000"+ - "\u01a5\u0000\u01a7\u0000\u01a9{\u01ab|\u01ad}\u01af\u0000\u01b1\u0000"+ - "\u01b3\u0000\u01b5\u0000\u01b7\u0000\u01b9\u0000\u01bb\u0000\u01bd\u0000"+ - "\u01bf\u0000\u01c1\u0000\u01c3\u0000\u01c5~\u01c7\u007f\u01c9\u0080\u01cb"+ - "\u0000\u01cd\u0000\u01cf\u0000\u01d1\u0000\u01d3\u0000\u01d5\u0000\u01d7"+ - "\u0000\u01d9\u0000\u01db\u0000\u01dd\u0000\u01df\u0000\u01e1\u0000\u01e3"+ - "\u0081\u01e5\u0082\u01e7\u0083\u01e9\u0084\u01eb\u0000\u01ed\u0000\u01ef"+ - "\u0000\u01f1\u0000\u01f3\u0000\u01f5\u0000\u01f7\u0000\u01f9\u0000\u01fb"+ - "\u0000\u01fd\u0000\u01ff\u0000\u0201\u0085\u0203\u0000\u0205\u0086\u0207"+ - "\u0087\u0209\u0088\u020b\u0000\u020d\u0000\u020f\u0000\u0211\u0000\u0213"+ - "\u0000\u0215\u0000\u0217\u0000\u0219\u0000\u021b\u0000\u021d\u0000\u021f"+ - "\u0000\u0221\u0000\u0223\u0000\u0225\u0000\u0227\u0000\u0229\u0000\u022b"+ - "\u0000\u022d\u0000\u022f\u0000\u0231\u0089\u0233\u008a\u0235\u008b\u0237"+ - "\u0000\u0239\u008c\u023b\u008d\u023d\u008e\u023f\u008f\u0011\u0000\u0001"+ - "\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010"+ - "$\u0002\u0000\n\n\r\r\u0003\u0000\t\n\r\r \u0002\u0000CCcc\u0002\u0000"+ - "HHhh\u0002\u0000AAaa\u0002\u0000NNnn\u0002\u0000GGgg\u0002\u0000EEee\u0002"+ - "\u0000PPpp\u0002\u0000OOoo\u0002\u0000IIii\u0002\u0000TTtt\u0002\u0000"+ - "RRrr\u0002\u0000XXxx\u0002\u0000LLll\u0002\u0000MMmm\u0002\u0000DDdd\u0002"+ - "\u0000SSss\u0002\u0000VVvv\u0002\u0000KKkk\u0002\u0000WWww\u0002\u0000"+ - "FFff\u0002\u0000UUuu\u0006\u0000\t\n\r\r //[[]]\f\u0000\t\n\r\r \"#"+ - "(),,//::<<>?\\\\||\u0001\u000009\u0002\u0000AZaz\b\u0000\"\"NNRRTT\\\\"+ - "nnrrtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002\u0000++--\u0001\u0000``\u0002"+ - "\u0000BBbb\u0002\u0000YYyy\f\u0000\t\n\r\r \"\"(),,//::==[[]]||\u0002"+ - "\u0000**//\u0002\u0000JJjj\u081e\u0000\u0011\u0001\u0000\u0000\u0000\u0000"+ - "\u0013\u0001\u0000\u0000\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u0000"+ - "\u0017\u0001\u0000\u0000\u0000\u0000\u0019\u0001\u0000\u0000\u0000\u0000"+ - "\u001b\u0001\u0000\u0000\u0000\u0000\u001d\u0001\u0000\u0000\u0000\u0000"+ - "\u001f\u0001\u0000\u0000\u0000\u0000!\u0001\u0000\u0000\u0000\u0000#\u0001"+ - "\u0000\u0000\u0000\u0000%\u0001\u0000\u0000\u0000\u0000\'\u0001\u0000"+ - "\u0000\u0000\u0000)\u0001\u0000\u0000\u0000\u0000+\u0001\u0000\u0000\u0000"+ - "\u0000-\u0001\u0000\u0000\u0000\u0000/\u0001\u0000\u0000\u0000\u00001"+ - "\u0001\u0000\u0000\u0000\u00003\u0001\u0000\u0000\u0000\u00005\u0001\u0000"+ - "\u0000\u0000\u00007\u0001\u0000\u0000\u0000\u00009\u0001\u0000\u0000\u0000"+ - "\u0000;\u0001\u0000\u0000\u0000\u0000=\u0001\u0000\u0000\u0000\u0000?"+ - "\u0001\u0000\u0000\u0000\u0000A\u0001\u0000\u0000\u0000\u0000C\u0001\u0000"+ - "\u0000\u0000\u0000E\u0001\u0000\u0000\u0000\u0000G\u0001\u0000\u0000\u0000"+ - "\u0000I\u0001\u0000\u0000\u0000\u0000K\u0001\u0000\u0000\u0000\u0000M"+ - "\u0001\u0000\u0000\u0000\u0000O\u0001\u0000\u0000\u0000\u0000Q\u0001\u0000"+ - "\u0000\u0000\u0000S\u0001\u0000\u0000\u0000\u0000U\u0001\u0000\u0000\u0000"+ - "\u0001W\u0001\u0000\u0000\u0000\u0001Y\u0001\u0000\u0000\u0000\u0001["+ - "\u0001\u0000\u0000\u0000\u0001]\u0001\u0000\u0000\u0000\u0001_\u0001\u0000"+ - "\u0000\u0000\u0001a\u0001\u0000\u0000\u0000\u0001c\u0001\u0000\u0000\u0000"+ - "\u0001e\u0001\u0000\u0000\u0000\u0001g\u0001\u0000\u0000\u0000\u0001i"+ - "\u0001\u0000\u0000\u0000\u0001k\u0001\u0000\u0000\u0000\u0001m\u0001\u0000"+ - "\u0000\u0000\u0001o\u0001\u0000\u0000\u0000\u0002q\u0001\u0000\u0000\u0000"+ - "\u0002s\u0001\u0000\u0000\u0000\u0002u\u0001\u0000\u0000\u0000\u0002w"+ - "\u0001\u0000\u0000\u0000\u0002{\u0001\u0000\u0000\u0000\u0002}\u0001\u0000"+ - "\u0000\u0000\u0002\u007f\u0001\u0000\u0000\u0000\u0002\u0081\u0001\u0000"+ - "\u0000\u0000\u0002\u0083\u0001\u0000\u0000\u0000\u0002\u0085\u0001\u0000"+ - "\u0000\u0000\u0003\u0087\u0001\u0000\u0000\u0000\u0003\u0089\u0001\u0000"+ - "\u0000\u0000\u0003\u008b\u0001\u0000\u0000\u0000\u0003\u008d\u0001\u0000"+ - "\u0000\u0000\u0003\u008f\u0001\u0000\u0000\u0000\u0003\u0091\u0001\u0000"+ - "\u0000\u0000\u0003\u0093\u0001\u0000\u0000\u0000\u0003\u0095\u0001\u0000"+ - "\u0000\u0000\u0003\u0097\u0001\u0000\u0000\u0000\u0003\u0099\u0001\u0000"+ - "\u0000\u0000\u0003\u009b\u0001\u0000\u0000\u0000\u0003\u009d\u0001\u0000"+ - "\u0000\u0000\u0003\u009f\u0001\u0000\u0000\u0000\u0003\u00a1\u0001\u0000"+ - "\u0000\u0000\u0003\u00a3\u0001\u0000\u0000\u0000\u0003\u00a5\u0001\u0000"+ - "\u0000\u0000\u0003\u00a7\u0001\u0000\u0000\u0000\u0004\u00a9\u0001\u0000"+ - "\u0000\u0000\u0004\u00ab\u0001\u0000\u0000\u0000\u0004\u00ad\u0001\u0000"+ - "\u0000\u0000\u0004\u00af\u0001\u0000\u0000\u0000\u0004\u00b1\u0001\u0000"+ - "\u0000\u0000\u0005\u00b3\u0001\u0000\u0000\u0000\u0005\u00c9\u0001\u0000"+ - "\u0000\u0000\u0005\u00cb\u0001\u0000\u0000\u0000\u0005\u00cd\u0001\u0000"+ - "\u0000\u0000\u0005\u00cf\u0001\u0000\u0000\u0000\u0005\u00d1\u0001\u0000"+ - "\u0000\u0000\u0005\u00d3\u0001\u0000\u0000\u0000\u0005\u00d5\u0001\u0000"+ - "\u0000\u0000\u0005\u00d7\u0001\u0000\u0000\u0000\u0005\u00d9\u0001\u0000"+ - "\u0000\u0000\u0005\u00db\u0001\u0000\u0000\u0000\u0005\u00dd\u0001\u0000"+ - "\u0000\u0000\u0005\u00df\u0001\u0000\u0000\u0000\u0005\u00e1\u0001\u0000"+ - "\u0000\u0000\u0005\u00e3\u0001\u0000\u0000\u0000\u0005\u00e5\u0001\u0000"+ - "\u0000\u0000\u0005\u00e7\u0001\u0000\u0000\u0000\u0005\u00e9\u0001\u0000"+ - "\u0000\u0000\u0005\u00eb\u0001\u0000\u0000\u0000\u0005\u00ed\u0001\u0000"+ - "\u0000\u0000\u0005\u00ef\u0001\u0000\u0000\u0000\u0005\u00f1\u0001\u0000"+ - "\u0000\u0000\u0005\u00f3\u0001\u0000\u0000\u0000\u0005\u00f5\u0001\u0000"+ - "\u0000\u0000\u0005\u00f7\u0001\u0000\u0000\u0000\u0005\u00f9\u0001\u0000"+ - "\u0000\u0000\u0005\u00fb\u0001\u0000\u0000\u0000\u0005\u00fd\u0001\u0000"+ - "\u0000\u0000\u0005\u00ff\u0001\u0000\u0000\u0000\u0005\u0101\u0001\u0000"+ - "\u0000\u0000\u0005\u0103\u0001\u0000\u0000\u0000\u0005\u0105\u0001\u0000"+ - "\u0000\u0000\u0005\u0107\u0001\u0000\u0000\u0000\u0005\u0109\u0001\u0000"+ - "\u0000\u0000\u0005\u010b\u0001\u0000\u0000\u0000\u0005\u010d\u0001\u0000"+ - "\u0000\u0000\u0005\u010f\u0001\u0000\u0000\u0000\u0005\u0111\u0001\u0000"+ - "\u0000\u0000\u0005\u0113\u0001\u0000\u0000\u0000\u0005\u0115\u0001\u0000"+ - "\u0000\u0000\u0005\u0117\u0001\u0000\u0000\u0000\u0005\u0119\u0001\u0000"+ - "\u0000\u0000\u0005\u011b\u0001\u0000\u0000\u0000\u0005\u011d\u0001\u0000"+ - "\u0000\u0000\u0005\u011f\u0001\u0000\u0000\u0000\u0005\u0121\u0001\u0000"+ - "\u0000\u0000\u0005\u0123\u0001\u0000\u0000\u0000\u0005\u0125\u0001\u0000"+ - "\u0000\u0000\u0005\u0127\u0001\u0000\u0000\u0000\u0005\u0129\u0001\u0000"+ - "\u0000\u0000\u0005\u012b\u0001\u0000\u0000\u0000\u0005\u012d\u0001\u0000"+ - "\u0000\u0000\u0005\u0131\u0001\u0000\u0000\u0000\u0005\u0133\u0001\u0000"+ - "\u0000\u0000\u0005\u0135\u0001\u0000\u0000\u0000\u0005\u0137\u0001\u0000"+ - "\u0000\u0000\u0006\u0139\u0001\u0000\u0000\u0000\u0006\u013b\u0001\u0000"+ - "\u0000\u0000\u0006\u013d\u0001\u0000\u0000\u0000\u0006\u013f\u0001\u0000"+ - "\u0000\u0000\u0006\u0141\u0001\u0000\u0000\u0000\u0006\u0143\u0001\u0000"+ - "\u0000\u0000\u0006\u0145\u0001\u0000\u0000\u0000\u0006\u0149\u0001\u0000"+ - "\u0000\u0000\u0006\u014b\u0001\u0000\u0000\u0000\u0006\u014d\u0001\u0000"+ - "\u0000\u0000\u0006\u014f\u0001\u0000\u0000\u0000\u0006\u0151\u0001\u0000"+ - "\u0000\u0000\u0006\u0153\u0001\u0000\u0000\u0000\u0007\u0155\u0001\u0000"+ - "\u0000\u0000\u0007\u0157\u0001\u0000\u0000\u0000\u0007\u0159\u0001\u0000"+ - "\u0000\u0000\u0007\u015b\u0001\u0000\u0000\u0000\u0007\u015d\u0001\u0000"+ - "\u0000\u0000\u0007\u015f\u0001\u0000\u0000\u0000\b\u0161\u0001\u0000\u0000"+ - "\u0000\b\u0163\u0001\u0000\u0000\u0000\b\u0165\u0001\u0000\u0000\u0000"+ - "\b\u0167\u0001\u0000\u0000\u0000\b\u0169\u0001\u0000\u0000\u0000\b\u016b"+ - "\u0001\u0000\u0000\u0000\b\u016d\u0001\u0000\u0000\u0000\b\u016f\u0001"+ - "\u0000\u0000\u0000\b\u0171\u0001\u0000\u0000\u0000\t\u0173\u0001\u0000"+ - "\u0000\u0000\t\u0175\u0001\u0000\u0000\u0000\t\u0177\u0001\u0000\u0000"+ - "\u0000\t\u0179\u0001\u0000\u0000\u0000\t\u017b\u0001\u0000\u0000\u0000"+ - "\t\u017d\u0001\u0000\u0000\u0000\t\u017f\u0001\u0000\u0000\u0000\t\u0181"+ - "\u0001\u0000\u0000\u0000\t\u0183\u0001\u0000\u0000\u0000\t\u0185\u0001"+ - "\u0000\u0000\u0000\t\u0187\u0001\u0000\u0000\u0000\n\u0189\u0001\u0000"+ - "\u0000\u0000\n\u018b\u0001\u0000\u0000\u0000\n\u018d\u0001\u0000\u0000"+ - "\u0000\n\u018f\u0001\u0000\u0000\u0000\n\u0191\u0001\u0000\u0000\u0000"+ - "\n\u0193\u0001\u0000\u0000\u0000\n\u0195\u0001\u0000\u0000\u0000\n\u0197"+ - "\u0001\u0000\u0000\u0000\n\u0199\u0001\u0000\u0000\u0000\n\u019b\u0001"+ - "\u0000\u0000\u0000\n\u019d\u0001\u0000\u0000\u0000\u000b\u019f\u0001\u0000"+ - "\u0000\u0000\u000b\u01a1\u0001\u0000\u0000\u0000\u000b\u01a3\u0001\u0000"+ - "\u0000\u0000\u000b\u01a5\u0001\u0000\u0000\u0000\u000b\u01a7\u0001\u0000"+ - "\u0000\u0000\u000b\u01a9\u0001\u0000\u0000\u0000\u000b\u01ab\u0001\u0000"+ - "\u0000\u0000\u000b\u01ad\u0001\u0000\u0000\u0000\f\u01af\u0001\u0000\u0000"+ - "\u0000\f\u01b1\u0001\u0000\u0000\u0000\f\u01b3\u0001\u0000\u0000\u0000"+ - "\f\u01b5\u0001\u0000\u0000\u0000\f\u01b7\u0001\u0000\u0000\u0000\f\u01b9"+ - "\u0001\u0000\u0000\u0000\f\u01bb\u0001\u0000\u0000\u0000\f\u01bd\u0001"+ - "\u0000\u0000\u0000\f\u01bf\u0001\u0000\u0000\u0000\f\u01c1\u0001\u0000"+ - "\u0000\u0000\f\u01c3\u0001\u0000\u0000\u0000\f\u01c5\u0001\u0000\u0000"+ - "\u0000\f\u01c7\u0001\u0000\u0000\u0000\f\u01c9\u0001\u0000\u0000\u0000"+ - "\r\u01cb\u0001\u0000\u0000\u0000\r\u01cd\u0001\u0000\u0000\u0000\r\u01cf"+ - "\u0001\u0000\u0000\u0000\r\u01d1\u0001\u0000\u0000\u0000\r\u01d3\u0001"+ - "\u0000\u0000\u0000\r\u01d5\u0001\u0000\u0000\u0000\r\u01d7\u0001\u0000"+ - "\u0000\u0000\r\u01d9\u0001\u0000\u0000\u0000\r\u01db\u0001\u0000\u0000"+ - "\u0000\r\u01dd\u0001\u0000\u0000\u0000\r\u01e3\u0001\u0000\u0000\u0000"+ - "\r\u01e5\u0001\u0000\u0000\u0000\r\u01e7\u0001\u0000\u0000\u0000\r\u01e9"+ - "\u0001\u0000\u0000\u0000\u000e\u01eb\u0001\u0000\u0000\u0000\u000e\u01ed"+ - "\u0001\u0000\u0000\u0000\u000e\u01ef\u0001\u0000\u0000\u0000\u000e\u01f1"+ - "\u0001\u0000\u0000\u0000\u000e\u01f3\u0001\u0000\u0000\u0000\u000e\u01f5"+ - "\u0001\u0000\u0000\u0000\u000e\u01f7\u0001\u0000\u0000\u0000\u000e\u01f9"+ - "\u0001\u0000\u0000\u0000\u000e\u01fb\u0001\u0000\u0000\u0000\u000e\u01fd"+ - "\u0001\u0000\u0000\u0000\u000e\u01ff\u0001\u0000\u0000\u0000\u000e\u0201"+ - "\u0001\u0000\u0000\u0000\u000e\u0203\u0001\u0000\u0000\u0000\u000e\u0205"+ - "\u0001\u0000\u0000\u0000\u000e\u0207\u0001\u0000\u0000\u0000\u000e\u0209"+ - "\u0001\u0000\u0000\u0000\u000f\u020b\u0001\u0000\u0000\u0000\u000f\u020d"+ - "\u0001\u0000\u0000\u0000\u000f\u020f\u0001\u0000\u0000\u0000\u000f\u0211"+ - "\u0001\u0000\u0000\u0000\u000f\u0213\u0001\u0000\u0000\u0000\u000f\u0215"+ - "\u0001\u0000\u0000\u0000\u000f\u0217\u0001\u0000\u0000\u0000\u000f\u0219"+ - "\u0001\u0000\u0000\u0000\u000f\u021b\u0001\u0000\u0000\u0000\u000f\u021d"+ - "\u0001\u0000\u0000\u0000\u000f\u021f\u0001\u0000\u0000\u0000\u000f\u0221"+ - "\u0001\u0000\u0000\u0000\u000f\u0223\u0001\u0000\u0000\u0000\u000f\u0225"+ - "\u0001\u0000\u0000\u0000\u000f\u0227\u0001\u0000\u0000\u0000\u000f\u0229"+ - "\u0001\u0000\u0000\u0000\u000f\u022b\u0001\u0000\u0000\u0000\u000f\u022d"+ - "\u0001\u0000\u0000\u0000\u000f\u022f\u0001\u0000\u0000\u0000\u000f\u0231"+ - "\u0001\u0000\u0000\u0000\u000f\u0233\u0001\u0000\u0000\u0000\u000f\u0235"+ - "\u0001\u0000\u0000\u0000\u0010\u0237\u0001\u0000\u0000\u0000\u0010\u0239"+ - "\u0001\u0000\u0000\u0000\u0010\u023b\u0001\u0000\u0000\u0000\u0010\u023d"+ - "\u0001\u0000\u0000\u0000\u0010\u023f\u0001\u0000\u0000\u0000\u0011\u0241"+ - "\u0001\u0000\u0000\u0000\u0013\u0252\u0001\u0000\u0000\u0000\u0015\u0262"+ - "\u0001\u0000\u0000\u0000\u0017\u0268\u0001\u0000\u0000\u0000\u0019\u0277"+ - "\u0001\u0000\u0000\u0000\u001b\u0280\u0001\u0000\u0000\u0000\u001d\u028b"+ - "\u0001\u0000\u0000\u0000\u001f\u0298\u0001\u0000\u0000\u0000!\u02a2\u0001"+ - "\u0000\u0000\u0000#\u02a9\u0001\u0000\u0000\u0000%\u02b0\u0001\u0000\u0000"+ - "\u0000\'\u02b8\u0001\u0000\u0000\u0000)\u02c1\u0001\u0000\u0000\u0000"+ - "+\u02c7\u0001\u0000\u0000\u0000-\u02d0\u0001\u0000\u0000\u0000/\u02d7"+ - "\u0001\u0000\u0000\u00001\u02df\u0001\u0000\u0000\u00003\u02e7\u0001\u0000"+ - "\u0000\u00005\u02f6\u0001\u0000\u0000\u00007\u02fd\u0001\u0000\u0000\u0000"+ - "9\u0302\u0001\u0000\u0000\u0000;\u0309\u0001\u0000\u0000\u0000=\u0311"+ - "\u0001\u0000\u0000\u0000?\u031a\u0001\u0000\u0000\u0000A\u0322\u0001\u0000"+ - "\u0000\u0000C\u032a\u0001\u0000\u0000\u0000E\u0333\u0001\u0000\u0000\u0000"+ - "G\u033f\u0001\u0000\u0000\u0000I\u034b\u0001\u0000\u0000\u0000K\u0352"+ - "\u0001\u0000\u0000\u0000M\u0359\u0001\u0000\u0000\u0000O\u0365\u0001\u0000"+ - "\u0000\u0000Q\u036e\u0001\u0000\u0000\u0000S\u0374\u0001\u0000\u0000\u0000"+ - "U\u037c\u0001\u0000\u0000\u0000W\u0382\u0001\u0000\u0000\u0000Y\u0387"+ - "\u0001\u0000\u0000\u0000[\u038d\u0001\u0000\u0000\u0000]\u0391\u0001\u0000"+ - "\u0000\u0000_\u0395\u0001\u0000\u0000\u0000a\u0399\u0001\u0000\u0000\u0000"+ - "c\u039d\u0001\u0000\u0000\u0000e\u03a1\u0001\u0000\u0000\u0000g\u03a5"+ - "\u0001\u0000\u0000\u0000i\u03a9\u0001\u0000\u0000\u0000k\u03ad\u0001\u0000"+ - "\u0000\u0000m\u03b1\u0001\u0000\u0000\u0000o\u03b5\u0001\u0000\u0000\u0000"+ - "q\u03b9\u0001\u0000\u0000\u0000s\u03be\u0001\u0000\u0000\u0000u\u03c4"+ - "\u0001\u0000\u0000\u0000w\u03c9\u0001\u0000\u0000\u0000y\u03ce\u0001\u0000"+ - "\u0000\u0000{\u03d7\u0001\u0000\u0000\u0000}\u03de\u0001\u0000\u0000\u0000"+ - "\u007f\u03e2\u0001\u0000\u0000\u0000\u0081\u03e6\u0001\u0000\u0000\u0000"+ - "\u0083\u03ea\u0001\u0000\u0000\u0000\u0085\u03ee\u0001\u0000\u0000\u0000"+ - "\u0087\u03f2\u0001\u0000\u0000\u0000\u0089\u03f8\u0001\u0000\u0000\u0000"+ - "\u008b\u03ff\u0001\u0000\u0000\u0000\u008d\u0403\u0001\u0000\u0000\u0000"+ - "\u008f\u0407\u0001\u0000\u0000\u0000\u0091\u040b\u0001\u0000\u0000\u0000"+ - "\u0093\u040f\u0001\u0000\u0000\u0000\u0095\u0413\u0001\u0000\u0000\u0000"+ - "\u0097\u0417\u0001\u0000\u0000\u0000\u0099\u041b\u0001\u0000\u0000\u0000"+ - "\u009b\u041f\u0001\u0000\u0000\u0000\u009d\u0423\u0001\u0000\u0000\u0000"+ - "\u009f\u0427\u0001\u0000\u0000\u0000\u00a1\u042b\u0001\u0000\u0000\u0000"+ - "\u00a3\u042f\u0001\u0000\u0000\u0000\u00a5\u0433\u0001\u0000\u0000\u0000"+ - "\u00a7\u0437\u0001\u0000\u0000\u0000\u00a9\u043b\u0001\u0000\u0000\u0000"+ - "\u00ab\u0440\u0001\u0000\u0000\u0000\u00ad\u0445\u0001\u0000\u0000\u0000"+ - "\u00af\u0449\u0001\u0000\u0000\u0000\u00b1\u044d\u0001\u0000\u0000\u0000"+ - "\u00b3\u0451\u0001\u0000\u0000\u0000\u00b5\u0455\u0001\u0000\u0000\u0000"+ - "\u00b7\u0457\u0001\u0000\u0000\u0000\u00b9\u0459\u0001\u0000\u0000\u0000"+ - "\u00bb\u045c\u0001\u0000\u0000\u0000\u00bd\u045e\u0001\u0000\u0000\u0000"+ - "\u00bf\u0467\u0001\u0000\u0000\u0000\u00c1\u0469\u0001\u0000\u0000\u0000"+ - "\u00c3\u046e\u0001\u0000\u0000\u0000\u00c5\u0470\u0001\u0000\u0000\u0000"+ - "\u00c7\u0475\u0001\u0000\u0000\u0000\u00c9\u0494\u0001\u0000\u0000\u0000"+ - "\u00cb\u0497\u0001\u0000\u0000\u0000\u00cd\u04c5\u0001\u0000\u0000\u0000"+ - "\u00cf\u04c7\u0001\u0000\u0000\u0000\u00d1\u04cb\u0001\u0000\u0000\u0000"+ - "\u00d3\u04cf\u0001\u0000\u0000\u0000\u00d5\u04d1\u0001\u0000\u0000\u0000"+ - "\u00d7\u04d4\u0001\u0000\u0000\u0000\u00d9\u04d7\u0001\u0000\u0000\u0000"+ - "\u00db\u04d9\u0001\u0000\u0000\u0000\u00dd\u04db\u0001\u0000\u0000\u0000"+ - "\u00df\u04dd\u0001\u0000\u0000\u0000\u00e1\u04e2\u0001\u0000\u0000\u0000"+ - "\u00e3\u04e4\u0001\u0000\u0000\u0000\u00e5\u04ea\u0001\u0000\u0000\u0000"+ - "\u00e7\u04f0\u0001\u0000\u0000\u0000\u00e9\u04f3\u0001\u0000\u0000\u0000"+ - "\u00eb\u04f6\u0001\u0000\u0000\u0000\u00ed\u04fb\u0001\u0000\u0000\u0000"+ - "\u00ef\u0500\u0001\u0000\u0000\u0000\u00f1\u0504\u0001\u0000\u0000\u0000"+ - "\u00f3\u0509\u0001\u0000\u0000\u0000\u00f5\u050f\u0001\u0000\u0000\u0000"+ - "\u00f7\u0512\u0001\u0000\u0000\u0000\u00f9\u0515\u0001\u0000\u0000\u0000"+ - "\u00fb\u0517\u0001\u0000\u0000\u0000\u00fd\u051d\u0001\u0000\u0000\u0000"+ - "\u00ff\u0522\u0001\u0000\u0000\u0000\u0101\u0527\u0001\u0000\u0000\u0000"+ - "\u0103\u052a\u0001\u0000\u0000\u0000\u0105\u052d\u0001\u0000\u0000\u0000"+ - "\u0107\u0530\u0001\u0000\u0000\u0000\u0109\u0532\u0001\u0000\u0000\u0000"+ - "\u010b\u0535\u0001\u0000\u0000\u0000\u010d\u0537\u0001\u0000\u0000\u0000"+ - "\u010f\u053a\u0001\u0000\u0000\u0000\u0111\u053c\u0001\u0000\u0000\u0000"+ - "\u0113\u053e\u0001\u0000\u0000\u0000\u0115\u0540\u0001\u0000\u0000\u0000"+ - "\u0117\u0542\u0001\u0000\u0000\u0000\u0119\u0544\u0001\u0000\u0000\u0000"+ - "\u011b\u0546\u0001\u0000\u0000\u0000\u011d\u0548\u0001\u0000\u0000\u0000"+ - "\u011f\u054b\u0001\u0000\u0000\u0000\u0121\u0560\u0001\u0000\u0000\u0000"+ - "\u0123\u0573\u0001\u0000\u0000\u0000\u0125\u0575\u0001\u0000\u0000\u0000"+ - "\u0127\u057a\u0001\u0000\u0000\u0000\u0129\u057f\u0001\u0000\u0000\u0000"+ - "\u012b\u0584\u0001\u0000\u0000\u0000\u012d\u0599\u0001\u0000\u0000\u0000"+ - "\u012f\u059b\u0001\u0000\u0000\u0000\u0131\u05a3\u0001\u0000\u0000\u0000"+ - "\u0133\u05a5\u0001\u0000\u0000\u0000\u0135\u05a9\u0001\u0000\u0000\u0000"+ - "\u0137\u05ad\u0001\u0000\u0000\u0000\u0139\u05b1\u0001\u0000\u0000\u0000"+ - "\u013b\u05b6\u0001\u0000\u0000\u0000\u013d\u05ba\u0001\u0000\u0000\u0000"+ - "\u013f\u05be\u0001\u0000\u0000\u0000\u0141\u05c2\u0001\u0000\u0000\u0000"+ - "\u0143\u05c6\u0001\u0000\u0000\u0000\u0145\u05cf\u0001\u0000\u0000\u0000"+ - "\u0147\u05d7\u0001\u0000\u0000\u0000\u0149\u05da\u0001\u0000\u0000\u0000"+ - "\u014b\u05de\u0001\u0000\u0000\u0000\u014d\u05e2\u0001\u0000\u0000\u0000"+ - "\u014f\u05e6\u0001\u0000\u0000\u0000\u0151\u05ea\u0001\u0000\u0000\u0000"+ - "\u0153\u05ee\u0001\u0000\u0000\u0000\u0155\u05f2\u0001\u0000\u0000\u0000"+ - "\u0157\u05f7\u0001\u0000\u0000\u0000\u0159\u05fd\u0001\u0000\u0000\u0000"+ - "\u015b\u0602\u0001\u0000\u0000\u0000\u015d\u0606\u0001\u0000\u0000\u0000"+ - "\u015f\u060a\u0001\u0000\u0000\u0000\u0161\u060e\u0001\u0000\u0000\u0000"+ - "\u0163\u0613\u0001\u0000\u0000\u0000\u0165\u0619\u0001\u0000\u0000\u0000"+ - "\u0167\u061f\u0001\u0000\u0000\u0000\u0169\u0623\u0001\u0000\u0000\u0000"+ - "\u016b\u0627\u0001\u0000\u0000\u0000\u016d\u062b\u0001\u0000\u0000\u0000"+ - "\u016f\u062f\u0001\u0000\u0000\u0000\u0171\u0633\u0001\u0000\u0000\u0000"+ - "\u0173\u0637\u0001\u0000\u0000\u0000\u0175\u063c\u0001\u0000\u0000\u0000"+ - "\u0177\u0641\u0001\u0000\u0000\u0000\u0179\u0645\u0001\u0000\u0000\u0000"+ - "\u017b\u064b\u0001\u0000\u0000\u0000\u017d\u0654\u0001\u0000\u0000\u0000"+ - "\u017f\u0658\u0001\u0000\u0000\u0000\u0181\u065c\u0001\u0000\u0000\u0000"+ - "\u0183\u0660\u0001\u0000\u0000\u0000\u0185\u0664\u0001\u0000\u0000\u0000"+ - "\u0187\u0668\u0001\u0000\u0000\u0000\u0189\u066c\u0001\u0000\u0000\u0000"+ - "\u018b\u0671\u0001\u0000\u0000\u0000\u018d\u0677\u0001\u0000\u0000\u0000"+ - "\u018f\u067b\u0001\u0000\u0000\u0000\u0191\u067f\u0001\u0000\u0000\u0000"+ - "\u0193\u0683\u0001\u0000\u0000\u0000\u0195\u0688\u0001\u0000\u0000\u0000"+ - "\u0197\u068c\u0001\u0000\u0000\u0000\u0199\u0690\u0001\u0000\u0000\u0000"+ - "\u019b\u0694\u0001\u0000\u0000\u0000\u019d\u0698\u0001\u0000\u0000\u0000"+ - "\u019f\u069c\u0001\u0000\u0000\u0000\u01a1\u06a2\u0001\u0000\u0000\u0000"+ - "\u01a3\u06a9\u0001\u0000\u0000\u0000\u01a5\u06ad\u0001\u0000\u0000\u0000"+ - "\u01a7\u06b1\u0001\u0000\u0000\u0000\u01a9\u06b5\u0001\u0000\u0000\u0000"+ - "\u01ab\u06b9\u0001\u0000\u0000\u0000\u01ad\u06bd\u0001\u0000\u0000\u0000"+ - "\u01af\u06c1\u0001\u0000\u0000\u0000\u01b1\u06c6\u0001\u0000\u0000\u0000"+ - "\u01b3\u06cc\u0001\u0000\u0000\u0000\u01b5\u06d0\u0001\u0000\u0000\u0000"+ - "\u01b7\u06d4\u0001\u0000\u0000\u0000\u01b9\u06d8\u0001\u0000\u0000\u0000"+ - "\u01bb\u06dc\u0001\u0000\u0000\u0000\u01bd\u06e0\u0001\u0000\u0000\u0000"+ - "\u01bf\u06e4\u0001\u0000\u0000\u0000\u01c1\u06e8\u0001\u0000\u0000\u0000"+ - "\u01c3\u06ec\u0001\u0000\u0000\u0000\u01c5\u06f0\u0001\u0000\u0000\u0000"+ - "\u01c7\u06f4\u0001\u0000\u0000\u0000\u01c9\u06f8\u0001\u0000\u0000\u0000"+ - "\u01cb\u06fc\u0001\u0000\u0000\u0000\u01cd\u0701\u0001\u0000\u0000\u0000"+ - "\u01cf\u0707\u0001\u0000\u0000\u0000\u01d1\u070b\u0001\u0000\u0000\u0000"+ - "\u01d3\u070f\u0001\u0000\u0000\u0000\u01d5\u0713\u0001\u0000\u0000\u0000"+ - "\u01d7\u0717\u0001\u0000\u0000\u0000\u01d9\u071b\u0001\u0000\u0000\u0000"+ - "\u01db\u071f\u0001\u0000\u0000\u0000\u01dd\u0723\u0001\u0000\u0000\u0000"+ - "\u01df\u072b\u0001\u0000\u0000\u0000\u01e1\u0740\u0001\u0000\u0000\u0000"+ - "\u01e3\u0744\u0001\u0000\u0000\u0000\u01e5\u0748\u0001\u0000\u0000\u0000"+ - "\u01e7\u074c\u0001\u0000\u0000\u0000\u01e9\u0750\u0001\u0000\u0000\u0000"+ - "\u01eb\u0754\u0001\u0000\u0000\u0000\u01ed\u0759\u0001\u0000\u0000\u0000"+ - "\u01ef\u075f\u0001\u0000\u0000\u0000\u01f1\u0763\u0001\u0000\u0000\u0000"+ - "\u01f3\u0767\u0001\u0000\u0000\u0000\u01f5\u076b\u0001\u0000\u0000\u0000"+ - "\u01f7\u076f\u0001\u0000\u0000\u0000\u01f9\u0773\u0001\u0000\u0000\u0000"+ - "\u01fb\u0777\u0001\u0000\u0000\u0000\u01fd\u077b\u0001\u0000\u0000\u0000"+ - "\u01ff\u077f\u0001\u0000\u0000\u0000\u0201\u0783\u0001\u0000\u0000\u0000"+ - "\u0203\u0786\u0001\u0000\u0000\u0000\u0205\u078a\u0001\u0000\u0000\u0000"+ - "\u0207\u078e\u0001\u0000\u0000\u0000\u0209\u0792\u0001\u0000\u0000\u0000"+ - "\u020b\u0796\u0001\u0000\u0000\u0000\u020d\u079a\u0001\u0000\u0000\u0000"+ - "\u020f\u079e\u0001\u0000\u0000\u0000\u0211\u07a2\u0001\u0000\u0000\u0000"+ - "\u0213\u07a7\u0001\u0000\u0000\u0000\u0215\u07ab\u0001\u0000\u0000\u0000"+ - "\u0217\u07af\u0001\u0000\u0000\u0000\u0219\u07b3\u0001\u0000\u0000\u0000"+ - "\u021b\u07b7\u0001\u0000\u0000\u0000\u021d\u07bb\u0001\u0000\u0000\u0000"+ - "\u021f\u07bf\u0001\u0000\u0000\u0000\u0221\u07c3\u0001\u0000\u0000\u0000"+ - "\u0223\u07c7\u0001\u0000\u0000\u0000\u0225\u07cb\u0001\u0000\u0000\u0000"+ - "\u0227\u07cf\u0001\u0000\u0000\u0000\u0229\u07d3\u0001\u0000\u0000\u0000"+ - "\u022b\u07d7\u0001\u0000\u0000\u0000\u022d\u07db\u0001\u0000\u0000\u0000"+ - "\u022f\u07df\u0001\u0000\u0000\u0000\u0231\u07e3\u0001\u0000\u0000\u0000"+ - "\u0233\u07e7\u0001\u0000\u0000\u0000\u0235\u07eb\u0001\u0000\u0000\u0000"+ - "\u0237\u07ef\u0001\u0000\u0000\u0000\u0239\u07f4\u0001\u0000\u0000\u0000"+ - "\u023b\u07f9\u0001\u0000\u0000\u0000\u023d\u07fd\u0001\u0000\u0000\u0000"+ - "\u023f\u0801\u0001\u0000\u0000\u0000\u0241\u0242\u0005/\u0000\u0000\u0242"+ - "\u0243\u0005/\u0000\u0000\u0243\u0247\u0001\u0000\u0000\u0000\u0244\u0246"+ - "\b\u0000\u0000\u0000\u0245\u0244\u0001\u0000\u0000\u0000\u0246\u0249\u0001"+ - "\u0000\u0000\u0000\u0247\u0245\u0001\u0000\u0000\u0000\u0247\u0248\u0001"+ - "\u0000\u0000\u0000\u0248\u024b\u0001\u0000\u0000\u0000\u0249\u0247\u0001"+ - "\u0000\u0000\u0000\u024a\u024c\u0005\r\u0000\u0000\u024b\u024a\u0001\u0000"+ - "\u0000\u0000\u024b\u024c\u0001\u0000\u0000\u0000\u024c\u024e\u0001\u0000"+ - "\u0000\u0000\u024d\u024f\u0005\n\u0000\u0000\u024e\u024d\u0001\u0000\u0000"+ - "\u0000\u024e\u024f\u0001\u0000\u0000\u0000\u024f\u0250\u0001\u0000\u0000"+ - "\u0000\u0250\u0251\u0006\u0000\u0000\u0000\u0251\u0012\u0001\u0000\u0000"+ - "\u0000\u0252\u0253\u0005/\u0000\u0000\u0253\u0254\u0005*\u0000\u0000\u0254"+ - "\u0259\u0001\u0000\u0000\u0000\u0255\u0258\u0003\u0013\u0001\u0000\u0256"+ - "\u0258\t\u0000\u0000\u0000\u0257\u0255\u0001\u0000\u0000\u0000\u0257\u0256"+ - "\u0001\u0000\u0000\u0000\u0258\u025b\u0001\u0000\u0000\u0000\u0259\u025a"+ - "\u0001\u0000\u0000\u0000\u0259\u0257\u0001\u0000\u0000\u0000\u025a\u025c"+ - "\u0001\u0000\u0000\u0000\u025b\u0259\u0001\u0000\u0000\u0000\u025c\u025d"+ - "\u0005*\u0000\u0000\u025d\u025e\u0005/\u0000\u0000\u025e\u025f\u0001\u0000"+ - "\u0000\u0000\u025f\u0260\u0006\u0001\u0000\u0000\u0260\u0014\u0001\u0000"+ - "\u0000\u0000\u0261\u0263\u0007\u0001\u0000\u0000\u0262\u0261\u0001\u0000"+ - "\u0000\u0000\u0263\u0264\u0001\u0000\u0000\u0000\u0264\u0262\u0001\u0000"+ - "\u0000\u0000\u0264\u0265\u0001\u0000\u0000\u0000\u0265\u0266\u0001\u0000"+ - "\u0000\u0000\u0266\u0267\u0006\u0002\u0000\u0000\u0267\u0016\u0001\u0000"+ - "\u0000\u0000\u0268\u0269\u0007\u0002\u0000\u0000\u0269\u026a\u0007\u0003"+ - "\u0000\u0000\u026a\u026b\u0007\u0004\u0000\u0000\u026b\u026c\u0007\u0005"+ - "\u0000\u0000\u026c\u026d\u0007\u0006\u0000\u0000\u026d\u026e\u0007\u0007"+ - "\u0000\u0000\u026e\u026f\u0005_\u0000\u0000\u026f\u0270\u0007\b\u0000"+ - "\u0000\u0270\u0271\u0007\t\u0000\u0000\u0271\u0272\u0007\n\u0000\u0000"+ - "\u0272\u0273\u0007\u0005\u0000\u0000\u0273\u0274\u0007\u000b\u0000\u0000"+ - "\u0274\u0275\u0001\u0000\u0000\u0000\u0275\u0276\u0006\u0003\u0001\u0000"+ - "\u0276\u0018\u0001\u0000\u0000\u0000\u0277\u0278\u0007\u0007\u0000\u0000"+ - "\u0278\u0279\u0007\u0005\u0000\u0000\u0279\u027a\u0007\f\u0000\u0000\u027a"+ - "\u027b\u0007\n\u0000\u0000\u027b\u027c\u0007\u0002\u0000\u0000\u027c\u027d"+ - "\u0007\u0003\u0000\u0000\u027d\u027e\u0001\u0000\u0000\u0000\u027e\u027f"+ - "\u0006\u0004\u0002\u0000\u027f\u001a\u0001\u0000\u0000\u0000\u0280\u0281"+ - "\u0004\u0005\u0000\u0000\u0281\u0282\u0007\u0007\u0000\u0000\u0282\u0283"+ - "\u0007\r\u0000\u0000\u0283\u0284\u0007\b\u0000\u0000\u0284\u0285\u0007"+ - "\u000e\u0000\u0000\u0285\u0286\u0007\u0004\u0000\u0000\u0286\u0287\u0007"+ - "\n\u0000\u0000\u0287\u0288\u0007\u0005\u0000\u0000\u0288\u0289\u0001\u0000"+ - "\u0000\u0000\u0289\u028a\u0006\u0005\u0003\u0000\u028a\u001c\u0001\u0000"+ - "\u0000\u0000\u028b\u028c\u0007\u0002\u0000\u0000\u028c\u028d\u0007\t\u0000"+ - "\u0000\u028d\u028e\u0007\u000f\u0000\u0000\u028e\u028f\u0007\b\u0000\u0000"+ - "\u028f\u0290\u0007\u000e\u0000\u0000\u0290\u0291\u0007\u0007\u0000\u0000"+ - "\u0291\u0292\u0007\u000b\u0000\u0000\u0292\u0293\u0007\n\u0000\u0000\u0293"+ - "\u0294\u0007\t\u0000\u0000\u0294\u0295\u0007\u0005\u0000\u0000\u0295\u0296"+ - "\u0001\u0000\u0000\u0000\u0296\u0297\u0006\u0006\u0004\u0000\u0297\u001e"+ - "\u0001\u0000\u0000\u0000\u0298\u0299\u0007\u0010\u0000\u0000\u0299\u029a"+ - "\u0007\n\u0000\u0000\u029a\u029b\u0007\u0011\u0000\u0000\u029b\u029c\u0007"+ - "\u0011\u0000\u0000\u029c\u029d\u0007\u0007\u0000\u0000\u029d\u029e\u0007"+ - "\u0002\u0000\u0000\u029e\u029f\u0007\u000b\u0000\u0000\u029f\u02a0\u0001"+ - "\u0000\u0000\u0000\u02a0\u02a1\u0006\u0007\u0004\u0000\u02a1 \u0001\u0000"+ - "\u0000\u0000\u02a2\u02a3\u0007\u0007\u0000\u0000\u02a3\u02a4\u0007\u0012"+ - "\u0000\u0000\u02a4\u02a5\u0007\u0004\u0000\u0000\u02a5\u02a6\u0007\u000e"+ - "\u0000\u0000\u02a6\u02a7\u0001\u0000\u0000\u0000\u02a7\u02a8\u0006\b\u0004"+ - "\u0000\u02a8\"\u0001\u0000\u0000\u0000\u02a9\u02aa\u0007\u0006\u0000\u0000"+ - "\u02aa\u02ab\u0007\f\u0000\u0000\u02ab\u02ac\u0007\t\u0000\u0000\u02ac"+ - "\u02ad\u0007\u0013\u0000\u0000\u02ad\u02ae\u0001\u0000\u0000\u0000\u02ae"+ - "\u02af\u0006\t\u0004\u0000\u02af$\u0001\u0000\u0000\u0000\u02b0\u02b1"+ - "\u0007\u000e\u0000\u0000\u02b1\u02b2\u0007\n\u0000\u0000\u02b2\u02b3\u0007"+ - "\u000f\u0000\u0000\u02b3\u02b4\u0007\n\u0000\u0000\u02b4\u02b5\u0007\u000b"+ - "\u0000\u0000\u02b5\u02b6\u0001\u0000\u0000\u0000\u02b6\u02b7\u0006\n\u0004"+ - "\u0000\u02b7&\u0001\u0000\u0000\u0000\u02b8\u02b9\u0007\f\u0000\u0000"+ - "\u02b9\u02ba\u0007\u0007\u0000\u0000\u02ba\u02bb\u0007\f\u0000\u0000\u02bb"+ - "\u02bc\u0007\u0004\u0000\u0000\u02bc\u02bd\u0007\u0005\u0000\u0000\u02bd"+ - "\u02be\u0007\u0013\u0000\u0000\u02be\u02bf\u0001\u0000\u0000\u0000\u02bf"+ - "\u02c0\u0006\u000b\u0004\u0000\u02c0(\u0001\u0000\u0000\u0000\u02c1\u02c2"+ - "\u0007\f\u0000\u0000\u02c2\u02c3\u0007\t\u0000\u0000\u02c3\u02c4\u0007"+ - "\u0014\u0000\u0000\u02c4\u02c5\u0001\u0000\u0000\u0000\u02c5\u02c6\u0006"+ - "\f\u0004\u0000\u02c6*\u0001\u0000\u0000\u0000\u02c7\u02c8\u0007\u0011"+ - "\u0000\u0000\u02c8\u02c9\u0007\u0004\u0000\u0000\u02c9\u02ca\u0007\u000f"+ - "\u0000\u0000\u02ca\u02cb\u0007\b\u0000\u0000\u02cb\u02cc\u0007\u000e\u0000"+ - "\u0000\u02cc\u02cd\u0007\u0007\u0000\u0000\u02cd\u02ce\u0001\u0000\u0000"+ - "\u0000\u02ce\u02cf\u0006\r\u0004\u0000\u02cf,\u0001\u0000\u0000\u0000"+ - "\u02d0\u02d1\u0007\u0011\u0000\u0000\u02d1\u02d2\u0007\t\u0000\u0000\u02d2"+ - "\u02d3\u0007\f\u0000\u0000\u02d3\u02d4\u0007\u000b\u0000\u0000\u02d4\u02d5"+ - "\u0001\u0000\u0000\u0000\u02d5\u02d6\u0006\u000e\u0004\u0000\u02d6.\u0001"+ - "\u0000\u0000\u0000\u02d7\u02d8\u0007\u0011\u0000\u0000\u02d8\u02d9\u0007"+ - "\u000b\u0000\u0000\u02d9\u02da\u0007\u0004\u0000\u0000\u02da\u02db\u0007"+ - "\u000b\u0000\u0000\u02db\u02dc\u0007\u0011\u0000\u0000\u02dc\u02dd\u0001"+ - "\u0000\u0000\u0000\u02dd\u02de\u0006\u000f\u0004\u0000\u02de0\u0001\u0000"+ - "\u0000\u0000\u02df\u02e0\u0007\u0014\u0000\u0000\u02e0\u02e1\u0007\u0003"+ - "\u0000\u0000\u02e1\u02e2\u0007\u0007\u0000\u0000\u02e2\u02e3\u0007\f\u0000"+ - "\u0000\u02e3\u02e4\u0007\u0007\u0000\u0000\u02e4\u02e5\u0001\u0000\u0000"+ - "\u0000\u02e5\u02e6\u0006\u0010\u0004\u0000\u02e62\u0001\u0000\u0000\u0000"+ - "\u02e7\u02e8\u0004\u0011\u0001\u0000\u02e8\u02e9\u0007\n\u0000\u0000\u02e9"+ - "\u02ea\u0007\u0005\u0000\u0000\u02ea\u02eb\u0007\u000e\u0000\u0000\u02eb"+ - "\u02ec\u0007\n\u0000\u0000\u02ec\u02ed\u0007\u0005\u0000\u0000\u02ed\u02ee"+ - "\u0007\u0007\u0000\u0000\u02ee\u02ef\u0007\u0011\u0000\u0000\u02ef\u02f0"+ - "\u0007\u000b\u0000\u0000\u02f0\u02f1\u0007\u0004\u0000\u0000\u02f1\u02f2"+ - "\u0007\u000b\u0000\u0000\u02f2\u02f3\u0007\u0011\u0000\u0000\u02f3\u02f4"+ - "\u0001\u0000\u0000\u0000\u02f4\u02f5\u0006\u0011\u0004\u0000\u02f54\u0001"+ - "\u0000\u0000\u0000\u02f6\u02f7\u0007\u0015\u0000\u0000\u02f7\u02f8\u0007"+ - "\f\u0000\u0000\u02f8\u02f9\u0007\t\u0000\u0000\u02f9\u02fa\u0007\u000f"+ - "\u0000\u0000\u02fa\u02fb\u0001\u0000\u0000\u0000\u02fb\u02fc\u0006\u0012"+ - "\u0005\u0000\u02fc6\u0001\u0000\u0000\u0000\u02fd\u02fe\u0007\u000b\u0000"+ - "\u0000\u02fe\u02ff\u0007\u0011\u0000\u0000\u02ff\u0300\u0001\u0000\u0000"+ - "\u0000\u0300\u0301\u0006\u0013\u0005\u0000\u03018\u0001\u0000\u0000\u0000"+ - "\u0302\u0303\u0007\u0015\u0000\u0000\u0303\u0304\u0007\t\u0000\u0000\u0304"+ - "\u0305\u0007\f\u0000\u0000\u0305\u0306\u0007\u0013\u0000\u0000\u0306\u0307"+ - "\u0001\u0000\u0000\u0000\u0307\u0308\u0006\u0014\u0006\u0000\u0308:\u0001"+ - "\u0000\u0000\u0000\u0309\u030a\u0004\u0015\u0002\u0000\u030a\u030b\u0007"+ - "\u0015\u0000\u0000\u030b\u030c\u0007\u0016\u0000\u0000\u030c\u030d\u0007"+ - "\u0011\u0000\u0000\u030d\u030e\u0007\u0007\u0000\u0000\u030e\u030f\u0001"+ - "\u0000\u0000\u0000\u030f\u0310\u0006\u0015\u0007\u0000\u0310<\u0001\u0000"+ - "\u0000\u0000\u0311\u0312\u0007\u000e\u0000\u0000\u0312\u0313\u0007\t\u0000"+ - "\u0000\u0313\u0314\u0007\t\u0000\u0000\u0314\u0315\u0007\u0013\u0000\u0000"+ - "\u0315\u0316\u0007\u0016\u0000\u0000\u0316\u0317\u0007\b\u0000\u0000\u0317"+ - "\u0318\u0001\u0000\u0000\u0000\u0318\u0319\u0006\u0016\b\u0000\u0319>"+ - "\u0001\u0000\u0000\u0000\u031a\u031b\u0004\u0017\u0003\u0000\u031b\u031c"+ - "\u0007\u0015\u0000\u0000\u031c\u031d\u0007\u0016\u0000\u0000\u031d\u031e"+ - "\u0007\u000e\u0000\u0000\u031e\u031f\u0007\u000e\u0000\u0000\u031f\u0320"+ - "\u0001\u0000\u0000\u0000\u0320\u0321\u0006\u0017\b\u0000\u0321@\u0001"+ - "\u0000\u0000\u0000\u0322\u0323\u0004\u0018\u0004\u0000\u0323\u0324\u0007"+ - "\u000e\u0000\u0000\u0324\u0325\u0007\u0007\u0000\u0000\u0325\u0326\u0007"+ - "\u0015\u0000\u0000\u0326\u0327\u0007\u000b\u0000\u0000\u0327\u0328\u0001"+ - "\u0000\u0000\u0000\u0328\u0329\u0006\u0018\b\u0000\u0329B\u0001\u0000"+ - "\u0000\u0000\u032a\u032b\u0004\u0019\u0005\u0000\u032b\u032c\u0007\f\u0000"+ - "\u0000\u032c\u032d\u0007\n\u0000\u0000\u032d\u032e\u0007\u0006\u0000\u0000"+ - "\u032e\u032f\u0007\u0003\u0000\u0000\u032f\u0330\u0007\u000b\u0000\u0000"+ - "\u0330\u0331\u0001\u0000\u0000\u0000\u0331\u0332\u0006\u0019\b\u0000\u0332"+ - "D\u0001\u0000\u0000\u0000\u0333\u0334\u0004\u001a\u0006\u0000\u0334\u0335"+ - "\u0007\u000e\u0000\u0000\u0335\u0336\u0007\t\u0000\u0000\u0336\u0337\u0007"+ - "\t\u0000\u0000\u0337\u0338\u0007\u0013\u0000\u0000\u0338\u0339\u0007\u0016"+ - "\u0000\u0000\u0339\u033a\u0007\b\u0000\u0000\u033a\u033b\u0005_\u0000"+ - "\u0000\u033b\u033c\u0005\u8001\uf414\u0000\u0000\u033c\u033d\u0001\u0000"+ - "\u0000\u0000\u033d\u033e\u0006\u001a\t\u0000\u033eF\u0001\u0000\u0000"+ - "\u0000\u033f\u0340\u0007\u000f\u0000\u0000\u0340\u0341\u0007\u0012\u0000"+ - "\u0000\u0341\u0342\u0005_\u0000\u0000\u0342\u0343\u0007\u0007\u0000\u0000"+ - "\u0343\u0344\u0007\r\u0000\u0000\u0344\u0345\u0007\b\u0000\u0000\u0345"+ - "\u0346\u0007\u0004\u0000\u0000\u0346\u0347\u0007\u0005\u0000\u0000\u0347"+ - "\u0348\u0007\u0010\u0000\u0000\u0348\u0349\u0001\u0000\u0000\u0000\u0349"+ - "\u034a\u0006\u001b\n\u0000\u034aH\u0001\u0000\u0000\u0000\u034b\u034c"+ - "\u0007\u0010\u0000\u0000\u034c\u034d\u0007\f\u0000\u0000\u034d\u034e\u0007"+ - "\t\u0000\u0000\u034e\u034f\u0007\b\u0000\u0000\u034f\u0350\u0001\u0000"+ - "\u0000\u0000\u0350\u0351\u0006\u001c\u000b\u0000\u0351J\u0001\u0000\u0000"+ - "\u0000\u0352\u0353\u0007\u0013\u0000\u0000\u0353\u0354\u0007\u0007\u0000"+ - "\u0000\u0354\u0355\u0007\u0007\u0000\u0000\u0355\u0356\u0007\b\u0000\u0000"+ - "\u0356\u0357\u0001\u0000\u0000\u0000\u0357\u0358\u0006\u001d\u000b\u0000"+ - "\u0358L\u0001\u0000\u0000\u0000\u0359\u035a\u0004\u001e\u0007\u0000\u035a"+ - "\u035b\u0007\n\u0000\u0000\u035b\u035c\u0007\u0005\u0000\u0000\u035c\u035d"+ - "\u0007\u0011\u0000\u0000\u035d\u035e\u0007\n\u0000\u0000\u035e\u035f\u0007"+ - "\u0011\u0000\u0000\u035f\u0360\u0007\u000b\u0000\u0000\u0360\u0361\u0005"+ - "_\u0000\u0000\u0361\u0362\u0005\u8001\uf414\u0000\u0000\u0362\u0363\u0001"+ - "\u0000\u0000\u0000\u0363\u0364\u0006\u001e\u000b\u0000\u0364N\u0001\u0000"+ - "\u0000\u0000\u0365\u0366\u0007\f\u0000\u0000\u0366\u0367\u0007\u0007\u0000"+ - "\u0000\u0367\u0368\u0007\u0005\u0000\u0000\u0368\u0369\u0007\u0004\u0000"+ - "\u0000\u0369\u036a\u0007\u000f\u0000\u0000\u036a\u036b\u0007\u0007\u0000"+ - "\u0000\u036b\u036c\u0001\u0000\u0000\u0000\u036c\u036d\u0006\u001f\f\u0000"+ - "\u036dP\u0001\u0000\u0000\u0000\u036e\u036f\u0007\u0011\u0000\u0000\u036f"+ - "\u0370\u0007\u0007\u0000\u0000\u0370\u0371\u0007\u000b\u0000\u0000\u0371"+ - "\u0372\u0001\u0000\u0000\u0000\u0372\u0373\u0006 \r\u0000\u0373R\u0001"+ - "\u0000\u0000\u0000\u0374\u0375\u0007\u0011\u0000\u0000\u0375\u0376\u0007"+ - "\u0003\u0000\u0000\u0376\u0377\u0007\t\u0000\u0000\u0377\u0378\u0007\u0014"+ - "\u0000\u0000\u0378\u0379\u0001\u0000\u0000\u0000\u0379\u037a\u0006!\u000e"+ - "\u0000\u037aT\u0001\u0000\u0000\u0000\u037b\u037d\b\u0017\u0000\u0000"+ - "\u037c\u037b\u0001\u0000\u0000\u0000\u037d\u037e\u0001\u0000\u0000\u0000"+ - "\u037e\u037c\u0001\u0000\u0000\u0000\u037e\u037f\u0001\u0000\u0000\u0000"+ - "\u037f\u0380\u0001\u0000\u0000\u0000\u0380\u0381\u0006\"\u0004\u0000\u0381"+ - "V\u0001\u0000\u0000\u0000\u0382\u0383\u0003\u00b3Q\u0000\u0383\u0384\u0001"+ - "\u0000\u0000\u0000\u0384\u0385\u0006#\u000f\u0000\u0385\u0386\u0006#\u0010"+ - "\u0000\u0386X\u0001\u0000\u0000\u0000\u0387\u0388\u0003\u012b\u008d\u0000"+ - "\u0388\u0389\u0001\u0000\u0000\u0000\u0389\u038a\u0006$\u0011\u0000\u038a"+ - "\u038b\u0006$\u0010\u0000\u038b\u038c\u0006$\u0010\u0000\u038cZ\u0001"+ - "\u0000\u0000\u0000\u038d\u038e\u0003\u00f5r\u0000\u038e\u038f\u0001\u0000"+ - "\u0000\u0000\u038f\u0390\u0006%\u0012\u0000\u0390\\\u0001\u0000\u0000"+ - "\u0000\u0391\u0392\u0003\u0201\u00f8\u0000\u0392\u0393\u0001\u0000\u0000"+ - "\u0000\u0393\u0394\u0006&\u0013\u0000\u0394^\u0001\u0000\u0000\u0000\u0395"+ - "\u0396\u0003\u00e1h\u0000\u0396\u0397\u0001\u0000\u0000\u0000\u0397\u0398"+ - "\u0006\'\u0014\u0000\u0398`\u0001\u0000\u0000\u0000\u0399\u039a\u0003"+ - "\u00ddf\u0000\u039a\u039b\u0001\u0000\u0000\u0000\u039b\u039c\u0006(\u0015"+ - "\u0000\u039cb\u0001\u0000\u0000\u0000\u039d\u039e\u0003\u0125\u008a\u0000"+ - "\u039e\u039f\u0001\u0000\u0000\u0000\u039f\u03a0\u0006)\u0016\u0000\u03a0"+ - "d\u0001\u0000\u0000\u0000\u03a1\u03a2\u0003\u0127\u008b\u0000\u03a2\u03a3"+ - "\u0001\u0000\u0000\u0000\u03a3\u03a4\u0006*\u0017\u0000\u03a4f\u0001\u0000"+ - "\u0000\u0000\u03a5\u03a6\u0003\u0131\u0090\u0000\u03a6\u03a7\u0001\u0000"+ - "\u0000\u0000\u03a7\u03a8\u0006+\u0018\u0000\u03a8h\u0001\u0000\u0000\u0000"+ - "\u03a9\u03aa\u0003\u012d\u008e\u0000\u03aa\u03ab\u0001\u0000\u0000\u0000"+ - "\u03ab\u03ac\u0006,\u0019\u0000\u03acj\u0001\u0000\u0000\u0000\u03ad\u03ae"+ - "\u0003\u0011\u0000\u0000\u03ae\u03af\u0001\u0000\u0000\u0000\u03af\u03b0"+ - "\u0006-\u0000\u0000\u03b0l\u0001\u0000\u0000\u0000\u03b1\u03b2\u0003\u0013"+ - "\u0001\u0000\u03b2\u03b3\u0001\u0000\u0000\u0000\u03b3\u03b4\u0006.\u0000"+ - "\u0000\u03b4n\u0001\u0000\u0000\u0000\u03b5\u03b6\u0003\u0015\u0002\u0000"+ - "\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u03b8\u0006/\u0000\u0000\u03b8"+ - "p\u0001\u0000\u0000\u0000\u03b9\u03ba\u0003\u00b3Q\u0000\u03ba\u03bb\u0001"+ - "\u0000\u0000\u0000\u03bb\u03bc\u00060\u000f\u0000\u03bc\u03bd\u00060\u0010"+ - "\u0000\u03bdr\u0001\u0000\u0000\u0000\u03be\u03bf\u0003\u012b\u008d\u0000"+ - "\u03bf\u03c0\u0001\u0000\u0000\u0000\u03c0\u03c1\u00061\u0011\u0000\u03c1"+ - "\u03c2\u00061\u0010\u0000\u03c2\u03c3\u00061\u0010\u0000\u03c3t\u0001"+ - "\u0000\u0000\u0000\u03c4\u03c5\u0003\u00f5r\u0000\u03c5\u03c6\u0001\u0000"+ - "\u0000\u0000\u03c6\u03c7\u00062\u0012\u0000\u03c7\u03c8\u00062\u001a\u0000"+ - "\u03c8v\u0001\u0000\u0000\u0000\u03c9\u03ca\u0003\u00ffw\u0000\u03ca\u03cb"+ - "\u0001\u0000\u0000\u0000\u03cb\u03cc\u00063\u001b\u0000\u03cc\u03cd\u0006"+ - "3\u001a\u0000\u03cdx\u0001\u0000\u0000\u0000\u03ce\u03cf\b\u0018\u0000"+ - "\u0000\u03cfz\u0001\u0000\u0000\u0000\u03d0\u03d2\u0003y4\u0000\u03d1"+ - "\u03d0\u0001\u0000\u0000\u0000\u03d2\u03d3\u0001\u0000\u0000\u0000\u03d3"+ - "\u03d1\u0001\u0000\u0000\u0000\u03d3\u03d4\u0001\u0000\u0000\u0000\u03d4"+ - "\u03d5\u0001\u0000\u0000\u0000\u03d5\u03d6\u0003\u00d9d\u0000\u03d6\u03d8"+ - "\u0001\u0000\u0000\u0000\u03d7\u03d1\u0001\u0000\u0000\u0000\u03d7\u03d8"+ - "\u0001\u0000\u0000\u0000\u03d8\u03da\u0001\u0000\u0000\u0000\u03d9\u03db"+ - "\u0003y4\u0000\u03da\u03d9\u0001\u0000\u0000\u0000\u03db\u03dc\u0001\u0000"+ - "\u0000\u0000\u03dc\u03da\u0001\u0000\u0000\u0000\u03dc\u03dd\u0001\u0000"+ - "\u0000\u0000\u03dd|\u0001\u0000\u0000\u0000\u03de\u03df\u0003{5\u0000"+ - "\u03df\u03e0\u0001\u0000\u0000\u0000\u03e0\u03e1\u00066\u001c\u0000\u03e1"+ - "~\u0001\u0000\u0000\u0000\u03e2\u03e3\u0003\u00c9\\\u0000\u03e3\u03e4"+ - "\u0001\u0000\u0000\u0000\u03e4\u03e5\u00067\u001d\u0000\u03e5\u0080\u0001"+ - "\u0000\u0000\u0000\u03e6\u03e7\u0003\u0011\u0000\u0000\u03e7\u03e8\u0001"+ - "\u0000\u0000\u0000\u03e8\u03e9\u00068\u0000\u0000\u03e9\u0082\u0001\u0000"+ - "\u0000\u0000\u03ea\u03eb\u0003\u0013\u0001\u0000\u03eb\u03ec\u0001\u0000"+ - "\u0000\u0000\u03ec\u03ed\u00069\u0000\u0000\u03ed\u0084\u0001\u0000\u0000"+ - "\u0000\u03ee\u03ef\u0003\u0015\u0002\u0000\u03ef\u03f0\u0001\u0000\u0000"+ - "\u0000\u03f0\u03f1\u0006:\u0000\u0000\u03f1\u0086\u0001\u0000\u0000\u0000"+ - "\u03f2\u03f3\u0003\u00b3Q\u0000\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4"+ - "\u03f5\u0006;\u000f\u0000\u03f5\u03f6\u0006;\u0010\u0000\u03f6\u03f7\u0006"+ - ";\u0010\u0000\u03f7\u0088\u0001\u0000\u0000\u0000\u03f8\u03f9\u0003\u012b"+ - "\u008d\u0000\u03f9\u03fa\u0001\u0000\u0000\u0000\u03fa\u03fb\u0006<\u0011"+ - "\u0000\u03fb\u03fc\u0006<\u0010\u0000\u03fc\u03fd\u0006<\u0010\u0000\u03fd"+ - "\u03fe\u0006<\u0010\u0000\u03fe\u008a\u0001\u0000\u0000\u0000\u03ff\u0400"+ - "\u0003\u0125\u008a\u0000\u0400\u0401\u0001\u0000\u0000\u0000\u0401\u0402"+ - "\u0006=\u0016\u0000\u0402\u008c\u0001\u0000\u0000\u0000\u0403\u0404\u0003"+ - "\u0127\u008b\u0000\u0404\u0405\u0001\u0000\u0000\u0000\u0405\u0406\u0006"+ - ">\u0017\u0000\u0406\u008e\u0001\u0000\u0000\u0000\u0407\u0408\u0003\u00d3"+ - "a\u0000\u0408\u0409\u0001\u0000\u0000\u0000\u0409\u040a\u0006?\u001e\u0000"+ - "\u040a\u0090\u0001\u0000\u0000\u0000\u040b\u040c\u0003\u00ddf\u0000\u040c"+ - "\u040d\u0001\u0000\u0000\u0000\u040d\u040e\u0006@\u0015\u0000\u040e\u0092"+ - "\u0001\u0000\u0000\u0000\u040f\u0410\u0003\u00e1h\u0000\u0410\u0411\u0001"+ - "\u0000\u0000\u0000\u0411\u0412\u0006A\u0014\u0000\u0412\u0094\u0001\u0000"+ - "\u0000\u0000\u0413\u0414\u0003\u00ffw\u0000\u0414\u0415\u0001\u0000\u0000"+ - "\u0000\u0415\u0416\u0006B\u001b\u0000\u0416\u0096\u0001\u0000\u0000\u0000"+ - "\u0417\u0418\u0003\u01e3\u00e9\u0000\u0418\u0419\u0001\u0000\u0000\u0000"+ - "\u0419\u041a\u0006C\u001f\u0000\u041a\u0098\u0001\u0000\u0000\u0000\u041b"+ - "\u041c\u0003\u0131\u0090\u0000\u041c\u041d\u0001\u0000\u0000\u0000\u041d"+ - "\u041e\u0006D\u0018\u0000\u041e\u009a\u0001\u0000\u0000\u0000\u041f\u0420"+ - "\u0003\u00f9t\u0000\u0420\u0421\u0001\u0000\u0000\u0000\u0421\u0422\u0006"+ - "E \u0000\u0422\u009c\u0001\u0000\u0000\u0000\u0423\u0424\u0003\u0121\u0088"+ - "\u0000\u0424\u0425\u0001\u0000\u0000\u0000\u0425\u0426\u0006F!\u0000\u0426"+ - "\u009e\u0001\u0000\u0000\u0000\u0427\u0428\u0003\u011d\u0086\u0000\u0428"+ - "\u0429\u0001\u0000\u0000\u0000\u0429\u042a\u0006G\"\u0000\u042a\u00a0"+ - "\u0001\u0000\u0000\u0000\u042b\u042c\u0003\u0123\u0089\u0000\u042c\u042d"+ - "\u0001\u0000\u0000\u0000\u042d\u042e\u0006H#\u0000\u042e\u00a2\u0001\u0000"+ - "\u0000\u0000\u042f\u0430\u0003\u0011\u0000\u0000\u0430\u0431\u0001\u0000"+ - "\u0000\u0000\u0431\u0432\u0006I\u0000\u0000\u0432\u00a4\u0001\u0000\u0000"+ - "\u0000\u0433\u0434\u0003\u0013\u0001\u0000\u0434\u0435\u0001\u0000\u0000"+ - "\u0000\u0435\u0436\u0006J\u0000\u0000\u0436\u00a6\u0001\u0000\u0000\u0000"+ - "\u0437\u0438\u0003\u0015\u0002\u0000\u0438\u0439\u0001\u0000\u0000\u0000"+ - "\u0439\u043a\u0006K\u0000\u0000\u043a\u00a8\u0001\u0000\u0000\u0000\u043b"+ - "\u043c\u0003\u0129\u008c\u0000\u043c\u043d\u0001\u0000\u0000\u0000\u043d"+ - "\u043e\u0006L$\u0000\u043e\u043f\u0006L%\u0000\u043f\u00aa\u0001\u0000"+ - "\u0000\u0000\u0440\u0441\u0003\u00b3Q\u0000\u0441\u0442\u0001\u0000\u0000"+ - "\u0000\u0442\u0443\u0006M\u000f\u0000\u0443\u0444\u0006M\u0010\u0000\u0444"+ - "\u00ac\u0001\u0000\u0000\u0000\u0445\u0446\u0003\u0015\u0002\u0000\u0446"+ - "\u0447\u0001\u0000\u0000\u0000\u0447\u0448\u0006N\u0000\u0000\u0448\u00ae"+ - "\u0001\u0000\u0000\u0000\u0449\u044a\u0003\u0011\u0000\u0000\u044a\u044b"+ - "\u0001\u0000\u0000\u0000\u044b\u044c\u0006O\u0000\u0000\u044c\u00b0\u0001"+ - "\u0000\u0000\u0000\u044d\u044e\u0003\u0013\u0001\u0000\u044e\u044f\u0001"+ - "\u0000\u0000\u0000\u044f\u0450\u0006P\u0000\u0000\u0450\u00b2\u0001\u0000"+ - "\u0000\u0000\u0451\u0452\u0005|\u0000\u0000\u0452\u0453\u0001\u0000\u0000"+ - "\u0000\u0453\u0454\u0006Q\u0010\u0000\u0454\u00b4\u0001\u0000\u0000\u0000"+ - "\u0455\u0456\u0007\u0019\u0000\u0000\u0456\u00b6\u0001\u0000\u0000\u0000"+ - "\u0457\u0458\u0007\u001a\u0000\u0000\u0458\u00b8\u0001\u0000\u0000\u0000"+ - "\u0459\u045a\u0005\\\u0000\u0000\u045a\u045b\u0007\u001b\u0000\u0000\u045b"+ - "\u00ba\u0001\u0000\u0000\u0000\u045c\u045d\b\u001c\u0000\u0000\u045d\u00bc"+ - "\u0001\u0000\u0000\u0000\u045e\u0460\u0007\u0007\u0000\u0000\u045f\u0461"+ - "\u0007\u001d\u0000\u0000\u0460\u045f\u0001\u0000\u0000\u0000\u0460\u0461"+ - "\u0001\u0000\u0000\u0000\u0461\u0463\u0001\u0000\u0000\u0000\u0462\u0464"+ - "\u0003\u00b5R\u0000\u0463\u0462\u0001\u0000\u0000\u0000\u0464\u0465\u0001"+ - "\u0000\u0000\u0000\u0465\u0463\u0001\u0000\u0000\u0000\u0465\u0466\u0001"+ - "\u0000\u0000\u0000\u0466\u00be\u0001\u0000\u0000\u0000\u0467\u0468\u0005"+ - "@\u0000\u0000\u0468\u00c0\u0001\u0000\u0000\u0000\u0469\u046a\u0005`\u0000"+ - "\u0000\u046a\u00c2\u0001\u0000\u0000\u0000\u046b\u046f\b\u001e\u0000\u0000"+ - "\u046c\u046d\u0005`\u0000\u0000\u046d\u046f\u0005`\u0000\u0000\u046e\u046b"+ - "\u0001\u0000\u0000\u0000\u046e\u046c\u0001\u0000\u0000\u0000\u046f\u00c4"+ - "\u0001\u0000\u0000\u0000\u0470\u0471\u0005_\u0000\u0000\u0471\u00c6\u0001"+ - "\u0000\u0000\u0000\u0472\u0476\u0003\u00b7S\u0000\u0473\u0476\u0003\u00b5"+ - "R\u0000\u0474\u0476\u0003\u00c5Z\u0000\u0475\u0472\u0001\u0000\u0000\u0000"+ - "\u0475\u0473\u0001\u0000\u0000\u0000\u0475\u0474\u0001\u0000\u0000\u0000"+ - "\u0476\u00c8\u0001\u0000\u0000\u0000\u0477\u047c\u0005\"\u0000\u0000\u0478"+ - "\u047b\u0003\u00b9T\u0000\u0479\u047b\u0003\u00bbU\u0000\u047a\u0478\u0001"+ - "\u0000\u0000\u0000\u047a\u0479\u0001\u0000\u0000\u0000\u047b\u047e\u0001"+ - "\u0000\u0000\u0000\u047c\u047a\u0001\u0000\u0000\u0000\u047c\u047d\u0001"+ - "\u0000\u0000\u0000\u047d\u047f\u0001\u0000\u0000\u0000\u047e\u047c\u0001"+ - "\u0000\u0000\u0000\u047f\u0495\u0005\"\u0000\u0000\u0480\u0481\u0005\""+ - "\u0000\u0000\u0481\u0482\u0005\"\u0000\u0000\u0482\u0483\u0005\"\u0000"+ - "\u0000\u0483\u0487\u0001\u0000\u0000\u0000\u0484\u0486\b\u0000\u0000\u0000"+ - "\u0485\u0484\u0001\u0000\u0000\u0000\u0486\u0489\u0001\u0000\u0000\u0000"+ - "\u0487\u0488\u0001\u0000\u0000\u0000\u0487\u0485\u0001\u0000\u0000\u0000"+ - "\u0488\u048a\u0001\u0000\u0000\u0000\u0489\u0487\u0001\u0000\u0000\u0000"+ - "\u048a\u048b\u0005\"\u0000\u0000\u048b\u048c\u0005\"\u0000\u0000\u048c"+ - "\u048d\u0005\"\u0000\u0000\u048d\u048f\u0001\u0000\u0000\u0000\u048e\u0490"+ - "\u0005\"\u0000\u0000\u048f\u048e\u0001\u0000\u0000\u0000\u048f\u0490\u0001"+ - "\u0000\u0000\u0000\u0490\u0492\u0001\u0000\u0000\u0000\u0491\u0493\u0005"+ - "\"\u0000\u0000\u0492\u0491\u0001\u0000\u0000\u0000\u0492\u0493\u0001\u0000"+ - "\u0000\u0000\u0493\u0495\u0001\u0000\u0000\u0000\u0494\u0477\u0001\u0000"+ - "\u0000\u0000\u0494\u0480\u0001\u0000\u0000\u0000\u0495\u00ca\u0001\u0000"+ - "\u0000\u0000\u0496\u0498\u0003\u00b5R\u0000\u0497\u0496\u0001\u0000\u0000"+ - "\u0000\u0498\u0499\u0001\u0000\u0000\u0000\u0499\u0497\u0001\u0000\u0000"+ - "\u0000\u0499\u049a\u0001\u0000\u0000\u0000\u049a\u00cc\u0001\u0000\u0000"+ - "\u0000\u049b\u049d\u0003\u00b5R\u0000\u049c\u049b\u0001\u0000\u0000\u0000"+ - "\u049d\u049e\u0001\u0000\u0000\u0000\u049e\u049c\u0001\u0000\u0000\u0000"+ - "\u049e\u049f\u0001\u0000\u0000\u0000\u049f\u04a0\u0001\u0000\u0000\u0000"+ - "\u04a0\u04a4\u0003\u00e1h\u0000\u04a1\u04a3\u0003\u00b5R\u0000\u04a2\u04a1"+ - "\u0001\u0000\u0000\u0000\u04a3\u04a6\u0001\u0000\u0000\u0000\u04a4\u04a2"+ - "\u0001\u0000\u0000\u0000\u04a4\u04a5\u0001\u0000\u0000\u0000\u04a5\u04c6"+ - "\u0001\u0000\u0000\u0000\u04a6\u04a4\u0001\u0000\u0000\u0000\u04a7\u04a9"+ - "\u0003\u00e1h\u0000\u04a8\u04aa\u0003\u00b5R\u0000\u04a9\u04a8\u0001\u0000"+ - "\u0000\u0000\u04aa\u04ab\u0001\u0000\u0000\u0000\u04ab\u04a9\u0001\u0000"+ - "\u0000\u0000\u04ab\u04ac\u0001\u0000\u0000\u0000\u04ac\u04c6\u0001\u0000"+ - "\u0000\u0000\u04ad\u04af\u0003\u00b5R\u0000\u04ae\u04ad\u0001\u0000\u0000"+ - "\u0000\u04af\u04b0\u0001\u0000\u0000\u0000\u04b0\u04ae\u0001\u0000\u0000"+ - "\u0000\u04b0\u04b1\u0001\u0000\u0000\u0000\u04b1\u04b9\u0001\u0000\u0000"+ - "\u0000\u04b2\u04b6\u0003\u00e1h\u0000\u04b3\u04b5\u0003\u00b5R\u0000\u04b4"+ - "\u04b3\u0001\u0000\u0000\u0000\u04b5\u04b8\u0001\u0000\u0000\u0000\u04b6"+ - "\u04b4\u0001\u0000\u0000\u0000\u04b6\u04b7\u0001\u0000\u0000\u0000\u04b7"+ - "\u04ba\u0001\u0000\u0000\u0000\u04b8\u04b6\u0001\u0000\u0000\u0000\u04b9"+ - "\u04b2\u0001\u0000\u0000\u0000\u04b9\u04ba\u0001\u0000\u0000\u0000\u04ba"+ - "\u04bb\u0001\u0000\u0000\u0000\u04bb\u04bc\u0003\u00bdV\u0000\u04bc\u04c6"+ - "\u0001\u0000\u0000\u0000\u04bd\u04bf\u0003\u00e1h\u0000\u04be\u04c0\u0003"+ - "\u00b5R\u0000\u04bf\u04be\u0001\u0000\u0000\u0000\u04c0\u04c1\u0001\u0000"+ - "\u0000\u0000\u04c1\u04bf\u0001\u0000\u0000\u0000\u04c1\u04c2\u0001\u0000"+ - "\u0000\u0000\u04c2\u04c3\u0001\u0000\u0000\u0000\u04c3\u04c4\u0003\u00bd"+ - "V\u0000\u04c4\u04c6\u0001\u0000\u0000\u0000\u04c5\u049c\u0001\u0000\u0000"+ - "\u0000\u04c5\u04a7\u0001\u0000\u0000\u0000\u04c5\u04ae\u0001\u0000\u0000"+ - "\u0000\u04c5\u04bd\u0001\u0000\u0000\u0000\u04c6\u00ce\u0001\u0000\u0000"+ - "\u0000\u04c7\u04c8\u0007\u0004\u0000\u0000\u04c8\u04c9\u0007\u0005\u0000"+ - "\u0000\u04c9\u04ca\u0007\u0010\u0000\u0000\u04ca\u00d0\u0001\u0000\u0000"+ - "\u0000\u04cb\u04cc\u0007\u0004\u0000\u0000\u04cc\u04cd\u0007\u0011\u0000"+ - "\u0000\u04cd\u04ce\u0007\u0002\u0000\u0000\u04ce\u00d2\u0001\u0000\u0000"+ - "\u0000\u04cf\u04d0\u0005=\u0000\u0000\u04d0\u00d4\u0001\u0000\u0000\u0000"+ - "\u04d1\u04d2\u0007\u001f\u0000\u0000\u04d2\u04d3\u0007 \u0000\u0000\u04d3"+ - "\u00d6\u0001\u0000\u0000\u0000\u04d4\u04d5\u0005:\u0000\u0000\u04d5\u04d6"+ - "\u0005:\u0000\u0000\u04d6\u00d8\u0001\u0000\u0000\u0000\u04d7\u04d8\u0005"+ - ":\u0000\u0000\u04d8\u00da\u0001\u0000\u0000\u0000\u04d9\u04da\u0005;\u0000"+ - "\u0000\u04da\u00dc\u0001\u0000\u0000\u0000\u04db\u04dc\u0005,\u0000\u0000"+ - "\u04dc\u00de\u0001\u0000\u0000\u0000\u04dd\u04de\u0007\u0010\u0000\u0000"+ - "\u04de\u04df\u0007\u0007\u0000\u0000\u04df\u04e0\u0007\u0011\u0000\u0000"+ - "\u04e0\u04e1\u0007\u0002\u0000\u0000\u04e1\u00e0\u0001\u0000\u0000\u0000"+ - "\u04e2\u04e3\u0005.\u0000\u0000\u04e3\u00e2\u0001\u0000\u0000\u0000\u04e4"+ - "\u04e5\u0007\u0015\u0000\u0000\u04e5\u04e6\u0007\u0004\u0000\u0000\u04e6"+ - "\u04e7\u0007\u000e\u0000\u0000\u04e7\u04e8\u0007\u0011\u0000\u0000\u04e8"+ - "\u04e9\u0007\u0007\u0000\u0000\u04e9\u00e4\u0001\u0000\u0000\u0000\u04ea"+ - "\u04eb\u0007\u0015\u0000\u0000\u04eb\u04ec\u0007\n\u0000\u0000\u04ec\u04ed"+ - "\u0007\f\u0000\u0000\u04ed\u04ee\u0007\u0011\u0000\u0000\u04ee\u04ef\u0007"+ - "\u000b\u0000\u0000\u04ef\u00e6\u0001\u0000\u0000\u0000\u04f0\u04f1\u0007"+ - "\n\u0000\u0000\u04f1\u04f2\u0007\u0005\u0000\u0000\u04f2\u00e8\u0001\u0000"+ - "\u0000\u0000\u04f3\u04f4\u0007\n\u0000\u0000\u04f4\u04f5\u0007\u0011\u0000"+ - "\u0000\u04f5\u00ea\u0001\u0000\u0000\u0000\u04f6\u04f7\u0007\u000e\u0000"+ - "\u0000\u04f7\u04f8\u0007\u0004\u0000\u0000\u04f8\u04f9\u0007\u0011\u0000"+ - "\u0000\u04f9\u04fa\u0007\u000b\u0000\u0000\u04fa\u00ec\u0001\u0000\u0000"+ - "\u0000\u04fb\u04fc\u0007\u000e\u0000\u0000\u04fc\u04fd\u0007\n\u0000\u0000"+ - "\u04fd\u04fe\u0007\u0013\u0000\u0000\u04fe\u04ff\u0007\u0007\u0000\u0000"+ - "\u04ff\u00ee\u0001\u0000\u0000\u0000\u0500\u0501\u0007\u0005\u0000\u0000"+ - "\u0501\u0502\u0007\t\u0000\u0000\u0502\u0503\u0007\u000b\u0000\u0000\u0503"+ - "\u00f0\u0001\u0000\u0000\u0000\u0504\u0505\u0007\u0005\u0000\u0000\u0505"+ - "\u0506\u0007\u0016\u0000\u0000\u0506\u0507\u0007\u000e\u0000\u0000\u0507"+ - "\u0508\u0007\u000e\u0000\u0000\u0508\u00f2\u0001\u0000\u0000\u0000\u0509"+ - "\u050a\u0007\u0005\u0000\u0000\u050a\u050b\u0007\u0016\u0000\u0000\u050b"+ - "\u050c\u0007\u000e\u0000\u0000\u050c\u050d\u0007\u000e\u0000\u0000\u050d"+ - "\u050e\u0007\u0011\u0000\u0000\u050e\u00f4\u0001\u0000\u0000\u0000\u050f"+ - "\u0510\u0007\t\u0000\u0000\u0510\u0511\u0007\u0005\u0000\u0000\u0511\u00f6"+ - "\u0001\u0000\u0000\u0000\u0512\u0513\u0007\t\u0000\u0000\u0513\u0514\u0007"+ - "\f\u0000\u0000\u0514\u00f8\u0001\u0000\u0000\u0000\u0515\u0516\u0005?"+ - "\u0000\u0000\u0516\u00fa\u0001\u0000\u0000\u0000\u0517\u0518\u0007\f\u0000"+ - "\u0000\u0518\u0519\u0007\u000e\u0000\u0000\u0519\u051a\u0007\n\u0000\u0000"+ - "\u051a\u051b\u0007\u0013\u0000\u0000\u051b\u051c\u0007\u0007\u0000\u0000"+ - "\u051c\u00fc\u0001\u0000\u0000\u0000\u051d\u051e\u0007\u000b\u0000\u0000"+ - "\u051e\u051f\u0007\f\u0000\u0000\u051f\u0520\u0007\u0016\u0000\u0000\u0520"+ - "\u0521\u0007\u0007\u0000\u0000\u0521\u00fe\u0001\u0000\u0000\u0000\u0522"+ - "\u0523\u0007\u0014\u0000\u0000\u0523\u0524\u0007\n\u0000\u0000\u0524\u0525"+ - "\u0007\u000b\u0000\u0000\u0525\u0526\u0007\u0003\u0000\u0000\u0526\u0100"+ - "\u0001\u0000\u0000\u0000\u0527\u0528\u0005=\u0000\u0000\u0528\u0529\u0005"+ - "=\u0000\u0000\u0529\u0102\u0001\u0000\u0000\u0000\u052a\u052b\u0005=\u0000"+ - "\u0000\u052b\u052c\u0005~\u0000\u0000\u052c\u0104\u0001\u0000\u0000\u0000"+ - "\u052d\u052e\u0005!\u0000\u0000\u052e\u052f\u0005=\u0000\u0000\u052f\u0106"+ - "\u0001\u0000\u0000\u0000\u0530\u0531\u0005<\u0000\u0000\u0531\u0108\u0001"+ - "\u0000\u0000\u0000\u0532\u0533\u0005<\u0000\u0000\u0533\u0534\u0005=\u0000"+ - "\u0000\u0534\u010a\u0001\u0000\u0000\u0000\u0535\u0536\u0005>\u0000\u0000"+ - "\u0536\u010c\u0001\u0000\u0000\u0000\u0537\u0538\u0005>\u0000\u0000\u0538"+ - "\u0539\u0005=\u0000\u0000\u0539\u010e\u0001\u0000\u0000\u0000\u053a\u053b"+ - "\u0005+\u0000\u0000\u053b\u0110\u0001\u0000\u0000\u0000\u053c\u053d\u0005"+ - "-\u0000\u0000\u053d\u0112\u0001\u0000\u0000\u0000\u053e\u053f\u0005*\u0000"+ - "\u0000\u053f\u0114\u0001\u0000\u0000\u0000\u0540\u0541\u0005/\u0000\u0000"+ - "\u0541\u0116\u0001\u0000\u0000\u0000\u0542\u0543\u0005%\u0000\u0000\u0543"+ - "\u0118\u0001\u0000\u0000\u0000\u0544\u0545\u0005{\u0000\u0000\u0545\u011a"+ - "\u0001\u0000\u0000\u0000\u0546\u0547\u0005}\u0000\u0000\u0547\u011c\u0001"+ - "\u0000\u0000\u0000\u0548\u0549\u0005?\u0000\u0000\u0549\u054a\u0005?\u0000"+ - "\u0000\u054a\u011e\u0001\u0000\u0000\u0000\u054b\u054c\u00031\u0010\u0000"+ - "\u054c\u054d\u0001\u0000\u0000\u0000\u054d\u054e\u0006\u0087&\u0000\u054e"+ - "\u0120\u0001\u0000\u0000\u0000\u054f\u0552\u0003\u00f9t\u0000\u0550\u0553"+ - "\u0003\u00b7S\u0000\u0551\u0553\u0003\u00c5Z\u0000\u0552\u0550\u0001\u0000"+ - "\u0000\u0000\u0552\u0551\u0001\u0000\u0000\u0000\u0553\u0557\u0001\u0000"+ - "\u0000\u0000\u0554\u0556\u0003\u00c7[\u0000\u0555\u0554\u0001\u0000\u0000"+ - "\u0000\u0556\u0559\u0001\u0000\u0000\u0000\u0557\u0555\u0001\u0000\u0000"+ - "\u0000\u0557\u0558\u0001\u0000\u0000\u0000\u0558\u0561\u0001\u0000\u0000"+ - "\u0000\u0559\u0557\u0001\u0000\u0000\u0000\u055a\u055c\u0003\u00f9t\u0000"+ - "\u055b\u055d\u0003\u00b5R\u0000\u055c\u055b\u0001\u0000\u0000\u0000\u055d"+ - "\u055e\u0001\u0000\u0000\u0000\u055e\u055c\u0001\u0000\u0000\u0000\u055e"+ - "\u055f\u0001\u0000\u0000\u0000\u055f\u0561\u0001\u0000\u0000\u0000\u0560"+ - "\u054f\u0001\u0000\u0000\u0000\u0560\u055a\u0001\u0000\u0000\u0000\u0561"+ - "\u0122\u0001\u0000\u0000\u0000\u0562\u0565\u0003\u011d\u0086\u0000\u0563"+ - "\u0566\u0003\u00b7S\u0000\u0564\u0566\u0003\u00c5Z\u0000\u0565\u0563\u0001"+ - "\u0000\u0000\u0000\u0565\u0564\u0001\u0000\u0000\u0000\u0566\u056a\u0001"+ - "\u0000\u0000\u0000\u0567\u0569\u0003\u00c7[\u0000\u0568\u0567\u0001\u0000"+ - "\u0000\u0000\u0569\u056c\u0001\u0000\u0000\u0000\u056a\u0568\u0001\u0000"+ - "\u0000\u0000\u056a\u056b\u0001\u0000\u0000\u0000\u056b\u0574\u0001\u0000"+ - "\u0000\u0000\u056c\u056a\u0001\u0000\u0000\u0000\u056d\u056f\u0003\u011d"+ - "\u0086\u0000\u056e\u0570\u0003\u00b5R\u0000\u056f\u056e\u0001\u0000\u0000"+ - "\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u056f\u0001\u0000\u0000"+ - "\u0000\u0571\u0572\u0001\u0000\u0000\u0000\u0572\u0574\u0001\u0000\u0000"+ - "\u0000\u0573\u0562\u0001\u0000\u0000\u0000\u0573\u056d\u0001\u0000\u0000"+ - "\u0000\u0574\u0124\u0001\u0000\u0000\u0000\u0575\u0576\u0005[\u0000\u0000"+ - "\u0576\u0577\u0001\u0000\u0000\u0000\u0577\u0578\u0006\u008a\u0004\u0000"+ - "\u0578\u0579\u0006\u008a\u0004\u0000\u0579\u0126\u0001\u0000\u0000\u0000"+ - "\u057a\u057b\u0005]\u0000\u0000\u057b\u057c\u0001\u0000\u0000\u0000\u057c"+ - "\u057d\u0006\u008b\u0010\u0000\u057d\u057e\u0006\u008b\u0010\u0000\u057e"+ - "\u0128\u0001\u0000\u0000\u0000\u057f\u0580\u0005(\u0000\u0000\u0580\u0581"+ - "\u0001\u0000\u0000\u0000\u0581\u0582\u0006\u008c\u0004\u0000\u0582\u0583"+ - "\u0006\u008c\u0004\u0000\u0583\u012a\u0001\u0000\u0000\u0000\u0584\u0585"+ - "\u0005)\u0000\u0000\u0585\u0586\u0001\u0000\u0000\u0000\u0586\u0587\u0006"+ - "\u008d\u0010\u0000\u0587\u0588\u0006\u008d\u0010\u0000\u0588\u012c\u0001"+ - "\u0000\u0000\u0000\u0589\u058d\u0003\u00b7S\u0000\u058a\u058c\u0003\u00c7"+ - "[\u0000\u058b\u058a\u0001\u0000\u0000\u0000\u058c\u058f\u0001\u0000\u0000"+ - "\u0000\u058d\u058b\u0001\u0000\u0000\u0000\u058d\u058e\u0001\u0000\u0000"+ - "\u0000\u058e\u059a\u0001\u0000\u0000\u0000\u058f\u058d\u0001\u0000\u0000"+ - "\u0000\u0590\u0593\u0003\u00c5Z\u0000\u0591\u0593\u0003\u00bfW\u0000\u0592"+ - "\u0590\u0001\u0000\u0000\u0000\u0592\u0591\u0001\u0000\u0000\u0000\u0593"+ - "\u0595\u0001\u0000\u0000\u0000\u0594\u0596\u0003\u00c7[\u0000\u0595\u0594"+ - "\u0001\u0000\u0000\u0000\u0596\u0597\u0001\u0000\u0000\u0000\u0597\u0595"+ - "\u0001\u0000\u0000\u0000\u0597\u0598\u0001\u0000\u0000\u0000\u0598\u059a"+ - "\u0001\u0000\u0000\u0000\u0599\u0589\u0001\u0000\u0000\u0000\u0599\u0592"+ - "\u0001\u0000\u0000\u0000\u059a\u012e\u0001\u0000\u0000\u0000\u059b\u059d"+ - "\u0003\u00c1X\u0000\u059c\u059e\u0003\u00c3Y\u0000\u059d\u059c\u0001\u0000"+ - "\u0000\u0000\u059e\u059f\u0001\u0000\u0000\u0000\u059f\u059d\u0001\u0000"+ - "\u0000\u0000\u059f\u05a0\u0001\u0000\u0000\u0000\u05a0\u05a1\u0001\u0000"+ - "\u0000\u0000\u05a1\u05a2\u0003\u00c1X\u0000\u05a2\u0130\u0001\u0000\u0000"+ - "\u0000\u05a3\u05a4\u0003\u012f\u008f\u0000\u05a4\u0132\u0001\u0000\u0000"+ - "\u0000\u05a5\u05a6\u0003\u0011\u0000\u0000\u05a6\u05a7\u0001\u0000\u0000"+ - "\u0000\u05a7\u05a8\u0006\u0091\u0000\u0000\u05a8\u0134\u0001\u0000\u0000"+ - "\u0000\u05a9\u05aa\u0003\u0013\u0001\u0000\u05aa\u05ab\u0001\u0000\u0000"+ - "\u0000\u05ab\u05ac\u0006\u0092\u0000\u0000\u05ac\u0136\u0001\u0000\u0000"+ - "\u0000\u05ad\u05ae\u0003\u0015\u0002\u0000\u05ae\u05af\u0001\u0000\u0000"+ - "\u0000\u05af\u05b0\u0006\u0093\u0000\u0000\u05b0\u0138\u0001\u0000\u0000"+ - "\u0000\u05b1\u05b2\u0003\u00b3Q\u0000\u05b2\u05b3\u0001\u0000\u0000\u0000"+ - "\u05b3\u05b4\u0006\u0094\u000f\u0000\u05b4\u05b5\u0006\u0094\u0010\u0000"+ - "\u05b5\u013a\u0001\u0000\u0000\u0000\u05b6\u05b7\u0003\u00d9d\u0000\u05b7"+ - "\u05b8\u0001\u0000\u0000\u0000\u05b8\u05b9\u0006\u0095\'\u0000\u05b9\u013c"+ - "\u0001\u0000\u0000\u0000\u05ba\u05bb\u0003\u00d7c\u0000\u05bb\u05bc\u0001"+ - "\u0000\u0000\u0000\u05bc\u05bd\u0006\u0096(\u0000\u05bd\u013e\u0001\u0000"+ - "\u0000\u0000\u05be\u05bf\u0003\u00ddf\u0000\u05bf\u05c0\u0001\u0000\u0000"+ - "\u0000\u05c0\u05c1\u0006\u0097\u0015\u0000\u05c1\u0140\u0001\u0000\u0000"+ - "\u0000\u05c2\u05c3\u0003\u00d3a\u0000\u05c3\u05c4\u0001\u0000\u0000\u0000"+ - "\u05c4\u05c5\u0006\u0098\u001e\u0000\u05c5\u0142\u0001\u0000\u0000\u0000"+ - "\u05c6\u05c7\u0007\u000f\u0000\u0000\u05c7\u05c8\u0007\u0007\u0000\u0000"+ - "\u05c8\u05c9\u0007\u000b\u0000\u0000\u05c9\u05ca\u0007\u0004\u0000\u0000"+ - "\u05ca\u05cb\u0007\u0010\u0000\u0000\u05cb\u05cc\u0007\u0004\u0000\u0000"+ - "\u05cc\u05cd\u0007\u000b\u0000\u0000\u05cd\u05ce\u0007\u0004\u0000\u0000"+ - "\u05ce\u0144\u0001\u0000\u0000\u0000\u05cf\u05d0\u0003\u012b\u008d\u0000"+ - "\u05d0\u05d1\u0001\u0000\u0000\u0000\u05d1\u05d2\u0006\u009a\u0011\u0000"+ - "\u05d2\u05d3\u0006\u009a\u0010\u0000\u05d3\u0146\u0001\u0000\u0000\u0000"+ - "\u05d4\u05d8\b!\u0000\u0000\u05d5\u05d6\u0005/\u0000\u0000\u05d6\u05d8"+ - "\b\"\u0000\u0000\u05d7\u05d4\u0001\u0000\u0000\u0000\u05d7\u05d5\u0001"+ - "\u0000\u0000\u0000\u05d8\u0148\u0001\u0000\u0000\u0000\u05d9\u05db\u0003"+ - "\u0147\u009b\u0000\u05da\u05d9\u0001\u0000\u0000\u0000\u05db\u05dc\u0001"+ - "\u0000\u0000\u0000\u05dc\u05da\u0001\u0000\u0000\u0000\u05dc\u05dd\u0001"+ - "\u0000\u0000\u0000\u05dd\u014a\u0001\u0000\u0000\u0000\u05de\u05df\u0003"+ - "\u0149\u009c\u0000\u05df\u05e0\u0001\u0000\u0000\u0000\u05e0\u05e1\u0006"+ - "\u009d)\u0000\u05e1\u014c\u0001\u0000\u0000\u0000\u05e2\u05e3\u0003\u00c9"+ - "\\\u0000\u05e3\u05e4\u0001\u0000\u0000\u0000\u05e4\u05e5\u0006\u009e\u001d"+ - "\u0000\u05e5\u014e\u0001\u0000\u0000\u0000\u05e6\u05e7\u0003\u0011\u0000"+ - "\u0000\u05e7\u05e8\u0001\u0000\u0000\u0000\u05e8\u05e9\u0006\u009f\u0000"+ - "\u0000\u05e9\u0150\u0001\u0000\u0000\u0000\u05ea\u05eb\u0003\u0013\u0001"+ - "\u0000\u05eb\u05ec\u0001\u0000\u0000\u0000\u05ec\u05ed\u0006\u00a0\u0000"+ - "\u0000\u05ed\u0152\u0001\u0000\u0000\u0000\u05ee\u05ef\u0003\u0015\u0002"+ - "\u0000\u05ef\u05f0\u0001\u0000\u0000\u0000\u05f0\u05f1\u0006\u00a1\u0000"+ - "\u0000\u05f1\u0154\u0001\u0000\u0000\u0000\u05f2\u05f3\u0003\u0129\u008c"+ - "\u0000\u05f3\u05f4\u0001\u0000\u0000\u0000\u05f4\u05f5\u0006\u00a2$\u0000"+ - "\u05f5\u05f6\u0006\u00a2%\u0000\u05f6\u0156\u0001\u0000\u0000\u0000\u05f7"+ - "\u05f8\u0003\u012b\u008d\u0000\u05f8\u05f9\u0001\u0000\u0000\u0000\u05f9"+ - "\u05fa\u0006\u00a3\u0011\u0000\u05fa\u05fb\u0006\u00a3\u0010\u0000\u05fb"+ - "\u05fc\u0006\u00a3\u0010\u0000\u05fc\u0158\u0001\u0000\u0000\u0000\u05fd"+ - "\u05fe\u0003\u00b3Q\u0000\u05fe\u05ff\u0001\u0000\u0000\u0000\u05ff\u0600"+ - "\u0006\u00a4\u000f\u0000\u0600\u0601\u0006\u00a4\u0010\u0000\u0601\u015a"+ - "\u0001\u0000\u0000\u0000\u0602\u0603\u0003\u0015\u0002\u0000\u0603\u0604"+ - "\u0001\u0000\u0000\u0000\u0604\u0605\u0006\u00a5\u0000\u0000\u0605\u015c"+ - "\u0001\u0000\u0000\u0000\u0606\u0607\u0003\u0011\u0000\u0000\u0607\u0608"+ - "\u0001\u0000\u0000\u0000\u0608\u0609\u0006\u00a6\u0000\u0000\u0609\u015e"+ - "\u0001\u0000\u0000\u0000\u060a\u060b\u0003\u0013\u0001\u0000\u060b\u060c"+ - "\u0001\u0000\u0000\u0000\u060c\u060d\u0006\u00a7\u0000\u0000\u060d\u0160"+ - "\u0001\u0000\u0000\u0000\u060e\u060f\u0003\u00b3Q\u0000\u060f\u0610\u0001"+ - "\u0000\u0000\u0000\u0610\u0611\u0006\u00a8\u000f\u0000\u0611\u0612\u0006"+ - "\u00a8\u0010\u0000\u0612\u0162\u0001\u0000\u0000\u0000\u0613\u0614\u0003"+ - "\u012b\u008d\u0000\u0614\u0615\u0001\u0000\u0000\u0000\u0615\u0616\u0006"+ - "\u00a9\u0011\u0000\u0616\u0617\u0006\u00a9\u0010\u0000\u0617\u0618\u0006"+ - "\u00a9\u0010\u0000\u0618\u0164\u0001\u0000\u0000\u0000\u0619\u061a\u0003"+ - "\u00ffw\u0000\u061a\u061b\u0001\u0000\u0000\u0000\u061b\u061c\u0006\u00aa"+ - "\u001b\u0000\u061c\u061d\u0006\u00aa\u0010\u0000\u061d\u061e\u0006\u00aa"+ - "\u0004\u0000\u061e\u0166\u0001\u0000\u0000\u0000\u061f\u0620\u0003\u00dd"+ - "f\u0000\u0620\u0621\u0001\u0000\u0000\u0000\u0621\u0622\u0006\u00ab\u0015"+ - "\u0000\u0622\u0168\u0001\u0000\u0000\u0000\u0623\u0624\u0003\u0131\u0090"+ - "\u0000\u0624\u0625\u0001\u0000\u0000\u0000\u0625\u0626\u0006\u00ac\u0018"+ - "\u0000\u0626\u016a\u0001\u0000\u0000\u0000\u0627\u0628\u0003\u012d\u008e"+ - "\u0000\u0628\u0629\u0001\u0000\u0000\u0000\u0629\u062a\u0006\u00ad\u0019"+ - "\u0000\u062a\u016c\u0001\u0000\u0000\u0000\u062b\u062c\u0003\u0011\u0000"+ - "\u0000\u062c\u062d\u0001\u0000\u0000\u0000\u062d\u062e\u0006\u00ae\u0000"+ - "\u0000\u062e\u016e\u0001\u0000\u0000\u0000\u062f\u0630\u0003\u0013\u0001"+ - "\u0000\u0630\u0631\u0001\u0000\u0000\u0000\u0631\u0632\u0006\u00af\u0000"+ - "\u0000\u0632\u0170\u0001\u0000\u0000\u0000\u0633\u0634\u0003\u0015\u0002"+ - "\u0000\u0634\u0635\u0001\u0000\u0000\u0000\u0635\u0636\u0006\u00b0\u0000"+ - "\u0000\u0636\u0172\u0001\u0000\u0000\u0000\u0637\u0638\u0003\u00b3Q\u0000"+ - "\u0638\u0639\u0001\u0000\u0000\u0000\u0639\u063a\u0006\u00b1\u000f\u0000"+ - "\u063a\u063b\u0006\u00b1\u0010\u0000\u063b\u0174\u0001\u0000\u0000\u0000"+ - "\u063c\u063d\u0007#\u0000\u0000\u063d\u063e\u0007\t\u0000\u0000\u063e"+ - "\u063f\u0007\n\u0000\u0000\u063f\u0640\u0007\u0005\u0000\u0000\u0640\u0176"+ - "\u0001\u0000\u0000\u0000\u0641\u0642\u0003\u0201\u00f8\u0000\u0642\u0643"+ - "\u0001\u0000\u0000\u0000\u0643\u0644\u0006\u00b3\u0013\u0000\u0644\u0178"+ - "\u0001\u0000\u0000\u0000\u0645\u0646\u0003\u00f5r\u0000\u0646\u0647\u0001"+ - "\u0000\u0000\u0000\u0647\u0648\u0006\u00b4\u0012\u0000\u0648\u0649\u0006"+ - "\u00b4\u0010\u0000\u0649\u064a\u0006\u00b4\u0004\u0000\u064a\u017a\u0001"+ - "\u0000\u0000\u0000\u064b\u064c\u0007\u0016\u0000\u0000\u064c\u064d\u0007"+ - "\u0011\u0000\u0000\u064d\u064e\u0007\n\u0000\u0000\u064e\u064f\u0007\u0005"+ - "\u0000\u0000\u064f\u0650\u0007\u0006\u0000\u0000\u0650\u0651\u0001\u0000"+ - "\u0000\u0000\u0651\u0652\u0006\u00b5\u0010\u0000\u0652\u0653\u0006\u00b5"+ - "\u0004\u0000\u0653\u017c\u0001\u0000\u0000\u0000\u0654\u0655\u0003\u0149"+ - "\u009c\u0000\u0655\u0656\u0001\u0000\u0000\u0000\u0656\u0657\u0006\u00b6"+ - ")\u0000\u0657\u017e\u0001\u0000\u0000\u0000\u0658\u0659\u0003\u00c9\\"+ - "\u0000\u0659\u065a\u0001\u0000\u0000\u0000\u065a\u065b\u0006\u00b7\u001d"+ - "\u0000\u065b\u0180\u0001\u0000\u0000\u0000\u065c\u065d\u0003\u00d9d\u0000"+ - "\u065d\u065e\u0001\u0000\u0000\u0000\u065e\u065f\u0006\u00b8\'\u0000\u065f"+ - "\u0182\u0001\u0000\u0000\u0000\u0660\u0661\u0003\u0011\u0000\u0000\u0661"+ - "\u0662\u0001\u0000\u0000\u0000\u0662\u0663\u0006\u00b9\u0000\u0000\u0663"+ - "\u0184\u0001\u0000\u0000\u0000\u0664\u0665\u0003\u0013\u0001\u0000\u0665"+ - "\u0666\u0001\u0000\u0000\u0000\u0666\u0667\u0006\u00ba\u0000\u0000\u0667"+ - "\u0186\u0001\u0000\u0000\u0000\u0668\u0669\u0003\u0015\u0002\u0000\u0669"+ - "\u066a\u0001\u0000\u0000\u0000\u066a\u066b\u0006\u00bb\u0000\u0000\u066b"+ - "\u0188\u0001\u0000\u0000\u0000\u066c\u066d\u0003\u00b3Q\u0000\u066d\u066e"+ - "\u0001\u0000\u0000\u0000\u066e\u066f\u0006\u00bc\u000f\u0000\u066f\u0670"+ - "\u0006\u00bc\u0010\u0000\u0670\u018a\u0001\u0000\u0000\u0000\u0671\u0672"+ - "\u0003\u012b\u008d\u0000\u0672\u0673\u0001\u0000\u0000\u0000\u0673\u0674"+ - "\u0006\u00bd\u0011\u0000\u0674\u0675\u0006\u00bd\u0010\u0000\u0675\u0676"+ - "\u0006\u00bd\u0010\u0000\u0676\u018c\u0001\u0000\u0000\u0000\u0677\u0678"+ - "\u0003\u00d9d\u0000\u0678\u0679\u0001\u0000\u0000\u0000\u0679\u067a\u0006"+ - "\u00be\'\u0000\u067a\u018e\u0001\u0000\u0000\u0000\u067b\u067c\u0003\u00dd"+ - "f\u0000\u067c\u067d\u0001\u0000\u0000\u0000\u067d\u067e\u0006\u00bf\u0015"+ - "\u0000\u067e\u0190\u0001\u0000\u0000\u0000\u067f\u0680\u0003\u00e1h\u0000"+ - "\u0680\u0681\u0001\u0000\u0000\u0000\u0681\u0682\u0006\u00c0\u0014\u0000"+ - "\u0682\u0192\u0001\u0000\u0000\u0000\u0683\u0684\u0003\u00f5r\u0000\u0684"+ - "\u0685\u0001\u0000\u0000\u0000\u0685\u0686\u0006\u00c1\u0012\u0000\u0686"+ - "\u0687\u0006\u00c1*\u0000\u0687\u0194\u0001\u0000\u0000\u0000\u0688\u0689"+ - "\u0003\u0149\u009c\u0000\u0689\u068a\u0001\u0000\u0000\u0000\u068a\u068b"+ - "\u0006\u00c2)\u0000\u068b\u0196\u0001\u0000\u0000\u0000\u068c\u068d\u0003"+ - "\u00c9\\\u0000\u068d\u068e\u0001\u0000\u0000\u0000\u068e\u068f\u0006\u00c3"+ - "\u001d\u0000\u068f\u0198\u0001\u0000\u0000\u0000\u0690\u0691\u0003\u0011"+ - "\u0000\u0000\u0691\u0692\u0001\u0000\u0000\u0000\u0692\u0693\u0006\u00c4"+ - "\u0000\u0000\u0693\u019a\u0001\u0000\u0000\u0000\u0694\u0695\u0003\u0013"+ - "\u0001\u0000\u0695\u0696\u0001\u0000\u0000\u0000\u0696\u0697\u0006\u00c5"+ - "\u0000\u0000\u0697\u019c\u0001\u0000\u0000\u0000\u0698\u0699\u0003\u0015"+ - "\u0002\u0000\u0699\u069a\u0001\u0000\u0000\u0000\u069a\u069b\u0006\u00c6"+ - "\u0000\u0000\u069b\u019e\u0001\u0000\u0000\u0000\u069c\u069d\u0003\u00b3"+ - "Q\u0000\u069d\u069e\u0001\u0000\u0000\u0000\u069e\u069f\u0006\u00c7\u000f"+ - "\u0000\u069f\u06a0\u0006\u00c7\u0010\u0000\u06a0\u06a1\u0006\u00c7\u0010"+ - "\u0000\u06a1\u01a0\u0001\u0000\u0000\u0000\u06a2\u06a3\u0003\u012b\u008d"+ - "\u0000\u06a3\u06a4\u0001\u0000\u0000\u0000\u06a4\u06a5\u0006\u00c8\u0011"+ - "\u0000\u06a5\u06a6\u0006\u00c8\u0010\u0000\u06a6\u06a7\u0006\u00c8\u0010"+ - "\u0000\u06a7\u06a8\u0006\u00c8\u0010\u0000\u06a8\u01a2\u0001\u0000\u0000"+ - "\u0000\u06a9\u06aa\u0003\u00ddf\u0000\u06aa\u06ab\u0001\u0000\u0000\u0000"+ - "\u06ab\u06ac\u0006\u00c9\u0015\u0000\u06ac\u01a4\u0001\u0000\u0000\u0000"+ - "\u06ad\u06ae\u0003\u00e1h\u0000\u06ae\u06af\u0001\u0000\u0000\u0000\u06af"+ - "\u06b0\u0006\u00ca\u0014\u0000\u06b0\u01a6\u0001\u0000\u0000\u0000\u06b1"+ - "\u06b2\u0003\u01e3\u00e9\u0000\u06b2\u06b3\u0001\u0000\u0000\u0000\u06b3"+ - "\u06b4\u0006\u00cb\u001f\u0000\u06b4\u01a8\u0001\u0000\u0000\u0000\u06b5"+ - "\u06b6\u0003\u0011\u0000\u0000\u06b6\u06b7\u0001\u0000\u0000\u0000\u06b7"+ - "\u06b8\u0006\u00cc\u0000\u0000\u06b8\u01aa\u0001\u0000\u0000\u0000\u06b9"+ - "\u06ba\u0003\u0013\u0001\u0000\u06ba\u06bb\u0001\u0000\u0000\u0000\u06bb"+ - "\u06bc\u0006\u00cd\u0000\u0000\u06bc\u01ac\u0001\u0000\u0000\u0000\u06bd"+ - "\u06be\u0003\u0015\u0002\u0000\u06be\u06bf\u0001\u0000\u0000\u0000\u06bf"+ - "\u06c0\u0006\u00ce\u0000\u0000\u06c0\u01ae\u0001\u0000\u0000\u0000\u06c1"+ - "\u06c2\u0003\u00b3Q\u0000\u06c2\u06c3\u0001\u0000\u0000\u0000\u06c3\u06c4"+ - "\u0006\u00cf\u000f\u0000\u06c4\u06c5\u0006\u00cf\u0010\u0000\u06c5\u01b0"+ - "\u0001\u0000\u0000\u0000\u06c6\u06c7\u0003\u012b\u008d\u0000\u06c7\u06c8"+ - "\u0001\u0000\u0000\u0000\u06c8\u06c9\u0006\u00d0\u0011\u0000\u06c9\u06ca"+ - "\u0006\u00d0\u0010\u0000\u06ca\u06cb\u0006\u00d0\u0010\u0000\u06cb\u01b2"+ - "\u0001\u0000\u0000\u0000\u06cc\u06cd\u0003\u0125\u008a\u0000\u06cd\u06ce"+ - "\u0001\u0000\u0000\u0000\u06ce\u06cf\u0006\u00d1\u0016\u0000\u06cf\u01b4"+ - "\u0001\u0000\u0000\u0000\u06d0\u06d1\u0003\u0127\u008b\u0000\u06d1\u06d2"+ - "\u0001\u0000\u0000\u0000\u06d2\u06d3\u0006\u00d2\u0017\u0000\u06d3\u01b6"+ - "\u0001\u0000\u0000\u0000\u06d4\u06d5\u0003\u00e1h\u0000\u06d5\u06d6\u0001"+ - "\u0000\u0000\u0000\u06d6\u06d7\u0006\u00d3\u0014\u0000\u06d7\u01b8\u0001"+ - "\u0000\u0000\u0000\u06d8\u06d9\u0003\u00f9t\u0000\u06d9\u06da\u0001\u0000"+ - "\u0000\u0000\u06da\u06db\u0006\u00d4 \u0000\u06db\u01ba\u0001\u0000\u0000"+ - "\u0000\u06dc\u06dd\u0003\u0121\u0088\u0000\u06dd\u06de\u0001\u0000\u0000"+ - "\u0000\u06de\u06df\u0006\u00d5!\u0000\u06df\u01bc\u0001\u0000\u0000\u0000"+ - "\u06e0\u06e1\u0003\u011d\u0086\u0000\u06e1\u06e2\u0001\u0000\u0000\u0000"+ - "\u06e2\u06e3\u0006\u00d6\"\u0000\u06e3\u01be\u0001\u0000\u0000\u0000\u06e4"+ - "\u06e5\u0003\u0123\u0089\u0000\u06e5\u06e6\u0001\u0000\u0000\u0000\u06e6"+ - "\u06e7\u0006\u00d7#\u0000\u06e7\u01c0\u0001\u0000\u0000\u0000\u06e8\u06e9"+ - "\u0003\u0131\u0090\u0000\u06e9\u06ea\u0001\u0000\u0000\u0000\u06ea\u06eb"+ - "\u0006\u00d8\u0018\u0000\u06eb\u01c2\u0001\u0000\u0000\u0000\u06ec\u06ed"+ - "\u0003\u012d\u008e\u0000\u06ed\u06ee\u0001\u0000\u0000\u0000\u06ee\u06ef"+ - "\u0006\u00d9\u0019\u0000\u06ef\u01c4\u0001\u0000\u0000\u0000\u06f0\u06f1"+ - "\u0003\u0011\u0000\u0000\u06f1\u06f2\u0001\u0000\u0000\u0000\u06f2\u06f3"+ - "\u0006\u00da\u0000\u0000\u06f3\u01c6\u0001\u0000\u0000\u0000\u06f4\u06f5"+ - "\u0003\u0013\u0001\u0000\u06f5\u06f6\u0001\u0000\u0000\u0000\u06f6\u06f7"+ - "\u0006\u00db\u0000\u0000\u06f7\u01c8\u0001\u0000\u0000\u0000\u06f8\u06f9"+ - "\u0003\u0015\u0002\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000\u06fa\u06fb"+ - "\u0006\u00dc\u0000\u0000\u06fb\u01ca\u0001\u0000\u0000\u0000\u06fc\u06fd"+ - "\u0003\u00b3Q\u0000\u06fd\u06fe\u0001\u0000\u0000\u0000\u06fe\u06ff\u0006"+ - "\u00dd\u000f\u0000\u06ff\u0700\u0006\u00dd\u0010\u0000\u0700\u01cc\u0001"+ - "\u0000\u0000\u0000\u0701\u0702\u0003\u012b\u008d\u0000\u0702\u0703\u0001"+ - "\u0000\u0000\u0000\u0703\u0704\u0006\u00de\u0011\u0000\u0704\u0705\u0006"+ - "\u00de\u0010\u0000\u0705\u0706\u0006\u00de\u0010\u0000\u0706\u01ce\u0001"+ - "\u0000\u0000\u0000\u0707\u0708\u0003\u00e1h\u0000\u0708\u0709\u0001\u0000"+ - "\u0000\u0000\u0709\u070a\u0006\u00df\u0014\u0000\u070a\u01d0\u0001\u0000"+ - "\u0000\u0000\u070b\u070c\u0003\u0125\u008a\u0000\u070c\u070d\u0001\u0000"+ - "\u0000\u0000\u070d\u070e\u0006\u00e0\u0016\u0000\u070e\u01d2\u0001\u0000"+ - "\u0000\u0000\u070f\u0710\u0003\u0127\u008b\u0000\u0710\u0711\u0001\u0000"+ - "\u0000\u0000\u0711\u0712\u0006\u00e1\u0017\u0000\u0712\u01d4\u0001\u0000"+ - "\u0000\u0000\u0713\u0714\u0003\u00ddf\u0000\u0714\u0715\u0001\u0000\u0000"+ - "\u0000\u0715\u0716\u0006\u00e2\u0015\u0000\u0716\u01d6\u0001\u0000\u0000"+ - "\u0000\u0717\u0718\u0003\u00f9t\u0000\u0718\u0719\u0001\u0000\u0000\u0000"+ - "\u0719\u071a\u0006\u00e3 \u0000\u071a\u01d8\u0001\u0000\u0000\u0000\u071b"+ - "\u071c\u0003\u0121\u0088\u0000\u071c\u071d\u0001\u0000\u0000\u0000\u071d"+ - "\u071e\u0006\u00e4!\u0000\u071e\u01da\u0001\u0000\u0000\u0000\u071f\u0720"+ - "\u0003\u011d\u0086\u0000\u0720\u0721\u0001\u0000\u0000\u0000\u0721\u0722"+ - "\u0006\u00e5\"\u0000\u0722\u01dc\u0001\u0000\u0000\u0000\u0723\u0724\u0003"+ - "\u0123\u0089\u0000\u0724\u0725\u0001\u0000\u0000\u0000\u0725\u0726\u0006"+ - "\u00e6#\u0000\u0726\u01de\u0001\u0000\u0000\u0000\u0727\u072c\u0003\u00b7"+ - "S\u0000\u0728\u072c\u0003\u00b5R\u0000\u0729\u072c\u0003\u00c5Z\u0000"+ - "\u072a\u072c\u0003\u0113\u0081\u0000\u072b\u0727\u0001\u0000\u0000\u0000"+ - "\u072b\u0728\u0001\u0000\u0000\u0000\u072b\u0729\u0001\u0000\u0000\u0000"+ - "\u072b\u072a\u0001\u0000\u0000\u0000\u072c\u01e0\u0001\u0000\u0000\u0000"+ - "\u072d\u0730\u0003\u00b7S\u0000\u072e\u0730\u0003\u0113\u0081\u0000\u072f"+ - "\u072d\u0001\u0000\u0000\u0000\u072f\u072e\u0001\u0000\u0000\u0000\u0730"+ - "\u0734\u0001\u0000\u0000\u0000\u0731\u0733\u0003\u01df\u00e7\u0000\u0732"+ - "\u0731\u0001\u0000\u0000\u0000\u0733\u0736\u0001\u0000\u0000\u0000\u0734"+ - "\u0732\u0001\u0000\u0000\u0000\u0734\u0735\u0001\u0000\u0000\u0000\u0735"+ - "\u0741\u0001\u0000\u0000\u0000\u0736\u0734\u0001\u0000\u0000\u0000\u0737"+ - "\u073a\u0003\u00c5Z\u0000\u0738\u073a\u0003\u00bfW\u0000\u0739\u0737\u0001"+ - "\u0000\u0000\u0000\u0739\u0738\u0001\u0000\u0000\u0000\u073a\u073c\u0001"+ - "\u0000\u0000\u0000\u073b\u073d\u0003\u01df\u00e7\u0000\u073c\u073b\u0001"+ - "\u0000\u0000\u0000\u073d\u073e\u0001\u0000\u0000\u0000\u073e\u073c\u0001"+ - "\u0000\u0000\u0000\u073e\u073f\u0001\u0000\u0000\u0000\u073f\u0741\u0001"+ - "\u0000\u0000\u0000\u0740\u072f\u0001\u0000\u0000\u0000\u0740\u0739\u0001"+ - "\u0000\u0000\u0000\u0741\u01e2\u0001\u0000\u0000\u0000\u0742\u0745\u0003"+ - "\u01e1\u00e8\u0000\u0743\u0745\u0003\u012f\u008f\u0000\u0744\u0742\u0001"+ - "\u0000\u0000\u0000\u0744\u0743\u0001\u0000\u0000\u0000\u0745\u0746\u0001"+ - "\u0000\u0000\u0000\u0746\u0744\u0001\u0000\u0000\u0000\u0746\u0747\u0001"+ - "\u0000\u0000\u0000\u0747\u01e4\u0001\u0000\u0000\u0000\u0748\u0749\u0003"+ - "\u0011\u0000\u0000\u0749\u074a\u0001\u0000\u0000\u0000\u074a\u074b\u0006"+ - "\u00ea\u0000\u0000\u074b\u01e6\u0001\u0000\u0000\u0000\u074c\u074d\u0003"+ - "\u0013\u0001\u0000\u074d\u074e\u0001\u0000\u0000\u0000\u074e\u074f\u0006"+ - "\u00eb\u0000\u0000\u074f\u01e8\u0001\u0000\u0000\u0000\u0750\u0751\u0003"+ - "\u0015\u0002\u0000\u0751\u0752\u0001\u0000\u0000\u0000\u0752\u0753\u0006"+ - "\u00ec\u0000\u0000\u0753\u01ea\u0001\u0000\u0000\u0000\u0754\u0755\u0003"+ - "\u00b3Q\u0000\u0755\u0756\u0001\u0000\u0000\u0000\u0756\u0757\u0006\u00ed"+ - "\u000f\u0000\u0757\u0758\u0006\u00ed\u0010\u0000\u0758\u01ec\u0001\u0000"+ - "\u0000\u0000\u0759\u075a\u0003\u012b\u008d\u0000\u075a\u075b\u0001\u0000"+ - "\u0000\u0000\u075b\u075c\u0006\u00ee\u0011\u0000\u075c\u075d\u0006\u00ee"+ - "\u0010\u0000\u075d\u075e\u0006\u00ee\u0010\u0000\u075e\u01ee\u0001\u0000"+ - "\u0000\u0000\u075f\u0760\u0003\u0125\u008a\u0000\u0760\u0761\u0001\u0000"+ - "\u0000\u0000\u0761\u0762\u0006\u00ef\u0016\u0000\u0762\u01f0\u0001\u0000"+ - "\u0000\u0000\u0763\u0764\u0003\u0127\u008b\u0000\u0764\u0765\u0001\u0000"+ - "\u0000\u0000\u0765\u0766\u0006\u00f0\u0017\u0000\u0766\u01f2\u0001\u0000"+ - "\u0000\u0000\u0767\u0768\u0003\u00d3a\u0000\u0768\u0769\u0001\u0000\u0000"+ - "\u0000\u0769\u076a\u0006\u00f1\u001e\u0000\u076a\u01f4\u0001\u0000\u0000"+ - "\u0000\u076b\u076c\u0003\u00ddf\u0000\u076c\u076d\u0001\u0000\u0000\u0000"+ - "\u076d\u076e\u0006\u00f2\u0015\u0000\u076e\u01f6\u0001\u0000\u0000\u0000"+ - "\u076f\u0770\u0003\u00e1h\u0000\u0770\u0771\u0001\u0000\u0000\u0000\u0771"+ - "\u0772\u0006\u00f3\u0014\u0000\u0772\u01f8\u0001\u0000\u0000\u0000\u0773"+ - "\u0774\u0003\u00f9t\u0000\u0774\u0775\u0001\u0000\u0000\u0000\u0775\u0776"+ - "\u0006\u00f4 \u0000\u0776\u01fa\u0001\u0000\u0000\u0000\u0777\u0778\u0003"+ - "\u0121\u0088\u0000\u0778\u0779\u0001\u0000\u0000\u0000\u0779\u077a\u0006"+ - "\u00f5!\u0000\u077a\u01fc\u0001\u0000\u0000\u0000\u077b\u077c\u0003\u011d"+ - "\u0086\u0000\u077c\u077d\u0001\u0000\u0000\u0000\u077d\u077e\u0006\u00f6"+ - "\"\u0000\u077e\u01fe\u0001\u0000\u0000\u0000\u077f\u0780\u0003\u0123\u0089"+ - "\u0000\u0780\u0781\u0001\u0000\u0000\u0000\u0781\u0782\u0006\u00f7#\u0000"+ - "\u0782\u0200\u0001\u0000\u0000\u0000\u0783\u0784\u0007\u0004\u0000\u0000"+ - "\u0784\u0785\u0007\u0011\u0000\u0000\u0785\u0202\u0001\u0000\u0000\u0000"+ - "\u0786\u0787\u0003\u01e3\u00e9\u0000\u0787\u0788\u0001\u0000\u0000\u0000"+ - "\u0788\u0789\u0006\u00f9\u001f\u0000\u0789\u0204\u0001\u0000\u0000\u0000"+ - "\u078a\u078b\u0003\u0011\u0000\u0000\u078b\u078c\u0001\u0000\u0000\u0000"+ - "\u078c\u078d\u0006\u00fa\u0000\u0000\u078d\u0206\u0001\u0000\u0000\u0000"+ - "\u078e\u078f\u0003\u0013\u0001\u0000\u078f\u0790\u0001\u0000\u0000\u0000"+ - "\u0790\u0791\u0006\u00fb\u0000\u0000\u0791\u0208\u0001\u0000\u0000\u0000"+ - "\u0792\u0793\u0003\u0015\u0002\u0000\u0793\u0794\u0001\u0000\u0000\u0000"+ - "\u0794\u0795\u0006\u00fc\u0000\u0000\u0795\u020a\u0001\u0000\u0000\u0000"+ - "\u0796\u0797\u0003\u00fdv\u0000\u0797\u0798\u0001\u0000\u0000\u0000\u0798"+ - "\u0799\u0006\u00fd+\u0000\u0799\u020c\u0001\u0000\u0000\u0000\u079a\u079b"+ - "\u0003\u00e3i\u0000\u079b\u079c\u0001\u0000\u0000\u0000\u079c\u079d\u0006"+ - "\u00fe,\u0000\u079d\u020e\u0001\u0000\u0000\u0000\u079e\u079f\u0003\u00f1"+ - "p\u0000\u079f\u07a0\u0001\u0000\u0000\u0000\u07a0\u07a1\u0006\u00ff-\u0000"+ - "\u07a1\u0210\u0001\u0000\u0000\u0000\u07a2\u07a3\u0003\u00dbe\u0000\u07a3"+ - "\u07a4\u0001\u0000\u0000\u0000\u07a4\u07a5\u0006\u0100.\u0000\u07a5\u07a6"+ - "\u0006\u0100\u0010\u0000\u07a6\u0212\u0001\u0000\u0000\u0000\u07a7\u07a8"+ - "\u0003\u00d3a\u0000\u07a8\u07a9\u0001\u0000\u0000\u0000\u07a9\u07aa\u0006"+ - "\u0101\u001e\u0000\u07aa\u0214\u0001\u0000\u0000\u0000\u07ab\u07ac\u0003"+ - "\u00c9\\\u0000\u07ac\u07ad\u0001\u0000\u0000\u0000\u07ad\u07ae\u0006\u0102"+ - "\u001d\u0000\u07ae\u0216\u0001\u0000\u0000\u0000\u07af\u07b0\u0003\u012d"+ - "\u008e\u0000\u07b0\u07b1\u0001\u0000\u0000\u0000\u07b1\u07b2\u0006\u0103"+ - "\u0019\u0000\u07b2\u0218\u0001\u0000\u0000\u0000\u07b3\u07b4\u0003\u0131"+ - "\u0090\u0000\u07b4\u07b5\u0001\u0000\u0000\u0000\u07b5\u07b6\u0006\u0104"+ - "\u0018\u0000\u07b6\u021a\u0001\u0000\u0000\u0000\u07b7\u07b8\u0003\u00cd"+ - "^\u0000\u07b8\u07b9\u0001\u0000\u0000\u0000\u07b9\u07ba\u0006\u0105/\u0000"+ - "\u07ba\u021c\u0001\u0000\u0000\u0000\u07bb\u07bc\u0003\u00cb]\u0000\u07bc"+ - "\u07bd\u0001\u0000\u0000\u0000\u07bd\u07be\u0006\u01060\u0000\u07be\u021e"+ - "\u0001\u0000\u0000\u0000\u07bf\u07c0\u0003\u00ddf\u0000\u07c0\u07c1\u0001"+ - "\u0000\u0000\u0000\u07c1\u07c2\u0006\u0107\u0015\u0000\u07c2\u0220\u0001"+ - "\u0000\u0000\u0000\u07c3\u07c4\u0003\u00e1h\u0000\u07c4\u07c5\u0001\u0000"+ - "\u0000\u0000\u07c5\u07c6\u0006\u0108\u0014\u0000\u07c6\u0222\u0001\u0000"+ - "\u0000\u0000\u07c7\u07c8\u0003\u00f9t\u0000\u07c8\u07c9\u0001\u0000\u0000"+ - "\u0000\u07c9\u07ca\u0006\u0109 \u0000\u07ca\u0224\u0001\u0000\u0000\u0000"+ - "\u07cb\u07cc\u0003\u0121\u0088\u0000\u07cc\u07cd\u0001\u0000\u0000\u0000"+ - "\u07cd\u07ce\u0006\u010a!\u0000\u07ce\u0226\u0001\u0000\u0000\u0000\u07cf"+ - "\u07d0\u0003\u011d\u0086\u0000\u07d0\u07d1\u0001\u0000\u0000\u0000\u07d1"+ - "\u07d2\u0006\u010b\"\u0000\u07d2\u0228\u0001\u0000\u0000\u0000\u07d3\u07d4"+ - "\u0003\u0123\u0089\u0000\u07d4\u07d5\u0001\u0000\u0000\u0000\u07d5\u07d6"+ - "\u0006\u010c#\u0000\u07d6\u022a\u0001\u0000\u0000\u0000\u07d7\u07d8\u0003"+ - "\u0125\u008a\u0000\u07d8\u07d9\u0001\u0000\u0000\u0000\u07d9\u07da\u0006"+ - "\u010d\u0016\u0000\u07da\u022c\u0001\u0000\u0000\u0000\u07db\u07dc\u0003"+ - "\u0127\u008b\u0000\u07dc\u07dd\u0001\u0000\u0000\u0000\u07dd\u07de\u0006"+ - "\u010e\u0017\u0000\u07de\u022e\u0001\u0000\u0000\u0000\u07df\u07e0\u0003"+ - "\u01e3\u00e9\u0000\u07e0\u07e1\u0001\u0000\u0000\u0000\u07e1\u07e2\u0006"+ - "\u010f\u001f\u0000\u07e2\u0230\u0001\u0000\u0000\u0000\u07e3\u07e4\u0003"+ - "\u0011\u0000\u0000\u07e4\u07e5\u0001\u0000\u0000\u0000\u07e5\u07e6\u0006"+ - "\u0110\u0000\u0000\u07e6\u0232\u0001\u0000\u0000\u0000\u07e7\u07e8\u0003"+ - "\u0013\u0001\u0000\u07e8\u07e9\u0001\u0000\u0000\u0000\u07e9\u07ea\u0006"+ - "\u0111\u0000\u0000\u07ea\u0234\u0001\u0000\u0000\u0000\u07eb\u07ec\u0003"+ - "\u0015\u0002\u0000\u07ec\u07ed\u0001\u0000\u0000\u0000\u07ed\u07ee\u0006"+ - "\u0112\u0000\u0000\u07ee\u0236\u0001\u0000\u0000\u0000\u07ef\u07f0\u0003"+ - "\u00b3Q\u0000\u07f0\u07f1\u0001\u0000\u0000\u0000\u07f1\u07f2\u0006\u0113"+ - "\u000f\u0000\u07f2\u07f3\u0006\u0113\u0010\u0000\u07f3\u0238\u0001\u0000"+ - "\u0000\u0000\u07f4\u07f5\u0007\n\u0000\u0000\u07f5\u07f6\u0007\u0005\u0000"+ - "\u0000\u07f6\u07f7\u0007\u0015\u0000\u0000\u07f7\u07f8\u0007\t\u0000\u0000"+ - "\u07f8\u023a\u0001\u0000\u0000\u0000\u07f9\u07fa\u0003\u0011\u0000\u0000"+ - "\u07fa\u07fb\u0001\u0000\u0000\u0000\u07fb\u07fc\u0006\u0115\u0000\u0000"+ - "\u07fc\u023c\u0001\u0000\u0000\u0000\u07fd\u07fe\u0003\u0013\u0001\u0000"+ - "\u07fe\u07ff\u0001\u0000\u0000\u0000\u07ff\u0800\u0006\u0116\u0000\u0000"+ - "\u0800\u023e\u0001\u0000\u0000\u0000\u0801\u0802\u0003\u0015\u0002\u0000"+ - "\u0802\u0803\u0001\u0000\u0000\u0000\u0803\u0804\u0006\u0117\u0000\u0000"+ - "\u0804\u0240\u0001\u0000\u0000\u0000E\u0000\u0001\u0002\u0003\u0004\u0005"+ - "\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0247\u024b\u024e\u0257"+ - "\u0259\u0264\u037e\u03d3\u03d7\u03dc\u0460\u0465\u046e\u0475\u047a\u047c"+ - "\u0487\u048f\u0492\u0494\u0499\u049e\u04a4\u04ab\u04b0\u04b6\u04b9\u04c1"+ - "\u04c5\u0552\u0557\u055e\u0560\u0565\u056a\u0571\u0573\u058d\u0592\u0597"+ - "\u0599\u059f\u05d7\u05dc\u072b\u072f\u0734\u0739\u073e\u0740\u0744\u0746"+ - "1\u0000\u0001\u0000\u0005\u0001\u0000\u0005\u0002\u0000\u0005\u0004\u0000"+ - "\u0005\u0005\u0000\u0005\u0006\u0000\u0005\u0007\u0000\u0005\b\u0000\u0005"+ - "\t\u0000\u0005\n\u0000\u0005\f\u0000\u0005\r\u0000\u0005\u000e\u0000\u0005"+ - "\u000f\u0000\u0005\u0010\u0000\u00071\u0000\u0004\u0000\u0000\u0007b\u0000"+ - "\u0007H\u0000\u0007\u0085\u0000\u0007>\u0000\u0007<\u0000\u0007_\u0000"+ - "\u0007`\u0000\u0007d\u0000\u0007c\u0000\u0005\u0003\u0000\u0007M\u0000"+ - "\u0007\'\u0000\u00072\u0000\u00077\u0000\u0007\u0081\u0000\u0007J\u0000"+ - "\u0007]\u0000\u0007\\\u0000\u0007^\u0000\u0007a\u0000\u0005\u0000\u0000"+ - "\u0007\u0011\u0000\u0007:\u0000\u00079\u0000\u0007i\u0000\u0005\u000b"+ - "\u0000\u0007L\u0000\u0007?\u0000\u0007F\u0000\u0007;\u0000\u00074\u0000"+ - "\u00073\u0000"; + "\u0001\u0115\u0001\u0115\u0001\u0115\u0001\u0115\u0001\u0116\u0001\u0116"+ + "\u0001\u0116\u0001\u0116\u0001\u0117\u0001\u0117\u0001\u0117\u0001\u0117"+ + "\u0001\u0118\u0001\u0118\u0001\u0118\u0001\u0118\u0001\u0118\u0001\u0119"+ + "\u0001\u0119\u0001\u0119\u0001\u0119\u0001\u0119\u0001\u011a\u0001\u011a"+ + "\u0001\u011a\u0001\u011a\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011b"+ + "\u0001\u011c\u0001\u011c\u0001\u011c\u0001\u011c\u0002\u0264\u049c\u0000"+ + "\u011d\u0012\u0001\u0014\u0002\u0016\u0003\u0018\u0004\u001a\u0005\u001c"+ + "\u0006\u001e\u0007 \b\"\t$\n&\u000b(\f*\r,\u000e.\u000f0\u00102\u0011"+ + "4\u00126\u00138\u0014:\u0015<\u0016>\u0017@\u0018B\u0019D\u001aF\u001b"+ + "H\u001cJ\u001dL\u001eN\u001fP R!T\"V#X$Z\u0000\\\u0000^\u0000`\u0000b"+ + "\u0000d\u0000f\u0000h\u0000j\u0000l\u0000n%p&r\'t\u0000v\u0000x\u0000"+ + "z\u0000|\u0000~(\u0080\u0000\u0082\u0000\u0084)\u0086*\u0088+\u008a\u0000"+ + "\u008c\u0000\u008e\u0000\u0090\u0000\u0092\u0000\u0094\u0000\u0096\u0000"+ + "\u0098\u0000\u009a\u0000\u009c\u0000\u009e\u0000\u00a0\u0000\u00a2\u0000"+ + "\u00a4\u0000\u00a6,\u00a8-\u00aa.\u00ac\u0000\u00ae\u0000\u00b0/\u00b2"+ + "0\u00b41\u00b62\u00b8\u0000\u00ba\u0000\u00bc\u0000\u00be\u0000\u00c0"+ + "\u0000\u00c2\u0000\u00c4\u0000\u00c6\u0000\u00c8\u0000\u00ca\u0000\u00cc"+ + "3\u00ce4\u00d05\u00d26\u00d47\u00d68\u00d89\u00da:\u00dc;\u00de<\u00e0"+ + "=\u00e2>\u00e4?\u00e6@\u00e8A\u00eaB\u00ecC\u00eeD\u00f0E\u00f2F\u00f4"+ + "G\u00f6H\u00f8I\u00faJ\u00fcK\u00feL\u0100M\u0102N\u0104O\u0106P\u0108"+ + "Q\u010aR\u010cS\u010eT\u0110U\u0112V\u0114W\u0116X\u0118Y\u011aZ\u011c"+ + "[\u011e\\\u0120]\u0122\u0000\u0124^\u0126_\u0128`\u012aa\u012cb\u012e"+ + "c\u0130d\u0132\u0000\u0134e\u0136f\u0138g\u013ah\u013c\u0000\u013e\u0000"+ + "\u0140\u0000\u0142\u0000\u0144\u0000\u0146i\u0148\u0000\u014a\u0000\u014c"+ + "j\u014e\u0000\u0150\u0000\u0152k\u0154l\u0156m\u0158\u0000\u015a\u0000"+ + "\u015c\u0000\u015en\u0160o\u0162p\u0164\u0000\u0166\u0000\u0168\u0000"+ + "\u016a\u0000\u016c\u0000\u016e\u0000\u0170q\u0172r\u0174s\u0176t\u0178"+ + "u\u017av\u017cw\u017e\u0000\u0180x\u0182\u0000\u0184\u0000\u0186y\u0188"+ + "\u0000\u018a\u0000\u018c\u0000\u018ez\u0190{\u0192|\u0194\u0000\u0196"+ + "\u0000\u0198\u0000\u019a\u0000\u019c\u0000\u019e\u0000\u01a0\u0000\u01a2"+ + "\u0000\u01a4}\u01a6~\u01a8\u007f\u01aa\u0000\u01ac\u0000\u01ae\u0000\u01b0"+ + "\u0000\u01b2\u0000\u01b4\u0080\u01b6\u0081\u01b8\u0082\u01ba\u0000\u01bc"+ + "\u0000\u01be\u0000\u01c0\u0000\u01c2\u0000\u01c4\u0000\u01c6\u0000\u01c8"+ + "\u0000\u01ca\u0000\u01cc\u0000\u01ce\u0000\u01d0\u0083\u01d2\u0084\u01d4"+ + "\u0085\u01d6\u0000\u01d8\u0000\u01da\u0000\u01dc\u0000\u01de\u0000\u01e0"+ + "\u0000\u01e2\u0000\u01e4\u0000\u01e6\u0000\u01e8\u0000\u01ea\u0000\u01ec"+ + "\u0000\u01ee\u0086\u01f0\u0087\u01f2\u0088\u01f4\u0089\u01f6\u0000\u01f8"+ + "\u0000\u01fa\u0000\u01fc\u0000\u01fe\u0000\u0200\u0000\u0202\u0000\u0204"+ + "\u0000\u0206\u0000\u0208\u0000\u020a\u0000\u020c\u008a\u020e\u0000\u0210"+ + "\u008b\u0212\u008c\u0214\u008d\u0216\u0000\u0218\u0000\u021a\u0000\u021c"+ + "\u0000\u021e\u0000\u0220\u0000\u0222\u0000\u0224\u0000\u0226\u0000\u0228"+ + "\u0000\u022a\u0000\u022c\u0000\u022e\u0000\u0230\u0000\u0232\u0000\u0234"+ + "\u0000\u0236\u0000\u0238\u0000\u023a\u0000\u023c\u008e\u023e\u008f\u0240"+ + "\u0090\u0242\u0000\u0244\u0091\u0246\u0092\u0248\u0093\u024a\u0094\u0012"+ + "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e"+ + "\u000f\u0010\u0011$\u0002\u0000\n\n\r\r\u0003\u0000\t\n\r\r \u0002\u0000"+ + "CCcc\u0002\u0000HHhh\u0002\u0000AAaa\u0002\u0000NNnn\u0002\u0000GGgg\u0002"+ + "\u0000EEee\u0002\u0000PPpp\u0002\u0000OOoo\u0002\u0000IIii\u0002\u0000"+ + "TTtt\u0002\u0000RRrr\u0002\u0000XXxx\u0002\u0000LLll\u0002\u0000MMmm\u0002"+ + "\u0000DDdd\u0002\u0000SSss\u0002\u0000VVvv\u0002\u0000KKkk\u0002\u0000"+ + "WWww\u0002\u0000FFff\u0002\u0000UUuu\u0006\u0000\t\n\r\r //[[]]\f\u0000"+ + "\t\n\r\r \"#(),,//::<<>?\\\\||\u0001\u000009\u0002\u0000AZaz\b\u0000"+ + "\"\"NNRRTT\\\\nnrrtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002\u0000++--\u0001"+ + "\u0000``\u0002\u0000BBbb\u0002\u0000YYyy\f\u0000\t\n\r\r \"\"(),,//:"+ + ":==[[]]||\u0002\u0000**//\u0002\u0000JJjj\u0847\u0000\u0012\u0001\u0000"+ + "\u0000\u0000\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000"+ + "\u0000\u0000\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000"+ + "\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000"+ + "\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000"+ + "\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000"+ + "(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001"+ + "\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000"+ + "\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u0000"+ + "6\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001"+ + "\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000"+ + "\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000"+ + "D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001"+ + "\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000"+ + "\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000"+ + "R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001"+ + "\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0001Z\u0001\u0000\u0000"+ + "\u0000\u0001\\\u0001\u0000\u0000\u0000\u0001^\u0001\u0000\u0000\u0000"+ + "\u0001`\u0001\u0000\u0000\u0000\u0001b\u0001\u0000\u0000\u0000\u0001d"+ + "\u0001\u0000\u0000\u0000\u0001f\u0001\u0000\u0000\u0000\u0001h\u0001\u0000"+ + "\u0000\u0000\u0001j\u0001\u0000\u0000\u0000\u0001l\u0001\u0000\u0000\u0000"+ + "\u0001n\u0001\u0000\u0000\u0000\u0001p\u0001\u0000\u0000\u0000\u0001r"+ + "\u0001\u0000\u0000\u0000\u0002t\u0001\u0000\u0000\u0000\u0002v\u0001\u0000"+ + "\u0000\u0000\u0002x\u0001\u0000\u0000\u0000\u0002z\u0001\u0000\u0000\u0000"+ + "\u0002~\u0001\u0000\u0000\u0000\u0002\u0080\u0001\u0000\u0000\u0000\u0002"+ + "\u0082\u0001\u0000\u0000\u0000\u0002\u0084\u0001\u0000\u0000\u0000\u0002"+ + "\u0086\u0001\u0000\u0000\u0000\u0002\u0088\u0001\u0000\u0000\u0000\u0003"+ + "\u008a\u0001\u0000\u0000\u0000\u0003\u008c\u0001\u0000\u0000\u0000\u0003"+ + "\u008e\u0001\u0000\u0000\u0000\u0003\u0090\u0001\u0000\u0000\u0000\u0003"+ + "\u0092\u0001\u0000\u0000\u0000\u0003\u0094\u0001\u0000\u0000\u0000\u0003"+ + "\u0096\u0001\u0000\u0000\u0000\u0003\u0098\u0001\u0000\u0000\u0000\u0003"+ + "\u009a\u0001\u0000\u0000\u0000\u0003\u009c\u0001\u0000\u0000\u0000\u0003"+ + "\u009e\u0001\u0000\u0000\u0000\u0003\u00a0\u0001\u0000\u0000\u0000\u0003"+ + "\u00a2\u0001\u0000\u0000\u0000\u0003\u00a4\u0001\u0000\u0000\u0000\u0003"+ + "\u00a6\u0001\u0000\u0000\u0000\u0003\u00a8\u0001\u0000\u0000\u0000\u0003"+ + "\u00aa\u0001\u0000\u0000\u0000\u0004\u00ac\u0001\u0000\u0000\u0000\u0004"+ + "\u00ae\u0001\u0000\u0000\u0000\u0004\u00b0\u0001\u0000\u0000\u0000\u0004"+ + "\u00b2\u0001\u0000\u0000\u0000\u0004\u00b4\u0001\u0000\u0000\u0000\u0005"+ + "\u00b6\u0001\u0000\u0000\u0000\u0005\u00cc\u0001\u0000\u0000\u0000\u0005"+ + "\u00ce\u0001\u0000\u0000\u0000\u0005\u00d0\u0001\u0000\u0000\u0000\u0005"+ + "\u00d2\u0001\u0000\u0000\u0000\u0005\u00d4\u0001\u0000\u0000\u0000\u0005"+ + "\u00d6\u0001\u0000\u0000\u0000\u0005\u00d8\u0001\u0000\u0000\u0000\u0005"+ + "\u00da\u0001\u0000\u0000\u0000\u0005\u00dc\u0001\u0000\u0000\u0000\u0005"+ + "\u00de\u0001\u0000\u0000\u0000\u0005\u00e0\u0001\u0000\u0000\u0000\u0005"+ + "\u00e2\u0001\u0000\u0000\u0000\u0005\u00e4\u0001\u0000\u0000\u0000\u0005"+ + "\u00e6\u0001\u0000\u0000\u0000\u0005\u00e8\u0001\u0000\u0000\u0000\u0005"+ + "\u00ea\u0001\u0000\u0000\u0000\u0005\u00ec\u0001\u0000\u0000\u0000\u0005"+ + "\u00ee\u0001\u0000\u0000\u0000\u0005\u00f0\u0001\u0000\u0000\u0000\u0005"+ + "\u00f2\u0001\u0000\u0000\u0000\u0005\u00f4\u0001\u0000\u0000\u0000\u0005"+ + "\u00f6\u0001\u0000\u0000\u0000\u0005\u00f8\u0001\u0000\u0000\u0000\u0005"+ + "\u00fa\u0001\u0000\u0000\u0000\u0005\u00fc\u0001\u0000\u0000\u0000\u0005"+ + "\u00fe\u0001\u0000\u0000\u0000\u0005\u0100\u0001\u0000\u0000\u0000\u0005"+ + "\u0102\u0001\u0000\u0000\u0000\u0005\u0104\u0001\u0000\u0000\u0000\u0005"+ + "\u0106\u0001\u0000\u0000\u0000\u0005\u0108\u0001\u0000\u0000\u0000\u0005"+ + "\u010a\u0001\u0000\u0000\u0000\u0005\u010c\u0001\u0000\u0000\u0000\u0005"+ + "\u010e\u0001\u0000\u0000\u0000\u0005\u0110\u0001\u0000\u0000\u0000\u0005"+ + "\u0112\u0001\u0000\u0000\u0000\u0005\u0114\u0001\u0000\u0000\u0000\u0005"+ + "\u0116\u0001\u0000\u0000\u0000\u0005\u0118\u0001\u0000\u0000\u0000\u0005"+ + "\u011a\u0001\u0000\u0000\u0000\u0005\u011c\u0001\u0000\u0000\u0000\u0005"+ + "\u011e\u0001\u0000\u0000\u0000\u0005\u0120\u0001\u0000\u0000\u0000\u0005"+ + "\u0122\u0001\u0000\u0000\u0000\u0005\u0124\u0001\u0000\u0000\u0000\u0005"+ + "\u0126\u0001\u0000\u0000\u0000\u0005\u0128\u0001\u0000\u0000\u0000\u0005"+ + "\u012a\u0001\u0000\u0000\u0000\u0005\u012c\u0001\u0000\u0000\u0000\u0005"+ + "\u012e\u0001\u0000\u0000\u0000\u0005\u0130\u0001\u0000\u0000\u0000\u0005"+ + "\u0134\u0001\u0000\u0000\u0000\u0005\u0136\u0001\u0000\u0000\u0000\u0005"+ + "\u0138\u0001\u0000\u0000\u0000\u0005\u013a\u0001\u0000\u0000\u0000\u0006"+ + "\u013c\u0001\u0000\u0000\u0000\u0006\u013e\u0001\u0000\u0000\u0000\u0006"+ + "\u0140\u0001\u0000\u0000\u0000\u0006\u0142\u0001\u0000\u0000\u0000\u0006"+ + "\u0144\u0001\u0000\u0000\u0000\u0006\u0146\u0001\u0000\u0000\u0000\u0006"+ + "\u0148\u0001\u0000\u0000\u0000\u0006\u014c\u0001\u0000\u0000\u0000\u0006"+ + "\u014e\u0001\u0000\u0000\u0000\u0006\u0150\u0001\u0000\u0000\u0000\u0006"+ + "\u0152\u0001\u0000\u0000\u0000\u0006\u0154\u0001\u0000\u0000\u0000\u0006"+ + "\u0156\u0001\u0000\u0000\u0000\u0007\u0158\u0001\u0000\u0000\u0000\u0007"+ + "\u015a\u0001\u0000\u0000\u0000\u0007\u015c\u0001\u0000\u0000\u0000\u0007"+ + "\u015e\u0001\u0000\u0000\u0000\u0007\u0160\u0001\u0000\u0000\u0000\u0007"+ + "\u0162\u0001\u0000\u0000\u0000\b\u0164\u0001\u0000\u0000\u0000\b\u0166"+ + "\u0001\u0000\u0000\u0000\b\u0168\u0001\u0000\u0000\u0000\b\u016a\u0001"+ + "\u0000\u0000\u0000\b\u016c\u0001\u0000\u0000\u0000\b\u016e\u0001\u0000"+ + "\u0000\u0000\b\u0170\u0001\u0000\u0000\u0000\b\u0172\u0001\u0000\u0000"+ + "\u0000\b\u0174\u0001\u0000\u0000\u0000\t\u0176\u0001\u0000\u0000\u0000"+ + "\t\u0178\u0001\u0000\u0000\u0000\t\u017a\u0001\u0000\u0000\u0000\t\u017c"+ + "\u0001\u0000\u0000\u0000\n\u017e\u0001\u0000\u0000\u0000\n\u0180\u0001"+ + "\u0000\u0000\u0000\n\u0182\u0001\u0000\u0000\u0000\n\u0184\u0001\u0000"+ + "\u0000\u0000\n\u0186\u0001\u0000\u0000\u0000\n\u0188\u0001\u0000\u0000"+ + "\u0000\n\u018a\u0001\u0000\u0000\u0000\n\u018c\u0001\u0000\u0000\u0000"+ + "\n\u018e\u0001\u0000\u0000\u0000\n\u0190\u0001\u0000\u0000\u0000\n\u0192"+ + "\u0001\u0000\u0000\u0000\u000b\u0194\u0001\u0000\u0000\u0000\u000b\u0196"+ + "\u0001\u0000\u0000\u0000\u000b\u0198\u0001\u0000\u0000\u0000\u000b\u019a"+ + "\u0001\u0000\u0000\u0000\u000b\u019c\u0001\u0000\u0000\u0000\u000b\u019e"+ + "\u0001\u0000\u0000\u0000\u000b\u01a0\u0001\u0000\u0000\u0000\u000b\u01a2"+ + "\u0001\u0000\u0000\u0000\u000b\u01a4\u0001\u0000\u0000\u0000\u000b\u01a6"+ + "\u0001\u0000\u0000\u0000\u000b\u01a8\u0001\u0000\u0000\u0000\f\u01aa\u0001"+ + "\u0000\u0000\u0000\f\u01ac\u0001\u0000\u0000\u0000\f\u01ae\u0001\u0000"+ + "\u0000\u0000\f\u01b0\u0001\u0000\u0000\u0000\f\u01b2\u0001\u0000\u0000"+ + "\u0000\f\u01b4\u0001\u0000\u0000\u0000\f\u01b6\u0001\u0000\u0000\u0000"+ + "\f\u01b8\u0001\u0000\u0000\u0000\r\u01ba\u0001\u0000\u0000\u0000\r\u01bc"+ + "\u0001\u0000\u0000\u0000\r\u01be\u0001\u0000\u0000\u0000\r\u01c0\u0001"+ + "\u0000\u0000\u0000\r\u01c2\u0001\u0000\u0000\u0000\r\u01c4\u0001\u0000"+ + "\u0000\u0000\r\u01c6\u0001\u0000\u0000\u0000\r\u01c8\u0001\u0000\u0000"+ + "\u0000\r\u01ca\u0001\u0000\u0000\u0000\r\u01cc\u0001\u0000\u0000\u0000"+ + "\r\u01ce\u0001\u0000\u0000\u0000\r\u01d0\u0001\u0000\u0000\u0000\r\u01d2"+ + "\u0001\u0000\u0000\u0000\r\u01d4\u0001\u0000\u0000\u0000\u000e\u01d6\u0001"+ + "\u0000\u0000\u0000\u000e\u01d8\u0001\u0000\u0000\u0000\u000e\u01da\u0001"+ + "\u0000\u0000\u0000\u000e\u01dc\u0001\u0000\u0000\u0000\u000e\u01de\u0001"+ + "\u0000\u0000\u0000\u000e\u01e0\u0001\u0000\u0000\u0000\u000e\u01e2\u0001"+ + "\u0000\u0000\u0000\u000e\u01e4\u0001\u0000\u0000\u0000\u000e\u01e6\u0001"+ + "\u0000\u0000\u0000\u000e\u01e8\u0001\u0000\u0000\u0000\u000e\u01ee\u0001"+ + "\u0000\u0000\u0000\u000e\u01f0\u0001\u0000\u0000\u0000\u000e\u01f2\u0001"+ + "\u0000\u0000\u0000\u000e\u01f4\u0001\u0000\u0000\u0000\u000f\u01f6\u0001"+ + "\u0000\u0000\u0000\u000f\u01f8\u0001\u0000\u0000\u0000\u000f\u01fa\u0001"+ + "\u0000\u0000\u0000\u000f\u01fc\u0001\u0000\u0000\u0000\u000f\u01fe\u0001"+ + "\u0000\u0000\u0000\u000f\u0200\u0001\u0000\u0000\u0000\u000f\u0202\u0001"+ + "\u0000\u0000\u0000\u000f\u0204\u0001\u0000\u0000\u0000\u000f\u0206\u0001"+ + "\u0000\u0000\u0000\u000f\u0208\u0001\u0000\u0000\u0000\u000f\u020a\u0001"+ + "\u0000\u0000\u0000\u000f\u020c\u0001\u0000\u0000\u0000\u000f\u020e\u0001"+ + "\u0000\u0000\u0000\u000f\u0210\u0001\u0000\u0000\u0000\u000f\u0212\u0001"+ + "\u0000\u0000\u0000\u000f\u0214\u0001\u0000\u0000\u0000\u0010\u0216\u0001"+ + "\u0000\u0000\u0000\u0010\u0218\u0001\u0000\u0000\u0000\u0010\u021a\u0001"+ + "\u0000\u0000\u0000\u0010\u021c\u0001\u0000\u0000\u0000\u0010\u021e\u0001"+ + "\u0000\u0000\u0000\u0010\u0220\u0001\u0000\u0000\u0000\u0010\u0222\u0001"+ + "\u0000\u0000\u0000\u0010\u0224\u0001\u0000\u0000\u0000\u0010\u0226\u0001"+ + "\u0000\u0000\u0000\u0010\u0228\u0001\u0000\u0000\u0000\u0010\u022a\u0001"+ + "\u0000\u0000\u0000\u0010\u022c\u0001\u0000\u0000\u0000\u0010\u022e\u0001"+ + "\u0000\u0000\u0000\u0010\u0230\u0001\u0000\u0000\u0000\u0010\u0232\u0001"+ + "\u0000\u0000\u0000\u0010\u0234\u0001\u0000\u0000\u0000\u0010\u0236\u0001"+ + "\u0000\u0000\u0000\u0010\u0238\u0001\u0000\u0000\u0000\u0010\u023a\u0001"+ + "\u0000\u0000\u0000\u0010\u023c\u0001\u0000\u0000\u0000\u0010\u023e\u0001"+ + "\u0000\u0000\u0000\u0010\u0240\u0001\u0000\u0000\u0000\u0011\u0242\u0001"+ + "\u0000\u0000\u0000\u0011\u0244\u0001\u0000\u0000\u0000\u0011\u0246\u0001"+ + "\u0000\u0000\u0000\u0011\u0248\u0001\u0000\u0000\u0000\u0011\u024a\u0001"+ + "\u0000\u0000\u0000\u0012\u024c\u0001\u0000\u0000\u0000\u0014\u025d\u0001"+ + "\u0000\u0000\u0000\u0016\u026d\u0001\u0000\u0000\u0000\u0018\u0273\u0001"+ + "\u0000\u0000\u0000\u001a\u0282\u0001\u0000\u0000\u0000\u001c\u028b\u0001"+ + "\u0000\u0000\u0000\u001e\u0296\u0001\u0000\u0000\u0000 \u02a3\u0001\u0000"+ + "\u0000\u0000\"\u02ad\u0001\u0000\u0000\u0000$\u02b4\u0001\u0000\u0000"+ + "\u0000&\u02bb\u0001\u0000\u0000\u0000(\u02c3\u0001\u0000\u0000\u0000*"+ + "\u02cc\u0001\u0000\u0000\u0000,\u02d2\u0001\u0000\u0000\u0000.\u02db\u0001"+ + "\u0000\u0000\u00000\u02e2\u0001\u0000\u0000\u00002\u02ea\u0001\u0000\u0000"+ + "\u00004\u02f2\u0001\u0000\u0000\u00006\u02f9\u0001\u0000\u0000\u00008"+ + "\u02fe\u0001\u0000\u0000\u0000:\u0305\u0001\u0000\u0000\u0000<\u030d\u0001"+ + "\u0000\u0000\u0000>\u0317\u0001\u0000\u0000\u0000@\u0326\u0001\u0000\u0000"+ + "\u0000B\u032f\u0001\u0000\u0000\u0000D\u0337\u0001\u0000\u0000\u0000F"+ + "\u033f\u0001\u0000\u0000\u0000H\u0348\u0001\u0000\u0000\u0000J\u0354\u0001"+ + "\u0000\u0000\u0000L\u0360\u0001\u0000\u0000\u0000N\u0367\u0001\u0000\u0000"+ + "\u0000P\u036e\u0001\u0000\u0000\u0000R\u037a\u0001\u0000\u0000\u0000T"+ + "\u0383\u0001\u0000\u0000\u0000V\u0389\u0001\u0000\u0000\u0000X\u0391\u0001"+ + "\u0000\u0000\u0000Z\u0397\u0001\u0000\u0000\u0000\\\u039c\u0001\u0000"+ + "\u0000\u0000^\u03a2\u0001\u0000\u0000\u0000`\u03a6\u0001\u0000\u0000\u0000"+ + "b\u03aa\u0001\u0000\u0000\u0000d\u03ae\u0001\u0000\u0000\u0000f\u03b2"+ + "\u0001\u0000\u0000\u0000h\u03b6\u0001\u0000\u0000\u0000j\u03ba\u0001\u0000"+ + "\u0000\u0000l\u03be\u0001\u0000\u0000\u0000n\u03c2\u0001\u0000\u0000\u0000"+ + "p\u03c6\u0001\u0000\u0000\u0000r\u03ca\u0001\u0000\u0000\u0000t\u03ce"+ + "\u0001\u0000\u0000\u0000v\u03d3\u0001\u0000\u0000\u0000x\u03d9\u0001\u0000"+ + "\u0000\u0000z\u03de\u0001\u0000\u0000\u0000|\u03e3\u0001\u0000\u0000\u0000"+ + "~\u03ec\u0001\u0000\u0000\u0000\u0080\u03f3\u0001\u0000\u0000\u0000\u0082"+ + "\u03f7\u0001\u0000\u0000\u0000\u0084\u03fb\u0001\u0000\u0000\u0000\u0086"+ + "\u03ff\u0001\u0000\u0000\u0000\u0088\u0403\u0001\u0000\u0000\u0000\u008a"+ + "\u0407\u0001\u0000\u0000\u0000\u008c\u040d\u0001\u0000\u0000\u0000\u008e"+ + "\u0414\u0001\u0000\u0000\u0000\u0090\u0418\u0001\u0000\u0000\u0000\u0092"+ + "\u041c\u0001\u0000\u0000\u0000\u0094\u0420\u0001\u0000\u0000\u0000\u0096"+ + "\u0424\u0001\u0000\u0000\u0000\u0098\u0428\u0001\u0000\u0000\u0000\u009a"+ + "\u042c\u0001\u0000\u0000\u0000\u009c\u0430\u0001\u0000\u0000\u0000\u009e"+ + "\u0434\u0001\u0000\u0000\u0000\u00a0\u0438\u0001\u0000\u0000\u0000\u00a2"+ + "\u043c\u0001\u0000\u0000\u0000\u00a4\u0440\u0001\u0000\u0000\u0000\u00a6"+ + "\u0444\u0001\u0000\u0000\u0000\u00a8\u0448\u0001\u0000\u0000\u0000\u00aa"+ + "\u044c\u0001\u0000\u0000\u0000\u00ac\u0450\u0001\u0000\u0000\u0000\u00ae"+ + "\u0455\u0001\u0000\u0000\u0000\u00b0\u045a\u0001\u0000\u0000\u0000\u00b2"+ + "\u045e\u0001\u0000\u0000\u0000\u00b4\u0462\u0001\u0000\u0000\u0000\u00b6"+ + "\u0466\u0001\u0000\u0000\u0000\u00b8\u046a\u0001\u0000\u0000\u0000\u00ba"+ + "\u046c\u0001\u0000\u0000\u0000\u00bc\u046e\u0001\u0000\u0000\u0000\u00be"+ + "\u0471\u0001\u0000\u0000\u0000\u00c0\u0473\u0001\u0000\u0000\u0000\u00c2"+ + "\u047c\u0001\u0000\u0000\u0000\u00c4\u047e\u0001\u0000\u0000\u0000\u00c6"+ + "\u0483\u0001\u0000\u0000\u0000\u00c8\u0485\u0001\u0000\u0000\u0000\u00ca"+ + "\u048a\u0001\u0000\u0000\u0000\u00cc\u04a9\u0001\u0000\u0000\u0000\u00ce"+ + "\u04ac\u0001\u0000\u0000\u0000\u00d0\u04da\u0001\u0000\u0000\u0000\u00d2"+ + "\u04dc\u0001\u0000\u0000\u0000\u00d4\u04e0\u0001\u0000\u0000\u0000\u00d6"+ + "\u04e4\u0001\u0000\u0000\u0000\u00d8\u04e6\u0001\u0000\u0000\u0000\u00da"+ + "\u04e9\u0001\u0000\u0000\u0000\u00dc\u04ec\u0001\u0000\u0000\u0000\u00de"+ + "\u04ee\u0001\u0000\u0000\u0000\u00e0\u04f0\u0001\u0000\u0000\u0000\u00e2"+ + "\u04f2\u0001\u0000\u0000\u0000\u00e4\u04f7\u0001\u0000\u0000\u0000\u00e6"+ + "\u04f9\u0001\u0000\u0000\u0000\u00e8\u04ff\u0001\u0000\u0000\u0000\u00ea"+ + "\u0505\u0001\u0000\u0000\u0000\u00ec\u0508\u0001\u0000\u0000\u0000\u00ee"+ + "\u050b\u0001\u0000\u0000\u0000\u00f0\u0510\u0001\u0000\u0000\u0000\u00f2"+ + "\u0515\u0001\u0000\u0000\u0000\u00f4\u0519\u0001\u0000\u0000\u0000\u00f6"+ + "\u051e\u0001\u0000\u0000\u0000\u00f8\u0524\u0001\u0000\u0000\u0000\u00fa"+ + "\u0527\u0001\u0000\u0000\u0000\u00fc\u052a\u0001\u0000\u0000\u0000\u00fe"+ + "\u052c\u0001\u0000\u0000\u0000\u0100\u0532\u0001\u0000\u0000\u0000\u0102"+ + "\u0537\u0001\u0000\u0000\u0000\u0104\u053c\u0001\u0000\u0000\u0000\u0106"+ + "\u053f\u0001\u0000\u0000\u0000\u0108\u0542\u0001\u0000\u0000\u0000\u010a"+ + "\u0545\u0001\u0000\u0000\u0000\u010c\u0547\u0001\u0000\u0000\u0000\u010e"+ + "\u054a\u0001\u0000\u0000\u0000\u0110\u054c\u0001\u0000\u0000\u0000\u0112"+ + "\u054f\u0001\u0000\u0000\u0000\u0114\u0551\u0001\u0000\u0000\u0000\u0116"+ + "\u0553\u0001\u0000\u0000\u0000\u0118\u0555\u0001\u0000\u0000\u0000\u011a"+ + "\u0557\u0001\u0000\u0000\u0000\u011c\u0559\u0001\u0000\u0000\u0000\u011e"+ + "\u055b\u0001\u0000\u0000\u0000\u0120\u055d\u0001\u0000\u0000\u0000\u0122"+ + "\u0560\u0001\u0000\u0000\u0000\u0124\u0575\u0001\u0000\u0000\u0000\u0126"+ + "\u0588\u0001\u0000\u0000\u0000\u0128\u058a\u0001\u0000\u0000\u0000\u012a"+ + "\u058f\u0001\u0000\u0000\u0000\u012c\u0594\u0001\u0000\u0000\u0000\u012e"+ + "\u0599\u0001\u0000\u0000\u0000\u0130\u05ae\u0001\u0000\u0000\u0000\u0132"+ + "\u05b0\u0001\u0000\u0000\u0000\u0134\u05b8\u0001\u0000\u0000\u0000\u0136"+ + "\u05ba\u0001\u0000\u0000\u0000\u0138\u05be\u0001\u0000\u0000\u0000\u013a"+ + "\u05c2\u0001\u0000\u0000\u0000\u013c\u05c6\u0001\u0000\u0000\u0000\u013e"+ + "\u05cb\u0001\u0000\u0000\u0000\u0140\u05cf\u0001\u0000\u0000\u0000\u0142"+ + "\u05d3\u0001\u0000\u0000\u0000\u0144\u05d7\u0001\u0000\u0000\u0000\u0146"+ + "\u05db\u0001\u0000\u0000\u0000\u0148\u05e4\u0001\u0000\u0000\u0000\u014a"+ + "\u05ec\u0001\u0000\u0000\u0000\u014c\u05ef\u0001\u0000\u0000\u0000\u014e"+ + "\u05f3\u0001\u0000\u0000\u0000\u0150\u05f7\u0001\u0000\u0000\u0000\u0152"+ + "\u05fb\u0001\u0000\u0000\u0000\u0154\u05ff\u0001\u0000\u0000\u0000\u0156"+ + "\u0603\u0001\u0000\u0000\u0000\u0158\u0607\u0001\u0000\u0000\u0000\u015a"+ + "\u060c\u0001\u0000\u0000\u0000\u015c\u0612\u0001\u0000\u0000\u0000\u015e"+ + "\u0617\u0001\u0000\u0000\u0000\u0160\u061b\u0001\u0000\u0000\u0000\u0162"+ + "\u061f\u0001\u0000\u0000\u0000\u0164\u0623\u0001\u0000\u0000\u0000\u0166"+ + "\u0628\u0001\u0000\u0000\u0000\u0168\u062e\u0001\u0000\u0000\u0000\u016a"+ + "\u0634\u0001\u0000\u0000\u0000\u016c\u0638\u0001\u0000\u0000\u0000\u016e"+ + "\u063c\u0001\u0000\u0000\u0000\u0170\u0640\u0001\u0000\u0000\u0000\u0172"+ + "\u0644\u0001\u0000\u0000\u0000\u0174\u0648\u0001\u0000\u0000\u0000\u0176"+ + "\u064c\u0001\u0000\u0000\u0000\u0178\u0655\u0001\u0000\u0000\u0000\u017a"+ + "\u0659\u0001\u0000\u0000\u0000\u017c\u065d\u0001\u0000\u0000\u0000\u017e"+ + "\u0661\u0001\u0000\u0000\u0000\u0180\u0666\u0001\u0000\u0000\u0000\u0182"+ + "\u066b\u0001\u0000\u0000\u0000\u0184\u066f\u0001\u0000\u0000\u0000\u0186"+ + "\u0675\u0001\u0000\u0000\u0000\u0188\u067e\u0001\u0000\u0000\u0000\u018a"+ + "\u0682\u0001\u0000\u0000\u0000\u018c\u0686\u0001\u0000\u0000\u0000\u018e"+ + "\u068a\u0001\u0000\u0000\u0000\u0190\u068e\u0001\u0000\u0000\u0000\u0192"+ + "\u0692\u0001\u0000\u0000\u0000\u0194\u0696\u0001\u0000\u0000\u0000\u0196"+ + "\u069b\u0001\u0000\u0000\u0000\u0198\u06a1\u0001\u0000\u0000\u0000\u019a"+ + "\u06a5\u0001\u0000\u0000\u0000\u019c\u06a9\u0001\u0000\u0000\u0000\u019e"+ + "\u06ad\u0001\u0000\u0000\u0000\u01a0\u06b2\u0001\u0000\u0000\u0000\u01a2"+ + "\u06b6\u0001\u0000\u0000\u0000\u01a4\u06ba\u0001\u0000\u0000\u0000\u01a6"+ + "\u06be\u0001\u0000\u0000\u0000\u01a8\u06c2\u0001\u0000\u0000\u0000\u01aa"+ + "\u06c6\u0001\u0000\u0000\u0000\u01ac\u06cc\u0001\u0000\u0000\u0000\u01ae"+ + "\u06d3\u0001\u0000\u0000\u0000\u01b0\u06d7\u0001\u0000\u0000\u0000\u01b2"+ + "\u06db\u0001\u0000\u0000\u0000\u01b4\u06df\u0001\u0000\u0000\u0000\u01b6"+ + "\u06e3\u0001\u0000\u0000\u0000\u01b8\u06e7\u0001\u0000\u0000\u0000\u01ba"+ + "\u06eb\u0001\u0000\u0000\u0000\u01bc\u06f0\u0001\u0000\u0000\u0000\u01be"+ + "\u06f6\u0001\u0000\u0000\u0000\u01c0\u06fa\u0001\u0000\u0000\u0000\u01c2"+ + "\u06fe\u0001\u0000\u0000\u0000\u01c4\u0702\u0001\u0000\u0000\u0000\u01c6"+ + "\u0706\u0001\u0000\u0000\u0000\u01c8\u070a\u0001\u0000\u0000\u0000\u01ca"+ + "\u070e\u0001\u0000\u0000\u0000\u01cc\u0712\u0001\u0000\u0000\u0000\u01ce"+ + "\u0716\u0001\u0000\u0000\u0000\u01d0\u071a\u0001\u0000\u0000\u0000\u01d2"+ + "\u071e\u0001\u0000\u0000\u0000\u01d4\u0722\u0001\u0000\u0000\u0000\u01d6"+ + "\u0726\u0001\u0000\u0000\u0000\u01d8\u072b\u0001\u0000\u0000\u0000\u01da"+ + "\u0731\u0001\u0000\u0000\u0000\u01dc\u0735\u0001\u0000\u0000\u0000\u01de"+ + "\u0739\u0001\u0000\u0000\u0000\u01e0\u073d\u0001\u0000\u0000\u0000\u01e2"+ + "\u0741\u0001\u0000\u0000\u0000\u01e4\u0745\u0001\u0000\u0000\u0000\u01e6"+ + "\u0749\u0001\u0000\u0000\u0000\u01e8\u074d\u0001\u0000\u0000\u0000\u01ea"+ + "\u0755\u0001\u0000\u0000\u0000\u01ec\u076a\u0001\u0000\u0000\u0000\u01ee"+ + "\u076e\u0001\u0000\u0000\u0000\u01f0\u0772\u0001\u0000\u0000\u0000\u01f2"+ + "\u0776\u0001\u0000\u0000\u0000\u01f4\u077a\u0001\u0000\u0000\u0000\u01f6"+ + "\u077e\u0001\u0000\u0000\u0000\u01f8\u0783\u0001\u0000\u0000\u0000\u01fa"+ + "\u0789\u0001\u0000\u0000\u0000\u01fc\u078d\u0001\u0000\u0000\u0000\u01fe"+ + "\u0791\u0001\u0000\u0000\u0000\u0200\u0795\u0001\u0000\u0000\u0000\u0202"+ + "\u0799\u0001\u0000\u0000\u0000\u0204\u079d\u0001\u0000\u0000\u0000\u0206"+ + "\u07a1\u0001\u0000\u0000\u0000\u0208\u07a5\u0001\u0000\u0000\u0000\u020a"+ + "\u07a9\u0001\u0000\u0000\u0000\u020c\u07ad\u0001\u0000\u0000\u0000\u020e"+ + "\u07b0\u0001\u0000\u0000\u0000\u0210\u07b4\u0001\u0000\u0000\u0000\u0212"+ + "\u07b8\u0001\u0000\u0000\u0000\u0214\u07bc\u0001\u0000\u0000\u0000\u0216"+ + "\u07c0\u0001\u0000\u0000\u0000\u0218\u07c4\u0001\u0000\u0000\u0000\u021a"+ + "\u07c8\u0001\u0000\u0000\u0000\u021c\u07cc\u0001\u0000\u0000\u0000\u021e"+ + "\u07d1\u0001\u0000\u0000\u0000\u0220\u07d5\u0001\u0000\u0000\u0000\u0222"+ + "\u07d9\u0001\u0000\u0000\u0000\u0224\u07dd\u0001\u0000\u0000\u0000\u0226"+ + "\u07e1\u0001\u0000\u0000\u0000\u0228\u07e5\u0001\u0000\u0000\u0000\u022a"+ + "\u07e9\u0001\u0000\u0000\u0000\u022c\u07ed\u0001\u0000\u0000\u0000\u022e"+ + "\u07f1\u0001\u0000\u0000\u0000\u0230\u07f5\u0001\u0000\u0000\u0000\u0232"+ + "\u07f9\u0001\u0000\u0000\u0000\u0234\u07fd\u0001\u0000\u0000\u0000\u0236"+ + "\u0801\u0001\u0000\u0000\u0000\u0238\u0805\u0001\u0000\u0000\u0000\u023a"+ + "\u0809\u0001\u0000\u0000\u0000\u023c\u080d\u0001\u0000\u0000\u0000\u023e"+ + "\u0811\u0001\u0000\u0000\u0000\u0240\u0815\u0001\u0000\u0000\u0000\u0242"+ + "\u0819\u0001\u0000\u0000\u0000\u0244\u081e\u0001\u0000\u0000\u0000\u0246"+ + "\u0823\u0001\u0000\u0000\u0000\u0248\u0827\u0001\u0000\u0000\u0000\u024a"+ + "\u082b\u0001\u0000\u0000\u0000\u024c\u024d\u0005/\u0000\u0000\u024d\u024e"+ + "\u0005/\u0000\u0000\u024e\u0252\u0001\u0000\u0000\u0000\u024f\u0251\b"+ + "\u0000\u0000\u0000\u0250\u024f\u0001\u0000\u0000\u0000\u0251\u0254\u0001"+ + "\u0000\u0000\u0000\u0252\u0250\u0001\u0000\u0000\u0000\u0252\u0253\u0001"+ + "\u0000\u0000\u0000\u0253\u0256\u0001\u0000\u0000\u0000\u0254\u0252\u0001"+ + "\u0000\u0000\u0000\u0255\u0257\u0005\r\u0000\u0000\u0256\u0255\u0001\u0000"+ + "\u0000\u0000\u0256\u0257\u0001\u0000\u0000\u0000\u0257\u0259\u0001\u0000"+ + "\u0000\u0000\u0258\u025a\u0005\n\u0000\u0000\u0259\u0258\u0001\u0000\u0000"+ + "\u0000\u0259\u025a\u0001\u0000\u0000\u0000\u025a\u025b\u0001\u0000\u0000"+ + "\u0000\u025b\u025c\u0006\u0000\u0000\u0000\u025c\u0013\u0001\u0000\u0000"+ + "\u0000\u025d\u025e\u0005/\u0000\u0000\u025e\u025f\u0005*\u0000\u0000\u025f"+ + "\u0264\u0001\u0000\u0000\u0000\u0260\u0263\u0003\u0014\u0001\u0000\u0261"+ + "\u0263\t\u0000\u0000\u0000\u0262\u0260\u0001\u0000\u0000\u0000\u0262\u0261"+ + "\u0001\u0000\u0000\u0000\u0263\u0266\u0001\u0000\u0000\u0000\u0264\u0265"+ + "\u0001\u0000\u0000\u0000\u0264\u0262\u0001\u0000\u0000\u0000\u0265\u0267"+ + "\u0001\u0000\u0000\u0000\u0266\u0264\u0001\u0000\u0000\u0000\u0267\u0268"+ + "\u0005*\u0000\u0000\u0268\u0269\u0005/\u0000\u0000\u0269\u026a\u0001\u0000"+ + "\u0000\u0000\u026a\u026b\u0006\u0001\u0000\u0000\u026b\u0015\u0001\u0000"+ + "\u0000\u0000\u026c\u026e\u0007\u0001\u0000\u0000\u026d\u026c\u0001\u0000"+ + "\u0000\u0000\u026e\u026f\u0001\u0000\u0000\u0000\u026f\u026d\u0001\u0000"+ + "\u0000\u0000\u026f\u0270\u0001\u0000\u0000\u0000\u0270\u0271\u0001\u0000"+ + "\u0000\u0000\u0271\u0272\u0006\u0002\u0000\u0000\u0272\u0017\u0001\u0000"+ + "\u0000\u0000\u0273\u0274\u0007\u0002\u0000\u0000\u0274\u0275\u0007\u0003"+ + "\u0000\u0000\u0275\u0276\u0007\u0004\u0000\u0000\u0276\u0277\u0007\u0005"+ + "\u0000\u0000\u0277\u0278\u0007\u0006\u0000\u0000\u0278\u0279\u0007\u0007"+ + "\u0000\u0000\u0279\u027a\u0005_\u0000\u0000\u027a\u027b\u0007\b\u0000"+ + "\u0000\u027b\u027c\u0007\t\u0000\u0000\u027c\u027d\u0007\n\u0000\u0000"+ + "\u027d\u027e\u0007\u0005\u0000\u0000\u027e\u027f\u0007\u000b\u0000\u0000"+ + "\u027f\u0280\u0001\u0000\u0000\u0000\u0280\u0281\u0006\u0003\u0001\u0000"+ + "\u0281\u0019\u0001\u0000\u0000\u0000\u0282\u0283\u0007\u0007\u0000\u0000"+ + "\u0283\u0284\u0007\u0005\u0000\u0000\u0284\u0285\u0007\f\u0000\u0000\u0285"+ + "\u0286\u0007\n\u0000\u0000\u0286\u0287\u0007\u0002\u0000\u0000\u0287\u0288"+ + "\u0007\u0003\u0000\u0000\u0288\u0289\u0001\u0000\u0000\u0000\u0289\u028a"+ + "\u0006\u0004\u0002\u0000\u028a\u001b\u0001\u0000\u0000\u0000\u028b\u028c"+ + "\u0004\u0005\u0000\u0000\u028c\u028d\u0007\u0007\u0000\u0000\u028d\u028e"+ + "\u0007\r\u0000\u0000\u028e\u028f\u0007\b\u0000\u0000\u028f\u0290\u0007"+ + "\u000e\u0000\u0000\u0290\u0291\u0007\u0004\u0000\u0000\u0291\u0292\u0007"+ + "\n\u0000\u0000\u0292\u0293\u0007\u0005\u0000\u0000\u0293\u0294\u0001\u0000"+ + "\u0000\u0000\u0294\u0295\u0006\u0005\u0003\u0000\u0295\u001d\u0001\u0000"+ + "\u0000\u0000\u0296\u0297\u0007\u0002\u0000\u0000\u0297\u0298\u0007\t\u0000"+ + "\u0000\u0298\u0299\u0007\u000f\u0000\u0000\u0299\u029a\u0007\b\u0000\u0000"+ + "\u029a\u029b\u0007\u000e\u0000\u0000\u029b\u029c\u0007\u0007\u0000\u0000"+ + "\u029c\u029d\u0007\u000b\u0000\u0000\u029d\u029e\u0007\n\u0000\u0000\u029e"+ + "\u029f\u0007\t\u0000\u0000\u029f\u02a0\u0007\u0005\u0000\u0000\u02a0\u02a1"+ + "\u0001\u0000\u0000\u0000\u02a1\u02a2\u0006\u0006\u0004\u0000\u02a2\u001f"+ + "\u0001\u0000\u0000\u0000\u02a3\u02a4\u0007\u0010\u0000\u0000\u02a4\u02a5"+ + "\u0007\n\u0000\u0000\u02a5\u02a6\u0007\u0011\u0000\u0000\u02a6\u02a7\u0007"+ + "\u0011\u0000\u0000\u02a7\u02a8\u0007\u0007\u0000\u0000\u02a8\u02a9\u0007"+ + "\u0002\u0000\u0000\u02a9\u02aa\u0007\u000b\u0000\u0000\u02aa\u02ab\u0001"+ + "\u0000\u0000\u0000\u02ab\u02ac\u0006\u0007\u0004\u0000\u02ac!\u0001\u0000"+ + "\u0000\u0000\u02ad\u02ae\u0007\u0007\u0000\u0000\u02ae\u02af\u0007\u0012"+ + "\u0000\u0000\u02af\u02b0\u0007\u0004\u0000\u0000\u02b0\u02b1\u0007\u000e"+ + "\u0000\u0000\u02b1\u02b2\u0001\u0000\u0000\u0000\u02b2\u02b3\u0006\b\u0004"+ + "\u0000\u02b3#\u0001\u0000\u0000\u0000\u02b4\u02b5\u0007\u0006\u0000\u0000"+ + "\u02b5\u02b6\u0007\f\u0000\u0000\u02b6\u02b7\u0007\t\u0000\u0000\u02b7"+ + "\u02b8\u0007\u0013\u0000\u0000\u02b8\u02b9\u0001\u0000\u0000\u0000\u02b9"+ + "\u02ba\u0006\t\u0004\u0000\u02ba%\u0001\u0000\u0000\u0000\u02bb\u02bc"+ + "\u0007\u000e\u0000\u0000\u02bc\u02bd\u0007\n\u0000\u0000\u02bd\u02be\u0007"+ + "\u000f\u0000\u0000\u02be\u02bf\u0007\n\u0000\u0000\u02bf\u02c0\u0007\u000b"+ + "\u0000\u0000\u02c0\u02c1\u0001\u0000\u0000\u0000\u02c1\u02c2\u0006\n\u0004"+ + "\u0000\u02c2\'\u0001\u0000\u0000\u0000\u02c3\u02c4\u0007\f\u0000\u0000"+ + "\u02c4\u02c5\u0007\u0007\u0000\u0000\u02c5\u02c6\u0007\f\u0000\u0000\u02c6"+ + "\u02c7\u0007\u0004\u0000\u0000\u02c7\u02c8\u0007\u0005\u0000\u0000\u02c8"+ + "\u02c9\u0007\u0013\u0000\u0000\u02c9\u02ca\u0001\u0000\u0000\u0000\u02ca"+ + "\u02cb\u0006\u000b\u0004\u0000\u02cb)\u0001\u0000\u0000\u0000\u02cc\u02cd"+ + "\u0007\f\u0000\u0000\u02cd\u02ce\u0007\t\u0000\u0000\u02ce\u02cf\u0007"+ + "\u0014\u0000\u0000\u02cf\u02d0\u0001\u0000\u0000\u0000\u02d0\u02d1\u0006"+ + "\f\u0004\u0000\u02d1+\u0001\u0000\u0000\u0000\u02d2\u02d3\u0007\u0011"+ + "\u0000\u0000\u02d3\u02d4\u0007\u0004\u0000\u0000\u02d4\u02d5\u0007\u000f"+ + "\u0000\u0000\u02d5\u02d6\u0007\b\u0000\u0000\u02d6\u02d7\u0007\u000e\u0000"+ + "\u0000\u02d7\u02d8\u0007\u0007\u0000\u0000\u02d8\u02d9\u0001\u0000\u0000"+ + "\u0000\u02d9\u02da\u0006\r\u0004\u0000\u02da-\u0001\u0000\u0000\u0000"+ + "\u02db\u02dc\u0007\u0011\u0000\u0000\u02dc\u02dd\u0007\t\u0000\u0000\u02dd"+ + "\u02de\u0007\f\u0000\u0000\u02de\u02df\u0007\u000b\u0000\u0000\u02df\u02e0"+ + "\u0001\u0000\u0000\u0000\u02e0\u02e1\u0006\u000e\u0004\u0000\u02e1/\u0001"+ + "\u0000\u0000\u0000\u02e2\u02e3\u0007\u0011\u0000\u0000\u02e3\u02e4\u0007"+ + "\u000b\u0000\u0000\u02e4\u02e5\u0007\u0004\u0000\u0000\u02e5\u02e6\u0007"+ + "\u000b\u0000\u0000\u02e6\u02e7\u0007\u0011\u0000\u0000\u02e7\u02e8\u0001"+ + "\u0000\u0000\u0000\u02e8\u02e9\u0006\u000f\u0004\u0000\u02e91\u0001\u0000"+ + "\u0000\u0000\u02ea\u02eb\u0007\u0014\u0000\u0000\u02eb\u02ec\u0007\u0003"+ + "\u0000\u0000\u02ec\u02ed\u0007\u0007\u0000\u0000\u02ed\u02ee\u0007\f\u0000"+ + "\u0000\u02ee\u02ef\u0007\u0007\u0000\u0000\u02ef\u02f0\u0001\u0000\u0000"+ + "\u0000\u02f0\u02f1\u0006\u0010\u0004\u0000\u02f13\u0001\u0000\u0000\u0000"+ + "\u02f2\u02f3\u0007\u0015\u0000\u0000\u02f3\u02f4\u0007\f\u0000\u0000\u02f4"+ + "\u02f5\u0007\t\u0000\u0000\u02f5\u02f6\u0007\u000f\u0000\u0000\u02f6\u02f7"+ + "\u0001\u0000\u0000\u0000\u02f7\u02f8\u0006\u0011\u0005\u0000\u02f85\u0001"+ + "\u0000\u0000\u0000\u02f9\u02fa\u0007\u000b\u0000\u0000\u02fa\u02fb\u0007"+ + "\u0011\u0000\u0000\u02fb\u02fc\u0001\u0000\u0000\u0000\u02fc\u02fd\u0006"+ + "\u0012\u0005\u0000\u02fd7\u0001\u0000\u0000\u0000\u02fe\u02ff\u0007\u0015"+ + "\u0000\u0000\u02ff\u0300\u0007\t\u0000\u0000\u0300\u0301\u0007\f\u0000"+ + "\u0000\u0301\u0302\u0007\u0013\u0000\u0000\u0302\u0303\u0001\u0000\u0000"+ + "\u0000\u0303\u0304\u0006\u0013\u0006\u0000\u03049\u0001\u0000\u0000\u0000"+ + "\u0305\u0306\u0004\u0014\u0001\u0000\u0306\u0307\u0007\u0015\u0000\u0000"+ + "\u0307\u0308\u0007\u0016\u0000\u0000\u0308\u0309\u0007\u0011\u0000\u0000"+ + "\u0309\u030a\u0007\u0007\u0000\u0000\u030a\u030b\u0001\u0000\u0000\u0000"+ + "\u030b\u030c\u0006\u0014\u0007\u0000\u030c;\u0001\u0000\u0000\u0000\u030d"+ + "\u030e\u0004\u0015\u0002\u0000\u030e\u030f\u0007\n\u0000\u0000\u030f\u0310"+ + "\u0007\u0005\u0000\u0000\u0310\u0311\u0007\u000e\u0000\u0000\u0311\u0312"+ + "\u0007\n\u0000\u0000\u0312\u0313\u0007\u0005\u0000\u0000\u0313\u0314\u0007"+ + "\u0007\u0000\u0000\u0314\u0315\u0001\u0000\u0000\u0000\u0315\u0316\u0006"+ + "\u0015\b\u0000\u0316=\u0001\u0000\u0000\u0000\u0317\u0318\u0004\u0016"+ + "\u0003\u0000\u0318\u0319\u0007\n\u0000\u0000\u0319\u031a\u0007\u0005\u0000"+ + "\u0000\u031a\u031b\u0007\u000e\u0000\u0000\u031b\u031c\u0007\n\u0000\u0000"+ + "\u031c\u031d\u0007\u0005\u0000\u0000\u031d\u031e\u0007\u0007\u0000\u0000"+ + "\u031e\u031f\u0007\u0011\u0000\u0000\u031f\u0320\u0007\u000b\u0000\u0000"+ + "\u0320\u0321\u0007\u0004\u0000\u0000\u0321\u0322\u0007\u000b\u0000\u0000"+ + "\u0322\u0323\u0007\u0011\u0000\u0000\u0323\u0324\u0001\u0000\u0000\u0000"+ + "\u0324\u0325\u0006\u0016\u0004\u0000\u0325?\u0001\u0000\u0000\u0000\u0326"+ + "\u0327\u0007\u000e\u0000\u0000\u0327\u0328\u0007\t\u0000\u0000\u0328\u0329"+ + "\u0007\t\u0000\u0000\u0329\u032a\u0007\u0013\u0000\u0000\u032a\u032b\u0007"+ + "\u0016\u0000\u0000\u032b\u032c\u0007\b\u0000\u0000\u032c\u032d\u0001\u0000"+ + "\u0000\u0000\u032d\u032e\u0006\u0017\t\u0000\u032eA\u0001\u0000\u0000"+ + "\u0000\u032f\u0330\u0004\u0018\u0004\u0000\u0330\u0331\u0007\u0015\u0000"+ + "\u0000\u0331\u0332\u0007\u0016\u0000\u0000\u0332\u0333\u0007\u000e\u0000"+ + "\u0000\u0333\u0334\u0007\u000e\u0000\u0000\u0334\u0335\u0001\u0000\u0000"+ + "\u0000\u0335\u0336\u0006\u0018\t\u0000\u0336C\u0001\u0000\u0000\u0000"+ + "\u0337\u0338\u0004\u0019\u0005\u0000\u0338\u0339\u0007\u000e\u0000\u0000"+ + "\u0339\u033a\u0007\u0007\u0000\u0000\u033a\u033b\u0007\u0015\u0000\u0000"+ + "\u033b\u033c\u0007\u000b\u0000\u0000\u033c\u033d\u0001\u0000\u0000\u0000"+ + "\u033d\u033e\u0006\u0019\t\u0000\u033eE\u0001\u0000\u0000\u0000\u033f"+ + "\u0340\u0004\u001a\u0006\u0000\u0340\u0341\u0007\f\u0000\u0000\u0341\u0342"+ + "\u0007\n\u0000\u0000\u0342\u0343\u0007\u0006\u0000\u0000\u0343\u0344\u0007"+ + "\u0003\u0000\u0000\u0344\u0345\u0007\u000b\u0000\u0000\u0345\u0346\u0001"+ + "\u0000\u0000\u0000\u0346\u0347\u0006\u001a\t\u0000\u0347G\u0001\u0000"+ + "\u0000\u0000\u0348\u0349\u0004\u001b\u0007\u0000\u0349\u034a\u0007\u000e"+ + "\u0000\u0000\u034a\u034b\u0007\t\u0000\u0000\u034b\u034c\u0007\t\u0000"+ + "\u0000\u034c\u034d\u0007\u0013\u0000\u0000\u034d\u034e\u0007\u0016\u0000"+ + "\u0000\u034e\u034f\u0007\b\u0000\u0000\u034f\u0350\u0005_\u0000\u0000"+ + "\u0350\u0351\u0005\u8001\uf414\u0000\u0000\u0351\u0352\u0001\u0000\u0000"+ + "\u0000\u0352\u0353\u0006\u001b\n\u0000\u0353I\u0001\u0000\u0000\u0000"+ + "\u0354\u0355\u0007\u000f\u0000\u0000\u0355\u0356\u0007\u0012\u0000\u0000"+ + "\u0356\u0357\u0005_\u0000\u0000\u0357\u0358\u0007\u0007\u0000\u0000\u0358"+ + "\u0359\u0007\r\u0000\u0000\u0359\u035a\u0007\b\u0000\u0000\u035a\u035b"+ + "\u0007\u0004\u0000\u0000\u035b\u035c\u0007\u0005\u0000\u0000\u035c\u035d"+ + "\u0007\u0010\u0000\u0000\u035d\u035e\u0001\u0000\u0000\u0000\u035e\u035f"+ + "\u0006\u001c\u000b\u0000\u035fK\u0001\u0000\u0000\u0000\u0360\u0361\u0007"+ + "\u0010\u0000\u0000\u0361\u0362\u0007\f\u0000\u0000\u0362\u0363\u0007\t"+ + "\u0000\u0000\u0363\u0364\u0007\b\u0000\u0000\u0364\u0365\u0001\u0000\u0000"+ + "\u0000\u0365\u0366\u0006\u001d\f\u0000\u0366M\u0001\u0000\u0000\u0000"+ + "\u0367\u0368\u0007\u0013\u0000\u0000\u0368\u0369\u0007\u0007\u0000\u0000"+ + "\u0369\u036a\u0007\u0007\u0000\u0000\u036a\u036b\u0007\b\u0000\u0000\u036b"+ + "\u036c\u0001\u0000\u0000\u0000\u036c\u036d\u0006\u001e\f\u0000\u036dO"+ + "\u0001\u0000\u0000\u0000\u036e\u036f\u0004\u001f\b\u0000\u036f\u0370\u0007"+ + "\n\u0000\u0000\u0370\u0371\u0007\u0005\u0000\u0000\u0371\u0372\u0007\u0011"+ + "\u0000\u0000\u0372\u0373\u0007\n\u0000\u0000\u0373\u0374\u0007\u0011\u0000"+ + "\u0000\u0374\u0375\u0007\u000b\u0000\u0000\u0375\u0376\u0005_\u0000\u0000"+ + "\u0376\u0377\u0005\u8001\uf414\u0000\u0000\u0377\u0378\u0001\u0000\u0000"+ + "\u0000\u0378\u0379\u0006\u001f\f\u0000\u0379Q\u0001\u0000\u0000\u0000"+ + "\u037a\u037b\u0007\f\u0000\u0000\u037b\u037c\u0007\u0007\u0000\u0000\u037c"+ + "\u037d\u0007\u0005\u0000\u0000\u037d\u037e\u0007\u0004\u0000\u0000\u037e"+ + "\u037f\u0007\u000f\u0000\u0000\u037f\u0380\u0007\u0007\u0000\u0000\u0380"+ + "\u0381\u0001\u0000\u0000\u0000\u0381\u0382\u0006 \r\u0000\u0382S\u0001"+ + "\u0000\u0000\u0000\u0383\u0384\u0007\u0011\u0000\u0000\u0384\u0385\u0007"+ + "\u0007\u0000\u0000\u0385\u0386\u0007\u000b\u0000\u0000\u0386\u0387\u0001"+ + "\u0000\u0000\u0000\u0387\u0388\u0006!\u000e\u0000\u0388U\u0001\u0000\u0000"+ + "\u0000\u0389\u038a\u0007\u0011\u0000\u0000\u038a\u038b\u0007\u0003\u0000"+ + "\u0000\u038b\u038c\u0007\t\u0000\u0000\u038c\u038d\u0007\u0014\u0000\u0000"+ + "\u038d\u038e\u0001\u0000\u0000\u0000\u038e\u038f\u0006\"\u000f\u0000\u038f"+ + "W\u0001\u0000\u0000\u0000\u0390\u0392\b\u0017\u0000\u0000\u0391\u0390"+ + "\u0001\u0000\u0000\u0000\u0392\u0393\u0001\u0000\u0000\u0000\u0393\u0391"+ + "\u0001\u0000\u0000\u0000\u0393\u0394\u0001\u0000\u0000\u0000\u0394\u0395"+ + "\u0001\u0000\u0000\u0000\u0395\u0396\u0006#\u0004\u0000\u0396Y\u0001\u0000"+ + "\u0000\u0000\u0397\u0398\u0003\u00b6R\u0000\u0398\u0399\u0001\u0000\u0000"+ + "\u0000\u0399\u039a\u0006$\u0010\u0000\u039a\u039b\u0006$\u0011\u0000\u039b"+ + "[\u0001\u0000\u0000\u0000\u039c\u039d\u0003\u012e\u008e\u0000\u039d\u039e"+ + "\u0001\u0000\u0000\u0000\u039e\u039f\u0006%\u0012\u0000\u039f\u03a0\u0006"+ + "%\u0011\u0000\u03a0\u03a1\u0006%\u0011\u0000\u03a1]\u0001\u0000\u0000"+ + "\u0000\u03a2\u03a3\u0003\u00f8s\u0000\u03a3\u03a4\u0001\u0000\u0000\u0000"+ + "\u03a4\u03a5\u0006&\u0013\u0000\u03a5_\u0001\u0000\u0000\u0000\u03a6\u03a7"+ + "\u0003\u020c\u00fd\u0000\u03a7\u03a8\u0001\u0000\u0000\u0000\u03a8\u03a9"+ + "\u0006\'\u0014\u0000\u03a9a\u0001\u0000\u0000\u0000\u03aa\u03ab\u0003"+ + "\u00e4i\u0000\u03ab\u03ac\u0001\u0000\u0000\u0000\u03ac\u03ad\u0006(\u0015"+ + "\u0000\u03adc\u0001\u0000\u0000\u0000\u03ae\u03af\u0003\u00e0g\u0000\u03af"+ + "\u03b0\u0001\u0000\u0000\u0000\u03b0\u03b1\u0006)\u0016\u0000\u03b1e\u0001"+ + "\u0000\u0000\u0000\u03b2\u03b3\u0003\u0128\u008b\u0000\u03b3\u03b4\u0001"+ + "\u0000\u0000\u0000\u03b4\u03b5\u0006*\u0017\u0000\u03b5g\u0001\u0000\u0000"+ + "\u0000\u03b6\u03b7\u0003\u012a\u008c\u0000\u03b7\u03b8\u0001\u0000\u0000"+ + "\u0000\u03b8\u03b9\u0006+\u0018\u0000\u03b9i\u0001\u0000\u0000\u0000\u03ba"+ + "\u03bb\u0003\u0134\u0091\u0000\u03bb\u03bc\u0001\u0000\u0000\u0000\u03bc"+ + "\u03bd\u0006,\u0019\u0000\u03bdk\u0001\u0000\u0000\u0000\u03be\u03bf\u0003"+ + "\u0130\u008f\u0000\u03bf\u03c0\u0001\u0000\u0000\u0000\u03c0\u03c1\u0006"+ + "-\u001a\u0000\u03c1m\u0001\u0000\u0000\u0000\u03c2\u03c3\u0003\u0012\u0000"+ + "\u0000\u03c3\u03c4\u0001\u0000\u0000\u0000\u03c4\u03c5\u0006.\u0000\u0000"+ + "\u03c5o\u0001\u0000\u0000\u0000\u03c6\u03c7\u0003\u0014\u0001\u0000\u03c7"+ + "\u03c8\u0001\u0000\u0000\u0000\u03c8\u03c9\u0006/\u0000\u0000\u03c9q\u0001"+ + "\u0000\u0000\u0000\u03ca\u03cb\u0003\u0016\u0002\u0000\u03cb\u03cc\u0001"+ + "\u0000\u0000\u0000\u03cc\u03cd\u00060\u0000\u0000\u03cds\u0001\u0000\u0000"+ + "\u0000\u03ce\u03cf\u0003\u00b6R\u0000\u03cf\u03d0\u0001\u0000\u0000\u0000"+ + "\u03d0\u03d1\u00061\u0010\u0000\u03d1\u03d2\u00061\u0011\u0000\u03d2u"+ + "\u0001\u0000\u0000\u0000\u03d3\u03d4\u0003\u012e\u008e\u0000\u03d4\u03d5"+ + "\u0001\u0000\u0000\u0000\u03d5\u03d6\u00062\u0012\u0000\u03d6\u03d7\u0006"+ + "2\u0011\u0000\u03d7\u03d8\u00062\u0011\u0000\u03d8w\u0001\u0000\u0000"+ + "\u0000\u03d9\u03da\u0003\u00f8s\u0000\u03da\u03db\u0001\u0000\u0000\u0000"+ + "\u03db\u03dc\u00063\u0013\u0000\u03dc\u03dd\u00063\u001b\u0000\u03ddy"+ + "\u0001\u0000\u0000\u0000\u03de\u03df\u0003\u0102x\u0000\u03df\u03e0\u0001"+ + "\u0000\u0000\u0000\u03e0\u03e1\u00064\u001c\u0000\u03e1\u03e2\u00064\u001b"+ + "\u0000\u03e2{\u0001\u0000\u0000\u0000\u03e3\u03e4\b\u0018\u0000\u0000"+ + "\u03e4}\u0001\u0000\u0000\u0000\u03e5\u03e7\u0003|5\u0000\u03e6\u03e5"+ + "\u0001\u0000\u0000\u0000\u03e7\u03e8\u0001\u0000\u0000\u0000\u03e8\u03e6"+ + "\u0001\u0000\u0000\u0000\u03e8\u03e9\u0001\u0000\u0000\u0000\u03e9\u03ea"+ + "\u0001\u0000\u0000\u0000\u03ea\u03eb\u0003\u00dce\u0000\u03eb\u03ed\u0001"+ + "\u0000\u0000\u0000\u03ec\u03e6\u0001\u0000\u0000\u0000\u03ec\u03ed\u0001"+ + "\u0000\u0000\u0000\u03ed\u03ef\u0001\u0000\u0000\u0000\u03ee\u03f0\u0003"+ + "|5\u0000\u03ef\u03ee\u0001\u0000\u0000\u0000\u03f0\u03f1\u0001\u0000\u0000"+ + "\u0000\u03f1\u03ef\u0001\u0000\u0000\u0000\u03f1\u03f2\u0001\u0000\u0000"+ + "\u0000\u03f2\u007f\u0001\u0000\u0000\u0000\u03f3\u03f4\u0003~6\u0000\u03f4"+ + "\u03f5\u0001\u0000\u0000\u0000\u03f5\u03f6\u00067\u001d\u0000\u03f6\u0081"+ + "\u0001\u0000\u0000\u0000\u03f7\u03f8\u0003\u00cc]\u0000\u03f8\u03f9\u0001"+ + "\u0000\u0000\u0000\u03f9\u03fa\u00068\u001e\u0000\u03fa\u0083\u0001\u0000"+ + "\u0000\u0000\u03fb\u03fc\u0003\u0012\u0000\u0000\u03fc\u03fd\u0001\u0000"+ + "\u0000\u0000\u03fd\u03fe\u00069\u0000\u0000\u03fe\u0085\u0001\u0000\u0000"+ + "\u0000\u03ff\u0400\u0003\u0014\u0001\u0000\u0400\u0401\u0001\u0000\u0000"+ + "\u0000\u0401\u0402\u0006:\u0000\u0000\u0402\u0087\u0001\u0000\u0000\u0000"+ + "\u0403\u0404\u0003\u0016\u0002\u0000\u0404\u0405\u0001\u0000\u0000\u0000"+ + "\u0405\u0406\u0006;\u0000\u0000\u0406\u0089\u0001\u0000\u0000\u0000\u0407"+ + "\u0408\u0003\u00b6R\u0000\u0408\u0409\u0001\u0000\u0000\u0000\u0409\u040a"+ + "\u0006<\u0010\u0000\u040a\u040b\u0006<\u0011\u0000\u040b\u040c\u0006<"+ + "\u0011\u0000\u040c\u008b\u0001\u0000\u0000\u0000\u040d\u040e\u0003\u012e"+ + "\u008e\u0000\u040e\u040f\u0001\u0000\u0000\u0000\u040f\u0410\u0006=\u0012"+ + "\u0000\u0410\u0411\u0006=\u0011\u0000\u0411\u0412\u0006=\u0011\u0000\u0412"+ + "\u0413\u0006=\u0011\u0000\u0413\u008d\u0001\u0000\u0000\u0000\u0414\u0415"+ + "\u0003\u0128\u008b\u0000\u0415\u0416\u0001\u0000\u0000\u0000\u0416\u0417"+ + "\u0006>\u0017\u0000\u0417\u008f\u0001\u0000\u0000\u0000\u0418\u0419\u0003"+ + "\u012a\u008c\u0000\u0419\u041a\u0001\u0000\u0000\u0000\u041a\u041b\u0006"+ + "?\u0018\u0000\u041b\u0091\u0001\u0000\u0000\u0000\u041c\u041d\u0003\u00d6"+ + "b\u0000\u041d\u041e\u0001\u0000\u0000\u0000\u041e\u041f\u0006@\u001f\u0000"+ + "\u041f\u0093\u0001\u0000\u0000\u0000\u0420\u0421\u0003\u00e0g\u0000\u0421"+ + "\u0422\u0001\u0000\u0000\u0000\u0422\u0423\u0006A\u0016\u0000\u0423\u0095"+ + "\u0001\u0000\u0000\u0000\u0424\u0425\u0003\u00e4i\u0000\u0425\u0426\u0001"+ + "\u0000\u0000\u0000\u0426\u0427\u0006B\u0015\u0000\u0427\u0097\u0001\u0000"+ + "\u0000\u0000\u0428\u0429\u0003\u0102x\u0000\u0429\u042a\u0001\u0000\u0000"+ + "\u0000\u042a\u042b\u0006C\u001c\u0000\u042b\u0099\u0001\u0000\u0000\u0000"+ + "\u042c\u042d\u0003\u01ee\u00ee\u0000\u042d\u042e\u0001\u0000\u0000\u0000"+ + "\u042e\u042f\u0006D \u0000\u042f\u009b\u0001\u0000\u0000\u0000\u0430\u0431"+ + "\u0003\u0134\u0091\u0000\u0431\u0432\u0001\u0000\u0000\u0000\u0432\u0433"+ + "\u0006E\u0019\u0000\u0433\u009d\u0001\u0000\u0000\u0000\u0434\u0435\u0003"+ + "\u00fcu\u0000\u0435\u0436\u0001\u0000\u0000\u0000\u0436\u0437\u0006F!"+ + "\u0000\u0437\u009f\u0001\u0000\u0000\u0000\u0438\u0439\u0003\u0124\u0089"+ + "\u0000\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043b\u0006G\"\u0000"+ + "\u043b\u00a1\u0001\u0000\u0000\u0000\u043c\u043d\u0003\u0120\u0087\u0000"+ + "\u043d\u043e\u0001\u0000\u0000\u0000\u043e\u043f\u0006H#\u0000\u043f\u00a3"+ + "\u0001\u0000\u0000\u0000\u0440\u0441\u0003\u0126\u008a\u0000\u0441\u0442"+ + "\u0001\u0000\u0000\u0000\u0442\u0443\u0006I$\u0000\u0443\u00a5\u0001\u0000"+ + "\u0000\u0000\u0444\u0445\u0003\u0012\u0000\u0000\u0445\u0446\u0001\u0000"+ + "\u0000\u0000\u0446\u0447\u0006J\u0000\u0000\u0447\u00a7\u0001\u0000\u0000"+ + "\u0000\u0448\u0449\u0003\u0014\u0001\u0000\u0449\u044a\u0001\u0000\u0000"+ + "\u0000\u044a\u044b\u0006K\u0000\u0000\u044b\u00a9\u0001\u0000\u0000\u0000"+ + "\u044c\u044d\u0003\u0016\u0002\u0000\u044d\u044e\u0001\u0000\u0000\u0000"+ + "\u044e\u044f\u0006L\u0000\u0000\u044f\u00ab\u0001\u0000\u0000\u0000\u0450"+ + "\u0451\u0003\u012c\u008d\u0000\u0451\u0452\u0001\u0000\u0000\u0000\u0452"+ + "\u0453\u0006M%\u0000\u0453\u0454\u0006M&\u0000\u0454\u00ad\u0001\u0000"+ + "\u0000\u0000\u0455\u0456\u0003\u00b6R\u0000\u0456\u0457\u0001\u0000\u0000"+ + "\u0000\u0457\u0458\u0006N\u0010\u0000\u0458\u0459\u0006N\u0011\u0000\u0459"+ + "\u00af\u0001\u0000\u0000\u0000\u045a\u045b\u0003\u0016\u0002\u0000\u045b"+ + "\u045c\u0001\u0000\u0000\u0000\u045c\u045d\u0006O\u0000\u0000\u045d\u00b1"+ + "\u0001\u0000\u0000\u0000\u045e\u045f\u0003\u0012\u0000\u0000\u045f\u0460"+ + "\u0001\u0000\u0000\u0000\u0460\u0461\u0006P\u0000\u0000\u0461\u00b3\u0001"+ + "\u0000\u0000\u0000\u0462\u0463\u0003\u0014\u0001\u0000\u0463\u0464\u0001"+ + "\u0000\u0000\u0000\u0464\u0465\u0006Q\u0000\u0000\u0465\u00b5\u0001\u0000"+ + "\u0000\u0000\u0466\u0467\u0005|\u0000\u0000\u0467\u0468\u0001\u0000\u0000"+ + "\u0000\u0468\u0469\u0006R\u0011\u0000\u0469\u00b7\u0001\u0000\u0000\u0000"+ + "\u046a\u046b\u0007\u0019\u0000\u0000\u046b\u00b9\u0001\u0000\u0000\u0000"+ + "\u046c\u046d\u0007\u001a\u0000\u0000\u046d\u00bb\u0001\u0000\u0000\u0000"+ + "\u046e\u046f\u0005\\\u0000\u0000\u046f\u0470\u0007\u001b\u0000\u0000\u0470"+ + "\u00bd\u0001\u0000\u0000\u0000\u0471\u0472\b\u001c\u0000\u0000\u0472\u00bf"+ + "\u0001\u0000\u0000\u0000\u0473\u0475\u0007\u0007\u0000\u0000\u0474\u0476"+ + "\u0007\u001d\u0000\u0000\u0475\u0474\u0001\u0000\u0000\u0000\u0475\u0476"+ + "\u0001\u0000\u0000\u0000\u0476\u0478\u0001\u0000\u0000\u0000\u0477\u0479"+ + "\u0003\u00b8S\u0000\u0478\u0477\u0001\u0000\u0000\u0000\u0479\u047a\u0001"+ + "\u0000\u0000\u0000\u047a\u0478\u0001\u0000\u0000\u0000\u047a\u047b\u0001"+ + "\u0000\u0000\u0000\u047b\u00c1\u0001\u0000\u0000\u0000\u047c\u047d\u0005"+ + "@\u0000\u0000\u047d\u00c3\u0001\u0000\u0000\u0000\u047e\u047f\u0005`\u0000"+ + "\u0000\u047f\u00c5\u0001\u0000\u0000\u0000\u0480\u0484\b\u001e\u0000\u0000"+ + "\u0481\u0482\u0005`\u0000\u0000\u0482\u0484\u0005`\u0000\u0000\u0483\u0480"+ + "\u0001\u0000\u0000\u0000\u0483\u0481\u0001\u0000\u0000\u0000\u0484\u00c7"+ + "\u0001\u0000\u0000\u0000\u0485\u0486\u0005_\u0000\u0000\u0486\u00c9\u0001"+ + "\u0000\u0000\u0000\u0487\u048b\u0003\u00baT\u0000\u0488\u048b\u0003\u00b8"+ + "S\u0000\u0489\u048b\u0003\u00c8[\u0000\u048a\u0487\u0001\u0000\u0000\u0000"+ + "\u048a\u0488\u0001\u0000\u0000\u0000\u048a\u0489\u0001\u0000\u0000\u0000"+ + "\u048b\u00cb\u0001\u0000\u0000\u0000\u048c\u0491\u0005\"\u0000\u0000\u048d"+ + "\u0490\u0003\u00bcU\u0000\u048e\u0490\u0003\u00beV\u0000\u048f\u048d\u0001"+ + "\u0000\u0000\u0000\u048f\u048e\u0001\u0000\u0000\u0000\u0490\u0493\u0001"+ + "\u0000\u0000\u0000\u0491\u048f\u0001\u0000\u0000\u0000\u0491\u0492\u0001"+ + "\u0000\u0000\u0000\u0492\u0494\u0001\u0000\u0000\u0000\u0493\u0491\u0001"+ + "\u0000\u0000\u0000\u0494\u04aa\u0005\"\u0000\u0000\u0495\u0496\u0005\""+ + "\u0000\u0000\u0496\u0497\u0005\"\u0000\u0000\u0497\u0498\u0005\"\u0000"+ + "\u0000\u0498\u049c\u0001\u0000\u0000\u0000\u0499\u049b\b\u0000\u0000\u0000"+ + "\u049a\u0499\u0001\u0000\u0000\u0000\u049b\u049e\u0001\u0000\u0000\u0000"+ + "\u049c\u049d\u0001\u0000\u0000\u0000\u049c\u049a\u0001\u0000\u0000\u0000"+ + "\u049d\u049f\u0001\u0000\u0000\u0000\u049e\u049c\u0001\u0000\u0000\u0000"+ + "\u049f\u04a0\u0005\"\u0000\u0000\u04a0\u04a1\u0005\"\u0000\u0000\u04a1"+ + "\u04a2\u0005\"\u0000\u0000\u04a2\u04a4\u0001\u0000\u0000\u0000\u04a3\u04a5"+ + "\u0005\"\u0000\u0000\u04a4\u04a3\u0001\u0000\u0000\u0000\u04a4\u04a5\u0001"+ + "\u0000\u0000\u0000\u04a5\u04a7\u0001\u0000\u0000\u0000\u04a6\u04a8\u0005"+ + "\"\u0000\u0000\u04a7\u04a6\u0001\u0000\u0000\u0000\u04a7\u04a8\u0001\u0000"+ + "\u0000\u0000\u04a8\u04aa\u0001\u0000\u0000\u0000\u04a9\u048c\u0001\u0000"+ + "\u0000\u0000\u04a9\u0495\u0001\u0000\u0000\u0000\u04aa\u00cd\u0001\u0000"+ + "\u0000\u0000\u04ab\u04ad\u0003\u00b8S\u0000\u04ac\u04ab\u0001\u0000\u0000"+ + "\u0000\u04ad\u04ae\u0001\u0000\u0000\u0000\u04ae\u04ac\u0001\u0000\u0000"+ + "\u0000\u04ae\u04af\u0001\u0000\u0000\u0000\u04af\u00cf\u0001\u0000\u0000"+ + "\u0000\u04b0\u04b2\u0003\u00b8S\u0000\u04b1\u04b0\u0001\u0000\u0000\u0000"+ + "\u04b2\u04b3\u0001\u0000\u0000\u0000\u04b3\u04b1\u0001\u0000\u0000\u0000"+ + "\u04b3\u04b4\u0001\u0000\u0000\u0000\u04b4\u04b5\u0001\u0000\u0000\u0000"+ + "\u04b5\u04b9\u0003\u00e4i\u0000\u04b6\u04b8\u0003\u00b8S\u0000\u04b7\u04b6"+ + "\u0001\u0000\u0000\u0000\u04b8\u04bb\u0001\u0000\u0000\u0000\u04b9\u04b7"+ + "\u0001\u0000\u0000\u0000\u04b9\u04ba\u0001\u0000\u0000\u0000\u04ba\u04db"+ + "\u0001\u0000\u0000\u0000\u04bb\u04b9\u0001\u0000\u0000\u0000\u04bc\u04be"+ + "\u0003\u00e4i\u0000\u04bd\u04bf\u0003\u00b8S\u0000\u04be\u04bd\u0001\u0000"+ + "\u0000\u0000\u04bf\u04c0\u0001\u0000\u0000\u0000\u04c0\u04be\u0001\u0000"+ + "\u0000\u0000\u04c0\u04c1\u0001\u0000\u0000\u0000\u04c1\u04db\u0001\u0000"+ + "\u0000\u0000\u04c2\u04c4\u0003\u00b8S\u0000\u04c3\u04c2\u0001\u0000\u0000"+ + "\u0000\u04c4\u04c5\u0001\u0000\u0000\u0000\u04c5\u04c3\u0001\u0000\u0000"+ + "\u0000\u04c5\u04c6\u0001\u0000\u0000\u0000\u04c6\u04ce\u0001\u0000\u0000"+ + "\u0000\u04c7\u04cb\u0003\u00e4i\u0000\u04c8\u04ca\u0003\u00b8S\u0000\u04c9"+ + "\u04c8\u0001\u0000\u0000\u0000\u04ca\u04cd\u0001\u0000\u0000\u0000\u04cb"+ + "\u04c9\u0001\u0000\u0000\u0000\u04cb\u04cc\u0001\u0000\u0000\u0000\u04cc"+ + "\u04cf\u0001\u0000\u0000\u0000\u04cd\u04cb\u0001\u0000\u0000\u0000\u04ce"+ + "\u04c7\u0001\u0000\u0000\u0000\u04ce\u04cf\u0001\u0000\u0000\u0000\u04cf"+ + "\u04d0\u0001\u0000\u0000\u0000\u04d0\u04d1\u0003\u00c0W\u0000\u04d1\u04db"+ + "\u0001\u0000\u0000\u0000\u04d2\u04d4\u0003\u00e4i\u0000\u04d3\u04d5\u0003"+ + "\u00b8S\u0000\u04d4\u04d3\u0001\u0000\u0000\u0000\u04d5\u04d6\u0001\u0000"+ + "\u0000\u0000\u04d6\u04d4\u0001\u0000\u0000\u0000\u04d6\u04d7\u0001\u0000"+ + "\u0000\u0000\u04d7\u04d8\u0001\u0000\u0000\u0000\u04d8\u04d9\u0003\u00c0"+ + "W\u0000\u04d9\u04db\u0001\u0000\u0000\u0000\u04da\u04b1\u0001\u0000\u0000"+ + "\u0000\u04da\u04bc\u0001\u0000\u0000\u0000\u04da\u04c3\u0001\u0000\u0000"+ + "\u0000\u04da\u04d2\u0001\u0000\u0000\u0000\u04db\u00d1\u0001\u0000\u0000"+ + "\u0000\u04dc\u04dd\u0007\u0004\u0000\u0000\u04dd\u04de\u0007\u0005\u0000"+ + "\u0000\u04de\u04df\u0007\u0010\u0000\u0000\u04df\u00d3\u0001\u0000\u0000"+ + "\u0000\u04e0\u04e1\u0007\u0004\u0000\u0000\u04e1\u04e2\u0007\u0011\u0000"+ + "\u0000\u04e2\u04e3\u0007\u0002\u0000\u0000\u04e3\u00d5\u0001\u0000\u0000"+ + "\u0000\u04e4\u04e5\u0005=\u0000\u0000\u04e5\u00d7\u0001\u0000\u0000\u0000"+ + "\u04e6\u04e7\u0007\u001f\u0000\u0000\u04e7\u04e8\u0007 \u0000\u0000\u04e8"+ + "\u00d9\u0001\u0000\u0000\u0000\u04e9\u04ea\u0005:\u0000\u0000\u04ea\u04eb"+ + "\u0005:\u0000\u0000\u04eb\u00db\u0001\u0000\u0000\u0000\u04ec\u04ed\u0005"+ + ":\u0000\u0000\u04ed\u00dd\u0001\u0000\u0000\u0000\u04ee\u04ef\u0005;\u0000"+ + "\u0000\u04ef\u00df\u0001\u0000\u0000\u0000\u04f0\u04f1\u0005,\u0000\u0000"+ + "\u04f1\u00e1\u0001\u0000\u0000\u0000\u04f2\u04f3\u0007\u0010\u0000\u0000"+ + "\u04f3\u04f4\u0007\u0007\u0000\u0000\u04f4\u04f5\u0007\u0011\u0000\u0000"+ + "\u04f5\u04f6\u0007\u0002\u0000\u0000\u04f6\u00e3\u0001\u0000\u0000\u0000"+ + "\u04f7\u04f8\u0005.\u0000\u0000\u04f8\u00e5\u0001\u0000\u0000\u0000\u04f9"+ + "\u04fa\u0007\u0015\u0000\u0000\u04fa\u04fb\u0007\u0004\u0000\u0000\u04fb"+ + "\u04fc\u0007\u000e\u0000\u0000\u04fc\u04fd\u0007\u0011\u0000\u0000\u04fd"+ + "\u04fe\u0007\u0007\u0000\u0000\u04fe\u00e7\u0001\u0000\u0000\u0000\u04ff"+ + "\u0500\u0007\u0015\u0000\u0000\u0500\u0501\u0007\n\u0000\u0000\u0501\u0502"+ + "\u0007\f\u0000\u0000\u0502\u0503\u0007\u0011\u0000\u0000\u0503\u0504\u0007"+ + "\u000b\u0000\u0000\u0504\u00e9\u0001\u0000\u0000\u0000\u0505\u0506\u0007"+ + "\n\u0000\u0000\u0506\u0507\u0007\u0005\u0000\u0000\u0507\u00eb\u0001\u0000"+ + "\u0000\u0000\u0508\u0509\u0007\n\u0000\u0000\u0509\u050a\u0007\u0011\u0000"+ + "\u0000\u050a\u00ed\u0001\u0000\u0000\u0000\u050b\u050c\u0007\u000e\u0000"+ + "\u0000\u050c\u050d\u0007\u0004\u0000\u0000\u050d\u050e\u0007\u0011\u0000"+ + "\u0000\u050e\u050f\u0007\u000b\u0000\u0000\u050f\u00ef\u0001\u0000\u0000"+ + "\u0000\u0510\u0511\u0007\u000e\u0000\u0000\u0511\u0512\u0007\n\u0000\u0000"+ + "\u0512\u0513\u0007\u0013\u0000\u0000\u0513\u0514\u0007\u0007\u0000\u0000"+ + "\u0514\u00f1\u0001\u0000\u0000\u0000\u0515\u0516\u0007\u0005\u0000\u0000"+ + "\u0516\u0517\u0007\t\u0000\u0000\u0517\u0518\u0007\u000b\u0000\u0000\u0518"+ + "\u00f3\u0001\u0000\u0000\u0000\u0519\u051a\u0007\u0005\u0000\u0000\u051a"+ + "\u051b\u0007\u0016\u0000\u0000\u051b\u051c\u0007\u000e\u0000\u0000\u051c"+ + "\u051d\u0007\u000e\u0000\u0000\u051d\u00f5\u0001\u0000\u0000\u0000\u051e"+ + "\u051f\u0007\u0005\u0000\u0000\u051f\u0520\u0007\u0016\u0000\u0000\u0520"+ + "\u0521\u0007\u000e\u0000\u0000\u0521\u0522\u0007\u000e\u0000\u0000\u0522"+ + "\u0523\u0007\u0011\u0000\u0000\u0523\u00f7\u0001\u0000\u0000\u0000\u0524"+ + "\u0525\u0007\t\u0000\u0000\u0525\u0526\u0007\u0005\u0000\u0000\u0526\u00f9"+ + "\u0001\u0000\u0000\u0000\u0527\u0528\u0007\t\u0000\u0000\u0528\u0529\u0007"+ + "\f\u0000\u0000\u0529\u00fb\u0001\u0000\u0000\u0000\u052a\u052b\u0005?"+ + "\u0000\u0000\u052b\u00fd\u0001\u0000\u0000\u0000\u052c\u052d\u0007\f\u0000"+ + "\u0000\u052d\u052e\u0007\u000e\u0000\u0000\u052e\u052f\u0007\n\u0000\u0000"+ + "\u052f\u0530\u0007\u0013\u0000\u0000\u0530\u0531\u0007\u0007\u0000\u0000"+ + "\u0531\u00ff\u0001\u0000\u0000\u0000\u0532\u0533\u0007\u000b\u0000\u0000"+ + "\u0533\u0534\u0007\f\u0000\u0000\u0534\u0535\u0007\u0016\u0000\u0000\u0535"+ + "\u0536\u0007\u0007\u0000\u0000\u0536\u0101\u0001\u0000\u0000\u0000\u0537"+ + "\u0538\u0007\u0014\u0000\u0000\u0538\u0539\u0007\n\u0000\u0000\u0539\u053a"+ + "\u0007\u000b\u0000\u0000\u053a\u053b\u0007\u0003\u0000\u0000\u053b\u0103"+ + "\u0001\u0000\u0000\u0000\u053c\u053d\u0005=\u0000\u0000\u053d\u053e\u0005"+ + "=\u0000\u0000\u053e\u0105\u0001\u0000\u0000\u0000\u053f\u0540\u0005=\u0000"+ + "\u0000\u0540\u0541\u0005~\u0000\u0000\u0541\u0107\u0001\u0000\u0000\u0000"+ + "\u0542\u0543\u0005!\u0000\u0000\u0543\u0544\u0005=\u0000\u0000\u0544\u0109"+ + "\u0001\u0000\u0000\u0000\u0545\u0546\u0005<\u0000\u0000\u0546\u010b\u0001"+ + "\u0000\u0000\u0000\u0547\u0548\u0005<\u0000\u0000\u0548\u0549\u0005=\u0000"+ + "\u0000\u0549\u010d\u0001\u0000\u0000\u0000\u054a\u054b\u0005>\u0000\u0000"+ + "\u054b\u010f\u0001\u0000\u0000\u0000\u054c\u054d\u0005>\u0000\u0000\u054d"+ + "\u054e\u0005=\u0000\u0000\u054e\u0111\u0001\u0000\u0000\u0000\u054f\u0550"+ + "\u0005+\u0000\u0000\u0550\u0113\u0001\u0000\u0000\u0000\u0551\u0552\u0005"+ + "-\u0000\u0000\u0552\u0115\u0001\u0000\u0000\u0000\u0553\u0554\u0005*\u0000"+ + "\u0000\u0554\u0117\u0001\u0000\u0000\u0000\u0555\u0556\u0005/\u0000\u0000"+ + "\u0556\u0119\u0001\u0000\u0000\u0000\u0557\u0558\u0005%\u0000\u0000\u0558"+ + "\u011b\u0001\u0000\u0000\u0000\u0559\u055a\u0005{\u0000\u0000\u055a\u011d"+ + "\u0001\u0000\u0000\u0000\u055b\u055c\u0005}\u0000\u0000\u055c\u011f\u0001"+ + "\u0000\u0000\u0000\u055d\u055e\u0005?\u0000\u0000\u055e\u055f\u0005?\u0000"+ + "\u0000\u055f\u0121\u0001\u0000\u0000\u0000\u0560\u0561\u00032\u0010\u0000"+ + "\u0561\u0562\u0001\u0000\u0000\u0000\u0562\u0563\u0006\u0088\'\u0000\u0563"+ + "\u0123\u0001\u0000\u0000\u0000\u0564\u0567\u0003\u00fcu\u0000\u0565\u0568"+ + "\u0003\u00baT\u0000\u0566\u0568\u0003\u00c8[\u0000\u0567\u0565\u0001\u0000"+ + "\u0000\u0000\u0567\u0566\u0001\u0000\u0000\u0000\u0568\u056c\u0001\u0000"+ + "\u0000\u0000\u0569\u056b\u0003\u00ca\\\u0000\u056a\u0569\u0001\u0000\u0000"+ + "\u0000\u056b\u056e\u0001\u0000\u0000\u0000\u056c\u056a\u0001\u0000\u0000"+ + "\u0000\u056c\u056d\u0001\u0000\u0000\u0000\u056d\u0576\u0001\u0000\u0000"+ + "\u0000\u056e\u056c\u0001\u0000\u0000\u0000\u056f\u0571\u0003\u00fcu\u0000"+ + "\u0570\u0572\u0003\u00b8S\u0000\u0571\u0570\u0001\u0000\u0000\u0000\u0572"+ + "\u0573\u0001\u0000\u0000\u0000\u0573\u0571\u0001\u0000\u0000\u0000\u0573"+ + "\u0574\u0001\u0000\u0000\u0000\u0574\u0576\u0001\u0000\u0000\u0000\u0575"+ + "\u0564\u0001\u0000\u0000\u0000\u0575\u056f\u0001\u0000\u0000\u0000\u0576"+ + "\u0125\u0001\u0000\u0000\u0000\u0577\u057a\u0003\u0120\u0087\u0000\u0578"+ + "\u057b\u0003\u00baT\u0000\u0579\u057b\u0003\u00c8[\u0000\u057a\u0578\u0001"+ + "\u0000\u0000\u0000\u057a\u0579\u0001\u0000\u0000\u0000\u057b\u057f\u0001"+ + "\u0000\u0000\u0000\u057c\u057e\u0003\u00ca\\\u0000\u057d\u057c\u0001\u0000"+ + "\u0000\u0000\u057e\u0581\u0001\u0000\u0000\u0000\u057f\u057d\u0001\u0000"+ + "\u0000\u0000\u057f\u0580\u0001\u0000\u0000\u0000\u0580\u0589\u0001\u0000"+ + "\u0000\u0000\u0581\u057f\u0001\u0000\u0000\u0000\u0582\u0584\u0003\u0120"+ + "\u0087\u0000\u0583\u0585\u0003\u00b8S\u0000\u0584\u0583\u0001\u0000\u0000"+ + "\u0000\u0585\u0586\u0001\u0000\u0000\u0000\u0586\u0584\u0001\u0000\u0000"+ + "\u0000\u0586\u0587\u0001\u0000\u0000\u0000\u0587\u0589\u0001\u0000\u0000"+ + "\u0000\u0588\u0577\u0001\u0000\u0000\u0000\u0588\u0582\u0001\u0000\u0000"+ + "\u0000\u0589\u0127\u0001\u0000\u0000\u0000\u058a\u058b\u0005[\u0000\u0000"+ + "\u058b\u058c\u0001\u0000\u0000\u0000\u058c\u058d\u0006\u008b\u0004\u0000"+ + "\u058d\u058e\u0006\u008b\u0004\u0000\u058e\u0129\u0001\u0000\u0000\u0000"+ + "\u058f\u0590\u0005]\u0000\u0000\u0590\u0591\u0001\u0000\u0000\u0000\u0591"+ + "\u0592\u0006\u008c\u0011\u0000\u0592\u0593\u0006\u008c\u0011\u0000\u0593"+ + "\u012b\u0001\u0000\u0000\u0000\u0594\u0595\u0005(\u0000\u0000\u0595\u0596"+ + "\u0001\u0000\u0000\u0000\u0596\u0597\u0006\u008d\u0004\u0000\u0597\u0598"+ + "\u0006\u008d\u0004\u0000\u0598\u012d\u0001\u0000\u0000\u0000\u0599\u059a"+ + "\u0005)\u0000\u0000\u059a\u059b\u0001\u0000\u0000\u0000\u059b\u059c\u0006"+ + "\u008e\u0011\u0000\u059c\u059d\u0006\u008e\u0011\u0000\u059d\u012f\u0001"+ + "\u0000\u0000\u0000\u059e\u05a2\u0003\u00baT\u0000\u059f\u05a1\u0003\u00ca"+ + "\\\u0000\u05a0\u059f\u0001\u0000\u0000\u0000\u05a1\u05a4\u0001\u0000\u0000"+ + "\u0000\u05a2\u05a0\u0001\u0000\u0000\u0000\u05a2\u05a3\u0001\u0000\u0000"+ + "\u0000\u05a3\u05af\u0001\u0000\u0000\u0000\u05a4\u05a2\u0001\u0000\u0000"+ + "\u0000\u05a5\u05a8\u0003\u00c8[\u0000\u05a6\u05a8\u0003\u00c2X\u0000\u05a7"+ + "\u05a5\u0001\u0000\u0000\u0000\u05a7\u05a6\u0001\u0000\u0000\u0000\u05a8"+ + "\u05aa\u0001\u0000\u0000\u0000\u05a9\u05ab\u0003\u00ca\\\u0000\u05aa\u05a9"+ + "\u0001\u0000\u0000\u0000\u05ab\u05ac\u0001\u0000\u0000\u0000\u05ac\u05aa"+ + "\u0001\u0000\u0000\u0000\u05ac\u05ad\u0001\u0000\u0000\u0000\u05ad\u05af"+ + "\u0001\u0000\u0000\u0000\u05ae\u059e\u0001\u0000\u0000\u0000\u05ae\u05a7"+ + "\u0001\u0000\u0000\u0000\u05af\u0131\u0001\u0000\u0000\u0000\u05b0\u05b2"+ + "\u0003\u00c4Y\u0000\u05b1\u05b3\u0003\u00c6Z\u0000\u05b2\u05b1\u0001\u0000"+ + "\u0000\u0000\u05b3\u05b4\u0001\u0000\u0000\u0000\u05b4\u05b2\u0001\u0000"+ + "\u0000\u0000\u05b4\u05b5\u0001\u0000\u0000\u0000\u05b5\u05b6\u0001\u0000"+ + "\u0000\u0000\u05b6\u05b7\u0003\u00c4Y\u0000\u05b7\u0133\u0001\u0000\u0000"+ + "\u0000\u05b8\u05b9\u0003\u0132\u0090\u0000\u05b9\u0135\u0001\u0000\u0000"+ + "\u0000\u05ba\u05bb\u0003\u0012\u0000\u0000\u05bb\u05bc\u0001\u0000\u0000"+ + "\u0000\u05bc\u05bd\u0006\u0092\u0000\u0000\u05bd\u0137\u0001\u0000\u0000"+ + "\u0000\u05be\u05bf\u0003\u0014\u0001\u0000\u05bf\u05c0\u0001\u0000\u0000"+ + "\u0000\u05c0\u05c1\u0006\u0093\u0000\u0000\u05c1\u0139\u0001\u0000\u0000"+ + "\u0000\u05c2\u05c3\u0003\u0016\u0002\u0000\u05c3\u05c4\u0001\u0000\u0000"+ + "\u0000\u05c4\u05c5\u0006\u0094\u0000\u0000\u05c5\u013b\u0001\u0000\u0000"+ + "\u0000\u05c6\u05c7\u0003\u00b6R\u0000\u05c7\u05c8\u0001\u0000\u0000\u0000"+ + "\u05c8\u05c9\u0006\u0095\u0010\u0000\u05c9\u05ca\u0006\u0095\u0011\u0000"+ + "\u05ca\u013d\u0001\u0000\u0000\u0000\u05cb\u05cc\u0003\u00dce\u0000\u05cc"+ + "\u05cd\u0001\u0000\u0000\u0000\u05cd\u05ce\u0006\u0096(\u0000\u05ce\u013f"+ + "\u0001\u0000\u0000\u0000\u05cf\u05d0\u0003\u00dad\u0000\u05d0\u05d1\u0001"+ + "\u0000\u0000\u0000\u05d1\u05d2\u0006\u0097)\u0000\u05d2\u0141\u0001\u0000"+ + "\u0000\u0000\u05d3\u05d4\u0003\u00e0g\u0000\u05d4\u05d5\u0001\u0000\u0000"+ + "\u0000\u05d5\u05d6\u0006\u0098\u0016\u0000\u05d6\u0143\u0001\u0000\u0000"+ + "\u0000\u05d7\u05d8\u0003\u00d6b\u0000\u05d8\u05d9\u0001\u0000\u0000\u0000"+ + "\u05d9\u05da\u0006\u0099\u001f\u0000\u05da\u0145\u0001\u0000\u0000\u0000"+ + "\u05db\u05dc\u0007\u000f\u0000\u0000\u05dc\u05dd\u0007\u0007\u0000\u0000"+ + "\u05dd\u05de\u0007\u000b\u0000\u0000\u05de\u05df\u0007\u0004\u0000\u0000"+ + "\u05df\u05e0\u0007\u0010\u0000\u0000\u05e0\u05e1\u0007\u0004\u0000\u0000"+ + "\u05e1\u05e2\u0007\u000b\u0000\u0000\u05e2\u05e3\u0007\u0004\u0000\u0000"+ + "\u05e3\u0147\u0001\u0000\u0000\u0000\u05e4\u05e5\u0003\u012e\u008e\u0000"+ + "\u05e5\u05e6\u0001\u0000\u0000\u0000\u05e6\u05e7\u0006\u009b\u0012\u0000"+ + "\u05e7\u05e8\u0006\u009b\u0011\u0000\u05e8\u0149\u0001\u0000\u0000\u0000"+ + "\u05e9\u05ed\b!\u0000\u0000\u05ea\u05eb\u0005/\u0000\u0000\u05eb\u05ed"+ + "\b\"\u0000\u0000\u05ec\u05e9\u0001\u0000\u0000\u0000\u05ec\u05ea\u0001"+ + "\u0000\u0000\u0000\u05ed\u014b\u0001\u0000\u0000\u0000\u05ee\u05f0\u0003"+ + "\u014a\u009c\u0000\u05ef\u05ee\u0001\u0000\u0000\u0000\u05f0\u05f1\u0001"+ + "\u0000\u0000\u0000\u05f1\u05ef\u0001\u0000\u0000\u0000\u05f1\u05f2\u0001"+ + "\u0000\u0000\u0000\u05f2\u014d\u0001\u0000\u0000\u0000\u05f3\u05f4\u0003"+ + "\u014c\u009d\u0000\u05f4\u05f5\u0001\u0000\u0000\u0000\u05f5\u05f6\u0006"+ + "\u009e*\u0000\u05f6\u014f\u0001\u0000\u0000\u0000\u05f7\u05f8\u0003\u00cc"+ + "]\u0000\u05f8\u05f9\u0001\u0000\u0000\u0000\u05f9\u05fa\u0006\u009f\u001e"+ + "\u0000\u05fa\u0151\u0001\u0000\u0000\u0000\u05fb\u05fc\u0003\u0012\u0000"+ + "\u0000\u05fc\u05fd\u0001\u0000\u0000\u0000\u05fd\u05fe\u0006\u00a0\u0000"+ + "\u0000\u05fe\u0153\u0001\u0000\u0000\u0000\u05ff\u0600\u0003\u0014\u0001"+ + "\u0000\u0600\u0601\u0001\u0000\u0000\u0000\u0601\u0602\u0006\u00a1\u0000"+ + "\u0000\u0602\u0155\u0001\u0000\u0000\u0000\u0603\u0604\u0003\u0016\u0002"+ + "\u0000\u0604\u0605\u0001\u0000\u0000\u0000\u0605\u0606\u0006\u00a2\u0000"+ + "\u0000\u0606\u0157\u0001\u0000\u0000\u0000\u0607\u0608\u0003\u012c\u008d"+ + "\u0000\u0608\u0609\u0001\u0000\u0000\u0000\u0609\u060a\u0006\u00a3%\u0000"+ + "\u060a\u060b\u0006\u00a3&\u0000\u060b\u0159\u0001\u0000\u0000\u0000\u060c"+ + "\u060d\u0003\u012e\u008e\u0000\u060d\u060e\u0001\u0000\u0000\u0000\u060e"+ + "\u060f\u0006\u00a4\u0012\u0000\u060f\u0610\u0006\u00a4\u0011\u0000\u0610"+ + "\u0611\u0006\u00a4\u0011\u0000\u0611\u015b\u0001\u0000\u0000\u0000\u0612"+ + "\u0613\u0003\u00b6R\u0000\u0613\u0614\u0001\u0000\u0000\u0000\u0614\u0615"+ + "\u0006\u00a5\u0010\u0000\u0615\u0616\u0006\u00a5\u0011\u0000\u0616\u015d"+ + "\u0001\u0000\u0000\u0000\u0617\u0618\u0003\u0016\u0002\u0000\u0618\u0619"+ + "\u0001\u0000\u0000\u0000\u0619\u061a\u0006\u00a6\u0000\u0000\u061a\u015f"+ + "\u0001\u0000\u0000\u0000\u061b\u061c\u0003\u0012\u0000\u0000\u061c\u061d"+ + "\u0001\u0000\u0000\u0000\u061d\u061e\u0006\u00a7\u0000\u0000\u061e\u0161"+ + "\u0001\u0000\u0000\u0000\u061f\u0620\u0003\u0014\u0001\u0000\u0620\u0621"+ + "\u0001\u0000\u0000\u0000\u0621\u0622\u0006\u00a8\u0000\u0000\u0622\u0163"+ + "\u0001\u0000\u0000\u0000\u0623\u0624\u0003\u00b6R\u0000\u0624\u0625\u0001"+ + "\u0000\u0000\u0000\u0625\u0626\u0006\u00a9\u0010\u0000\u0626\u0627\u0006"+ + "\u00a9\u0011\u0000\u0627\u0165\u0001\u0000\u0000\u0000\u0628\u0629\u0003"+ + "\u012e\u008e\u0000\u0629\u062a\u0001\u0000\u0000\u0000\u062a\u062b\u0006"+ + "\u00aa\u0012\u0000\u062b\u062c\u0006\u00aa\u0011\u0000\u062c\u062d\u0006"+ + "\u00aa\u0011\u0000\u062d\u0167\u0001\u0000\u0000\u0000\u062e\u062f\u0003"+ + "\u0102x\u0000\u062f\u0630\u0001\u0000\u0000\u0000\u0630\u0631\u0006\u00ab"+ + "\u001c\u0000\u0631\u0632\u0006\u00ab\u0011\u0000\u0632\u0633\u0006\u00ab"+ + "\u0004\u0000\u0633\u0169\u0001\u0000\u0000\u0000\u0634\u0635\u0003\u00e0"+ + "g\u0000\u0635\u0636\u0001\u0000\u0000\u0000\u0636\u0637\u0006\u00ac\u0016"+ + "\u0000\u0637\u016b\u0001\u0000\u0000\u0000\u0638\u0639\u0003\u0134\u0091"+ + "\u0000\u0639\u063a\u0001\u0000\u0000\u0000\u063a\u063b\u0006\u00ad\u0019"+ + "\u0000\u063b\u016d\u0001\u0000\u0000\u0000\u063c\u063d\u0003\u0130\u008f"+ + "\u0000\u063d\u063e\u0001\u0000\u0000\u0000\u063e\u063f\u0006\u00ae\u001a"+ + "\u0000\u063f\u016f\u0001\u0000\u0000\u0000\u0640\u0641\u0003\u0012\u0000"+ + "\u0000\u0641\u0642\u0001\u0000\u0000\u0000\u0642\u0643\u0006\u00af\u0000"+ + "\u0000\u0643\u0171\u0001\u0000\u0000\u0000\u0644\u0645\u0003\u0014\u0001"+ + "\u0000\u0645\u0646\u0001\u0000\u0000\u0000\u0646\u0647\u0006\u00b0\u0000"+ + "\u0000\u0647\u0173\u0001\u0000\u0000\u0000\u0648\u0649\u0003\u0016\u0002"+ + "\u0000\u0649\u064a\u0001\u0000\u0000\u0000\u064a\u064b\u0006\u00b1\u0000"+ + "\u0000\u064b\u0175\u0001\u0000\u0000\u0000\u064c\u064d\u0007\u0011\u0000"+ + "\u0000\u064d\u064e\u0007\u000b\u0000\u0000\u064e\u064f\u0007\u0004\u0000"+ + "\u0000\u064f\u0650\u0007\u000b\u0000\u0000\u0650\u0651\u0007\u0011\u0000"+ + "\u0000\u0651\u0652\u0001\u0000\u0000\u0000\u0652\u0653\u0006\u00b2\u0011"+ + "\u0000\u0653\u0654\u0006\u00b2\u0004\u0000\u0654\u0177\u0001\u0000\u0000"+ + "\u0000\u0655\u0656\u0003\u0012\u0000\u0000\u0656\u0657\u0001\u0000\u0000"+ + "\u0000\u0657\u0658\u0006\u00b3\u0000\u0000\u0658\u0179\u0001\u0000\u0000"+ + "\u0000\u0659\u065a\u0003\u0014\u0001\u0000\u065a\u065b\u0001\u0000\u0000"+ + "\u0000\u065b\u065c\u0006\u00b4\u0000\u0000\u065c\u017b\u0001\u0000\u0000"+ + "\u0000\u065d\u065e\u0003\u0016\u0002\u0000\u065e\u065f\u0001\u0000\u0000"+ + "\u0000\u065f\u0660\u0006\u00b5\u0000\u0000\u0660\u017d\u0001\u0000\u0000"+ + "\u0000\u0661\u0662\u0003\u00b6R\u0000\u0662\u0663\u0001\u0000\u0000\u0000"+ + "\u0663\u0664\u0006\u00b6\u0010\u0000\u0664\u0665\u0006\u00b6\u0011\u0000"+ + "\u0665\u017f\u0001\u0000\u0000\u0000\u0666\u0667\u0007#\u0000\u0000\u0667"+ + "\u0668\u0007\t\u0000\u0000\u0668\u0669\u0007\n\u0000\u0000\u0669\u066a"+ + "\u0007\u0005\u0000\u0000\u066a\u0181\u0001\u0000\u0000\u0000\u066b\u066c"+ + "\u0003\u020c\u00fd\u0000\u066c\u066d\u0001\u0000\u0000\u0000\u066d\u066e"+ + "\u0006\u00b8\u0014\u0000\u066e\u0183\u0001\u0000\u0000\u0000\u066f\u0670"+ + "\u0003\u00f8s\u0000\u0670\u0671\u0001\u0000\u0000\u0000\u0671\u0672\u0006"+ + "\u00b9\u0013\u0000\u0672\u0673\u0006\u00b9\u0011\u0000\u0673\u0674\u0006"+ + "\u00b9\u0004\u0000\u0674\u0185\u0001\u0000\u0000\u0000\u0675\u0676\u0007"+ + "\u0016\u0000\u0000\u0676\u0677\u0007\u0011\u0000\u0000\u0677\u0678\u0007"+ + "\n\u0000\u0000\u0678\u0679\u0007\u0005\u0000\u0000\u0679\u067a\u0007\u0006"+ + "\u0000\u0000\u067a\u067b\u0001\u0000\u0000\u0000\u067b\u067c\u0006\u00ba"+ + "\u0011\u0000\u067c\u067d\u0006\u00ba\u0004\u0000\u067d\u0187\u0001\u0000"+ + "\u0000\u0000\u067e\u067f\u0003\u014c\u009d\u0000\u067f\u0680\u0001\u0000"+ + "\u0000\u0000\u0680\u0681\u0006\u00bb*\u0000\u0681\u0189\u0001\u0000\u0000"+ + "\u0000\u0682\u0683\u0003\u00cc]\u0000\u0683\u0684\u0001\u0000\u0000\u0000"+ + "\u0684\u0685\u0006\u00bc\u001e\u0000\u0685\u018b\u0001\u0000\u0000\u0000"+ + "\u0686\u0687\u0003\u00dce\u0000\u0687\u0688\u0001\u0000\u0000\u0000\u0688"+ + "\u0689\u0006\u00bd(\u0000\u0689\u018d\u0001\u0000\u0000\u0000\u068a\u068b"+ + "\u0003\u0012\u0000\u0000\u068b\u068c\u0001\u0000\u0000\u0000\u068c\u068d"+ + "\u0006\u00be\u0000\u0000\u068d\u018f\u0001\u0000\u0000\u0000\u068e\u068f"+ + "\u0003\u0014\u0001\u0000\u068f\u0690\u0001\u0000\u0000\u0000\u0690\u0691"+ + "\u0006\u00bf\u0000\u0000\u0691\u0191\u0001\u0000\u0000\u0000\u0692\u0693"+ + "\u0003\u0016\u0002\u0000\u0693\u0694\u0001\u0000\u0000\u0000\u0694\u0695"+ + "\u0006\u00c0\u0000\u0000\u0695\u0193\u0001\u0000\u0000\u0000\u0696\u0697"+ + "\u0003\u00b6R\u0000\u0697\u0698\u0001\u0000\u0000\u0000\u0698\u0699\u0006"+ + "\u00c1\u0010\u0000\u0699\u069a\u0006\u00c1\u0011\u0000\u069a\u0195\u0001"+ + "\u0000\u0000\u0000\u069b\u069c\u0003\u012e\u008e\u0000\u069c\u069d\u0001"+ + "\u0000\u0000\u0000\u069d\u069e\u0006\u00c2\u0012\u0000\u069e\u069f\u0006"+ + "\u00c2\u0011\u0000\u069f\u06a0\u0006\u00c2\u0011\u0000\u06a0\u0197\u0001"+ + "\u0000\u0000\u0000\u06a1\u06a2\u0003\u00dce\u0000\u06a2\u06a3\u0001\u0000"+ + "\u0000\u0000\u06a3\u06a4\u0006\u00c3(\u0000\u06a4\u0199\u0001\u0000\u0000"+ + "\u0000\u06a5\u06a6\u0003\u00e0g\u0000\u06a6\u06a7\u0001\u0000\u0000\u0000"+ + "\u06a7\u06a8\u0006\u00c4\u0016\u0000\u06a8\u019b\u0001\u0000\u0000\u0000"+ + "\u06a9\u06aa\u0003\u00e4i\u0000\u06aa\u06ab\u0001\u0000\u0000\u0000\u06ab"+ + "\u06ac\u0006\u00c5\u0015\u0000\u06ac\u019d\u0001\u0000\u0000\u0000\u06ad"+ + "\u06ae\u0003\u00f8s\u0000\u06ae\u06af\u0001\u0000\u0000\u0000\u06af\u06b0"+ + "\u0006\u00c6\u0013\u0000\u06b0\u06b1\u0006\u00c6+\u0000\u06b1\u019f\u0001"+ + "\u0000\u0000\u0000\u06b2\u06b3\u0003\u014c\u009d\u0000\u06b3\u06b4\u0001"+ + "\u0000\u0000\u0000\u06b4\u06b5\u0006\u00c7*\u0000\u06b5\u01a1\u0001\u0000"+ + "\u0000\u0000\u06b6\u06b7\u0003\u00cc]\u0000\u06b7\u06b8\u0001\u0000\u0000"+ + "\u0000\u06b8\u06b9\u0006\u00c8\u001e\u0000\u06b9\u01a3\u0001\u0000\u0000"+ + "\u0000\u06ba\u06bb\u0003\u0012\u0000\u0000\u06bb\u06bc\u0001\u0000\u0000"+ + "\u0000\u06bc\u06bd\u0006\u00c9\u0000\u0000\u06bd\u01a5\u0001\u0000\u0000"+ + "\u0000\u06be\u06bf\u0003\u0014\u0001\u0000\u06bf\u06c0\u0001\u0000\u0000"+ + "\u0000\u06c0\u06c1\u0006\u00ca\u0000\u0000\u06c1\u01a7\u0001\u0000\u0000"+ + "\u0000\u06c2\u06c3\u0003\u0016\u0002\u0000\u06c3\u06c4\u0001\u0000\u0000"+ + "\u0000\u06c4\u06c5\u0006\u00cb\u0000\u0000\u06c5\u01a9\u0001\u0000\u0000"+ + "\u0000\u06c6\u06c7\u0003\u00b6R\u0000\u06c7\u06c8\u0001\u0000\u0000\u0000"+ + "\u06c8\u06c9\u0006\u00cc\u0010\u0000\u06c9\u06ca\u0006\u00cc\u0011\u0000"+ + "\u06ca\u06cb\u0006\u00cc\u0011\u0000\u06cb\u01ab\u0001\u0000\u0000\u0000"+ + "\u06cc\u06cd\u0003\u012e\u008e\u0000\u06cd\u06ce\u0001\u0000\u0000\u0000"+ + "\u06ce\u06cf\u0006\u00cd\u0012\u0000\u06cf\u06d0\u0006\u00cd\u0011\u0000"+ + "\u06d0\u06d1\u0006\u00cd\u0011\u0000\u06d1\u06d2\u0006\u00cd\u0011\u0000"+ + "\u06d2\u01ad\u0001\u0000\u0000\u0000\u06d3\u06d4\u0003\u00e0g\u0000\u06d4"+ + "\u06d5\u0001\u0000\u0000\u0000\u06d5\u06d6\u0006\u00ce\u0016\u0000\u06d6"+ + "\u01af\u0001\u0000\u0000\u0000\u06d7\u06d8\u0003\u00e4i\u0000\u06d8\u06d9"+ + "\u0001\u0000\u0000\u0000\u06d9\u06da\u0006\u00cf\u0015\u0000\u06da\u01b1"+ + "\u0001\u0000\u0000\u0000\u06db\u06dc\u0003\u01ee\u00ee\u0000\u06dc\u06dd"+ + "\u0001\u0000\u0000\u0000\u06dd\u06de\u0006\u00d0 \u0000\u06de\u01b3\u0001"+ + "\u0000\u0000\u0000\u06df\u06e0\u0003\u0012\u0000\u0000\u06e0\u06e1\u0001"+ + "\u0000\u0000\u0000\u06e1\u06e2\u0006\u00d1\u0000\u0000\u06e2\u01b5\u0001"+ + "\u0000\u0000\u0000\u06e3\u06e4\u0003\u0014\u0001\u0000\u06e4\u06e5\u0001"+ + "\u0000\u0000\u0000\u06e5\u06e6\u0006\u00d2\u0000\u0000\u06e6\u01b7\u0001"+ + "\u0000\u0000\u0000\u06e7\u06e8\u0003\u0016\u0002\u0000\u06e8\u06e9\u0001"+ + "\u0000\u0000\u0000\u06e9\u06ea\u0006\u00d3\u0000\u0000\u06ea\u01b9\u0001"+ + "\u0000\u0000\u0000\u06eb\u06ec\u0003\u00b6R\u0000\u06ec\u06ed\u0001\u0000"+ + "\u0000\u0000\u06ed\u06ee\u0006\u00d4\u0010\u0000\u06ee\u06ef\u0006\u00d4"+ + "\u0011\u0000\u06ef\u01bb\u0001\u0000\u0000\u0000\u06f0\u06f1\u0003\u012e"+ + "\u008e\u0000\u06f1\u06f2\u0001\u0000\u0000\u0000\u06f2\u06f3\u0006\u00d5"+ + "\u0012\u0000\u06f3\u06f4\u0006\u00d5\u0011\u0000\u06f4\u06f5\u0006\u00d5"+ + "\u0011\u0000\u06f5\u01bd\u0001\u0000\u0000\u0000\u06f6\u06f7\u0003\u0128"+ + "\u008b\u0000\u06f7\u06f8\u0001\u0000\u0000\u0000\u06f8\u06f9\u0006\u00d6"+ + "\u0017\u0000\u06f9\u01bf\u0001\u0000\u0000\u0000\u06fa\u06fb\u0003\u012a"+ + "\u008c\u0000\u06fb\u06fc\u0001\u0000\u0000\u0000\u06fc\u06fd\u0006\u00d7"+ + "\u0018\u0000\u06fd\u01c1\u0001\u0000\u0000\u0000\u06fe\u06ff\u0003\u00e4"+ + "i\u0000\u06ff\u0700\u0001\u0000\u0000\u0000\u0700\u0701\u0006\u00d8\u0015"+ + "\u0000\u0701\u01c3\u0001\u0000\u0000\u0000\u0702\u0703\u0003\u00fcu\u0000"+ + "\u0703\u0704\u0001\u0000\u0000\u0000\u0704\u0705\u0006\u00d9!\u0000\u0705"+ + "\u01c5\u0001\u0000\u0000\u0000\u0706\u0707\u0003\u0124\u0089\u0000\u0707"+ + "\u0708\u0001\u0000\u0000\u0000\u0708\u0709\u0006\u00da\"\u0000\u0709\u01c7"+ + "\u0001\u0000\u0000\u0000\u070a\u070b\u0003\u0120\u0087\u0000\u070b\u070c"+ + "\u0001\u0000\u0000\u0000\u070c\u070d\u0006\u00db#\u0000\u070d\u01c9\u0001"+ + "\u0000\u0000\u0000\u070e\u070f\u0003\u0126\u008a\u0000\u070f\u0710\u0001"+ + "\u0000\u0000\u0000\u0710\u0711\u0006\u00dc$\u0000\u0711\u01cb\u0001\u0000"+ + "\u0000\u0000\u0712\u0713\u0003\u0134\u0091\u0000\u0713\u0714\u0001\u0000"+ + "\u0000\u0000\u0714\u0715\u0006\u00dd\u0019\u0000\u0715\u01cd\u0001\u0000"+ + "\u0000\u0000\u0716\u0717\u0003\u0130\u008f\u0000\u0717\u0718\u0001\u0000"+ + "\u0000\u0000\u0718\u0719\u0006\u00de\u001a\u0000\u0719\u01cf\u0001\u0000"+ + "\u0000\u0000\u071a\u071b\u0003\u0012\u0000\u0000\u071b\u071c\u0001\u0000"+ + "\u0000\u0000\u071c\u071d\u0006\u00df\u0000\u0000\u071d\u01d1\u0001\u0000"+ + "\u0000\u0000\u071e\u071f\u0003\u0014\u0001\u0000\u071f\u0720\u0001\u0000"+ + "\u0000\u0000\u0720\u0721\u0006\u00e0\u0000\u0000\u0721\u01d3\u0001\u0000"+ + "\u0000\u0000\u0722\u0723\u0003\u0016\u0002\u0000\u0723\u0724\u0001\u0000"+ + "\u0000\u0000\u0724\u0725\u0006\u00e1\u0000\u0000\u0725\u01d5\u0001\u0000"+ + "\u0000\u0000\u0726\u0727\u0003\u00b6R\u0000\u0727\u0728\u0001\u0000\u0000"+ + "\u0000\u0728\u0729\u0006\u00e2\u0010\u0000\u0729\u072a\u0006\u00e2\u0011"+ + "\u0000\u072a\u01d7\u0001\u0000\u0000\u0000\u072b\u072c\u0003\u012e\u008e"+ + "\u0000\u072c\u072d\u0001\u0000\u0000\u0000\u072d\u072e\u0006\u00e3\u0012"+ + "\u0000\u072e\u072f\u0006\u00e3\u0011\u0000\u072f\u0730\u0006\u00e3\u0011"+ + "\u0000\u0730\u01d9\u0001\u0000\u0000\u0000\u0731\u0732\u0003\u00e4i\u0000"+ + "\u0732\u0733\u0001\u0000\u0000\u0000\u0733\u0734\u0006\u00e4\u0015\u0000"+ + "\u0734\u01db\u0001\u0000\u0000\u0000\u0735\u0736\u0003\u0128\u008b\u0000"+ + "\u0736\u0737\u0001\u0000\u0000\u0000\u0737\u0738\u0006\u00e5\u0017\u0000"+ + "\u0738\u01dd\u0001\u0000\u0000\u0000\u0739\u073a\u0003\u012a\u008c\u0000"+ + "\u073a\u073b\u0001\u0000\u0000\u0000\u073b\u073c\u0006\u00e6\u0018\u0000"+ + "\u073c\u01df\u0001\u0000\u0000\u0000\u073d\u073e\u0003\u00e0g\u0000\u073e"+ + "\u073f\u0001\u0000\u0000\u0000\u073f\u0740\u0006\u00e7\u0016\u0000\u0740"+ + "\u01e1\u0001\u0000\u0000\u0000\u0741\u0742\u0003\u00fcu\u0000\u0742\u0743"+ + "\u0001\u0000\u0000\u0000\u0743\u0744\u0006\u00e8!\u0000\u0744\u01e3\u0001"+ + "\u0000\u0000\u0000\u0745\u0746\u0003\u0124\u0089\u0000\u0746\u0747\u0001"+ + "\u0000\u0000\u0000\u0747\u0748\u0006\u00e9\"\u0000\u0748\u01e5\u0001\u0000"+ + "\u0000\u0000\u0749\u074a\u0003\u0120\u0087\u0000\u074a\u074b\u0001\u0000"+ + "\u0000\u0000\u074b\u074c\u0006\u00ea#\u0000\u074c\u01e7\u0001\u0000\u0000"+ + "\u0000\u074d\u074e\u0003\u0126\u008a\u0000\u074e\u074f\u0001\u0000\u0000"+ + "\u0000\u074f\u0750\u0006\u00eb$\u0000\u0750\u01e9\u0001\u0000\u0000\u0000"+ + "\u0751\u0756\u0003\u00baT\u0000\u0752\u0756\u0003\u00b8S\u0000\u0753\u0756"+ + "\u0003\u00c8[\u0000\u0754\u0756\u0003\u0116\u0082\u0000\u0755\u0751\u0001"+ + "\u0000\u0000\u0000\u0755\u0752\u0001\u0000\u0000\u0000\u0755\u0753\u0001"+ + "\u0000\u0000\u0000\u0755\u0754\u0001\u0000\u0000\u0000\u0756\u01eb\u0001"+ + "\u0000\u0000\u0000\u0757\u075a\u0003\u00baT\u0000\u0758\u075a\u0003\u0116"+ + "\u0082\u0000\u0759\u0757\u0001\u0000\u0000\u0000\u0759\u0758\u0001\u0000"+ + "\u0000\u0000\u075a\u075e\u0001\u0000\u0000\u0000\u075b\u075d\u0003\u01ea"+ + "\u00ec\u0000\u075c\u075b\u0001\u0000\u0000\u0000\u075d\u0760\u0001\u0000"+ + "\u0000\u0000\u075e\u075c\u0001\u0000\u0000\u0000\u075e\u075f\u0001\u0000"+ + "\u0000\u0000\u075f\u076b\u0001\u0000\u0000\u0000\u0760\u075e\u0001\u0000"+ + "\u0000\u0000\u0761\u0764\u0003\u00c8[\u0000\u0762\u0764\u0003\u00c2X\u0000"+ + "\u0763\u0761\u0001\u0000\u0000\u0000\u0763\u0762\u0001\u0000\u0000\u0000"+ + "\u0764\u0766\u0001\u0000\u0000\u0000\u0765\u0767\u0003\u01ea\u00ec\u0000"+ + "\u0766\u0765\u0001\u0000\u0000\u0000\u0767\u0768\u0001\u0000\u0000\u0000"+ + "\u0768\u0766\u0001\u0000\u0000\u0000\u0768\u0769\u0001\u0000\u0000\u0000"+ + "\u0769\u076b\u0001\u0000\u0000\u0000\u076a\u0759\u0001\u0000\u0000\u0000"+ + "\u076a\u0763\u0001\u0000\u0000\u0000\u076b\u01ed\u0001\u0000\u0000\u0000"+ + "\u076c\u076f\u0003\u01ec\u00ed\u0000\u076d\u076f\u0003\u0132\u0090\u0000"+ + "\u076e\u076c\u0001\u0000\u0000\u0000\u076e\u076d\u0001\u0000\u0000\u0000"+ + "\u076f\u0770\u0001\u0000\u0000\u0000\u0770\u076e\u0001\u0000\u0000\u0000"+ + "\u0770\u0771\u0001\u0000\u0000\u0000\u0771\u01ef\u0001\u0000\u0000\u0000"+ + "\u0772\u0773\u0003\u0012\u0000\u0000\u0773\u0774\u0001\u0000\u0000\u0000"+ + "\u0774\u0775\u0006\u00ef\u0000\u0000\u0775\u01f1\u0001\u0000\u0000\u0000"+ + "\u0776\u0777\u0003\u0014\u0001\u0000\u0777\u0778\u0001\u0000\u0000\u0000"+ + "\u0778\u0779\u0006\u00f0\u0000\u0000\u0779\u01f3\u0001\u0000\u0000\u0000"+ + "\u077a\u077b\u0003\u0016\u0002\u0000\u077b\u077c\u0001\u0000\u0000\u0000"+ + "\u077c\u077d\u0006\u00f1\u0000\u0000\u077d\u01f5\u0001\u0000\u0000\u0000"+ + "\u077e\u077f\u0003\u00b6R\u0000\u077f\u0780\u0001\u0000\u0000\u0000\u0780"+ + "\u0781\u0006\u00f2\u0010\u0000\u0781\u0782\u0006\u00f2\u0011\u0000\u0782"+ + "\u01f7\u0001\u0000\u0000\u0000\u0783\u0784\u0003\u012e\u008e\u0000\u0784"+ + "\u0785\u0001\u0000\u0000\u0000\u0785\u0786\u0006\u00f3\u0012\u0000\u0786"+ + "\u0787\u0006\u00f3\u0011\u0000\u0787\u0788\u0006\u00f3\u0011\u0000\u0788"+ + "\u01f9\u0001\u0000\u0000\u0000\u0789\u078a\u0003\u0128\u008b\u0000\u078a"+ + "\u078b\u0001\u0000\u0000\u0000\u078b\u078c\u0006\u00f4\u0017\u0000\u078c"+ + "\u01fb\u0001\u0000\u0000\u0000\u078d\u078e\u0003\u012a\u008c\u0000\u078e"+ + "\u078f\u0001\u0000\u0000\u0000\u078f\u0790\u0006\u00f5\u0018\u0000\u0790"+ + "\u01fd\u0001\u0000\u0000\u0000\u0791\u0792\u0003\u00d6b\u0000\u0792\u0793"+ + "\u0001\u0000\u0000\u0000\u0793\u0794\u0006\u00f6\u001f\u0000\u0794\u01ff"+ + "\u0001\u0000\u0000\u0000\u0795\u0796\u0003\u00e0g\u0000\u0796\u0797\u0001"+ + "\u0000\u0000\u0000\u0797\u0798\u0006\u00f7\u0016\u0000\u0798\u0201\u0001"+ + "\u0000\u0000\u0000\u0799\u079a\u0003\u00e4i\u0000\u079a\u079b\u0001\u0000"+ + "\u0000\u0000\u079b\u079c\u0006\u00f8\u0015\u0000\u079c\u0203\u0001\u0000"+ + "\u0000\u0000\u079d\u079e\u0003\u00fcu\u0000\u079e\u079f\u0001\u0000\u0000"+ + "\u0000\u079f\u07a0\u0006\u00f9!\u0000\u07a0\u0205\u0001\u0000\u0000\u0000"+ + "\u07a1\u07a2\u0003\u0124\u0089\u0000\u07a2\u07a3\u0001\u0000\u0000\u0000"+ + "\u07a3\u07a4\u0006\u00fa\"\u0000\u07a4\u0207\u0001\u0000\u0000\u0000\u07a5"+ + "\u07a6\u0003\u0120\u0087\u0000\u07a6\u07a7\u0001\u0000\u0000\u0000\u07a7"+ + "\u07a8\u0006\u00fb#\u0000\u07a8\u0209\u0001\u0000\u0000\u0000\u07a9\u07aa"+ + "\u0003\u0126\u008a\u0000\u07aa\u07ab\u0001\u0000\u0000\u0000\u07ab\u07ac"+ + "\u0006\u00fc$\u0000\u07ac\u020b\u0001\u0000\u0000\u0000\u07ad\u07ae\u0007"+ + "\u0004\u0000\u0000\u07ae\u07af\u0007\u0011\u0000\u0000\u07af\u020d\u0001"+ + "\u0000\u0000\u0000\u07b0\u07b1\u0003\u01ee\u00ee\u0000\u07b1\u07b2\u0001"+ + "\u0000\u0000\u0000\u07b2\u07b3\u0006\u00fe \u0000\u07b3\u020f\u0001\u0000"+ + "\u0000\u0000\u07b4\u07b5\u0003\u0012\u0000\u0000\u07b5\u07b6\u0001\u0000"+ + "\u0000\u0000\u07b6\u07b7\u0006\u00ff\u0000\u0000\u07b7\u0211\u0001\u0000"+ + "\u0000\u0000\u07b8\u07b9\u0003\u0014\u0001\u0000\u07b9\u07ba\u0001\u0000"+ + "\u0000\u0000\u07ba\u07bb\u0006\u0100\u0000\u0000\u07bb\u0213\u0001\u0000"+ + "\u0000\u0000\u07bc\u07bd\u0003\u0016\u0002\u0000\u07bd\u07be\u0001\u0000"+ + "\u0000\u0000\u07be\u07bf\u0006\u0101\u0000\u0000\u07bf\u0215\u0001\u0000"+ + "\u0000\u0000\u07c0\u07c1\u0003\u0100w\u0000\u07c1\u07c2\u0001\u0000\u0000"+ + "\u0000\u07c2\u07c3\u0006\u0102,\u0000\u07c3\u0217\u0001\u0000\u0000\u0000"+ + "\u07c4\u07c5\u0003\u00e6j\u0000\u07c5\u07c6\u0001\u0000\u0000\u0000\u07c6"+ + "\u07c7\u0006\u0103-\u0000\u07c7\u0219\u0001\u0000\u0000\u0000\u07c8\u07c9"+ + "\u0003\u00f4q\u0000\u07c9\u07ca\u0001\u0000\u0000\u0000\u07ca\u07cb\u0006"+ + "\u0104.\u0000\u07cb\u021b\u0001\u0000\u0000\u0000\u07cc\u07cd\u0003\u00de"+ + "f\u0000\u07cd\u07ce\u0001\u0000\u0000\u0000\u07ce\u07cf\u0006\u0105/\u0000"+ + "\u07cf\u07d0\u0006\u0105\u0011\u0000\u07d0\u021d\u0001\u0000\u0000\u0000"+ + "\u07d1\u07d2\u0003\u00d6b\u0000\u07d2\u07d3\u0001\u0000\u0000\u0000\u07d3"+ + "\u07d4\u0006\u0106\u001f\u0000\u07d4\u021f\u0001\u0000\u0000\u0000\u07d5"+ + "\u07d6\u0003\u00cc]\u0000\u07d6\u07d7\u0001\u0000\u0000\u0000\u07d7\u07d8"+ + "\u0006\u0107\u001e\u0000\u07d8\u0221\u0001\u0000\u0000\u0000\u07d9\u07da"+ + "\u0003\u0130\u008f\u0000\u07da\u07db\u0001\u0000\u0000\u0000\u07db\u07dc"+ + "\u0006\u0108\u001a\u0000\u07dc\u0223\u0001\u0000\u0000\u0000\u07dd\u07de"+ + "\u0003\u0134\u0091\u0000\u07de\u07df\u0001\u0000\u0000\u0000\u07df\u07e0"+ + "\u0006\u0109\u0019\u0000\u07e0\u0225\u0001\u0000\u0000\u0000\u07e1\u07e2"+ + "\u0003\u00d0_\u0000\u07e2\u07e3\u0001\u0000\u0000\u0000\u07e3\u07e4\u0006"+ + "\u010a0\u0000\u07e4\u0227\u0001\u0000\u0000\u0000\u07e5\u07e6\u0003\u00ce"+ + "^\u0000\u07e6\u07e7\u0001\u0000\u0000\u0000\u07e7\u07e8\u0006\u010b1\u0000"+ + "\u07e8\u0229\u0001\u0000\u0000\u0000\u07e9\u07ea\u0003\u00e0g\u0000\u07ea"+ + "\u07eb\u0001\u0000\u0000\u0000\u07eb\u07ec\u0006\u010c\u0016\u0000\u07ec"+ + "\u022b\u0001\u0000\u0000\u0000\u07ed\u07ee\u0003\u00e4i\u0000\u07ee\u07ef"+ + "\u0001\u0000\u0000\u0000\u07ef\u07f0\u0006\u010d\u0015\u0000\u07f0\u022d"+ + "\u0001\u0000\u0000\u0000\u07f1\u07f2\u0003\u00fcu\u0000\u07f2\u07f3\u0001"+ + "\u0000\u0000\u0000\u07f3\u07f4\u0006\u010e!\u0000\u07f4\u022f\u0001\u0000"+ + "\u0000\u0000\u07f5\u07f6\u0003\u0124\u0089\u0000\u07f6\u07f7\u0001\u0000"+ + "\u0000\u0000\u07f7\u07f8\u0006\u010f\"\u0000\u07f8\u0231\u0001\u0000\u0000"+ + "\u0000\u07f9\u07fa\u0003\u0120\u0087\u0000\u07fa\u07fb\u0001\u0000\u0000"+ + "\u0000\u07fb\u07fc\u0006\u0110#\u0000\u07fc\u0233\u0001\u0000\u0000\u0000"+ + "\u07fd\u07fe\u0003\u0126\u008a\u0000\u07fe\u07ff\u0001\u0000\u0000\u0000"+ + "\u07ff\u0800\u0006\u0111$\u0000\u0800\u0235\u0001\u0000\u0000\u0000\u0801"+ + "\u0802\u0003\u0128\u008b\u0000\u0802\u0803\u0001\u0000\u0000\u0000\u0803"+ + "\u0804\u0006\u0112\u0017\u0000\u0804\u0237\u0001\u0000\u0000\u0000\u0805"+ + "\u0806\u0003\u012a\u008c\u0000\u0806\u0807\u0001\u0000\u0000\u0000\u0807"+ + "\u0808\u0006\u0113\u0018\u0000\u0808\u0239\u0001\u0000\u0000\u0000\u0809"+ + "\u080a\u0003\u01ee\u00ee\u0000\u080a\u080b\u0001\u0000\u0000\u0000\u080b"+ + "\u080c\u0006\u0114 \u0000\u080c\u023b\u0001\u0000\u0000\u0000\u080d\u080e"+ + "\u0003\u0012\u0000\u0000\u080e\u080f\u0001\u0000\u0000\u0000\u080f\u0810"+ + "\u0006\u0115\u0000\u0000\u0810\u023d\u0001\u0000\u0000\u0000\u0811\u0812"+ + "\u0003\u0014\u0001\u0000\u0812\u0813\u0001\u0000\u0000\u0000\u0813\u0814"+ + "\u0006\u0116\u0000\u0000\u0814\u023f\u0001\u0000\u0000\u0000\u0815\u0816"+ + "\u0003\u0016\u0002\u0000\u0816\u0817\u0001\u0000\u0000\u0000\u0817\u0818"+ + "\u0006\u0117\u0000\u0000\u0818\u0241\u0001\u0000\u0000\u0000\u0819\u081a"+ + "\u0003\u00b6R\u0000\u081a\u081b\u0001\u0000\u0000\u0000\u081b\u081c\u0006"+ + "\u0118\u0010\u0000\u081c\u081d\u0006\u0118\u0011\u0000\u081d\u0243\u0001"+ + "\u0000\u0000\u0000\u081e\u081f\u0007\n\u0000\u0000\u081f\u0820\u0007\u0005"+ + "\u0000\u0000\u0820\u0821\u0007\u0015\u0000\u0000\u0821\u0822\u0007\t\u0000"+ + "\u0000\u0822\u0245\u0001\u0000\u0000\u0000\u0823\u0824\u0003\u0012\u0000"+ + "\u0000\u0824\u0825\u0001\u0000\u0000\u0000\u0825\u0826\u0006\u011a\u0000"+ + "\u0000\u0826\u0247\u0001\u0000\u0000\u0000\u0827\u0828\u0003\u0014\u0001"+ + "\u0000\u0828\u0829\u0001\u0000\u0000\u0000\u0829\u082a\u0006\u011b\u0000"+ + "\u0000\u082a\u0249\u0001\u0000\u0000\u0000\u082b\u082c\u0003\u0016\u0002"+ + "\u0000\u082c\u082d\u0001\u0000\u0000\u0000\u082d\u082e\u0006\u011c\u0000"+ + "\u0000\u082e\u024b\u0001\u0000\u0000\u0000F\u0000\u0001\u0002\u0003\u0004"+ + "\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0252\u0256"+ + "\u0259\u0262\u0264\u026f\u0393\u03e8\u03ec\u03f1\u0475\u047a\u0483\u048a"+ + "\u048f\u0491\u049c\u04a4\u04a7\u04a9\u04ae\u04b3\u04b9\u04c0\u04c5\u04cb"+ + "\u04ce\u04d6\u04da\u0567\u056c\u0573\u0575\u057a\u057f\u0586\u0588\u05a2"+ + "\u05a7\u05ac\u05ae\u05b4\u05ec\u05f1\u0755\u0759\u075e\u0763\u0768\u076a"+ + "\u076e\u07702\u0000\u0001\u0000\u0005\u0001\u0000\u0005\u0002\u0000\u0005"+ + "\u0004\u0000\u0005\u0005\u0000\u0005\u0006\u0000\u0005\u0007\u0000\u0005"+ + "\b\u0000\u0005\t\u0000\u0005\n\u0000\u0005\u000b\u0000\u0005\r\u0000\u0005"+ + "\u000e\u0000\u0005\u000f\u0000\u0005\u0010\u0000\u0005\u0011\u0000\u0007"+ + "2\u0000\u0004\u0000\u0000\u0007c\u0000\u0007I\u0000\u0007\u008a\u0000"+ + "\u0007?\u0000\u0007=\u0000\u0007`\u0000\u0007a\u0000\u0007e\u0000\u0007"+ + "d\u0000\u0005\u0003\u0000\u0007N\u0000\u0007(\u0000\u00073\u0000\u0007"+ + "8\u0000\u0007\u0086\u0000\u0007K\u0000\u0007^\u0000\u0007]\u0000\u0007"+ + "_\u0000\u0007b\u0000\u0005\u0000\u0000\u0007\u0011\u0000\u0007;\u0000"+ + "\u0007:\u0000\u0007j\u0000\u0005\f\u0000\u0007M\u0000\u0007@\u0000\u0007"+ + "G\u0000\u0007<\u0000\u00075\u0000\u00074\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp index ea5bb5e8ac0dd..a57c3a1093296 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp @@ -15,13 +15,14 @@ null 'row' 'sample' 'sort' -'stats' -'where' null +'where' 'from' 'ts' 'fork' null +null +null 'lookup' null null @@ -114,6 +115,10 @@ null null null null +null +null +null +null 'join' 'USING' null @@ -163,11 +168,12 @@ SAMPLE SORT STATS WHERE -DEV_INLINESTATS FROM TS FORK DEV_FUSE +DEV_INLINE +DEV_INLINESTATS JOIN_LOOKUP DEV_JOIN_FULL DEV_JOIN_LEFT @@ -260,6 +266,10 @@ FORK_MULTILINE_COMMENT FUSE_LINE_COMMENT FUSE_MULTILINE_COMMENT FUSE_WS +INLINE_STATS +INLINE_LINE_COMMENT +INLINE_MULTILINE_COMMENT +INLINE_WS JOIN USING JOIN_LINE_COMMENT @@ -355,7 +365,7 @@ forkSubQueryProcessingCommand rerankCommand completionCommand lookupCommand -inlinestatsCommand +inlineStatsCommand insistCommand fuseCommand setCommand @@ -384,4 +394,4 @@ joinCondition atn: -[4, 1, 143, 894, 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, 4, 0, 183, 8, 0, 11, 0, 12, 0, 184, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 193, 8, 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 204, 8, 2, 10, 2, 12, 2, 207, 9, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 215, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 243, 8, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 5, 8, 256, 8, 8, 10, 8, 12, 8, 259, 9, 8, 1, 9, 1, 9, 1, 9, 3, 9, 264, 8, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 5, 10, 271, 8, 10, 10, 10, 12, 10, 274, 9, 10, 1, 11, 1, 11, 1, 11, 3, 11, 279, 8, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 5, 14, 290, 8, 14, 10, 14, 12, 14, 293, 9, 14, 1, 14, 3, 14, 296, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 307, 8, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 321, 8, 20, 10, 20, 12, 20, 324, 9, 20, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 331, 8, 22, 1, 22, 1, 22, 3, 22, 335, 8, 22, 1, 23, 1, 23, 1, 23, 5, 23, 340, 8, 23, 10, 23, 12, 23, 343, 9, 23, 1, 24, 1, 24, 1, 24, 3, 24, 348, 8, 24, 1, 25, 1, 25, 1, 25, 3, 25, 353, 8, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 362, 8, 25, 1, 26, 1, 26, 1, 26, 5, 26, 367, 8, 26, 10, 26, 12, 26, 370, 9, 26, 1, 27, 1, 27, 1, 27, 3, 27, 375, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 384, 8, 27, 1, 28, 1, 28, 1, 28, 5, 28, 389, 8, 28, 10, 28, 12, 28, 392, 9, 28, 1, 29, 1, 29, 1, 29, 5, 29, 397, 8, 29, 10, 29, 12, 29, 400, 9, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 407, 8, 31, 1, 32, 1, 32, 3, 32, 411, 8, 32, 1, 33, 1, 33, 3, 33, 415, 8, 33, 1, 34, 1, 34, 1, 34, 3, 34, 420, 8, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 429, 8, 36, 10, 36, 12, 36, 432, 9, 36, 1, 37, 1, 37, 3, 37, 436, 8, 37, 1, 37, 1, 37, 3, 37, 440, 8, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 5, 40, 452, 8, 40, 10, 40, 12, 40, 455, 9, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 465, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 471, 8, 42, 1, 43, 1, 43, 1, 43, 5, 43, 476, 8, 43, 10, 43, 12, 43, 479, 9, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 3, 45, 487, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 510, 8, 51, 1, 51, 1, 51, 1, 51, 1, 51, 5, 51, 516, 8, 51, 10, 51, 12, 51, 519, 9, 51, 3, 51, 521, 8, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 3, 53, 528, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 539, 8, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 546, 8, 55, 1, 56, 1, 56, 1, 56, 1, 57, 4, 57, 552, 8, 57, 11, 57, 12, 57, 553, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 566, 8, 59, 10, 59, 12, 59, 569, 9, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 577, 8, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 588, 8, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 602, 8, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 3, 66, 609, 8, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 628, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 635, 8, 69, 10, 69, 12, 69, 638, 9, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 645, 8, 69, 1, 69, 1, 69, 1, 69, 3, 69, 650, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 658, 8, 69, 10, 69, 12, 69, 661, 9, 69, 1, 70, 1, 70, 3, 70, 665, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 672, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 679, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 5, 70, 686, 8, 70, 10, 70, 12, 70, 689, 9, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 695, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 5, 70, 702, 8, 70, 10, 70, 12, 70, 705, 9, 70, 1, 70, 1, 70, 3, 70, 709, 8, 70, 1, 71, 1, 71, 1, 71, 3, 71, 714, 8, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 724, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 730, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 5, 73, 738, 8, 73, 10, 73, 12, 73, 741, 9, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 751, 8, 74, 1, 74, 1, 74, 1, 74, 5, 74, 756, 8, 74, 10, 74, 12, 74, 759, 9, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 5, 75, 767, 8, 75, 10, 75, 12, 75, 770, 9, 75, 1, 75, 1, 75, 3, 75, 774, 8, 75, 3, 75, 776, 8, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 3, 76, 783, 8, 76, 1, 77, 1, 77, 1, 77, 1, 77, 5, 77, 789, 8, 77, 10, 77, 12, 77, 792, 9, 77, 3, 77, 794, 8, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 3, 79, 804, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 819, 8, 80, 10, 80, 12, 80, 822, 9, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 830, 8, 80, 10, 80, 12, 80, 833, 9, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 841, 8, 80, 10, 80, 12, 80, 844, 9, 80, 1, 80, 1, 80, 3, 80, 848, 8, 80, 1, 81, 1, 81, 1, 82, 1, 82, 3, 82, 854, 8, 82, 1, 83, 3, 83, 857, 8, 83, 1, 83, 1, 83, 1, 84, 3, 84, 862, 8, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 3, 88, 878, 8, 88, 1, 88, 1, 88, 1, 88, 3, 88, 883, 8, 88, 1, 89, 1, 89, 1, 89, 1, 89, 5, 89, 889, 8, 89, 10, 89, 12, 89, 892, 9, 89, 1, 89, 0, 5, 4, 118, 138, 146, 148, 90, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 0, 10, 2, 0, 50, 50, 105, 105, 1, 0, 99, 100, 2, 0, 54, 54, 61, 61, 2, 0, 64, 64, 67, 67, 2, 0, 39, 39, 50, 50, 1, 0, 85, 86, 1, 0, 87, 89, 2, 0, 63, 63, 76, 76, 2, 0, 78, 78, 80, 84, 2, 0, 23, 23, 25, 26, 932, 0, 192, 1, 0, 0, 0, 2, 194, 1, 0, 0, 0, 4, 197, 1, 0, 0, 0, 6, 214, 1, 0, 0, 0, 8, 242, 1, 0, 0, 0, 10, 244, 1, 0, 0, 0, 12, 247, 1, 0, 0, 0, 14, 249, 1, 0, 0, 0, 16, 252, 1, 0, 0, 0, 18, 263, 1, 0, 0, 0, 20, 267, 1, 0, 0, 0, 22, 275, 1, 0, 0, 0, 24, 280, 1, 0, 0, 0, 26, 283, 1, 0, 0, 0, 28, 286, 1, 0, 0, 0, 30, 306, 1, 0, 0, 0, 32, 308, 1, 0, 0, 0, 34, 310, 1, 0, 0, 0, 36, 312, 1, 0, 0, 0, 38, 314, 1, 0, 0, 0, 40, 316, 1, 0, 0, 0, 42, 325, 1, 0, 0, 0, 44, 328, 1, 0, 0, 0, 46, 336, 1, 0, 0, 0, 48, 344, 1, 0, 0, 0, 50, 361, 1, 0, 0, 0, 52, 363, 1, 0, 0, 0, 54, 383, 1, 0, 0, 0, 56, 385, 1, 0, 0, 0, 58, 393, 1, 0, 0, 0, 60, 401, 1, 0, 0, 0, 62, 406, 1, 0, 0, 0, 64, 410, 1, 0, 0, 0, 66, 414, 1, 0, 0, 0, 68, 419, 1, 0, 0, 0, 70, 421, 1, 0, 0, 0, 72, 424, 1, 0, 0, 0, 74, 433, 1, 0, 0, 0, 76, 441, 1, 0, 0, 0, 78, 444, 1, 0, 0, 0, 80, 447, 1, 0, 0, 0, 82, 464, 1, 0, 0, 0, 84, 466, 1, 0, 0, 0, 86, 472, 1, 0, 0, 0, 88, 480, 1, 0, 0, 0, 90, 486, 1, 0, 0, 0, 92, 488, 1, 0, 0, 0, 94, 492, 1, 0, 0, 0, 96, 495, 1, 0, 0, 0, 98, 498, 1, 0, 0, 0, 100, 502, 1, 0, 0, 0, 102, 505, 1, 0, 0, 0, 104, 522, 1, 0, 0, 0, 106, 527, 1, 0, 0, 0, 108, 531, 1, 0, 0, 0, 110, 534, 1, 0, 0, 0, 112, 547, 1, 0, 0, 0, 114, 551, 1, 0, 0, 0, 116, 555, 1, 0, 0, 0, 118, 559, 1, 0, 0, 0, 120, 570, 1, 0, 0, 0, 122, 572, 1, 0, 0, 0, 124, 583, 1, 0, 0, 0, 126, 592, 1, 0, 0, 0, 128, 597, 1, 0, 0, 0, 130, 603, 1, 0, 0, 0, 132, 606, 1, 0, 0, 0, 134, 612, 1, 0, 0, 0, 136, 616, 1, 0, 0, 0, 138, 649, 1, 0, 0, 0, 140, 708, 1, 0, 0, 0, 142, 710, 1, 0, 0, 0, 144, 723, 1, 0, 0, 0, 146, 729, 1, 0, 0, 0, 148, 750, 1, 0, 0, 0, 150, 760, 1, 0, 0, 0, 152, 782, 1, 0, 0, 0, 154, 784, 1, 0, 0, 0, 156, 797, 1, 0, 0, 0, 158, 803, 1, 0, 0, 0, 160, 847, 1, 0, 0, 0, 162, 849, 1, 0, 0, 0, 164, 853, 1, 0, 0, 0, 166, 856, 1, 0, 0, 0, 168, 861, 1, 0, 0, 0, 170, 865, 1, 0, 0, 0, 172, 867, 1, 0, 0, 0, 174, 869, 1, 0, 0, 0, 176, 882, 1, 0, 0, 0, 178, 884, 1, 0, 0, 0, 180, 182, 4, 0, 0, 0, 181, 183, 3, 134, 67, 0, 182, 181, 1, 0, 0, 0, 183, 184, 1, 0, 0, 0, 184, 182, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 187, 3, 2, 1, 0, 187, 188, 5, 0, 0, 1, 188, 193, 1, 0, 0, 0, 189, 190, 3, 2, 1, 0, 190, 191, 5, 0, 0, 1, 191, 193, 1, 0, 0, 0, 192, 180, 1, 0, 0, 0, 192, 189, 1, 0, 0, 0, 193, 1, 1, 0, 0, 0, 194, 195, 3, 4, 2, 0, 195, 196, 5, 0, 0, 1, 196, 3, 1, 0, 0, 0, 197, 198, 6, 2, -1, 0, 198, 199, 3, 6, 3, 0, 199, 205, 1, 0, 0, 0, 200, 201, 10, 1, 0, 0, 201, 202, 5, 49, 0, 0, 202, 204, 3, 8, 4, 0, 203, 200, 1, 0, 0, 0, 204, 207, 1, 0, 0, 0, 205, 203, 1, 0, 0, 0, 205, 206, 1, 0, 0, 0, 206, 5, 1, 0, 0, 0, 207, 205, 1, 0, 0, 0, 208, 215, 3, 24, 12, 0, 209, 215, 3, 14, 7, 0, 210, 215, 3, 100, 50, 0, 211, 215, 3, 26, 13, 0, 212, 213, 4, 3, 2, 0, 213, 215, 3, 96, 48, 0, 214, 208, 1, 0, 0, 0, 214, 209, 1, 0, 0, 0, 214, 210, 1, 0, 0, 0, 214, 211, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 215, 7, 1, 0, 0, 0, 216, 243, 3, 42, 21, 0, 217, 243, 3, 10, 5, 0, 218, 243, 3, 76, 38, 0, 219, 243, 3, 70, 35, 0, 220, 243, 3, 44, 22, 0, 221, 243, 3, 72, 36, 0, 222, 243, 3, 78, 39, 0, 223, 243, 3, 80, 40, 0, 224, 243, 3, 84, 42, 0, 225, 243, 3, 92, 46, 0, 226, 243, 3, 102, 51, 0, 227, 243, 3, 94, 47, 0, 228, 243, 3, 174, 87, 0, 229, 243, 3, 110, 55, 0, 230, 243, 3, 124, 62, 0, 231, 243, 3, 108, 54, 0, 232, 243, 3, 112, 56, 0, 233, 243, 3, 122, 61, 0, 234, 235, 4, 4, 3, 0, 235, 243, 3, 128, 64, 0, 236, 237, 4, 4, 4, 0, 237, 243, 3, 126, 63, 0, 238, 239, 4, 4, 5, 0, 239, 243, 3, 130, 65, 0, 240, 241, 4, 4, 6, 0, 241, 243, 3, 132, 66, 0, 242, 216, 1, 0, 0, 0, 242, 217, 1, 0, 0, 0, 242, 218, 1, 0, 0, 0, 242, 219, 1, 0, 0, 0, 242, 220, 1, 0, 0, 0, 242, 221, 1, 0, 0, 0, 242, 222, 1, 0, 0, 0, 242, 223, 1, 0, 0, 0, 242, 224, 1, 0, 0, 0, 242, 225, 1, 0, 0, 0, 242, 226, 1, 0, 0, 0, 242, 227, 1, 0, 0, 0, 242, 228, 1, 0, 0, 0, 242, 229, 1, 0, 0, 0, 242, 230, 1, 0, 0, 0, 242, 231, 1, 0, 0, 0, 242, 232, 1, 0, 0, 0, 242, 233, 1, 0, 0, 0, 242, 234, 1, 0, 0, 0, 242, 236, 1, 0, 0, 0, 242, 238, 1, 0, 0, 0, 242, 240, 1, 0, 0, 0, 243, 9, 1, 0, 0, 0, 244, 245, 5, 17, 0, 0, 245, 246, 3, 138, 69, 0, 246, 11, 1, 0, 0, 0, 247, 248, 3, 60, 30, 0, 248, 13, 1, 0, 0, 0, 249, 250, 5, 13, 0, 0, 250, 251, 3, 16, 8, 0, 251, 15, 1, 0, 0, 0, 252, 257, 3, 18, 9, 0, 253, 254, 5, 60, 0, 0, 254, 256, 3, 18, 9, 0, 255, 253, 1, 0, 0, 0, 256, 259, 1, 0, 0, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 17, 1, 0, 0, 0, 259, 257, 1, 0, 0, 0, 260, 261, 3, 50, 25, 0, 261, 262, 5, 55, 0, 0, 262, 264, 1, 0, 0, 0, 263, 260, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 3, 138, 69, 0, 266, 19, 1, 0, 0, 0, 267, 272, 3, 22, 11, 0, 268, 269, 5, 60, 0, 0, 269, 271, 3, 22, 11, 0, 270, 268, 1, 0, 0, 0, 271, 274, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 21, 1, 0, 0, 0, 274, 272, 1, 0, 0, 0, 275, 278, 3, 50, 25, 0, 276, 277, 5, 55, 0, 0, 277, 279, 3, 138, 69, 0, 278, 276, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 23, 1, 0, 0, 0, 280, 281, 5, 19, 0, 0, 281, 282, 3, 28, 14, 0, 282, 25, 1, 0, 0, 0, 283, 284, 5, 20, 0, 0, 284, 285, 3, 28, 14, 0, 285, 27, 1, 0, 0, 0, 286, 291, 3, 30, 15, 0, 287, 288, 5, 60, 0, 0, 288, 290, 3, 30, 15, 0, 289, 287, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 295, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 296, 3, 40, 20, 0, 295, 294, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 29, 1, 0, 0, 0, 297, 298, 3, 32, 16, 0, 298, 299, 5, 58, 0, 0, 299, 300, 3, 36, 18, 0, 300, 307, 1, 0, 0, 0, 301, 302, 3, 36, 18, 0, 302, 303, 5, 57, 0, 0, 303, 304, 3, 34, 17, 0, 304, 307, 1, 0, 0, 0, 305, 307, 3, 38, 19, 0, 306, 297, 1, 0, 0, 0, 306, 301, 1, 0, 0, 0, 306, 305, 1, 0, 0, 0, 307, 31, 1, 0, 0, 0, 308, 309, 5, 105, 0, 0, 309, 33, 1, 0, 0, 0, 310, 311, 5, 105, 0, 0, 311, 35, 1, 0, 0, 0, 312, 313, 5, 105, 0, 0, 313, 37, 1, 0, 0, 0, 314, 315, 7, 0, 0, 0, 315, 39, 1, 0, 0, 0, 316, 317, 5, 104, 0, 0, 317, 322, 5, 105, 0, 0, 318, 319, 5, 60, 0, 0, 319, 321, 5, 105, 0, 0, 320, 318, 1, 0, 0, 0, 321, 324, 1, 0, 0, 0, 322, 320, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 41, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 325, 326, 5, 9, 0, 0, 326, 327, 3, 16, 8, 0, 327, 43, 1, 0, 0, 0, 328, 330, 5, 16, 0, 0, 329, 331, 3, 46, 23, 0, 330, 329, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 334, 1, 0, 0, 0, 332, 333, 5, 56, 0, 0, 333, 335, 3, 16, 8, 0, 334, 332, 1, 0, 0, 0, 334, 335, 1, 0, 0, 0, 335, 45, 1, 0, 0, 0, 336, 341, 3, 48, 24, 0, 337, 338, 5, 60, 0, 0, 338, 340, 3, 48, 24, 0, 339, 337, 1, 0, 0, 0, 340, 343, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 47, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 344, 347, 3, 18, 9, 0, 345, 346, 5, 17, 0, 0, 346, 348, 3, 138, 69, 0, 347, 345, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 49, 1, 0, 0, 0, 349, 350, 4, 25, 7, 0, 350, 352, 5, 95, 0, 0, 351, 353, 5, 99, 0, 0, 352, 351, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 355, 5, 96, 0, 0, 355, 356, 5, 62, 0, 0, 356, 357, 5, 95, 0, 0, 357, 358, 3, 52, 26, 0, 358, 359, 5, 96, 0, 0, 359, 362, 1, 0, 0, 0, 360, 362, 3, 52, 26, 0, 361, 349, 1, 0, 0, 0, 361, 360, 1, 0, 0, 0, 362, 51, 1, 0, 0, 0, 363, 368, 3, 68, 34, 0, 364, 365, 5, 62, 0, 0, 365, 367, 3, 68, 34, 0, 366, 364, 1, 0, 0, 0, 367, 370, 1, 0, 0, 0, 368, 366, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 53, 1, 0, 0, 0, 370, 368, 1, 0, 0, 0, 371, 372, 4, 27, 8, 0, 372, 374, 5, 95, 0, 0, 373, 375, 5, 129, 0, 0, 374, 373, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 376, 1, 0, 0, 0, 376, 377, 5, 96, 0, 0, 377, 378, 5, 62, 0, 0, 378, 379, 5, 95, 0, 0, 379, 380, 3, 56, 28, 0, 380, 381, 5, 96, 0, 0, 381, 384, 1, 0, 0, 0, 382, 384, 3, 56, 28, 0, 383, 371, 1, 0, 0, 0, 383, 382, 1, 0, 0, 0, 384, 55, 1, 0, 0, 0, 385, 390, 3, 62, 31, 0, 386, 387, 5, 62, 0, 0, 387, 389, 3, 62, 31, 0, 388, 386, 1, 0, 0, 0, 389, 392, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 57, 1, 0, 0, 0, 392, 390, 1, 0, 0, 0, 393, 398, 3, 54, 27, 0, 394, 395, 5, 60, 0, 0, 395, 397, 3, 54, 27, 0, 396, 394, 1, 0, 0, 0, 397, 400, 1, 0, 0, 0, 398, 396, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 59, 1, 0, 0, 0, 400, 398, 1, 0, 0, 0, 401, 402, 7, 1, 0, 0, 402, 61, 1, 0, 0, 0, 403, 407, 5, 129, 0, 0, 404, 407, 3, 64, 32, 0, 405, 407, 3, 66, 33, 0, 406, 403, 1, 0, 0, 0, 406, 404, 1, 0, 0, 0, 406, 405, 1, 0, 0, 0, 407, 63, 1, 0, 0, 0, 408, 411, 5, 74, 0, 0, 409, 411, 5, 93, 0, 0, 410, 408, 1, 0, 0, 0, 410, 409, 1, 0, 0, 0, 411, 65, 1, 0, 0, 0, 412, 415, 5, 92, 0, 0, 413, 415, 5, 94, 0, 0, 414, 412, 1, 0, 0, 0, 414, 413, 1, 0, 0, 0, 415, 67, 1, 0, 0, 0, 416, 420, 3, 60, 30, 0, 417, 420, 3, 64, 32, 0, 418, 420, 3, 66, 33, 0, 419, 416, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 418, 1, 0, 0, 0, 420, 69, 1, 0, 0, 0, 421, 422, 5, 11, 0, 0, 422, 423, 3, 160, 80, 0, 423, 71, 1, 0, 0, 0, 424, 425, 5, 15, 0, 0, 425, 430, 3, 74, 37, 0, 426, 427, 5, 60, 0, 0, 427, 429, 3, 74, 37, 0, 428, 426, 1, 0, 0, 0, 429, 432, 1, 0, 0, 0, 430, 428, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 73, 1, 0, 0, 0, 432, 430, 1, 0, 0, 0, 433, 435, 3, 138, 69, 0, 434, 436, 7, 2, 0, 0, 435, 434, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 439, 1, 0, 0, 0, 437, 438, 5, 71, 0, 0, 438, 440, 7, 3, 0, 0, 439, 437, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 75, 1, 0, 0, 0, 441, 442, 5, 30, 0, 0, 442, 443, 3, 58, 29, 0, 443, 77, 1, 0, 0, 0, 444, 445, 5, 29, 0, 0, 445, 446, 3, 58, 29, 0, 446, 79, 1, 0, 0, 0, 447, 448, 5, 32, 0, 0, 448, 453, 3, 82, 41, 0, 449, 450, 5, 60, 0, 0, 450, 452, 3, 82, 41, 0, 451, 449, 1, 0, 0, 0, 452, 455, 1, 0, 0, 0, 453, 451, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 81, 1, 0, 0, 0, 455, 453, 1, 0, 0, 0, 456, 457, 3, 54, 27, 0, 457, 458, 5, 133, 0, 0, 458, 459, 3, 54, 27, 0, 459, 465, 1, 0, 0, 0, 460, 461, 3, 54, 27, 0, 461, 462, 5, 55, 0, 0, 462, 463, 3, 54, 27, 0, 463, 465, 1, 0, 0, 0, 464, 456, 1, 0, 0, 0, 464, 460, 1, 0, 0, 0, 465, 83, 1, 0, 0, 0, 466, 467, 5, 8, 0, 0, 467, 468, 3, 148, 74, 0, 468, 470, 3, 170, 85, 0, 469, 471, 3, 86, 43, 0, 470, 469, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 85, 1, 0, 0, 0, 472, 477, 3, 88, 44, 0, 473, 474, 5, 60, 0, 0, 474, 476, 3, 88, 44, 0, 475, 473, 1, 0, 0, 0, 476, 479, 1, 0, 0, 0, 477, 475, 1, 0, 0, 0, 477, 478, 1, 0, 0, 0, 478, 87, 1, 0, 0, 0, 479, 477, 1, 0, 0, 0, 480, 481, 3, 60, 30, 0, 481, 482, 5, 55, 0, 0, 482, 483, 3, 160, 80, 0, 483, 89, 1, 0, 0, 0, 484, 485, 5, 77, 0, 0, 485, 487, 3, 154, 77, 0, 486, 484, 1, 0, 0, 0, 486, 487, 1, 0, 0, 0, 487, 91, 1, 0, 0, 0, 488, 489, 5, 10, 0, 0, 489, 490, 3, 148, 74, 0, 490, 491, 3, 170, 85, 0, 491, 93, 1, 0, 0, 0, 492, 493, 5, 28, 0, 0, 493, 494, 3, 50, 25, 0, 494, 95, 1, 0, 0, 0, 495, 496, 5, 6, 0, 0, 496, 497, 3, 98, 49, 0, 497, 97, 1, 0, 0, 0, 498, 499, 5, 97, 0, 0, 499, 500, 3, 4, 2, 0, 500, 501, 5, 98, 0, 0, 501, 99, 1, 0, 0, 0, 502, 503, 5, 34, 0, 0, 503, 504, 5, 140, 0, 0, 504, 101, 1, 0, 0, 0, 505, 506, 5, 5, 0, 0, 506, 509, 3, 104, 52, 0, 507, 508, 5, 72, 0, 0, 508, 510, 3, 54, 27, 0, 509, 507, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 520, 1, 0, 0, 0, 511, 512, 5, 77, 0, 0, 512, 517, 3, 106, 53, 0, 513, 514, 5, 60, 0, 0, 514, 516, 3, 106, 53, 0, 515, 513, 1, 0, 0, 0, 516, 519, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 521, 1, 0, 0, 0, 519, 517, 1, 0, 0, 0, 520, 511, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 103, 1, 0, 0, 0, 522, 523, 7, 4, 0, 0, 523, 105, 1, 0, 0, 0, 524, 525, 3, 54, 27, 0, 525, 526, 5, 55, 0, 0, 526, 528, 1, 0, 0, 0, 527, 524, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 3, 54, 27, 0, 530, 107, 1, 0, 0, 0, 531, 532, 5, 14, 0, 0, 532, 533, 3, 160, 80, 0, 533, 109, 1, 0, 0, 0, 534, 535, 5, 4, 0, 0, 535, 538, 3, 50, 25, 0, 536, 537, 5, 72, 0, 0, 537, 539, 3, 50, 25, 0, 538, 536, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 545, 1, 0, 0, 0, 540, 541, 5, 133, 0, 0, 541, 542, 3, 50, 25, 0, 542, 543, 5, 60, 0, 0, 543, 544, 3, 50, 25, 0, 544, 546, 1, 0, 0, 0, 545, 540, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 111, 1, 0, 0, 0, 547, 548, 5, 21, 0, 0, 548, 549, 3, 114, 57, 0, 549, 113, 1, 0, 0, 0, 550, 552, 3, 116, 58, 0, 551, 550, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 551, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 115, 1, 0, 0, 0, 555, 556, 5, 97, 0, 0, 556, 557, 3, 118, 59, 0, 557, 558, 5, 98, 0, 0, 558, 117, 1, 0, 0, 0, 559, 560, 6, 59, -1, 0, 560, 561, 3, 120, 60, 0, 561, 567, 1, 0, 0, 0, 562, 563, 10, 1, 0, 0, 563, 564, 5, 49, 0, 0, 564, 566, 3, 120, 60, 0, 565, 562, 1, 0, 0, 0, 566, 569, 1, 0, 0, 0, 567, 565, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 119, 1, 0, 0, 0, 569, 567, 1, 0, 0, 0, 570, 571, 3, 8, 4, 0, 571, 121, 1, 0, 0, 0, 572, 576, 5, 12, 0, 0, 573, 574, 3, 50, 25, 0, 574, 575, 5, 55, 0, 0, 575, 577, 1, 0, 0, 0, 576, 573, 1, 0, 0, 0, 576, 577, 1, 0, 0, 0, 577, 578, 1, 0, 0, 0, 578, 579, 3, 160, 80, 0, 579, 580, 5, 72, 0, 0, 580, 581, 3, 20, 10, 0, 581, 582, 3, 90, 45, 0, 582, 123, 1, 0, 0, 0, 583, 587, 5, 7, 0, 0, 584, 585, 3, 50, 25, 0, 585, 586, 5, 55, 0, 0, 586, 588, 1, 0, 0, 0, 587, 584, 1, 0, 0, 0, 587, 588, 1, 0, 0, 0, 588, 589, 1, 0, 0, 0, 589, 590, 3, 148, 74, 0, 590, 591, 3, 90, 45, 0, 591, 125, 1, 0, 0, 0, 592, 593, 5, 27, 0, 0, 593, 594, 3, 30, 15, 0, 594, 595, 5, 72, 0, 0, 595, 596, 3, 58, 29, 0, 596, 127, 1, 0, 0, 0, 597, 598, 5, 18, 0, 0, 598, 601, 3, 46, 23, 0, 599, 600, 5, 56, 0, 0, 600, 602, 3, 16, 8, 0, 601, 599, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 129, 1, 0, 0, 0, 603, 604, 5, 31, 0, 0, 604, 605, 3, 58, 29, 0, 605, 131, 1, 0, 0, 0, 606, 608, 5, 22, 0, 0, 607, 609, 3, 60, 30, 0, 608, 607, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 611, 3, 90, 45, 0, 611, 133, 1, 0, 0, 0, 612, 613, 5, 33, 0, 0, 613, 614, 3, 136, 68, 0, 614, 615, 5, 59, 0, 0, 615, 135, 1, 0, 0, 0, 616, 617, 3, 60, 30, 0, 617, 618, 5, 55, 0, 0, 618, 619, 3, 160, 80, 0, 619, 137, 1, 0, 0, 0, 620, 621, 6, 69, -1, 0, 621, 622, 5, 69, 0, 0, 622, 650, 3, 138, 69, 8, 623, 650, 3, 144, 72, 0, 624, 650, 3, 140, 70, 0, 625, 627, 3, 144, 72, 0, 626, 628, 5, 69, 0, 0, 627, 626, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 629, 1, 0, 0, 0, 629, 630, 5, 65, 0, 0, 630, 631, 5, 97, 0, 0, 631, 636, 3, 144, 72, 0, 632, 633, 5, 60, 0, 0, 633, 635, 3, 144, 72, 0, 634, 632, 1, 0, 0, 0, 635, 638, 1, 0, 0, 0, 636, 634, 1, 0, 0, 0, 636, 637, 1, 0, 0, 0, 637, 639, 1, 0, 0, 0, 638, 636, 1, 0, 0, 0, 639, 640, 5, 98, 0, 0, 640, 650, 1, 0, 0, 0, 641, 642, 3, 144, 72, 0, 642, 644, 5, 66, 0, 0, 643, 645, 5, 69, 0, 0, 644, 643, 1, 0, 0, 0, 644, 645, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 647, 5, 70, 0, 0, 647, 650, 1, 0, 0, 0, 648, 650, 3, 142, 71, 0, 649, 620, 1, 0, 0, 0, 649, 623, 1, 0, 0, 0, 649, 624, 1, 0, 0, 0, 649, 625, 1, 0, 0, 0, 649, 641, 1, 0, 0, 0, 649, 648, 1, 0, 0, 0, 650, 659, 1, 0, 0, 0, 651, 652, 10, 5, 0, 0, 652, 653, 5, 53, 0, 0, 653, 658, 3, 138, 69, 6, 654, 655, 10, 4, 0, 0, 655, 656, 5, 73, 0, 0, 656, 658, 3, 138, 69, 5, 657, 651, 1, 0, 0, 0, 657, 654, 1, 0, 0, 0, 658, 661, 1, 0, 0, 0, 659, 657, 1, 0, 0, 0, 659, 660, 1, 0, 0, 0, 660, 139, 1, 0, 0, 0, 661, 659, 1, 0, 0, 0, 662, 664, 3, 144, 72, 0, 663, 665, 5, 69, 0, 0, 664, 663, 1, 0, 0, 0, 664, 665, 1, 0, 0, 0, 665, 666, 1, 0, 0, 0, 666, 667, 5, 68, 0, 0, 667, 668, 3, 170, 85, 0, 668, 709, 1, 0, 0, 0, 669, 671, 3, 144, 72, 0, 670, 672, 5, 69, 0, 0, 671, 670, 1, 0, 0, 0, 671, 672, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 674, 5, 75, 0, 0, 674, 675, 3, 170, 85, 0, 675, 709, 1, 0, 0, 0, 676, 678, 3, 144, 72, 0, 677, 679, 5, 69, 0, 0, 678, 677, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 680, 1, 0, 0, 0, 680, 681, 5, 68, 0, 0, 681, 682, 5, 97, 0, 0, 682, 687, 3, 170, 85, 0, 683, 684, 5, 60, 0, 0, 684, 686, 3, 170, 85, 0, 685, 683, 1, 0, 0, 0, 686, 689, 1, 0, 0, 0, 687, 685, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 690, 1, 0, 0, 0, 689, 687, 1, 0, 0, 0, 690, 691, 5, 98, 0, 0, 691, 709, 1, 0, 0, 0, 692, 694, 3, 144, 72, 0, 693, 695, 5, 69, 0, 0, 694, 693, 1, 0, 0, 0, 694, 695, 1, 0, 0, 0, 695, 696, 1, 0, 0, 0, 696, 697, 5, 75, 0, 0, 697, 698, 5, 97, 0, 0, 698, 703, 3, 170, 85, 0, 699, 700, 5, 60, 0, 0, 700, 702, 3, 170, 85, 0, 701, 699, 1, 0, 0, 0, 702, 705, 1, 0, 0, 0, 703, 701, 1, 0, 0, 0, 703, 704, 1, 0, 0, 0, 704, 706, 1, 0, 0, 0, 705, 703, 1, 0, 0, 0, 706, 707, 5, 98, 0, 0, 707, 709, 1, 0, 0, 0, 708, 662, 1, 0, 0, 0, 708, 669, 1, 0, 0, 0, 708, 676, 1, 0, 0, 0, 708, 692, 1, 0, 0, 0, 709, 141, 1, 0, 0, 0, 710, 713, 3, 50, 25, 0, 711, 712, 5, 57, 0, 0, 712, 714, 3, 12, 6, 0, 713, 711, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 716, 5, 58, 0, 0, 716, 717, 3, 160, 80, 0, 717, 143, 1, 0, 0, 0, 718, 724, 3, 146, 73, 0, 719, 720, 3, 146, 73, 0, 720, 721, 3, 172, 86, 0, 721, 722, 3, 146, 73, 0, 722, 724, 1, 0, 0, 0, 723, 718, 1, 0, 0, 0, 723, 719, 1, 0, 0, 0, 724, 145, 1, 0, 0, 0, 725, 726, 6, 73, -1, 0, 726, 730, 3, 148, 74, 0, 727, 728, 7, 5, 0, 0, 728, 730, 3, 146, 73, 3, 729, 725, 1, 0, 0, 0, 729, 727, 1, 0, 0, 0, 730, 739, 1, 0, 0, 0, 731, 732, 10, 2, 0, 0, 732, 733, 7, 6, 0, 0, 733, 738, 3, 146, 73, 3, 734, 735, 10, 1, 0, 0, 735, 736, 7, 5, 0, 0, 736, 738, 3, 146, 73, 2, 737, 731, 1, 0, 0, 0, 737, 734, 1, 0, 0, 0, 738, 741, 1, 0, 0, 0, 739, 737, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 147, 1, 0, 0, 0, 741, 739, 1, 0, 0, 0, 742, 743, 6, 74, -1, 0, 743, 751, 3, 160, 80, 0, 744, 751, 3, 50, 25, 0, 745, 751, 3, 150, 75, 0, 746, 747, 5, 97, 0, 0, 747, 748, 3, 138, 69, 0, 748, 749, 5, 98, 0, 0, 749, 751, 1, 0, 0, 0, 750, 742, 1, 0, 0, 0, 750, 744, 1, 0, 0, 0, 750, 745, 1, 0, 0, 0, 750, 746, 1, 0, 0, 0, 751, 757, 1, 0, 0, 0, 752, 753, 10, 1, 0, 0, 753, 754, 5, 57, 0, 0, 754, 756, 3, 12, 6, 0, 755, 752, 1, 0, 0, 0, 756, 759, 1, 0, 0, 0, 757, 755, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 149, 1, 0, 0, 0, 759, 757, 1, 0, 0, 0, 760, 761, 3, 152, 76, 0, 761, 775, 5, 97, 0, 0, 762, 776, 5, 87, 0, 0, 763, 768, 3, 138, 69, 0, 764, 765, 5, 60, 0, 0, 765, 767, 3, 138, 69, 0, 766, 764, 1, 0, 0, 0, 767, 770, 1, 0, 0, 0, 768, 766, 1, 0, 0, 0, 768, 769, 1, 0, 0, 0, 769, 773, 1, 0, 0, 0, 770, 768, 1, 0, 0, 0, 771, 772, 5, 60, 0, 0, 772, 774, 3, 154, 77, 0, 773, 771, 1, 0, 0, 0, 773, 774, 1, 0, 0, 0, 774, 776, 1, 0, 0, 0, 775, 762, 1, 0, 0, 0, 775, 763, 1, 0, 0, 0, 775, 776, 1, 0, 0, 0, 776, 777, 1, 0, 0, 0, 777, 778, 5, 98, 0, 0, 778, 151, 1, 0, 0, 0, 779, 783, 3, 68, 34, 0, 780, 783, 5, 64, 0, 0, 781, 783, 5, 67, 0, 0, 782, 779, 1, 0, 0, 0, 782, 780, 1, 0, 0, 0, 782, 781, 1, 0, 0, 0, 783, 153, 1, 0, 0, 0, 784, 793, 5, 90, 0, 0, 785, 790, 3, 156, 78, 0, 786, 787, 5, 60, 0, 0, 787, 789, 3, 156, 78, 0, 788, 786, 1, 0, 0, 0, 789, 792, 1, 0, 0, 0, 790, 788, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 794, 1, 0, 0, 0, 792, 790, 1, 0, 0, 0, 793, 785, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 796, 5, 91, 0, 0, 796, 155, 1, 0, 0, 0, 797, 798, 3, 170, 85, 0, 798, 799, 5, 58, 0, 0, 799, 800, 3, 158, 79, 0, 800, 157, 1, 0, 0, 0, 801, 804, 3, 160, 80, 0, 802, 804, 3, 154, 77, 0, 803, 801, 1, 0, 0, 0, 803, 802, 1, 0, 0, 0, 804, 159, 1, 0, 0, 0, 805, 848, 5, 70, 0, 0, 806, 807, 3, 168, 84, 0, 807, 808, 5, 99, 0, 0, 808, 848, 1, 0, 0, 0, 809, 848, 3, 166, 83, 0, 810, 848, 3, 168, 84, 0, 811, 848, 3, 162, 81, 0, 812, 848, 3, 64, 32, 0, 813, 848, 3, 170, 85, 0, 814, 815, 5, 95, 0, 0, 815, 820, 3, 164, 82, 0, 816, 817, 5, 60, 0, 0, 817, 819, 3, 164, 82, 0, 818, 816, 1, 0, 0, 0, 819, 822, 1, 0, 0, 0, 820, 818, 1, 0, 0, 0, 820, 821, 1, 0, 0, 0, 821, 823, 1, 0, 0, 0, 822, 820, 1, 0, 0, 0, 823, 824, 5, 96, 0, 0, 824, 848, 1, 0, 0, 0, 825, 826, 5, 95, 0, 0, 826, 831, 3, 162, 81, 0, 827, 828, 5, 60, 0, 0, 828, 830, 3, 162, 81, 0, 829, 827, 1, 0, 0, 0, 830, 833, 1, 0, 0, 0, 831, 829, 1, 0, 0, 0, 831, 832, 1, 0, 0, 0, 832, 834, 1, 0, 0, 0, 833, 831, 1, 0, 0, 0, 834, 835, 5, 96, 0, 0, 835, 848, 1, 0, 0, 0, 836, 837, 5, 95, 0, 0, 837, 842, 3, 170, 85, 0, 838, 839, 5, 60, 0, 0, 839, 841, 3, 170, 85, 0, 840, 838, 1, 0, 0, 0, 841, 844, 1, 0, 0, 0, 842, 840, 1, 0, 0, 0, 842, 843, 1, 0, 0, 0, 843, 845, 1, 0, 0, 0, 844, 842, 1, 0, 0, 0, 845, 846, 5, 96, 0, 0, 846, 848, 1, 0, 0, 0, 847, 805, 1, 0, 0, 0, 847, 806, 1, 0, 0, 0, 847, 809, 1, 0, 0, 0, 847, 810, 1, 0, 0, 0, 847, 811, 1, 0, 0, 0, 847, 812, 1, 0, 0, 0, 847, 813, 1, 0, 0, 0, 847, 814, 1, 0, 0, 0, 847, 825, 1, 0, 0, 0, 847, 836, 1, 0, 0, 0, 848, 161, 1, 0, 0, 0, 849, 850, 7, 7, 0, 0, 850, 163, 1, 0, 0, 0, 851, 854, 3, 166, 83, 0, 852, 854, 3, 168, 84, 0, 853, 851, 1, 0, 0, 0, 853, 852, 1, 0, 0, 0, 854, 165, 1, 0, 0, 0, 855, 857, 7, 5, 0, 0, 856, 855, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 858, 1, 0, 0, 0, 858, 859, 5, 52, 0, 0, 859, 167, 1, 0, 0, 0, 860, 862, 7, 5, 0, 0, 861, 860, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 863, 1, 0, 0, 0, 863, 864, 5, 51, 0, 0, 864, 169, 1, 0, 0, 0, 865, 866, 5, 50, 0, 0, 866, 171, 1, 0, 0, 0, 867, 868, 7, 8, 0, 0, 868, 173, 1, 0, 0, 0, 869, 870, 7, 9, 0, 0, 870, 871, 5, 115, 0, 0, 871, 872, 3, 176, 88, 0, 872, 873, 3, 178, 89, 0, 873, 175, 1, 0, 0, 0, 874, 875, 4, 88, 15, 0, 875, 877, 3, 30, 15, 0, 876, 878, 5, 133, 0, 0, 877, 876, 1, 0, 0, 0, 877, 878, 1, 0, 0, 0, 878, 879, 1, 0, 0, 0, 879, 880, 5, 105, 0, 0, 880, 883, 1, 0, 0, 0, 881, 883, 3, 30, 15, 0, 882, 874, 1, 0, 0, 0, 882, 881, 1, 0, 0, 0, 883, 177, 1, 0, 0, 0, 884, 885, 5, 72, 0, 0, 885, 890, 3, 138, 69, 0, 886, 887, 5, 60, 0, 0, 887, 889, 3, 138, 69, 0, 888, 886, 1, 0, 0, 0, 889, 892, 1, 0, 0, 0, 890, 888, 1, 0, 0, 0, 890, 891, 1, 0, 0, 0, 891, 179, 1, 0, 0, 0, 892, 890, 1, 0, 0, 0, 85, 184, 192, 205, 214, 242, 257, 263, 272, 278, 291, 295, 306, 322, 330, 334, 341, 347, 352, 361, 368, 374, 383, 390, 398, 406, 410, 414, 419, 430, 435, 439, 453, 464, 470, 477, 486, 509, 517, 520, 527, 538, 545, 553, 567, 576, 587, 601, 608, 627, 636, 644, 649, 657, 659, 664, 671, 678, 687, 694, 703, 708, 713, 723, 729, 737, 739, 750, 757, 768, 773, 775, 782, 790, 793, 803, 820, 831, 842, 847, 853, 856, 861, 877, 882, 890] \ No newline at end of file +[4, 1, 148, 903, 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, 4, 0, 183, 8, 0, 11, 0, 12, 0, 184, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 193, 8, 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 204, 8, 2, 10, 2, 12, 2, 207, 9, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 215, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 243, 8, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 5, 8, 256, 8, 8, 10, 8, 12, 8, 259, 9, 8, 1, 9, 1, 9, 1, 9, 3, 9, 264, 8, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 5, 10, 271, 8, 10, 10, 10, 12, 10, 274, 9, 10, 1, 11, 1, 11, 1, 11, 3, 11, 279, 8, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 5, 14, 290, 8, 14, 10, 14, 12, 14, 293, 9, 14, 1, 14, 3, 14, 296, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 307, 8, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 321, 8, 20, 10, 20, 12, 20, 324, 9, 20, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 331, 8, 22, 1, 22, 1, 22, 3, 22, 335, 8, 22, 1, 23, 1, 23, 1, 23, 5, 23, 340, 8, 23, 10, 23, 12, 23, 343, 9, 23, 1, 24, 1, 24, 1, 24, 3, 24, 348, 8, 24, 1, 25, 1, 25, 1, 25, 3, 25, 353, 8, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 362, 8, 25, 1, 26, 1, 26, 1, 26, 5, 26, 367, 8, 26, 10, 26, 12, 26, 370, 9, 26, 1, 27, 1, 27, 1, 27, 3, 27, 375, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 384, 8, 27, 1, 28, 1, 28, 1, 28, 5, 28, 389, 8, 28, 10, 28, 12, 28, 392, 9, 28, 1, 29, 1, 29, 1, 29, 5, 29, 397, 8, 29, 10, 29, 12, 29, 400, 9, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 407, 8, 31, 1, 32, 1, 32, 3, 32, 411, 8, 32, 1, 33, 1, 33, 3, 33, 415, 8, 33, 1, 34, 1, 34, 1, 34, 3, 34, 420, 8, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 429, 8, 36, 10, 36, 12, 36, 432, 9, 36, 1, 37, 1, 37, 3, 37, 436, 8, 37, 1, 37, 1, 37, 3, 37, 440, 8, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 5, 40, 452, 8, 40, 10, 40, 12, 40, 455, 9, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 465, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 471, 8, 42, 1, 43, 1, 43, 1, 43, 5, 43, 476, 8, 43, 10, 43, 12, 43, 479, 9, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 3, 45, 487, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 510, 8, 51, 1, 51, 1, 51, 1, 51, 1, 51, 5, 51, 516, 8, 51, 10, 51, 12, 51, 519, 9, 51, 3, 51, 521, 8, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 3, 53, 528, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 539, 8, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 546, 8, 55, 1, 56, 1, 56, 1, 56, 1, 57, 4, 57, 552, 8, 57, 11, 57, 12, 57, 553, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 566, 8, 59, 10, 59, 12, 59, 569, 9, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 577, 8, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 588, 8, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 603, 8, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 609, 8, 64, 3, 64, 611, 8, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 3, 66, 618, 8, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 637, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 644, 8, 69, 10, 69, 12, 69, 647, 9, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 654, 8, 69, 1, 69, 1, 69, 1, 69, 3, 69, 659, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 667, 8, 69, 10, 69, 12, 69, 670, 9, 69, 1, 70, 1, 70, 3, 70, 674, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 681, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 688, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 5, 70, 695, 8, 70, 10, 70, 12, 70, 698, 9, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 704, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 5, 70, 711, 8, 70, 10, 70, 12, 70, 714, 9, 70, 1, 70, 1, 70, 3, 70, 718, 8, 70, 1, 71, 1, 71, 1, 71, 3, 71, 723, 8, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 733, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 739, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 5, 73, 747, 8, 73, 10, 73, 12, 73, 750, 9, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 760, 8, 74, 1, 74, 1, 74, 1, 74, 5, 74, 765, 8, 74, 10, 74, 12, 74, 768, 9, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 5, 75, 776, 8, 75, 10, 75, 12, 75, 779, 9, 75, 1, 75, 1, 75, 3, 75, 783, 8, 75, 3, 75, 785, 8, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 3, 76, 792, 8, 76, 1, 77, 1, 77, 1, 77, 1, 77, 5, 77, 798, 8, 77, 10, 77, 12, 77, 801, 9, 77, 3, 77, 803, 8, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 3, 79, 813, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 828, 8, 80, 10, 80, 12, 80, 831, 9, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 839, 8, 80, 10, 80, 12, 80, 842, 9, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 850, 8, 80, 10, 80, 12, 80, 853, 9, 80, 1, 80, 1, 80, 3, 80, 857, 8, 80, 1, 81, 1, 81, 1, 82, 1, 82, 3, 82, 863, 8, 82, 1, 83, 3, 83, 866, 8, 83, 1, 83, 1, 83, 1, 84, 3, 84, 871, 8, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 3, 88, 887, 8, 88, 1, 88, 1, 88, 1, 88, 3, 88, 892, 8, 88, 1, 89, 1, 89, 1, 89, 1, 89, 5, 89, 898, 8, 89, 10, 89, 12, 89, 901, 9, 89, 1, 89, 0, 5, 4, 118, 138, 146, 148, 90, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 0, 10, 2, 0, 51, 51, 106, 106, 1, 0, 100, 101, 2, 0, 55, 55, 62, 62, 2, 0, 65, 65, 68, 68, 2, 0, 40, 40, 51, 51, 1, 0, 86, 87, 1, 0, 88, 90, 2, 0, 64, 64, 77, 77, 2, 0, 79, 79, 81, 85, 2, 0, 24, 24, 26, 27, 943, 0, 192, 1, 0, 0, 0, 2, 194, 1, 0, 0, 0, 4, 197, 1, 0, 0, 0, 6, 214, 1, 0, 0, 0, 8, 242, 1, 0, 0, 0, 10, 244, 1, 0, 0, 0, 12, 247, 1, 0, 0, 0, 14, 249, 1, 0, 0, 0, 16, 252, 1, 0, 0, 0, 18, 263, 1, 0, 0, 0, 20, 267, 1, 0, 0, 0, 22, 275, 1, 0, 0, 0, 24, 280, 1, 0, 0, 0, 26, 283, 1, 0, 0, 0, 28, 286, 1, 0, 0, 0, 30, 306, 1, 0, 0, 0, 32, 308, 1, 0, 0, 0, 34, 310, 1, 0, 0, 0, 36, 312, 1, 0, 0, 0, 38, 314, 1, 0, 0, 0, 40, 316, 1, 0, 0, 0, 42, 325, 1, 0, 0, 0, 44, 328, 1, 0, 0, 0, 46, 336, 1, 0, 0, 0, 48, 344, 1, 0, 0, 0, 50, 361, 1, 0, 0, 0, 52, 363, 1, 0, 0, 0, 54, 383, 1, 0, 0, 0, 56, 385, 1, 0, 0, 0, 58, 393, 1, 0, 0, 0, 60, 401, 1, 0, 0, 0, 62, 406, 1, 0, 0, 0, 64, 410, 1, 0, 0, 0, 66, 414, 1, 0, 0, 0, 68, 419, 1, 0, 0, 0, 70, 421, 1, 0, 0, 0, 72, 424, 1, 0, 0, 0, 74, 433, 1, 0, 0, 0, 76, 441, 1, 0, 0, 0, 78, 444, 1, 0, 0, 0, 80, 447, 1, 0, 0, 0, 82, 464, 1, 0, 0, 0, 84, 466, 1, 0, 0, 0, 86, 472, 1, 0, 0, 0, 88, 480, 1, 0, 0, 0, 90, 486, 1, 0, 0, 0, 92, 488, 1, 0, 0, 0, 94, 492, 1, 0, 0, 0, 96, 495, 1, 0, 0, 0, 98, 498, 1, 0, 0, 0, 100, 502, 1, 0, 0, 0, 102, 505, 1, 0, 0, 0, 104, 522, 1, 0, 0, 0, 106, 527, 1, 0, 0, 0, 108, 531, 1, 0, 0, 0, 110, 534, 1, 0, 0, 0, 112, 547, 1, 0, 0, 0, 114, 551, 1, 0, 0, 0, 116, 555, 1, 0, 0, 0, 118, 559, 1, 0, 0, 0, 120, 570, 1, 0, 0, 0, 122, 572, 1, 0, 0, 0, 124, 583, 1, 0, 0, 0, 126, 592, 1, 0, 0, 0, 128, 610, 1, 0, 0, 0, 130, 612, 1, 0, 0, 0, 132, 615, 1, 0, 0, 0, 134, 621, 1, 0, 0, 0, 136, 625, 1, 0, 0, 0, 138, 658, 1, 0, 0, 0, 140, 717, 1, 0, 0, 0, 142, 719, 1, 0, 0, 0, 144, 732, 1, 0, 0, 0, 146, 738, 1, 0, 0, 0, 148, 759, 1, 0, 0, 0, 150, 769, 1, 0, 0, 0, 152, 791, 1, 0, 0, 0, 154, 793, 1, 0, 0, 0, 156, 806, 1, 0, 0, 0, 158, 812, 1, 0, 0, 0, 160, 856, 1, 0, 0, 0, 162, 858, 1, 0, 0, 0, 164, 862, 1, 0, 0, 0, 166, 865, 1, 0, 0, 0, 168, 870, 1, 0, 0, 0, 170, 874, 1, 0, 0, 0, 172, 876, 1, 0, 0, 0, 174, 878, 1, 0, 0, 0, 176, 891, 1, 0, 0, 0, 178, 893, 1, 0, 0, 0, 180, 182, 4, 0, 0, 0, 181, 183, 3, 134, 67, 0, 182, 181, 1, 0, 0, 0, 183, 184, 1, 0, 0, 0, 184, 182, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 187, 3, 2, 1, 0, 187, 188, 5, 0, 0, 1, 188, 193, 1, 0, 0, 0, 189, 190, 3, 2, 1, 0, 190, 191, 5, 0, 0, 1, 191, 193, 1, 0, 0, 0, 192, 180, 1, 0, 0, 0, 192, 189, 1, 0, 0, 0, 193, 1, 1, 0, 0, 0, 194, 195, 3, 4, 2, 0, 195, 196, 5, 0, 0, 1, 196, 3, 1, 0, 0, 0, 197, 198, 6, 2, -1, 0, 198, 199, 3, 6, 3, 0, 199, 205, 1, 0, 0, 0, 200, 201, 10, 1, 0, 0, 201, 202, 5, 50, 0, 0, 202, 204, 3, 8, 4, 0, 203, 200, 1, 0, 0, 0, 204, 207, 1, 0, 0, 0, 205, 203, 1, 0, 0, 0, 205, 206, 1, 0, 0, 0, 206, 5, 1, 0, 0, 0, 207, 205, 1, 0, 0, 0, 208, 215, 3, 24, 12, 0, 209, 215, 3, 14, 7, 0, 210, 215, 3, 100, 50, 0, 211, 215, 3, 26, 13, 0, 212, 213, 4, 3, 2, 0, 213, 215, 3, 96, 48, 0, 214, 208, 1, 0, 0, 0, 214, 209, 1, 0, 0, 0, 214, 210, 1, 0, 0, 0, 214, 211, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 215, 7, 1, 0, 0, 0, 216, 243, 3, 42, 21, 0, 217, 243, 3, 10, 5, 0, 218, 243, 3, 76, 38, 0, 219, 243, 3, 70, 35, 0, 220, 243, 3, 44, 22, 0, 221, 243, 3, 72, 36, 0, 222, 243, 3, 78, 39, 0, 223, 243, 3, 80, 40, 0, 224, 243, 3, 84, 42, 0, 225, 243, 3, 92, 46, 0, 226, 243, 3, 102, 51, 0, 227, 243, 3, 94, 47, 0, 228, 243, 3, 174, 87, 0, 229, 243, 3, 110, 55, 0, 230, 243, 3, 124, 62, 0, 231, 243, 3, 108, 54, 0, 232, 243, 3, 112, 56, 0, 233, 243, 3, 122, 61, 0, 234, 235, 4, 4, 3, 0, 235, 243, 3, 128, 64, 0, 236, 237, 4, 4, 4, 0, 237, 243, 3, 126, 63, 0, 238, 239, 4, 4, 5, 0, 239, 243, 3, 130, 65, 0, 240, 241, 4, 4, 6, 0, 241, 243, 3, 132, 66, 0, 242, 216, 1, 0, 0, 0, 242, 217, 1, 0, 0, 0, 242, 218, 1, 0, 0, 0, 242, 219, 1, 0, 0, 0, 242, 220, 1, 0, 0, 0, 242, 221, 1, 0, 0, 0, 242, 222, 1, 0, 0, 0, 242, 223, 1, 0, 0, 0, 242, 224, 1, 0, 0, 0, 242, 225, 1, 0, 0, 0, 242, 226, 1, 0, 0, 0, 242, 227, 1, 0, 0, 0, 242, 228, 1, 0, 0, 0, 242, 229, 1, 0, 0, 0, 242, 230, 1, 0, 0, 0, 242, 231, 1, 0, 0, 0, 242, 232, 1, 0, 0, 0, 242, 233, 1, 0, 0, 0, 242, 234, 1, 0, 0, 0, 242, 236, 1, 0, 0, 0, 242, 238, 1, 0, 0, 0, 242, 240, 1, 0, 0, 0, 243, 9, 1, 0, 0, 0, 244, 245, 5, 17, 0, 0, 245, 246, 3, 138, 69, 0, 246, 11, 1, 0, 0, 0, 247, 248, 3, 60, 30, 0, 248, 13, 1, 0, 0, 0, 249, 250, 5, 13, 0, 0, 250, 251, 3, 16, 8, 0, 251, 15, 1, 0, 0, 0, 252, 257, 3, 18, 9, 0, 253, 254, 5, 61, 0, 0, 254, 256, 3, 18, 9, 0, 255, 253, 1, 0, 0, 0, 256, 259, 1, 0, 0, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 17, 1, 0, 0, 0, 259, 257, 1, 0, 0, 0, 260, 261, 3, 50, 25, 0, 261, 262, 5, 56, 0, 0, 262, 264, 1, 0, 0, 0, 263, 260, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 3, 138, 69, 0, 266, 19, 1, 0, 0, 0, 267, 272, 3, 22, 11, 0, 268, 269, 5, 61, 0, 0, 269, 271, 3, 22, 11, 0, 270, 268, 1, 0, 0, 0, 271, 274, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 21, 1, 0, 0, 0, 274, 272, 1, 0, 0, 0, 275, 278, 3, 50, 25, 0, 276, 277, 5, 56, 0, 0, 277, 279, 3, 138, 69, 0, 278, 276, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 23, 1, 0, 0, 0, 280, 281, 5, 18, 0, 0, 281, 282, 3, 28, 14, 0, 282, 25, 1, 0, 0, 0, 283, 284, 5, 19, 0, 0, 284, 285, 3, 28, 14, 0, 285, 27, 1, 0, 0, 0, 286, 291, 3, 30, 15, 0, 287, 288, 5, 61, 0, 0, 288, 290, 3, 30, 15, 0, 289, 287, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 295, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 296, 3, 40, 20, 0, 295, 294, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 29, 1, 0, 0, 0, 297, 298, 3, 32, 16, 0, 298, 299, 5, 59, 0, 0, 299, 300, 3, 36, 18, 0, 300, 307, 1, 0, 0, 0, 301, 302, 3, 36, 18, 0, 302, 303, 5, 58, 0, 0, 303, 304, 3, 34, 17, 0, 304, 307, 1, 0, 0, 0, 305, 307, 3, 38, 19, 0, 306, 297, 1, 0, 0, 0, 306, 301, 1, 0, 0, 0, 306, 305, 1, 0, 0, 0, 307, 31, 1, 0, 0, 0, 308, 309, 5, 106, 0, 0, 309, 33, 1, 0, 0, 0, 310, 311, 5, 106, 0, 0, 311, 35, 1, 0, 0, 0, 312, 313, 5, 106, 0, 0, 313, 37, 1, 0, 0, 0, 314, 315, 7, 0, 0, 0, 315, 39, 1, 0, 0, 0, 316, 317, 5, 105, 0, 0, 317, 322, 5, 106, 0, 0, 318, 319, 5, 61, 0, 0, 319, 321, 5, 106, 0, 0, 320, 318, 1, 0, 0, 0, 321, 324, 1, 0, 0, 0, 322, 320, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 41, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 325, 326, 5, 9, 0, 0, 326, 327, 3, 16, 8, 0, 327, 43, 1, 0, 0, 0, 328, 330, 5, 16, 0, 0, 329, 331, 3, 46, 23, 0, 330, 329, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 334, 1, 0, 0, 0, 332, 333, 5, 57, 0, 0, 333, 335, 3, 16, 8, 0, 334, 332, 1, 0, 0, 0, 334, 335, 1, 0, 0, 0, 335, 45, 1, 0, 0, 0, 336, 341, 3, 48, 24, 0, 337, 338, 5, 61, 0, 0, 338, 340, 3, 48, 24, 0, 339, 337, 1, 0, 0, 0, 340, 343, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 47, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 344, 347, 3, 18, 9, 0, 345, 346, 5, 17, 0, 0, 346, 348, 3, 138, 69, 0, 347, 345, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 49, 1, 0, 0, 0, 349, 350, 4, 25, 7, 0, 350, 352, 5, 96, 0, 0, 351, 353, 5, 100, 0, 0, 352, 351, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 355, 5, 97, 0, 0, 355, 356, 5, 63, 0, 0, 356, 357, 5, 96, 0, 0, 357, 358, 3, 52, 26, 0, 358, 359, 5, 97, 0, 0, 359, 362, 1, 0, 0, 0, 360, 362, 3, 52, 26, 0, 361, 349, 1, 0, 0, 0, 361, 360, 1, 0, 0, 0, 362, 51, 1, 0, 0, 0, 363, 368, 3, 68, 34, 0, 364, 365, 5, 63, 0, 0, 365, 367, 3, 68, 34, 0, 366, 364, 1, 0, 0, 0, 367, 370, 1, 0, 0, 0, 368, 366, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 53, 1, 0, 0, 0, 370, 368, 1, 0, 0, 0, 371, 372, 4, 27, 8, 0, 372, 374, 5, 96, 0, 0, 373, 375, 5, 134, 0, 0, 374, 373, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 376, 1, 0, 0, 0, 376, 377, 5, 97, 0, 0, 377, 378, 5, 63, 0, 0, 378, 379, 5, 96, 0, 0, 379, 380, 3, 56, 28, 0, 380, 381, 5, 97, 0, 0, 381, 384, 1, 0, 0, 0, 382, 384, 3, 56, 28, 0, 383, 371, 1, 0, 0, 0, 383, 382, 1, 0, 0, 0, 384, 55, 1, 0, 0, 0, 385, 390, 3, 62, 31, 0, 386, 387, 5, 63, 0, 0, 387, 389, 3, 62, 31, 0, 388, 386, 1, 0, 0, 0, 389, 392, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 57, 1, 0, 0, 0, 392, 390, 1, 0, 0, 0, 393, 398, 3, 54, 27, 0, 394, 395, 5, 61, 0, 0, 395, 397, 3, 54, 27, 0, 396, 394, 1, 0, 0, 0, 397, 400, 1, 0, 0, 0, 398, 396, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 59, 1, 0, 0, 0, 400, 398, 1, 0, 0, 0, 401, 402, 7, 1, 0, 0, 402, 61, 1, 0, 0, 0, 403, 407, 5, 134, 0, 0, 404, 407, 3, 64, 32, 0, 405, 407, 3, 66, 33, 0, 406, 403, 1, 0, 0, 0, 406, 404, 1, 0, 0, 0, 406, 405, 1, 0, 0, 0, 407, 63, 1, 0, 0, 0, 408, 411, 5, 75, 0, 0, 409, 411, 5, 94, 0, 0, 410, 408, 1, 0, 0, 0, 410, 409, 1, 0, 0, 0, 411, 65, 1, 0, 0, 0, 412, 415, 5, 93, 0, 0, 413, 415, 5, 95, 0, 0, 414, 412, 1, 0, 0, 0, 414, 413, 1, 0, 0, 0, 415, 67, 1, 0, 0, 0, 416, 420, 3, 60, 30, 0, 417, 420, 3, 64, 32, 0, 418, 420, 3, 66, 33, 0, 419, 416, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 418, 1, 0, 0, 0, 420, 69, 1, 0, 0, 0, 421, 422, 5, 11, 0, 0, 422, 423, 3, 160, 80, 0, 423, 71, 1, 0, 0, 0, 424, 425, 5, 15, 0, 0, 425, 430, 3, 74, 37, 0, 426, 427, 5, 61, 0, 0, 427, 429, 3, 74, 37, 0, 428, 426, 1, 0, 0, 0, 429, 432, 1, 0, 0, 0, 430, 428, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 73, 1, 0, 0, 0, 432, 430, 1, 0, 0, 0, 433, 435, 3, 138, 69, 0, 434, 436, 7, 2, 0, 0, 435, 434, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 439, 1, 0, 0, 0, 437, 438, 5, 72, 0, 0, 438, 440, 7, 3, 0, 0, 439, 437, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 75, 1, 0, 0, 0, 441, 442, 5, 31, 0, 0, 442, 443, 3, 58, 29, 0, 443, 77, 1, 0, 0, 0, 444, 445, 5, 30, 0, 0, 445, 446, 3, 58, 29, 0, 446, 79, 1, 0, 0, 0, 447, 448, 5, 33, 0, 0, 448, 453, 3, 82, 41, 0, 449, 450, 5, 61, 0, 0, 450, 452, 3, 82, 41, 0, 451, 449, 1, 0, 0, 0, 452, 455, 1, 0, 0, 0, 453, 451, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 81, 1, 0, 0, 0, 455, 453, 1, 0, 0, 0, 456, 457, 3, 54, 27, 0, 457, 458, 5, 138, 0, 0, 458, 459, 3, 54, 27, 0, 459, 465, 1, 0, 0, 0, 460, 461, 3, 54, 27, 0, 461, 462, 5, 56, 0, 0, 462, 463, 3, 54, 27, 0, 463, 465, 1, 0, 0, 0, 464, 456, 1, 0, 0, 0, 464, 460, 1, 0, 0, 0, 465, 83, 1, 0, 0, 0, 466, 467, 5, 8, 0, 0, 467, 468, 3, 148, 74, 0, 468, 470, 3, 170, 85, 0, 469, 471, 3, 86, 43, 0, 470, 469, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 85, 1, 0, 0, 0, 472, 477, 3, 88, 44, 0, 473, 474, 5, 61, 0, 0, 474, 476, 3, 88, 44, 0, 475, 473, 1, 0, 0, 0, 476, 479, 1, 0, 0, 0, 477, 475, 1, 0, 0, 0, 477, 478, 1, 0, 0, 0, 478, 87, 1, 0, 0, 0, 479, 477, 1, 0, 0, 0, 480, 481, 3, 60, 30, 0, 481, 482, 5, 56, 0, 0, 482, 483, 3, 160, 80, 0, 483, 89, 1, 0, 0, 0, 484, 485, 5, 78, 0, 0, 485, 487, 3, 154, 77, 0, 486, 484, 1, 0, 0, 0, 486, 487, 1, 0, 0, 0, 487, 91, 1, 0, 0, 0, 488, 489, 5, 10, 0, 0, 489, 490, 3, 148, 74, 0, 490, 491, 3, 170, 85, 0, 491, 93, 1, 0, 0, 0, 492, 493, 5, 29, 0, 0, 493, 494, 3, 50, 25, 0, 494, 95, 1, 0, 0, 0, 495, 496, 5, 6, 0, 0, 496, 497, 3, 98, 49, 0, 497, 97, 1, 0, 0, 0, 498, 499, 5, 98, 0, 0, 499, 500, 3, 4, 2, 0, 500, 501, 5, 99, 0, 0, 501, 99, 1, 0, 0, 0, 502, 503, 5, 35, 0, 0, 503, 504, 5, 145, 0, 0, 504, 101, 1, 0, 0, 0, 505, 506, 5, 5, 0, 0, 506, 509, 3, 104, 52, 0, 507, 508, 5, 73, 0, 0, 508, 510, 3, 54, 27, 0, 509, 507, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 520, 1, 0, 0, 0, 511, 512, 5, 78, 0, 0, 512, 517, 3, 106, 53, 0, 513, 514, 5, 61, 0, 0, 514, 516, 3, 106, 53, 0, 515, 513, 1, 0, 0, 0, 516, 519, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 521, 1, 0, 0, 0, 519, 517, 1, 0, 0, 0, 520, 511, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 103, 1, 0, 0, 0, 522, 523, 7, 4, 0, 0, 523, 105, 1, 0, 0, 0, 524, 525, 3, 54, 27, 0, 525, 526, 5, 56, 0, 0, 526, 528, 1, 0, 0, 0, 527, 524, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 3, 54, 27, 0, 530, 107, 1, 0, 0, 0, 531, 532, 5, 14, 0, 0, 532, 533, 3, 160, 80, 0, 533, 109, 1, 0, 0, 0, 534, 535, 5, 4, 0, 0, 535, 538, 3, 50, 25, 0, 536, 537, 5, 73, 0, 0, 537, 539, 3, 50, 25, 0, 538, 536, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 545, 1, 0, 0, 0, 540, 541, 5, 138, 0, 0, 541, 542, 3, 50, 25, 0, 542, 543, 5, 61, 0, 0, 543, 544, 3, 50, 25, 0, 544, 546, 1, 0, 0, 0, 545, 540, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 111, 1, 0, 0, 0, 547, 548, 5, 20, 0, 0, 548, 549, 3, 114, 57, 0, 549, 113, 1, 0, 0, 0, 550, 552, 3, 116, 58, 0, 551, 550, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 551, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 115, 1, 0, 0, 0, 555, 556, 5, 98, 0, 0, 556, 557, 3, 118, 59, 0, 557, 558, 5, 99, 0, 0, 558, 117, 1, 0, 0, 0, 559, 560, 6, 59, -1, 0, 560, 561, 3, 120, 60, 0, 561, 567, 1, 0, 0, 0, 562, 563, 10, 1, 0, 0, 563, 564, 5, 50, 0, 0, 564, 566, 3, 120, 60, 0, 565, 562, 1, 0, 0, 0, 566, 569, 1, 0, 0, 0, 567, 565, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 119, 1, 0, 0, 0, 569, 567, 1, 0, 0, 0, 570, 571, 3, 8, 4, 0, 571, 121, 1, 0, 0, 0, 572, 576, 5, 12, 0, 0, 573, 574, 3, 50, 25, 0, 574, 575, 5, 56, 0, 0, 575, 577, 1, 0, 0, 0, 576, 573, 1, 0, 0, 0, 576, 577, 1, 0, 0, 0, 577, 578, 1, 0, 0, 0, 578, 579, 3, 160, 80, 0, 579, 580, 5, 73, 0, 0, 580, 581, 3, 20, 10, 0, 581, 582, 3, 90, 45, 0, 582, 123, 1, 0, 0, 0, 583, 587, 5, 7, 0, 0, 584, 585, 3, 50, 25, 0, 585, 586, 5, 56, 0, 0, 586, 588, 1, 0, 0, 0, 587, 584, 1, 0, 0, 0, 587, 588, 1, 0, 0, 0, 588, 589, 1, 0, 0, 0, 589, 590, 3, 148, 74, 0, 590, 591, 3, 90, 45, 0, 591, 125, 1, 0, 0, 0, 592, 593, 5, 28, 0, 0, 593, 594, 3, 30, 15, 0, 594, 595, 5, 73, 0, 0, 595, 596, 3, 58, 29, 0, 596, 127, 1, 0, 0, 0, 597, 598, 5, 22, 0, 0, 598, 599, 5, 116, 0, 0, 599, 602, 3, 46, 23, 0, 600, 601, 5, 57, 0, 0, 601, 603, 3, 16, 8, 0, 602, 600, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 611, 1, 0, 0, 0, 604, 605, 5, 23, 0, 0, 605, 608, 3, 46, 23, 0, 606, 607, 5, 57, 0, 0, 607, 609, 3, 16, 8, 0, 608, 606, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 611, 1, 0, 0, 0, 610, 597, 1, 0, 0, 0, 610, 604, 1, 0, 0, 0, 611, 129, 1, 0, 0, 0, 612, 613, 5, 32, 0, 0, 613, 614, 3, 58, 29, 0, 614, 131, 1, 0, 0, 0, 615, 617, 5, 21, 0, 0, 616, 618, 3, 60, 30, 0, 617, 616, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 620, 3, 90, 45, 0, 620, 133, 1, 0, 0, 0, 621, 622, 5, 34, 0, 0, 622, 623, 3, 136, 68, 0, 623, 624, 5, 60, 0, 0, 624, 135, 1, 0, 0, 0, 625, 626, 3, 60, 30, 0, 626, 627, 5, 56, 0, 0, 627, 628, 3, 160, 80, 0, 628, 137, 1, 0, 0, 0, 629, 630, 6, 69, -1, 0, 630, 631, 5, 70, 0, 0, 631, 659, 3, 138, 69, 8, 632, 659, 3, 144, 72, 0, 633, 659, 3, 140, 70, 0, 634, 636, 3, 144, 72, 0, 635, 637, 5, 70, 0, 0, 636, 635, 1, 0, 0, 0, 636, 637, 1, 0, 0, 0, 637, 638, 1, 0, 0, 0, 638, 639, 5, 66, 0, 0, 639, 640, 5, 98, 0, 0, 640, 645, 3, 144, 72, 0, 641, 642, 5, 61, 0, 0, 642, 644, 3, 144, 72, 0, 643, 641, 1, 0, 0, 0, 644, 647, 1, 0, 0, 0, 645, 643, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 648, 1, 0, 0, 0, 647, 645, 1, 0, 0, 0, 648, 649, 5, 99, 0, 0, 649, 659, 1, 0, 0, 0, 650, 651, 3, 144, 72, 0, 651, 653, 5, 67, 0, 0, 652, 654, 5, 70, 0, 0, 653, 652, 1, 0, 0, 0, 653, 654, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 656, 5, 71, 0, 0, 656, 659, 1, 0, 0, 0, 657, 659, 3, 142, 71, 0, 658, 629, 1, 0, 0, 0, 658, 632, 1, 0, 0, 0, 658, 633, 1, 0, 0, 0, 658, 634, 1, 0, 0, 0, 658, 650, 1, 0, 0, 0, 658, 657, 1, 0, 0, 0, 659, 668, 1, 0, 0, 0, 660, 661, 10, 5, 0, 0, 661, 662, 5, 54, 0, 0, 662, 667, 3, 138, 69, 6, 663, 664, 10, 4, 0, 0, 664, 665, 5, 74, 0, 0, 665, 667, 3, 138, 69, 5, 666, 660, 1, 0, 0, 0, 666, 663, 1, 0, 0, 0, 667, 670, 1, 0, 0, 0, 668, 666, 1, 0, 0, 0, 668, 669, 1, 0, 0, 0, 669, 139, 1, 0, 0, 0, 670, 668, 1, 0, 0, 0, 671, 673, 3, 144, 72, 0, 672, 674, 5, 70, 0, 0, 673, 672, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 675, 1, 0, 0, 0, 675, 676, 5, 69, 0, 0, 676, 677, 3, 170, 85, 0, 677, 718, 1, 0, 0, 0, 678, 680, 3, 144, 72, 0, 679, 681, 5, 70, 0, 0, 680, 679, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 682, 1, 0, 0, 0, 682, 683, 5, 76, 0, 0, 683, 684, 3, 170, 85, 0, 684, 718, 1, 0, 0, 0, 685, 687, 3, 144, 72, 0, 686, 688, 5, 70, 0, 0, 687, 686, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 689, 1, 0, 0, 0, 689, 690, 5, 69, 0, 0, 690, 691, 5, 98, 0, 0, 691, 696, 3, 170, 85, 0, 692, 693, 5, 61, 0, 0, 693, 695, 3, 170, 85, 0, 694, 692, 1, 0, 0, 0, 695, 698, 1, 0, 0, 0, 696, 694, 1, 0, 0, 0, 696, 697, 1, 0, 0, 0, 697, 699, 1, 0, 0, 0, 698, 696, 1, 0, 0, 0, 699, 700, 5, 99, 0, 0, 700, 718, 1, 0, 0, 0, 701, 703, 3, 144, 72, 0, 702, 704, 5, 70, 0, 0, 703, 702, 1, 0, 0, 0, 703, 704, 1, 0, 0, 0, 704, 705, 1, 0, 0, 0, 705, 706, 5, 76, 0, 0, 706, 707, 5, 98, 0, 0, 707, 712, 3, 170, 85, 0, 708, 709, 5, 61, 0, 0, 709, 711, 3, 170, 85, 0, 710, 708, 1, 0, 0, 0, 711, 714, 1, 0, 0, 0, 712, 710, 1, 0, 0, 0, 712, 713, 1, 0, 0, 0, 713, 715, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 715, 716, 5, 99, 0, 0, 716, 718, 1, 0, 0, 0, 717, 671, 1, 0, 0, 0, 717, 678, 1, 0, 0, 0, 717, 685, 1, 0, 0, 0, 717, 701, 1, 0, 0, 0, 718, 141, 1, 0, 0, 0, 719, 722, 3, 50, 25, 0, 720, 721, 5, 58, 0, 0, 721, 723, 3, 12, 6, 0, 722, 720, 1, 0, 0, 0, 722, 723, 1, 0, 0, 0, 723, 724, 1, 0, 0, 0, 724, 725, 5, 59, 0, 0, 725, 726, 3, 160, 80, 0, 726, 143, 1, 0, 0, 0, 727, 733, 3, 146, 73, 0, 728, 729, 3, 146, 73, 0, 729, 730, 3, 172, 86, 0, 730, 731, 3, 146, 73, 0, 731, 733, 1, 0, 0, 0, 732, 727, 1, 0, 0, 0, 732, 728, 1, 0, 0, 0, 733, 145, 1, 0, 0, 0, 734, 735, 6, 73, -1, 0, 735, 739, 3, 148, 74, 0, 736, 737, 7, 5, 0, 0, 737, 739, 3, 146, 73, 3, 738, 734, 1, 0, 0, 0, 738, 736, 1, 0, 0, 0, 739, 748, 1, 0, 0, 0, 740, 741, 10, 2, 0, 0, 741, 742, 7, 6, 0, 0, 742, 747, 3, 146, 73, 3, 743, 744, 10, 1, 0, 0, 744, 745, 7, 5, 0, 0, 745, 747, 3, 146, 73, 2, 746, 740, 1, 0, 0, 0, 746, 743, 1, 0, 0, 0, 747, 750, 1, 0, 0, 0, 748, 746, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 147, 1, 0, 0, 0, 750, 748, 1, 0, 0, 0, 751, 752, 6, 74, -1, 0, 752, 760, 3, 160, 80, 0, 753, 760, 3, 50, 25, 0, 754, 760, 3, 150, 75, 0, 755, 756, 5, 98, 0, 0, 756, 757, 3, 138, 69, 0, 757, 758, 5, 99, 0, 0, 758, 760, 1, 0, 0, 0, 759, 751, 1, 0, 0, 0, 759, 753, 1, 0, 0, 0, 759, 754, 1, 0, 0, 0, 759, 755, 1, 0, 0, 0, 760, 766, 1, 0, 0, 0, 761, 762, 10, 1, 0, 0, 762, 763, 5, 58, 0, 0, 763, 765, 3, 12, 6, 0, 764, 761, 1, 0, 0, 0, 765, 768, 1, 0, 0, 0, 766, 764, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 149, 1, 0, 0, 0, 768, 766, 1, 0, 0, 0, 769, 770, 3, 152, 76, 0, 770, 784, 5, 98, 0, 0, 771, 785, 5, 88, 0, 0, 772, 777, 3, 138, 69, 0, 773, 774, 5, 61, 0, 0, 774, 776, 3, 138, 69, 0, 775, 773, 1, 0, 0, 0, 776, 779, 1, 0, 0, 0, 777, 775, 1, 0, 0, 0, 777, 778, 1, 0, 0, 0, 778, 782, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 780, 781, 5, 61, 0, 0, 781, 783, 3, 154, 77, 0, 782, 780, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 785, 1, 0, 0, 0, 784, 771, 1, 0, 0, 0, 784, 772, 1, 0, 0, 0, 784, 785, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 787, 5, 99, 0, 0, 787, 151, 1, 0, 0, 0, 788, 792, 3, 68, 34, 0, 789, 792, 5, 65, 0, 0, 790, 792, 5, 68, 0, 0, 791, 788, 1, 0, 0, 0, 791, 789, 1, 0, 0, 0, 791, 790, 1, 0, 0, 0, 792, 153, 1, 0, 0, 0, 793, 802, 5, 91, 0, 0, 794, 799, 3, 156, 78, 0, 795, 796, 5, 61, 0, 0, 796, 798, 3, 156, 78, 0, 797, 795, 1, 0, 0, 0, 798, 801, 1, 0, 0, 0, 799, 797, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 803, 1, 0, 0, 0, 801, 799, 1, 0, 0, 0, 802, 794, 1, 0, 0, 0, 802, 803, 1, 0, 0, 0, 803, 804, 1, 0, 0, 0, 804, 805, 5, 92, 0, 0, 805, 155, 1, 0, 0, 0, 806, 807, 3, 170, 85, 0, 807, 808, 5, 59, 0, 0, 808, 809, 3, 158, 79, 0, 809, 157, 1, 0, 0, 0, 810, 813, 3, 160, 80, 0, 811, 813, 3, 154, 77, 0, 812, 810, 1, 0, 0, 0, 812, 811, 1, 0, 0, 0, 813, 159, 1, 0, 0, 0, 814, 857, 5, 71, 0, 0, 815, 816, 3, 168, 84, 0, 816, 817, 5, 100, 0, 0, 817, 857, 1, 0, 0, 0, 818, 857, 3, 166, 83, 0, 819, 857, 3, 168, 84, 0, 820, 857, 3, 162, 81, 0, 821, 857, 3, 64, 32, 0, 822, 857, 3, 170, 85, 0, 823, 824, 5, 96, 0, 0, 824, 829, 3, 164, 82, 0, 825, 826, 5, 61, 0, 0, 826, 828, 3, 164, 82, 0, 827, 825, 1, 0, 0, 0, 828, 831, 1, 0, 0, 0, 829, 827, 1, 0, 0, 0, 829, 830, 1, 0, 0, 0, 830, 832, 1, 0, 0, 0, 831, 829, 1, 0, 0, 0, 832, 833, 5, 97, 0, 0, 833, 857, 1, 0, 0, 0, 834, 835, 5, 96, 0, 0, 835, 840, 3, 162, 81, 0, 836, 837, 5, 61, 0, 0, 837, 839, 3, 162, 81, 0, 838, 836, 1, 0, 0, 0, 839, 842, 1, 0, 0, 0, 840, 838, 1, 0, 0, 0, 840, 841, 1, 0, 0, 0, 841, 843, 1, 0, 0, 0, 842, 840, 1, 0, 0, 0, 843, 844, 5, 97, 0, 0, 844, 857, 1, 0, 0, 0, 845, 846, 5, 96, 0, 0, 846, 851, 3, 170, 85, 0, 847, 848, 5, 61, 0, 0, 848, 850, 3, 170, 85, 0, 849, 847, 1, 0, 0, 0, 850, 853, 1, 0, 0, 0, 851, 849, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 854, 1, 0, 0, 0, 853, 851, 1, 0, 0, 0, 854, 855, 5, 97, 0, 0, 855, 857, 1, 0, 0, 0, 856, 814, 1, 0, 0, 0, 856, 815, 1, 0, 0, 0, 856, 818, 1, 0, 0, 0, 856, 819, 1, 0, 0, 0, 856, 820, 1, 0, 0, 0, 856, 821, 1, 0, 0, 0, 856, 822, 1, 0, 0, 0, 856, 823, 1, 0, 0, 0, 856, 834, 1, 0, 0, 0, 856, 845, 1, 0, 0, 0, 857, 161, 1, 0, 0, 0, 858, 859, 7, 7, 0, 0, 859, 163, 1, 0, 0, 0, 860, 863, 3, 166, 83, 0, 861, 863, 3, 168, 84, 0, 862, 860, 1, 0, 0, 0, 862, 861, 1, 0, 0, 0, 863, 165, 1, 0, 0, 0, 864, 866, 7, 5, 0, 0, 865, 864, 1, 0, 0, 0, 865, 866, 1, 0, 0, 0, 866, 867, 1, 0, 0, 0, 867, 868, 5, 53, 0, 0, 868, 167, 1, 0, 0, 0, 869, 871, 7, 5, 0, 0, 870, 869, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 872, 1, 0, 0, 0, 872, 873, 5, 52, 0, 0, 873, 169, 1, 0, 0, 0, 874, 875, 5, 51, 0, 0, 875, 171, 1, 0, 0, 0, 876, 877, 7, 8, 0, 0, 877, 173, 1, 0, 0, 0, 878, 879, 7, 9, 0, 0, 879, 880, 5, 120, 0, 0, 880, 881, 3, 176, 88, 0, 881, 882, 3, 178, 89, 0, 882, 175, 1, 0, 0, 0, 883, 884, 4, 88, 15, 0, 884, 886, 3, 30, 15, 0, 885, 887, 5, 138, 0, 0, 886, 885, 1, 0, 0, 0, 886, 887, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 889, 5, 106, 0, 0, 889, 892, 1, 0, 0, 0, 890, 892, 3, 30, 15, 0, 891, 883, 1, 0, 0, 0, 891, 890, 1, 0, 0, 0, 892, 177, 1, 0, 0, 0, 893, 894, 5, 73, 0, 0, 894, 899, 3, 138, 69, 0, 895, 896, 5, 61, 0, 0, 896, 898, 3, 138, 69, 0, 897, 895, 1, 0, 0, 0, 898, 901, 1, 0, 0, 0, 899, 897, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 179, 1, 0, 0, 0, 901, 899, 1, 0, 0, 0, 87, 184, 192, 205, 214, 242, 257, 263, 272, 278, 291, 295, 306, 322, 330, 334, 341, 347, 352, 361, 368, 374, 383, 390, 398, 406, 410, 414, 419, 430, 435, 439, 453, 464, 470, 477, 486, 509, 517, 520, 527, 538, 545, 553, 567, 576, 587, 602, 608, 610, 617, 636, 645, 653, 658, 666, 668, 673, 680, 687, 696, 703, 712, 717, 722, 732, 738, 746, 748, 759, 766, 777, 782, 784, 791, 799, 802, 812, 829, 840, 851, 856, 862, 865, 870, 886, 891, 899] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java index e8c866757fd82..8c2eb80d93b1c 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java @@ -27,33 +27,34 @@ public class EsqlBaseParser extends ParserConfig { public static final int LINE_COMMENT=1, MULTILINE_COMMENT=2, WS=3, CHANGE_POINT=4, ENRICH=5, DEV_EXPLAIN=6, COMPLETION=7, DISSECT=8, EVAL=9, GROK=10, LIMIT=11, RERANK=12, ROW=13, - SAMPLE=14, SORT=15, STATS=16, WHERE=17, DEV_INLINESTATS=18, FROM=19, TS=20, - FORK=21, DEV_FUSE=22, JOIN_LOOKUP=23, DEV_JOIN_FULL=24, DEV_JOIN_LEFT=25, - DEV_JOIN_RIGHT=26, DEV_LOOKUP=27, MV_EXPAND=28, DROP=29, KEEP=30, DEV_INSIST=31, - RENAME=32, SET=33, SHOW=34, UNKNOWN_CMD=35, CHANGE_POINT_LINE_COMMENT=36, - CHANGE_POINT_MULTILINE_COMMENT=37, CHANGE_POINT_WS=38, ENRICH_POLICY_NAME=39, - ENRICH_LINE_COMMENT=40, ENRICH_MULTILINE_COMMENT=41, ENRICH_WS=42, ENRICH_FIELD_LINE_COMMENT=43, - ENRICH_FIELD_MULTILINE_COMMENT=44, ENRICH_FIELD_WS=45, EXPLAIN_WS=46, - EXPLAIN_LINE_COMMENT=47, EXPLAIN_MULTILINE_COMMENT=48, PIPE=49, QUOTED_STRING=50, - INTEGER_LITERAL=51, DECIMAL_LITERAL=52, AND=53, ASC=54, ASSIGN=55, BY=56, - CAST_OP=57, COLON=58, SEMICOLON=59, COMMA=60, DESC=61, DOT=62, FALSE=63, - FIRST=64, IN=65, IS=66, LAST=67, LIKE=68, NOT=69, NULL=70, NULLS=71, ON=72, - OR=73, PARAM=74, RLIKE=75, TRUE=76, WITH=77, EQ=78, CIEQ=79, NEQ=80, LT=81, - LTE=82, GT=83, GTE=84, PLUS=85, MINUS=86, ASTERISK=87, SLASH=88, PERCENT=89, - LEFT_BRACES=90, RIGHT_BRACES=91, DOUBLE_PARAMS=92, NAMED_OR_POSITIONAL_PARAM=93, - NAMED_OR_POSITIONAL_DOUBLE_PARAMS=94, OPENING_BRACKET=95, CLOSING_BRACKET=96, - LP=97, RP=98, UNQUOTED_IDENTIFIER=99, QUOTED_IDENTIFIER=100, EXPR_LINE_COMMENT=101, - EXPR_MULTILINE_COMMENT=102, EXPR_WS=103, METADATA=104, UNQUOTED_SOURCE=105, - FROM_LINE_COMMENT=106, FROM_MULTILINE_COMMENT=107, FROM_WS=108, FORK_WS=109, - FORK_LINE_COMMENT=110, FORK_MULTILINE_COMMENT=111, FUSE_LINE_COMMENT=112, - FUSE_MULTILINE_COMMENT=113, FUSE_WS=114, JOIN=115, USING=116, JOIN_LINE_COMMENT=117, - JOIN_MULTILINE_COMMENT=118, JOIN_WS=119, LOOKUP_LINE_COMMENT=120, LOOKUP_MULTILINE_COMMENT=121, - LOOKUP_WS=122, LOOKUP_FIELD_LINE_COMMENT=123, LOOKUP_FIELD_MULTILINE_COMMENT=124, - LOOKUP_FIELD_WS=125, MVEXPAND_LINE_COMMENT=126, MVEXPAND_MULTILINE_COMMENT=127, - MVEXPAND_WS=128, ID_PATTERN=129, PROJECT_LINE_COMMENT=130, PROJECT_MULTILINE_COMMENT=131, - PROJECT_WS=132, AS=133, RENAME_LINE_COMMENT=134, RENAME_MULTILINE_COMMENT=135, - RENAME_WS=136, SET_LINE_COMMENT=137, SET_MULTILINE_COMMENT=138, SET_WS=139, - INFO=140, SHOW_LINE_COMMENT=141, SHOW_MULTILINE_COMMENT=142, SHOW_WS=143; + SAMPLE=14, SORT=15, STATS=16, WHERE=17, FROM=18, TS=19, FORK=20, DEV_FUSE=21, + DEV_INLINE=22, DEV_INLINESTATS=23, JOIN_LOOKUP=24, DEV_JOIN_FULL=25, DEV_JOIN_LEFT=26, + DEV_JOIN_RIGHT=27, DEV_LOOKUP=28, MV_EXPAND=29, DROP=30, KEEP=31, DEV_INSIST=32, + RENAME=33, SET=34, SHOW=35, UNKNOWN_CMD=36, CHANGE_POINT_LINE_COMMENT=37, + CHANGE_POINT_MULTILINE_COMMENT=38, CHANGE_POINT_WS=39, ENRICH_POLICY_NAME=40, + ENRICH_LINE_COMMENT=41, ENRICH_MULTILINE_COMMENT=42, ENRICH_WS=43, ENRICH_FIELD_LINE_COMMENT=44, + ENRICH_FIELD_MULTILINE_COMMENT=45, ENRICH_FIELD_WS=46, EXPLAIN_WS=47, + EXPLAIN_LINE_COMMENT=48, EXPLAIN_MULTILINE_COMMENT=49, PIPE=50, QUOTED_STRING=51, + INTEGER_LITERAL=52, DECIMAL_LITERAL=53, AND=54, ASC=55, ASSIGN=56, BY=57, + CAST_OP=58, COLON=59, SEMICOLON=60, COMMA=61, DESC=62, DOT=63, FALSE=64, + FIRST=65, IN=66, IS=67, LAST=68, LIKE=69, NOT=70, NULL=71, NULLS=72, ON=73, + OR=74, PARAM=75, RLIKE=76, TRUE=77, WITH=78, EQ=79, CIEQ=80, NEQ=81, LT=82, + LTE=83, GT=84, GTE=85, PLUS=86, MINUS=87, ASTERISK=88, SLASH=89, PERCENT=90, + LEFT_BRACES=91, RIGHT_BRACES=92, DOUBLE_PARAMS=93, NAMED_OR_POSITIONAL_PARAM=94, + NAMED_OR_POSITIONAL_DOUBLE_PARAMS=95, OPENING_BRACKET=96, CLOSING_BRACKET=97, + LP=98, RP=99, UNQUOTED_IDENTIFIER=100, QUOTED_IDENTIFIER=101, EXPR_LINE_COMMENT=102, + EXPR_MULTILINE_COMMENT=103, EXPR_WS=104, METADATA=105, UNQUOTED_SOURCE=106, + FROM_LINE_COMMENT=107, FROM_MULTILINE_COMMENT=108, FROM_WS=109, FORK_WS=110, + FORK_LINE_COMMENT=111, FORK_MULTILINE_COMMENT=112, FUSE_LINE_COMMENT=113, + FUSE_MULTILINE_COMMENT=114, FUSE_WS=115, INLINE_STATS=116, INLINE_LINE_COMMENT=117, + INLINE_MULTILINE_COMMENT=118, INLINE_WS=119, JOIN=120, USING=121, JOIN_LINE_COMMENT=122, + JOIN_MULTILINE_COMMENT=123, JOIN_WS=124, LOOKUP_LINE_COMMENT=125, LOOKUP_MULTILINE_COMMENT=126, + LOOKUP_WS=127, LOOKUP_FIELD_LINE_COMMENT=128, LOOKUP_FIELD_MULTILINE_COMMENT=129, + LOOKUP_FIELD_WS=130, MVEXPAND_LINE_COMMENT=131, MVEXPAND_MULTILINE_COMMENT=132, + MVEXPAND_WS=133, ID_PATTERN=134, PROJECT_LINE_COMMENT=135, PROJECT_MULTILINE_COMMENT=136, + PROJECT_WS=137, AS=138, RENAME_LINE_COMMENT=139, RENAME_MULTILINE_COMMENT=140, + RENAME_WS=141, SET_LINE_COMMENT=142, SET_MULTILINE_COMMENT=143, SET_WS=144, + INFO=145, SHOW_LINE_COMMENT=146, SHOW_MULTILINE_COMMENT=147, SHOW_WS=148; public static final int RULE_statements = 0, RULE_singleStatement = 1, RULE_query = 2, RULE_sourceCommand = 3, RULE_processingCommand = 4, RULE_whereCommand = 5, RULE_dataType = 6, @@ -75,7 +76,7 @@ public class EsqlBaseParser extends ParserConfig { RULE_changePointCommand = 55, RULE_forkCommand = 56, RULE_forkSubQueries = 57, RULE_forkSubQuery = 58, RULE_forkSubQueryCommand = 59, RULE_forkSubQueryProcessingCommand = 60, RULE_rerankCommand = 61, RULE_completionCommand = 62, RULE_lookupCommand = 63, - RULE_inlinestatsCommand = 64, RULE_insistCommand = 65, RULE_fuseCommand = 66, + RULE_inlineStatsCommand = 64, RULE_insistCommand = 65, RULE_fuseCommand = 66, RULE_setCommand = 67, RULE_setField = 68, RULE_booleanExpression = 69, RULE_regexBooleanExpression = 70, RULE_matchBooleanExpression = 71, RULE_valueExpression = 72, RULE_operatorExpression = 73, RULE_primaryExpression = 74, RULE_functionExpression = 75, @@ -99,7 +100,7 @@ private static String[] makeRuleNames() { "showCommand", "enrichCommand", "enrichPolicyName", "enrichWithClause", "sampleCommand", "changePointCommand", "forkCommand", "forkSubQueries", "forkSubQuery", "forkSubQueryCommand", "forkSubQueryProcessingCommand", - "rerankCommand", "completionCommand", "lookupCommand", "inlinestatsCommand", + "rerankCommand", "completionCommand", "lookupCommand", "inlineStatsCommand", "insistCommand", "fuseCommand", "setCommand", "setField", "booleanExpression", "regexBooleanExpression", "matchBooleanExpression", "valueExpression", "operatorExpression", "primaryExpression", "functionExpression", "functionName", @@ -114,7 +115,7 @@ private static String[] makeLiteralNames() { return new String[] { null, null, null, null, "'change_point'", "'enrich'", null, "'completion'", "'dissect'", "'eval'", "'grok'", "'limit'", "'rerank'", "'row'", "'sample'", - "'sort'", "'stats'", "'where'", null, "'from'", "'ts'", "'fork'", null, + "'sort'", null, "'where'", "'from'", "'ts'", "'fork'", null, null, null, "'lookup'", null, null, null, null, "'mv_expand'", "'drop'", "'keep'", null, "'rename'", "'set'", "'show'", null, null, null, null, null, null, null, null, null, null, null, null, null, null, "'|'", null, null, null, @@ -124,9 +125,9 @@ private static String[] makeLiteralNames() { "'=='", "'=~'", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", "'??'", null, null, null, "']'", null, "')'", null, null, null, null, null, "'metadata'", null, null, null, null, null, - null, null, null, null, null, "'join'", "'USING'", null, null, null, + null, null, null, null, null, null, null, null, null, "'join'", "'USING'", null, null, null, null, null, null, null, null, null, null, null, null, - null, "'as'", null, null, null, null, null, null, "'info'" + null, null, null, null, "'as'", null, null, null, null, null, null, "'info'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -134,8 +135,8 @@ private static String[] makeSymbolicNames() { return new String[] { null, "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "CHANGE_POINT", "ENRICH", "DEV_EXPLAIN", "COMPLETION", "DISSECT", "EVAL", "GROK", "LIMIT", "RERANK", - "ROW", "SAMPLE", "SORT", "STATS", "WHERE", "DEV_INLINESTATS", "FROM", - "TS", "FORK", "DEV_FUSE", "JOIN_LOOKUP", "DEV_JOIN_FULL", "DEV_JOIN_LEFT", + "ROW", "SAMPLE", "SORT", "STATS", "WHERE", "FROM", "TS", "FORK", "DEV_FUSE", + "DEV_INLINE", "DEV_INLINESTATS", "JOIN_LOOKUP", "DEV_JOIN_FULL", "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "DEV_LOOKUP", "MV_EXPAND", "DROP", "KEEP", "DEV_INSIST", "RENAME", "SET", "SHOW", "UNKNOWN_CMD", "CHANGE_POINT_LINE_COMMENT", "CHANGE_POINT_MULTILINE_COMMENT", "CHANGE_POINT_WS", "ENRICH_POLICY_NAME", @@ -152,7 +153,8 @@ private static String[] makeSymbolicNames() { "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", "FORK_WS", "FORK_LINE_COMMENT", "FORK_MULTILINE_COMMENT", "FUSE_LINE_COMMENT", - "FUSE_MULTILINE_COMMENT", "FUSE_WS", "JOIN", "USING", "JOIN_LINE_COMMENT", + "FUSE_MULTILINE_COMMENT", "FUSE_WS", "INLINE_STATS", "INLINE_LINE_COMMENT", + "INLINE_MULTILINE_COMMENT", "INLINE_WS", "JOIN", "USING", "JOIN_LINE_COMMENT", "JOIN_MULTILINE_COMMENT", "JOIN_WS", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", "LOOKUP_WS", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", "LOOKUP_FIELD_WS", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", @@ -628,8 +630,8 @@ public ForkCommandContext forkCommand() { public RerankCommandContext rerankCommand() { return getRuleContext(RerankCommandContext.class,0); } - public InlinestatsCommandContext inlinestatsCommand() { - return getRuleContext(InlinestatsCommandContext.class,0); + public InlineStatsCommandContext inlineStatsCommand() { + return getRuleContext(InlineStatsCommandContext.class,0); } public LookupCommandContext lookupCommand() { return getRuleContext(LookupCommandContext.class,0); @@ -799,7 +801,7 @@ public final ProcessingCommandContext processingCommand() throws RecognitionExce setState(234); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); setState(235); - inlinestatsCommand(); + inlineStatsCommand(); } break; case 20: @@ -4735,10 +4737,11 @@ public final LookupCommandContext lookupCommand() throws RecognitionException { } @SuppressWarnings("CheckReturnValue") - public static class InlinestatsCommandContext extends ParserRuleContext { + public static class InlineStatsCommandContext extends ParserRuleContext { public AggFieldsContext stats; public FieldsContext grouping; - public TerminalNode DEV_INLINESTATS() { return getToken(EsqlBaseParser.DEV_INLINESTATS, 0); } + public TerminalNode DEV_INLINE() { return getToken(EsqlBaseParser.DEV_INLINE, 0); } + public TerminalNode INLINE_STATS() { return getToken(EsqlBaseParser.INLINE_STATS, 0); } public AggFieldsContext aggFields() { return getRuleContext(AggFieldsContext.class,0); } @@ -4746,48 +4749,80 @@ public AggFieldsContext aggFields() { public FieldsContext fields() { return getRuleContext(FieldsContext.class,0); } + public TerminalNode DEV_INLINESTATS() { return getToken(EsqlBaseParser.DEV_INLINESTATS, 0); } @SuppressWarnings("this-escape") - public InlinestatsCommandContext(ParserRuleContext parent, int invokingState) { + public InlineStatsCommandContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_inlinestatsCommand; } + @Override public int getRuleIndex() { return RULE_inlineStatsCommand; } @Override public void enterRule(ParseTreeListener listener) { - if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).enterInlinestatsCommand(this); + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).enterInlineStatsCommand(this); } @Override public void exitRule(ParseTreeListener listener) { - if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).exitInlinestatsCommand(this); + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).exitInlineStatsCommand(this); } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof EsqlBaseParserVisitor ) return ((EsqlBaseParserVisitor)visitor).visitInlinestatsCommand(this); + if ( visitor instanceof EsqlBaseParserVisitor ) return ((EsqlBaseParserVisitor)visitor).visitInlineStatsCommand(this); else return visitor.visitChildren(this); } } - public final InlinestatsCommandContext inlinestatsCommand() throws RecognitionException { - InlinestatsCommandContext _localctx = new InlinestatsCommandContext(_ctx, getState()); - enterRule(_localctx, 128, RULE_inlinestatsCommand); + public final InlineStatsCommandContext inlineStatsCommand() throws RecognitionException { + InlineStatsCommandContext _localctx = new InlineStatsCommandContext(_ctx, getState()); + enterRule(_localctx, 128, RULE_inlineStatsCommand); try { - enterOuterAlt(_localctx, 1); - { - setState(597); - match(DEV_INLINESTATS); - setState(598); - ((InlinestatsCommandContext)_localctx).stats = aggFields(); - setState(601); + setState(610); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { - case 1: + switch (_input.LA(1)) { + case DEV_INLINE: + enterOuterAlt(_localctx, 1); { + setState(597); + match(DEV_INLINE); + setState(598); + match(INLINE_STATS); setState(599); - match(BY); - setState(600); - ((InlinestatsCommandContext)_localctx).grouping = fields(); + ((InlineStatsCommandContext)_localctx).stats = aggFields(); + setState(602); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { + case 1: + { + setState(600); + match(BY); + setState(601); + ((InlineStatsCommandContext)_localctx).grouping = fields(); + } + break; + } } break; - } + case DEV_INLINESTATS: + enterOuterAlt(_localctx, 2); + { + setState(604); + match(DEV_INLINESTATS); + setState(605); + ((InlineStatsCommandContext)_localctx).stats = aggFields(); + setState(608); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + case 1: + { + setState(606); + match(BY); + setState(607); + ((InlineStatsCommandContext)_localctx).grouping = fields(); + } + break; + } + } + break; + default: + throw new NoViableAltException(this); } } catch (RecognitionException re) { @@ -4833,9 +4868,9 @@ public final InsistCommandContext insistCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(603); + setState(612); match(DEV_INSIST); - setState(604); + setState(613); qualifiedNamePatterns(); } } @@ -4887,19 +4922,19 @@ public final FuseCommandContext fuseCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(606); + setState(615); match(DEV_FUSE); - setState(608); + setState(617); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { case 1: { - setState(607); + setState(616); ((FuseCommandContext)_localctx).fuseType = identifier(); } break; } - setState(610); + setState(619); ((FuseCommandContext)_localctx).fuseOptions = commandNamedParameters(); } } @@ -4947,11 +4982,11 @@ public final SetCommandContext setCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(612); + setState(621); match(SET); - setState(613); + setState(622); setField(); - setState(614); + setState(623); match(SEMICOLON); } } @@ -5001,11 +5036,11 @@ public final SetFieldContext setField() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(616); + setState(625); identifier(); - setState(617); + setState(626); match(ASSIGN); - setState(618); + setState(627); constant(); } } @@ -5221,18 +5256,18 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc int _alt; enterOuterAlt(_localctx, 1); { - setState(649); + setState(658); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { case 1: { _localctx = new LogicalNotContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(621); + setState(630); match(NOT); - setState(622); + setState(631); booleanExpression(8); } break; @@ -5241,7 +5276,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new BooleanDefaultContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(623); + setState(632); valueExpression(); } break; @@ -5250,7 +5285,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new RegexExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(624); + setState(633); regexBooleanExpression(); } break; @@ -5259,41 +5294,41 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalInContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(625); + setState(634); valueExpression(); - setState(627); + setState(636); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(626); + setState(635); match(NOT); } } - setState(629); + setState(638); match(IN); - setState(630); + setState(639); match(LP); - setState(631); + setState(640); valueExpression(); - setState(636); + setState(645); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(632); + setState(641); match(COMMA); - setState(633); + setState(642); valueExpression(); } } - setState(638); + setState(647); _errHandler.sync(this); _la = _input.LA(1); } - setState(639); + setState(648); match(RP); } break; @@ -5302,21 +5337,21 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new IsNullContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(641); + setState(650); valueExpression(); - setState(642); + setState(651); match(IS); - setState(644); + setState(653); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(643); + setState(652); match(NOT); } } - setState(646); + setState(655); match(NULL); } break; @@ -5325,33 +5360,33 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new MatchExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(648); + setState(657); matchBooleanExpression(); } break; } _ctx.stop = _input.LT(-1); - setState(659); + setState(668); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,53,_ctx); + _alt = getInterpreter().adaptivePredict(_input,55,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(657); + setState(666); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { case 1: { _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(651); + setState(660); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(652); + setState(661); ((LogicalBinaryContext)_localctx).operator = match(AND); - setState(653); + setState(662); ((LogicalBinaryContext)_localctx).right = booleanExpression(6); } break; @@ -5360,20 +5395,20 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(654); + setState(663); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(655); + setState(664); ((LogicalBinaryContext)_localctx).operator = match(OR); - setState(656); + setState(665); ((LogicalBinaryContext)_localctx).right = booleanExpression(5); } break; } } } - setState(661); + setState(670); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,53,_ctx); + _alt = getInterpreter().adaptivePredict(_input,55,_ctx); } } } @@ -5530,28 +5565,28 @@ public final RegexBooleanExpressionContext regexBooleanExpression() throws Recog enterRule(_localctx, 140, RULE_regexBooleanExpression); int _la; try { - setState(708); + setState(717); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) { case 1: _localctx = new LikeExpressionContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(662); + setState(671); valueExpression(); - setState(664); + setState(673); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(663); + setState(672); match(NOT); } } - setState(666); + setState(675); match(LIKE); - setState(667); + setState(676); string(); } break; @@ -5559,21 +5594,21 @@ public final RegexBooleanExpressionContext regexBooleanExpression() throws Recog _localctx = new RlikeExpressionContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(669); + setState(678); valueExpression(); - setState(671); + setState(680); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(670); + setState(679); match(NOT); } } - setState(673); + setState(682); match(RLIKE); - setState(674); + setState(683); string(); } break; @@ -5581,41 +5616,41 @@ public final RegexBooleanExpressionContext regexBooleanExpression() throws Recog _localctx = new LikeListExpressionContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(676); + setState(685); valueExpression(); - setState(678); + setState(687); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(677); + setState(686); match(NOT); } } - setState(680); + setState(689); match(LIKE); - setState(681); + setState(690); match(LP); - setState(682); + setState(691); string(); - setState(687); + setState(696); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(683); + setState(692); match(COMMA); - setState(684); + setState(693); string(); } } - setState(689); + setState(698); _errHandler.sync(this); _la = _input.LA(1); } - setState(690); + setState(699); match(RP); } break; @@ -5623,41 +5658,41 @@ public final RegexBooleanExpressionContext regexBooleanExpression() throws Recog _localctx = new RlikeListExpressionContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(692); + setState(701); valueExpression(); - setState(694); + setState(703); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(693); + setState(702); match(NOT); } } - setState(696); + setState(705); match(RLIKE); - setState(697); + setState(706); match(LP); - setState(698); + setState(707); string(); - setState(703); + setState(712); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(699); + setState(708); match(COMMA); - setState(700); + setState(709); string(); } } - setState(705); + setState(714); _errHandler.sync(this); _la = _input.LA(1); } - setState(706); + setState(715); match(RP); } break; @@ -5717,23 +5752,23 @@ public final MatchBooleanExpressionContext matchBooleanExpression() throws Recog try { enterOuterAlt(_localctx, 1); { - setState(710); + setState(719); ((MatchBooleanExpressionContext)_localctx).fieldExp = qualifiedName(); - setState(713); + setState(722); _errHandler.sync(this); _la = _input.LA(1); if (_la==CAST_OP) { { - setState(711); + setState(720); match(CAST_OP); - setState(712); + setState(721); ((MatchBooleanExpressionContext)_localctx).fieldType = dataType(); } } - setState(715); + setState(724); match(COLON); - setState(716); + setState(725); ((MatchBooleanExpressionContext)_localctx).matchQuery = constant(); } } @@ -5817,14 +5852,14 @@ public final ValueExpressionContext valueExpression() throws RecognitionExceptio ValueExpressionContext _localctx = new ValueExpressionContext(_ctx, getState()); enterRule(_localctx, 144, RULE_valueExpression); try { - setState(723); + setState(732); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { case 1: _localctx = new ValueExpressionDefaultContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(718); + setState(727); operatorExpression(0); } break; @@ -5832,11 +5867,11 @@ public final ValueExpressionContext valueExpression() throws RecognitionExceptio _localctx = new ComparisonContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(719); + setState(728); ((ComparisonContext)_localctx).left = operatorExpression(0); - setState(720); + setState(729); comparisonOperator(); - setState(721); + setState(730); ((ComparisonContext)_localctx).right = operatorExpression(0); } break; @@ -5961,16 +5996,16 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE int _alt; enterOuterAlt(_localctx, 1); { - setState(729); + setState(738); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: { _localctx = new OperatorExpressionDefaultContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(726); + setState(735); primaryExpression(0); } break; @@ -5979,7 +6014,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(727); + setState(736); ((ArithmeticUnaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -5990,34 +6025,34 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(728); + setState(737); operatorExpression(3); } break; } _ctx.stop = _input.LT(-1); - setState(739); + setState(748); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,65,_ctx); + _alt = getInterpreter().adaptivePredict(_input,67,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(737); + setState(746); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { case 1: { _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); - setState(731); + setState(740); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(732); + setState(741); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 87)) & ~0x3f) == 0 && ((1L << (_la - 87)) & 7L) != 0)) ) { + if ( !(((((_la - 88)) & ~0x3f) == 0 && ((1L << (_la - 88)) & 7L) != 0)) ) { ((ArithmeticBinaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this); } else { @@ -6025,7 +6060,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(733); + setState(742); ((ArithmeticBinaryContext)_localctx).right = operatorExpression(3); } break; @@ -6034,9 +6069,9 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); - setState(734); + setState(743); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(735); + setState(744); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -6047,16 +6082,16 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(736); + setState(745); ((ArithmeticBinaryContext)_localctx).right = operatorExpression(2); } break; } } } - setState(741); + setState(750); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,65,_ctx); + _alt = getInterpreter().adaptivePredict(_input,67,_ctx); } } } @@ -6212,16 +6247,16 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc int _alt; enterOuterAlt(_localctx, 1); { - setState(750); + setState(759); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { case 1: { _localctx = new ConstantDefaultContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(743); + setState(752); constant(); } break; @@ -6230,7 +6265,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new DereferenceContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(744); + setState(753); qualifiedName(); } break; @@ -6239,7 +6274,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new FunctionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(745); + setState(754); functionExpression(); } break; @@ -6248,19 +6283,19 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new ParenthesizedExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(746); + setState(755); match(LP); - setState(747); + setState(756); booleanExpression(0); - setState(748); + setState(757); match(RP); } break; } _ctx.stop = _input.LT(-1); - setState(757); + setState(766); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,67,_ctx); + _alt = getInterpreter().adaptivePredict(_input,69,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); @@ -6269,18 +6304,18 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc { _localctx = new InlineCastContext(new PrimaryExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpression); - setState(752); + setState(761); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(753); + setState(762); match(CAST_OP); - setState(754); + setState(763); dataType(); } } } - setState(759); + setState(768); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,67,_ctx); + _alt = getInterpreter().adaptivePredict(_input,69,_ctx); } } } @@ -6344,50 +6379,50 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx int _alt; enterOuterAlt(_localctx, 1); { - setState(760); + setState(769); functionName(); - setState(761); + setState(770); match(LP); - setState(775); + setState(784); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { case 1: { - setState(762); + setState(771); match(ASTERISK); } break; case 2: { { - setState(763); + setState(772); booleanExpression(0); - setState(768); + setState(777); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,68,_ctx); + _alt = getInterpreter().adaptivePredict(_input,70,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(764); + setState(773); match(COMMA); - setState(765); + setState(774); booleanExpression(0); } } } - setState(770); + setState(779); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,68,_ctx); + _alt = getInterpreter().adaptivePredict(_input,70,_ctx); } - setState(773); + setState(782); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(771); + setState(780); match(COMMA); - setState(772); + setState(781); mapExpression(); } } @@ -6396,7 +6431,7 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx } break; } - setState(777); + setState(786); match(RP); } } @@ -6442,7 +6477,7 @@ public final FunctionNameContext functionName() throws RecognitionException { FunctionNameContext _localctx = new FunctionNameContext(_ctx, getState()); enterRule(_localctx, 152, RULE_functionName); try { - setState(782); + setState(791); _errHandler.sync(this); switch (_input.LA(1)) { case PARAM: @@ -6453,21 +6488,21 @@ public final FunctionNameContext functionName() throws RecognitionException { case QUOTED_IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(779); + setState(788); identifierOrParameter(); } break; case FIRST: enterOuterAlt(_localctx, 2); { - setState(780); + setState(789); match(FIRST); } break; case LAST: enterOuterAlt(_localctx, 3); { - setState(781); + setState(790); match(LAST); } break; @@ -6527,35 +6562,35 @@ public final MapExpressionContext mapExpression() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(784); - match(LEFT_BRACES); setState(793); + match(LEFT_BRACES); + setState(802); _errHandler.sync(this); _la = _input.LA(1); if (_la==QUOTED_STRING) { { - setState(785); + setState(794); entryExpression(); - setState(790); + setState(799); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(786); + setState(795); match(COMMA); - setState(787); + setState(796); entryExpression(); } } - setState(792); + setState(801); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(795); + setState(804); match(RIGHT_BRACES); } } @@ -6607,11 +6642,11 @@ public final EntryExpressionContext entryExpression() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(797); + setState(806); ((EntryExpressionContext)_localctx).key = string(); - setState(798); + setState(807); match(COLON); - setState(799); + setState(808); ((EntryExpressionContext)_localctx).value = mapValue(); } } @@ -6658,7 +6693,7 @@ public final MapValueContext mapValue() throws RecognitionException { MapValueContext _localctx = new MapValueContext(_ctx, getState()); enterRule(_localctx, 158, RULE_mapValue); try { - setState(803); + setState(812); _errHandler.sync(this); switch (_input.LA(1)) { case QUOTED_STRING: @@ -6674,14 +6709,14 @@ public final MapValueContext mapValue() throws RecognitionException { case OPENING_BRACKET: enterOuterAlt(_localctx, 1); { - setState(801); + setState(810); constant(); } break; case LEFT_BRACES: enterOuterAlt(_localctx, 2); { - setState(802); + setState(811); mapExpression(); } break; @@ -6956,14 +6991,14 @@ public final ConstantContext constant() throws RecognitionException { enterRule(_localctx, 160, RULE_constant); int _la; try { - setState(847); + setState(856); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { case 1: _localctx = new NullLiteralContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(805); + setState(814); match(NULL); } break; @@ -6971,9 +7006,9 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new QualifiedIntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(806); + setState(815); integerValue(); - setState(807); + setState(816); match(UNQUOTED_IDENTIFIER); } break; @@ -6981,7 +7016,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new DecimalLiteralContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(809); + setState(818); decimalValue(); } break; @@ -6989,7 +7024,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new IntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(810); + setState(819); integerValue(); } break; @@ -6997,7 +7032,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanLiteralContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(811); + setState(820); booleanValue(); } break; @@ -7005,7 +7040,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new InputParameterContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(812); + setState(821); parameter(); } break; @@ -7013,7 +7048,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new StringLiteralContext(_localctx); enterOuterAlt(_localctx, 7); { - setState(813); + setState(822); string(); } break; @@ -7021,27 +7056,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new NumericArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(814); + setState(823); match(OPENING_BRACKET); - setState(815); + setState(824); numericValue(); - setState(820); + setState(829); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(816); + setState(825); match(COMMA); - setState(817); + setState(826); numericValue(); } } - setState(822); + setState(831); _errHandler.sync(this); _la = _input.LA(1); } - setState(823); + setState(832); match(CLOSING_BRACKET); } break; @@ -7049,27 +7084,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 9); { - setState(825); + setState(834); match(OPENING_BRACKET); - setState(826); + setState(835); booleanValue(); - setState(831); + setState(840); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(827); + setState(836); match(COMMA); - setState(828); + setState(837); booleanValue(); } } - setState(833); + setState(842); _errHandler.sync(this); _la = _input.LA(1); } - setState(834); + setState(843); match(CLOSING_BRACKET); } break; @@ -7077,27 +7112,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new StringArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 10); { - setState(836); + setState(845); match(OPENING_BRACKET); - setState(837); + setState(846); string(); - setState(842); + setState(851); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(838); + setState(847); match(COMMA); - setState(839); + setState(848); string(); } } - setState(844); + setState(853); _errHandler.sync(this); _la = _input.LA(1); } - setState(845); + setState(854); match(CLOSING_BRACKET); } break; @@ -7145,7 +7180,7 @@ public final BooleanValueContext booleanValue() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(849); + setState(858); _la = _input.LA(1); if ( !(_la==FALSE || _la==TRUE) ) { _errHandler.recoverInline(this); @@ -7200,20 +7235,20 @@ public final NumericValueContext numericValue() throws RecognitionException { NumericValueContext _localctx = new NumericValueContext(_ctx, getState()); enterRule(_localctx, 164, RULE_numericValue); try { - setState(853); + setState(862); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(851); + setState(860); decimalValue(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(852); + setState(861); integerValue(); } break; @@ -7262,12 +7297,12 @@ public final DecimalValueContext decimalValue() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(856); + setState(865); _errHandler.sync(this); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(855); + setState(864); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -7280,7 +7315,7 @@ public final DecimalValueContext decimalValue() throws RecognitionException { } } - setState(858); + setState(867); match(DECIMAL_LITERAL); } } @@ -7327,12 +7362,12 @@ public final IntegerValueContext integerValue() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(861); + setState(870); _errHandler.sync(this); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(860); + setState(869); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -7345,7 +7380,7 @@ public final IntegerValueContext integerValue() throws RecognitionException { } } - setState(863); + setState(872); match(INTEGER_LITERAL); } } @@ -7389,7 +7424,7 @@ public final StringContext string() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(865); + setState(874); match(QUOTED_STRING); } } @@ -7439,9 +7474,9 @@ public final ComparisonOperatorContext comparisonOperator() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(867); + setState(876); _la = _input.LA(1); - if ( !(((((_la - 78)) & ~0x3f) == 0 && ((1L << (_la - 78)) & 125L) != 0)) ) { + if ( !(((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 125L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -7502,10 +7537,10 @@ public final JoinCommandContext joinCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(869); + setState(878); ((JoinCommandContext)_localctx).type = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 109051904L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 218103808L) != 0)) ) { ((JoinCommandContext)_localctx).type = (Token)_errHandler.recoverInline(this); } else { @@ -7513,11 +7548,11 @@ public final JoinCommandContext joinCommand() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(870); + setState(879); match(JOIN); - setState(871); + setState(880); joinTarget(); - setState(872); + setState(881); joinCondition(); } } @@ -7566,34 +7601,34 @@ public final JoinTargetContext joinTarget() throws RecognitionException { enterRule(_localctx, 176, RULE_joinTarget); int _la; try { - setState(882); + setState(891); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(874); + setState(883); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(875); + setState(884); ((JoinTargetContext)_localctx).index = indexPattern(); - setState(877); + setState(886); _errHandler.sync(this); _la = _input.LA(1); if (_la==AS) { { - setState(876); + setState(885); match(AS); } } - setState(879); + setState(888); ((JoinTargetContext)_localctx).qualifier = match(UNQUOTED_SOURCE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(881); + setState(890); ((JoinTargetContext)_localctx).index = indexPattern(); } break; @@ -7650,27 +7685,27 @@ public final JoinConditionContext joinCondition() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(884); + setState(893); match(ON); - setState(885); + setState(894); booleanExpression(0); - setState(890); + setState(899); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,84,_ctx); + _alt = getInterpreter().adaptivePredict(_input,86,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(886); + setState(895); match(COMMA); - setState(887); + setState(896); booleanExpression(0); } } } - setState(892); + setState(901); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,84,_ctx); + _alt = getInterpreter().adaptivePredict(_input,86,_ctx); } } } @@ -7801,7 +7836,7 @@ private boolean joinTarget_sempred(JoinTargetContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0001\u008f\u037e\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u0094\u0387\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ @@ -7878,63 +7913,64 @@ private boolean joinTarget_sempred(JoinTargetContext _localctx, int predIndex) { "<\u0001<\u0001=\u0001=\u0001=\u0001=\u0003=\u0241\b=\u0001=\u0001=\u0001"+ "=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0003>\u024c\b>\u0001>\u0001"+ ">\u0001>\u0001?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001"+ - "@\u0003@\u025a\b@\u0001A\u0001A\u0001A\u0001B\u0001B\u0003B\u0261\bB\u0001"+ - "B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001"+ - "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0003E\u0274\bE\u0001E\u0001"+ - "E\u0001E\u0001E\u0001E\u0005E\u027b\bE\nE\fE\u027e\tE\u0001E\u0001E\u0001"+ - "E\u0001E\u0001E\u0003E\u0285\bE\u0001E\u0001E\u0001E\u0003E\u028a\bE\u0001"+ - "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0005E\u0292\bE\nE\fE\u0295\tE\u0001"+ - "F\u0001F\u0003F\u0299\bF\u0001F\u0001F\u0001F\u0001F\u0001F\u0003F\u02a0"+ - "\bF\u0001F\u0001F\u0001F\u0001F\u0001F\u0003F\u02a7\bF\u0001F\u0001F\u0001"+ - "F\u0001F\u0001F\u0005F\u02ae\bF\nF\fF\u02b1\tF\u0001F\u0001F\u0001F\u0001"+ - "F\u0003F\u02b7\bF\u0001F\u0001F\u0001F\u0001F\u0001F\u0005F\u02be\bF\n"+ - "F\fF\u02c1\tF\u0001F\u0001F\u0003F\u02c5\bF\u0001G\u0001G\u0001G\u0003"+ - "G\u02ca\bG\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001H\u0003"+ - "H\u02d4\bH\u0001I\u0001I\u0001I\u0001I\u0003I\u02da\bI\u0001I\u0001I\u0001"+ - "I\u0001I\u0001I\u0001I\u0005I\u02e2\bI\nI\fI\u02e5\tI\u0001J\u0001J\u0001"+ - "J\u0001J\u0001J\u0001J\u0001J\u0001J\u0003J\u02ef\bJ\u0001J\u0001J\u0001"+ - "J\u0005J\u02f4\bJ\nJ\fJ\u02f7\tJ\u0001K\u0001K\u0001K\u0001K\u0001K\u0001"+ - "K\u0005K\u02ff\bK\nK\fK\u0302\tK\u0001K\u0001K\u0003K\u0306\bK\u0003K"+ - "\u0308\bK\u0001K\u0001K\u0001L\u0001L\u0001L\u0003L\u030f\bL\u0001M\u0001"+ - "M\u0001M\u0001M\u0005M\u0315\bM\nM\fM\u0318\tM\u0003M\u031a\bM\u0001M"+ - "\u0001M\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0003O\u0324\bO\u0001"+ + "@\u0001@\u0003@\u025b\b@\u0001@\u0001@\u0001@\u0001@\u0003@\u0261\b@\u0003"+ + "@\u0263\b@\u0001A\u0001A\u0001A\u0001B\u0001B\u0003B\u026a\bB\u0001B\u0001"+ + "B\u0001C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001E\u0001"+ + "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0003E\u027d\bE\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0005E\u0284\bE\nE\fE\u0287\tE\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0003E\u028e\bE\u0001E\u0001E\u0001E\u0003E\u0293\bE\u0001E\u0001"+ + "E\u0001E\u0001E\u0001E\u0001E\u0005E\u029b\bE\nE\fE\u029e\tE\u0001F\u0001"+ + "F\u0003F\u02a2\bF\u0001F\u0001F\u0001F\u0001F\u0001F\u0003F\u02a9\bF\u0001"+ + "F\u0001F\u0001F\u0001F\u0001F\u0003F\u02b0\bF\u0001F\u0001F\u0001F\u0001"+ + "F\u0001F\u0005F\u02b7\bF\nF\fF\u02ba\tF\u0001F\u0001F\u0001F\u0001F\u0003"+ + "F\u02c0\bF\u0001F\u0001F\u0001F\u0001F\u0001F\u0005F\u02c7\bF\nF\fF\u02ca"+ + "\tF\u0001F\u0001F\u0003F\u02ce\bF\u0001G\u0001G\u0001G\u0003G\u02d3\b"+ + "G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001H\u0003H\u02dd"+ + "\bH\u0001I\u0001I\u0001I\u0001I\u0003I\u02e3\bI\u0001I\u0001I\u0001I\u0001"+ + "I\u0001I\u0001I\u0005I\u02eb\bI\nI\fI\u02ee\tI\u0001J\u0001J\u0001J\u0001"+ + "J\u0001J\u0001J\u0001J\u0001J\u0003J\u02f8\bJ\u0001J\u0001J\u0001J\u0005"+ + "J\u02fd\bJ\nJ\fJ\u0300\tJ\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0005"+ + "K\u0308\bK\nK\fK\u030b\tK\u0001K\u0001K\u0003K\u030f\bK\u0003K\u0311\b"+ + "K\u0001K\u0001K\u0001L\u0001L\u0001L\u0003L\u0318\bL\u0001M\u0001M\u0001"+ + "M\u0001M\u0005M\u031e\bM\nM\fM\u0321\tM\u0003M\u0323\bM\u0001M\u0001M"+ + "\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0003O\u032d\bO\u0001P\u0001"+ "P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001"+ - "P\u0001P\u0001P\u0005P\u0333\bP\nP\fP\u0336\tP\u0001P\u0001P\u0001P\u0001"+ - "P\u0001P\u0001P\u0005P\u033e\bP\nP\fP\u0341\tP\u0001P\u0001P\u0001P\u0001"+ - "P\u0001P\u0001P\u0005P\u0349\bP\nP\fP\u034c\tP\u0001P\u0001P\u0003P\u0350"+ - "\bP\u0001Q\u0001Q\u0001R\u0001R\u0003R\u0356\bR\u0001S\u0003S\u0359\b"+ - "S\u0001S\u0001S\u0001T\u0003T\u035e\bT\u0001T\u0001T\u0001U\u0001U\u0001"+ - "V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0003"+ - "X\u036e\bX\u0001X\u0001X\u0001X\u0003X\u0373\bX\u0001Y\u0001Y\u0001Y\u0001"+ - "Y\u0005Y\u0379\bY\nY\fY\u037c\tY\u0001Y\u0000\u0005\u0004v\u008a\u0092"+ - "\u0094Z\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018"+ - "\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080"+ - "\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098"+ - "\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0"+ - "\u00b2\u0000\n\u0002\u000022ii\u0001\u0000cd\u0002\u000066==\u0002\u0000"+ - "@@CC\u0002\u0000\'\'22\u0001\u0000UV\u0001\u0000WY\u0002\u0000??LL\u0002"+ - "\u0000NNPT\u0002\u0000\u0017\u0017\u0019\u001a\u03a4\u0000\u00c0\u0001"+ - "\u0000\u0000\u0000\u0002\u00c2\u0001\u0000\u0000\u0000\u0004\u00c5\u0001"+ - "\u0000\u0000\u0000\u0006\u00d6\u0001\u0000\u0000\u0000\b\u00f2\u0001\u0000"+ - "\u0000\u0000\n\u00f4\u0001\u0000\u0000\u0000\f\u00f7\u0001\u0000\u0000"+ - "\u0000\u000e\u00f9\u0001\u0000\u0000\u0000\u0010\u00fc\u0001\u0000\u0000"+ - "\u0000\u0012\u0107\u0001\u0000\u0000\u0000\u0014\u010b\u0001\u0000\u0000"+ - "\u0000\u0016\u0113\u0001\u0000\u0000\u0000\u0018\u0118\u0001\u0000\u0000"+ - "\u0000\u001a\u011b\u0001\u0000\u0000\u0000\u001c\u011e\u0001\u0000\u0000"+ - "\u0000\u001e\u0132\u0001\u0000\u0000\u0000 \u0134\u0001\u0000\u0000\u0000"+ - "\"\u0136\u0001\u0000\u0000\u0000$\u0138\u0001\u0000\u0000\u0000&\u013a"+ - "\u0001\u0000\u0000\u0000(\u013c\u0001\u0000\u0000\u0000*\u0145\u0001\u0000"+ - "\u0000\u0000,\u0148\u0001\u0000\u0000\u0000.\u0150\u0001\u0000\u0000\u0000"+ - "0\u0158\u0001\u0000\u0000\u00002\u0169\u0001\u0000\u0000\u00004\u016b"+ - "\u0001\u0000\u0000\u00006\u017f\u0001\u0000\u0000\u00008\u0181\u0001\u0000"+ - "\u0000\u0000:\u0189\u0001\u0000\u0000\u0000<\u0191\u0001\u0000\u0000\u0000"+ - ">\u0196\u0001\u0000\u0000\u0000@\u019a\u0001\u0000\u0000\u0000B\u019e"+ - "\u0001\u0000\u0000\u0000D\u01a3\u0001\u0000\u0000\u0000F\u01a5\u0001\u0000"+ - "\u0000\u0000H\u01a8\u0001\u0000\u0000\u0000J\u01b1\u0001\u0000\u0000\u0000"+ - "L\u01b9\u0001\u0000\u0000\u0000N\u01bc\u0001\u0000\u0000\u0000P\u01bf"+ - "\u0001\u0000\u0000\u0000R\u01d0\u0001\u0000\u0000\u0000T\u01d2\u0001\u0000"+ - "\u0000\u0000V\u01d8\u0001\u0000\u0000\u0000X\u01e0\u0001\u0000\u0000\u0000"+ - "Z\u01e6\u0001\u0000\u0000\u0000\\\u01e8\u0001\u0000\u0000\u0000^\u01ec"+ + "P\u0001P\u0005P\u033c\bP\nP\fP\u033f\tP\u0001P\u0001P\u0001P\u0001P\u0001"+ + "P\u0001P\u0005P\u0347\bP\nP\fP\u034a\tP\u0001P\u0001P\u0001P\u0001P\u0001"+ + "P\u0001P\u0005P\u0352\bP\nP\fP\u0355\tP\u0001P\u0001P\u0003P\u0359\bP"+ + "\u0001Q\u0001Q\u0001R\u0001R\u0003R\u035f\bR\u0001S\u0003S\u0362\bS\u0001"+ + "S\u0001S\u0001T\u0003T\u0367\bT\u0001T\u0001T\u0001U\u0001U\u0001V\u0001"+ + "V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0003X\u0377"+ + "\bX\u0001X\u0001X\u0001X\u0003X\u037c\bX\u0001Y\u0001Y\u0001Y\u0001Y\u0005"+ + "Y\u0382\bY\nY\fY\u0385\tY\u0001Y\u0000\u0005\u0004v\u008a\u0092\u0094"+ + "Z\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a"+ + "\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082"+ + "\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a"+ + "\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2"+ + "\u0000\n\u0002\u000033jj\u0001\u0000de\u0002\u000077>>\u0002\u0000AAD"+ + "D\u0002\u0000((33\u0001\u0000VW\u0001\u0000XZ\u0002\u0000@@MM\u0002\u0000"+ + "OOQU\u0002\u0000\u0018\u0018\u001a\u001b\u03af\u0000\u00c0\u0001\u0000"+ + "\u0000\u0000\u0002\u00c2\u0001\u0000\u0000\u0000\u0004\u00c5\u0001\u0000"+ + "\u0000\u0000\u0006\u00d6\u0001\u0000\u0000\u0000\b\u00f2\u0001\u0000\u0000"+ + "\u0000\n\u00f4\u0001\u0000\u0000\u0000\f\u00f7\u0001\u0000\u0000\u0000"+ + "\u000e\u00f9\u0001\u0000\u0000\u0000\u0010\u00fc\u0001\u0000\u0000\u0000"+ + "\u0012\u0107\u0001\u0000\u0000\u0000\u0014\u010b\u0001\u0000\u0000\u0000"+ + "\u0016\u0113\u0001\u0000\u0000\u0000\u0018\u0118\u0001\u0000\u0000\u0000"+ + "\u001a\u011b\u0001\u0000\u0000\u0000\u001c\u011e\u0001\u0000\u0000\u0000"+ + "\u001e\u0132\u0001\u0000\u0000\u0000 \u0134\u0001\u0000\u0000\u0000\""+ + "\u0136\u0001\u0000\u0000\u0000$\u0138\u0001\u0000\u0000\u0000&\u013a\u0001"+ + "\u0000\u0000\u0000(\u013c\u0001\u0000\u0000\u0000*\u0145\u0001\u0000\u0000"+ + "\u0000,\u0148\u0001\u0000\u0000\u0000.\u0150\u0001\u0000\u0000\u00000"+ + "\u0158\u0001\u0000\u0000\u00002\u0169\u0001\u0000\u0000\u00004\u016b\u0001"+ + "\u0000\u0000\u00006\u017f\u0001\u0000\u0000\u00008\u0181\u0001\u0000\u0000"+ + "\u0000:\u0189\u0001\u0000\u0000\u0000<\u0191\u0001\u0000\u0000\u0000>"+ + "\u0196\u0001\u0000\u0000\u0000@\u019a\u0001\u0000\u0000\u0000B\u019e\u0001"+ + "\u0000\u0000\u0000D\u01a3\u0001\u0000\u0000\u0000F\u01a5\u0001\u0000\u0000"+ + "\u0000H\u01a8\u0001\u0000\u0000\u0000J\u01b1\u0001\u0000\u0000\u0000L"+ + "\u01b9\u0001\u0000\u0000\u0000N\u01bc\u0001\u0000\u0000\u0000P\u01bf\u0001"+ + "\u0000\u0000\u0000R\u01d0\u0001\u0000\u0000\u0000T\u01d2\u0001\u0000\u0000"+ + "\u0000V\u01d8\u0001\u0000\u0000\u0000X\u01e0\u0001\u0000\u0000\u0000Z"+ + "\u01e6\u0001\u0000\u0000\u0000\\\u01e8\u0001\u0000\u0000\u0000^\u01ec"+ "\u0001\u0000\u0000\u0000`\u01ef\u0001\u0000\u0000\u0000b\u01f2\u0001\u0000"+ "\u0000\u0000d\u01f6\u0001\u0000\u0000\u0000f\u01f9\u0001\u0000\u0000\u0000"+ "h\u020a\u0001\u0000\u0000\u0000j\u020f\u0001\u0000\u0000\u0000l\u0213"+ @@ -7942,19 +7978,19 @@ private boolean joinTarget_sempred(JoinTargetContext _localctx, int predIndex) { "\u0000\u0000r\u0227\u0001\u0000\u0000\u0000t\u022b\u0001\u0000\u0000\u0000"+ "v\u022f\u0001\u0000\u0000\u0000x\u023a\u0001\u0000\u0000\u0000z\u023c"+ "\u0001\u0000\u0000\u0000|\u0247\u0001\u0000\u0000\u0000~\u0250\u0001\u0000"+ - "\u0000\u0000\u0080\u0255\u0001\u0000\u0000\u0000\u0082\u025b\u0001\u0000"+ - "\u0000\u0000\u0084\u025e\u0001\u0000\u0000\u0000\u0086\u0264\u0001\u0000"+ - "\u0000\u0000\u0088\u0268\u0001\u0000\u0000\u0000\u008a\u0289\u0001\u0000"+ - "\u0000\u0000\u008c\u02c4\u0001\u0000\u0000\u0000\u008e\u02c6\u0001\u0000"+ - "\u0000\u0000\u0090\u02d3\u0001\u0000\u0000\u0000\u0092\u02d9\u0001\u0000"+ - "\u0000\u0000\u0094\u02ee\u0001\u0000\u0000\u0000\u0096\u02f8\u0001\u0000"+ - "\u0000\u0000\u0098\u030e\u0001\u0000\u0000\u0000\u009a\u0310\u0001\u0000"+ - "\u0000\u0000\u009c\u031d\u0001\u0000\u0000\u0000\u009e\u0323\u0001\u0000"+ - "\u0000\u0000\u00a0\u034f\u0001\u0000\u0000\u0000\u00a2\u0351\u0001\u0000"+ - "\u0000\u0000\u00a4\u0355\u0001\u0000\u0000\u0000\u00a6\u0358\u0001\u0000"+ - "\u0000\u0000\u00a8\u035d\u0001\u0000\u0000\u0000\u00aa\u0361\u0001\u0000"+ - "\u0000\u0000\u00ac\u0363\u0001\u0000\u0000\u0000\u00ae\u0365\u0001\u0000"+ - "\u0000\u0000\u00b0\u0372\u0001\u0000\u0000\u0000\u00b2\u0374\u0001\u0000"+ + "\u0000\u0000\u0080\u0262\u0001\u0000\u0000\u0000\u0082\u0264\u0001\u0000"+ + "\u0000\u0000\u0084\u0267\u0001\u0000\u0000\u0000\u0086\u026d\u0001\u0000"+ + "\u0000\u0000\u0088\u0271\u0001\u0000\u0000\u0000\u008a\u0292\u0001\u0000"+ + "\u0000\u0000\u008c\u02cd\u0001\u0000\u0000\u0000\u008e\u02cf\u0001\u0000"+ + "\u0000\u0000\u0090\u02dc\u0001\u0000\u0000\u0000\u0092\u02e2\u0001\u0000"+ + "\u0000\u0000\u0094\u02f7\u0001\u0000\u0000\u0000\u0096\u0301\u0001\u0000"+ + "\u0000\u0000\u0098\u0317\u0001\u0000\u0000\u0000\u009a\u0319\u0001\u0000"+ + "\u0000\u0000\u009c\u0326\u0001\u0000\u0000\u0000\u009e\u032c\u0001\u0000"+ + "\u0000\u0000\u00a0\u0358\u0001\u0000\u0000\u0000\u00a2\u035a\u0001\u0000"+ + "\u0000\u0000\u00a4\u035e\u0001\u0000\u0000\u0000\u00a6\u0361\u0001\u0000"+ + "\u0000\u0000\u00a8\u0366\u0001\u0000\u0000\u0000\u00aa\u036a\u0001\u0000"+ + "\u0000\u0000\u00ac\u036c\u0001\u0000\u0000\u0000\u00ae\u036e\u0001\u0000"+ + "\u0000\u0000\u00b0\u037b\u0001\u0000\u0000\u0000\u00b2\u037d\u0001\u0000"+ "\u0000\u0000\u00b4\u00b6\u0004\u0000\u0000\u0000\u00b5\u00b7\u0003\u0086"+ "C\u0000\u00b6\u00b5\u0001\u0000\u0000\u0000\u00b7\u00b8\u0001\u0000\u0000"+ "\u0000\u00b8\u00b6\u0001\u0000\u0000\u0000\u00b8\u00b9\u0001\u0000\u0000"+ @@ -7966,7 +8002,7 @@ private boolean joinTarget_sempred(JoinTargetContext _localctx, int predIndex) { "\u0000\u00c2\u00c3\u0003\u0004\u0002\u0000\u00c3\u00c4\u0005\u0000\u0000"+ "\u0001\u00c4\u0003\u0001\u0000\u0000\u0000\u00c5\u00c6\u0006\u0002\uffff"+ "\uffff\u0000\u00c6\u00c7\u0003\u0006\u0003\u0000\u00c7\u00cd\u0001\u0000"+ - "\u0000\u0000\u00c8\u00c9\n\u0001\u0000\u0000\u00c9\u00ca\u00051\u0000"+ + "\u0000\u0000\u00c8\u00c9\n\u0001\u0000\u0000\u00c9\u00ca\u00052\u0000"+ "\u0000\u00ca\u00cc\u0003\b\u0004\u0000\u00cb\u00c8\u0001\u0000\u0000\u0000"+ "\u00cc\u00cf\u0001\u0000\u0000\u0000\u00cd\u00cb\u0001\u0000\u0000\u0000"+ "\u00cd\u00ce\u0001\u0000\u0000\u0000\u00ce\u0005\u0001\u0000\u0000\u0000"+ @@ -8002,358 +8038,362 @@ private boolean joinTarget_sempred(JoinTargetContext _localctx, int predIndex) { "\u000b\u0001\u0000\u0000\u0000\u00f7\u00f8\u0003<\u001e\u0000\u00f8\r"+ "\u0001\u0000\u0000\u0000\u00f9\u00fa\u0005\r\u0000\u0000\u00fa\u00fb\u0003"+ "\u0010\b\u0000\u00fb\u000f\u0001\u0000\u0000\u0000\u00fc\u0101\u0003\u0012"+ - "\t\u0000\u00fd\u00fe\u0005<\u0000\u0000\u00fe\u0100\u0003\u0012\t\u0000"+ + "\t\u0000\u00fd\u00fe\u0005=\u0000\u0000\u00fe\u0100\u0003\u0012\t\u0000"+ "\u00ff\u00fd\u0001\u0000\u0000\u0000\u0100\u0103\u0001\u0000\u0000\u0000"+ "\u0101\u00ff\u0001\u0000\u0000\u0000\u0101\u0102\u0001\u0000\u0000\u0000"+ "\u0102\u0011\u0001\u0000\u0000\u0000\u0103\u0101\u0001\u0000\u0000\u0000"+ - "\u0104\u0105\u00032\u0019\u0000\u0105\u0106\u00057\u0000\u0000\u0106\u0108"+ + "\u0104\u0105\u00032\u0019\u0000\u0105\u0106\u00058\u0000\u0000\u0106\u0108"+ "\u0001\u0000\u0000\u0000\u0107\u0104\u0001\u0000\u0000\u0000\u0107\u0108"+ "\u0001\u0000\u0000\u0000\u0108\u0109\u0001\u0000\u0000\u0000\u0109\u010a"+ "\u0003\u008aE\u0000\u010a\u0013\u0001\u0000\u0000\u0000\u010b\u0110\u0003"+ - "\u0016\u000b\u0000\u010c\u010d\u0005<\u0000\u0000\u010d\u010f\u0003\u0016"+ + "\u0016\u000b\u0000\u010c\u010d\u0005=\u0000\u0000\u010d\u010f\u0003\u0016"+ "\u000b\u0000\u010e\u010c\u0001\u0000\u0000\u0000\u010f\u0112\u0001\u0000"+ "\u0000\u0000\u0110\u010e\u0001\u0000\u0000\u0000\u0110\u0111\u0001\u0000"+ "\u0000\u0000\u0111\u0015\u0001\u0000\u0000\u0000\u0112\u0110\u0001\u0000"+ - "\u0000\u0000\u0113\u0116\u00032\u0019\u0000\u0114\u0115\u00057\u0000\u0000"+ + "\u0000\u0000\u0113\u0116\u00032\u0019\u0000\u0114\u0115\u00058\u0000\u0000"+ "\u0115\u0117\u0003\u008aE\u0000\u0116\u0114\u0001\u0000\u0000\u0000\u0116"+ "\u0117\u0001\u0000\u0000\u0000\u0117\u0017\u0001\u0000\u0000\u0000\u0118"+ - "\u0119\u0005\u0013\u0000\u0000\u0119\u011a\u0003\u001c\u000e\u0000\u011a"+ - "\u0019\u0001\u0000\u0000\u0000\u011b\u011c\u0005\u0014\u0000\u0000\u011c"+ + "\u0119\u0005\u0012\u0000\u0000\u0119\u011a\u0003\u001c\u000e\u0000\u011a"+ + "\u0019\u0001\u0000\u0000\u0000\u011b\u011c\u0005\u0013\u0000\u0000\u011c"+ "\u011d\u0003\u001c\u000e\u0000\u011d\u001b\u0001\u0000\u0000\u0000\u011e"+ - "\u0123\u0003\u001e\u000f\u0000\u011f\u0120\u0005<\u0000\u0000\u0120\u0122"+ + "\u0123\u0003\u001e\u000f\u0000\u011f\u0120\u0005=\u0000\u0000\u0120\u0122"+ "\u0003\u001e\u000f\u0000\u0121\u011f\u0001\u0000\u0000\u0000\u0122\u0125"+ "\u0001\u0000\u0000\u0000\u0123\u0121\u0001\u0000\u0000\u0000\u0123\u0124"+ "\u0001\u0000\u0000\u0000\u0124\u0127\u0001\u0000\u0000\u0000\u0125\u0123"+ "\u0001\u0000\u0000\u0000\u0126\u0128\u0003(\u0014\u0000\u0127\u0126\u0001"+ "\u0000\u0000\u0000\u0127\u0128\u0001\u0000\u0000\u0000\u0128\u001d\u0001"+ - "\u0000\u0000\u0000\u0129\u012a\u0003 \u0010\u0000\u012a\u012b\u0005:\u0000"+ + "\u0000\u0000\u0000\u0129\u012a\u0003 \u0010\u0000\u012a\u012b\u0005;\u0000"+ "\u0000\u012b\u012c\u0003$\u0012\u0000\u012c\u0133\u0001\u0000\u0000\u0000"+ - "\u012d\u012e\u0003$\u0012\u0000\u012e\u012f\u00059\u0000\u0000\u012f\u0130"+ + "\u012d\u012e\u0003$\u0012\u0000\u012e\u012f\u0005:\u0000\u0000\u012f\u0130"+ "\u0003\"\u0011\u0000\u0130\u0133\u0001\u0000\u0000\u0000\u0131\u0133\u0003"+ "&\u0013\u0000\u0132\u0129\u0001\u0000\u0000\u0000\u0132\u012d\u0001\u0000"+ "\u0000\u0000\u0132\u0131\u0001\u0000\u0000\u0000\u0133\u001f\u0001\u0000"+ - "\u0000\u0000\u0134\u0135\u0005i\u0000\u0000\u0135!\u0001\u0000\u0000\u0000"+ - "\u0136\u0137\u0005i\u0000\u0000\u0137#\u0001\u0000\u0000\u0000\u0138\u0139"+ - "\u0005i\u0000\u0000\u0139%\u0001\u0000\u0000\u0000\u013a\u013b\u0007\u0000"+ - "\u0000\u0000\u013b\'\u0001\u0000\u0000\u0000\u013c\u013d\u0005h\u0000"+ - "\u0000\u013d\u0142\u0005i\u0000\u0000\u013e\u013f\u0005<\u0000\u0000\u013f"+ - "\u0141\u0005i\u0000\u0000\u0140\u013e\u0001\u0000\u0000\u0000\u0141\u0144"+ + "\u0000\u0000\u0134\u0135\u0005j\u0000\u0000\u0135!\u0001\u0000\u0000\u0000"+ + "\u0136\u0137\u0005j\u0000\u0000\u0137#\u0001\u0000\u0000\u0000\u0138\u0139"+ + "\u0005j\u0000\u0000\u0139%\u0001\u0000\u0000\u0000\u013a\u013b\u0007\u0000"+ + "\u0000\u0000\u013b\'\u0001\u0000\u0000\u0000\u013c\u013d\u0005i\u0000"+ + "\u0000\u013d\u0142\u0005j\u0000\u0000\u013e\u013f\u0005=\u0000\u0000\u013f"+ + "\u0141\u0005j\u0000\u0000\u0140\u013e\u0001\u0000\u0000\u0000\u0141\u0144"+ "\u0001\u0000\u0000\u0000\u0142\u0140\u0001\u0000\u0000\u0000\u0142\u0143"+ "\u0001\u0000\u0000\u0000\u0143)\u0001\u0000\u0000\u0000\u0144\u0142\u0001"+ "\u0000\u0000\u0000\u0145\u0146\u0005\t\u0000\u0000\u0146\u0147\u0003\u0010"+ "\b\u0000\u0147+\u0001\u0000\u0000\u0000\u0148\u014a\u0005\u0010\u0000"+ "\u0000\u0149\u014b\u0003.\u0017\u0000\u014a\u0149\u0001\u0000\u0000\u0000"+ "\u014a\u014b\u0001\u0000\u0000\u0000\u014b\u014e\u0001\u0000\u0000\u0000"+ - "\u014c\u014d\u00058\u0000\u0000\u014d\u014f\u0003\u0010\b\u0000\u014e"+ + "\u014c\u014d\u00059\u0000\u0000\u014d\u014f\u0003\u0010\b\u0000\u014e"+ "\u014c\u0001\u0000\u0000\u0000\u014e\u014f\u0001\u0000\u0000\u0000\u014f"+ "-\u0001\u0000\u0000\u0000\u0150\u0155\u00030\u0018\u0000\u0151\u0152\u0005"+ - "<\u0000\u0000\u0152\u0154\u00030\u0018\u0000\u0153\u0151\u0001\u0000\u0000"+ + "=\u0000\u0000\u0152\u0154\u00030\u0018\u0000\u0153\u0151\u0001\u0000\u0000"+ "\u0000\u0154\u0157\u0001\u0000\u0000\u0000\u0155\u0153\u0001\u0000\u0000"+ "\u0000\u0155\u0156\u0001\u0000\u0000\u0000\u0156/\u0001\u0000\u0000\u0000"+ "\u0157\u0155\u0001\u0000\u0000\u0000\u0158\u015b\u0003\u0012\t\u0000\u0159"+ "\u015a\u0005\u0011\u0000\u0000\u015a\u015c\u0003\u008aE\u0000\u015b\u0159"+ "\u0001\u0000\u0000\u0000\u015b\u015c\u0001\u0000\u0000\u0000\u015c1\u0001"+ "\u0000\u0000\u0000\u015d\u015e\u0004\u0019\u0007\u0000\u015e\u0160\u0005"+ - "_\u0000\u0000\u015f\u0161\u0005c\u0000\u0000\u0160\u015f\u0001\u0000\u0000"+ + "`\u0000\u0000\u015f\u0161\u0005d\u0000\u0000\u0160\u015f\u0001\u0000\u0000"+ "\u0000\u0160\u0161\u0001\u0000\u0000\u0000\u0161\u0162\u0001\u0000\u0000"+ - "\u0000\u0162\u0163\u0005`\u0000\u0000\u0163\u0164\u0005>\u0000\u0000\u0164"+ - "\u0165\u0005_\u0000\u0000\u0165\u0166\u00034\u001a\u0000\u0166\u0167\u0005"+ - "`\u0000\u0000\u0167\u016a\u0001\u0000\u0000\u0000\u0168\u016a\u00034\u001a"+ + "\u0000\u0162\u0163\u0005a\u0000\u0000\u0163\u0164\u0005?\u0000\u0000\u0164"+ + "\u0165\u0005`\u0000\u0000\u0165\u0166\u00034\u001a\u0000\u0166\u0167\u0005"+ + "a\u0000\u0000\u0167\u016a\u0001\u0000\u0000\u0000\u0168\u016a\u00034\u001a"+ "\u0000\u0169\u015d\u0001\u0000\u0000\u0000\u0169\u0168\u0001\u0000\u0000"+ "\u0000\u016a3\u0001\u0000\u0000\u0000\u016b\u0170\u0003D\"\u0000\u016c"+ - "\u016d\u0005>\u0000\u0000\u016d\u016f\u0003D\"\u0000\u016e\u016c\u0001"+ + "\u016d\u0005?\u0000\u0000\u016d\u016f\u0003D\"\u0000\u016e\u016c\u0001"+ "\u0000\u0000\u0000\u016f\u0172\u0001\u0000\u0000\u0000\u0170\u016e\u0001"+ "\u0000\u0000\u0000\u0170\u0171\u0001\u0000\u0000\u0000\u01715\u0001\u0000"+ "\u0000\u0000\u0172\u0170\u0001\u0000\u0000\u0000\u0173\u0174\u0004\u001b"+ - "\b\u0000\u0174\u0176\u0005_\u0000\u0000\u0175\u0177\u0005\u0081\u0000"+ + "\b\u0000\u0174\u0176\u0005`\u0000\u0000\u0175\u0177\u0005\u0086\u0000"+ "\u0000\u0176\u0175\u0001\u0000\u0000\u0000\u0176\u0177\u0001\u0000\u0000"+ - "\u0000\u0177\u0178\u0001\u0000\u0000\u0000\u0178\u0179\u0005`\u0000\u0000"+ - "\u0179\u017a\u0005>\u0000\u0000\u017a\u017b\u0005_\u0000\u0000\u017b\u017c"+ - "\u00038\u001c\u0000\u017c\u017d\u0005`\u0000\u0000\u017d\u0180\u0001\u0000"+ + "\u0000\u0177\u0178\u0001\u0000\u0000\u0000\u0178\u0179\u0005a\u0000\u0000"+ + "\u0179\u017a\u0005?\u0000\u0000\u017a\u017b\u0005`\u0000\u0000\u017b\u017c"+ + "\u00038\u001c\u0000\u017c\u017d\u0005a\u0000\u0000\u017d\u0180\u0001\u0000"+ "\u0000\u0000\u017e\u0180\u00038\u001c\u0000\u017f\u0173\u0001\u0000\u0000"+ "\u0000\u017f\u017e\u0001\u0000\u0000\u0000\u01807\u0001\u0000\u0000\u0000"+ - "\u0181\u0186\u0003>\u001f\u0000\u0182\u0183\u0005>\u0000\u0000\u0183\u0185"+ + "\u0181\u0186\u0003>\u001f\u0000\u0182\u0183\u0005?\u0000\u0000\u0183\u0185"+ "\u0003>\u001f\u0000\u0184\u0182\u0001\u0000\u0000\u0000\u0185\u0188\u0001"+ "\u0000\u0000\u0000\u0186\u0184\u0001\u0000\u0000\u0000\u0186\u0187\u0001"+ "\u0000\u0000\u0000\u01879\u0001\u0000\u0000\u0000\u0188\u0186\u0001\u0000"+ - "\u0000\u0000\u0189\u018e\u00036\u001b\u0000\u018a\u018b\u0005<\u0000\u0000"+ + "\u0000\u0000\u0189\u018e\u00036\u001b\u0000\u018a\u018b\u0005=\u0000\u0000"+ "\u018b\u018d\u00036\u001b\u0000\u018c\u018a\u0001\u0000\u0000\u0000\u018d"+ "\u0190\u0001\u0000\u0000\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018e"+ "\u018f\u0001\u0000\u0000\u0000\u018f;\u0001\u0000\u0000\u0000\u0190\u018e"+ "\u0001\u0000\u0000\u0000\u0191\u0192\u0007\u0001\u0000\u0000\u0192=\u0001"+ - "\u0000\u0000\u0000\u0193\u0197\u0005\u0081\u0000\u0000\u0194\u0197\u0003"+ + "\u0000\u0000\u0000\u0193\u0197\u0005\u0086\u0000\u0000\u0194\u0197\u0003"+ "@ \u0000\u0195\u0197\u0003B!\u0000\u0196\u0193\u0001\u0000\u0000\u0000"+ "\u0196\u0194\u0001\u0000\u0000\u0000\u0196\u0195\u0001\u0000\u0000\u0000"+ - "\u0197?\u0001\u0000\u0000\u0000\u0198\u019b\u0005J\u0000\u0000\u0199\u019b"+ - "\u0005]\u0000\u0000\u019a\u0198\u0001\u0000\u0000\u0000\u019a\u0199\u0001"+ - "\u0000\u0000\u0000\u019bA\u0001\u0000\u0000\u0000\u019c\u019f\u0005\\"+ - "\u0000\u0000\u019d\u019f\u0005^\u0000\u0000\u019e\u019c\u0001\u0000\u0000"+ - "\u0000\u019e\u019d\u0001\u0000\u0000\u0000\u019fC\u0001\u0000\u0000\u0000"+ - "\u01a0\u01a4\u0003<\u001e\u0000\u01a1\u01a4\u0003@ \u0000\u01a2\u01a4"+ - "\u0003B!\u0000\u01a3\u01a0\u0001\u0000\u0000\u0000\u01a3\u01a1\u0001\u0000"+ - "\u0000\u0000\u01a3\u01a2\u0001\u0000\u0000\u0000\u01a4E\u0001\u0000\u0000"+ - "\u0000\u01a5\u01a6\u0005\u000b\u0000\u0000\u01a6\u01a7\u0003\u00a0P\u0000"+ - "\u01a7G\u0001\u0000\u0000\u0000\u01a8\u01a9\u0005\u000f\u0000\u0000\u01a9"+ - "\u01ae\u0003J%\u0000\u01aa\u01ab\u0005<\u0000\u0000\u01ab\u01ad\u0003"+ - "J%\u0000\u01ac\u01aa\u0001\u0000\u0000\u0000\u01ad\u01b0\u0001\u0000\u0000"+ - "\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000\u01ae\u01af\u0001\u0000\u0000"+ - "\u0000\u01afI\u0001\u0000\u0000\u0000\u01b0\u01ae\u0001\u0000\u0000\u0000"+ - "\u01b1\u01b3\u0003\u008aE\u0000\u01b2\u01b4\u0007\u0002\u0000\u0000\u01b3"+ - "\u01b2\u0001\u0000\u0000\u0000\u01b3\u01b4\u0001\u0000\u0000\u0000\u01b4"+ - "\u01b7\u0001\u0000\u0000\u0000\u01b5\u01b6\u0005G\u0000\u0000\u01b6\u01b8"+ - "\u0007\u0003\u0000\u0000\u01b7\u01b5\u0001\u0000\u0000\u0000\u01b7\u01b8"+ - "\u0001\u0000\u0000\u0000\u01b8K\u0001\u0000\u0000\u0000\u01b9\u01ba\u0005"+ - "\u001e\u0000\u0000\u01ba\u01bb\u0003:\u001d\u0000\u01bbM\u0001\u0000\u0000"+ - "\u0000\u01bc\u01bd\u0005\u001d\u0000\u0000\u01bd\u01be\u0003:\u001d\u0000"+ - "\u01beO\u0001\u0000\u0000\u0000\u01bf\u01c0\u0005 \u0000\u0000\u01c0\u01c5"+ - "\u0003R)\u0000\u01c1\u01c2\u0005<\u0000\u0000\u01c2\u01c4\u0003R)\u0000"+ - "\u01c3\u01c1\u0001\u0000\u0000\u0000\u01c4\u01c7\u0001\u0000\u0000\u0000"+ - "\u01c5\u01c3\u0001\u0000\u0000\u0000\u01c5\u01c6\u0001\u0000\u0000\u0000"+ - "\u01c6Q\u0001\u0000\u0000\u0000\u01c7\u01c5\u0001\u0000\u0000\u0000\u01c8"+ - "\u01c9\u00036\u001b\u0000\u01c9\u01ca\u0005\u0085\u0000\u0000\u01ca\u01cb"+ - "\u00036\u001b\u0000\u01cb\u01d1\u0001\u0000\u0000\u0000\u01cc\u01cd\u0003"+ - "6\u001b\u0000\u01cd\u01ce\u00057\u0000\u0000\u01ce\u01cf\u00036\u001b"+ - "\u0000\u01cf\u01d1\u0001\u0000\u0000\u0000\u01d0\u01c8\u0001\u0000\u0000"+ - "\u0000\u01d0\u01cc\u0001\u0000\u0000\u0000\u01d1S\u0001\u0000\u0000\u0000"+ - "\u01d2\u01d3\u0005\b\u0000\u0000\u01d3\u01d4\u0003\u0094J\u0000\u01d4"+ - "\u01d6\u0003\u00aaU\u0000\u01d5\u01d7\u0003V+\u0000\u01d6\u01d5\u0001"+ - "\u0000\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000\u01d7U\u0001\u0000"+ - "\u0000\u0000\u01d8\u01dd\u0003X,\u0000\u01d9\u01da\u0005<\u0000\u0000"+ - "\u01da\u01dc\u0003X,\u0000\u01db\u01d9\u0001\u0000\u0000\u0000\u01dc\u01df"+ - "\u0001\u0000\u0000\u0000\u01dd\u01db\u0001\u0000\u0000\u0000\u01dd\u01de"+ - "\u0001\u0000\u0000\u0000\u01deW\u0001\u0000\u0000\u0000\u01df\u01dd\u0001"+ - "\u0000\u0000\u0000\u01e0\u01e1\u0003<\u001e\u0000\u01e1\u01e2\u00057\u0000"+ - "\u0000\u01e2\u01e3\u0003\u00a0P\u0000\u01e3Y\u0001\u0000\u0000\u0000\u01e4"+ - "\u01e5\u0005M\u0000\u0000\u01e5\u01e7\u0003\u009aM\u0000\u01e6\u01e4\u0001"+ - "\u0000\u0000\u0000\u01e6\u01e7\u0001\u0000\u0000\u0000\u01e7[\u0001\u0000"+ - "\u0000\u0000\u01e8\u01e9\u0005\n\u0000\u0000\u01e9\u01ea\u0003\u0094J"+ - "\u0000\u01ea\u01eb\u0003\u00aaU\u0000\u01eb]\u0001\u0000\u0000\u0000\u01ec"+ - "\u01ed\u0005\u001c\u0000\u0000\u01ed\u01ee\u00032\u0019\u0000\u01ee_\u0001"+ - "\u0000\u0000\u0000\u01ef\u01f0\u0005\u0006\u0000\u0000\u01f0\u01f1\u0003"+ - "b1\u0000\u01f1a\u0001\u0000\u0000\u0000\u01f2\u01f3\u0005a\u0000\u0000"+ - "\u01f3\u01f4\u0003\u0004\u0002\u0000\u01f4\u01f5\u0005b\u0000\u0000\u01f5"+ - "c\u0001\u0000\u0000\u0000\u01f6\u01f7\u0005\"\u0000\u0000\u01f7\u01f8"+ - "\u0005\u008c\u0000\u0000\u01f8e\u0001\u0000\u0000\u0000\u01f9\u01fa\u0005"+ - "\u0005\u0000\u0000\u01fa\u01fd\u0003h4\u0000\u01fb\u01fc\u0005H\u0000"+ - "\u0000\u01fc\u01fe\u00036\u001b\u0000\u01fd\u01fb\u0001\u0000\u0000\u0000"+ - "\u01fd\u01fe\u0001\u0000\u0000\u0000\u01fe\u0208\u0001\u0000\u0000\u0000"+ - "\u01ff\u0200\u0005M\u0000\u0000\u0200\u0205\u0003j5\u0000\u0201\u0202"+ - "\u0005<\u0000\u0000\u0202\u0204\u0003j5\u0000\u0203\u0201\u0001\u0000"+ - "\u0000\u0000\u0204\u0207\u0001\u0000\u0000\u0000\u0205\u0203\u0001\u0000"+ - "\u0000\u0000\u0205\u0206\u0001\u0000\u0000\u0000\u0206\u0209\u0001\u0000"+ - "\u0000\u0000\u0207\u0205\u0001\u0000\u0000\u0000\u0208\u01ff\u0001\u0000"+ - "\u0000\u0000\u0208\u0209\u0001\u0000\u0000\u0000\u0209g\u0001\u0000\u0000"+ - "\u0000\u020a\u020b\u0007\u0004\u0000\u0000\u020bi\u0001\u0000\u0000\u0000"+ - "\u020c\u020d\u00036\u001b\u0000\u020d\u020e\u00057\u0000\u0000\u020e\u0210"+ - "\u0001\u0000\u0000\u0000\u020f\u020c\u0001\u0000\u0000\u0000\u020f\u0210"+ - "\u0001\u0000\u0000\u0000\u0210\u0211\u0001\u0000\u0000\u0000\u0211\u0212"+ - "\u00036\u001b\u0000\u0212k\u0001\u0000\u0000\u0000\u0213\u0214\u0005\u000e"+ - "\u0000\u0000\u0214\u0215\u0003\u00a0P\u0000\u0215m\u0001\u0000\u0000\u0000"+ - "\u0216\u0217\u0005\u0004\u0000\u0000\u0217\u021a\u00032\u0019\u0000\u0218"+ - "\u0219\u0005H\u0000\u0000\u0219\u021b\u00032\u0019\u0000\u021a\u0218\u0001"+ - "\u0000\u0000\u0000\u021a\u021b\u0001\u0000\u0000\u0000\u021b\u0221\u0001"+ - "\u0000\u0000\u0000\u021c\u021d\u0005\u0085\u0000\u0000\u021d\u021e\u0003"+ - "2\u0019\u0000\u021e\u021f\u0005<\u0000\u0000\u021f\u0220\u00032\u0019"+ - "\u0000\u0220\u0222\u0001\u0000\u0000\u0000\u0221\u021c\u0001\u0000\u0000"+ - "\u0000\u0221\u0222\u0001\u0000\u0000\u0000\u0222o\u0001\u0000\u0000\u0000"+ - "\u0223\u0224\u0005\u0015\u0000\u0000\u0224\u0225\u0003r9\u0000\u0225q"+ - "\u0001\u0000\u0000\u0000\u0226\u0228\u0003t:\u0000\u0227\u0226\u0001\u0000"+ - "\u0000\u0000\u0228\u0229\u0001\u0000\u0000\u0000\u0229\u0227\u0001\u0000"+ - "\u0000\u0000\u0229\u022a\u0001\u0000\u0000\u0000\u022as\u0001\u0000\u0000"+ - "\u0000\u022b\u022c\u0005a\u0000\u0000\u022c\u022d\u0003v;\u0000\u022d"+ - "\u022e\u0005b\u0000\u0000\u022eu\u0001\u0000\u0000\u0000\u022f\u0230\u0006"+ - ";\uffff\uffff\u0000\u0230\u0231\u0003x<\u0000\u0231\u0237\u0001\u0000"+ - "\u0000\u0000\u0232\u0233\n\u0001\u0000\u0000\u0233\u0234\u00051\u0000"+ - "\u0000\u0234\u0236\u0003x<\u0000\u0235\u0232\u0001\u0000\u0000\u0000\u0236"+ - "\u0239\u0001\u0000\u0000\u0000\u0237\u0235\u0001\u0000\u0000\u0000\u0237"+ - "\u0238\u0001\u0000\u0000\u0000\u0238w\u0001\u0000\u0000\u0000\u0239\u0237"+ - "\u0001\u0000\u0000\u0000\u023a\u023b\u0003\b\u0004\u0000\u023by\u0001"+ - "\u0000\u0000\u0000\u023c\u0240\u0005\f\u0000\u0000\u023d\u023e\u00032"+ - "\u0019\u0000\u023e\u023f\u00057\u0000\u0000\u023f\u0241\u0001\u0000\u0000"+ - "\u0000\u0240\u023d\u0001\u0000\u0000\u0000\u0240\u0241\u0001\u0000\u0000"+ - "\u0000\u0241\u0242\u0001\u0000\u0000\u0000\u0242\u0243\u0003\u00a0P\u0000"+ - "\u0243\u0244\u0005H\u0000\u0000\u0244\u0245\u0003\u0014\n\u0000\u0245"+ - "\u0246\u0003Z-\u0000\u0246{\u0001\u0000\u0000\u0000\u0247\u024b\u0005"+ - "\u0007\u0000\u0000\u0248\u0249\u00032\u0019\u0000\u0249\u024a\u00057\u0000"+ - "\u0000\u024a\u024c\u0001\u0000\u0000\u0000\u024b\u0248\u0001\u0000\u0000"+ - "\u0000\u024b\u024c\u0001\u0000\u0000\u0000\u024c\u024d\u0001\u0000\u0000"+ - "\u0000\u024d\u024e\u0003\u0094J\u0000\u024e\u024f\u0003Z-\u0000\u024f"+ - "}\u0001\u0000\u0000\u0000\u0250\u0251\u0005\u001b\u0000\u0000\u0251\u0252"+ - "\u0003\u001e\u000f\u0000\u0252\u0253\u0005H\u0000\u0000\u0253\u0254\u0003"+ - ":\u001d\u0000\u0254\u007f\u0001\u0000\u0000\u0000\u0255\u0256\u0005\u0012"+ - "\u0000\u0000\u0256\u0259\u0003.\u0017\u0000\u0257\u0258\u00058\u0000\u0000"+ - "\u0258\u025a\u0003\u0010\b\u0000\u0259\u0257\u0001\u0000\u0000\u0000\u0259"+ - "\u025a\u0001\u0000\u0000\u0000\u025a\u0081\u0001\u0000\u0000\u0000\u025b"+ - "\u025c\u0005\u001f\u0000\u0000\u025c\u025d\u0003:\u001d\u0000\u025d\u0083"+ - "\u0001\u0000\u0000\u0000\u025e\u0260\u0005\u0016\u0000\u0000\u025f\u0261"+ - "\u0003<\u001e\u0000\u0260\u025f\u0001\u0000\u0000\u0000\u0260\u0261\u0001"+ - "\u0000\u0000\u0000\u0261\u0262\u0001\u0000\u0000\u0000\u0262\u0263\u0003"+ - "Z-\u0000\u0263\u0085\u0001\u0000\u0000\u0000\u0264\u0265\u0005!\u0000"+ - "\u0000\u0265\u0266\u0003\u0088D\u0000\u0266\u0267\u0005;\u0000\u0000\u0267"+ - "\u0087\u0001\u0000\u0000\u0000\u0268\u0269\u0003<\u001e\u0000\u0269\u026a"+ - "\u00057\u0000\u0000\u026a\u026b\u0003\u00a0P\u0000\u026b\u0089\u0001\u0000"+ - "\u0000\u0000\u026c\u026d\u0006E\uffff\uffff\u0000\u026d\u026e\u0005E\u0000"+ - "\u0000\u026e\u028a\u0003\u008aE\b\u026f\u028a\u0003\u0090H\u0000\u0270"+ - "\u028a\u0003\u008cF\u0000\u0271\u0273\u0003\u0090H\u0000\u0272\u0274\u0005"+ - "E\u0000\u0000\u0273\u0272\u0001\u0000\u0000\u0000\u0273\u0274\u0001\u0000"+ - "\u0000\u0000\u0274\u0275\u0001\u0000\u0000\u0000\u0275\u0276\u0005A\u0000"+ - "\u0000\u0276\u0277\u0005a\u0000\u0000\u0277\u027c\u0003\u0090H\u0000\u0278"+ - "\u0279\u0005<\u0000\u0000\u0279\u027b\u0003\u0090H\u0000\u027a\u0278\u0001"+ - "\u0000\u0000\u0000\u027b\u027e\u0001\u0000\u0000\u0000\u027c\u027a\u0001"+ - "\u0000\u0000\u0000\u027c\u027d\u0001\u0000\u0000\u0000\u027d\u027f\u0001"+ - "\u0000\u0000\u0000\u027e\u027c\u0001\u0000\u0000\u0000\u027f\u0280\u0005"+ - "b\u0000\u0000\u0280\u028a\u0001\u0000\u0000\u0000\u0281\u0282\u0003\u0090"+ - "H\u0000\u0282\u0284\u0005B\u0000\u0000\u0283\u0285\u0005E\u0000\u0000"+ - "\u0284\u0283\u0001\u0000\u0000\u0000\u0284\u0285\u0001\u0000\u0000\u0000"+ - "\u0285\u0286\u0001\u0000\u0000\u0000\u0286\u0287\u0005F\u0000\u0000\u0287"+ - "\u028a\u0001\u0000\u0000\u0000\u0288\u028a\u0003\u008eG\u0000\u0289\u026c"+ - "\u0001\u0000\u0000\u0000\u0289\u026f\u0001\u0000\u0000\u0000\u0289\u0270"+ - "\u0001\u0000\u0000\u0000\u0289\u0271\u0001\u0000\u0000\u0000\u0289\u0281"+ - "\u0001\u0000\u0000\u0000\u0289\u0288\u0001\u0000\u0000\u0000\u028a\u0293"+ - "\u0001\u0000\u0000\u0000\u028b\u028c\n\u0005\u0000\u0000\u028c\u028d\u0005"+ - "5\u0000\u0000\u028d\u0292\u0003\u008aE\u0006\u028e\u028f\n\u0004\u0000"+ - "\u0000\u028f\u0290\u0005I\u0000\u0000\u0290\u0292\u0003\u008aE\u0005\u0291"+ - "\u028b\u0001\u0000\u0000\u0000\u0291\u028e\u0001\u0000\u0000\u0000\u0292"+ - "\u0295\u0001\u0000\u0000\u0000\u0293\u0291\u0001\u0000\u0000\u0000\u0293"+ - "\u0294\u0001\u0000\u0000\u0000\u0294\u008b\u0001\u0000\u0000\u0000\u0295"+ - "\u0293\u0001\u0000\u0000\u0000\u0296\u0298\u0003\u0090H\u0000\u0297\u0299"+ - "\u0005E\u0000\u0000\u0298\u0297\u0001\u0000\u0000\u0000\u0298\u0299\u0001"+ - "\u0000\u0000\u0000\u0299\u029a\u0001\u0000\u0000\u0000\u029a\u029b\u0005"+ - "D\u0000\u0000\u029b\u029c\u0003\u00aaU\u0000\u029c\u02c5\u0001\u0000\u0000"+ - "\u0000\u029d\u029f\u0003\u0090H\u0000\u029e\u02a0\u0005E\u0000\u0000\u029f"+ - "\u029e\u0001\u0000\u0000\u0000\u029f\u02a0\u0001\u0000\u0000\u0000\u02a0"+ - "\u02a1\u0001\u0000\u0000\u0000\u02a1\u02a2\u0005K\u0000\u0000\u02a2\u02a3"+ - "\u0003\u00aaU\u0000\u02a3\u02c5\u0001\u0000\u0000\u0000\u02a4\u02a6\u0003"+ - "\u0090H\u0000\u02a5\u02a7\u0005E\u0000\u0000\u02a6\u02a5\u0001\u0000\u0000"+ - "\u0000\u02a6\u02a7\u0001\u0000\u0000\u0000\u02a7\u02a8\u0001\u0000\u0000"+ - "\u0000\u02a8\u02a9\u0005D\u0000\u0000\u02a9\u02aa\u0005a\u0000\u0000\u02aa"+ - "\u02af\u0003\u00aaU\u0000\u02ab\u02ac\u0005<\u0000\u0000\u02ac\u02ae\u0003"+ - "\u00aaU\u0000\u02ad\u02ab\u0001\u0000\u0000\u0000\u02ae\u02b1\u0001\u0000"+ - "\u0000\u0000\u02af\u02ad\u0001\u0000\u0000\u0000\u02af\u02b0\u0001\u0000"+ - "\u0000\u0000\u02b0\u02b2\u0001\u0000\u0000\u0000\u02b1\u02af\u0001\u0000"+ - "\u0000\u0000\u02b2\u02b3\u0005b\u0000\u0000\u02b3\u02c5\u0001\u0000\u0000"+ - "\u0000\u02b4\u02b6\u0003\u0090H\u0000\u02b5\u02b7\u0005E\u0000\u0000\u02b6"+ - "\u02b5\u0001\u0000\u0000\u0000\u02b6\u02b7\u0001\u0000\u0000\u0000\u02b7"+ - "\u02b8\u0001\u0000\u0000\u0000\u02b8\u02b9\u0005K\u0000\u0000\u02b9\u02ba"+ - "\u0005a\u0000\u0000\u02ba\u02bf\u0003\u00aaU\u0000\u02bb\u02bc\u0005<"+ - "\u0000\u0000\u02bc\u02be\u0003\u00aaU\u0000\u02bd\u02bb\u0001\u0000\u0000"+ - "\u0000\u02be\u02c1\u0001\u0000\u0000\u0000\u02bf\u02bd\u0001\u0000\u0000"+ - "\u0000\u02bf\u02c0\u0001\u0000\u0000\u0000\u02c0\u02c2\u0001\u0000\u0000"+ - "\u0000\u02c1\u02bf\u0001\u0000\u0000\u0000\u02c2\u02c3\u0005b\u0000\u0000"+ - "\u02c3\u02c5\u0001\u0000\u0000\u0000\u02c4\u0296\u0001\u0000\u0000\u0000"+ - "\u02c4\u029d\u0001\u0000\u0000\u0000\u02c4\u02a4\u0001\u0000\u0000\u0000"+ - "\u02c4\u02b4\u0001\u0000\u0000\u0000\u02c5\u008d\u0001\u0000\u0000\u0000"+ - "\u02c6\u02c9\u00032\u0019\u0000\u02c7\u02c8\u00059\u0000\u0000\u02c8\u02ca"+ - "\u0003\f\u0006\u0000\u02c9\u02c7\u0001\u0000\u0000\u0000\u02c9\u02ca\u0001"+ - "\u0000\u0000\u0000\u02ca\u02cb\u0001\u0000\u0000\u0000\u02cb\u02cc\u0005"+ - ":\u0000\u0000\u02cc\u02cd\u0003\u00a0P\u0000\u02cd\u008f\u0001\u0000\u0000"+ - "\u0000\u02ce\u02d4\u0003\u0092I\u0000\u02cf\u02d0\u0003\u0092I\u0000\u02d0"+ - "\u02d1\u0003\u00acV\u0000\u02d1\u02d2\u0003\u0092I\u0000\u02d2\u02d4\u0001"+ - "\u0000\u0000\u0000\u02d3\u02ce\u0001\u0000\u0000\u0000\u02d3\u02cf\u0001"+ - "\u0000\u0000\u0000\u02d4\u0091\u0001\u0000\u0000\u0000\u02d5\u02d6\u0006"+ - "I\uffff\uffff\u0000\u02d6\u02da\u0003\u0094J\u0000\u02d7\u02d8\u0007\u0005"+ - "\u0000\u0000\u02d8\u02da\u0003\u0092I\u0003\u02d9\u02d5\u0001\u0000\u0000"+ - "\u0000\u02d9\u02d7\u0001\u0000\u0000\u0000\u02da\u02e3\u0001\u0000\u0000"+ - "\u0000\u02db\u02dc\n\u0002\u0000\u0000\u02dc\u02dd\u0007\u0006\u0000\u0000"+ - "\u02dd\u02e2\u0003\u0092I\u0003\u02de\u02df\n\u0001\u0000\u0000\u02df"+ - "\u02e0\u0007\u0005\u0000\u0000\u02e0\u02e2\u0003\u0092I\u0002\u02e1\u02db"+ - "\u0001\u0000\u0000\u0000\u02e1\u02de\u0001\u0000\u0000\u0000\u02e2\u02e5"+ - "\u0001\u0000\u0000\u0000\u02e3\u02e1\u0001\u0000\u0000\u0000\u02e3\u02e4"+ - "\u0001\u0000\u0000\u0000\u02e4\u0093\u0001\u0000\u0000\u0000\u02e5\u02e3"+ - "\u0001\u0000\u0000\u0000\u02e6\u02e7\u0006J\uffff\uffff\u0000\u02e7\u02ef"+ - "\u0003\u00a0P\u0000\u02e8\u02ef\u00032\u0019\u0000\u02e9\u02ef\u0003\u0096"+ - "K\u0000\u02ea\u02eb\u0005a\u0000\u0000\u02eb\u02ec\u0003\u008aE\u0000"+ - "\u02ec\u02ed\u0005b\u0000\u0000\u02ed\u02ef\u0001\u0000\u0000\u0000\u02ee"+ - "\u02e6\u0001\u0000\u0000\u0000\u02ee\u02e8\u0001\u0000\u0000\u0000\u02ee"+ - "\u02e9\u0001\u0000\u0000\u0000\u02ee\u02ea\u0001\u0000\u0000\u0000\u02ef"+ - "\u02f5\u0001\u0000\u0000\u0000\u02f0\u02f1\n\u0001\u0000\u0000\u02f1\u02f2"+ - "\u00059\u0000\u0000\u02f2\u02f4\u0003\f\u0006\u0000\u02f3\u02f0\u0001"+ - "\u0000\u0000\u0000\u02f4\u02f7\u0001\u0000\u0000\u0000\u02f5\u02f3\u0001"+ - "\u0000\u0000\u0000\u02f5\u02f6\u0001\u0000\u0000\u0000\u02f6\u0095\u0001"+ - "\u0000\u0000\u0000\u02f7\u02f5\u0001\u0000\u0000\u0000\u02f8\u02f9\u0003"+ - "\u0098L\u0000\u02f9\u0307\u0005a\u0000\u0000\u02fa\u0308\u0005W\u0000"+ - "\u0000\u02fb\u0300\u0003\u008aE\u0000\u02fc\u02fd\u0005<\u0000\u0000\u02fd"+ - "\u02ff\u0003\u008aE\u0000\u02fe\u02fc\u0001\u0000\u0000\u0000\u02ff\u0302"+ - "\u0001\u0000\u0000\u0000\u0300\u02fe\u0001\u0000\u0000\u0000\u0300\u0301"+ - "\u0001\u0000\u0000\u0000\u0301\u0305\u0001\u0000\u0000\u0000\u0302\u0300"+ - "\u0001\u0000\u0000\u0000\u0303\u0304\u0005<\u0000\u0000\u0304\u0306\u0003"+ - "\u009aM\u0000\u0305\u0303\u0001\u0000\u0000\u0000\u0305\u0306\u0001\u0000"+ - "\u0000\u0000\u0306\u0308\u0001\u0000\u0000\u0000\u0307\u02fa\u0001\u0000"+ - "\u0000\u0000\u0307\u02fb\u0001\u0000\u0000\u0000\u0307\u0308\u0001\u0000"+ - "\u0000\u0000\u0308\u0309\u0001\u0000\u0000\u0000\u0309\u030a\u0005b\u0000"+ - "\u0000\u030a\u0097\u0001\u0000\u0000\u0000\u030b\u030f\u0003D\"\u0000"+ - "\u030c\u030f\u0005@\u0000\u0000\u030d\u030f\u0005C\u0000\u0000\u030e\u030b"+ - "\u0001\u0000\u0000\u0000\u030e\u030c\u0001\u0000\u0000\u0000\u030e\u030d"+ - "\u0001\u0000\u0000\u0000\u030f\u0099\u0001\u0000\u0000\u0000\u0310\u0319"+ - "\u0005Z\u0000\u0000\u0311\u0316\u0003\u009cN\u0000\u0312\u0313\u0005<"+ - "\u0000\u0000\u0313\u0315\u0003\u009cN\u0000\u0314\u0312\u0001\u0000\u0000"+ - "\u0000\u0315\u0318\u0001\u0000\u0000\u0000\u0316\u0314\u0001\u0000\u0000"+ - "\u0000\u0316\u0317\u0001\u0000\u0000\u0000\u0317\u031a\u0001\u0000\u0000"+ - "\u0000\u0318\u0316\u0001\u0000\u0000\u0000\u0319\u0311\u0001\u0000\u0000"+ - "\u0000\u0319\u031a\u0001\u0000\u0000\u0000\u031a\u031b\u0001\u0000\u0000"+ - "\u0000\u031b\u031c\u0005[\u0000\u0000\u031c\u009b\u0001\u0000\u0000\u0000"+ - "\u031d\u031e\u0003\u00aaU\u0000\u031e\u031f\u0005:\u0000\u0000\u031f\u0320"+ - "\u0003\u009eO\u0000\u0320\u009d\u0001\u0000\u0000\u0000\u0321\u0324\u0003"+ - "\u00a0P\u0000\u0322\u0324\u0003\u009aM\u0000\u0323\u0321\u0001\u0000\u0000"+ - "\u0000\u0323\u0322\u0001\u0000\u0000\u0000\u0324\u009f\u0001\u0000\u0000"+ - "\u0000\u0325\u0350\u0005F\u0000\u0000\u0326\u0327\u0003\u00a8T\u0000\u0327"+ - "\u0328\u0005c\u0000\u0000\u0328\u0350\u0001\u0000\u0000\u0000\u0329\u0350"+ - "\u0003\u00a6S\u0000\u032a\u0350\u0003\u00a8T\u0000\u032b\u0350\u0003\u00a2"+ - "Q\u0000\u032c\u0350\u0003@ \u0000\u032d\u0350\u0003\u00aaU\u0000\u032e"+ - "\u032f\u0005_\u0000\u0000\u032f\u0334\u0003\u00a4R\u0000\u0330\u0331\u0005"+ - "<\u0000\u0000\u0331\u0333\u0003\u00a4R\u0000\u0332\u0330\u0001\u0000\u0000"+ - "\u0000\u0333\u0336\u0001\u0000\u0000\u0000\u0334\u0332\u0001\u0000\u0000"+ - "\u0000\u0334\u0335\u0001\u0000\u0000\u0000\u0335\u0337\u0001\u0000\u0000"+ - "\u0000\u0336\u0334\u0001\u0000\u0000\u0000\u0337\u0338\u0005`\u0000\u0000"+ - "\u0338\u0350\u0001\u0000\u0000\u0000\u0339\u033a\u0005_\u0000\u0000\u033a"+ - "\u033f\u0003\u00a2Q\u0000\u033b\u033c\u0005<\u0000\u0000\u033c\u033e\u0003"+ - "\u00a2Q\u0000\u033d\u033b\u0001\u0000\u0000\u0000\u033e\u0341\u0001\u0000"+ - "\u0000\u0000\u033f\u033d\u0001\u0000\u0000\u0000\u033f\u0340\u0001\u0000"+ - "\u0000\u0000\u0340\u0342\u0001\u0000\u0000\u0000\u0341\u033f\u0001\u0000"+ - "\u0000\u0000\u0342\u0343\u0005`\u0000\u0000\u0343\u0350\u0001\u0000\u0000"+ - "\u0000\u0344\u0345\u0005_\u0000\u0000\u0345\u034a\u0003\u00aaU\u0000\u0346"+ - "\u0347\u0005<\u0000\u0000\u0347\u0349\u0003\u00aaU\u0000\u0348\u0346\u0001"+ - "\u0000\u0000\u0000\u0349\u034c\u0001\u0000\u0000\u0000\u034a\u0348\u0001"+ - "\u0000\u0000\u0000\u034a\u034b\u0001\u0000\u0000\u0000\u034b\u034d\u0001"+ - "\u0000\u0000\u0000\u034c\u034a\u0001\u0000\u0000\u0000\u034d\u034e\u0005"+ - "`\u0000\u0000\u034e\u0350\u0001\u0000\u0000\u0000\u034f\u0325\u0001\u0000"+ - "\u0000\u0000\u034f\u0326\u0001\u0000\u0000\u0000\u034f\u0329\u0001\u0000"+ - "\u0000\u0000\u034f\u032a\u0001\u0000\u0000\u0000\u034f\u032b\u0001\u0000"+ - "\u0000\u0000\u034f\u032c\u0001\u0000\u0000\u0000\u034f\u032d\u0001\u0000"+ - "\u0000\u0000\u034f\u032e\u0001\u0000\u0000\u0000\u034f\u0339\u0001\u0000"+ - "\u0000\u0000\u034f\u0344\u0001\u0000\u0000\u0000\u0350\u00a1\u0001\u0000"+ - "\u0000\u0000\u0351\u0352\u0007\u0007\u0000\u0000\u0352\u00a3\u0001\u0000"+ - "\u0000\u0000\u0353\u0356\u0003\u00a6S\u0000\u0354\u0356\u0003\u00a8T\u0000"+ - "\u0355\u0353\u0001\u0000\u0000\u0000\u0355\u0354\u0001\u0000\u0000\u0000"+ - "\u0356\u00a5\u0001\u0000\u0000\u0000\u0357\u0359\u0007\u0005\u0000\u0000"+ - "\u0358\u0357\u0001\u0000\u0000\u0000\u0358\u0359\u0001\u0000\u0000\u0000"+ - "\u0359\u035a\u0001\u0000\u0000\u0000\u035a\u035b\u00054\u0000\u0000\u035b"+ - "\u00a7\u0001\u0000\u0000\u0000\u035c\u035e\u0007\u0005\u0000\u0000\u035d"+ - "\u035c\u0001\u0000\u0000\u0000\u035d\u035e\u0001\u0000\u0000\u0000\u035e"+ - "\u035f\u0001\u0000\u0000\u0000\u035f\u0360\u00053\u0000\u0000\u0360\u00a9"+ - "\u0001\u0000\u0000\u0000\u0361\u0362\u00052\u0000\u0000\u0362\u00ab\u0001"+ - "\u0000\u0000\u0000\u0363\u0364\u0007\b\u0000\u0000\u0364\u00ad\u0001\u0000"+ - "\u0000\u0000\u0365\u0366\u0007\t\u0000\u0000\u0366\u0367\u0005s\u0000"+ - "\u0000\u0367\u0368\u0003\u00b0X\u0000\u0368\u0369\u0003\u00b2Y\u0000\u0369"+ - "\u00af\u0001\u0000\u0000\u0000\u036a\u036b\u0004X\u000f\u0000\u036b\u036d"+ - "\u0003\u001e\u000f\u0000\u036c\u036e\u0005\u0085\u0000\u0000\u036d\u036c"+ - "\u0001\u0000\u0000\u0000\u036d\u036e\u0001\u0000\u0000\u0000\u036e\u036f"+ - "\u0001\u0000\u0000\u0000\u036f\u0370\u0005i\u0000\u0000\u0370\u0373\u0001"+ - "\u0000\u0000\u0000\u0371\u0373\u0003\u001e\u000f\u0000\u0372\u036a\u0001"+ - "\u0000\u0000\u0000\u0372\u0371\u0001\u0000\u0000\u0000\u0373\u00b1\u0001"+ - "\u0000\u0000\u0000\u0374\u0375\u0005H\u0000\u0000\u0375\u037a\u0003\u008a"+ - "E\u0000\u0376\u0377\u0005<\u0000\u0000\u0377\u0379\u0003\u008aE\u0000"+ - "\u0378\u0376\u0001\u0000\u0000\u0000\u0379\u037c\u0001\u0000\u0000\u0000"+ - "\u037a\u0378\u0001\u0000\u0000\u0000\u037a\u037b\u0001\u0000\u0000\u0000"+ - "\u037b\u00b3\u0001\u0000\u0000\u0000\u037c\u037a\u0001\u0000\u0000\u0000"+ - "U\u00b8\u00c0\u00cd\u00d6\u00f2\u0101\u0107\u0110\u0116\u0123\u0127\u0132"+ - "\u0142\u014a\u014e\u0155\u015b\u0160\u0169\u0170\u0176\u017f\u0186\u018e"+ - "\u0196\u019a\u019e\u01a3\u01ae\u01b3\u01b7\u01c5\u01d0\u01d6\u01dd\u01e6"+ - "\u01fd\u0205\u0208\u020f\u021a\u0221\u0229\u0237\u0240\u024b\u0259\u0260"+ - "\u0273\u027c\u0284\u0289\u0291\u0293\u0298\u029f\u02a6\u02af\u02b6\u02bf"+ - "\u02c4\u02c9\u02d3\u02d9\u02e1\u02e3\u02ee\u02f5\u0300\u0305\u0307\u030e"+ - "\u0316\u0319\u0323\u0334\u033f\u034a\u034f\u0355\u0358\u035d\u036d\u0372"+ - "\u037a"; + "\u0197?\u0001\u0000\u0000\u0000\u0198\u019b\u0005K\u0000\u0000\u0199\u019b"+ + "\u0005^\u0000\u0000\u019a\u0198\u0001\u0000\u0000\u0000\u019a\u0199\u0001"+ + "\u0000\u0000\u0000\u019bA\u0001\u0000\u0000\u0000\u019c\u019f\u0005]\u0000"+ + "\u0000\u019d\u019f\u0005_\u0000\u0000\u019e\u019c\u0001\u0000\u0000\u0000"+ + "\u019e\u019d\u0001\u0000\u0000\u0000\u019fC\u0001\u0000\u0000\u0000\u01a0"+ + "\u01a4\u0003<\u001e\u0000\u01a1\u01a4\u0003@ \u0000\u01a2\u01a4\u0003"+ + "B!\u0000\u01a3\u01a0\u0001\u0000\u0000\u0000\u01a3\u01a1\u0001\u0000\u0000"+ + "\u0000\u01a3\u01a2\u0001\u0000\u0000\u0000\u01a4E\u0001\u0000\u0000\u0000"+ + "\u01a5\u01a6\u0005\u000b\u0000\u0000\u01a6\u01a7\u0003\u00a0P\u0000\u01a7"+ + "G\u0001\u0000\u0000\u0000\u01a8\u01a9\u0005\u000f\u0000\u0000\u01a9\u01ae"+ + "\u0003J%\u0000\u01aa\u01ab\u0005=\u0000\u0000\u01ab\u01ad\u0003J%\u0000"+ + "\u01ac\u01aa\u0001\u0000\u0000\u0000\u01ad\u01b0\u0001\u0000\u0000\u0000"+ + "\u01ae\u01ac\u0001\u0000\u0000\u0000\u01ae\u01af\u0001\u0000\u0000\u0000"+ + "\u01afI\u0001\u0000\u0000\u0000\u01b0\u01ae\u0001\u0000\u0000\u0000\u01b1"+ + "\u01b3\u0003\u008aE\u0000\u01b2\u01b4\u0007\u0002\u0000\u0000\u01b3\u01b2"+ + "\u0001\u0000\u0000\u0000\u01b3\u01b4\u0001\u0000\u0000\u0000\u01b4\u01b7"+ + "\u0001\u0000\u0000\u0000\u01b5\u01b6\u0005H\u0000\u0000\u01b6\u01b8\u0007"+ + "\u0003\u0000\u0000\u01b7\u01b5\u0001\u0000\u0000\u0000\u01b7\u01b8\u0001"+ + "\u0000\u0000\u0000\u01b8K\u0001\u0000\u0000\u0000\u01b9\u01ba\u0005\u001f"+ + "\u0000\u0000\u01ba\u01bb\u0003:\u001d\u0000\u01bbM\u0001\u0000\u0000\u0000"+ + "\u01bc\u01bd\u0005\u001e\u0000\u0000\u01bd\u01be\u0003:\u001d\u0000\u01be"+ + "O\u0001\u0000\u0000\u0000\u01bf\u01c0\u0005!\u0000\u0000\u01c0\u01c5\u0003"+ + "R)\u0000\u01c1\u01c2\u0005=\u0000\u0000\u01c2\u01c4\u0003R)\u0000\u01c3"+ + "\u01c1\u0001\u0000\u0000\u0000\u01c4\u01c7\u0001\u0000\u0000\u0000\u01c5"+ + "\u01c3\u0001\u0000\u0000\u0000\u01c5\u01c6\u0001\u0000\u0000\u0000\u01c6"+ + "Q\u0001\u0000\u0000\u0000\u01c7\u01c5\u0001\u0000\u0000\u0000\u01c8\u01c9"+ + "\u00036\u001b\u0000\u01c9\u01ca\u0005\u008a\u0000\u0000\u01ca\u01cb\u0003"+ + "6\u001b\u0000\u01cb\u01d1\u0001\u0000\u0000\u0000\u01cc\u01cd\u00036\u001b"+ + "\u0000\u01cd\u01ce\u00058\u0000\u0000\u01ce\u01cf\u00036\u001b\u0000\u01cf"+ + "\u01d1\u0001\u0000\u0000\u0000\u01d0\u01c8\u0001\u0000\u0000\u0000\u01d0"+ + "\u01cc\u0001\u0000\u0000\u0000\u01d1S\u0001\u0000\u0000\u0000\u01d2\u01d3"+ + "\u0005\b\u0000\u0000\u01d3\u01d4\u0003\u0094J\u0000\u01d4\u01d6\u0003"+ + "\u00aaU\u0000\u01d5\u01d7\u0003V+\u0000\u01d6\u01d5\u0001\u0000\u0000"+ + "\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000\u01d7U\u0001\u0000\u0000\u0000"+ + "\u01d8\u01dd\u0003X,\u0000\u01d9\u01da\u0005=\u0000\u0000\u01da\u01dc"+ + "\u0003X,\u0000\u01db\u01d9\u0001\u0000\u0000\u0000\u01dc\u01df\u0001\u0000"+ + "\u0000\u0000\u01dd\u01db\u0001\u0000\u0000\u0000\u01dd\u01de\u0001\u0000"+ + "\u0000\u0000\u01deW\u0001\u0000\u0000\u0000\u01df\u01dd\u0001\u0000\u0000"+ + "\u0000\u01e0\u01e1\u0003<\u001e\u0000\u01e1\u01e2\u00058\u0000\u0000\u01e2"+ + "\u01e3\u0003\u00a0P\u0000\u01e3Y\u0001\u0000\u0000\u0000\u01e4\u01e5\u0005"+ + "N\u0000\u0000\u01e5\u01e7\u0003\u009aM\u0000\u01e6\u01e4\u0001\u0000\u0000"+ + "\u0000\u01e6\u01e7\u0001\u0000\u0000\u0000\u01e7[\u0001\u0000\u0000\u0000"+ + "\u01e8\u01e9\u0005\n\u0000\u0000\u01e9\u01ea\u0003\u0094J\u0000\u01ea"+ + "\u01eb\u0003\u00aaU\u0000\u01eb]\u0001\u0000\u0000\u0000\u01ec\u01ed\u0005"+ + "\u001d\u0000\u0000\u01ed\u01ee\u00032\u0019\u0000\u01ee_\u0001\u0000\u0000"+ + "\u0000\u01ef\u01f0\u0005\u0006\u0000\u0000\u01f0\u01f1\u0003b1\u0000\u01f1"+ + "a\u0001\u0000\u0000\u0000\u01f2\u01f3\u0005b\u0000\u0000\u01f3\u01f4\u0003"+ + "\u0004\u0002\u0000\u01f4\u01f5\u0005c\u0000\u0000\u01f5c\u0001\u0000\u0000"+ + "\u0000\u01f6\u01f7\u0005#\u0000\u0000\u01f7\u01f8\u0005\u0091\u0000\u0000"+ + "\u01f8e\u0001\u0000\u0000\u0000\u01f9\u01fa\u0005\u0005\u0000\u0000\u01fa"+ + "\u01fd\u0003h4\u0000\u01fb\u01fc\u0005I\u0000\u0000\u01fc\u01fe\u0003"+ + "6\u001b\u0000\u01fd\u01fb\u0001\u0000\u0000\u0000\u01fd\u01fe\u0001\u0000"+ + "\u0000\u0000\u01fe\u0208\u0001\u0000\u0000\u0000\u01ff\u0200\u0005N\u0000"+ + "\u0000\u0200\u0205\u0003j5\u0000\u0201\u0202\u0005=\u0000\u0000\u0202"+ + "\u0204\u0003j5\u0000\u0203\u0201\u0001\u0000\u0000\u0000\u0204\u0207\u0001"+ + "\u0000\u0000\u0000\u0205\u0203\u0001\u0000\u0000\u0000\u0205\u0206\u0001"+ + "\u0000\u0000\u0000\u0206\u0209\u0001\u0000\u0000\u0000\u0207\u0205\u0001"+ + "\u0000\u0000\u0000\u0208\u01ff\u0001\u0000\u0000\u0000\u0208\u0209\u0001"+ + "\u0000\u0000\u0000\u0209g\u0001\u0000\u0000\u0000\u020a\u020b\u0007\u0004"+ + "\u0000\u0000\u020bi\u0001\u0000\u0000\u0000\u020c\u020d\u00036\u001b\u0000"+ + "\u020d\u020e\u00058\u0000\u0000\u020e\u0210\u0001\u0000\u0000\u0000\u020f"+ + "\u020c\u0001\u0000\u0000\u0000\u020f\u0210\u0001\u0000\u0000\u0000\u0210"+ + "\u0211\u0001\u0000\u0000\u0000\u0211\u0212\u00036\u001b\u0000\u0212k\u0001"+ + "\u0000\u0000\u0000\u0213\u0214\u0005\u000e\u0000\u0000\u0214\u0215\u0003"+ + "\u00a0P\u0000\u0215m\u0001\u0000\u0000\u0000\u0216\u0217\u0005\u0004\u0000"+ + "\u0000\u0217\u021a\u00032\u0019\u0000\u0218\u0219\u0005I\u0000\u0000\u0219"+ + "\u021b\u00032\u0019\u0000\u021a\u0218\u0001\u0000\u0000\u0000\u021a\u021b"+ + "\u0001\u0000\u0000\u0000\u021b\u0221\u0001\u0000\u0000\u0000\u021c\u021d"+ + "\u0005\u008a\u0000\u0000\u021d\u021e\u00032\u0019\u0000\u021e\u021f\u0005"+ + "=\u0000\u0000\u021f\u0220\u00032\u0019\u0000\u0220\u0222\u0001\u0000\u0000"+ + "\u0000\u0221\u021c\u0001\u0000\u0000\u0000\u0221\u0222\u0001\u0000\u0000"+ + "\u0000\u0222o\u0001\u0000\u0000\u0000\u0223\u0224\u0005\u0014\u0000\u0000"+ + "\u0224\u0225\u0003r9\u0000\u0225q\u0001\u0000\u0000\u0000\u0226\u0228"+ + "\u0003t:\u0000\u0227\u0226\u0001\u0000\u0000\u0000\u0228\u0229\u0001\u0000"+ + "\u0000\u0000\u0229\u0227\u0001\u0000\u0000\u0000\u0229\u022a\u0001\u0000"+ + "\u0000\u0000\u022as\u0001\u0000\u0000\u0000\u022b\u022c\u0005b\u0000\u0000"+ + "\u022c\u022d\u0003v;\u0000\u022d\u022e\u0005c\u0000\u0000\u022eu\u0001"+ + "\u0000\u0000\u0000\u022f\u0230\u0006;\uffff\uffff\u0000\u0230\u0231\u0003"+ + "x<\u0000\u0231\u0237\u0001\u0000\u0000\u0000\u0232\u0233\n\u0001\u0000"+ + "\u0000\u0233\u0234\u00052\u0000\u0000\u0234\u0236\u0003x<\u0000\u0235"+ + "\u0232\u0001\u0000\u0000\u0000\u0236\u0239\u0001\u0000\u0000\u0000\u0237"+ + "\u0235\u0001\u0000\u0000\u0000\u0237\u0238\u0001\u0000\u0000\u0000\u0238"+ + "w\u0001\u0000\u0000\u0000\u0239\u0237\u0001\u0000\u0000\u0000\u023a\u023b"+ + "\u0003\b\u0004\u0000\u023by\u0001\u0000\u0000\u0000\u023c\u0240\u0005"+ + "\f\u0000\u0000\u023d\u023e\u00032\u0019\u0000\u023e\u023f\u00058\u0000"+ + "\u0000\u023f\u0241\u0001\u0000\u0000\u0000\u0240\u023d\u0001\u0000\u0000"+ + "\u0000\u0240\u0241\u0001\u0000\u0000\u0000\u0241\u0242\u0001\u0000\u0000"+ + "\u0000\u0242\u0243\u0003\u00a0P\u0000\u0243\u0244\u0005I\u0000\u0000\u0244"+ + "\u0245\u0003\u0014\n\u0000\u0245\u0246\u0003Z-\u0000\u0246{\u0001\u0000"+ + "\u0000\u0000\u0247\u024b\u0005\u0007\u0000\u0000\u0248\u0249\u00032\u0019"+ + "\u0000\u0249\u024a\u00058\u0000\u0000\u024a\u024c\u0001\u0000\u0000\u0000"+ + "\u024b\u0248\u0001\u0000\u0000\u0000\u024b\u024c\u0001\u0000\u0000\u0000"+ + "\u024c\u024d\u0001\u0000\u0000\u0000\u024d\u024e\u0003\u0094J\u0000\u024e"+ + "\u024f\u0003Z-\u0000\u024f}\u0001\u0000\u0000\u0000\u0250\u0251\u0005"+ + "\u001c\u0000\u0000\u0251\u0252\u0003\u001e\u000f\u0000\u0252\u0253\u0005"+ + "I\u0000\u0000\u0253\u0254\u0003:\u001d\u0000\u0254\u007f\u0001\u0000\u0000"+ + "\u0000\u0255\u0256\u0005\u0016\u0000\u0000\u0256\u0257\u0005t\u0000\u0000"+ + "\u0257\u025a\u0003.\u0017\u0000\u0258\u0259\u00059\u0000\u0000\u0259\u025b"+ + "\u0003\u0010\b\u0000\u025a\u0258\u0001\u0000\u0000\u0000\u025a\u025b\u0001"+ + "\u0000\u0000\u0000\u025b\u0263\u0001\u0000\u0000\u0000\u025c\u025d\u0005"+ + "\u0017\u0000\u0000\u025d\u0260\u0003.\u0017\u0000\u025e\u025f\u00059\u0000"+ + "\u0000\u025f\u0261\u0003\u0010\b\u0000\u0260\u025e\u0001\u0000\u0000\u0000"+ + "\u0260\u0261\u0001\u0000\u0000\u0000\u0261\u0263\u0001\u0000\u0000\u0000"+ + "\u0262\u0255\u0001\u0000\u0000\u0000\u0262\u025c\u0001\u0000\u0000\u0000"+ + "\u0263\u0081\u0001\u0000\u0000\u0000\u0264\u0265\u0005 \u0000\u0000\u0265"+ + "\u0266\u0003:\u001d\u0000\u0266\u0083\u0001\u0000\u0000\u0000\u0267\u0269"+ + "\u0005\u0015\u0000\u0000\u0268\u026a\u0003<\u001e\u0000\u0269\u0268\u0001"+ + "\u0000\u0000\u0000\u0269\u026a\u0001\u0000\u0000\u0000\u026a\u026b\u0001"+ + "\u0000\u0000\u0000\u026b\u026c\u0003Z-\u0000\u026c\u0085\u0001\u0000\u0000"+ + "\u0000\u026d\u026e\u0005\"\u0000\u0000\u026e\u026f\u0003\u0088D\u0000"+ + "\u026f\u0270\u0005<\u0000\u0000\u0270\u0087\u0001\u0000\u0000\u0000\u0271"+ + "\u0272\u0003<\u001e\u0000\u0272\u0273\u00058\u0000\u0000\u0273\u0274\u0003"+ + "\u00a0P\u0000\u0274\u0089\u0001\u0000\u0000\u0000\u0275\u0276\u0006E\uffff"+ + "\uffff\u0000\u0276\u0277\u0005F\u0000\u0000\u0277\u0293\u0003\u008aE\b"+ + "\u0278\u0293\u0003\u0090H\u0000\u0279\u0293\u0003\u008cF\u0000\u027a\u027c"+ + "\u0003\u0090H\u0000\u027b\u027d\u0005F\u0000\u0000\u027c\u027b\u0001\u0000"+ + "\u0000\u0000\u027c\u027d\u0001\u0000\u0000\u0000\u027d\u027e\u0001\u0000"+ + "\u0000\u0000\u027e\u027f\u0005B\u0000\u0000\u027f\u0280\u0005b\u0000\u0000"+ + "\u0280\u0285\u0003\u0090H\u0000\u0281\u0282\u0005=\u0000\u0000\u0282\u0284"+ + "\u0003\u0090H\u0000\u0283\u0281\u0001\u0000\u0000\u0000\u0284\u0287\u0001"+ + "\u0000\u0000\u0000\u0285\u0283\u0001\u0000\u0000\u0000\u0285\u0286\u0001"+ + "\u0000\u0000\u0000\u0286\u0288\u0001\u0000\u0000\u0000\u0287\u0285\u0001"+ + "\u0000\u0000\u0000\u0288\u0289\u0005c\u0000\u0000\u0289\u0293\u0001\u0000"+ + "\u0000\u0000\u028a\u028b\u0003\u0090H\u0000\u028b\u028d\u0005C\u0000\u0000"+ + "\u028c\u028e\u0005F\u0000\u0000\u028d\u028c\u0001\u0000\u0000\u0000\u028d"+ + "\u028e\u0001\u0000\u0000\u0000\u028e\u028f\u0001\u0000\u0000\u0000\u028f"+ + "\u0290\u0005G\u0000\u0000\u0290\u0293\u0001\u0000\u0000\u0000\u0291\u0293"+ + "\u0003\u008eG\u0000\u0292\u0275\u0001\u0000\u0000\u0000\u0292\u0278\u0001"+ + "\u0000\u0000\u0000\u0292\u0279\u0001\u0000\u0000\u0000\u0292\u027a\u0001"+ + "\u0000\u0000\u0000\u0292\u028a\u0001\u0000\u0000\u0000\u0292\u0291\u0001"+ + "\u0000\u0000\u0000\u0293\u029c\u0001\u0000\u0000\u0000\u0294\u0295\n\u0005"+ + "\u0000\u0000\u0295\u0296\u00056\u0000\u0000\u0296\u029b\u0003\u008aE\u0006"+ + "\u0297\u0298\n\u0004\u0000\u0000\u0298\u0299\u0005J\u0000\u0000\u0299"+ + "\u029b\u0003\u008aE\u0005\u029a\u0294\u0001\u0000\u0000\u0000\u029a\u0297"+ + "\u0001\u0000\u0000\u0000\u029b\u029e\u0001\u0000\u0000\u0000\u029c\u029a"+ + "\u0001\u0000\u0000\u0000\u029c\u029d\u0001\u0000\u0000\u0000\u029d\u008b"+ + "\u0001\u0000\u0000\u0000\u029e\u029c\u0001\u0000\u0000\u0000\u029f\u02a1"+ + "\u0003\u0090H\u0000\u02a0\u02a2\u0005F\u0000\u0000\u02a1\u02a0\u0001\u0000"+ + "\u0000\u0000\u02a1\u02a2\u0001\u0000\u0000\u0000\u02a2\u02a3\u0001\u0000"+ + "\u0000\u0000\u02a3\u02a4\u0005E\u0000\u0000\u02a4\u02a5\u0003\u00aaU\u0000"+ + "\u02a5\u02ce\u0001\u0000\u0000\u0000\u02a6\u02a8\u0003\u0090H\u0000\u02a7"+ + "\u02a9\u0005F\u0000\u0000\u02a8\u02a7\u0001\u0000\u0000\u0000\u02a8\u02a9"+ + "\u0001\u0000\u0000\u0000\u02a9\u02aa\u0001\u0000\u0000\u0000\u02aa\u02ab"+ + "\u0005L\u0000\u0000\u02ab\u02ac\u0003\u00aaU\u0000\u02ac\u02ce\u0001\u0000"+ + "\u0000\u0000\u02ad\u02af\u0003\u0090H\u0000\u02ae\u02b0\u0005F\u0000\u0000"+ + "\u02af\u02ae\u0001\u0000\u0000\u0000\u02af\u02b0\u0001\u0000\u0000\u0000"+ + "\u02b0\u02b1\u0001\u0000\u0000\u0000\u02b1\u02b2\u0005E\u0000\u0000\u02b2"+ + "\u02b3\u0005b\u0000\u0000\u02b3\u02b8\u0003\u00aaU\u0000\u02b4\u02b5\u0005"+ + "=\u0000\u0000\u02b5\u02b7\u0003\u00aaU\u0000\u02b6\u02b4\u0001\u0000\u0000"+ + "\u0000\u02b7\u02ba\u0001\u0000\u0000\u0000\u02b8\u02b6\u0001\u0000\u0000"+ + "\u0000\u02b8\u02b9\u0001\u0000\u0000\u0000\u02b9\u02bb\u0001\u0000\u0000"+ + "\u0000\u02ba\u02b8\u0001\u0000\u0000\u0000\u02bb\u02bc\u0005c\u0000\u0000"+ + "\u02bc\u02ce\u0001\u0000\u0000\u0000\u02bd\u02bf\u0003\u0090H\u0000\u02be"+ + "\u02c0\u0005F\u0000\u0000\u02bf\u02be\u0001\u0000\u0000\u0000\u02bf\u02c0"+ + "\u0001\u0000\u0000\u0000\u02c0\u02c1\u0001\u0000\u0000\u0000\u02c1\u02c2"+ + "\u0005L\u0000\u0000\u02c2\u02c3\u0005b\u0000\u0000\u02c3\u02c8\u0003\u00aa"+ + "U\u0000\u02c4\u02c5\u0005=\u0000\u0000\u02c5\u02c7\u0003\u00aaU\u0000"+ + "\u02c6\u02c4\u0001\u0000\u0000\u0000\u02c7\u02ca\u0001\u0000\u0000\u0000"+ + "\u02c8\u02c6\u0001\u0000\u0000\u0000\u02c8\u02c9\u0001\u0000\u0000\u0000"+ + "\u02c9\u02cb\u0001\u0000\u0000\u0000\u02ca\u02c8\u0001\u0000\u0000\u0000"+ + "\u02cb\u02cc\u0005c\u0000\u0000\u02cc\u02ce\u0001\u0000\u0000\u0000\u02cd"+ + "\u029f\u0001\u0000\u0000\u0000\u02cd\u02a6\u0001\u0000\u0000\u0000\u02cd"+ + "\u02ad\u0001\u0000\u0000\u0000\u02cd\u02bd\u0001\u0000\u0000\u0000\u02ce"+ + "\u008d\u0001\u0000\u0000\u0000\u02cf\u02d2\u00032\u0019\u0000\u02d0\u02d1"+ + "\u0005:\u0000\u0000\u02d1\u02d3\u0003\f\u0006\u0000\u02d2\u02d0\u0001"+ + "\u0000\u0000\u0000\u02d2\u02d3\u0001\u0000\u0000\u0000\u02d3\u02d4\u0001"+ + "\u0000\u0000\u0000\u02d4\u02d5\u0005;\u0000\u0000\u02d5\u02d6\u0003\u00a0"+ + "P\u0000\u02d6\u008f\u0001\u0000\u0000\u0000\u02d7\u02dd\u0003\u0092I\u0000"+ + "\u02d8\u02d9\u0003\u0092I\u0000\u02d9\u02da\u0003\u00acV\u0000\u02da\u02db"+ + "\u0003\u0092I\u0000\u02db\u02dd\u0001\u0000\u0000\u0000\u02dc\u02d7\u0001"+ + "\u0000\u0000\u0000\u02dc\u02d8\u0001\u0000\u0000\u0000\u02dd\u0091\u0001"+ + "\u0000\u0000\u0000\u02de\u02df\u0006I\uffff\uffff\u0000\u02df\u02e3\u0003"+ + "\u0094J\u0000\u02e0\u02e1\u0007\u0005\u0000\u0000\u02e1\u02e3\u0003\u0092"+ + "I\u0003\u02e2\u02de\u0001\u0000\u0000\u0000\u02e2\u02e0\u0001\u0000\u0000"+ + "\u0000\u02e3\u02ec\u0001\u0000\u0000\u0000\u02e4\u02e5\n\u0002\u0000\u0000"+ + "\u02e5\u02e6\u0007\u0006\u0000\u0000\u02e6\u02eb\u0003\u0092I\u0003\u02e7"+ + "\u02e8\n\u0001\u0000\u0000\u02e8\u02e9\u0007\u0005\u0000\u0000\u02e9\u02eb"+ + "\u0003\u0092I\u0002\u02ea\u02e4\u0001\u0000\u0000\u0000\u02ea\u02e7\u0001"+ + "\u0000\u0000\u0000\u02eb\u02ee\u0001\u0000\u0000\u0000\u02ec\u02ea\u0001"+ + "\u0000\u0000\u0000\u02ec\u02ed\u0001\u0000\u0000\u0000\u02ed\u0093\u0001"+ + "\u0000\u0000\u0000\u02ee\u02ec\u0001\u0000\u0000\u0000\u02ef\u02f0\u0006"+ + "J\uffff\uffff\u0000\u02f0\u02f8\u0003\u00a0P\u0000\u02f1\u02f8\u00032"+ + "\u0019\u0000\u02f2\u02f8\u0003\u0096K\u0000\u02f3\u02f4\u0005b\u0000\u0000"+ + "\u02f4\u02f5\u0003\u008aE\u0000\u02f5\u02f6\u0005c\u0000\u0000\u02f6\u02f8"+ + "\u0001\u0000\u0000\u0000\u02f7\u02ef\u0001\u0000\u0000\u0000\u02f7\u02f1"+ + "\u0001\u0000\u0000\u0000\u02f7\u02f2\u0001\u0000\u0000\u0000\u02f7\u02f3"+ + "\u0001\u0000\u0000\u0000\u02f8\u02fe\u0001\u0000\u0000\u0000\u02f9\u02fa"+ + "\n\u0001\u0000\u0000\u02fa\u02fb\u0005:\u0000\u0000\u02fb\u02fd\u0003"+ + "\f\u0006\u0000\u02fc\u02f9\u0001\u0000\u0000\u0000\u02fd\u0300\u0001\u0000"+ + "\u0000\u0000\u02fe\u02fc\u0001\u0000\u0000\u0000\u02fe\u02ff\u0001\u0000"+ + "\u0000\u0000\u02ff\u0095\u0001\u0000\u0000\u0000\u0300\u02fe\u0001\u0000"+ + "\u0000\u0000\u0301\u0302\u0003\u0098L\u0000\u0302\u0310\u0005b\u0000\u0000"+ + "\u0303\u0311\u0005X\u0000\u0000\u0304\u0309\u0003\u008aE\u0000\u0305\u0306"+ + "\u0005=\u0000\u0000\u0306\u0308\u0003\u008aE\u0000\u0307\u0305\u0001\u0000"+ + "\u0000\u0000\u0308\u030b\u0001\u0000\u0000\u0000\u0309\u0307\u0001\u0000"+ + "\u0000\u0000\u0309\u030a\u0001\u0000\u0000\u0000\u030a\u030e\u0001\u0000"+ + "\u0000\u0000\u030b\u0309\u0001\u0000\u0000\u0000\u030c\u030d\u0005=\u0000"+ + "\u0000\u030d\u030f\u0003\u009aM\u0000\u030e\u030c\u0001\u0000\u0000\u0000"+ + "\u030e\u030f\u0001\u0000\u0000\u0000\u030f\u0311\u0001\u0000\u0000\u0000"+ + "\u0310\u0303\u0001\u0000\u0000\u0000\u0310\u0304\u0001\u0000\u0000\u0000"+ + "\u0310\u0311\u0001\u0000\u0000\u0000\u0311\u0312\u0001\u0000\u0000\u0000"+ + "\u0312\u0313\u0005c\u0000\u0000\u0313\u0097\u0001\u0000\u0000\u0000\u0314"+ + "\u0318\u0003D\"\u0000\u0315\u0318\u0005A\u0000\u0000\u0316\u0318\u0005"+ + "D\u0000\u0000\u0317\u0314\u0001\u0000\u0000\u0000\u0317\u0315\u0001\u0000"+ + "\u0000\u0000\u0317\u0316\u0001\u0000\u0000\u0000\u0318\u0099\u0001\u0000"+ + "\u0000\u0000\u0319\u0322\u0005[\u0000\u0000\u031a\u031f\u0003\u009cN\u0000"+ + "\u031b\u031c\u0005=\u0000\u0000\u031c\u031e\u0003\u009cN\u0000\u031d\u031b"+ + "\u0001\u0000\u0000\u0000\u031e\u0321\u0001\u0000\u0000\u0000\u031f\u031d"+ + "\u0001\u0000\u0000\u0000\u031f\u0320\u0001\u0000\u0000\u0000\u0320\u0323"+ + "\u0001\u0000\u0000\u0000\u0321\u031f\u0001\u0000\u0000\u0000\u0322\u031a"+ + "\u0001\u0000\u0000\u0000\u0322\u0323\u0001\u0000\u0000\u0000\u0323\u0324"+ + "\u0001\u0000\u0000\u0000\u0324\u0325\u0005\\\u0000\u0000\u0325\u009b\u0001"+ + "\u0000\u0000\u0000\u0326\u0327\u0003\u00aaU\u0000\u0327\u0328\u0005;\u0000"+ + "\u0000\u0328\u0329\u0003\u009eO\u0000\u0329\u009d\u0001\u0000\u0000\u0000"+ + "\u032a\u032d\u0003\u00a0P\u0000\u032b\u032d\u0003\u009aM\u0000\u032c\u032a"+ + "\u0001\u0000\u0000\u0000\u032c\u032b\u0001\u0000\u0000\u0000\u032d\u009f"+ + "\u0001\u0000\u0000\u0000\u032e\u0359\u0005G\u0000\u0000\u032f\u0330\u0003"+ + "\u00a8T\u0000\u0330\u0331\u0005d\u0000\u0000\u0331\u0359\u0001\u0000\u0000"+ + "\u0000\u0332\u0359\u0003\u00a6S\u0000\u0333\u0359\u0003\u00a8T\u0000\u0334"+ + "\u0359\u0003\u00a2Q\u0000\u0335\u0359\u0003@ \u0000\u0336\u0359\u0003"+ + "\u00aaU\u0000\u0337\u0338\u0005`\u0000\u0000\u0338\u033d\u0003\u00a4R"+ + "\u0000\u0339\u033a\u0005=\u0000\u0000\u033a\u033c\u0003\u00a4R\u0000\u033b"+ + "\u0339\u0001\u0000\u0000\u0000\u033c\u033f\u0001\u0000\u0000\u0000\u033d"+ + "\u033b\u0001\u0000\u0000\u0000\u033d\u033e\u0001\u0000\u0000\u0000\u033e"+ + "\u0340\u0001\u0000\u0000\u0000\u033f\u033d\u0001\u0000\u0000\u0000\u0340"+ + "\u0341\u0005a\u0000\u0000\u0341\u0359\u0001\u0000\u0000\u0000\u0342\u0343"+ + "\u0005`\u0000\u0000\u0343\u0348\u0003\u00a2Q\u0000\u0344\u0345\u0005="+ + "\u0000\u0000\u0345\u0347\u0003\u00a2Q\u0000\u0346\u0344\u0001\u0000\u0000"+ + "\u0000\u0347\u034a\u0001\u0000\u0000\u0000\u0348\u0346\u0001\u0000\u0000"+ + "\u0000\u0348\u0349\u0001\u0000\u0000\u0000\u0349\u034b\u0001\u0000\u0000"+ + "\u0000\u034a\u0348\u0001\u0000\u0000\u0000\u034b\u034c\u0005a\u0000\u0000"+ + "\u034c\u0359\u0001\u0000\u0000\u0000\u034d\u034e\u0005`\u0000\u0000\u034e"+ + "\u0353\u0003\u00aaU\u0000\u034f\u0350\u0005=\u0000\u0000\u0350\u0352\u0003"+ + "\u00aaU\u0000\u0351\u034f\u0001\u0000\u0000\u0000\u0352\u0355\u0001\u0000"+ + "\u0000\u0000\u0353\u0351\u0001\u0000\u0000\u0000\u0353\u0354\u0001\u0000"+ + "\u0000\u0000\u0354\u0356\u0001\u0000\u0000\u0000\u0355\u0353\u0001\u0000"+ + "\u0000\u0000\u0356\u0357\u0005a\u0000\u0000\u0357\u0359\u0001\u0000\u0000"+ + "\u0000\u0358\u032e\u0001\u0000\u0000\u0000\u0358\u032f\u0001\u0000\u0000"+ + "\u0000\u0358\u0332\u0001\u0000\u0000\u0000\u0358\u0333\u0001\u0000\u0000"+ + "\u0000\u0358\u0334\u0001\u0000\u0000\u0000\u0358\u0335\u0001\u0000\u0000"+ + "\u0000\u0358\u0336\u0001\u0000\u0000\u0000\u0358\u0337\u0001\u0000\u0000"+ + "\u0000\u0358\u0342\u0001\u0000\u0000\u0000\u0358\u034d\u0001\u0000\u0000"+ + "\u0000\u0359\u00a1\u0001\u0000\u0000\u0000\u035a\u035b\u0007\u0007\u0000"+ + "\u0000\u035b\u00a3\u0001\u0000\u0000\u0000\u035c\u035f\u0003\u00a6S\u0000"+ + "\u035d\u035f\u0003\u00a8T\u0000\u035e\u035c\u0001\u0000\u0000\u0000\u035e"+ + "\u035d\u0001\u0000\u0000\u0000\u035f\u00a5\u0001\u0000\u0000\u0000\u0360"+ + "\u0362\u0007\u0005\u0000\u0000\u0361\u0360\u0001\u0000\u0000\u0000\u0361"+ + "\u0362\u0001\u0000\u0000\u0000\u0362\u0363\u0001\u0000\u0000\u0000\u0363"+ + "\u0364\u00055\u0000\u0000\u0364\u00a7\u0001\u0000\u0000\u0000\u0365\u0367"+ + "\u0007\u0005\u0000\u0000\u0366\u0365\u0001\u0000\u0000\u0000\u0366\u0367"+ + "\u0001\u0000\u0000\u0000\u0367\u0368\u0001\u0000\u0000\u0000\u0368\u0369"+ + "\u00054\u0000\u0000\u0369\u00a9\u0001\u0000\u0000\u0000\u036a\u036b\u0005"+ + "3\u0000\u0000\u036b\u00ab\u0001\u0000\u0000\u0000\u036c\u036d\u0007\b"+ + "\u0000\u0000\u036d\u00ad\u0001\u0000\u0000\u0000\u036e\u036f\u0007\t\u0000"+ + "\u0000\u036f\u0370\u0005x\u0000\u0000\u0370\u0371\u0003\u00b0X\u0000\u0371"+ + "\u0372\u0003\u00b2Y\u0000\u0372\u00af\u0001\u0000\u0000\u0000\u0373\u0374"+ + "\u0004X\u000f\u0000\u0374\u0376\u0003\u001e\u000f\u0000\u0375\u0377\u0005"+ + "\u008a\u0000\u0000\u0376\u0375\u0001\u0000\u0000\u0000\u0376\u0377\u0001"+ + "\u0000\u0000\u0000\u0377\u0378\u0001\u0000\u0000\u0000\u0378\u0379\u0005"+ + "j\u0000\u0000\u0379\u037c\u0001\u0000\u0000\u0000\u037a\u037c\u0003\u001e"+ + "\u000f\u0000\u037b\u0373\u0001\u0000\u0000\u0000\u037b\u037a\u0001\u0000"+ + "\u0000\u0000\u037c\u00b1\u0001\u0000\u0000\u0000\u037d\u037e\u0005I\u0000"+ + "\u0000\u037e\u0383\u0003\u008aE\u0000\u037f\u0380\u0005=\u0000\u0000\u0380"+ + "\u0382\u0003\u008aE\u0000\u0381\u037f\u0001\u0000\u0000\u0000\u0382\u0385"+ + "\u0001\u0000\u0000\u0000\u0383\u0381\u0001\u0000\u0000\u0000\u0383\u0384"+ + "\u0001\u0000\u0000\u0000\u0384\u00b3\u0001\u0000\u0000\u0000\u0385\u0383"+ + "\u0001\u0000\u0000\u0000W\u00b8\u00c0\u00cd\u00d6\u00f2\u0101\u0107\u0110"+ + "\u0116\u0123\u0127\u0132\u0142\u014a\u014e\u0155\u015b\u0160\u0169\u0170"+ + "\u0176\u017f\u0186\u018e\u0196\u019a\u019e\u01a3\u01ae\u01b3\u01b7\u01c5"+ + "\u01d0\u01d6\u01dd\u01e6\u01fd\u0205\u0208\u020f\u021a\u0221\u0229\u0237"+ + "\u0240\u024b\u025a\u0260\u0262\u0269\u027c\u0285\u028d\u0292\u029a\u029c"+ + "\u02a1\u02a8\u02af\u02b8\u02bf\u02c8\u02cd\u02d2\u02dc\u02e2\u02ea\u02ec"+ + "\u02f7\u02fe\u0309\u030e\u0310\u0317\u031f\u0322\u032c\u033d\u0348\u0353"+ + "\u0358\u035e\u0361\u0366\u0376\u037b\u0383"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java index a3f175e4fa289..a7b06585c34f6 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java @@ -841,13 +841,13 @@ public class EsqlBaseParserBaseListener implements EsqlBaseParserListener { * *

The default implementation does nothing.

*/ - @Override public void enterInlinestatsCommand(EsqlBaseParser.InlinestatsCommandContext ctx) { } + @Override public void enterInlineStatsCommand(EsqlBaseParser.InlineStatsCommandContext ctx) { } /** * {@inheritDoc} * *

The default implementation does nothing.

*/ - @Override public void exitInlinestatsCommand(EsqlBaseParser.InlinestatsCommandContext ctx) { } + @Override public void exitInlineStatsCommand(EsqlBaseParser.InlineStatsCommandContext ctx) { } /** * {@inheritDoc} * diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java index cae5b3bec3d29..50bbd5b284a4d 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java @@ -502,7 +502,7 @@ public class EsqlBaseParserBaseVisitor extends AbstractParseTreeVisitor im *

The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.

*/ - @Override public T visitInlinestatsCommand(EsqlBaseParser.InlinestatsCommandContext ctx) { return visitChildren(ctx); } + @Override public T visitInlineStatsCommand(EsqlBaseParser.InlineStatsCommandContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java index 3ff17967633f9..e41bb9d3a7b88 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java @@ -716,15 +716,15 @@ public interface EsqlBaseParserListener extends ParseTreeListener { */ void exitLookupCommand(EsqlBaseParser.LookupCommandContext ctx); /** - * Enter a parse tree produced by {@link EsqlBaseParser#inlinestatsCommand}. + * Enter a parse tree produced by {@link EsqlBaseParser#inlineStatsCommand}. * @param ctx the parse tree */ - void enterInlinestatsCommand(EsqlBaseParser.InlinestatsCommandContext ctx); + void enterInlineStatsCommand(EsqlBaseParser.InlineStatsCommandContext ctx); /** - * Exit a parse tree produced by {@link EsqlBaseParser#inlinestatsCommand}. + * Exit a parse tree produced by {@link EsqlBaseParser#inlineStatsCommand}. * @param ctx the parse tree */ - void exitInlinestatsCommand(EsqlBaseParser.InlinestatsCommandContext ctx); + void exitInlineStatsCommand(EsqlBaseParser.InlineStatsCommandContext ctx); /** * Enter a parse tree produced by {@link EsqlBaseParser#insistCommand}. * @param ctx the parse tree diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java index e2dc54e502ec7..3f0b7160a95c6 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java @@ -437,11 +437,11 @@ public interface EsqlBaseParserVisitor extends ParseTreeVisitor { */ T visitLookupCommand(EsqlBaseParser.LookupCommandContext ctx); /** - * Visit a parse tree produced by {@link EsqlBaseParser#inlinestatsCommand}. + * Visit a parse tree produced by {@link EsqlBaseParser#inlineStatsCommand}. * @param ctx the parse tree * @return the visitor result */ - T visitInlinestatsCommand(EsqlBaseParser.InlinestatsCommandContext ctx); + T visitInlineStatsCommand(EsqlBaseParser.InlineStatsCommandContext ctx); /** * Visit a parse tree produced by {@link EsqlBaseParser#insistCommand}. * @param ctx the parse tree diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java index 35c12a2d5b275..548e4523c34ee 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java @@ -13,6 +13,7 @@ import org.elasticsearch.Build; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.common.Strings; +import org.elasticsearch.common.logging.HeaderWarning; import org.elasticsearch.common.lucene.BytesRefs; import org.elasticsearch.core.Tuple; import org.elasticsearch.dissect.DissectException; @@ -407,16 +408,24 @@ private void fail(Expression exp, String message, Object... args) { } @Override - public PlanFactory visitInlinestatsCommand(EsqlBaseParser.InlinestatsCommandContext ctx) { - if (false == EsqlPlugin.INLINESTATS_FEATURE_FLAG) { - throw new ParsingException(source(ctx), "INLINESTATS command currently requires a snapshot build"); + public PlanFactory visitInlineStatsCommand(EsqlBaseParser.InlineStatsCommandContext ctx) { + var source = source(ctx); + if (false == EsqlPlugin.INLINE_STATS_FEATURE_FLAG) { + throw new ParsingException(source, "INLINE STATS command currently requires a snapshot build"); + } + // TODO: drop after next minor release + if (ctx.DEV_INLINESTATS() != null) { + HeaderWarning.addWarning( + "Line {}:{}: INLINESTATS is deprecated, use INLINE STATS instead", + source.source().getLineNumber(), + source.source().getColumnNumber() + ); } List aggFields = visitAggFields(ctx.stats); List aggregates = new ArrayList<>(aggFields); List groupings = visitGrouping(ctx.grouping); aggregates.addAll(groupings); - // TODO: add support for filters - return input -> new InlineStats(source(ctx), new Aggregate(source(ctx), input, new ArrayList<>(groupings), aggregates)); + return input -> new InlineStats(source, new Aggregate(source, input, new ArrayList<>(groupings), aggregates)); } @Override diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/InlineStats.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/InlineStats.java index 889c544599185..5515c12097854 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/InlineStats.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/InlineStats.java @@ -95,7 +95,7 @@ public List output() { return lazyOutput; } - // TODO: in case of inlinestats, the join key is always the grouping + // TODO: in case of INLINE STATS, the join key is always the grouping private JoinConfig joinConfig() { List groupings = aggregate.groupings(); List namedGroupings = new ArrayList<>(groupings.size()); @@ -129,6 +129,11 @@ public LogicalPlan surrogate() { return new InlineJoin(source, left, InlineJoin.stubSource(aggregate, left), joinConfig()); } + @Override + public String telemetryLabel() { + return "INLINE STATS"; + } + @Override public int hashCode() { return Objects.hash(aggregate, child()); diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/OrderBy.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/OrderBy.java index 69b5382b3e1fa..244381e078f7b 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/OrderBy.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/OrderBy.java @@ -129,7 +129,7 @@ public BiConsumer postOptimizationPlanVerification() { orderBy -> failures.add( fail( inlineJoin, - "INLINESTATS [{}] cannot yet have an unbounded SORT [{}] before it : either move the SORT after it," + "INLINE STATS [{}] cannot yet have an unbounded SORT [{}] before it : either move the SORT after it," + " or add a LIMIT before the SORT", inlineJoin.sourceText(), orderBy.sourceText() diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/local/CopyingLocalSupplier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/local/CopyingLocalSupplier.java index 28d3e02be0b59..5f8e0e50731d5 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/local/CopyingLocalSupplier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/local/CopyingLocalSupplier.java @@ -31,7 +31,7 @@ * It delegates all its operations to {@link ImmediateLocalSupplier} and, to prevent the double release, it will always * create a deep copy of the blocks received in the constructor initially. * - * Example with the flow and the blocks reuse for a query like "row x = 1 | inlinestats y = max(x)" + * Example with the flow and the blocks reuse for a query like "row x = 1 | inline stats y = max(x)" * Step 1: * Limit[1000[INTEGER],true] * \_InlineJoin[LEFT,[],[],[]] diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/EsqlPlugin.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/EsqlPlugin.java index 543179195c279..df203980d43ef 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/EsqlPlugin.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/EsqlPlugin.java @@ -91,7 +91,7 @@ import java.util.function.Supplier; public class EsqlPlugin extends Plugin implements ActionPlugin, ExtensiblePlugin { - public static final boolean INLINESTATS_FEATURE_FLAG = new FeatureFlag("esql_inlinestats").isEnabled(); + public static final boolean INLINE_STATS_FEATURE_FLAG = new FeatureFlag("esql_inline_stats").isEnabled(); public static final String ESQL_WORKER_THREAD_POOL_NAME = "esql_worker"; diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlCCSUtils.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlCCSUtils.java index c4de2287ebd28..03a59e867c8cf 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlCCSUtils.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlCCSUtils.java @@ -294,7 +294,7 @@ static boolean concreteIndexRequested(String indexExpression) { // visible for testing static void updateExecutionInfoAtEndOfPlanning(EsqlExecutionInfo execInfo) { - // TODO: this logic assumes a single phase execution model, so it may need to altered once INLINESTATS is made CCS compatible + // TODO: this logic assumes a single phase execution model, so it may need to altered once INLINE STATS is made CCS compatible execInfo.markEndPlanning(); if (execInfo.isCrossClusterSearch()) { for (String clusterAlias : execInfo.clusterAliases()) { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlSession.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlSession.java index 11c7653af7aa1..1d3b710baac35 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlSession.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlSession.java @@ -213,7 +213,7 @@ public void executeOptimizedPlan( ThreadPool.Names.SEARCH_COORDINATION, ThreadPool.Names.SYSTEM_READ ); - if (explainMode) {// TODO: INLINESTATS come back to the explain mode branch and reevaluate + if (explainMode) {// TODO: INLINE STATS come back to the explain mode branch and reevaluate PhysicalPlan physicalPlan = logicalPlanToPhysicalPlan(optimizedPlan, request); String physicalPlanString = physicalPlan.toString(); List fields = List.of( @@ -293,7 +293,7 @@ private void executeSubPlan( // and equals would have ignored name IDs anyway ij -> ij.right() == subPlans.originalSubPlan() ? InlineJoin.inlineData(ij, resultWrapper) : ij ); - // TODO: INLINESTATS can we do better here and further optimize the plan AFTER one of the subplans executed? + // TODO: INLINE STATS can we do better here and further optimize the plan AFTER one of the subplans executed? newLogicalPlan.setOptimized(); LOGGER.debug("Plan after previous subplan execution:\n{}", newLogicalPlan); // look for the next inlinejoin plan diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/FeatureMetric.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/FeatureMetric.java index 9645d4af28c4a..8257ba51cdbf9 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/FeatureMetric.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/FeatureMetric.java @@ -51,7 +51,7 @@ public enum FeatureMetric { GROK(Grok.class::isInstance), LIMIT(plan -> false), // the limit is checked in Analyzer.gatherPreAnalysisMetrics, because it has a more complex and general check SORT(OrderBy.class::isInstance), - // the STATS is checked in Analyzer.gatherPreAnalysisMetrics, because it can also be part of an inlinestats command + // the STATS is checked in Analyzer.gatherPreAnalysisMetrics, because it can also be part of an INLINE STATS command STATS(plan -> false), WHERE(Filter.class::isInstance), ENRICH(Enrich.class::isInstance), @@ -66,7 +66,7 @@ public enum FeatureMetric { LOOKUP_JOIN(LookupJoin.class::isInstance), LOOKUP(Lookup.class::isInstance), CHANGE_POINT(ChangePoint.class::isInstance), - INLINESTATS(InlineStats.class::isInstance), + INLINE_STATS(InlineStats.class::isInstance), RERANK(Rerank.class::isInstance), INSIST(Insist.class::isInstance), FORK(Fork.class::isInstance), diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java index 25c8c4c48a794..662e1bdabcab2 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java @@ -3739,7 +3739,14 @@ private void assertError(String query, String mapping, QueryParams params, Strin @Override protected List filteredWarnings() { - return withDefaultLimitWarning(super.filteredWarnings()); + return withInlinestatsWarning(withDefaultLimitWarning(super.filteredWarnings())); + } + + // TODO: drop after next minor release + public static List withInlinestatsWarning(List warnings) { + List allWarnings = warnings != null ? new ArrayList<>(warnings) : new ArrayList<>(); + allWarnings.add("INLINESTATS is deprecated, use INLINE STATS instead"); + return allWarnings; } private static LogicalPlan analyzeWithEmptyFieldCapsResponse(String query) throws IOException { @@ -4392,12 +4399,25 @@ public void testGroupingOverridesInStats() { """, "Found 1 problem\n" + "line 2:43: Unknown column [x]", "mapping-default.json"); } - public void testGroupingOverridesInInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + public void testGroupingOverridesInInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); + verifyUnsupported(""" + from test + | inline stats MIN(salary) BY x = languages, x = x + 1 + """, "Found 1 problem\n" + "line 2:50: Unknown column [x]", "mapping-default.json"); + } + + public void testInlineStatsStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); + verifyUnsupported(""" + from test + | inline stats stats + """, "Found 1 problem\n" + "line 2:16: Unknown column [stats]", "mapping-default.json"); + // TODO: drop after next minor release verifyUnsupported(""" from test - | inlinestats MIN(salary) BY x = languages, x = x + 1 - """, "Found 1 problem\n" + "line 2:49: Unknown column [x]", "mapping-default.json"); + | inlinestats stats + """, "Found 1 problem\n" + "line 2:15: Unknown column [stats]", "mapping-default.json"); } public void testTBucketWithDatePeriodInBothAggregationAndGrouping() { diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 990b9103e9386..ba2ef6d152e45 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -179,15 +179,15 @@ public void testUnsupportedAndMultiTypedFields() { + " [ip] in [test1, test2, test3] and [2] other indices, [keyword] in [test6]", error("from test* | stats count(1) by multi_typed", analyzer) ); - if (EsqlCapabilities.Cap.INLINESTATS.isEnabled()) { + if (EsqlCapabilities.Cap.INLINE_STATS.isEnabled()) { assertEquals( - "1:38: Cannot use field [unsupported] with unsupported type [flattened]", - error("from test* | inlinestats count(1) by unsupported", analyzer) + "1:39: Cannot use field [unsupported] with unsupported type [flattened]", + error("from test* | inline stats count(1) by unsupported", analyzer) ); assertEquals( - "1:38: Cannot use field [multi_typed] due to ambiguities being mapped as [2] incompatible types:" + "1:39: Cannot use field [multi_typed] due to ambiguities being mapped as [2] incompatible types:" + " [ip] in [test1, test2, test3] and [2] other indices, [keyword] in [test6]", - error("from test* | inlinestats count(1) by multi_typed", analyzer) + error("from test* | inline stats count(1) by multi_typed", analyzer) ); } @@ -200,15 +200,15 @@ public void testUnsupportedAndMultiTypedFields() { + " [ip] in [test1, test2, test3] and [2] other indices, [keyword] in [test6]", error("from test* | stats values(multi_typed)", analyzer) ); - if (EsqlCapabilities.Cap.INLINESTATS.isEnabled()) { + if (EsqlCapabilities.Cap.INLINE_STATS.isEnabled()) { assertEquals( - "1:33: Cannot use field [unsupported] with unsupported type [flattened]", - error("from test* | inlinestats values(unsupported)", analyzer) + "1:34: Cannot use field [unsupported] with unsupported type [flattened]", + error("from test* | inline stats values(unsupported)", analyzer) ); assertEquals( - "1:33: Cannot use field [multi_typed] due to ambiguities being mapped as [2] incompatible types:" + "1:34: Cannot use field [multi_typed] due to ambiguities being mapped as [2] incompatible types:" + " [ip] in [test1, test2, test3] and [2] other indices, [keyword] in [test6]", - error("from test* | inlinestats values(multi_typed)", analyzer) + error("from test* | inline stats values(multi_typed)", analyzer) ); } @@ -2095,23 +2095,23 @@ public void testCategorizeOptionSimilarityThreshold() { public void testCategorizeWithInlineStats() { assumeTrue("CATEGORIZE must be enabled", EsqlCapabilities.Cap.CATEGORIZE_V6.isEnabled()); - assumeTrue("INLINESTATS must be enabled", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + assumeTrue("INLINE STATS must be enabled", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); assertEquals( - "1:37: CATEGORIZE [CATEGORIZE(last_name, { \"similarity_threshold\": 1 })] is not yet supported with " - + "INLINESTATS [INLINESTATS COUNT(*) BY CATEGORIZE(last_name, { \"similarity_threshold\": 1 })]", - error("FROM test | INLINESTATS COUNT(*) BY CATEGORIZE(last_name, { \"similarity_threshold\": 1 })") + "1:38: CATEGORIZE [CATEGORIZE(last_name, { \"similarity_threshold\": 1 })] is not yet supported with " + + "INLINE STATS [INLINE STATS COUNT(*) BY CATEGORIZE(last_name, { \"similarity_threshold\": 1 })]", + error("FROM test | INLINE STATS COUNT(*) BY CATEGORIZE(last_name, { \"similarity_threshold\": 1 })") ); assertEquals(""" - 3:35: CATEGORIZE [CATEGORIZE(gender)] is not yet supported with \ - INLINESTATS [INLINESTATS SUM(salary) BY c3 = CATEGORIZE(gender)] - line 2:91: CATEGORIZE grouping function [CATEGORIZE(first_name)] can only be in the first grouping expression - line 2:32: CATEGORIZE [CATEGORIZE(last_name, { "similarity_threshold": 1 })] is not yet supported with \ - INLINESTATS [INLINESTATS COUNT(*) BY c1 = CATEGORIZE(last_name, { "similarity_threshold": 1 }), \ + 3:36: CATEGORIZE [CATEGORIZE(gender)] is not yet supported with \ + INLINE STATS [INLINE STATS SUM(salary) BY c3 = CATEGORIZE(gender)] + line 2:92: CATEGORIZE grouping function [CATEGORIZE(first_name)] can only be in the first grouping expression + line 2:33: CATEGORIZE [CATEGORIZE(last_name, { "similarity_threshold": 1 })] is not yet supported with \ + INLINE STATS [INLINE STATS COUNT(*) BY c1 = CATEGORIZE(last_name, { "similarity_threshold": 1 }), \ c2 = CATEGORIZE(first_name)]""", error(""" FROM test - | INLINESTATS COUNT(*) BY c1 = CATEGORIZE(last_name, { "similarity_threshold": 1 }), c2 = CATEGORIZE(first_name) - | INLINESTATS SUM(salary) BY c3 = CATEGORIZE(gender) + | INLINE STATS COUNT(*) BY c1 = CATEGORIZE(last_name, { "similarity_threshold": 1 }), c2 = CATEGORIZE(first_name) + | INLINE STATS SUM(salary) BY c3 = CATEGORIZE(gender) """)); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java index b073afb6c76c3..100417397fcbe 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java @@ -13,6 +13,7 @@ import org.elasticsearch.common.lucene.BytesRefs; import org.elasticsearch.compute.aggregation.QuantileStates; import org.elasticsearch.compute.test.TestBlockFactory; +import org.elasticsearch.core.Nullable; import org.elasticsearch.core.Tuple; import org.elasticsearch.dissect.DissectParser; import org.elasticsearch.index.IndexMode; @@ -5785,12 +5786,12 @@ public void testReplaceSortByExpressionsWithStats() { * \_StubRelation[[_meta_field{f}#13, emp_no{f}#7, first_name{f}#8, gender{f}#9, hire_date{f}#14, job{f}#15, job.raw{f}#16, lang * uages{f}#10, last_name{f}#11, long_noidx{f}#17, salary{f}#12, emp_no % 2{r}#6]] */ - public void testInlinestatsNestedExpressionsInGroups() { + public void testInlineStatsNestedExpressionsInGroups() { var query = """ FROM test - | INLINESTATS c = COUNT(salary) by emp_no % 2 + | INLINE STATS c = COUNT(salary) by emp_no % 2 """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = optimizedPlan(query); @@ -5809,10 +5810,13 @@ public void testInlinestatsNestedExpressionsInGroups() { var stub = as(agg.child(), StubRelation.class); } - public static boolean releaseBuildForInlinestats(String query) { - if (Build.current().isSnapshot() == false) { - var e = expectThrows(ParsingException.class, () -> analyze(query)); - assertThat(e.getMessage(), containsString("mismatched input 'INLINESTATS' expecting")); + // if non-null, the `query` must have "INLINE STATS" capitalized + public static boolean releaseBuildForInlineStats(@Nullable String query) { + if (EsqlCapabilities.Cap.INLINE_STATS.isEnabled() == false) { + if (query != null) { + var e = expectThrows(ParsingException.class, () -> analyze(query)); + assertThat(e.getMessage(), containsString("mismatched input 'INLINE' expecting")); + } return true; } return false; @@ -5826,13 +5830,13 @@ public static boolean releaseBuildForInlinestats(String query) { public void testInlinestatsGetsPrunedEntirely() { var query = """ FROM employees - | INLINESTATS x = avg(salary) BY emp_no + | INLINE STATS x = avg(salary) BY emp_no | EVAL x = emp_no | SORT x | KEEP x, emp_no | LIMIT 1 """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = optimizedPlan(query); @@ -5854,18 +5858,18 @@ public void testInlinestatsGetsPrunedEntirely() { * \_StubRelation[[_meta_field{f}#22, emp_no{f}#16, first_name{f}#17, gender{f}#18, hire_date{f}#23, job{f}#24, job.raw{f}#25, * languages{f}#19, last_name{f}#20, long_noidx{f}#26, salary{f}#21, salaryK{r}#5]] */ - public void testDoubleInlinestatsWithEvalGetsPrunedEntirely() { + public void testDoubleInlineStatsWithEvalGetsPrunedEntirely() { var query = """ FROM employees | SORT languages DESC | EVAL salaryK = salary/1000 - | INLINESTATS count = COUNT(*) BY salaryK - | INLINESTATS min = MIN(MV_COUNT(languages)) BY salaryK + | INLINE STATS count = COUNT(*) BY salaryK + | INLINE STATS min = MIN(MV_COUNT(languages)) BY salaryK | KEEP emp_no, count | SORT emp_no | LIMIT 5 """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = optimizedPlan(query); @@ -5897,18 +5901,18 @@ public void testDoubleInlinestatsWithEvalGetsPrunedEntirely() { * \_TopN[[Order[emp_no{f}#19,ASC,LAST]],1[INTEGER]] * \_EsRelation[test][_meta_field{f}#25, emp_no{f}#19, first_name{f}#20, ..] */ - public void testDoubleInlinestatsGetsPrunedEntirely() { + public void testDoubleInlineStatsGetsPrunedEntirely() { var query = """ FROM employees - | INLINESTATS x = avg(salary) BY emp_no - | INLINESTATS y = avg(salary) BY languages + | INLINE STATS x = avg(salary) BY emp_no + | INLINE STATS y = avg(salary) BY languages | EVAL y = emp_no | EVAL x = y | SORT x | KEEP x, emp_no | LIMIT 1 """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = optimizedPlan(query); @@ -5929,15 +5933,15 @@ public void testDoubleInlinestatsGetsPrunedEntirely() { * \_StubRelation[[_meta_field{f}#21, emp_no{f}#15, first_name{f}#16, gender{f}#17, hire_date{f}#22, job{f}#23, job.raw{f}#24, l * anguages{f}#18, last_name{f}#19, long_noidx{f}#25, salary{f}#20]] */ - public void testInlinestatsGetsPrunedPartially() { + public void testInlineStatsGetsPrunedPartially() { var query = """ FROM employees - | INLINESTATS x = AVG(salary), a = COUNT_DISTINCT(languages) BY emp_no + | INLINE STATS x = AVG(salary), a = COUNT_DISTINCT(languages) BY emp_no | EVAL x = emp_no | KEEP x, a, emp_no | LIMIT 1 """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = optimizedPlan(query); @@ -5956,17 +5960,17 @@ public void testInlinestatsGetsPrunedPartially() { } // same as above - public void testTripleInlinestatsGetsPrunedPartially() { + public void testTripleInlineStatsGetsPrunedPartially() { var query = """ FROM employees - | INLINESTATS x = AVG(salary), a = COUNT_DISTINCT(languages) BY emp_no - | INLINESTATS y = AVG(salary), b = COUNT_DISTINCT(languages) BY emp_no + | INLINE STATS x = AVG(salary), a = COUNT_DISTINCT(languages) BY emp_no + | INLINE STATS y = AVG(salary), b = COUNT_DISTINCT(languages) BY emp_no | EVAL x = emp_no - | INLINESTATS z = AVG(salary), c = COUNT_DISTINCT(languages), d = AVG(languages) BY last_name + | INLINE STATS z = AVG(salary), c = COUNT_DISTINCT(languages), d = AVG(languages) BY last_name | KEEP x, a, emp_no | LIMIT 1 """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = optimizedPlan(query); @@ -6002,22 +6006,22 @@ public void testTripleInlinestatsGetsPrunedPartially() { * \_StubRelation[[emp_no{f}#864, hire_date{f}#865, languages{f}#860, languages.byte{f}#861, languages.long{f}#863, * languages.short{f}#862, salary{f}#866, count{r}#838, salaryK{r}#836, sum{r}#845, hire_date_string{r}#842, date{r}#847]] */ - public void testTripleInlinestatsMultipleAssignmentsGetsPrunedPartially() { + public void testTripleInlineStatsMultipleAssignmentsGetsPrunedPartially() { // TODO: reenable 1st sort, pull the 2nd further up when #132417 is in var query = """ FROM employees // | SORT languages DESC | EVAL salaryK = salary / 10000 - | INLINESTATS count = COUNT(*) BY salaryK + | INLINE STATS count = COUNT(*) BY salaryK | EVAL hire_date_string = hire_date::keyword - | INLINESTATS sum = SUM(languages) BY hire_date_string + | INLINE STATS sum = SUM(languages) BY hire_date_string | DISSECT hire_date_string "%{date}" - | INLINESTATS min = MIN(MV_COUNT(languages)) BY salaryK + | INLINE STATS min = MIN(MV_COUNT(languages)) BY salaryK | SORT emp_no | KEEP emp_no, salaryK, count, min | LIMIT 5 """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = optimizedPlan(query); @@ -6071,22 +6075,22 @@ public void testTripleInlinestatsMultipleAssignmentsGetsPrunedPartially() { * \_Eval[[TOSTRING(hire_date{f}#918) AS hire_date_string#898]] * \_EsRelation[employees][emp_no{f}#917, hire_date{f}#918, languages{f}#913, ..] */ - public void testTripleInlinestatsMultipleAssignmentsGetsPrunedEntirely() { + public void testTripleInlineStatsMultipleAssignmentsGetsPrunedEntirely() { // same as the above query, but only keep emp_no var query = """ FROM employees // | SORT languages DESC | EVAL salaryK = salary / 10000 - | INLINESTATS count = COUNT(*) BY salaryK + | INLINE STATS count = COUNT(*) BY salaryK | EVAL hire_date_string = hire_date::keyword - | INLINESTATS sum = SUM(languages) BY hire_date_string + | INLINE STATS sum = SUM(languages) BY hire_date_string | DISSECT hire_date_string "%{date}" - | INLINESTATS min = MIN(MV_COUNT(languages)) BY salaryK + | INLINE STATS min = MIN(MV_COUNT(languages)) BY salaryK | SORT emp_no | KEEP emp_no | LIMIT 5 """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = optimizedPlan(query); @@ -6110,24 +6114,24 @@ public void testTripleInlinestatsMultipleAssignmentsGetsPrunedEntirely() { * | \_EsRelation[languages_lookup][LOOKUP][language_code{f}#1560] * \_EsRelation[languages_lookup][LOOKUP][language_code{f}#1561] */ - public void testTripleInlinestatsWithLookupJoinGetsPrunedEntirely() { + public void testTripleInlineStatsWithLookupJoinGetsPrunedEntirely() { var query = """ FROM employees // | SORT languages DESC | EVAL salaryK = salary / 10000 | EVAL language_code = languages | LOOKUP JOIN languages_lookup ON language_code - | INLINESTATS count = COUNT(*) BY salaryK + | INLINE STATS count = COUNT(*) BY salaryK | EVAL hire_date_string = hire_date::keyword | LOOKUP JOIN languages_lookup ON language_code - | INLINESTATS sum = SUM(languages) BY hire_date_string + | INLINE STATS sum = SUM(languages) BY hire_date_string | LOOKUP JOIN languages_lookup ON language_code - | INLINESTATS min = MIN(MV_COUNT(languages)) BY salaryK + | INLINE STATS min = MIN(MV_COUNT(languages)) BY salaryK | SORT emp_no | KEEP emp_no | LIMIT 5 """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = optimizedPlan(query); @@ -6164,11 +6168,11 @@ public void testInlineStatsWithAggGetsPrunedEntirely() { | EVAL decades = age / 10, decades = decades * 10 | STATS avg = AVG(salary) BY decades | EVAL idecades = decades / 2 - | INLINESTATS iavg = AVG(avg) BY idecades + | INLINE STATS iavg = AVG(avg) BY idecades | KEEP avg, decades """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = optimizedPlan(query); @@ -6206,12 +6210,12 @@ public void testInlineStatsWithAggAndInlineStatsGetsPruned() { | EVAL decades = age / 10, decades = decades * 10 | STATS avg = AVG(salary) BY decades | EVAL idecades = decades / 2 - | INLINESTATS iavg = AVG(avg) BY idecades - | INLINESTATS avgavg = AVG(avg) + | INLINE STATS iavg = AVG(avg) BY idecades + | INLINE STATS avgavg = AVG(avg) | KEEP avg, decades, avgavg """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = optimizedPlan(query); @@ -6247,7 +6251,7 @@ public void testInlineStatsWithAggAndInlineStatsGetsPruned() { * |_EsRelation[airports][abbrev{f}#19, city{f}#25, city_location{f}#26, coun..] * \_EsRelation[languages_lookup][LOOKUP][language_code{f}#27, language_name{f}#28] */ - public void testInlinestatsWithLookupJoin() { + public void testInlineStatsWithLookupJoin() { var query = """ FROM airports | EVAL backup_scalerank = scalerank @@ -6255,13 +6259,13 @@ public void testInlinestatsWithLookupJoin() { | LOOKUP JOIN languages_lookup ON language_code | RENAME language_name as scalerank | DROP language_code - | INLINESTATS count=COUNT(*) BY scalerank + | INLINE STATS count=COUNT(*) BY scalerank | SORT abbrev DESC | KEEP abbrev, *scalerank | LIMIT 5 """; assumeTrue("Requires LOOKUP JOIN", EsqlCapabilities.Cap.JOIN_LOOKUP_V12.isEnabled()); - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } @@ -6294,14 +6298,14 @@ public void testInlinestatsWithLookupJoin() { * \_StubRelation[[_meta_field{f}#15, emp_no{f}#9, first_name{f}#10, gender{f}#11, hire_date{f}#16, job{f}#17, job.raw{f}#18, * languages{f}#12, last_name{f}#13, long_noidx{f}#19, salary{f}#14]] */ - public void testInlinestatsWithAvg() { + public void testInlineStatsWithAvg() { var query = """ FROM employees - | INLINESTATS avg = AVG(salary) BY emp_no + | INLINE STATS avg = AVG(salary) BY emp_no | KEEP avg, emp_no, first_name | LIMIT 10 """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = optimizedPlan(query); @@ -6329,14 +6333,14 @@ public void testInlinestatsWithAvg() { * \_LocalRelation[[salary{r}#3, emp_no{r}#5, gender{r}#7], * org.elasticsearch.xpack.esql.plan.logical.local.CopyingLocalSupplier@9d5b596d] */ - public void testInlinestatsWithRow() { + public void testInlineStatsWithRow() { var query = """ ROW salary = 12300, emp_no = 5, gender = "F" | EVAL salaryK = salary/1000 - | INLINESTATS sum = SUM(salaryK) BY gender + | INLINE STATS sum = SUM(salaryK) BY gender | KEEP emp_no """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = optimizedPlan(query); @@ -6367,14 +6371,14 @@ public void testInlinestatsWithRow() { * \_StubRelation[[_meta_field{f}#12, emp_no{f}#6, first_name{f}#7, gender{f}#8, hire_date{f}#13, job{f}#14, job.raw{f}#15, * languages{f}#9, last_name{f}#10, long_noidx{f}#16, salary{f}#11]] */ - public void testInlinestatsWithLimit() { + public void testInlineStatsWithLimit() { var query = """ FROM employees - | INLINESTATS a = AVG(salary) + | INLINE STATS a = AVG(salary) | LIMIT 2 | KEEP a """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = optimizedPlan(query); @@ -6404,15 +6408,15 @@ public void testInlinestatsWithLimit() { * \_Aggregate[[gender{f}#14],[MAX(languages{f}#15,true[BOOLEAN]) AS max_lang#7, gender{f}#14]] * \_StubRelation[[emp_no{f}#12, languages{f}#15, gender{f}#14]] */ - public void testInlinestatsWithLimitAndAgg() { + public void testInlineStatsWithLimitAndAgg() { var query = """ FROM employees | KEEP emp_no, languages, gender - | INLINESTATS max_lang = MAX(languages) BY gender + | INLINE STATS max_lang = MAX(languages) BY gender | LIMIT 1 | STATS v = VALUES(max_lang) """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = optimizedPlan(query); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/OptimizerVerificationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/OptimizerVerificationTests.java index b1776aae8757a..6f8abae83d216 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/OptimizerVerificationTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/OptimizerVerificationTests.java @@ -27,7 +27,7 @@ import static org.elasticsearch.xpack.esql.analysis.AnalyzerTestUtils.defaultLookupResolution; import static org.elasticsearch.xpack.esql.analysis.AnalyzerTestUtils.loadEnrichPolicyResolution; import static org.elasticsearch.xpack.esql.analysis.AnalyzerTestUtils.loadMapping; -import static org.elasticsearch.xpack.esql.plugin.EsqlPlugin.INLINESTATS_FEATURE_FLAG; +import static org.elasticsearch.xpack.esql.plugin.EsqlPlugin.INLINE_STATS_FEATURE_FLAG; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; @@ -158,16 +158,16 @@ public void testRemoteEnrichAfterCoordinatorOnlyPlans() { """, analyzer); assertThat(err, containsString("4:3: ENRICH with remote policy can't be executed after [STATS count(*) BY language_code]@3:3")); - if (INLINESTATS_FEATURE_FLAG) { + if (INLINE_STATS_FEATURE_FLAG) { err = error(""" FROM test | EVAL language_code = languages - | INLINESTATS count(*) BY language_code + | INLINE STATS count(*) BY language_code | ENRICH _remote:languages ON language_code """, analyzer); assertThat( err, - containsString("4:3: ENRICH with remote policy can't be executed after [INLINESTATS count(*) BY language_code]@3:3") + containsString("4:3: ENRICH with remote policy can't be executed after [INLINE STATS count(*) BY language_code]@3:3") ); } @@ -430,21 +430,21 @@ public void testRemoteEnrichAfterLookupJoinWithPipelineBreaker() { } public void testDanglingOrderByInInlineStats() { - assumeTrue("INLINESTATS must be enabled", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + assumeTrue("INLINE STATS must be enabled", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); var analyzer = AnalyzerTestUtils.analyzer(loadMapping("mapping-default.json", "test")); var err = error(""" FROM test | SORT languages - | INLINESTATS count(*) BY languages - | INLINESTATS s = sum(salary) BY first_name + | INLINE STATS count(*) BY languages + | INLINE STATS s = sum(salary) BY first_name """, analyzer); assertThat(err, is(""" 2:3: Unbounded SORT not supported yet [SORT languages] please add a LIMIT - line 3:3: INLINESTATS [INLINESTATS count(*) BY languages] cannot yet have an unbounded SORT [SORT languages] before\ + line 3:3: INLINE STATS [INLINE STATS count(*) BY languages] cannot yet have an unbounded SORT [SORT languages] before\ it : either move the SORT after it, or add a LIMIT before the SORT - line 4:3: INLINESTATS [INLINESTATS s = sum(salary) BY first_name] cannot yet have an unbounded SORT [SORT languages]\ + line 4:3: INLINE STATS [INLINE STATS s = sum(salary) BY first_name] cannot yet have an unbounded SORT [SORT languages]\ before it : either move the SORT after it, or add a LIMIT before the SORT""")); } } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PropagateInlineEvalsTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PropagateInlineEvalsTests.java index 662ca51ab564d..840b8012c6a62 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PropagateInlineEvalsTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PropagateInlineEvalsTests.java @@ -83,11 +83,11 @@ public static void init() { * \_StubRelation[[emp_no{f}#11, languages{f}#14, gender{f}#13, y{r}#10]] */ public void testGroupingAliasingMoved_To_LeftSideOfJoin() { - assumeTrue("Requires INLINESTATS", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + assumeTrue("Requires INLINE STATS", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); var plan = plan(""" from test | keep emp_no, languages, gender - | inlinestats max_lang = MAX(languages) BY y = gender + | inline stats max_lang = MAX(languages) BY y = gender """, LogicalPlanOptimizerTests.SubstitutionOnlyOptimizer.INSTANCE); var limit = as(plan, Limit.class); @@ -126,12 +126,12 @@ public void testGroupingAliasingMoved_To_LeftSideOfJoin() { * {r}#21]] */ public void testGroupingAliasingMoved_To_LeftSideOfJoin_WithExpression() { - assumeTrue("Requires INLINESTATS", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + assumeTrue("Requires INLINE STATS", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); var plan = plan(""" from test | keep emp_no, languages, gender, last_name, first_name | eval first_name_l = left(first_name, 1) - | inlinestats max_lang = MAX(languages), min_lang = MIN(languages) BY f = left(last_name, 1), g = gender, first_name_l + | inline stats max_lang = MAX(languages), min_lang = MIN(languages) BY f = left(last_name, 1), g = gender, first_name_l """, LogicalPlanOptimizerTests.SubstitutionOnlyOptimizer.INSTANCE); var limit = as(plan, Limit.class); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/ReplaceStatsFilteredAggWithEvalTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/ReplaceStatsFilteredAggWithEvalTests.java index 92d5cd6fbdc5d..3cf35d2c609c8 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/ReplaceStatsFilteredAggWithEvalTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/ReplaceStatsFilteredAggWithEvalTests.java @@ -32,7 +32,7 @@ import static org.elasticsearch.xpack.esql.EsqlTestUtils.as; import static org.elasticsearch.xpack.esql.core.type.DataType.INTEGER; import static org.elasticsearch.xpack.esql.core.type.DataType.LONG; -import static org.elasticsearch.xpack.esql.optimizer.LogicalPlanOptimizerTests.releaseBuildForInlinestats; +import static org.elasticsearch.xpack.esql.optimizer.LogicalPlanOptimizerTests.releaseBuildForInlineStats; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.is; @@ -384,19 +384,19 @@ public void testReplaceStatsFilteredAggWithEvalSingleAggWithGroup() { var source = as(aggregate.child(), EsRelation.class); } - /** + /* * Project[[_meta_field{f}#10, emp_no{f}#4, first_name{f}#5, gender{f}#6, hire_date{f}#11, job{f}#12, job.raw{f}#13, lang * uages{f}#7, last_name{f}#8, long_noidx{f}#14, salary{f}#9, sum(salary) where false{r}#3]] * \_Eval[[null[LONG] AS sum(salary) where false#3]] * \_Limit[1000[INTEGER],false] * \_EsRelation[test][_meta_field{f}#10, emp_no{f}#4, first_name{f}#5, ge..] */ - public void testReplaceInlinestatsFilteredAggWithEvalSingleAgg() { + public void testReplaceInlineStatsFilteredAggWithEvalSingleAgg() { var query = """ FROM test - | INLINESTATS sum(salary) where false + | INLINE STATS sum(salary) where false """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = plan(query); @@ -427,19 +427,19 @@ public void testReplaceInlinestatsFilteredAggWithEvalSingleAgg() { as(limit.child(), EsRelation.class); } - /** + /* * Project[[_meta_field{f}#10, emp_no{f}#4, first_name{f}#5, gender{f}#6, hire_date{f}#11, job{f}#12, job.raw{f}#13, lang * uages{f}#7, last_name{f}#8, long_noidx{f}#14, salary{f}#9, sum(salary) + 1 where false{r}#3]] * \_Eval[[null[LONG] AS sum(salary) + 1 where false#3]] * \_Limit[1000[INTEGER],false] * \_EsRelation[test][_meta_field{f}#10, emp_no{f}#4, first_name{f}#5, ge..] */ - public void testReplaceInlinestatsFilteredAggWithEvalSingleAggWithExpression() { + public void testReplaceInlineStatsFilteredAggWithEvalSingleAggWithExpression() { var query = """ FROM test - | INLINESTATS sum(salary) + 1 where false + | INLINE STATS sum(salary) + 1 where false """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = plan(query); @@ -480,15 +480,15 @@ public void testReplaceInlinestatsFilteredAggWithEvalSingleAggWithExpression() { * \_Aggregate[[emp_no{f}#9],[SUM(salary{f}#14,true[BOOLEAN],compensated[KEYWORD]) AS $$SUM$sum(salary)_ _2$1#21, emp_no{f}#9]] * \_StubRelation[[salary{f}#14, emp_no{f}#9]] */ - public void testReplaceInlinestatsFilteredAggWithEvalMixedFilterAndNoFilter() { + public void testReplaceInlineStatsFilteredAggWithEvalMixedFilterAndNoFilter() { var query = """ FROM test | KEEP salary, emp_no - | INLINESTATS sum(salary) + 1 where false, + | INLINE STATS sum(salary) + 1 where false, sum(salary) + 2 BY emp_no """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = plan(query); @@ -535,16 +535,16 @@ public void testReplaceInlinestatsFilteredAggWithEvalMixedFilterAndNoFilter() { * \_Aggregate[[],[SUM(salary{f}#16,true[BOOLEAN],compensated[KEYWORD]) AS $$SUM$sum(salary)_ _3$1#23]] * \_StubRelation[[salary{f}#16]] */ - public void testReplaceInlinestatsFilteredAggWithEvalFilterFalseAndNull() { + public void testReplaceInlineStatsFilteredAggWithEvalFilterFalseAndNull() { var query = """ FROM test | KEEP salary - | INLINESTATS sum(salary) + 1 where false, + | INLINE STATS sum(salary) + 1 where false, sum(salary) + 3, sum(salary) + 2 where null, sum(salary) + 4 where not true """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = plan(query); @@ -589,13 +589,13 @@ public void testReplaceInlinestatsFilteredAggWithEvalFilterFalseAndNull() { * \_Limit[1000[INTEGER],false] * \_EsRelation[test][_meta_field{f}#12, emp_no{f}#6, first_name{f}#7, ge..] */ - public void testReplaceInlinestatsFilteredAggWithEvalNotTrue() { + public void testReplaceInlineStatsFilteredAggWithEvalNotTrue() { var query = """ FROM test | KEEP emp_no, salary - | INLINESTATS count(salary) where not true + | INLINE STATS count(salary) where not true """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = plan(query); @@ -621,13 +621,13 @@ public void testReplaceInlinestatsFilteredAggWithEvalNotTrue() { * \_Aggregate[[],[COUNT(salary{f}#13,true[BOOLEAN]) AS m1#7]] * \_StubRelation[[emp_no{f}#8, salary{f}#13, gender{f}#10]] */ - public void testReplaceInlinestatsFilteredAggWithEvalNotFalse() { + public void testReplaceInlineStatsFilteredAggWithEvalNotFalse() { var query = """ FROM test | KEEP emp_no, salary, gender - | INLINESTATS m1 = count(salary) WHERE not false + | INLINE STATS m1 = count(salary) WHERE not false """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = plan(query); @@ -654,13 +654,13 @@ public void testReplaceInlinestatsFilteredAggWithEvalNotFalse() { * \_Limit[1000[INTEGER],false] * \_EsRelation[test][_meta_field{f}#11, emp_no{f}#5, first_name{f}#6, ge..] */ - public void testReplaceInlinestatsFilteredAggWithEvalCount() { + public void testReplaceInlineStatsFilteredAggWithEvalCount() { var query = """ FROM test | KEEP salary - | INLINESTATS count(salary) where false + | INLINE STATS count(salary) where false """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = plan(query); @@ -684,13 +684,13 @@ public void testReplaceInlinestatsFilteredAggWithEvalCount() { * \_Limit[1000[INTEGER],false] * \_EsRelation[test][_meta_field{f}#11, emp_no{f}#5, first_name{f}#6, ge..] */ - public void testReplaceInlinestatsFilteredAggWithEvalCountDistinctInExpression() { + public void testReplaceInlineStatsFilteredAggWithEvalCountDistinctInExpression() { var query = """ FROM test | KEEP salary - | INLINESTATS count_distinct(salary + 2) + 3 where false + | INLINE STATS count_distinct(salary + 2) + 3 where false """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = plan(query); @@ -718,16 +718,16 @@ public void testReplaceInlinestatsFilteredAggWithEvalCountDistinctInExpression() * \_Aggregate[[emp_no{f}#17],[MAX(salary{f}#22,true[BOOLEAN]) AS max#6, MIN(salary{f}#22,true[BOOLEAN]) AS min#12, emp_no{f}#17]] * \_StubRelation[[emp_no{f}#17, salary{f}#22]] */ - public void testReplaceInlinestatsFilteredAggWithEvalSameAggWithAndWithoutFilter() { + public void testReplaceInlineStatsFilteredAggWithEvalSameAggWithAndWithoutFilter() { var query = """ FROM test | KEEP emp_no, salary - | INLINESTATS max = max(salary), max_a = max(salary) WHERE null, + | INLINE STATS max = max(salary), max_a = max(salary) WHERE null, min = min(salary), min_a = min(salary) WHERE to_string(null) == "abc" BY emp_no """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = plan(query); @@ -769,16 +769,16 @@ public void testReplaceInlinestatsFilteredAggWithEvalSameAggWithAndWithoutFilter * \_TopN[[Order[emp_no{f}#9,ASC,LAST]],3[INTEGER]] * \_EsRelation[test][_meta_field{f}#15, emp_no{f}#9, first_name{f}#10, g..] */ - public void testReplaceTwoConsecutiveInlinestats_WithFalseFilters() { + public void testReplaceTwoConsecutiveInlineStats_WithFalseFilters() { var query = """ FROM test | KEEP emp_no | SORT emp_no | LIMIT 3 - | INLINESTATS count = count(*) WHERE false - | INLINESTATS cc = count_distinct(emp_no) WHERE false + | INLINE STATS count = count(*) WHERE false + | INLINE STATS cc = count_distinct(emp_no) WHERE false """; - if (releaseBuildForInlinestats(query)) { + if (releaseBuildForInlineStats(query)) { return; } var plan = plan(query); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/GrammarInDevelopmentParsingTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/GrammarInDevelopmentParsingTests.java index 40f2efdb93e52..4765ffaa71678 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/GrammarInDevelopmentParsingTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/GrammarInDevelopmentParsingTests.java @@ -16,7 +16,7 @@ public class GrammarInDevelopmentParsingTests extends ESTestCase { public void testDevelopmentInline() throws Exception { - parse("row a = 1 | inlinestats b = min(a) by c, d.e", "inlinestats"); + parse("row a = 1 | inline stats b = min(a) by c, d.e", "inline"); } public void testDevelopmentLookup() throws Exception { diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java index 8c9ab44a60d70..330b0f3a44aca 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java @@ -97,12 +97,14 @@ import static org.elasticsearch.xpack.esql.IdentifierGenerator.randomIndexPatterns; import static org.elasticsearch.xpack.esql.IdentifierGenerator.unquoteIndexPattern; import static org.elasticsearch.xpack.esql.IdentifierGenerator.without; +import static org.elasticsearch.xpack.esql.analysis.AnalyzerTests.withInlinestatsWarning; import static org.elasticsearch.xpack.esql.core.expression.Literal.FALSE; import static org.elasticsearch.xpack.esql.core.expression.Literal.TRUE; import static org.elasticsearch.xpack.esql.core.tree.Source.EMPTY; import static org.elasticsearch.xpack.esql.core.type.DataType.INTEGER; import static org.elasticsearch.xpack.esql.core.type.DataType.KEYWORD; import static org.elasticsearch.xpack.esql.expression.function.FunctionResolutionStrategy.DEFAULT; +import static org.elasticsearch.xpack.esql.optimizer.LogicalPlanOptimizerTests.releaseBuildForInlineStats; import static org.elasticsearch.xpack.esql.parser.ExpressionBuilder.breakIntoFragments; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.contains; @@ -399,58 +401,141 @@ public void testStatsWithoutGroupKeyMixedAggAndFilter() { } public void testInlineStatsWithGroups() { - var query = "inlinestats b = min(a) by c, d.e"; - if (Build.current().isSnapshot() == false) { - expectThrows( - ParsingException.class, - containsString("line 1:13: mismatched input 'inlinestats' expecting {"), - () -> processingCommand(query) - ); + if (releaseBuildForInlineStats(null)) { return; } - assertEquals( - new InlineStats( - EMPTY, - new Aggregate( - EMPTY, - PROCESSING_CMD_INPUT, - List.of(attribute("c"), attribute("d.e")), - List.of( - new Alias(EMPTY, "b", new UnresolvedFunction(EMPTY, "min", DEFAULT, List.of(attribute("a")))), - attribute("c"), - attribute("d.e") + for (var cmd : List.of("INLINE STATS", "INLINESTATS")) { + var query = cmd + " b = MIN(a) BY c, d.e"; + assertThat( + processingCommand(query), + is( + new InlineStats( + EMPTY, + new Aggregate( + EMPTY, + PROCESSING_CMD_INPUT, + List.of(attribute("c"), attribute("d.e")), + List.of( + new Alias(EMPTY, "b", new UnresolvedFunction(EMPTY, "MIN", DEFAULT, List.of(attribute("a")))), + attribute("c"), + attribute("d.e") + ) + ) ) ) - ), - processingCommand(query) - ); + ); + } } public void testInlineStatsWithoutGroups() { - var query = "inlinestats min(a), c = 1"; - if (Build.current().isSnapshot() == false) { - expectThrows( - ParsingException.class, - containsString("line 1:13: mismatched input 'inlinestats' expecting {"), - () -> processingCommand(query) - ); + if (releaseBuildForInlineStats(null)) { return; } - assertEquals( - new InlineStats( - EMPTY, - new Aggregate( - EMPTY, - PROCESSING_CMD_INPUT, - List.of(), - List.of( - new Alias(EMPTY, "min(a)", new UnresolvedFunction(EMPTY, "min", DEFAULT, List.of(attribute("a")))), - new Alias(EMPTY, "c", integer(1)) + for (var cmd : List.of("INLINE STATS", "INLINESTATS")) { + var query = cmd + " MIN(a), c = 1"; + assertThat( + processingCommand(query), + is( + new InlineStats( + EMPTY, + new Aggregate( + EMPTY, + PROCESSING_CMD_INPUT, + List.of(), + List.of( + new Alias(EMPTY, "MIN(a)", new UnresolvedFunction(EMPTY, "MIN", DEFAULT, List.of(attribute("a")))), + new Alias(EMPTY, "c", integer(1)) + ) + ) ) ) - ), - processingCommand(query) + ); + } + } + + @Override + protected List filteredWarnings() { + return withInlinestatsWarning(super.filteredWarnings()); + } + + public void testInlineStatsParsing() { + if (releaseBuildForInlineStats(null)) { + return; + } + expectThrows( + ParsingException.class, + containsString("line 1:19: token recognition error at: 'I'"), + () -> statement("FROM foo | INLINE INLINE STATS COUNT(*)") ); + expectThrows( + ParsingException.class, + containsString("line 1:19: token recognition error at: 'F'"), + () -> statement("FROM foo | INLINE FOO COUNT(*)") + ); + } + + /* + * Fork[[]] + * |_Eval[[fork1[KEYWORD] AS _fork#3]] + * | \_Limit[11[INTEGER],false] + * | \_Filter[:(?a,baz[KEYWORD])] + * | \_UnresolvedRelation[foo*] + * |_Eval[[fork2[KEYWORD] AS _fork#3]] + * | \_Aggregate[[],[?COUNT[*] AS COUNT(*)#4]] + * | \_UnresolvedRelation[foo*] + * \_Eval[[fork3[KEYWORD] AS _fork#3]] + * \_InlineStats[] + * \_Aggregate[[],[?COUNT[*] AS COUNT(*)#5]] + * \_UnresolvedRelation[foo*] + */ + public void testInlineStatsWithinFork() { + if (releaseBuildForInlineStats(null)) { + return; + } + var query = """ + FROM foo* + | FORK ( WHERE a:"baz" | LIMIT 11 ) + ( STATS COUNT(*) ) + ( INLINE STATS COUNT(*) ) + """; + var plan = statement(query); + var fork = as(plan, Fork.class); + var subPlans = fork.children(); + + // first subplan + var eval = as(subPlans.get(0), Eval.class); + assertThat(as(eval.fields().get(0), Alias.class), equalTo(alias("_fork", literalString("fork1")))); + var limit = as(eval.child(), Limit.class); + assertThat(limit.limit(), instanceOf(Literal.class)); + assertThat(((Literal) limit.limit()).value(), equalTo(11)); + var filter = as(limit.child(), Filter.class); + var match = (MatchOperator) filter.condition(); + var matchField = (UnresolvedAttribute) match.field(); + assertThat(matchField.name(), equalTo("a")); + assertThat(match.query().fold(FoldContext.small()), equalTo(BytesRefs.toBytesRef("baz"))); + + // second subplan + eval = as(subPlans.get(1), Eval.class); + assertThat(as(eval.fields().get(0), Alias.class), equalTo(alias("_fork", literalString("fork2")))); + var aggregate = as(eval.child(), Aggregate.class); + assertThat(aggregate.aggregates().size(), equalTo(1)); + var alias = as(aggregate.aggregates().get(0), Alias.class); + assertThat(alias.name(), equalTo("COUNT(*)")); + var countFn = as(alias.child(), UnresolvedFunction.class); + assertThat(countFn.children().get(0), instanceOf(Literal.class)); + assertThat(countFn.children().get(0).fold(FoldContext.small()), equalTo(BytesRefs.toBytesRef("*"))); + + // third subplan + eval = as(subPlans.get(2), Eval.class); + assertThat(as(eval.fields().get(0), Alias.class), equalTo(alias("_fork", literalString("fork3")))); + var inlineStats = as(eval.child(), InlineStats.class); + aggregate = as(inlineStats.child(), Aggregate.class); + assertThat(aggregate.aggregates().size(), equalTo(1)); + alias = as(aggregate.aggregates().get(0), Alias.class); + assertThat(alias.name(), equalTo("COUNT(*)")); + countFn = as(alias.child(), UnresolvedFunction.class); + assertThat(countFn.children().get(0), instanceOf(Literal.class)); + assertThat(countFn.children().get(0).fold(FoldContext.small()), equalTo(BytesRefs.toBytesRef("*"))); } public void testStringAsIndexPattern() { @@ -1084,7 +1169,7 @@ public void testSuggestAvailableProcessingCommandsOnParsingError() { allOf( containsString("mismatched input '" + queryWithUnexpectedCmd.v2() + "'"), containsString("'eval'"), - containsString("'stats'"), + containsString("'limit'"), containsString("'where'") ), () -> statement(queryWithUnexpectedCmd.v1()) @@ -3763,7 +3848,7 @@ public void testForkAllCommands() { query = """ FROM foo* | FORK - ( INLINESTATS x = MIN(a), y = MAX(b) WHERE d > 1000 ) + ( INLINE STATS x = MIN(a), y = MAX(b) WHERE d > 1000 ) ( INSIST_🐔 a ) ( LOOKUP_🐔 a on b ) | KEEP a diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/CommandLicenseTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/CommandLicenseTests.java index 204aee977f5c2..dfbb080fcf0ef 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/CommandLicenseTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/CommandLicenseTests.java @@ -115,7 +115,7 @@ private static Map> getCommandClasses() { Map commandClassNameMapper = Map.of( "Where", "Filter", - "Inlinestats", + "Inline", "InlineStats", "Rrf", "RrfScoreEval", @@ -126,7 +126,16 @@ private static Map> getCommandClasses() { "Join", "LookupJoin" ); - Map commandNameMapper = Map.of("ChangePoint", "CHANGE_POINT", "LookupJoin", "LOOKUP_JOIN", "MvExpand", "MV_EXPAND"); + Map commandNameMapper = Map.of( + "ChangePoint", + "CHANGE_POINT", + "LookupJoin", + "LOOKUP_JOIN", + "MvExpand", + "MV_EXPAND", + "InlineStats", + "INLINE_STATS" + ); Map commandPackageMapper = Map.of("Rerank", planPackage + ".inference", "LookupJoin", planPackage + ".join"); Set ignoredClasses = Set.of("Processing", "TimeSeries", "Completion", "Source", "From", "Row"); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/session/FieldNameUtilsTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/session/FieldNameUtilsTests.java index 342483e88d99e..aff10a94f2460 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/session/FieldNameUtilsTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/session/FieldNameUtilsTests.java @@ -31,18 +31,18 @@ public void testBasicFromCommand() { assertFieldNames("from test", ALL_FIELDS); } - public void testBasicFromCommandWithInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); - assertFieldNames("from test | inlinestats max(salary) by gender", ALL_FIELDS); + public void testBasicFromCommandWithInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); + assertFieldNames("from test | inline stats max(salary) by gender", ALL_FIELDS); } public void testBasicFromCommandWithMetadata() { assertFieldNames("from test metadata _index, _id, _version", ALL_FIELDS); } - public void testBasicFromCommandWithMetadata_AndInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); - assertFieldNames("from test metadata _index, _id, _version | inlinestats max(salary)", ALL_FIELDS); + public void testBasicFromCommandWithMetadata_AndInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); + assertFieldNames("from test metadata _index, _id, _version | inline stats max(salary)", ALL_FIELDS); } public void testBasicEvalAndDrop() { @@ -317,11 +317,11 @@ public void testLimitZero() { | LIMIT 0""", ALL_FIELDS); } - public void testLimitZero_WithInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + public void testLimitZero_WithInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); assertFieldNames(""" FROM employees - | INLINESTATS COUNT(*), MAX(salary) BY gender + | INLINE STATS COUNT(*), MAX(salary) BY gender | LIMIT 0""", ALL_FIELDS); } @@ -332,12 +332,12 @@ public void testDocsDropHeight() { | LIMIT 0""", ALL_FIELDS); } - public void testDocsDropHeight_WithInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + public void testDocsDropHeight_WithInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); assertFieldNames(""" FROM employees | DROP height - | INLINESTATS MAX(salary) BY gender + | INLINE STATS MAX(salary) BY gender | LIMIT 0""", ALL_FIELDS); } @@ -348,11 +348,11 @@ public void testDocsDropHeightWithWildcard() { | LIMIT 0""", ALL_FIELDS); } - public void testDocsDropHeightWithWildcard_AndInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + public void testDocsDropHeightWithWildcard_AndInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); assertFieldNames(""" FROM employees - | INLINESTATS MAX(salary) BY gender + | INLINE STATS MAX(salary) BY gender | DROP height* | LIMIT 0""", ALL_FIELDS); } @@ -515,9 +515,9 @@ public void testSortWithLimitOne_DropHeight() { assertFieldNames("from employees | sort languages | limit 1 | drop height*", ALL_FIELDS); } - public void testSortWithLimitOne_DropHeight_WithInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); - assertFieldNames("from employees | inlinestats avg(salary) by languages | sort languages | limit 1 | drop height*", ALL_FIELDS); + public void testSortWithLimitOne_DropHeight_WithInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); + assertFieldNames("from employees | inline stats avg(salary) by languages | sort languages | limit 1 | drop height*", ALL_FIELDS); } public void testDropAllColumns() { @@ -815,9 +815,9 @@ public void testFilterById() { assertFieldNames("FROM apps metadata _id | WHERE _id == \"4\"", ALL_FIELDS); } - public void testFilterById_WithInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); - assertFieldNames("FROM apps metadata _id | INLINESTATS max(rate) | WHERE _id == \"4\"", ALL_FIELDS); + public void testFilterById_WithInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); + assertFieldNames("FROM apps metadata _id | INLINE STATS max(rate) | WHERE _id == \"4\"", ALL_FIELDS); } public void testKeepId() { @@ -1286,11 +1286,11 @@ public void testProjectDropPattern() { """, ALL_FIELDS); } - public void testProjectDropPattern_WithInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + public void testProjectDropPattern_WithInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); assertFieldNames(""" from test - | inlinestats max(foo) by bar + | inline stats max(foo) by bar | keep * | drop *_name """, ALL_FIELDS); @@ -1369,11 +1369,11 @@ public void testCountAllAndOtherStatGrouped() { """, Set.of("emp_no", "emp_no.*", "languages", "languages.*")); } - public void testCountAllAndOtherStatGrouped_WithInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + public void testCountAllAndOtherStatGrouped_WithInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); assertFieldNames(""" from test - | inlinestats c = count(*), min = min(emp_no) by languages + | inline stats c = count(*), min = min(emp_no) by languages | stats c = count(*), min = min(emp_no) by languages | sort languages """, Set.of("emp_no", "emp_no.*", "languages", "languages.*")); @@ -1408,12 +1408,12 @@ public void testCountAllWithEval() { """, Set.of("languages", "languages.*", "salary", "salary.*")); } - public void testCountAllWithEval_AndInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + public void testCountAllWithEval_AndInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); assertFieldNames(""" from test | rename languages as l - | inlinestats max(salary) by l + | inline stats max(salary) by l | stats min = min(salary) by l | eval x = min + 1 | stats ca = count(*), cx = count(x) by l @@ -1421,12 +1421,12 @@ public void testCountAllWithEval_AndInlinestats() { """, Set.of("languages", "languages.*", "salary", "salary.*")); } - public void testKeepAfterEval_AndInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + public void testKeepAfterEval_AndInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); assertFieldNames(""" from test | rename languages as l - | inlinestats max(salary) by l + | inline stats max(salary) by l | stats min = min(salary) by l | eval x = min + 1 | keep x, l @@ -1434,46 +1434,46 @@ public void testKeepAfterEval_AndInlinestats() { """, Set.of("languages", "languages.*", "salary", "salary.*")); } - public void testKeepBeforeEval_AndInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + public void testKeepBeforeEval_AndInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); assertFieldNames(""" from test | rename languages as l | keep l, salary, emp_no - | inlinestats max(salary) by l + | inline stats max(salary) by l | eval x = `max(salary)` + 1 | stats min = min(salary) by l | sort l """, Set.of("languages", "languages.*", "salary", "salary.*", "emp_no", "emp_no.*")); } - public void testStatsBeforeEval_AndInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + public void testStatsBeforeEval_AndInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); assertFieldNames(""" from test | rename languages as l | stats min = min(salary) by l | eval salary = min + 1 - | inlinestats max(salary) by l + | inline stats max(salary) by l | sort l """, Set.of("languages", "languages.*", "salary", "salary.*")); } - public void testStatsBeforeInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + public void testStatsBeforeInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); assertFieldNames(""" from test | stats min = min(salary) by languages - | inlinestats max(min) by languages + | inline stats max(min) by languages """, Set.of("languages", "languages.*", "salary", "salary.*")); } - public void testKeepBeforeInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + public void testKeepBeforeInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); assertFieldNames(""" from test | keep languages, salary - | inlinestats max(salary) by languages + | inline stats max(salary) by languages """, Set.of("languages", "languages.*", "salary", "salary.*")); } @@ -2838,39 +2838,39 @@ public void testForkAfterMvExpand() { } public void testForkBeforeInlineStatsIgnore() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); assertTrue("FORK required", EsqlCapabilities.Cap.FORK_V9.isEnabled()); assertFieldNames(""" FROM employees | KEEP emp_no, languages, gender | FORK (WHERE emp_no == 10048 OR emp_no == 10081) (WHERE emp_no == 10081 OR emp_no == 10087) - | INLINESTATS max_lang = MAX(languages) BY gender + | INLINE STATS max_lang = MAX(languages) BY gender | SORT emp_no, gender, _fork | LIMIT 5""", Set.of("emp_no", "gender", "languages", "gender.*", "languages.*", "emp_no.*")); } public void testForkBranchWithInlineStatsIgnore() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); assertTrue("FORK required", EsqlCapabilities.Cap.FORK_V9.isEnabled()); assertFieldNames(""" FROM employees | KEEP emp_no, languages, gender | FORK (WHERE emp_no == 10048 OR emp_no == 10081 - | INLINESTATS x = MAX(languages) BY gender) + | INLINE STATS x = MAX(languages) BY gender) (WHERE emp_no == 10081 OR emp_no == 10087 - | INLINESTATS x = MIN(languages)) + | INLINE STATS x = MIN(languages)) (WHERE emp_no == 10012 OR emp_no == 10012) | SORT emp_no, gender, _fork""", Set.of("emp_no", "gender", "languages", "gender.*", "languages.*", "emp_no.*")); } public void testForkAfterInlineStatsIgnore() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); assertTrue("FORK required", EsqlCapabilities.Cap.FORK_V9.isEnabled()); assertFieldNames(""" FROM employees | KEEP emp_no, languages, gender - | INLINESTATS max_lang = MAX(languages) BY gender + | INLINE STATS max_lang = MAX(languages) BY gender | FORK (WHERE emp_no == 10048 OR emp_no == 10081) (WHERE emp_no == 10081 OR emp_no == 10087) | SORT emp_no, gender, _fork""", Set.of("emp_no", "gender", "languages", "gender.*", "languages.*", "emp_no.*")); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/telemetry/VerifierMetricsTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/telemetry/VerifierMetricsTests.java index fde5c16d0a71d..779c884903405 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/telemetry/VerifierMetricsTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/telemetry/VerifierMetricsTests.java @@ -30,7 +30,7 @@ import static org.elasticsearch.xpack.esql.telemetry.FeatureMetric.EVAL; import static org.elasticsearch.xpack.esql.telemetry.FeatureMetric.FROM; import static org.elasticsearch.xpack.esql.telemetry.FeatureMetric.GROK; -import static org.elasticsearch.xpack.esql.telemetry.FeatureMetric.INLINESTATS; +import static org.elasticsearch.xpack.esql.telemetry.FeatureMetric.INLINE_STATS; import static org.elasticsearch.xpack.esql.telemetry.FeatureMetric.KEEP; import static org.elasticsearch.xpack.esql.telemetry.FeatureMetric.LIMIT; import static org.elasticsearch.xpack.esql.telemetry.FeatureMetric.LOOKUP_JOIN; @@ -66,7 +66,7 @@ public void testDissectQuery() { assertEquals(0, keep(c)); assertEquals(0, rename(c)); assertEquals(0, lookupjoin(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); assertEquals(1, function("concat", c)); } @@ -88,7 +88,7 @@ public void testEvalQuery() { assertEquals(0, keep(c)); assertEquals(0, rename(c)); assertEquals(0, lookupjoin(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); assertEquals(1, function("length", c)); } @@ -110,7 +110,7 @@ public void testGrokQuery() { assertEquals(0, keep(c)); assertEquals(0, rename(c)); assertEquals(0, lookupjoin(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); assertEquals(1, function("concat", c)); } @@ -132,7 +132,7 @@ public void testLimitQuery() { assertEquals(0, keep(c)); assertEquals(0, rename(c)); assertEquals(0, lookupjoin(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); } public void testSortQuery() { @@ -153,7 +153,7 @@ public void testSortQuery() { assertEquals(0, keep(c)); assertEquals(0, rename(c)); assertEquals(0, lookupjoin(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); } public void testStatsQuery() { @@ -174,7 +174,7 @@ public void testStatsQuery() { assertEquals(0, keep(c)); assertEquals(0, rename(c)); assertEquals(0, lookupjoin(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); assertEquals(1, function("max", c)); } @@ -196,7 +196,7 @@ public void testWhereQuery() { assertEquals(0, keep(c)); assertEquals(0, rename(c)); assertEquals(0, lookupjoin(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); } public void testTwoWhereQuery() { @@ -217,7 +217,7 @@ public void testTwoWhereQuery() { assertEquals(0, keep(c)); assertEquals(0, rename(c)); assertEquals(0, lookupjoin(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); } public void testTwoQueriesExecuted() { @@ -258,7 +258,7 @@ public void testTwoQueriesExecuted() { assertEquals(0, keep(c)); assertEquals(0, rename(c)); assertEquals(0, lookupjoin(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); assertEquals(1, function("length", c)); assertEquals(1, function("concat", c)); @@ -342,7 +342,7 @@ public void testEnrich() { assertEquals(0, drop(c)); assertEquals(1L, keep(c)); assertEquals(0, rename(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); assertEquals(0, lookupjoin(c)); assertEquals(1, function("to_string", c)); } @@ -373,7 +373,7 @@ public void testMvExpand() { assertEquals(0, drop(c)); assertEquals(1L, keep(c)); assertEquals(0, rename(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); assertEquals(0, lookupjoin(c)); } @@ -394,7 +394,7 @@ public void testShowInfo() { assertEquals(0, drop(c)); assertEquals(0, keep(c)); assertEquals(0, rename(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); assertEquals(0, lookupjoin(c)); assertEquals(1, function("count", c)); } @@ -416,7 +416,7 @@ public void testRow() { assertEquals(0, drop(c)); assertEquals(0, keep(c)); assertEquals(0, rename(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); assertEquals(0, lookupjoin(c)); } @@ -437,7 +437,7 @@ public void testDropAndRename() { assertEquals(1L, drop(c)); assertEquals(0, keep(c)); assertEquals(1L, rename(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); assertEquals(0, lookupjoin(c)); assertEquals(1, function("count", c)); } @@ -464,7 +464,7 @@ public void testKeep() { assertEquals(0, drop(c)); assertEquals(1L, keep(c)); assertEquals(0, rename(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); assertEquals(0, lookupjoin(c)); } @@ -489,17 +489,17 @@ public void testCategorize() { assertEquals(0, drop(c)); assertEquals(1L, keep(c)); assertEquals(0, rename(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); assertEquals(0, lookupjoin(c)); assertEquals(1, function("count", c)); assertEquals(1, function("categorize", c)); } - public void testInlinestatsStandalone() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + public void testInlineStatsStandalone() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); Counters c = esql(""" from employees - | inlinestats max(salary) by gender + | inline stats max(salary) by gender | where languages is not null"""); assertEquals(0, dissect(c)); assertEquals(0, eval(c)); @@ -516,16 +516,16 @@ public void testInlinestatsStandalone() { assertEquals(0, drop(c)); assertEquals(0, keep(c)); assertEquals(0, rename(c)); - assertEquals(1L, inlinestats(c)); + assertEquals(1L, inlineStats(c)); assertEquals(0, lookupjoin(c)); assertEquals(1, function("max", c)); } - public void testInlinestatsWithOtherStats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + public void testInlineStatsWithOtherStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); Counters c = esql(""" from employees - | inlinestats m = max(salary) by gender + | inline stats m = max(salary) by gender | where languages is not null | stats max(m) by languages"""); assertEquals(0, dissect(c)); @@ -543,7 +543,7 @@ public void testInlinestatsWithOtherStats() { assertEquals(0, drop(c)); assertEquals(0, keep(c)); assertEquals(0, rename(c)); - assertEquals(1L, inlinestats(c)); + assertEquals(1L, inlineStats(c)); assertEquals(0, lookupjoin(c)); assertEquals(1, function("max", c)); } @@ -569,17 +569,17 @@ public void testBinaryPlanAfterStats() { assertEquals(0, drop(c)); assertEquals(0, keep(c)); assertEquals(0, rename(c)); - assertEquals(0, inlinestats(c)); + assertEquals(0, inlineStats(c)); assertEquals(1L, lookupjoin(c)); assertEquals(1, function("max", c)); } - public void testBinaryPlanAfterInlinestats() { - assumeTrue("INLINESTATS required", EsqlCapabilities.Cap.INLINESTATS_V11.isEnabled()); + public void testBinaryPlanAfterInlineStats() { + assumeTrue("INLINE STATS required", EsqlCapabilities.Cap.INLINE_STATS.isEnabled()); Counters c = esql(""" from employees | eval language_code = languages - | inlinestats m = max(salary) by language_code + | inline stats m = max(salary) by language_code | lookup join languages_lookup on language_code"""); assertEquals(0, dissect(c)); assertEquals(1L, eval(c)); @@ -596,7 +596,7 @@ public void testBinaryPlanAfterInlinestats() { assertEquals(0, drop(c)); assertEquals(0, keep(c)); assertEquals(0, rename(c)); - assertEquals(1L, inlinestats(c)); + assertEquals(1L, inlineStats(c)); assertEquals(1L, lookupjoin(c)); assertEquals(1, function("max", c)); } @@ -661,8 +661,8 @@ private long rename(Counters c) { return c.get(FEATURES_PREFIX + RENAME); } - private long inlinestats(Counters c) { - return c.get(FEATURES_PREFIX + INLINESTATS); + private long inlineStats(Counters c) { + return c.get(FEATURES_PREFIX + INLINE_STATS); } private long lookupjoin(Counters c) { diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/60_usage.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/60_usage.yml index 9023f78356d1d..72cb6efe42efc 100644 --- a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/60_usage.yml +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/60_usage.yml @@ -44,6 +44,7 @@ setup: - cosine_vector_similarity_function - present_over_time - absent_over_time + - inline_stats reason: "Test that should only be executed on snapshot versions" - do: {xpack.usage: {}} @@ -68,7 +69,7 @@ setup: - set: {esql.features.lookup_join: lookup_join_counter} - set: {esql.features.lookup: lookup_counter} - set: {esql.features.change_point: change_point_counter} - - set: {esql.features.inlinestats: inlinestats_counter} + - set: {esql.features.inline_stats: inline_stats_counter} - set: {esql.features.rerank: rerank_counter} - set: {esql.features.insist: insist_counter} - set: {esql.features.fork: fork_counter} @@ -111,7 +112,7 @@ setup: - match: {esql.features.lookup_join: $lookup_join_counter} - match: {esql.features.lookup: $lookup_counter} - match: {esql.features.change_point: $change_point_counter} - - match: {esql.features.inlinestats: $inlinestats_counter} + - match: {esql.features.inline_stats: $inline_stats_counter} - match: {esql.features.rerank: $rerank_counter} - match: {esql.features.insist: $insist_counter} - match: {esql.features.fork: $fork_counter} @@ -165,7 +166,7 @@ setup: - set: {esql.features.lookup_join: lookup_join_counter} - set: {esql.features.lookup: lookup_counter} - set: {esql.features.change_point: change_point_counter} - - set: {esql.features.inlinestats: inlinestats_counter} + - set: {esql.features.inline_stats: inline_stats_counter} - set: {esql.features.rerank: rerank_counter} - set: {esql.features.insist: insist_counter} - set: {esql.features.fork: fork_counter} @@ -208,7 +209,7 @@ setup: - match: {esql.features.lookup_join: $lookup_join_counter} - match: {esql.features.lookup: $lookup_counter} - match: {esql.features.change_point: $change_point_counter} - - match: {esql.features.inlinestats: $inlinestats_counter} + - match: {esql.features.inline_stats: $inline_stats_counter} - match: {esql.features.rerank: $rerank_counter} - match: {esql.features.insist: $insist_counter} - match: {esql.features.fork: $fork_counter}