浏览代码

[8.x] ES|QL change point (#126771)

* ES|QL change_point processing command (#120998)

* Grammar for ES|QL change point (with dummy impl)

* pipeline breaker

* ChangePointOperator

* Add sorting

* basic csv test

* conflict

* Update docs/changelog/120998.yaml

* [CI] Auto commit changes from spotless

* polish

* Non-long data type

* Move OrderBy/Limit to the logical plan

* fix mem.leak

* csv test for reusing column names

* Warning indeterminable

* capability

* handle null values

* too much data

* type text->keyword

* default timestamp and output columns

* spotless

* ChangePointOperatorTests + fix memory leaks

* [CI] Auto commit changes from spotless

* improve test

* add comments/todos

* handle multivalued columns

* don't register unserialiazable

* surrogate

* make "too much data" tests readable

* more tests

* Error handling

* fix multivalued test

* more name conflict tests

* [CI] Auto commit changes from spotless

* more tests

* improve code

* CSV test for various input key/value types

* one more csv test

* Check sortable/numeric for all types

* add null type to testChangePoint_valueNumeric

* more CSV tests

* skip nulls instead of zeroing them

* error on MV

* Test+todo for nicer error message

* better error msg

* Revert "better error msg"

This reverts commit 21ec77c8f34a875d41906ae8b8301ed66c009bc8.

* fix

* make csv test deterministic

* replace NamedExpression -> Attribute

* skip MVs + warning

---------

Co-authored-by: elasticsearchmachine <infra-root+elasticsearchmachine@elastic.co>

* Move ES|QL change_point to tech preview

* fix grammar

* License check

* docs + example

* spotless

* fix compile error

* add change_point to ES|QL processing commands overview page

* close note

* close note

* fix link

---------

Co-authored-by: elasticsearchmachine <infra-root+elasticsearchmachine@elastic.co>
Co-authored-by: Craig Taverner <craig@amanzi.com>
Jan Kuipers 5 月之前
父节点
当前提交
f9fd055aef
共有 32 个文件被更改,包括 3890 次插入1730 次删除
  1. 5 0
      docs/changelog/120998.yaml
  2. 2 0
      docs/reference/esql/esql-commands.asciidoc
  3. 49 0
      docs/reference/esql/processing-commands/change_point.asciidoc
  4. 236 0
      x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/ChangePointOperator.java
  5. 23 10
      x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/Warnings.java
  6. 86 0
      x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/operator/ChangePointOperatorTests.java
  7. 0 1
      x-pack/plugin/esql/compute/test/src/main/java/org/elasticsearch/compute/test/OperatorTestCase.java
  8. 1219 0
      x-pack/plugin/esql/qa/testFixtures/src/main/resources/change_point.csv-spec
  9. 23 6
      x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4
  10. 168 163
      x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens
  11. 5 0
      x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4
  12. 168 163
      x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens
  13. 5 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java
  14. 20 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp
  15. 1246 1188
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java
  16. 9 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp
  17. 197 183
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java
  18. 12 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java
  19. 7 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java
  20. 10 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java
  21. 6 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java
  22. 20 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java
  23. 2 2
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/PlanWritables.java
  24. 164 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/ChangePoint.java
  25. 107 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/ChangePointExec.java
  26. 20 2
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlanner.java
  27. 13 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/mapper/MapperUtils.java
  28. 2 4
      x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java
  29. 58 7
      x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java
  30. 3 0
      x-pack/plugin/ml/src/main/java/module-info.java
  31. 1 1
      x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/MachineLearning.java
  32. 4 0
      x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/aggs/changepoint/ChangeType.java

+ 5 - 0
docs/changelog/120998.yaml

@@ -0,0 +1,5 @@
+pr: 120998
+summary: ES|QL `change_point` processing command
+area: Machine Learning
+type: feature
+issues: []

+ 2 - 0
docs/reference/esql/esql-commands.asciidoc

@@ -32,6 +32,7 @@ image::images/esql/processing-command.svg[A processing command changing an input
 
 {esql} supports these processing commands:
 
+* experimental:[] <<esql-change_point>>
 * <<esql-dissect>>
 * <<esql-drop>>
 * <<esql-enrich>>
@@ -55,6 +56,7 @@ include::source-commands/from.asciidoc[]
 include::source-commands/row.asciidoc[]
 include::source-commands/show.asciidoc[]
 
+include::processing-commands/change_point.asciidoc[]
 include::processing-commands/dissect.asciidoc[]
 include::processing-commands/drop.asciidoc[]
 include::processing-commands/enrich.asciidoc[]

+ 49 - 0
docs/reference/esql/processing-commands/change_point.asciidoc

@@ -0,0 +1,49 @@
+[discrete]
+[[esql-change_point]]
+=== `CHANGE_POINT`
+
+[NOTE]
+====
+The `CHANGE_POINT` command requires a https://www.elastic.co/subscriptions[platinum license].
+====
+
+preview::[]
+
+`CHANGE_POINT` detects spikes, dips, and change points in a metric.
+
+**Syntax**
+
+[source,esql]
+----
+CHANGE_POINT value [ON key] [AS type_name, pvalue_name]
+----
+
+*Parameters*
+
+`value`
+:   The column with the metric in which you want to detect a change point.
+
+`key`
+:   The column with the key to order the values by. If not specified, `@timestamp` is used.
+
+`type_name`
+:   The name of the output column with the change point type. If not specified, `type` is used.
+
+`pvalue_name`
+:   The name of the output column with the p-value that indicates how extreme the change point is. If not specified, `pvalue` is used.
+
+[NOTE]
+====
+There must be at least 22 values for change point detection. Fewer than 1,000 is preferred.
+====
+
+*Example*
+
+[source.merge.styled,esql]
+----
+include::{esql-specs}/change_point.csv-spec[tag=changePointForDocs]
+----
+[%header.monospaced.styled,format=dsv,separator=|]
+|===
+include::{esql-specs}/change_point.csv-spec[tag=changePointForDocs-result]
+|===

+ 236 - 0
x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/ChangePointOperator.java

@@ -0,0 +1,236 @@
+/*
+ * 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.
+ */
+
+package org.elasticsearch.compute.operator;
+
+import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.compute.data.Block;
+import org.elasticsearch.compute.data.BlockFactory;
+import org.elasticsearch.compute.data.BlockUtils;
+import org.elasticsearch.compute.data.BytesRefBlock;
+import org.elasticsearch.compute.data.DoubleBlock;
+import org.elasticsearch.compute.data.Page;
+import org.elasticsearch.core.Releasables;
+import org.elasticsearch.xpack.ml.aggs.MlAggsHelper;
+import org.elasticsearch.xpack.ml.aggs.changepoint.ChangePointDetector;
+import org.elasticsearch.xpack.ml.aggs.changepoint.ChangeType;
+
+import java.util.ArrayList;
+import java.util.Deque;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Find spikes, dips and change point in a list of values.
+ * <p>
+ * Warning: this operator cannot handle large amounts of data! It buffers all
+ * data that is passed to it, runs the change point detector on the data (which
+ * is a compute-heavy process), and then outputs all data with the change points.
+ */
+public class ChangePointOperator implements Operator {
+
+    public static final int INPUT_VALUE_COUNT_LIMIT = 1000;
+
+    public record Factory(int channel, String sourceText, int sourceLine, int sourceColumn) implements OperatorFactory {
+        @Override
+        public Operator get(DriverContext driverContext) {
+            return new ChangePointOperator(driverContext, channel, sourceText, sourceLine, sourceColumn);
+        }
+
+        @Override
+        public String describe() {
+            return "ChangePointOperator[channel=" + channel + "]";
+        }
+    }
+
+    private final DriverContext driverContext;
+    private final int channel;
+    private final String sourceText;
+    private final int sourceLine;
+    private final int sourceColumn;
+
+    private final Deque<Page> inputPages;
+    private final Deque<Page> outputPages;
+    private boolean finished;
+    private Warnings warnings;
+
+    // TODO: make org.elasticsearch.xpack.esql.core.tree.Source available here
+    // (by modularizing esql-core) and use that instead of the individual fields.
+    public ChangePointOperator(DriverContext driverContext, int channel, String sourceText, int sourceLine, int sourceColumn) {
+        this.driverContext = driverContext;
+        this.channel = channel;
+        this.sourceText = sourceText;
+        this.sourceLine = sourceLine;
+        this.sourceColumn = sourceColumn;
+
+        finished = false;
+        inputPages = new LinkedList<>();
+        outputPages = new LinkedList<>();
+        warnings = null;
+    }
+
+    @Override
+    public boolean needsInput() {
+        return finished == false;
+    }
+
+    @Override
+    public void addInput(Page page) {
+        inputPages.add(page);
+    }
+
+    @Override
+    public void finish() {
+        if (finished == false) {
+            finished = true;
+            createOutputPages();
+        }
+    }
+
+    @Override
+    public boolean isFinished() {
+        return finished && outputPages.isEmpty();
+    }
+
+    @Override
+    public Page getOutput() {
+        if (finished == false || outputPages.isEmpty()) {
+            return null;
+        }
+        return outputPages.removeFirst();
+    }
+
+    private void createOutputPages() {
+        int valuesCount = 0;
+        for (Page page : inputPages) {
+            valuesCount += page.getPositionCount();
+        }
+        boolean tooManyValues = valuesCount > INPUT_VALUE_COUNT_LIMIT;
+        if (tooManyValues) {
+            valuesCount = INPUT_VALUE_COUNT_LIMIT;
+        }
+
+        List<Double> values = new ArrayList<>(valuesCount);
+        List<Integer> bucketIndexes = new ArrayList<>(valuesCount);
+        int valuesIndex = 0;
+        boolean hasNulls = false;
+        boolean hasMultivalued = false;
+        for (Page inputPage : inputPages) {
+            Block inputBlock = inputPage.getBlock(channel);
+            for (int i = 0; i < inputBlock.getPositionCount() && valuesIndex < valuesCount; i++) {
+                Object value = BlockUtils.toJavaObject(inputBlock, i);
+                if (value == null) {
+                    hasNulls = true;
+                    valuesIndex++;
+                } else if (value instanceof List<?>) {
+                    hasMultivalued = true;
+                    valuesIndex++;
+                } else {
+                    values.add(((Number) value).doubleValue());
+                    bucketIndexes.add(valuesIndex++);
+                }
+            }
+        }
+
+        MlAggsHelper.DoubleBucketValues bucketValues = new MlAggsHelper.DoubleBucketValues(
+            null,
+            values.stream().mapToDouble(Double::doubleValue).toArray(),
+            bucketIndexes.stream().mapToInt(Integer::intValue).toArray()
+        );
+        ChangeType changeType = ChangePointDetector.getChangeType(bucketValues);
+        int changePointIndex = changeType.changePoint();
+
+        BlockFactory blockFactory = driverContext.blockFactory();
+        int pageStartIndex = 0;
+        while (inputPages.isEmpty() == false) {
+            Page inputPage = inputPages.peek();
+            Page outputPage;
+            Block changeTypeBlock = null;
+            Block changePvalueBlock = null;
+            boolean success = false;
+            try {
+                if (pageStartIndex <= changePointIndex && changePointIndex < pageStartIndex + inputPage.getPositionCount()) {
+                    try (
+                        BytesRefBlock.Builder changeTypeBlockBuilder = blockFactory.newBytesRefBlockBuilder(inputPage.getPositionCount());
+                        DoubleBlock.Builder pvalueBlockBuilder = blockFactory.newDoubleBlockBuilder(inputPage.getPositionCount())
+                    ) {
+                        for (int i = 0; i < inputPage.getPositionCount(); i++) {
+                            if (pageStartIndex + i == changePointIndex) {
+                                changeTypeBlockBuilder.appendBytesRef(new BytesRef(changeType.getWriteableName()));
+                                pvalueBlockBuilder.appendDouble(changeType.pValue());
+                            } else {
+                                changeTypeBlockBuilder.appendNull();
+                                pvalueBlockBuilder.appendNull();
+                            }
+                        }
+                        changeTypeBlock = changeTypeBlockBuilder.build();
+                        changePvalueBlock = pvalueBlockBuilder.build();
+                    }
+                } else {
+                    changeTypeBlock = blockFactory.newConstantNullBlock(inputPage.getPositionCount());
+                    changePvalueBlock = blockFactory.newConstantNullBlock(inputPage.getPositionCount());
+                }
+
+                outputPage = inputPage.appendBlocks(new Block[] { changeTypeBlock, changePvalueBlock });
+                success = true;
+            } finally {
+                if (success == false) {
+                    Releasables.closeExpectNoException(changeTypeBlock, changePvalueBlock);
+                }
+            }
+
+            inputPages.removeFirst();
+            outputPages.add(outputPage);
+            pageStartIndex += inputPage.getPositionCount();
+        }
+
+        if (changeType instanceof ChangeType.Indeterminable indeterminable) {
+            warnings(false).registerException(new IllegalArgumentException(indeterminable.getReason()));
+        }
+        if (tooManyValues) {
+            warnings(true).registerException(
+                new IllegalArgumentException("too many values; keeping only first " + INPUT_VALUE_COUNT_LIMIT + " values")
+            );
+        }
+        if (hasNulls) {
+            warnings(true).registerException(new IllegalArgumentException("values contain nulls; skipping them"));
+        }
+        if (hasMultivalued) {
+            warnings(true).registerException(
+                new IllegalArgumentException(
+                    "values contains multivalued entries; skipping them (please consider reducing them with e.g. MV_AVG or MV_SUM)"
+                )
+            );
+        }
+    }
+
+    @Override
+    public void close() {
+        for (Page page : inputPages) {
+            page.releaseBlocks();
+        }
+        for (Page page : outputPages) {
+            page.releaseBlocks();
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "ChangePointOperator[channel=" + channel + "]";
+    }
+
+    private Warnings warnings(boolean onlyWarnings) {
+        if (warnings == null) {
+            if (onlyWarnings) {
+                this.warnings = Warnings.createOnlyWarnings(driverContext.warningsMode(), sourceLine, sourceColumn, sourceText);
+            } else {
+                this.warnings = Warnings.createWarnings(driverContext.warningsMode(), sourceLine, sourceColumn, sourceText);
+            }
+        }
+        return warnings;
+    }
+}

+ 23 - 10
x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/Warnings.java

@@ -31,8 +31,9 @@ public class Warnings {
      * @param sourceText The source text that caused the warning. Same as `source.text()`
      * @return A warnings collector object
      */
+    // TODO: rename to createWarningsTreatedAsNull
     public static Warnings createWarnings(DriverContext.WarningsMode warningsMode, int lineNumber, int columnNumber, String sourceText) {
-        return createWarnings(warningsMode, lineNumber, columnNumber, sourceText, "treating result as null");
+        return createWarnings(warningsMode, lineNumber, columnNumber, sourceText, "evaluation of [{}] failed, treating result as null");
     }
 
     /**
@@ -50,7 +51,26 @@ public class Warnings {
         int columnNumber,
         String sourceText
     ) {
-        return createWarnings(warningsMode, lineNumber, columnNumber, sourceText, "treating result as false");
+        return createWarnings(warningsMode, lineNumber, columnNumber, sourceText, "evaluation of [{}] failed, treating result as false");
+    }
+
+    /**
+     * Create a new warnings object based on the given mode which warns that
+     * evaluation resulted in warnings.
+     * @param warningsMode The warnings collection strategy to use
+     * @param lineNumber The line number of the source text. Same as `source.getLineNumber()`
+     * @param columnNumber The column number of the source text. Same as `source.getColumnNumber()`
+     * @param sourceText The source text that caused the warning. Same as `source.text()`
+     * @return A warnings collector object
+     */
+    // TODO: rename to createWarnings
+    public static Warnings createOnlyWarnings(
+        DriverContext.WarningsMode warningsMode,
+        int lineNumber,
+        int columnNumber,
+        String sourceText
+    ) {
+        return createWarnings(warningsMode, lineNumber, columnNumber, sourceText, "warnings during evaluation of [{}]");
     }
 
     private static Warnings createWarnings(
@@ -78,14 +98,7 @@ public class Warnings {
 
     private Warnings(int lineNumber, int columnNumber, String sourceText, String first) {
         this.location = format("Line {}:{}: ", lineNumber, columnNumber);
-        this.first = format(
-            null,
-            "{}evaluation of [{}] failed, {}. Only first {} failures recorded.",
-            location,
-            sourceText,
-            first,
-            MAX_ADDED_WARNINGS
-        );
+        this.first = format(null, "{}" + first + ". Only first {} failures recorded.", location, sourceText, MAX_ADDED_WARNINGS);
     }
 
     public void registerException(Exception exception) {

+ 86 - 0
x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/operator/ChangePointOperatorTests.java

@@ -0,0 +1,86 @@
+/*
+ * 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.
+ */
+
+package org.elasticsearch.compute.operator;
+
+import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.compute.data.BlockFactory;
+import org.elasticsearch.compute.data.BytesRefBlock;
+import org.elasticsearch.compute.data.DoubleBlock;
+import org.elasticsearch.compute.data.LongBlock;
+import org.elasticsearch.compute.data.Page;
+import org.elasticsearch.compute.test.OperatorTestCase;
+import org.elasticsearch.compute.test.SequenceLongBlockSourceOperator;
+import org.hamcrest.Matcher;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.hasSize;
+
+public class ChangePointOperatorTests extends OperatorTestCase {
+
+    @Override
+    protected SourceOperator simpleInput(BlockFactory blockFactory, int size) {
+        // size must be in [25, 1000] for ChangePoint to function correctly
+        // and detect the step change.
+        size = Math.min(Math.max(size, 25), 1000);
+        List<Long> data = new ArrayList<>(size);
+        for (int i = 0; i < size; i++) {
+            if (i <= size / 2) {
+                data.add(0L);
+            } else {
+                data.add(1L);
+            }
+        }
+        return new SequenceLongBlockSourceOperator(blockFactory, data);
+    }
+
+    @Override
+    protected void assertSimpleOutput(List<Page> input, List<Page> results) {
+        boolean seenOne = false;
+        assertThat(results, hasSize(input.size()));
+        for (int i = 0; i < results.size(); i++) {
+            Page inputPage = input.get(i);
+            Page resultPage = results.get(i);
+            assertThat(resultPage.getPositionCount(), equalTo(inputPage.getPositionCount()));
+            assertThat(resultPage.getBlockCount(), equalTo(3));
+            for (int j = 0; j < resultPage.getPositionCount(); j++) {
+                long inputValue = ((LongBlock) resultPage.getBlock(0)).getLong(j);
+                long resultValue = ((LongBlock) resultPage.getBlock(0)).getLong(j);
+                assertThat(resultValue, equalTo(inputValue));
+                if (seenOne == false && resultValue == 1L) {
+                    BytesRef type = ((BytesRefBlock) resultPage.getBlock(1)).getBytesRef(j, new BytesRef());
+                    double pvalue = ((DoubleBlock) resultPage.getBlock(2)).getDouble(j);
+                    assertThat(type.utf8ToString(), equalTo("step_change"));
+                    assertThat(pvalue, equalTo(0.0));
+                    seenOne = true;
+                } else {
+                    assertThat(resultPage.getBlock(1).isNull(j), equalTo(true));
+                    assertThat(resultPage.getBlock(2).isNull(j), equalTo(true));
+                }
+            }
+        }
+        assertThat(seenOne, equalTo(true));
+    }
+
+    @Override
+    protected Operator.OperatorFactory simple() {
+        return new ChangePointOperator.Factory(0, null, 0, 0);
+    }
+
+    @Override
+    protected Matcher<String> expectedDescriptionOfSimple() {
+        return equalTo("ChangePointOperator[channel=0]");
+    }
+
+    @Override
+    protected Matcher<String> expectedToStringOfSimple() {
+        return equalTo("ChangePointOperator[channel=0]");
+    }
+}

+ 0 - 1
x-pack/plugin/esql/compute/test/src/main/java/org/elasticsearch/compute/test/OperatorTestCase.java

@@ -46,7 +46,6 @@ import java.util.stream.LongStream;
 
 import static org.hamcrest.Matchers.empty;
 import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.in;
 
 /**
  * Base tests for {@link Operator}s that are not {@link SourceOperator} or {@link SinkOperator}.

+ 1219 - 0
x-pack/plugin/esql/qa/testFixtures/src/main/resources/change_point.csv-spec

@@ -0,0 +1,1219 @@
+detect nothing (long)
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | CHANGE_POINT count ON @timestamp AS type, pvalue
+;
+
+count:long | @timestamp:datetime      | type:keyword | pvalue:double
+4          | 2024-05-10T00:00:00.000Z | null         | null
+4          | 2024-05-10T00:01:00.000Z | null         | null
+8          | 2024-05-10T00:02:00.000Z | null         | null
+8          | 2024-05-10T00:03:00.000Z | null         | null
+5          | 2024-05-10T00:04:00.000Z | null         | null
+8          | 2024-05-10T00:05:00.000Z | null         | null
+10         | 2024-05-10T00:06:00.000Z | null         | null
+5          | 2024-05-10T00:07:00.000Z | null         | null
+12         | 2024-05-10T00:08:00.000Z | null         | null
+20         | 2024-05-10T00:09:00.000Z | null         | null
+5          | 2024-05-10T00:10:00.000Z | null         | null
+7          | 2024-05-10T00:11:00.000Z | null         | null
+8          | 2024-05-10T00:12:00.000Z | null         | null
+9          | 2024-05-10T00:13:00.000Z | null         | null
+9          | 2024-05-10T00:14:00.000Z | null         | null
+11         | 2024-05-10T00:15:00.000Z | null         | null
+7          | 2024-05-10T00:16:00.000Z | null         | null
+15         | 2024-05-10T00:17:00.000Z | null         | null
+17         | 2024-05-10T00:18:00.000Z | null         | null
+5          | 2024-05-10T00:19:00.000Z | null         | null
+10         | 2024-05-10T00:20:00.000Z | null         | null
+4          | 2024-05-10T00:21:00.000Z | null         | null
+9          | 2024-05-10T00:22:00.000Z | null         | null
+;
+
+
+detect spike (long; default output columns)
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL count=count+CASE(@timestamp=="2024-05-10T00:08:00.000Z", 100, 0)
+  | CHANGE_POINT count ON @timestamp
+;
+
+@timestamp:datetime      | count:long | type:keyword | pvalue:double
+2024-05-10T00:00:00.000Z | 4          | null         | null
+2024-05-10T00:01:00.000Z | 4          | null         | null
+2024-05-10T00:02:00.000Z | 8          | null         | null
+2024-05-10T00:03:00.000Z | 8          | null         | null
+2024-05-10T00:04:00.000Z | 5          | null         | null
+2024-05-10T00:05:00.000Z | 8          | null         | null
+2024-05-10T00:06:00.000Z | 10         | null         | null
+2024-05-10T00:07:00.000Z | 5          | null         | null
+2024-05-10T00:08:00.000Z | 112        | spike        | 1.7502597878858522E-193
+2024-05-10T00:09:00.000Z | 20         | null         | null
+2024-05-10T00:10:00.000Z | 5          | null         | null
+2024-05-10T00:11:00.000Z | 7          | null         | null
+2024-05-10T00:12:00.000Z | 8          | null         | null
+2024-05-10T00:13:00.000Z | 9          | null         | null
+2024-05-10T00:14:00.000Z | 9          | null         | null
+2024-05-10T00:15:00.000Z | 11         | null         | null
+2024-05-10T00:16:00.000Z | 7          | null         | null
+2024-05-10T00:17:00.000Z | 15         | null         | null
+2024-05-10T00:18:00.000Z | 17         | null         | null
+2024-05-10T00:19:00.000Z | 5          | null         | null
+2024-05-10T00:20:00.000Z | 10         | null         | null
+2024-05-10T00:21:00.000Z | 4          | null         | null
+2024-05-10T00:22:00.000Z | 9          | null         | null
+;
+
+
+detect step change (long; default timestamp)
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL count=count+CASE(@timestamp>="2024-05-10T00:11:00.000Z", 100, 0)
+  | CHANGE_POINT count AS type, pvalue
+;
+
+@timestamp:datetime      | count:long | type:keyword | pvalue:double
+2024-05-10T00:00:00.000Z | 4          | null         | null
+2024-05-10T00:01:00.000Z | 4          | null         | null
+2024-05-10T00:02:00.000Z | 8          | null         | null
+2024-05-10T00:03:00.000Z | 8          | null         | null
+2024-05-10T00:04:00.000Z | 5          | null         | null
+2024-05-10T00:05:00.000Z | 8          | null         | null
+2024-05-10T00:06:00.000Z | 10         | null         | null
+2024-05-10T00:07:00.000Z | 5          | null         | null
+2024-05-10T00:08:00.000Z | 12         | null         | null
+2024-05-10T00:09:00.000Z | 20         | null         | null
+2024-05-10T00:10:00.000Z | 5          | null         | null
+2024-05-10T00:11:00.000Z | 107        | step_change  | 3.0924162021968114E-23
+2024-05-10T00:12:00.000Z | 108        | null         | null
+2024-05-10T00:13:00.000Z | 109        | null         | null
+2024-05-10T00:14:00.000Z | 109        | null         | null
+2024-05-10T00:15:00.000Z | 111        | null         | null
+2024-05-10T00:16:00.000Z | 107        | null         | null
+2024-05-10T00:17:00.000Z | 115        | null         | null
+2024-05-10T00:18:00.000Z | 117        | null         | null
+2024-05-10T00:19:00.000Z | 105        | null         | null
+2024-05-10T00:20:00.000Z | 110        | null         | null
+2024-05-10T00:21:00.000Z | 104        | null         | null
+2024-05-10T00:22:00.000Z | 109        | null         | null
+;
+
+
+detect dip (double)
+required_capability: change_point
+
+FROM employees
+  | STATS salary=AVG(salary) BY height
+  | EVAL salary=CASE(height==2.1, 0.0, salary)
+  | CHANGE_POINT salary ON height AS type, pvalue
+;
+
+height:double | salary:double      | type:keyword | pvalue:double       
+1.41          | 40031.0            | null         | null                
+1.42          | 34142.5            | null         | null                
+1.44          | 40266.0            | null         | null                
+1.45          | 49095.0            | null         | null                
+1.46          | 39878.0            | null         | null                
+1.47          | 60408.0            | null         | null                
+1.48          | 44307.0            | null         | null                
+1.5           | 31120.0            | null         | null                
+1.51          | 28035.0            | null         | null                
+1.52          | 41243.5            | null         | null                
+1.53          | 60079.333333333336 | null         | null                
+1.54          | 61358.0            | null         | null                
+1.55          | 36876.5            | null         | null                
+1.56          | 60335.0            | null         | null                
+1.57          | 38486.0            | null         | null                
+1.58          | 41701.5            | null         | null                
+1.59          | 36575.666666666664 | null         | null                
+1.61          | 55299.5            | null         | null                
+1.63          | 70011.0            | null         | null                
+1.64          | 38992.0            | null         | null                
+1.66          | 28946.0            | null         | null                
+1.68          | 42155.5            | null         | null                
+1.69          | 45656.0            | null         | null                
+1.7           | 65092.25           | null         | null                
+1.74          | 53178.0            | null         | null                
+1.75          | 43429.0            | null         | null                
+1.77          | 54184.25           | null         | null                
+1.78          | 44147.5            | null         | null                
+1.79          | 55360.0            | null         | null                
+1.8           | 52833.0            | null         | null                
+1.81          | 56475.666666666664 | null         | null                
+1.82          | 56039.333333333336 | null         | null                
+1.83          | 54195.333333333336 | null         | null                
+1.85          | 66174.0            | null         | null                
+1.87          | 47411.0            | null         | null                
+1.89          | 58121.0            | null         | null                
+1.9           | 37112.0            | null         | null                
+1.91          | 39638.0            | null         | null                
+1.92          | 67492.0            | null         | null                
+1.93          | 33956.0            | null         | null                
+1.94          | 48193.333333333336 | null         | null                
+1.96          | 43026.0            | null         | null                
+1.97          | 52851.0            | null         | null                
+1.99          | 56068.0            | null         | null                
+2.0           | 36314.666666666664 | null         | null                
+2.01          | 35742.0            | null         | null                
+2.03          | 51130.5            | null         | null                
+2.04          | 49281.0            | null         | null                
+2.05          | 63528.0            | null         | null                
+2.06          | 56722.5            | null         | null                
+2.07          | 39984.0            | null         | null                
+2.08          | 60523.0            | null         | null                
+2.09          | 38645.0            | null         | null                
+2.1           | 0.0                | dip          | 9.590143836835097E-6  
+;
+
+
+no stats command
+required_capability: change_point
+
+FROM employees
+  | KEEP emp_no, salary
+  | CHANGE_POINT salary ON emp_no AS type, pvalue
+;
+
+emp_no:integer | salary:integer | type:keyword | pvalue:double
+10001          | 57305          | null         | null         
+10002          | 56371          | null         | null         
+10003          | 61805          | null         | null         
+10004          | 36174          | null         | null         
+10005          | 63528          | null         | null         
+10006          | 60335          | null         | null         
+10007          | 74572          | null         | null         
+10008          | 43906          | null         | null         
+10009          | 66174          | null         | null         
+10010          | 45797          | null         | null         
+10011          | 31120          | null         | null         
+10012          | 48942          | null         | null         
+10013          | 48735          | null         | null         
+10014          | 37137          | null         | null         
+10015          | 25324          | null         | null         
+10016          | 61358          | null         | null         
+10017          | 58715          | null         | null         
+10018          | 56760          | null         | null         
+10019          | 73717          | null         | null         
+10020          | 40031          | null         | null         
+10021          | 60408          | null         | null         
+10022          | 48233          | null         | null         
+10023          | 47896          | null         | null         
+10024          | 64675          | null         | null         
+10025          | 47411          | null         | null         
+10026          | 28336          | null         | null         
+10027          | 73851          | null         | null         
+10028          | 39356          | null         | null         
+10029          | 74999          | null         | null         
+10030          | 67492          | null         | null         
+10031          | 37716          | null         | null         
+10032          | 62233          | null         | null         
+10033          | 70011          | null         | null         
+10034          | 39878          | null         | null         
+10035          | 25945          | null         | null         
+10036          | 60781          | null         | null         
+10037          | 37691          | null         | null         
+10038          | 35222          | null         | null         
+10039          | 36051          | null         | null         
+10040          | 37112          | null         | null         
+10041          | 56415          | null         | null         
+10042          | 30404          | null         | null         
+10043          | 34341          | null         | null         
+10044          | 39728          | null         | null         
+10045          | 74970          | null         | null         
+10046          | 50064          | null         | null         
+10047          | 42716          | null         | null         
+10048          | 26436          | null         | null         
+10049          | 37853          | null         | null         
+10050          | 43026          | null         | null         
+10051          | 58121          | null         | null         
+10052          | 55360          | null         | null         
+10053          | 54462          | null         | null         
+10054          | 65367          | null         | null         
+10055          | 49281          | null         | null         
+10056          | 33370          | null         | null         
+10057          | 27215          | null         | null         
+10058          | 38376          | null         | null         
+10059          | 44307          | null         | null         
+10060          | 29175          | null         | null         
+10061          | 49095          | null         | null         
+10062          | 65030          | null         | null         
+10063          | 52121          | null         | null         
+10064          | 33956          | null         | null         
+10065          | 50249          | null         | null         
+10066          | 31897          | null         | null         
+10067          | 52044          | null         | null         
+10068          | 28941          | null         | null         
+10069          | 41933          | null         | null         
+10070          | 54329          | null         | null         
+10071          | 40612          | null         | null         
+10072          | 54518          | null         | null         
+10073          | 32568          | null         | null         
+10074          | 38992          | null         | null         
+10075          | 51956          | null         | null         
+10076          | 62405          | null         | null         
+10077          | 46595          | null         | null         
+10078          | 69904          | null         | null         
+10079          | 32263          | null         | null         
+10080          | 52833          | null         | null         
+10081          | 50128          | null         | null         
+10082          | 49818          | null         | null         
+10083          | 39110          | null         | null         
+10084          | 28035          | null         | null         
+10085          | 35742          | null         | null         
+10086          | 68547          | null         | null         
+10087          | 32272          | null         | null         
+10088          | 39638          | null         | null         
+10089          | 43602          | null         | null         
+10090          | 44956          | null         | null         
+10091          | 38645          | null         | null         
+10092          | 25976          | null         | null         
+10093          | 45656          | null         | null         
+10094          | 66817          | null         | null         
+10095          | 37702          | null         | null         
+10096          | 43889          | null         | null         
+10097          | 71165          | null         | null         
+10098          | 44817          | null         | null         
+10099          | 73578          | null         | null         
+10100          | 68431          | null         | null
+;
+
+
+where before change point
+required_capability: change_point
+
+FROM employees
+  | KEEP emp_no, salary
+  | EVAL salary = CASE(emp_no==10022, 100000, salary)
+  | EVAL salary = CASE(emp_no==10033, 1000000, salary)
+  | WHERE emp_no < 10025
+  | CHANGE_POINT salary ON emp_no AS type, pvalue
+;
+
+emp_no:integer | salary:integer | type:keyword | pvalue:double
+10001          | 57305          | null         | null                 
+10002          | 56371          | null         | null                 
+10003          | 61805          | null         | null                 
+10004          | 36174          | null         | null                 
+10005          | 63528          | null         | null                 
+10006          | 60335          | null         | null                 
+10007          | 74572          | null         | null                 
+10008          | 43906          | null         | null                 
+10009          | 66174          | null         | null                 
+10010          | 45797          | null         | null                 
+10011          | 31120          | null         | null                 
+10012          | 48942          | null         | null                 
+10013          | 48735          | null         | null                 
+10014          | 37137          | null         | null                 
+10015          | 25324          | null         | null                 
+10016          | 61358          | null         | null                 
+10017          | 58715          | null         | null                 
+10018          | 56760          | null         | null                 
+10019          | 73717          | null         | null                 
+10020          | 40031          | null         | null                 
+10021          | 60408          | null         | null                 
+10022          | 100000         | spike        | 0.0019710754505321004
+10023          | 47896          | null         | null                 
+10024          | 64675          | null         | null        
+;
+
+
+where after change point
+required_capability: change_point
+
+FROM employees
+  | KEEP emp_no, salary
+  | EVAL salary = CASE(emp_no==10022, 100000, salary)
+  | EVAL salary = CASE(emp_no==10033, 1000000, salary)
+  | CHANGE_POINT salary ON emp_no AS type, pvalue
+  | WHERE emp_no < 10025
+;
+
+emp_no:integer | salary:integer | type:keyword | pvalue:double
+10001          | 57305          | null         | null                 
+10002          | 56371          | null         | null                 
+10003          | 61805          | null         | null                 
+10004          | 36174          | null         | null                 
+10005          | 63528          | null         | null                 
+10006          | 60335          | null         | null                 
+10007          | 74572          | null         | null                 
+10008          | 43906          | null         | null                 
+10009          | 66174          | null         | null                 
+10010          | 45797          | null         | null                 
+10011          | 31120          | null         | null                 
+10012          | 48942          | null         | null                 
+10013          | 48735          | null         | null                 
+10014          | 37137          | null         | null                 
+10015          | 25324          | null         | null                 
+10016          | 61358          | null         | null                 
+10017          | 58715          | null         | null                 
+10018          | 56760          | null         | null                 
+10019          | 73717          | null         | null                 
+10020          | 40031          | null         | null                 
+10021          | 60408          | null         | null                 
+10022          | 100000         | null         | null
+10023          | 47896          | null         | null                 
+10024          | 64675          | null         | null        
+;
+
+
+where with shadowing
+required_capability: change_point
+
+FROM employees
+  | KEEP emp_no, salary
+  | EVAL salary=CASE(emp_no==10015, -1000000, salary)
+  | WHERE emp_no < 10025
+  | CHANGE_POINT salary ON emp_no AS type, emp_no
+  | WHERE emp_no IS NOT NULL
+  | RENAME emp_no AS pvalue
+;
+
+salary:integer | type:keyword | pvalue:double
+-1000000       | dip          | 0.0          
+;
+
+
+stats after change point
+required_capability: change_point
+
+FROM employees
+  | KEEP emp_no, salary
+  | EVAL salary=CASE(emp_no==10042, 1000000, salary)
+  | CHANGE_POINT salary ON emp_no
+  | STATS COUNT() by type
+  | SORT type
+;
+
+COUNT():long | type:keyword
+1            | spike
+99           | null
+;
+
+
+sort/limit before change point
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | SORT count, @timestamp
+  | LIMIT 22
+  | CHANGE_POINT count AS type, pvalue
+;
+
+count:long | @timestamp:datetime      | type:keyword | pvalue:double
+4          | 2024-05-10T00:00:00.000Z | null         | null         
+4          | 2024-05-10T00:01:00.000Z | null         | null         
+8          | 2024-05-10T00:02:00.000Z | null         | null         
+8          | 2024-05-10T00:03:00.000Z | null         | null         
+5          | 2024-05-10T00:04:00.000Z | null         | null         
+8          | 2024-05-10T00:05:00.000Z | null         | null         
+10         | 2024-05-10T00:06:00.000Z | null         | null         
+5          | 2024-05-10T00:07:00.000Z | null         | null         
+12         | 2024-05-10T00:08:00.000Z | null         | null         
+5          | 2024-05-10T00:10:00.000Z | null         | null         
+7          | 2024-05-10T00:11:00.000Z | null         | null         
+8          | 2024-05-10T00:12:00.000Z | null         | null         
+9          | 2024-05-10T00:13:00.000Z | null         | null         
+9          | 2024-05-10T00:14:00.000Z | null         | null         
+11         | 2024-05-10T00:15:00.000Z | null         | null         
+7          | 2024-05-10T00:16:00.000Z | null         | null         
+15         | 2024-05-10T00:17:00.000Z | null         | null         
+17         | 2024-05-10T00:18:00.000Z | null         | null         
+5          | 2024-05-10T00:19:00.000Z | null         | null         
+10         | 2024-05-10T00:20:00.000Z | null         | null         
+4          | 2024-05-10T00:21:00.000Z | null         | null         
+9          | 2024-05-10T00:22:00.000Z | null         | null   
+;
+
+
+sort after change point
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL count=count+CASE(@timestamp>="2024-05-10T00:11:00.000Z", 100, 0)
+  | CHANGE_POINT count AS type, pvalue
+  | SORT type, count, @timestamp
+;
+
+@timestamp:datetime      | count:long | type:keyword | pvalue:double
+2024-05-10T00:11:00.000Z | 107        | step_change  | 3.0924162021968114E-23
+2024-05-10T00:00:00.000Z | 4          | null         | null                  
+2024-05-10T00:01:00.000Z | 4          | null         | null                  
+2024-05-10T00:04:00.000Z | 5          | null         | null                  
+2024-05-10T00:07:00.000Z | 5          | null         | null                  
+2024-05-10T00:10:00.000Z | 5          | null         | null                  
+2024-05-10T00:02:00.000Z | 8          | null         | null                  
+2024-05-10T00:03:00.000Z | 8          | null         | null                  
+2024-05-10T00:05:00.000Z | 8          | null         | null                  
+2024-05-10T00:06:00.000Z | 10         | null         | null                  
+2024-05-10T00:08:00.000Z | 12         | null         | null                  
+2024-05-10T00:09:00.000Z | 20         | null         | null                  
+2024-05-10T00:21:00.000Z | 104        | null         | null                  
+2024-05-10T00:19:00.000Z | 105        | null         | null                  
+2024-05-10T00:16:00.000Z | 107        | null         | null                  
+2024-05-10T00:12:00.000Z | 108        | null         | null                  
+2024-05-10T00:13:00.000Z | 109        | null         | null                  
+2024-05-10T00:14:00.000Z | 109        | null         | null                  
+2024-05-10T00:22:00.000Z | 109        | null         | null                  
+2024-05-10T00:20:00.000Z | 110        | null         | null                  
+2024-05-10T00:15:00.000Z | 111        | null         | null                  
+2024-05-10T00:17:00.000Z | 115        | null         | null                  
+2024-05-10T00:18:00.000Z | 117        | null         | null                  
+;
+
+
+reuse input column names
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL count=count+CASE(@timestamp=="2024-05-10T00:08:00.000Z", 100, 0)
+  | CHANGE_POINT count ON @timestamp AS @timestamp, count
+;
+
+@timestamp:keyword | count:double
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+spike              | 1.7502597878858522E-193
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+;
+
+
+reuse value column name twice
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL count=count+CASE(@timestamp=="2024-05-10T00:08:00.000Z", 100, 0)
+  | CHANGE_POINT count ON @timestamp AS count, count
+;
+
+@timestamp:datetime      | count:double           
+2024-05-10T00:00:00.000Z | null                   
+2024-05-10T00:01:00.000Z | null                   
+2024-05-10T00:02:00.000Z | null                   
+2024-05-10T00:03:00.000Z | null                   
+2024-05-10T00:04:00.000Z | null                   
+2024-05-10T00:05:00.000Z | null                   
+2024-05-10T00:06:00.000Z | null                   
+2024-05-10T00:07:00.000Z | null                   
+2024-05-10T00:08:00.000Z | 1.7502597878858522E-193
+2024-05-10T00:09:00.000Z | null                   
+2024-05-10T00:10:00.000Z | null                   
+2024-05-10T00:11:00.000Z | null                   
+2024-05-10T00:12:00.000Z | null                   
+2024-05-10T00:13:00.000Z | null                   
+2024-05-10T00:14:00.000Z | null                   
+2024-05-10T00:15:00.000Z | null                   
+2024-05-10T00:16:00.000Z | null                   
+2024-05-10T00:17:00.000Z | null                   
+2024-05-10T00:18:00.000Z | null                   
+2024-05-10T00:19:00.000Z | null                   
+2024-05-10T00:20:00.000Z | null                   
+2024-05-10T00:21:00.000Z | null                   
+2024-05-10T00:22:00.000Z | null                   
+;
+
+
+same key and value column
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY BUCKET(@timestamp, 1 MINUTE)
+  | KEEP count
+  | CHANGE_POINT count ON count AS type, pvalue
+;
+
+count:long | type:keyword | pvalue:double
+4          | null         | null                 
+4          | null         | null                 
+4          | null         | null                 
+5          | null         | null                 
+5          | null         | null                 
+5          | null         | null                 
+5          | null         | null                 
+7          | null         | null                 
+7          | null         | null                 
+8          | null         | null                 
+8          | null         | null                 
+8          | null         | null                 
+8          | trend_change | 3.793633808495355E-12
+9          | null         | null                 
+9          | null         | null                 
+9          | null         | null                 
+10         | null         | null                 
+10         | null         | null                 
+11         | null         | null                 
+12         | null         | null                 
+15         | null         | null                 
+17         | null         | null                 
+20         | null         | null 
+;
+
+
+all four columns the same
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY BUCKET(@timestamp, 1 MINUTE)
+  | KEEP count
+  | CHANGE_POINT count ON count AS count, count
+;
+
+count:double
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+3.793633808495355E-12
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null 
+;
+
+
+rename columns
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL count=count+CASE(@timestamp=="2024-05-10T00:08:00.000Z", 100, 0)
+  | RENAME count AS count2, @timestamp AS time2
+  | CHANGE_POINT count2 ON time2 AS type, pvalue
+  | RENAME time2 AS time, count2 AS cnt, type AS kind, pvalue AS significance
+;
+
+time:datetime            | cnt:long | kind:keyword | significance:double    
+2024-05-10T00:00:00.000Z | 4        | null         | null                   
+2024-05-10T00:01:00.000Z | 4        | null         | null                   
+2024-05-10T00:02:00.000Z | 8        | null         | null                   
+2024-05-10T00:03:00.000Z | 8        | null         | null                   
+2024-05-10T00:04:00.000Z | 5        | null         | null                   
+2024-05-10T00:05:00.000Z | 8        | null         | null                   
+2024-05-10T00:06:00.000Z | 10       | null         | null                   
+2024-05-10T00:07:00.000Z | 5        | null         | null                   
+2024-05-10T00:08:00.000Z | 112      | spike        | 1.7502597878858522E-193
+2024-05-10T00:09:00.000Z | 20       | null         | null                   
+2024-05-10T00:10:00.000Z | 5        | null         | null                   
+2024-05-10T00:11:00.000Z | 7        | null         | null                   
+2024-05-10T00:12:00.000Z | 8        | null         | null                   
+2024-05-10T00:13:00.000Z | 9        | null         | null                   
+2024-05-10T00:14:00.000Z | 9        | null         | null                   
+2024-05-10T00:15:00.000Z | 11       | null         | null                   
+2024-05-10T00:16:00.000Z | 7        | null         | null                   
+2024-05-10T00:17:00.000Z | 15       | null         | null                   
+2024-05-10T00:18:00.000Z | 17       | null         | null                   
+2024-05-10T00:19:00.000Z | 5        | null         | null                   
+2024-05-10T00:20:00.000Z | 10       | null         | null                   
+2024-05-10T00:21:00.000Z | 4        | null         | null                   
+2024-05-10T00:22:00.000Z | 9        | null         | null                   
+;
+
+
+null keys
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL @timestamp=CASE(@timestamp=="2024-05-10T00:04:00.000Z", NULL, @timestamp)
+  | EVAL @timestamp=CASE(@timestamp=="2024-05-10T00:08:00.000Z", NULL, @timestamp)
+  | EVAL count=count+CASE(@timestamp<="2024-05-10T00:11:00.000Z", 100, 0)
+  | CHANGE_POINT count ON @timestamp AS type, pvalue
+  | SORT @timestamp, count
+;
+
+@timestamp:datetime      | count:long | type:keyword | pvalue:double        
+2024-05-10T00:00:00.000Z | 104        | null         | null                 
+2024-05-10T00:01:00.000Z | 104        | null         | null                 
+2024-05-10T00:02:00.000Z | 108        | null         | null                 
+2024-05-10T00:03:00.000Z | 108        | null         | null                 
+2024-05-10T00:05:00.000Z | 108        | null         | null                 
+2024-05-10T00:06:00.000Z | 110        | null         | null                 
+2024-05-10T00:07:00.000Z | 105        | null         | null                 
+2024-05-10T00:09:00.000Z | 120        | null         | null                 
+2024-05-10T00:10:00.000Z | 105        | null         | null                 
+2024-05-10T00:11:00.000Z | 107        | null         | null                 
+2024-05-10T00:12:00.000Z | 8          | step_change  | 9.678892139828202E-24
+2024-05-10T00:13:00.000Z | 9          | null         | null                 
+2024-05-10T00:14:00.000Z | 9          | null         | null                 
+2024-05-10T00:15:00.000Z | 11         | null         | null                 
+2024-05-10T00:16:00.000Z | 7          | null         | null                 
+2024-05-10T00:17:00.000Z | 15         | null         | null                 
+2024-05-10T00:18:00.000Z | 17         | null         | null                 
+2024-05-10T00:19:00.000Z | 5          | null         | null                 
+2024-05-10T00:20:00.000Z | 10         | null         | null                 
+2024-05-10T00:21:00.000Z | 4          | null         | null                 
+2024-05-10T00:22:00.000Z | 9          | null         | null                 
+null                     | 5          | null         | null  
+null                     | 12         | null         | null                 
+;
+
+null values
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL count=count+CASE(@timestamp>="2024-05-10T00:11:00.000Z", 100, 0)
+  | EVAL count=CASE(@timestamp=="2024-05-10T00:04:00.000Z", NULL, count)
+  | CHANGE_POINT count ON @timestamp AS type, pvalue
+;
+
+warning:Line 5:3: warnings during evaluation of [CHANGE_POINT count ON @timestamp AS type, pvalue]. Only first 20 failures recorded.
+warning:Line 5:3: java.lang.IllegalArgumentException: values contain nulls; skipping them
+
+@timestamp:datetime      | count:long | type:keyword | pvalue:double
+2024-05-10T00:00:00.000Z | 4          | null         | null
+2024-05-10T00:01:00.000Z | 4          | null         | null
+2024-05-10T00:02:00.000Z | 8          | null         | null
+2024-05-10T00:03:00.000Z | 8          | null         | null
+2024-05-10T00:04:00.000Z | null       | null         | null
+2024-05-10T00:05:00.000Z | 8          | null         | null
+2024-05-10T00:06:00.000Z | 10         | null         | null
+2024-05-10T00:07:00.000Z | 5          | null         | null
+2024-05-10T00:08:00.000Z | 12         | null         | null
+2024-05-10T00:09:00.000Z | 20         | null         | null
+2024-05-10T00:10:00.000Z | 5          | null         | null
+2024-05-10T00:11:00.000Z | 107        | step_change  | 3.438939970021414E-22
+2024-05-10T00:12:00.000Z | 108        | null         | null
+2024-05-10T00:13:00.000Z | 109        | null         | null
+2024-05-10T00:14:00.000Z | 109        | null         | null
+2024-05-10T00:15:00.000Z | 111        | null         | null
+2024-05-10T00:16:00.000Z | 107        | null         | null
+2024-05-10T00:17:00.000Z | 115        | null         | null
+2024-05-10T00:18:00.000Z | 117        | null         | null
+2024-05-10T00:19:00.000Z | 105        | null         | null
+2024-05-10T00:20:00.000Z | 110        | null         | null
+2024-05-10T00:21:00.000Z | 104        | null         | null
+2024-05-10T00:22:00.000Z | 109        | null         | null
+;
+
+
+multivalued
+required_capability: change_point
+
+FROM employees
+  | STATS salary=MV_SORT(VALUES(salary)) BY height
+  | EVAL salary = CASE(height == 1.5, [1, 22222, 33333], salary)
+  | EVAL salary = CASE(height == 1.63, [43210, -10000, 999999999], salary)
+  | EVAL salary = CASE(height == 1.8, 999999999, salary)
+  | CHANGE_POINT salary ON height
+;
+
+warning:Line 6:3: warnings during evaluation of [CHANGE_POINT salary ON height]. Only first 20 failures recorded.
+warning:Line 6:3: java.lang.IllegalArgumentException: values contains multivalued entries; skipping them (please consider reducing them with e.g. MV_AVG or MV_SUM)
+
+height:double | salary:integer                      | type:keyword | pvalue:double       
+1.41          | 40031                               | null         | null                
+1.42          | [29175, 39110]                      | null         | null                
+1.44          | [30404, 50128]                      | null         | null                
+1.45          | 49095                               | null         | null                
+1.46          | 39878                               | null         | null                
+1.47          | 60408                               | null         | null                
+1.48          | 44307                               | null         | null                
+1.5           | [1, 22222, 33333]                   | null         | null
+1.51          | 28035                               | null         | null                
+1.52          | [34341, 37853, 42716, 50064]        | null         | null                
+1.53          | [35222, 71165, 73851]               | null         | null                
+1.54          | 61358                               | null         | null                
+1.55          | [36051, 37702]                      | null         | null                
+1.56          | 60335                               | null         | null                
+1.57          | [33370, 43602]                      | null         | null                
+1.58          | [28941, 54462]                      | null         | null                
+1.59          | [27215, 32263, 50249]               | null         | null                
+1.61          | [49818, 60781]                      | null         | null                
+1.63          | [43210, -10000, 999999999]          | null         | null                
+1.64          | 38992                               | null         | null                
+1.66          | [25324, 32568]                      | null         | null                
+1.68          | [37716, 46595]                      | null         | null                
+1.69          | 45656                               | null         | null                
+1.7           | [45797, 65030, 74572, 74970]        | null         | null                
+1.74          | [32272, 58715, 68547]               | null         | null                
+1.75          | [25976, 47896, 56415]               | null         | null                
+1.77          | [41933, 52044, 54329, 68431]        | null         | null                
+1.78          | [36174, 52121]                      | null         | null                
+1.79          | 55360                               | null         | null                
+1.8           | 999999999                           | spike        | 0.0                
+1.81          | [25945, 69904, 73578]               | null         | null                
+1.82          | [48233, 54518, 65367]               | null         | null                
+1.83          | [38376, 61805, 62405]               | null         | null                
+1.85          | 66174                               | null         | null                
+1.87          | 47411                               | null         | null                
+1.89          | 58121                               | null         | null                
+1.9           | 37112                               | null         | null                
+1.91          | 39638                               | null         | null                
+1.92          | 67492                               | null         | null                
+1.93          | 33956                               | null         | null                
+1.94          | [43889, 48735, 51956]               | null         | null                
+1.96          | 43026                               | null         | null                
+1.97          | [48942, 56760]                      | null         | null                
+1.99          | [37137, 74999]                      | null         | null                
+2.0           | [26436, 37691, 44817]               | null         | null                
+2.01          | 35742                               | null         | null                
+2.03          | [44956, 57305]                      | null         | null                
+2.04          | 49281                               | null         | null                
+2.05          | 63528                               | null         | null                
+2.06          | [39728, 73717]                      | null         | null                
+2.07          | [39356, 40612]                      | null         | null                
+2.08          | [56371, 64675]                      | null         | null                
+2.09          | 38645                               | null         | null                
+2.1           | [28336, 31897, 43906, 62233, 66817] | null         | null                              
+;
+
+
+multivalued with MV_AVG
+required_capability: change_point
+
+FROM employees
+  | STATS salary=MV_SORT(VALUES(salary)) BY height
+  | EVAL salary = CASE(height == 1.5, [1, 22222, 33333], salary)
+  | EVAL salary = CASE(height == 1.63, [43210, -10000, 999999999], salary)
+  | EVAL salary = MV_AVG(salary)
+  | CHANGE_POINT salary ON height
+;
+
+height:double | salary:double      | type:keyword | pvalue:double
+1.41          | 40031.0            | null         | null         
+1.42          | 34142.5            | null         | null         
+1.44          | 40266.0            | null         | null         
+1.45          | 49095.0            | null         | null         
+1.46          | 39878.0            | null         | null         
+1.47          | 60408.0            | null         | null         
+1.48          | 44307.0            | null         | null         
+1.5           | 18518.666666666668 | null         | null         
+1.51          | 28035.0            | null         | null         
+1.52          | 41243.5            | null         | null         
+1.53          | 60079.333333333336 | null         | null         
+1.54          | 61358.0            | null         | null         
+1.55          | 36876.5            | null         | null         
+1.56          | 60335.0            | null         | null         
+1.57          | 38486.0            | null         | null         
+1.58          | 41701.5            | null         | null         
+1.59          | 36575.666666666664 | null         | null         
+1.61          | 55299.5            | null         | null         
+1.63          | 3.33344403E8       | spike        | 0.0          
+1.64          | 38992.0            | null         | null         
+1.66          | 28946.0            | null         | null         
+1.68          | 42155.5            | null         | null         
+1.69          | 45656.0            | null         | null         
+1.7           | 65092.25           | null         | null         
+1.74          | 53178.0            | null         | null         
+1.75          | 43429.0            | null         | null         
+1.77          | 54184.25           | null         | null         
+1.78          | 44147.5            | null         | null         
+1.79          | 55360.0            | null         | null         
+1.8           | 52833.0            | null         | null         
+1.81          | 56475.666666666664 | null         | null         
+1.82          | 56039.333333333336 | null         | null         
+1.83          | 54195.333333333336 | null         | null         
+1.85          | 66174.0            | null         | null         
+1.87          | 47411.0            | null         | null         
+1.89          | 58121.0            | null         | null         
+1.9           | 37112.0            | null         | null         
+1.91          | 39638.0            | null         | null         
+1.92          | 67492.0            | null         | null         
+1.93          | 33956.0            | null         | null         
+1.94          | 48193.333333333336 | null         | null         
+1.96          | 43026.0            | null         | null         
+1.97          | 52851.0            | null         | null         
+1.99          | 56068.0            | null         | null         
+2.0           | 36314.666666666664 | null         | null         
+2.01          | 35742.0            | null         | null         
+2.03          | 51130.5            | null         | null         
+2.04          | 49281.0            | null         | null         
+2.05          | 63528.0            | null         | null         
+2.06          | 56722.5            | null         | null         
+2.07          | 39984.0            | null         | null         
+2.08          | 60523.0            | null         | null         
+2.09          | 38645.0            | null         | null         
+2.1           | 46637.8            | null         | null                            
+;
+
+
+too much data (change point inside limit)
+required_capability: change_point
+
+ROW key1=["A","B","C","D","E","F","G","H","I","J","K","L","M"], 
+    key2=["0","1","2","3","4","5","6","7","8","9"], 
+    key3=["0","1","2","3","4","5","6","7","8","9"]
+  | MV_EXPAND key1
+  | MV_EXPAND key2
+  | MV_EXPAND key3
+  | EVAL key=CONCAT(key1,key2,key3)
+  | EVAL value=CASE(key >= "I42", 1000, 1)
+  | KEEP key, value
+  | CHANGE_POINT value ON key AS type, pvalue
+  | WHERE type IS NOT NULL
+;
+
+warning:Line 10:3: warnings during evaluation of [CHANGE_POINT value ON key AS type, pvalue]. Only first 20 failures recorded.
+warning:Line 10:3: java.lang.IllegalArgumentException: too many values; keeping only first 1000 values
+
+key:keyword | value:integer | type:keyword | pvalue:double
+I42         | 1000          | step_change  | 0.0          
+;
+
+
+too much data (change point outside limit)
+required_capability: change_point
+
+ROW key1=["A","B","C","D","E","F","G","H","I","J","K","L","M"], 
+    key2=["0","1","2","3","4","5","6","7","8","9"], 
+    key3=["0","1","2","3","4","5","6","7","8","9"]
+  | MV_EXPAND key1
+  | MV_EXPAND key2
+  | MV_EXPAND key3
+  | EVAL key=CONCAT(key1,key2,key3)
+  | EVAL value=CASE(key >= "L42", 1000, 1)
+  | KEEP key, value
+  | CHANGE_POINT value ON key AS type, pvalue
+  | WHERE type IS NOT NULL
+;
+
+warning:Line 10:3: warnings during evaluation of [CHANGE_POINT value ON key AS type, pvalue]. Only first 20 failures recorded.
+warning:Line 10:3: java.lang.IllegalArgumentException: too many values; keeping only first 1000 values
+
+key:keyword | value:integer | type:keyword | pvalue:double
+;
+
+
+too much data (assert output size)
+required_capability: change_point
+
+ROW key1=["A","B","C","D","E","F","G","H","I","J","K","L","M"], 
+    key2=["0","1","2","3","4","5","6","7","8","9"], 
+    key3=["0","1","2","3","4","5","6","7","8","9"]
+  | MV_EXPAND key1
+  | MV_EXPAND key2
+  | MV_EXPAND key3
+  | EVAL key=CONCAT(key1,key2,key3)
+  | EVAL value=CASE(key >= "I42", 1000, 1)
+  | KEEP key, value
+  | CHANGE_POINT value ON key AS type, pvalue
+  | STATS count=COUNT()
+;
+
+warning:Line 10:3: warnings during evaluation of [CHANGE_POINT value ON key AS type, pvalue]. Only first 20 failures recorded.
+warning:Line 10:3: java.lang.IllegalArgumentException: too many values; keeping only first 1000 values
+
+count:LONG
+1000      
+;
+
+
+detect trend_change (using row)
+required_capability: change_point
+
+ROW time = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]
+  | MV_EXPAND time
+  | EVAL val = ABS(15-time)
+  | CHANGE_POINT val ON time
+;
+
+time:integer | val:integer | type:keyword | pvalue:double
+1            | 14          | null         | null                   
+2            | 13          | null         | null                   
+3            | 12          | null         | null                   
+4            | 11          | null         | null                   
+5            | 10          | null         | null                   
+6            | 9           | null         | null                   
+7            | 8           | null         | null                   
+8            | 7           | null         | null                   
+9            | 6           | null         | null                   
+10           | 5           | null         | null                   
+11           | 4           | null         | null                   
+12           | 3           | null         | null                   
+13           | 2           | null         | null                   
+14           | 1           | null         | null                   
+15           | 0           | trend_change | 1.2352704486638883E-112
+16           | 1           | null         | null                   
+17           | 2           | null         | null                   
+18           | 3           | null         | null                   
+19           | 4           | null         | null                   
+20           | 5           | null         | null                   
+21           | 6           | null         | null                   
+22           | 7           | null         | null                   
+23           | 8           | null         | null                   
+24           | 9           | null         | null                   
+25           | 10          | null         | null               
+;
+
+
+keys null column
+required_capability: change_point
+
+ROW key=NULL, value=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
+  | MV_EXPAND value
+  | CHANGE_POINT value ON key
+;
+
+key:null | value:integer | type:keyword | pvalue:double
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+;
+
+
+values null column
+required_capability: change_point
+
+ROW time=[7,13,12,17,14,5,16,10,19,18,20,2,3,21,25,4,22,15,6,23,9,11,1,8,24], values=NULL::INTEGER
+  | MV_EXPAND time
+  | CHANGE_POINT values ON time
+;
+
+warning: Line 3:3: evaluation of [CHANGE_POINT values ON time] failed, treating result as null. Only first 20 failures recorded.
+warning: Line 3:3: java.lang.IllegalArgumentException: not enough buckets to calculate change_point. Requires at least [22]; found [0]
+warning: Line 3:3: java.lang.IllegalArgumentException: values contain nulls; skipping them
+
+time:integer | values:integer | type:keyword | pvalue:double
+1            | null           | null         | null         
+2            | null           | null         | null         
+3            | null           | null         | null         
+4            | null           | null         | null         
+5            | null           | null         | null         
+6            | null           | null         | null         
+7            | null           | null         | null         
+8            | null           | null         | null         
+9            | null           | null         | null         
+10           | null           | null         | null         
+11           | null           | null         | null         
+12           | null           | null         | null         
+13           | null           | null         | null         
+14           | null           | null         | null         
+15           | null           | null         | null         
+16           | null           | null         | null         
+17           | null           | null         | null         
+18           | null           | null         | null         
+19           | null           | null         | null         
+20           | null           | null         | null         
+21           | null           | null         | null         
+22           | null           | null         | null         
+23           | null           | null         | null         
+24           | null           | null         | null         
+25           | null           | null         | null         
+;
+
+
+row with integer key and value
+required_capability: change_point
+
+ROW key=[7,13,12,17,14,5,16,10,19,18,20,2,3,21,25,4,22,15,6,23,9,11,1,8,24]
+  | MV_EXPAND key
+  | EVAL value=CASE(key<13, 0, 1)
+  | CHANGE_POINT value ON key
+  | WHERE type IS NOT NULL
+;
+
+key:integer | value:integer | type:keyword | pvalue:double
+13          | 1             | step_change  | 0.0         
+;
+
+
+row with long key and value
+required_capability: change_point
+
+ROW key=[7,13,12,17,14,5,16,10,19,18,20,2,3,21,25,4,22,15,6,23,9,11,1,8,24]
+  | MV_EXPAND key
+  | EVAL key=TO_LONG(key), value=CASE(key<13, 0::LONG, 1::LONG)
+  | CHANGE_POINT value ON key
+  | WHERE type IS NOT NULL
+;
+
+key:long | value:long | type:keyword | pvalue:double
+13       | 1          | step_change  | 0.0         
+;
+
+
+row with double key and value
+required_capability: change_point
+
+ROW key=[7,13,12,17,14,5,16,10,19,18,20,2,3,21,25,4,22,15,6,23,9,11,1,8,24]
+  | MV_EXPAND key
+  | EVAL key=TO_DOUBLE(key), value=CASE(key<13, 0::DOUBLE, 1::DOUBLE)
+  | CHANGE_POINT value ON key
+  | WHERE type IS NOT NULL
+;
+
+key:double | value:double | type:keyword | pvalue:double
+13         | 1            | step_change  | 0.0         
+;
+
+
+row with string key
+required_capability: change_point
+
+ROW key=["23","17","02","06","01","21","12","15","19","07","11","05","24","04","10","14","13","22","09","18","20","08","25","16","03"]
+  | MV_EXPAND key
+  | EVAL value=CASE(key<"13", 0, 1)
+  | CHANGE_POINT value ON key
+  | WHERE type IS NOT NULL
+;
+
+key:string | value:integer | type:keyword | pvalue:double
+13         | 1             | step_change  | 0.0         
+;
+
+
+row with datetime key
+required_capability: change_point
+
+ROW key=[7,13,12,17,14,5,16,10,19,18,20,2,3,21,25,4,22,15,6,23,9,11,1,8,24]
+  | MV_EXPAND key
+  | EVAL key=TO_DATETIME(key), value=CASE(key<"1970-01-01T00:00:00.013Z", 0, 1)
+  | CHANGE_POINT value ON key
+  | WHERE type IS NOT NULL
+;
+
+key:datetime             | value:integer | type:keyword | pvalue:double
+1970-01-01T00:00:00.013Z | 1             | step_change  | 0.0          
+;
+
+
+row with ip key
+required_capability: change_point
+
+ROW key=[7,13,12,17,14,5,16,10,19,18,20,2,3,21,25,4,22,15,6,23,9,11,1,8,24]
+  | MV_EXPAND key
+  | EVAL key=TO_STRING(key), key=TO_IP(CONCAT(key,".",key,".",key,".",key)), value=CASE(key<"13.13.13.13", 0, 1)
+  | CHANGE_POINT value ON key
+  | WHERE type IS NOT NULL
+;
+
+key:ip      | value:integer | type:keyword | pvalue:double
+13.13.13.13 | 1             | step_change  | 0.0          
+;
+
+
+row with version key
+required_capability: change_point
+
+ROW key=[7,13,12,17,14,5,16,10,19,18,20,2,3,21,25,4,22,15,6,23,9,11,1,8,24]
+  | MV_EXPAND key
+  | EVAL key=TO_STRING(key), key=TO_VERSION(CONCAT(key,".",key,".",key)), value=CASE(key<"13.13.13", 0, 1)
+  | CHANGE_POINT value ON key
+  | WHERE type IS NOT NULL
+;
+
+key:version | value:integer | type:keyword | pvalue:double
+13.13.13    | 1             | step_change  | 0.0          
+;
+
+
+row with boolean key
+required_capability: change_point
+
+ROW key=[1,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,1,0,0,1,0,0,0,1]
+  | MV_EXPAND key
+  | EVAL key=TO_BOOLEAN(key), value=CASE(key==false, 0, 1)
+  | CHANGE_POINT value ON key
+;
+
+key:boolean | value:integer | type:keyword | pvalue:double
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+true        | 1             | step_change  | 0.0          
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+;
+
+
+example for docs
+required_capability: change_point
+
+// tag::changePointForDocs[]
+ROW key=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]
+| MV_EXPAND key
+| EVAL value = CASE(key<13, 0, 42)
+| CHANGE_POINT value ON key
+| WHERE type IS NOT NULL
+// end::changePointForDocs[]
+;
+
+// tag::changePointForDocs-result[]
+key:integer | value:integer | type:keyword | pvalue:double
+13          | 42            | step_change  | 0.0          
+// end::changePointForDocs-result[]
+;

+ 23 - 6
x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4

@@ -74,6 +74,7 @@ SORT : 'sort'                 -> pushMode(EXPRESSION_MODE);
 STATS : 'stats'               -> pushMode(EXPRESSION_MODE);
 WHERE : 'where'               -> pushMode(EXPRESSION_MODE);
 JOIN_LOOKUP : 'lookup'        -> pushMode(JOIN_MODE);
+CHANGE_POINT : 'change_point' -> pushMode(CHANGE_POINT_MODE);
 //
 // in development
 //
@@ -85,13 +86,13 @@ JOIN_LOOKUP : 'lookup'        -> pushMode(JOIN_MODE);
 // Once the command has been stabilized, remove the DEV_ prefix and the {}? conditional and move the command to the
 // main section while preserving alphabetical order:
 // MYCOMMAND : 'mycommand' -> ...
-DEV_INLINESTATS : {this.isDevVersion()}? 'inlinestats'   -> pushMode(EXPRESSION_MODE);
-DEV_LOOKUP :      {this.isDevVersion()}? 'lookup_🐔'      -> pushMode(LOOKUP_MODE);
-DEV_METRICS :     {this.isDevVersion()}? 'metrics'       -> pushMode(METRICS_MODE);
+DEV_INLINESTATS :  {this.isDevVersion()}? 'inlinestats'   -> pushMode(EXPRESSION_MODE);
+DEV_LOOKUP :       {this.isDevVersion()}? 'lookup_🐔'     -> pushMode(LOOKUP_MODE);
+DEV_METRICS :      {this.isDevVersion()}? 'metrics'       -> pushMode(METRICS_MODE);
 // list of all JOIN commands
-DEV_JOIN_FULL :   {this.isDevVersion()}? 'full'          -> pushMode(JOIN_MODE);
-DEV_JOIN_LEFT :   {this.isDevVersion()}? 'left'          -> pushMode(JOIN_MODE);
-DEV_JOIN_RIGHT :  {this.isDevVersion()}? 'right'         -> pushMode(JOIN_MODE);
+DEV_JOIN_FULL :    {this.isDevVersion()}? 'full'          -> pushMode(JOIN_MODE);
+DEV_JOIN_LEFT :    {this.isDevVersion()}? 'left'          -> pushMode(JOIN_MODE);
+DEV_JOIN_RIGHT :   {this.isDevVersion()}? 'right'         -> pushMode(JOIN_MODE);
 
 
 //
@@ -658,3 +659,19 @@ CLOSING_METRICS_BY
 CLOSING_METRICS_PIPE
     : PIPE -> type(PIPE), popMode
     ;
+
+///
+/// CHANGE_POINT command
+///
+mode CHANGE_POINT_MODE;
+
+CHANGE_POINT_PIPE : PIPE -> type(PIPE), popMode;
+CHANGE_POINT_ON : ON -> type(ON);
+CHANGE_POINT_AS : AS -> type(AS);
+CHANGE_POINT_DOT: DOT -> type(DOT);
+CHANGE_POINT_COMMA: COMMA -> type(COMMA);
+CHANGE_POINT_QUOTED_IDENTIFIER: QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER);
+CHANGE_POINT_UNQUOTED_IDENTIFIER: UNQUOTED_IDENTIFIER -> type(UNQUOTED_IDENTIFIER);
+CHANGE_POINT_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN);
+CHANGE_POINT_MULTILINE_COMMENT: MULTILINE_COMMENT -> channel(HIDDEN);
+CHANGE_POINT_WS: WS -> channel(HIDDEN);

+ 168 - 163
x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens

@@ -15,121 +15,125 @@ SORT=14
 STATS=15
 WHERE=16
 JOIN_LOOKUP=17
-DEV_INLINESTATS=18
-DEV_LOOKUP=19
-DEV_METRICS=20
-DEV_JOIN_FULL=21
-DEV_JOIN_LEFT=22
-DEV_JOIN_RIGHT=23
-UNKNOWN_CMD=24
-LINE_COMMENT=25
-MULTILINE_COMMENT=26
-WS=27
-PIPE=28
-QUOTED_STRING=29
-INTEGER_LITERAL=30
-DECIMAL_LITERAL=31
-BY=32
-AND=33
-ASC=34
-ASSIGN=35
-CAST_OP=36
-COLON=37
-COMMA=38
-DESC=39
-DOT=40
-FALSE=41
-FIRST=42
-IN=43
-IS=44
-LAST=45
-LIKE=46
-LP=47
-NOT=48
-NULL=49
-NULLS=50
-OR=51
-PARAM=52
-RLIKE=53
-RP=54
-TRUE=55
-EQ=56
-CIEQ=57
-NEQ=58
-LT=59
-LTE=60
-GT=61
-GTE=62
-PLUS=63
-MINUS=64
-ASTERISK=65
-SLASH=66
-PERCENT=67
-LEFT_BRACES=68
-RIGHT_BRACES=69
-DOUBLE_PARAMS=70
-NAMED_OR_POSITIONAL_PARAM=71
-NAMED_OR_POSITIONAL_DOUBLE_PARAMS=72
-OPENING_BRACKET=73
-CLOSING_BRACKET=74
-UNQUOTED_IDENTIFIER=75
-QUOTED_IDENTIFIER=76
-EXPR_LINE_COMMENT=77
-EXPR_MULTILINE_COMMENT=78
-EXPR_WS=79
-EXPLAIN_WS=80
-EXPLAIN_LINE_COMMENT=81
-EXPLAIN_MULTILINE_COMMENT=82
-METADATA=83
-UNQUOTED_SOURCE=84
-FROM_LINE_COMMENT=85
-FROM_MULTILINE_COMMENT=86
-FROM_WS=87
-ID_PATTERN=88
-PROJECT_LINE_COMMENT=89
-PROJECT_MULTILINE_COMMENT=90
-PROJECT_WS=91
-AS=92
-RENAME_LINE_COMMENT=93
-RENAME_MULTILINE_COMMENT=94
-RENAME_WS=95
-ON=96
-WITH=97
-ENRICH_POLICY_NAME=98
-ENRICH_LINE_COMMENT=99
-ENRICH_MULTILINE_COMMENT=100
-ENRICH_WS=101
-ENRICH_FIELD_LINE_COMMENT=102
-ENRICH_FIELD_MULTILINE_COMMENT=103
-ENRICH_FIELD_WS=104
-MVEXPAND_LINE_COMMENT=105
-MVEXPAND_MULTILINE_COMMENT=106
-MVEXPAND_WS=107
-INFO=108
-SHOW_LINE_COMMENT=109
-SHOW_MULTILINE_COMMENT=110
-SHOW_WS=111
-SETTING=112
-SETTING_LINE_COMMENT=113
-SETTTING_MULTILINE_COMMENT=114
-SETTING_WS=115
-LOOKUP_LINE_COMMENT=116
-LOOKUP_MULTILINE_COMMENT=117
-LOOKUP_WS=118
-LOOKUP_FIELD_LINE_COMMENT=119
-LOOKUP_FIELD_MULTILINE_COMMENT=120
-LOOKUP_FIELD_WS=121
-JOIN=122
-USING=123
-JOIN_LINE_COMMENT=124
-JOIN_MULTILINE_COMMENT=125
-JOIN_WS=126
-METRICS_LINE_COMMENT=127
-METRICS_MULTILINE_COMMENT=128
-METRICS_WS=129
-CLOSING_METRICS_LINE_COMMENT=130
-CLOSING_METRICS_MULTILINE_COMMENT=131
-CLOSING_METRICS_WS=132
+CHANGE_POINT=18
+DEV_INLINESTATS=19
+DEV_LOOKUP=20
+DEV_METRICS=21
+DEV_JOIN_FULL=22
+DEV_JOIN_LEFT=23
+DEV_JOIN_RIGHT=24
+UNKNOWN_CMD=25
+LINE_COMMENT=26
+MULTILINE_COMMENT=27
+WS=28
+PIPE=29
+QUOTED_STRING=30
+INTEGER_LITERAL=31
+DECIMAL_LITERAL=32
+BY=33
+AND=34
+ASC=35
+ASSIGN=36
+CAST_OP=37
+COLON=38
+COMMA=39
+DESC=40
+DOT=41
+FALSE=42
+FIRST=43
+IN=44
+IS=45
+LAST=46
+LIKE=47
+LP=48
+NOT=49
+NULL=50
+NULLS=51
+OR=52
+PARAM=53
+RLIKE=54
+RP=55
+TRUE=56
+EQ=57
+CIEQ=58
+NEQ=59
+LT=60
+LTE=61
+GT=62
+GTE=63
+PLUS=64
+MINUS=65
+ASTERISK=66
+SLASH=67
+PERCENT=68
+LEFT_BRACES=69
+RIGHT_BRACES=70
+DOUBLE_PARAMS=71
+NAMED_OR_POSITIONAL_PARAM=72
+NAMED_OR_POSITIONAL_DOUBLE_PARAMS=73
+OPENING_BRACKET=74
+CLOSING_BRACKET=75
+UNQUOTED_IDENTIFIER=76
+QUOTED_IDENTIFIER=77
+EXPR_LINE_COMMENT=78
+EXPR_MULTILINE_COMMENT=79
+EXPR_WS=80
+EXPLAIN_WS=81
+EXPLAIN_LINE_COMMENT=82
+EXPLAIN_MULTILINE_COMMENT=83
+METADATA=84
+UNQUOTED_SOURCE=85
+FROM_LINE_COMMENT=86
+FROM_MULTILINE_COMMENT=87
+FROM_WS=88
+ID_PATTERN=89
+PROJECT_LINE_COMMENT=90
+PROJECT_MULTILINE_COMMENT=91
+PROJECT_WS=92
+AS=93
+RENAME_LINE_COMMENT=94
+RENAME_MULTILINE_COMMENT=95
+RENAME_WS=96
+ON=97
+WITH=98
+ENRICH_POLICY_NAME=99
+ENRICH_LINE_COMMENT=100
+ENRICH_MULTILINE_COMMENT=101
+ENRICH_WS=102
+ENRICH_FIELD_LINE_COMMENT=103
+ENRICH_FIELD_MULTILINE_COMMENT=104
+ENRICH_FIELD_WS=105
+MVEXPAND_LINE_COMMENT=106
+MVEXPAND_MULTILINE_COMMENT=107
+MVEXPAND_WS=108
+INFO=109
+SHOW_LINE_COMMENT=110
+SHOW_MULTILINE_COMMENT=111
+SHOW_WS=112
+SETTING=113
+SETTING_LINE_COMMENT=114
+SETTTING_MULTILINE_COMMENT=115
+SETTING_WS=116
+LOOKUP_LINE_COMMENT=117
+LOOKUP_MULTILINE_COMMENT=118
+LOOKUP_WS=119
+LOOKUP_FIELD_LINE_COMMENT=120
+LOOKUP_FIELD_MULTILINE_COMMENT=121
+LOOKUP_FIELD_WS=122
+JOIN=123
+USING=124
+JOIN_LINE_COMMENT=125
+JOIN_MULTILINE_COMMENT=126
+JOIN_WS=127
+METRICS_LINE_COMMENT=128
+METRICS_MULTILINE_COMMENT=129
+METRICS_WS=130
+CLOSING_METRICS_LINE_COMMENT=131
+CLOSING_METRICS_MULTILINE_COMMENT=132
+CLOSING_METRICS_WS=133
+CHANGE_POINT_LINE_COMMENT=134
+CHANGE_POINT_MULTILINE_COMMENT=135
+CHANGE_POINT_WS=136
 'dissect'=1
 'drop'=2
 'enrich'=3
@@ -147,51 +151,52 @@ CLOSING_METRICS_WS=132
 'stats'=15
 'where'=16
 'lookup'=17
-'|'=28
-'by'=32
-'and'=33
-'asc'=34
-'='=35
-'::'=36
-':'=37
-','=38
-'desc'=39
-'.'=40
-'false'=41
-'first'=42
-'in'=43
-'is'=44
-'last'=45
-'like'=46
-'('=47
-'not'=48
-'null'=49
-'nulls'=50
-'or'=51
-'?'=52
-'rlike'=53
-')'=54
-'true'=55
-'=='=56
-'=~'=57
-'!='=58
-'<'=59
-'<='=60
-'>'=61
-'>='=62
-'+'=63
-'-'=64
-'*'=65
-'/'=66
-'%'=67
-'{'=68
-'}'=69
-'??'=70
-']'=74
-'metadata'=83
-'as'=92
-'on'=96
-'with'=97
-'info'=108
-'join'=122
-'USING'=123
+'change_point'=18
+'|'=29
+'by'=33
+'and'=34
+'asc'=35
+'='=36
+'::'=37
+':'=38
+','=39
+'desc'=40
+'.'=41
+'false'=42
+'first'=43
+'in'=44
+'is'=45
+'last'=46
+'like'=47
+'('=48
+'not'=49
+'null'=50
+'nulls'=51
+'or'=52
+'?'=53
+'rlike'=54
+')'=55
+'true'=56
+'=='=57
+'=~'=58
+'!='=59
+'<'=60
+'<='=61
+'>'=62
+'>='=63
+'+'=64
+'-'=65
+'*'=66
+'/'=67
+'%'=68
+'{'=69
+'}'=70
+'??'=71
+']'=75
+'metadata'=84
+'as'=93
+'on'=97
+'with'=98
+'info'=109
+'join'=123
+'USING'=124

+ 5 - 0
x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4

@@ -52,6 +52,7 @@ processingCommand
     | enrichCommand
     | mvExpandCommand
     | joinCommand
+    | changePointCommand
     // in development
     | {this.isDevVersion()}? inlinestatsCommand
     | {this.isDevVersion()}? lookupCommand
@@ -335,6 +336,10 @@ enrichWithClause
     : (newName=qualifiedNamePattern ASSIGN)? enrichField=qualifiedNamePattern
     ;
 
+changePointCommand
+    : CHANGE_POINT value=qualifiedName (ON key=qualifiedName)? (AS targetType=qualifiedName COMMA targetPvalue=qualifiedName)?
+    ;
+
 //
 // In development
 //

+ 168 - 163
x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens

@@ -15,121 +15,125 @@ SORT=14
 STATS=15
 WHERE=16
 JOIN_LOOKUP=17
-DEV_INLINESTATS=18
-DEV_LOOKUP=19
-DEV_METRICS=20
-DEV_JOIN_FULL=21
-DEV_JOIN_LEFT=22
-DEV_JOIN_RIGHT=23
-UNKNOWN_CMD=24
-LINE_COMMENT=25
-MULTILINE_COMMENT=26
-WS=27
-PIPE=28
-QUOTED_STRING=29
-INTEGER_LITERAL=30
-DECIMAL_LITERAL=31
-BY=32
-AND=33
-ASC=34
-ASSIGN=35
-CAST_OP=36
-COLON=37
-COMMA=38
-DESC=39
-DOT=40
-FALSE=41
-FIRST=42
-IN=43
-IS=44
-LAST=45
-LIKE=46
-LP=47
-NOT=48
-NULL=49
-NULLS=50
-OR=51
-PARAM=52
-RLIKE=53
-RP=54
-TRUE=55
-EQ=56
-CIEQ=57
-NEQ=58
-LT=59
-LTE=60
-GT=61
-GTE=62
-PLUS=63
-MINUS=64
-ASTERISK=65
-SLASH=66
-PERCENT=67
-LEFT_BRACES=68
-RIGHT_BRACES=69
-DOUBLE_PARAMS=70
-NAMED_OR_POSITIONAL_PARAM=71
-NAMED_OR_POSITIONAL_DOUBLE_PARAMS=72
-OPENING_BRACKET=73
-CLOSING_BRACKET=74
-UNQUOTED_IDENTIFIER=75
-QUOTED_IDENTIFIER=76
-EXPR_LINE_COMMENT=77
-EXPR_MULTILINE_COMMENT=78
-EXPR_WS=79
-EXPLAIN_WS=80
-EXPLAIN_LINE_COMMENT=81
-EXPLAIN_MULTILINE_COMMENT=82
-METADATA=83
-UNQUOTED_SOURCE=84
-FROM_LINE_COMMENT=85
-FROM_MULTILINE_COMMENT=86
-FROM_WS=87
-ID_PATTERN=88
-PROJECT_LINE_COMMENT=89
-PROJECT_MULTILINE_COMMENT=90
-PROJECT_WS=91
-AS=92
-RENAME_LINE_COMMENT=93
-RENAME_MULTILINE_COMMENT=94
-RENAME_WS=95
-ON=96
-WITH=97
-ENRICH_POLICY_NAME=98
-ENRICH_LINE_COMMENT=99
-ENRICH_MULTILINE_COMMENT=100
-ENRICH_WS=101
-ENRICH_FIELD_LINE_COMMENT=102
-ENRICH_FIELD_MULTILINE_COMMENT=103
-ENRICH_FIELD_WS=104
-MVEXPAND_LINE_COMMENT=105
-MVEXPAND_MULTILINE_COMMENT=106
-MVEXPAND_WS=107
-INFO=108
-SHOW_LINE_COMMENT=109
-SHOW_MULTILINE_COMMENT=110
-SHOW_WS=111
-SETTING=112
-SETTING_LINE_COMMENT=113
-SETTTING_MULTILINE_COMMENT=114
-SETTING_WS=115
-LOOKUP_LINE_COMMENT=116
-LOOKUP_MULTILINE_COMMENT=117
-LOOKUP_WS=118
-LOOKUP_FIELD_LINE_COMMENT=119
-LOOKUP_FIELD_MULTILINE_COMMENT=120
-LOOKUP_FIELD_WS=121
-JOIN=122
-USING=123
-JOIN_LINE_COMMENT=124
-JOIN_MULTILINE_COMMENT=125
-JOIN_WS=126
-METRICS_LINE_COMMENT=127
-METRICS_MULTILINE_COMMENT=128
-METRICS_WS=129
-CLOSING_METRICS_LINE_COMMENT=130
-CLOSING_METRICS_MULTILINE_COMMENT=131
-CLOSING_METRICS_WS=132
+CHANGE_POINT=18
+DEV_INLINESTATS=19
+DEV_LOOKUP=20
+DEV_METRICS=21
+DEV_JOIN_FULL=22
+DEV_JOIN_LEFT=23
+DEV_JOIN_RIGHT=24
+UNKNOWN_CMD=25
+LINE_COMMENT=26
+MULTILINE_COMMENT=27
+WS=28
+PIPE=29
+QUOTED_STRING=30
+INTEGER_LITERAL=31
+DECIMAL_LITERAL=32
+BY=33
+AND=34
+ASC=35
+ASSIGN=36
+CAST_OP=37
+COLON=38
+COMMA=39
+DESC=40
+DOT=41
+FALSE=42
+FIRST=43
+IN=44
+IS=45
+LAST=46
+LIKE=47
+LP=48
+NOT=49
+NULL=50
+NULLS=51
+OR=52
+PARAM=53
+RLIKE=54
+RP=55
+TRUE=56
+EQ=57
+CIEQ=58
+NEQ=59
+LT=60
+LTE=61
+GT=62
+GTE=63
+PLUS=64
+MINUS=65
+ASTERISK=66
+SLASH=67
+PERCENT=68
+LEFT_BRACES=69
+RIGHT_BRACES=70
+DOUBLE_PARAMS=71
+NAMED_OR_POSITIONAL_PARAM=72
+NAMED_OR_POSITIONAL_DOUBLE_PARAMS=73
+OPENING_BRACKET=74
+CLOSING_BRACKET=75
+UNQUOTED_IDENTIFIER=76
+QUOTED_IDENTIFIER=77
+EXPR_LINE_COMMENT=78
+EXPR_MULTILINE_COMMENT=79
+EXPR_WS=80
+EXPLAIN_WS=81
+EXPLAIN_LINE_COMMENT=82
+EXPLAIN_MULTILINE_COMMENT=83
+METADATA=84
+UNQUOTED_SOURCE=85
+FROM_LINE_COMMENT=86
+FROM_MULTILINE_COMMENT=87
+FROM_WS=88
+ID_PATTERN=89
+PROJECT_LINE_COMMENT=90
+PROJECT_MULTILINE_COMMENT=91
+PROJECT_WS=92
+AS=93
+RENAME_LINE_COMMENT=94
+RENAME_MULTILINE_COMMENT=95
+RENAME_WS=96
+ON=97
+WITH=98
+ENRICH_POLICY_NAME=99
+ENRICH_LINE_COMMENT=100
+ENRICH_MULTILINE_COMMENT=101
+ENRICH_WS=102
+ENRICH_FIELD_LINE_COMMENT=103
+ENRICH_FIELD_MULTILINE_COMMENT=104
+ENRICH_FIELD_WS=105
+MVEXPAND_LINE_COMMENT=106
+MVEXPAND_MULTILINE_COMMENT=107
+MVEXPAND_WS=108
+INFO=109
+SHOW_LINE_COMMENT=110
+SHOW_MULTILINE_COMMENT=111
+SHOW_WS=112
+SETTING=113
+SETTING_LINE_COMMENT=114
+SETTTING_MULTILINE_COMMENT=115
+SETTING_WS=116
+LOOKUP_LINE_COMMENT=117
+LOOKUP_MULTILINE_COMMENT=118
+LOOKUP_WS=119
+LOOKUP_FIELD_LINE_COMMENT=120
+LOOKUP_FIELD_MULTILINE_COMMENT=121
+LOOKUP_FIELD_WS=122
+JOIN=123
+USING=124
+JOIN_LINE_COMMENT=125
+JOIN_MULTILINE_COMMENT=126
+JOIN_WS=127
+METRICS_LINE_COMMENT=128
+METRICS_MULTILINE_COMMENT=129
+METRICS_WS=130
+CLOSING_METRICS_LINE_COMMENT=131
+CLOSING_METRICS_MULTILINE_COMMENT=132
+CLOSING_METRICS_WS=133
+CHANGE_POINT_LINE_COMMENT=134
+CHANGE_POINT_MULTILINE_COMMENT=135
+CHANGE_POINT_WS=136
 'dissect'=1
 'drop'=2
 'enrich'=3
@@ -147,51 +151,52 @@ CLOSING_METRICS_WS=132
 'stats'=15
 'where'=16
 'lookup'=17
-'|'=28
-'by'=32
-'and'=33
-'asc'=34
-'='=35
-'::'=36
-':'=37
-','=38
-'desc'=39
-'.'=40
-'false'=41
-'first'=42
-'in'=43
-'is'=44
-'last'=45
-'like'=46
-'('=47
-'not'=48
-'null'=49
-'nulls'=50
-'or'=51
-'?'=52
-'rlike'=53
-')'=54
-'true'=55
-'=='=56
-'=~'=57
-'!='=58
-'<'=59
-'<='=60
-'>'=61
-'>='=62
-'+'=63
-'-'=64
-'*'=65
-'/'=66
-'%'=67
-'{'=68
-'}'=69
-'??'=70
-']'=74
-'metadata'=83
-'as'=92
-'on'=96
-'with'=97
-'info'=108
-'join'=122
-'USING'=123
+'change_point'=18
+'|'=29
+'by'=33
+'and'=34
+'asc'=35
+'='=36
+'::'=37
+':'=38
+','=39
+'desc'=40
+'.'=41
+'false'=42
+'first'=43
+'in'=44
+'is'=45
+'last'=46
+'like'=47
+'('=48
+'not'=49
+'null'=50
+'nulls'=51
+'or'=52
+'?'=53
+'rlike'=54
+')'=55
+'true'=56
+'=='=57
+'=~'=58
+'!='=59
+'<'=60
+'<='=61
+'>'=62
+'>='=63
+'+'=64
+'-'=65
+'*'=66
+'/'=67
+'%'=68
+'{'=69
+'}'=70
+'??'=71
+']'=75
+'metadata'=84
+'as'=93
+'on'=97
+'with'=98
+'info'=109
+'join'=123
+'USING'=124

+ 5 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java

@@ -711,6 +711,11 @@ public class EsqlCapabilities {
          */
         AGGREGATE_METRIC_DOUBLE_PARTIAL_SUBMETRICS(AGGREGATE_METRIC_DOUBLE_FEATURE_FLAG),
 
+        /**
+         * Support change point detection "CHANGE_POINT".
+         */
+        CHANGE_POINT,
+
         /**
          * Fix for https://github.com/elastic/elasticsearch/issues/120817
          * and https://github.com/elastic/elasticsearch/issues/120803

文件差异内容过多而无法显示
+ 20 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp


+ 1246 - 1188
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java

@@ -27,36 +27,38 @@ public class EsqlBaseLexer extends LexerConfig {
   public static final int
     DISSECT=1, DROP=2, ENRICH=3, EVAL=4, EXPLAIN=5, FROM=6, GROK=7, KEEP=8, 
     LIMIT=9, MV_EXPAND=10, RENAME=11, ROW=12, SHOW=13, SORT=14, STATS=15, 
-    WHERE=16, JOIN_LOOKUP=17, DEV_INLINESTATS=18, DEV_LOOKUP=19, DEV_METRICS=20, 
-    DEV_JOIN_FULL=21, DEV_JOIN_LEFT=22, DEV_JOIN_RIGHT=23, UNKNOWN_CMD=24, 
-    LINE_COMMENT=25, MULTILINE_COMMENT=26, WS=27, PIPE=28, QUOTED_STRING=29, 
-    INTEGER_LITERAL=30, DECIMAL_LITERAL=31, BY=32, AND=33, ASC=34, ASSIGN=35, 
-    CAST_OP=36, COLON=37, COMMA=38, DESC=39, DOT=40, FALSE=41, FIRST=42, IN=43, 
-    IS=44, LAST=45, LIKE=46, LP=47, NOT=48, NULL=49, NULLS=50, OR=51, PARAM=52, 
-    RLIKE=53, RP=54, TRUE=55, EQ=56, CIEQ=57, NEQ=58, LT=59, LTE=60, GT=61, 
-    GTE=62, PLUS=63, MINUS=64, ASTERISK=65, SLASH=66, PERCENT=67, LEFT_BRACES=68, 
-    RIGHT_BRACES=69, DOUBLE_PARAMS=70, NAMED_OR_POSITIONAL_PARAM=71, NAMED_OR_POSITIONAL_DOUBLE_PARAMS=72, 
-    OPENING_BRACKET=73, CLOSING_BRACKET=74, UNQUOTED_IDENTIFIER=75, QUOTED_IDENTIFIER=76, 
-    EXPR_LINE_COMMENT=77, EXPR_MULTILINE_COMMENT=78, EXPR_WS=79, EXPLAIN_WS=80, 
-    EXPLAIN_LINE_COMMENT=81, EXPLAIN_MULTILINE_COMMENT=82, METADATA=83, UNQUOTED_SOURCE=84, 
-    FROM_LINE_COMMENT=85, FROM_MULTILINE_COMMENT=86, FROM_WS=87, ID_PATTERN=88, 
-    PROJECT_LINE_COMMENT=89, PROJECT_MULTILINE_COMMENT=90, PROJECT_WS=91, 
-    AS=92, RENAME_LINE_COMMENT=93, RENAME_MULTILINE_COMMENT=94, RENAME_WS=95, 
-    ON=96, WITH=97, ENRICH_POLICY_NAME=98, ENRICH_LINE_COMMENT=99, ENRICH_MULTILINE_COMMENT=100, 
-    ENRICH_WS=101, ENRICH_FIELD_LINE_COMMENT=102, ENRICH_FIELD_MULTILINE_COMMENT=103, 
-    ENRICH_FIELD_WS=104, MVEXPAND_LINE_COMMENT=105, MVEXPAND_MULTILINE_COMMENT=106, 
-    MVEXPAND_WS=107, INFO=108, SHOW_LINE_COMMENT=109, SHOW_MULTILINE_COMMENT=110, 
-    SHOW_WS=111, SETTING=112, SETTING_LINE_COMMENT=113, SETTTING_MULTILINE_COMMENT=114, 
-    SETTING_WS=115, LOOKUP_LINE_COMMENT=116, LOOKUP_MULTILINE_COMMENT=117, 
-    LOOKUP_WS=118, LOOKUP_FIELD_LINE_COMMENT=119, LOOKUP_FIELD_MULTILINE_COMMENT=120, 
-    LOOKUP_FIELD_WS=121, JOIN=122, USING=123, JOIN_LINE_COMMENT=124, JOIN_MULTILINE_COMMENT=125, 
-    JOIN_WS=126, METRICS_LINE_COMMENT=127, METRICS_MULTILINE_COMMENT=128, 
-    METRICS_WS=129, CLOSING_METRICS_LINE_COMMENT=130, CLOSING_METRICS_MULTILINE_COMMENT=131, 
-    CLOSING_METRICS_WS=132;
+    WHERE=16, JOIN_LOOKUP=17, CHANGE_POINT=18, DEV_INLINESTATS=19, DEV_LOOKUP=20, 
+    DEV_METRICS=21, DEV_JOIN_FULL=22, DEV_JOIN_LEFT=23, DEV_JOIN_RIGHT=24, 
+    UNKNOWN_CMD=25, LINE_COMMENT=26, MULTILINE_COMMENT=27, WS=28, PIPE=29, 
+    QUOTED_STRING=30, INTEGER_LITERAL=31, DECIMAL_LITERAL=32, BY=33, AND=34, 
+    ASC=35, ASSIGN=36, CAST_OP=37, COLON=38, COMMA=39, DESC=40, DOT=41, FALSE=42, 
+    FIRST=43, IN=44, IS=45, LAST=46, LIKE=47, LP=48, NOT=49, NULL=50, NULLS=51, 
+    OR=52, PARAM=53, RLIKE=54, RP=55, TRUE=56, EQ=57, CIEQ=58, NEQ=59, LT=60, 
+    LTE=61, GT=62, GTE=63, PLUS=64, MINUS=65, ASTERISK=66, SLASH=67, PERCENT=68, 
+    LEFT_BRACES=69, RIGHT_BRACES=70, DOUBLE_PARAMS=71, NAMED_OR_POSITIONAL_PARAM=72, 
+    NAMED_OR_POSITIONAL_DOUBLE_PARAMS=73, OPENING_BRACKET=74, CLOSING_BRACKET=75, 
+    UNQUOTED_IDENTIFIER=76, QUOTED_IDENTIFIER=77, EXPR_LINE_COMMENT=78, EXPR_MULTILINE_COMMENT=79, 
+    EXPR_WS=80, EXPLAIN_WS=81, EXPLAIN_LINE_COMMENT=82, EXPLAIN_MULTILINE_COMMENT=83, 
+    METADATA=84, UNQUOTED_SOURCE=85, FROM_LINE_COMMENT=86, FROM_MULTILINE_COMMENT=87, 
+    FROM_WS=88, ID_PATTERN=89, PROJECT_LINE_COMMENT=90, PROJECT_MULTILINE_COMMENT=91, 
+    PROJECT_WS=92, AS=93, RENAME_LINE_COMMENT=94, RENAME_MULTILINE_COMMENT=95, 
+    RENAME_WS=96, ON=97, WITH=98, ENRICH_POLICY_NAME=99, ENRICH_LINE_COMMENT=100, 
+    ENRICH_MULTILINE_COMMENT=101, ENRICH_WS=102, ENRICH_FIELD_LINE_COMMENT=103, 
+    ENRICH_FIELD_MULTILINE_COMMENT=104, ENRICH_FIELD_WS=105, MVEXPAND_LINE_COMMENT=106, 
+    MVEXPAND_MULTILINE_COMMENT=107, MVEXPAND_WS=108, INFO=109, SHOW_LINE_COMMENT=110, 
+    SHOW_MULTILINE_COMMENT=111, SHOW_WS=112, SETTING=113, SETTING_LINE_COMMENT=114, 
+    SETTTING_MULTILINE_COMMENT=115, SETTING_WS=116, LOOKUP_LINE_COMMENT=117, 
+    LOOKUP_MULTILINE_COMMENT=118, LOOKUP_WS=119, LOOKUP_FIELD_LINE_COMMENT=120, 
+    LOOKUP_FIELD_MULTILINE_COMMENT=121, LOOKUP_FIELD_WS=122, JOIN=123, USING=124, 
+    JOIN_LINE_COMMENT=125, JOIN_MULTILINE_COMMENT=126, JOIN_WS=127, METRICS_LINE_COMMENT=128, 
+    METRICS_MULTILINE_COMMENT=129, METRICS_WS=130, CLOSING_METRICS_LINE_COMMENT=131, 
+    CLOSING_METRICS_MULTILINE_COMMENT=132, CLOSING_METRICS_WS=133, CHANGE_POINT_LINE_COMMENT=134, 
+    CHANGE_POINT_MULTILINE_COMMENT=135, CHANGE_POINT_WS=136;
   public static final int
     EXPRESSION_MODE=1, EXPLAIN_MODE=2, FROM_MODE=3, PROJECT_MODE=4, RENAME_MODE=5, 
     ENRICH_MODE=6, ENRICH_FIELD_MODE=7, MVEXPAND_MODE=8, SHOW_MODE=9, SETTING_MODE=10, 
-    LOOKUP_MODE=11, LOOKUP_FIELD_MODE=12, JOIN_MODE=13, METRICS_MODE=14, CLOSING_METRICS_MODE=15;
+    LOOKUP_MODE=11, LOOKUP_FIELD_MODE=12, JOIN_MODE=13, METRICS_MODE=14, CLOSING_METRICS_MODE=15, 
+    CHANGE_POINT_MODE=16;
   public static String[] channelNames = {
     "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
   };
@@ -65,45 +67,46 @@ public class EsqlBaseLexer extends LexerConfig {
     "DEFAULT_MODE", "EXPRESSION_MODE", "EXPLAIN_MODE", "FROM_MODE", "PROJECT_MODE", 
     "RENAME_MODE", "ENRICH_MODE", "ENRICH_FIELD_MODE", "MVEXPAND_MODE", "SHOW_MODE", 
     "SETTING_MODE", "LOOKUP_MODE", "LOOKUP_FIELD_MODE", "JOIN_MODE", "METRICS_MODE", 
-    "CLOSING_METRICS_MODE"
+    "CLOSING_METRICS_MODE", "CHANGE_POINT_MODE"
   };
 
   private static String[] makeRuleNames() {
     return new String[] {
       "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "KEEP", 
       "LIMIT", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", "WHERE", 
-      "JOIN_LOOKUP", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_METRICS", "DEV_JOIN_FULL", 
-      "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", 
-      "WS", "PIPE", "DIGIT", "LETTER", "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", 
-      "EXPONENT", "ASPERAND", "BACKQUOTE", "BACKQUOTE_BLOCK", "UNDERSCORE", 
-      "UNQUOTED_ID_BODY", "QUOTED_STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", 
-      "BY", "AND", "ASC", "ASSIGN", "CAST_OP", "COLON", "COMMA", "DESC", "DOT", 
-      "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", "LP", "NOT", "NULL", "NULLS", 
-      "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", "CIEQ", "NEQ", "LT", "LTE", 
-      "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "LEFT_BRACES", 
-      "RIGHT_BRACES", "DOUBLE_PARAMS", "NESTED_WHERE", "NAMED_OR_POSITIONAL_PARAM", 
-      "NAMED_OR_POSITIONAL_DOUBLE_PARAMS", "OPENING_BRACKET", "CLOSING_BRACKET", 
-      "UNQUOTED_IDENTIFIER", "QUOTED_ID", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", 
-      "EXPR_MULTILINE_COMMENT", "EXPR_WS", "EXPLAIN_OPENING_BRACKET", "EXPLAIN_PIPE", 
-      "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", "FROM_PIPE", 
-      "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", "FROM_COLON", "FROM_SELECTOR", 
-      "FROM_COMMA", "FROM_ASSIGN", "METADATA", "UNQUOTED_SOURCE_PART", "UNQUOTED_SOURCE", 
-      "FROM_UNQUOTED_SOURCE", "FROM_QUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", 
-      "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", "PROJECT_PARAM", 
-      "PROJECT_NAMED_OR_POSITIONAL_PARAM", "PROJECT_DOUBLE_PARAMS", "PROJECT_NAMED_OR_POSITIONAL_DOUBLE_PARAMS", 
-      "UNQUOTED_ID_BODY_WITH_PATTERN", "UNQUOTED_ID_PATTERN", "ID_PATTERN", 
-      "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", "RENAME_PIPE", 
-      "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", "RENAME_PARAM", "RENAME_NAMED_OR_POSITIONAL_PARAM", 
-      "RENAME_DOUBLE_PARAMS", "RENAME_NAMED_OR_POSITIONAL_DOUBLE_PARAMS", "AS", 
-      "RENAME_ID_PATTERN", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", 
-      "RENAME_WS", "ENRICH_PIPE", "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", 
-      "ENRICH_POLICY_NAME", "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", 
-      "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", 
-      "ENRICH_FIELD_COMMA", "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", 
-      "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_PARAM", "ENRICH_FIELD_NAMED_OR_POSITIONAL_PARAM", 
-      "ENRICH_FIELD_DOUBLE_PARAMS", "ENRICH_FIELD_NAMED_OR_POSITIONAL_DOUBLE_PARAMS", 
-      "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", 
-      "MVEXPAND_PIPE", "MVEXPAND_DOT", "MVEXPAND_PARAM", "MVEXPAND_NAMED_OR_POSITIONAL_PARAM", 
+      "JOIN_LOOKUP", "CHANGE_POINT", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_METRICS", 
+      "DEV_JOIN_FULL", "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "UNKNOWN_CMD", "LINE_COMMENT", 
+      "MULTILINE_COMMENT", "WS", "PIPE", "DIGIT", "LETTER", "ESCAPE_SEQUENCE", 
+      "UNESCAPED_CHARS", "EXPONENT", "ASPERAND", "BACKQUOTE", "BACKQUOTE_BLOCK", 
+      "UNDERSCORE", "UNQUOTED_ID_BODY", "QUOTED_STRING", "INTEGER_LITERAL", 
+      "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", "COLON", 
+      "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", 
+      "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", 
+      "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", 
+      "SLASH", "PERCENT", "LEFT_BRACES", "RIGHT_BRACES", "DOUBLE_PARAMS", "NESTED_WHERE", 
+      "NAMED_OR_POSITIONAL_PARAM", "NAMED_OR_POSITIONAL_DOUBLE_PARAMS", "OPENING_BRACKET", 
+      "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_ID", "QUOTED_IDENTIFIER", 
+      "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "EXPLAIN_OPENING_BRACKET", 
+      "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", 
+      "FROM_PIPE", "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", "FROM_COLON", 
+      "FROM_SELECTOR", "FROM_COMMA", "FROM_ASSIGN", "METADATA", "UNQUOTED_SOURCE_PART", 
+      "UNQUOTED_SOURCE", "FROM_UNQUOTED_SOURCE", "FROM_QUOTED_SOURCE", "FROM_LINE_COMMENT", 
+      "FROM_MULTILINE_COMMENT", "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", 
+      "PROJECT_PARAM", "PROJECT_NAMED_OR_POSITIONAL_PARAM", "PROJECT_DOUBLE_PARAMS", 
+      "PROJECT_NAMED_OR_POSITIONAL_DOUBLE_PARAMS", "UNQUOTED_ID_BODY_WITH_PATTERN", 
+      "UNQUOTED_ID_PATTERN", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", 
+      "PROJECT_WS", "RENAME_PIPE", "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", 
+      "RENAME_PARAM", "RENAME_NAMED_OR_POSITIONAL_PARAM", "RENAME_DOUBLE_PARAMS", 
+      "RENAME_NAMED_OR_POSITIONAL_DOUBLE_PARAMS", "AS", "RENAME_ID_PATTERN", 
+      "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", "RENAME_WS", "ENRICH_PIPE", 
+      "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", "ENRICH_POLICY_NAME", 
+      "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", 
+      "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", "ENRICH_FIELD_COMMA", 
+      "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", "ENRICH_FIELD_QUOTED_IDENTIFIER", 
+      "ENRICH_FIELD_PARAM", "ENRICH_FIELD_NAMED_OR_POSITIONAL_PARAM", "ENRICH_FIELD_DOUBLE_PARAMS", 
+      "ENRICH_FIELD_NAMED_OR_POSITIONAL_DOUBLE_PARAMS", "ENRICH_FIELD_LINE_COMMENT", 
+      "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_PIPE", 
+      "MVEXPAND_DOT", "MVEXPAND_PARAM", "MVEXPAND_NAMED_OR_POSITIONAL_PARAM", 
       "MVEXPAND_DOUBLE_PARAMS", "MVEXPAND_NAMED_OR_POSITIONAL_DOUBLE_PARAMS", 
       "MVEXPAND_QUOTED_IDENTIFIER", "MVEXPAND_UNQUOTED_IDENTIFIER", "MVEXPAND_LINE_COMMENT", 
       "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", "SHOW_PIPE", "INFO", "SHOW_LINE_COMMENT", 
@@ -121,7 +124,10 @@ public class EsqlBaseLexer extends LexerConfig {
       "METRICS_WS", "CLOSING_METRICS_COLON", "CLOSING_METRICS_SELECTOR", "CLOSING_METRICS_COMMA", 
       "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", 
       "CLOSING_METRICS_WS", "CLOSING_METRICS_QUOTED_IDENTIFIER", "CLOSING_METRICS_UNQUOTED_IDENTIFIER", 
-      "CLOSING_METRICS_BY", "CLOSING_METRICS_PIPE"
+      "CLOSING_METRICS_BY", "CLOSING_METRICS_PIPE", "CHANGE_POINT_PIPE", "CHANGE_POINT_ON", 
+      "CHANGE_POINT_AS", "CHANGE_POINT_DOT", "CHANGE_POINT_COMMA", "CHANGE_POINT_QUOTED_IDENTIFIER", 
+      "CHANGE_POINT_UNQUOTED_IDENTIFIER", "CHANGE_POINT_LINE_COMMENT", "CHANGE_POINT_MULTILINE_COMMENT", 
+      "CHANGE_POINT_WS"
     };
   }
   public static final String[] ruleNames = makeRuleNames();
@@ -130,17 +136,18 @@ public class EsqlBaseLexer extends LexerConfig {
     return new String[] {
       null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", "'from'", 
       "'grok'", "'keep'", "'limit'", "'mv_expand'", "'rename'", "'row'", "'show'", 
-      "'sort'", "'stats'", "'where'", "'lookup'", null, null, null, null, null, 
-      null, null, null, null, null, "'|'", null, null, null, "'by'", "'and'", 
-      "'asc'", "'='", "'::'", "':'", "','", "'desc'", "'.'", "'false'", "'first'", 
-      "'in'", "'is'", "'last'", "'like'", "'('", "'not'", "'null'", "'nulls'", 
-      "'or'", "'?'", "'rlike'", "')'", "'true'", "'=='", "'=~'", "'!='", "'<'", 
-      "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", 
-      "'??'", null, null, null, "']'", null, null, null, null, null, null, 
-      null, null, "'metadata'", null, null, null, null, null, null, null, null, 
-      "'as'", null, null, null, "'on'", "'with'", null, null, null, null, null, 
-      null, null, null, null, null, "'info'", null, null, null, null, null, 
-      null, null, null, null, null, null, null, null, "'join'", "'USING'"
+      "'sort'", "'stats'", "'where'", "'lookup'", "'change_point'", null, null, 
+      null, null, null, null, null, null, null, null, "'|'", null, null, null, 
+      "'by'", "'and'", "'asc'", "'='", "'::'", "':'", "','", "'desc'", "'.'", 
+      "'false'", "'first'", "'in'", "'is'", "'last'", "'like'", "'('", "'not'", 
+      "'null'", "'nulls'", "'or'", "'?'", "'rlike'", "')'", "'true'", "'=='", 
+      "'=~'", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", 
+      "'%'", "'{'", "'}'", "'??'", null, null, null, "']'", null, null, null, 
+      null, null, null, null, null, "'metadata'", null, null, null, null, null, 
+      null, null, null, "'as'", null, null, null, "'on'", "'with'", null, null, 
+      null, null, null, null, null, null, null, null, "'info'", null, null, 
+      null, null, null, null, null, null, null, null, null, null, null, "'join'", 
+      "'USING'"
     };
   }
   private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -148,9 +155,9 @@ public class EsqlBaseLexer extends LexerConfig {
     return new String[] {
       null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", 
       "KEEP", "LIMIT", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", 
-      "WHERE", "JOIN_LOOKUP", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_METRICS", 
-      "DEV_JOIN_FULL", "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "UNKNOWN_CMD", "LINE_COMMENT", 
-      "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", "INTEGER_LITERAL", 
+      "WHERE", "JOIN_LOOKUP", "CHANGE_POINT", "DEV_INLINESTATS", "DEV_LOOKUP", 
+      "DEV_METRICS", "DEV_JOIN_FULL", "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "UNKNOWN_CMD", 
+      "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", "INTEGER_LITERAL", 
       "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", "COLON", 
       "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", 
       "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", 
@@ -172,7 +179,8 @@ public class EsqlBaseLexer extends LexerConfig {
       "LOOKUP_FIELD_WS", "JOIN", "USING", "JOIN_LINE_COMMENT", "JOIN_MULTILINE_COMMENT", 
       "JOIN_WS", "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", "METRICS_WS", 
       "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", 
-      "CLOSING_METRICS_WS"
+      "CLOSING_METRICS_WS", "CHANGE_POINT_LINE_COMMENT", "CHANGE_POINT_MULTILINE_COMMENT", 
+      "CHANGE_POINT_WS"
     };
   }
   private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -237,19 +245,19 @@ public class EsqlBaseLexer extends LexerConfig {
   @Override
   public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
     switch (ruleIndex) {
-    case 17:
-      return DEV_INLINESTATS_sempred((RuleContext)_localctx, predIndex);
     case 18:
-      return DEV_LOOKUP_sempred((RuleContext)_localctx, predIndex);
+      return DEV_INLINESTATS_sempred((RuleContext)_localctx, predIndex);
     case 19:
-      return DEV_METRICS_sempred((RuleContext)_localctx, predIndex);
+      return DEV_LOOKUP_sempred((RuleContext)_localctx, predIndex);
     case 20:
-      return DEV_JOIN_FULL_sempred((RuleContext)_localctx, predIndex);
+      return DEV_METRICS_sempred((RuleContext)_localctx, predIndex);
     case 21:
-      return DEV_JOIN_LEFT_sempred((RuleContext)_localctx, predIndex);
+      return DEV_JOIN_FULL_sempred((RuleContext)_localctx, predIndex);
     case 22:
+      return DEV_JOIN_LEFT_sempred((RuleContext)_localctx, predIndex);
+    case 23:
       return DEV_JOIN_RIGHT_sempred((RuleContext)_localctx, predIndex);
-    case 100:
+    case 101:
       return FROM_SELECTOR_sempred((RuleContext)_localctx, predIndex);
     }
     return true;
@@ -305,1117 +313,1167 @@ public class EsqlBaseLexer extends LexerConfig {
   }
 
   public static final String _serializedATN =
-    "\u0004\u0000\u0084\u06a2\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+
+    "\u0004\u0000\u0088\u06f1\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/\u00020\u00070\u00021\u0007"+
-    "1\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u0007"+
-    "6\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\u0002D\u0007D\u0002E\u0007"+
-    "E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007I\u0002J\u0007"+
-    "J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007N\u0002O\u0007"+
-    "O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007S\u0002T\u0007"+
-    "T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007X\u0002Y\u0007"+
-    "Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007]\u0002^\u0007"+
-    "^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007b\u0002c\u0007"+
-    "c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007g\u0002h\u0007"+
-    "h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007l\u0002m\u0007"+
-    "m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002q\u0007q\u0002r\u0007"+
-    "r\u0002s\u0007s\u0002t\u0007t\u0002u\u0007u\u0002v\u0007v\u0002w\u0007"+
-    "w\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\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+
-    "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+
-    "\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
-    "\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+
-    "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\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\u0004\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"+
-    "\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\b"+
-    "\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\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\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+
-    "\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+
-    "\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+
-    "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+
-    "\u000e\u0001\u000e\u0001\u000f\u0001\u000f\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"+
-    "\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\u0012\u0001"+
-    "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001"+
-    "\u0013\u0001\u0013\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\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+
-    "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0004\u0017\u02a5"+
-    "\b\u0017\u000b\u0017\f\u0017\u02a6\u0001\u0017\u0001\u0017\u0001\u0018"+
-    "\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u02af\b\u0018\n\u0018"+
-    "\f\u0018\u02b2\t\u0018\u0001\u0018\u0003\u0018\u02b5\b\u0018\u0001\u0018"+
-    "\u0003\u0018\u02b8\b\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019"+
-    "\u0001\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u02c1\b\u0019\n\u0019"+
-    "\f\u0019\u02c4\t\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+
-    "\u0001\u0019\u0001\u001a\u0004\u001a\u02cc\b\u001a\u000b\u001a\f\u001a"+
-    "\u02cd\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+
-    "\u001b\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001e\u0001"+
-    "\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001 \u0001 \u0003 \u02e1"+
-    "\b \u0001 \u0004 \u02e4\b \u000b \f \u02e5\u0001!\u0001!\u0001\"\u0001"+
-    "\"\u0001#\u0001#\u0001#\u0003#\u02ef\b#\u0001$\u0001$\u0001%\u0001%\u0001"+
-    "%\u0003%\u02f6\b%\u0001&\u0001&\u0001&\u0005&\u02fb\b&\n&\f&\u02fe\t&"+
-    "\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0005&\u0306\b&\n&\f&\u0309"+
-    "\t&\u0001&\u0001&\u0001&\u0001&\u0001&\u0003&\u0310\b&\u0001&\u0003&\u0313"+
-    "\b&\u0003&\u0315\b&\u0001\'\u0004\'\u0318\b\'\u000b\'\f\'\u0319\u0001"+
-    "(\u0004(\u031d\b(\u000b(\f(\u031e\u0001(\u0001(\u0005(\u0323\b(\n(\f("+
-    "\u0326\t(\u0001(\u0001(\u0004(\u032a\b(\u000b(\f(\u032b\u0001(\u0004("+
-    "\u032f\b(\u000b(\f(\u0330\u0001(\u0001(\u0005(\u0335\b(\n(\f(\u0338\t"+
-    "(\u0003(\u033a\b(\u0001(\u0001(\u0001(\u0001(\u0004(\u0340\b(\u000b(\f"+
-    "(\u0341\u0001(\u0001(\u0003(\u0346\b(\u0001)\u0001)\u0001)\u0001*\u0001"+
-    "*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001-\u0001"+
-    "-\u0001-\u0001.\u0001.\u0001/\u0001/\u00010\u00010\u00010\u00010\u0001"+
-    "0\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u00012\u00013\u0001"+
-    "3\u00013\u00013\u00013\u00013\u00014\u00014\u00014\u00015\u00015\u0001"+
-    "5\u00016\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u00017\u0001"+
-    "7\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@\u0001A\u0001A\u0001A\u0001B\u0001"+
-    "B\u0001B\u0001C\u0001C\u0001C\u0001D\u0001D\u0001E\u0001E\u0001E\u0001"+
-    "F\u0001F\u0001G\u0001G\u0001G\u0001H\u0001H\u0001I\u0001I\u0001J\u0001"+
-    "J\u0001K\u0001K\u0001L\u0001L\u0001M\u0001M\u0001N\u0001N\u0001O\u0001"+
-    "O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0003Q\u03cd"+
-    "\bQ\u0001Q\u0005Q\u03d0\bQ\nQ\fQ\u03d3\tQ\u0001Q\u0001Q\u0004Q\u03d7\b"+
-    "Q\u000bQ\fQ\u03d8\u0003Q\u03db\bQ\u0001R\u0001R\u0001R\u0003R\u03e0\b"+
-    "R\u0001R\u0005R\u03e3\bR\nR\fR\u03e6\tR\u0001R\u0001R\u0004R\u03ea\bR"+
-    "\u000bR\fR\u03eb\u0003R\u03ee\bR\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+
-    "T\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0005U\u03fc\bU\nU\fU\u03ff"+
-    "\tU\u0001U\u0001U\u0003U\u0403\bU\u0001U\u0004U\u0406\bU\u000bU\fU\u0407"+
-    "\u0003U\u040a\bU\u0001V\u0001V\u0004V\u040e\bV\u000bV\fV\u040f\u0001V"+
-    "\u0001V\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001"+
+    "\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\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000"+
+    "\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000"+
+    "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
+    "\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+
+    "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\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\u0004\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\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\b\u0001"+
+    "\t\u0001\t\u0001\t\u0001\t\u0001\t\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\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+
+    "\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+
+    "\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e"+
+    "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+
+    "\u0001\u000e\u0001\u000f\u0001\u000f\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\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\u0012\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\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\u0014\u0001\u0014\u0001\u0014\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\u0017\u0001\u0017\u0001\u0017"+
+    "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+
+    "\u0001\u0018\u0004\u0018\u02cb\b\u0018\u000b\u0018\f\u0018\u02cc\u0001"+
+    "\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0005"+
+    "\u0019\u02d5\b\u0019\n\u0019\f\u0019\u02d8\t\u0019\u0001\u0019\u0003\u0019"+
+    "\u02db\b\u0019\u0001\u0019\u0003\u0019\u02de\b\u0019\u0001\u0019\u0001"+
+    "\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0005"+
+    "\u001a\u02e7\b\u001a\n\u001a\f\u001a\u02ea\t\u001a\u0001\u001a\u0001\u001a"+
+    "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0004\u001b\u02f2\b\u001b"+
+    "\u000b\u001b\f\u001b\u02f3\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c"+
+    "\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e"+
+    "\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001!\u0001!\u0003"+
+    "!\u0307\b!\u0001!\u0004!\u030a\b!\u000b!\f!\u030b\u0001\"\u0001\"\u0001"+
+    "#\u0001#\u0001$\u0001$\u0001$\u0003$\u0315\b$\u0001%\u0001%\u0001&\u0001"+
+    "&\u0001&\u0003&\u031c\b&\u0001\'\u0001\'\u0001\'\u0005\'\u0321\b\'\n\'"+
+    "\f\'\u0324\t\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0005\'"+
+    "\u032c\b\'\n\'\f\'\u032f\t\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0003"+
+    "\'\u0336\b\'\u0001\'\u0003\'\u0339\b\'\u0003\'\u033b\b\'\u0001(\u0004"+
+    "(\u033e\b(\u000b(\f(\u033f\u0001)\u0004)\u0343\b)\u000b)\f)\u0344\u0001"+
+    ")\u0001)\u0005)\u0349\b)\n)\f)\u034c\t)\u0001)\u0001)\u0004)\u0350\b)"+
+    "\u000b)\f)\u0351\u0001)\u0004)\u0355\b)\u000b)\f)\u0356\u0001)\u0001)"+
+    "\u0005)\u035b\b)\n)\f)\u035e\t)\u0003)\u0360\b)\u0001)\u0001)\u0001)\u0001"+
+    ")\u0004)\u0366\b)\u000b)\f)\u0367\u0001)\u0001)\u0003)\u036c\b)\u0001"+
+    "*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001"+
+    ",\u0001-\u0001-\u0001.\u0001.\u0001.\u0001/\u0001/\u00010\u00010\u0001"+
+    "1\u00011\u00011\u00011\u00011\u00012\u00012\u00013\u00013\u00013\u0001"+
+    "3\u00013\u00013\u00014\u00014\u00014\u00014\u00014\u00014\u00015\u0001"+
+    "5\u00015\u00016\u00016\u00016\u00017\u00017\u00017\u00017\u00017\u0001"+
+    "8\u00018\u00018\u00018\u00018\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@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+
+    "B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001E\u0001"+
+    "E\u0001F\u0001F\u0001F\u0001G\u0001G\u0001H\u0001H\u0001H\u0001I\u0001"+
+    "I\u0001J\u0001J\u0001K\u0001K\u0001L\u0001L\u0001M\u0001M\u0001N\u0001"+
+    "N\u0001O\u0001O\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+
+    "R\u0001R\u0001R\u0003R\u03f3\bR\u0001R\u0005R\u03f6\bR\nR\fR\u03f9\tR"+
+    "\u0001R\u0001R\u0004R\u03fd\bR\u000bR\fR\u03fe\u0003R\u0401\bR\u0001S"+
+    "\u0001S\u0001S\u0003S\u0406\bS\u0001S\u0005S\u0409\bS\nS\fS\u040c\tS\u0001"+
+    "S\u0001S\u0004S\u0410\bS\u000bS\fS\u0411\u0003S\u0414\bS\u0001T\u0001"+
+    "T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001V\u0001"+
+    "V\u0005V\u0422\bV\nV\fV\u0425\tV\u0001V\u0001V\u0003V\u0429\bV\u0001V"+
+    "\u0004V\u042c\bV\u000bV\fV\u042d\u0003V\u0430\bV\u0001W\u0001W\u0004W"+
+    "\u0434\bW\u000bW\fW\u0435\u0001W\u0001W\u0001X\u0001X\u0001Y\u0001Y\u0001"+
     "Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\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`\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001"+
+    "`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001"+
     "b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001"+
-    "d\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001g\u0001"+
-    "g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001"+
-    "h\u0003h\u0462\bh\u0001i\u0004i\u0465\bi\u000bi\fi\u0466\u0001j\u0001"+
-    "j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001l\u0001l\u0001l\u0001"+
-    "l\u0001m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001o\u0001"+
-    "o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001q\u0001q\u0001"+
-    "q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001"+
-    "t\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001"+
-    "v\u0001v\u0003v\u049e\bv\u0001w\u0001w\u0003w\u04a2\bw\u0001w\u0005w\u04a5"+
-    "\bw\nw\fw\u04a8\tw\u0001w\u0001w\u0003w\u04ac\bw\u0001w\u0004w\u04af\b"+
-    "w\u000bw\fw\u04b0\u0003w\u04b3\bw\u0001x\u0001x\u0004x\u04b7\bx\u000b"+
-    "x\fx\u04b8\u0001y\u0001y\u0001y\u0001y\u0001z\u0001z\u0001z\u0001z\u0001"+
-    "{\u0001{\u0001{\u0001{\u0001|\u0001|\u0001|\u0001|\u0001|\u0001}\u0001"+
-    "}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001"+
-    "\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001"+
-    "\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001"+
-    "\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001"+
-    "\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001"+
-    "\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087\u0001"+
-    "\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088\u0001"+
-    "\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\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\u008c\u0001\u008c\u0001\u008d\u0001"+
-    "\u008d\u0001\u008e\u0004\u008e\u0514\b\u008e\u000b\u008e\f\u008e\u0515"+
-    "\u0001\u008e\u0001\u008e\u0003\u008e\u051a\b\u008e\u0001\u008e\u0004\u008e"+
-    "\u051d\b\u008e\u000b\u008e\f\u008e\u051e\u0001\u008f\u0001\u008f\u0001"+
-    "\u008f\u0001\u008f\u0001\u0090\u0001\u0090\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"+
-    "\u0093\u0001\u0093\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\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001"+
-    "\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001"+
-    "\u009c\u0001\u009c\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\u00a1\u0001\u00a2\u0001"+
-    "\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+
-    "\u00a3\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\u00a9\u0001\u00a9\u0001\u00a9\u0001"+
-    "\u00a9\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\u00ac\u0001\u00ad\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\u00b3\u0001\u00b3\u0001"+
-    "\u00b3\u0001\u00b3\u0001\u00b3\u0004\u00b3\u05bc\b\u00b3\u000b\u00b3\f"+
-    "\u00b3\u05bd\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\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\u00bb\u0001\u00bc"+
-    "\u0001\u00bc\u0001\u00bc\u0001\u00bc\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\u00c1\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\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8"+
-    "\u0001\u00c9\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\u00cb\u0001\u00cb\u0001\u00cc\u0001\u00cc\u0001\u00cc"+
-    "\u0001\u00cc\u0001\u00cc\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\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\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6"+
-    "\u0001\u00d6\u0001\u00d7\u0001\u00d7\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\u00db"+
-    "\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc"+
-    "\u0001\u00dc\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd"+
-    "\u0001\u00dd\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\u00e1"+
-    "\u0001\u00e1\u0001\u00e2\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\u00e4"+
-    "\u0002\u02c2\u0307\u0000\u00e5\u0010\u0001\u0012\u0002\u0014\u0003\u0016"+
-    "\u0004\u0018\u0005\u001a\u0006\u001c\u0007\u001e\b \t\"\n$\u000b&\f(\r"+
-    "*\u000e,\u000f.\u00100\u00112\u00124\u00136\u00148\u0015:\u0016<\u0017"+
-    ">\u0018@\u0019B\u001aD\u001bF\u001cH\u0000J\u0000L\u0000N\u0000P\u0000"+
-    "R\u0000T\u0000V\u0000X\u0000Z\u0000\\\u001d^\u001e`\u001fb d!f\"h#j$l"+
-    "%n&p\'r(t)v*x+z,|-~.\u0080/\u00820\u00841\u00862\u00883\u008a4\u008c5"+
-    "\u008e6\u00907\u00928\u00949\u0096:\u0098;\u009a<\u009c=\u009e>\u00a0"+
-    "?\u00a2@\u00a4A\u00a6B\u00a8C\u00aaD\u00acE\u00aeF\u00b0\u0000\u00b2G"+
-    "\u00b4H\u00b6I\u00b8J\u00baK\u00bc\u0000\u00beL\u00c0M\u00c2N\u00c4O\u00c6"+
-    "\u0000\u00c8\u0000\u00caP\u00ccQ\u00ceR\u00d0\u0000\u00d2\u0000\u00d4"+
-    "\u0000\u00d6\u0000\u00d8\u0000\u00da\u0000\u00dc\u0000\u00deS\u00e0\u0000"+
-    "\u00e2T\u00e4\u0000\u00e6\u0000\u00e8U\u00eaV\u00ecW\u00ee\u0000\u00f0"+
-    "\u0000\u00f2\u0000\u00f4\u0000\u00f6\u0000\u00f8\u0000\u00fa\u0000\u00fc"+
-    "\u0000\u00fe\u0000\u0100X\u0102Y\u0104Z\u0106[\u0108\u0000\u010a\u0000"+
-    "\u010c\u0000\u010e\u0000\u0110\u0000\u0112\u0000\u0114\u0000\u0116\u0000"+
-    "\u0118\\\u011a\u0000\u011c]\u011e^\u0120_\u0122\u0000\u0124\u0000\u0126"+
-    "`\u0128a\u012a\u0000\u012cb\u012e\u0000\u0130c\u0132d\u0134e\u0136\u0000"+
-    "\u0138\u0000\u013a\u0000\u013c\u0000\u013e\u0000\u0140\u0000\u0142\u0000"+
-    "\u0144\u0000\u0146\u0000\u0148\u0000\u014a\u0000\u014cf\u014eg\u0150h"+
-    "\u0152\u0000\u0154\u0000\u0156\u0000\u0158\u0000\u015a\u0000\u015c\u0000"+
-    "\u015e\u0000\u0160\u0000\u0162i\u0164j\u0166k\u0168\u0000\u016al\u016c"+
-    "m\u016en\u0170o\u0172\u0000\u0174\u0000\u0176p\u0178q\u017ar\u017cs\u017e"+
-    "\u0000\u0180\u0000\u0182\u0000\u0184\u0000\u0186\u0000\u0188\u0000\u018a"+
-    "\u0000\u018ct\u018eu\u0190v\u0192\u0000\u0194\u0000\u0196\u0000\u0198"+
-    "\u0000\u019aw\u019cx\u019ey\u01a0\u0000\u01a2z\u01a4\u0000\u01a6\u0000"+
-    "\u01a8{\u01aa\u0000\u01ac\u0000\u01ae\u0000\u01b0\u0000\u01b2\u0000\u01b4"+
-    "|\u01b6}\u01b8~\u01ba\u0000\u01bc\u0000\u01be\u0000\u01c0\u007f\u01c2"+
-    "\u0080\u01c4\u0081\u01c6\u0000\u01c8\u0000\u01ca\u0000\u01cc\u0082\u01ce"+
-    "\u0083\u01d0\u0084\u01d2\u0000\u01d4\u0000\u01d6\u0000\u01d8\u0000\u0010"+
-    "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e"+
-    "\u000f$\u0002\u0000DDdd\u0002\u0000IIii\u0002\u0000SSss\u0002\u0000EE"+
-    "ee\u0002\u0000CCcc\u0002\u0000TTtt\u0002\u0000RRrr\u0002\u0000OOoo\u0002"+
-    "\u0000PPpp\u0002\u0000NNnn\u0002\u0000HHhh\u0002\u0000VVvv\u0002\u0000"+
-    "AAaa\u0002\u0000LLll\u0002\u0000XXxx\u0002\u0000FFff\u0002\u0000MMmm\u0002"+
-    "\u0000GGgg\u0002\u0000KKkk\u0002\u0000WWww\u0002\u0000UUuu\u0006\u0000"+
-    "\t\n\r\r  //[[]]\u0002\u0000\n\n\r\r\u0003\u0000\t\n\r\r  \u0001\u0000"+
-    "09\u0002\u0000AZaz\b\u0000\"\"NNRRTT\\\\nnrrtt\u0004\u0000\n\n\r\r\"\""+
-    "\\\\\u0002\u0000++--\u0001\u0000``\u0002\u0000BBbb\u0002\u0000YYyy\u000b"+
-    "\u0000\t\n\r\r  \"\",,//::==[[]]||\u0002\u0000**//\u000b\u0000\t\n\r\r"+
-    "  \"#,,//::<<>?\\\\||\u0002\u0000JJjj\u06c1\u0000\u0010\u0001\u0000\u0000"+
-    "\u0000\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\u0000"+
-    "4\u0001\u0000\u0000\u0000\u00006\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\u0000"+
-    "B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0001F\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\u0001t\u0001\u0000\u0000\u0000\u0001v"+
-    "\u0001\u0000\u0000\u0000\u0001x\u0001\u0000\u0000\u0000\u0001z\u0001\u0000"+
-    "\u0000\u0000\u0001|\u0001\u0000\u0000\u0000\u0001~\u0001\u0000\u0000\u0000"+
-    "\u0001\u0080\u0001\u0000\u0000\u0000\u0001\u0082\u0001\u0000\u0000\u0000"+
-    "\u0001\u0084\u0001\u0000\u0000\u0000\u0001\u0086\u0001\u0000\u0000\u0000"+
-    "\u0001\u0088\u0001\u0000\u0000\u0000\u0001\u008a\u0001\u0000\u0000\u0000"+
-    "\u0001\u008c\u0001\u0000\u0000\u0000\u0001\u008e\u0001\u0000\u0000\u0000"+
-    "\u0001\u0090\u0001\u0000\u0000\u0000\u0001\u0092\u0001\u0000\u0000\u0000"+
-    "\u0001\u0094\u0001\u0000\u0000\u0000\u0001\u0096\u0001\u0000\u0000\u0000"+
-    "\u0001\u0098\u0001\u0000\u0000\u0000\u0001\u009a\u0001\u0000\u0000\u0000"+
-    "\u0001\u009c\u0001\u0000\u0000\u0000\u0001\u009e\u0001\u0000\u0000\u0000"+
-    "\u0001\u00a0\u0001\u0000\u0000\u0000\u0001\u00a2\u0001\u0000\u0000\u0000"+
-    "\u0001\u00a4\u0001\u0000\u0000\u0000\u0001\u00a6\u0001\u0000\u0000\u0000"+
-    "\u0001\u00a8\u0001\u0000\u0000\u0000\u0001\u00aa\u0001\u0000\u0000\u0000"+
-    "\u0001\u00ac\u0001\u0000\u0000\u0000\u0001\u00ae\u0001\u0000\u0000\u0000"+
-    "\u0001\u00b0\u0001\u0000\u0000\u0000\u0001\u00b2\u0001\u0000\u0000\u0000"+
-    "\u0001\u00b4\u0001\u0000\u0000\u0000\u0001\u00b6\u0001\u0000\u0000\u0000"+
-    "\u0001\u00b8\u0001\u0000\u0000\u0000\u0001\u00ba\u0001\u0000\u0000\u0000"+
-    "\u0001\u00be\u0001\u0000\u0000\u0000\u0001\u00c0\u0001\u0000\u0000\u0000"+
-    "\u0001\u00c2\u0001\u0000\u0000\u0000\u0001\u00c4\u0001\u0000\u0000\u0000"+
-    "\u0002\u00c6\u0001\u0000\u0000\u0000\u0002\u00c8\u0001\u0000\u0000\u0000"+
-    "\u0002\u00ca\u0001\u0000\u0000\u0000\u0002\u00cc\u0001\u0000\u0000\u0000"+
-    "\u0002\u00ce\u0001\u0000\u0000\u0000\u0003\u00d0\u0001\u0000\u0000\u0000"+
-    "\u0003\u00d2\u0001\u0000\u0000\u0000\u0003\u00d4\u0001\u0000\u0000\u0000"+
-    "\u0003\u00d6\u0001\u0000\u0000\u0000\u0003\u00d8\u0001\u0000\u0000\u0000"+
-    "\u0003\u00da\u0001\u0000\u0000\u0000\u0003\u00dc\u0001\u0000\u0000\u0000"+
-    "\u0003\u00de\u0001\u0000\u0000\u0000\u0003\u00e2\u0001\u0000\u0000\u0000"+
-    "\u0003\u00e4\u0001\u0000\u0000\u0000\u0003\u00e6\u0001\u0000\u0000\u0000"+
-    "\u0003\u00e8\u0001\u0000\u0000\u0000\u0003\u00ea\u0001\u0000\u0000\u0000"+
-    "\u0003\u00ec\u0001\u0000\u0000\u0000\u0004\u00ee\u0001\u0000\u0000\u0000"+
-    "\u0004\u00f0\u0001\u0000\u0000\u0000\u0004\u00f2\u0001\u0000\u0000\u0000"+
-    "\u0004\u00f4\u0001\u0000\u0000\u0000\u0004\u00f6\u0001\u0000\u0000\u0000"+
-    "\u0004\u00f8\u0001\u0000\u0000\u0000\u0004\u00fa\u0001\u0000\u0000\u0000"+
-    "\u0004\u0100\u0001\u0000\u0000\u0000\u0004\u0102\u0001\u0000\u0000\u0000"+
-    "\u0004\u0104\u0001\u0000\u0000\u0000\u0004\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\u0006\u0122\u0001\u0000\u0000\u0000"+
-    "\u0006\u0124\u0001\u0000\u0000\u0000\u0006\u0126\u0001\u0000\u0000\u0000"+
-    "\u0006\u0128\u0001\u0000\u0000\u0000\u0006\u012c\u0001\u0000\u0000\u0000"+
-    "\u0006\u012e\u0001\u0000\u0000\u0000\u0006\u0130\u0001\u0000\u0000\u0000"+
-    "\u0006\u0132\u0001\u0000\u0000\u0000\u0006\u0134\u0001\u0000\u0000\u0000"+
-    "\u0007\u0136\u0001\u0000\u0000\u0000\u0007\u0138\u0001\u0000\u0000\u0000"+
-    "\u0007\u013a\u0001\u0000\u0000\u0000\u0007\u013c\u0001\u0000\u0000\u0000"+
-    "\u0007\u013e\u0001\u0000\u0000\u0000\u0007\u0140\u0001\u0000\u0000\u0000"+
-    "\u0007\u0142\u0001\u0000\u0000\u0000\u0007\u0144\u0001\u0000\u0000\u0000"+
-    "\u0007\u0146\u0001\u0000\u0000\u0000\u0007\u0148\u0001\u0000\u0000\u0000"+
-    "\u0007\u014a\u0001\u0000\u0000\u0000\u0007\u014c\u0001\u0000\u0000\u0000"+
-    "\u0007\u014e\u0001\u0000\u0000\u0000\u0007\u0150\u0001\u0000\u0000\u0000"+
-    "\b\u0152\u0001\u0000\u0000\u0000\b\u0154\u0001\u0000\u0000\u0000\b\u0156"+
-    "\u0001\u0000\u0000\u0000\b\u0158\u0001\u0000\u0000\u0000\b\u015a\u0001"+
-    "\u0000\u0000\u0000\b\u015c\u0001\u0000\u0000\u0000\b\u015e\u0001\u0000"+
-    "\u0000\u0000\b\u0160\u0001\u0000\u0000\u0000\b\u0162\u0001\u0000\u0000"+
-    "\u0000\b\u0164\u0001\u0000\u0000\u0000\b\u0166\u0001\u0000\u0000\u0000"+
-    "\t\u0168\u0001\u0000\u0000\u0000\t\u016a\u0001\u0000\u0000\u0000\t\u016c"+
-    "\u0001\u0000\u0000\u0000\t\u016e\u0001\u0000\u0000\u0000\t\u0170\u0001"+
-    "\u0000\u0000\u0000\n\u0172\u0001\u0000\u0000\u0000\n\u0174\u0001\u0000"+
-    "\u0000\u0000\n\u0176\u0001\u0000\u0000\u0000\n\u0178\u0001\u0000\u0000"+
-    "\u0000\n\u017a\u0001\u0000\u0000\u0000\n\u017c\u0001\u0000\u0000\u0000"+
-    "\u000b\u017e\u0001\u0000\u0000\u0000\u000b\u0180\u0001\u0000\u0000\u0000"+
-    "\u000b\u0182\u0001\u0000\u0000\u0000\u000b\u0184\u0001\u0000\u0000\u0000"+
-    "\u000b\u0186\u0001\u0000\u0000\u0000\u000b\u0188\u0001\u0000\u0000\u0000"+
-    "\u000b\u018a\u0001\u0000\u0000\u0000\u000b\u018c\u0001\u0000\u0000\u0000"+
-    "\u000b\u018e\u0001\u0000\u0000\u0000\u000b\u0190\u0001\u0000\u0000\u0000"+
-    "\f\u0192\u0001\u0000\u0000\u0000\f\u0194\u0001\u0000\u0000\u0000\f\u0196"+
-    "\u0001\u0000\u0000\u0000\f\u0198\u0001\u0000\u0000\u0000\f\u019a\u0001"+
-    "\u0000\u0000\u0000\f\u019c\u0001\u0000\u0000\u0000\f\u019e\u0001\u0000"+
-    "\u0000\u0000\r\u01a0\u0001\u0000\u0000\u0000\r\u01a2\u0001\u0000\u0000"+
-    "\u0000\r\u01a4\u0001\u0000\u0000\u0000\r\u01a6\u0001\u0000\u0000\u0000"+
-    "\r\u01a8\u0001\u0000\u0000\u0000\r\u01aa\u0001\u0000\u0000\u0000\r\u01ac"+
-    "\u0001\u0000\u0000\u0000\r\u01ae\u0001\u0000\u0000\u0000\r\u01b0\u0001"+
-    "\u0000\u0000\u0000\r\u01b2\u0001\u0000\u0000\u0000\r\u01b4\u0001\u0000"+
-    "\u0000\u0000\r\u01b6\u0001\u0000\u0000\u0000\r\u01b8\u0001\u0000\u0000"+
-    "\u0000\u000e\u01ba\u0001\u0000\u0000\u0000\u000e\u01bc\u0001\u0000\u0000"+
-    "\u0000\u000e\u01be\u0001\u0000\u0000\u0000\u000e\u01c0\u0001\u0000\u0000"+
-    "\u0000\u000e\u01c2\u0001\u0000\u0000\u0000\u000e\u01c4\u0001\u0000\u0000"+
-    "\u0000\u000f\u01c6\u0001\u0000\u0000\u0000\u000f\u01c8\u0001\u0000\u0000"+
-    "\u0000\u000f\u01ca\u0001\u0000\u0000\u0000\u000f\u01cc\u0001\u0000\u0000"+
-    "\u0000\u000f\u01ce\u0001\u0000\u0000\u0000\u000f\u01d0\u0001\u0000\u0000"+
-    "\u0000\u000f\u01d2\u0001\u0000\u0000\u0000\u000f\u01d4\u0001\u0000\u0000"+
-    "\u0000\u000f\u01d6\u0001\u0000\u0000\u0000\u000f\u01d8\u0001\u0000\u0000"+
-    "\u0000\u0010\u01da\u0001\u0000\u0000\u0000\u0012\u01e4\u0001\u0000\u0000"+
-    "\u0000\u0014\u01eb\u0001\u0000\u0000\u0000\u0016\u01f4\u0001\u0000\u0000"+
-    "\u0000\u0018\u01fb\u0001\u0000\u0000\u0000\u001a\u0205\u0001\u0000\u0000"+
-    "\u0000\u001c\u020c\u0001\u0000\u0000\u0000\u001e\u0213\u0001\u0000\u0000"+
-    "\u0000 \u021a\u0001\u0000\u0000\u0000\"\u0222\u0001\u0000\u0000\u0000"+
-    "$\u022e\u0001\u0000\u0000\u0000&\u0237\u0001\u0000\u0000\u0000(\u023d"+
-    "\u0001\u0000\u0000\u0000*\u0244\u0001\u0000\u0000\u0000,\u024b\u0001\u0000"+
-    "\u0000\u0000.\u0253\u0001\u0000\u0000\u00000\u025b\u0001\u0000\u0000\u0000"+
-    "2\u0264\u0001\u0000\u0000\u00004\u0273\u0001\u0000\u0000\u00006\u027f"+
-    "\u0001\u0000\u0000\u00008\u028a\u0001\u0000\u0000\u0000:\u0292\u0001\u0000"+
-    "\u0000\u0000<\u029a\u0001\u0000\u0000\u0000>\u02a4\u0001\u0000\u0000\u0000"+
-    "@\u02aa\u0001\u0000\u0000\u0000B\u02bb\u0001\u0000\u0000\u0000D\u02cb"+
-    "\u0001\u0000\u0000\u0000F\u02d1\u0001\u0000\u0000\u0000H\u02d5\u0001\u0000"+
-    "\u0000\u0000J\u02d7\u0001\u0000\u0000\u0000L\u02d9\u0001\u0000\u0000\u0000"+
-    "N\u02dc\u0001\u0000\u0000\u0000P\u02de\u0001\u0000\u0000\u0000R\u02e7"+
-    "\u0001\u0000\u0000\u0000T\u02e9\u0001\u0000\u0000\u0000V\u02ee\u0001\u0000"+
-    "\u0000\u0000X\u02f0\u0001\u0000\u0000\u0000Z\u02f5\u0001\u0000\u0000\u0000"+
-    "\\\u0314\u0001\u0000\u0000\u0000^\u0317\u0001\u0000\u0000\u0000`\u0345"+
-    "\u0001\u0000\u0000\u0000b\u0347\u0001\u0000\u0000\u0000d\u034a\u0001\u0000"+
-    "\u0000\u0000f\u034e\u0001\u0000\u0000\u0000h\u0352\u0001\u0000\u0000\u0000"+
-    "j\u0354\u0001\u0000\u0000\u0000l\u0357\u0001\u0000\u0000\u0000n\u0359"+
-    "\u0001\u0000\u0000\u0000p\u035b\u0001\u0000\u0000\u0000r\u0360\u0001\u0000"+
-    "\u0000\u0000t\u0362\u0001\u0000\u0000\u0000v\u0368\u0001\u0000\u0000\u0000"+
-    "x\u036e\u0001\u0000\u0000\u0000z\u0371\u0001\u0000\u0000\u0000|\u0374"+
-    "\u0001\u0000\u0000\u0000~\u0379\u0001\u0000\u0000\u0000\u0080\u037e\u0001"+
-    "\u0000\u0000\u0000\u0082\u0380\u0001\u0000\u0000\u0000\u0084\u0384\u0001"+
-    "\u0000\u0000\u0000\u0086\u0389\u0001\u0000\u0000\u0000\u0088\u038f\u0001"+
-    "\u0000\u0000\u0000\u008a\u0392\u0001\u0000\u0000\u0000\u008c\u0394\u0001"+
-    "\u0000\u0000\u0000\u008e\u039a\u0001\u0000\u0000\u0000\u0090\u039c\u0001"+
-    "\u0000\u0000\u0000\u0092\u03a1\u0001\u0000\u0000\u0000\u0094\u03a4\u0001"+
-    "\u0000\u0000\u0000\u0096\u03a7\u0001\u0000\u0000\u0000\u0098\u03aa\u0001"+
-    "\u0000\u0000\u0000\u009a\u03ac\u0001\u0000\u0000\u0000\u009c\u03af\u0001"+
-    "\u0000\u0000\u0000\u009e\u03b1\u0001\u0000\u0000\u0000\u00a0\u03b4\u0001"+
-    "\u0000\u0000\u0000\u00a2\u03b6\u0001\u0000\u0000\u0000\u00a4\u03b8\u0001"+
-    "\u0000\u0000\u0000\u00a6\u03ba\u0001\u0000\u0000\u0000\u00a8\u03bc\u0001"+
-    "\u0000\u0000\u0000\u00aa\u03be\u0001\u0000\u0000\u0000\u00ac\u03c0\u0001"+
-    "\u0000\u0000\u0000\u00ae\u03c2\u0001\u0000\u0000\u0000\u00b0\u03c5\u0001"+
-    "\u0000\u0000\u0000\u00b2\u03da\u0001\u0000\u0000\u0000\u00b4\u03ed\u0001"+
-    "\u0000\u0000\u0000\u00b6\u03ef\u0001\u0000\u0000\u0000\u00b8\u03f4\u0001"+
-    "\u0000\u0000\u0000\u00ba\u0409\u0001\u0000\u0000\u0000\u00bc\u040b\u0001"+
-    "\u0000\u0000\u0000\u00be\u0413\u0001\u0000\u0000\u0000\u00c0\u0415\u0001"+
-    "\u0000\u0000\u0000\u00c2\u0419\u0001\u0000\u0000\u0000\u00c4\u041d\u0001"+
-    "\u0000\u0000\u0000\u00c6\u0421\u0001\u0000\u0000\u0000\u00c8\u0426\u0001"+
-    "\u0000\u0000\u0000\u00ca\u042b\u0001\u0000\u0000\u0000\u00cc\u042f\u0001"+
-    "\u0000\u0000\u0000\u00ce\u0433\u0001\u0000\u0000\u0000\u00d0\u0437\u0001"+
-    "\u0000\u0000\u0000\u00d2\u043c\u0001\u0000\u0000\u0000\u00d4\u0440\u0001"+
-    "\u0000\u0000\u0000\u00d6\u0444\u0001\u0000\u0000\u0000\u00d8\u0448\u0001"+
-    "\u0000\u0000\u0000\u00da\u044d\u0001\u0000\u0000\u0000\u00dc\u0451\u0001"+
-    "\u0000\u0000\u0000\u00de\u0455\u0001\u0000\u0000\u0000\u00e0\u0461\u0001"+
-    "\u0000\u0000\u0000\u00e2\u0464\u0001\u0000\u0000\u0000\u00e4\u0468\u0001"+
-    "\u0000\u0000\u0000\u00e6\u046c\u0001\u0000\u0000\u0000\u00e8\u0470\u0001"+
-    "\u0000\u0000\u0000\u00ea\u0474\u0001\u0000\u0000\u0000\u00ec\u0478\u0001"+
-    "\u0000\u0000\u0000\u00ee\u047c\u0001\u0000\u0000\u0000\u00f0\u0481\u0001"+
-    "\u0000\u0000\u0000\u00f2\u0485\u0001\u0000\u0000\u0000\u00f4\u0489\u0001"+
-    "\u0000\u0000\u0000\u00f6\u048d\u0001\u0000\u0000\u0000\u00f8\u0491\u0001"+
-    "\u0000\u0000\u0000\u00fa\u0495\u0001\u0000\u0000\u0000\u00fc\u049d\u0001"+
-    "\u0000\u0000\u0000\u00fe\u04b2\u0001\u0000\u0000\u0000\u0100\u04b6\u0001"+
-    "\u0000\u0000\u0000\u0102\u04ba\u0001\u0000\u0000\u0000\u0104\u04be\u0001"+
-    "\u0000\u0000\u0000\u0106\u04c2\u0001\u0000\u0000\u0000\u0108\u04c6\u0001"+
-    "\u0000\u0000\u0000\u010a\u04cb\u0001\u0000\u0000\u0000\u010c\u04cf\u0001"+
-    "\u0000\u0000\u0000\u010e\u04d3\u0001\u0000\u0000\u0000\u0110\u04d7\u0001"+
-    "\u0000\u0000\u0000\u0112\u04db\u0001\u0000\u0000\u0000\u0114\u04df\u0001"+
-    "\u0000\u0000\u0000\u0116\u04e3\u0001\u0000\u0000\u0000\u0118\u04e7\u0001"+
-    "\u0000\u0000\u0000\u011a\u04ea\u0001\u0000\u0000\u0000\u011c\u04ee\u0001"+
-    "\u0000\u0000\u0000\u011e\u04f2\u0001\u0000\u0000\u0000\u0120\u04f6\u0001"+
-    "\u0000\u0000\u0000\u0122\u04fa\u0001\u0000\u0000\u0000\u0124\u04ff\u0001"+
-    "\u0000\u0000\u0000\u0126\u0504\u0001\u0000\u0000\u0000\u0128\u0509\u0001"+
-    "\u0000\u0000\u0000\u012a\u0510\u0001\u0000\u0000\u0000\u012c\u0519\u0001"+
-    "\u0000\u0000\u0000\u012e\u0520\u0001\u0000\u0000\u0000\u0130\u0524\u0001"+
-    "\u0000\u0000\u0000\u0132\u0528\u0001\u0000\u0000\u0000\u0134\u052c\u0001"+
-    "\u0000\u0000\u0000\u0136\u0530\u0001\u0000\u0000\u0000\u0138\u0536\u0001"+
-    "\u0000\u0000\u0000\u013a\u053a\u0001\u0000\u0000\u0000\u013c\u053e\u0001"+
-    "\u0000\u0000\u0000\u013e\u0542\u0001\u0000\u0000\u0000\u0140\u0546\u0001"+
-    "\u0000\u0000\u0000\u0142\u054a\u0001\u0000\u0000\u0000\u0144\u054e\u0001"+
-    "\u0000\u0000\u0000\u0146\u0552\u0001\u0000\u0000\u0000\u0148\u0556\u0001"+
-    "\u0000\u0000\u0000\u014a\u055a\u0001\u0000\u0000\u0000\u014c\u055e\u0001"+
-    "\u0000\u0000\u0000\u014e\u0562\u0001\u0000\u0000\u0000\u0150\u0566\u0001"+
-    "\u0000\u0000\u0000\u0152\u056a\u0001\u0000\u0000\u0000\u0154\u056f\u0001"+
-    "\u0000\u0000\u0000\u0156\u0573\u0001\u0000\u0000\u0000\u0158\u0577\u0001"+
-    "\u0000\u0000\u0000\u015a\u057b\u0001\u0000\u0000\u0000\u015c\u057f\u0001"+
-    "\u0000\u0000\u0000\u015e\u0583\u0001\u0000\u0000\u0000\u0160\u0587\u0001"+
-    "\u0000\u0000\u0000\u0162\u058b\u0001\u0000\u0000\u0000\u0164\u058f\u0001"+
-    "\u0000\u0000\u0000\u0166\u0593\u0001\u0000\u0000\u0000\u0168\u0597\u0001"+
-    "\u0000\u0000\u0000\u016a\u059c\u0001\u0000\u0000\u0000\u016c\u05a1\u0001"+
-    "\u0000\u0000\u0000\u016e\u05a5\u0001\u0000\u0000\u0000\u0170\u05a9\u0001"+
-    "\u0000\u0000\u0000\u0172\u05ad\u0001\u0000\u0000\u0000\u0174\u05b2\u0001"+
-    "\u0000\u0000\u0000\u0176\u05bb\u0001\u0000\u0000\u0000\u0178\u05bf\u0001"+
-    "\u0000\u0000\u0000\u017a\u05c3\u0001\u0000\u0000\u0000\u017c\u05c7\u0001"+
-    "\u0000\u0000\u0000\u017e\u05cb\u0001\u0000\u0000\u0000\u0180\u05d0\u0001"+
-    "\u0000\u0000\u0000\u0182\u05d4\u0001\u0000\u0000\u0000\u0184\u05d8\u0001"+
-    "\u0000\u0000\u0000\u0186\u05dc\u0001\u0000\u0000\u0000\u0188\u05e1\u0001"+
-    "\u0000\u0000\u0000\u018a\u05e5\u0001\u0000\u0000\u0000\u018c\u05e9\u0001"+
-    "\u0000\u0000\u0000\u018e\u05ed\u0001\u0000\u0000\u0000\u0190\u05f1\u0001"+
-    "\u0000\u0000\u0000\u0192\u05f5\u0001\u0000\u0000\u0000\u0194\u05fb\u0001"+
-    "\u0000\u0000\u0000\u0196\u05ff\u0001\u0000\u0000\u0000\u0198\u0603\u0001"+
-    "\u0000\u0000\u0000\u019a\u0607\u0001\u0000\u0000\u0000\u019c\u060b\u0001"+
-    "\u0000\u0000\u0000\u019e\u060f\u0001\u0000\u0000\u0000\u01a0\u0613\u0001"+
-    "\u0000\u0000\u0000\u01a2\u0618\u0001\u0000\u0000\u0000\u01a4\u061d\u0001"+
-    "\u0000\u0000\u0000\u01a6\u0621\u0001\u0000\u0000\u0000\u01a8\u0627\u0001"+
-    "\u0000\u0000\u0000\u01aa\u0630\u0001\u0000\u0000\u0000\u01ac\u0634\u0001"+
-    "\u0000\u0000\u0000\u01ae\u0638\u0001\u0000\u0000\u0000\u01b0\u063c\u0001"+
-    "\u0000\u0000\u0000\u01b2\u0640\u0001\u0000\u0000\u0000\u01b4\u0644\u0001"+
-    "\u0000\u0000\u0000\u01b6\u0648\u0001\u0000\u0000\u0000\u01b8\u064c\u0001"+
-    "\u0000\u0000\u0000\u01ba\u0650\u0001\u0000\u0000\u0000\u01bc\u0655\u0001"+
-    "\u0000\u0000\u0000\u01be\u065b\u0001\u0000\u0000\u0000\u01c0\u0661\u0001"+
-    "\u0000\u0000\u0000\u01c2\u0665\u0001\u0000\u0000\u0000\u01c4\u0669\u0001"+
-    "\u0000\u0000\u0000\u01c6\u066d\u0001\u0000\u0000\u0000\u01c8\u0673\u0001"+
-    "\u0000\u0000\u0000\u01ca\u0679\u0001\u0000\u0000\u0000\u01cc\u067f\u0001"+
-    "\u0000\u0000\u0000\u01ce\u0683\u0001\u0000\u0000\u0000\u01d0\u0687\u0001"+
-    "\u0000\u0000\u0000\u01d2\u068b\u0001\u0000\u0000\u0000\u01d4\u0691\u0001"+
-    "\u0000\u0000\u0000\u01d6\u0697\u0001\u0000\u0000\u0000\u01d8\u069d\u0001"+
-    "\u0000\u0000\u0000\u01da\u01db\u0007\u0000\u0000\u0000\u01db\u01dc\u0007"+
-    "\u0001\u0000\u0000\u01dc\u01dd\u0007\u0002\u0000\u0000\u01dd\u01de\u0007"+
-    "\u0002\u0000\u0000\u01de\u01df\u0007\u0003\u0000\u0000\u01df\u01e0\u0007"+
-    "\u0004\u0000\u0000\u01e0\u01e1\u0007\u0005\u0000\u0000\u01e1\u01e2\u0001"+
-    "\u0000\u0000\u0000\u01e2\u01e3\u0006\u0000\u0000\u0000\u01e3\u0011\u0001"+
-    "\u0000\u0000\u0000\u01e4\u01e5\u0007\u0000\u0000\u0000\u01e5\u01e6\u0007"+
-    "\u0006\u0000\u0000\u01e6\u01e7\u0007\u0007\u0000\u0000\u01e7\u01e8\u0007"+
-    "\b\u0000\u0000\u01e8\u01e9\u0001\u0000\u0000\u0000\u01e9\u01ea\u0006\u0001"+
-    "\u0001\u0000\u01ea\u0013\u0001\u0000\u0000\u0000\u01eb\u01ec\u0007\u0003"+
-    "\u0000\u0000\u01ec\u01ed\u0007\t\u0000\u0000\u01ed\u01ee\u0007\u0006\u0000"+
-    "\u0000\u01ee\u01ef\u0007\u0001\u0000\u0000\u01ef\u01f0\u0007\u0004\u0000"+
-    "\u0000\u01f0\u01f1\u0007\n\u0000\u0000\u01f1\u01f2\u0001\u0000\u0000\u0000"+
-    "\u01f2\u01f3\u0006\u0002\u0002\u0000\u01f3\u0015\u0001\u0000\u0000\u0000"+
-    "\u01f4\u01f5\u0007\u0003\u0000\u0000\u01f5\u01f6\u0007\u000b\u0000\u0000"+
-    "\u01f6\u01f7\u0007\f\u0000\u0000\u01f7\u01f8\u0007\r\u0000\u0000\u01f8"+
-    "\u01f9\u0001\u0000\u0000\u0000\u01f9\u01fa\u0006\u0003\u0000\u0000\u01fa"+
-    "\u0017\u0001\u0000\u0000\u0000\u01fb\u01fc\u0007\u0003\u0000\u0000\u01fc"+
-    "\u01fd\u0007\u000e\u0000\u0000\u01fd\u01fe\u0007\b\u0000\u0000\u01fe\u01ff"+
-    "\u0007\r\u0000\u0000\u01ff\u0200\u0007\f\u0000\u0000\u0200\u0201\u0007"+
-    "\u0001\u0000\u0000\u0201\u0202\u0007\t\u0000\u0000\u0202\u0203\u0001\u0000"+
-    "\u0000\u0000\u0203\u0204\u0006\u0004\u0003\u0000\u0204\u0019\u0001\u0000"+
-    "\u0000\u0000\u0205\u0206\u0007\u000f\u0000\u0000\u0206\u0207\u0007\u0006"+
-    "\u0000\u0000\u0207\u0208\u0007\u0007\u0000\u0000\u0208\u0209\u0007\u0010"+
-    "\u0000\u0000\u0209\u020a\u0001\u0000\u0000\u0000\u020a\u020b\u0006\u0005"+
-    "\u0004\u0000\u020b\u001b\u0001\u0000\u0000\u0000\u020c\u020d\u0007\u0011"+
-    "\u0000\u0000\u020d\u020e\u0007\u0006\u0000\u0000\u020e\u020f\u0007\u0007"+
-    "\u0000\u0000\u020f\u0210\u0007\u0012\u0000\u0000\u0210\u0211\u0001\u0000"+
-    "\u0000\u0000\u0211\u0212\u0006\u0006\u0000\u0000\u0212\u001d\u0001\u0000"+
-    "\u0000\u0000\u0213\u0214\u0007\u0012\u0000\u0000\u0214\u0215\u0007\u0003"+
-    "\u0000\u0000\u0215\u0216\u0007\u0003\u0000\u0000\u0216\u0217\u0007\b\u0000"+
-    "\u0000\u0217\u0218\u0001\u0000\u0000\u0000\u0218\u0219\u0006\u0007\u0001"+
-    "\u0000\u0219\u001f\u0001\u0000\u0000\u0000\u021a\u021b\u0007\r\u0000\u0000"+
-    "\u021b\u021c\u0007\u0001\u0000\u0000\u021c\u021d\u0007\u0010\u0000\u0000"+
-    "\u021d\u021e\u0007\u0001\u0000\u0000\u021e\u021f\u0007\u0005\u0000\u0000"+
-    "\u021f\u0220\u0001\u0000\u0000\u0000\u0220\u0221\u0006\b\u0000\u0000\u0221"+
-    "!\u0001\u0000\u0000\u0000\u0222\u0223\u0007\u0010\u0000\u0000\u0223\u0224"+
-    "\u0007\u000b\u0000\u0000\u0224\u0225\u0005_\u0000\u0000\u0225\u0226\u0007"+
-    "\u0003\u0000\u0000\u0226\u0227\u0007\u000e\u0000\u0000\u0227\u0228\u0007"+
-    "\b\u0000\u0000\u0228\u0229\u0007\f\u0000\u0000\u0229\u022a\u0007\t\u0000"+
-    "\u0000\u022a\u022b\u0007\u0000\u0000\u0000\u022b\u022c\u0001\u0000\u0000"+
-    "\u0000\u022c\u022d\u0006\t\u0005\u0000\u022d#\u0001\u0000\u0000\u0000"+
-    "\u022e\u022f\u0007\u0006\u0000\u0000\u022f\u0230\u0007\u0003\u0000\u0000"+
-    "\u0230\u0231\u0007\t\u0000\u0000\u0231\u0232\u0007\f\u0000\u0000\u0232"+
-    "\u0233\u0007\u0010\u0000\u0000\u0233\u0234\u0007\u0003\u0000\u0000\u0234"+
-    "\u0235\u0001\u0000\u0000\u0000\u0235\u0236\u0006\n\u0006\u0000\u0236%"+
-    "\u0001\u0000\u0000\u0000\u0237\u0238\u0007\u0006\u0000\u0000\u0238\u0239"+
-    "\u0007\u0007\u0000\u0000\u0239\u023a\u0007\u0013\u0000\u0000\u023a\u023b"+
-    "\u0001\u0000\u0000\u0000\u023b\u023c\u0006\u000b\u0000\u0000\u023c\'\u0001"+
-    "\u0000\u0000\u0000\u023d\u023e\u0007\u0002\u0000\u0000\u023e\u023f\u0007"+
-    "\n\u0000\u0000\u023f\u0240\u0007\u0007\u0000\u0000\u0240\u0241\u0007\u0013"+
-    "\u0000\u0000\u0241\u0242\u0001\u0000\u0000\u0000\u0242\u0243\u0006\f\u0007"+
-    "\u0000\u0243)\u0001\u0000\u0000\u0000\u0244\u0245\u0007\u0002\u0000\u0000"+
-    "\u0245\u0246\u0007\u0007\u0000\u0000\u0246\u0247\u0007\u0006\u0000\u0000"+
-    "\u0247\u0248\u0007\u0005\u0000\u0000\u0248\u0249\u0001\u0000\u0000\u0000"+
-    "\u0249\u024a\u0006\r\u0000\u0000\u024a+\u0001\u0000\u0000\u0000\u024b"+
-    "\u024c\u0007\u0002\u0000\u0000\u024c\u024d\u0007\u0005\u0000\u0000\u024d"+
-    "\u024e\u0007\f\u0000\u0000\u024e\u024f\u0007\u0005\u0000\u0000\u024f\u0250"+
-    "\u0007\u0002\u0000\u0000\u0250\u0251\u0001\u0000\u0000\u0000\u0251\u0252"+
-    "\u0006\u000e\u0000\u0000\u0252-\u0001\u0000\u0000\u0000\u0253\u0254\u0007"+
-    "\u0013\u0000\u0000\u0254\u0255\u0007\n\u0000\u0000\u0255\u0256\u0007\u0003"+
-    "\u0000\u0000\u0256\u0257\u0007\u0006\u0000\u0000\u0257\u0258\u0007\u0003"+
-    "\u0000\u0000\u0258\u0259\u0001\u0000\u0000\u0000\u0259\u025a\u0006\u000f"+
-    "\u0000\u0000\u025a/\u0001\u0000\u0000\u0000\u025b\u025c\u0007\r\u0000"+
-    "\u0000\u025c\u025d\u0007\u0007\u0000\u0000\u025d\u025e\u0007\u0007\u0000"+
-    "\u0000\u025e\u025f\u0007\u0012\u0000\u0000\u025f\u0260\u0007\u0014\u0000"+
-    "\u0000\u0260\u0261\u0007\b\u0000\u0000\u0261\u0262\u0001\u0000\u0000\u0000"+
-    "\u0262\u0263\u0006\u0010\b\u0000\u02631\u0001\u0000\u0000\u0000\u0264"+
-    "\u0265\u0004\u0011\u0000\u0000\u0265\u0266\u0007\u0001\u0000\u0000\u0266"+
-    "\u0267\u0007\t\u0000\u0000\u0267\u0268\u0007\r\u0000\u0000\u0268\u0269"+
-    "\u0007\u0001\u0000\u0000\u0269\u026a\u0007\t\u0000\u0000\u026a\u026b\u0007"+
-    "\u0003\u0000\u0000\u026b\u026c\u0007\u0002\u0000\u0000\u026c\u026d\u0007"+
-    "\u0005\u0000\u0000\u026d\u026e\u0007\f\u0000\u0000\u026e\u026f\u0007\u0005"+
-    "\u0000\u0000\u026f\u0270\u0007\u0002\u0000\u0000\u0270\u0271\u0001\u0000"+
-    "\u0000\u0000\u0271\u0272\u0006\u0011\u0000\u0000\u02723\u0001\u0000\u0000"+
-    "\u0000\u0273\u0274\u0004\u0012\u0001\u0000\u0274\u0275\u0007\r\u0000\u0000"+
-    "\u0275\u0276\u0007\u0007\u0000\u0000\u0276\u0277\u0007\u0007\u0000\u0000"+
-    "\u0277\u0278\u0007\u0012\u0000\u0000\u0278\u0279\u0007\u0014\u0000\u0000"+
-    "\u0279\u027a\u0007\b\u0000\u0000\u027a\u027b\u0005_\u0000\u0000\u027b"+
-    "\u027c\u0005\u8001\uf414\u0000\u0000\u027c\u027d\u0001\u0000\u0000\u0000"+
-    "\u027d\u027e\u0006\u0012\t\u0000\u027e5\u0001\u0000\u0000\u0000\u027f"+
-    "\u0280\u0004\u0013\u0002\u0000\u0280\u0281\u0007\u0010\u0000\u0000\u0281"+
-    "\u0282\u0007\u0003\u0000\u0000\u0282\u0283\u0007\u0005\u0000\u0000\u0283"+
-    "\u0284\u0007\u0006\u0000\u0000\u0284\u0285\u0007\u0001\u0000\u0000\u0285"+
-    "\u0286\u0007\u0004\u0000\u0000\u0286\u0287\u0007\u0002\u0000\u0000\u0287"+
-    "\u0288\u0001\u0000\u0000\u0000\u0288\u0289\u0006\u0013\n\u0000\u02897"+
-    "\u0001\u0000\u0000\u0000\u028a\u028b\u0004\u0014\u0003\u0000\u028b\u028c"+
-    "\u0007\u000f\u0000\u0000\u028c\u028d\u0007\u0014\u0000\u0000\u028d\u028e"+
-    "\u0007\r\u0000\u0000\u028e\u028f\u0007\r\u0000\u0000\u028f\u0290\u0001"+
-    "\u0000\u0000\u0000\u0290\u0291\u0006\u0014\b\u0000\u02919\u0001\u0000"+
-    "\u0000\u0000\u0292\u0293\u0004\u0015\u0004\u0000\u0293\u0294\u0007\r\u0000"+
-    "\u0000\u0294\u0295\u0007\u0003\u0000\u0000\u0295\u0296\u0007\u000f\u0000"+
-    "\u0000\u0296\u0297\u0007\u0005\u0000\u0000\u0297\u0298\u0001\u0000\u0000"+
-    "\u0000\u0298\u0299\u0006\u0015\b\u0000\u0299;\u0001\u0000\u0000\u0000"+
-    "\u029a\u029b\u0004\u0016\u0005\u0000\u029b\u029c\u0007\u0006\u0000\u0000"+
-    "\u029c\u029d\u0007\u0001\u0000\u0000\u029d\u029e\u0007\u0011\u0000\u0000"+
-    "\u029e\u029f\u0007\n\u0000\u0000\u029f\u02a0\u0007\u0005\u0000\u0000\u02a0"+
-    "\u02a1\u0001\u0000\u0000\u0000\u02a1\u02a2\u0006\u0016\b\u0000\u02a2="+
-    "\u0001\u0000\u0000\u0000\u02a3\u02a5\b\u0015\u0000\u0000\u02a4\u02a3\u0001"+
-    "\u0000\u0000\u0000\u02a5\u02a6\u0001\u0000\u0000\u0000\u02a6\u02a4\u0001"+
-    "\u0000\u0000\u0000\u02a6\u02a7\u0001\u0000\u0000\u0000\u02a7\u02a8\u0001"+
-    "\u0000\u0000\u0000\u02a8\u02a9\u0006\u0017\u0000\u0000\u02a9?\u0001\u0000"+
-    "\u0000\u0000\u02aa\u02ab\u0005/\u0000\u0000\u02ab\u02ac\u0005/\u0000\u0000"+
-    "\u02ac\u02b0\u0001\u0000\u0000\u0000\u02ad\u02af\b\u0016\u0000\u0000\u02ae"+
-    "\u02ad\u0001\u0000\u0000\u0000\u02af\u02b2\u0001\u0000\u0000\u0000\u02b0"+
-    "\u02ae\u0001\u0000\u0000\u0000\u02b0\u02b1\u0001\u0000\u0000\u0000\u02b1"+
-    "\u02b4\u0001\u0000\u0000\u0000\u02b2\u02b0\u0001\u0000\u0000\u0000\u02b3"+
-    "\u02b5\u0005\r\u0000\u0000\u02b4\u02b3\u0001\u0000\u0000\u0000\u02b4\u02b5"+
-    "\u0001\u0000\u0000\u0000\u02b5\u02b7\u0001\u0000\u0000\u0000\u02b6\u02b8"+
-    "\u0005\n\u0000\u0000\u02b7\u02b6\u0001\u0000\u0000\u0000\u02b7\u02b8\u0001"+
-    "\u0000\u0000\u0000\u02b8\u02b9\u0001\u0000\u0000\u0000\u02b9\u02ba\u0006"+
-    "\u0018\u000b\u0000\u02baA\u0001\u0000\u0000\u0000\u02bb\u02bc\u0005/\u0000"+
-    "\u0000\u02bc\u02bd\u0005*\u0000\u0000\u02bd\u02c2\u0001\u0000\u0000\u0000"+
-    "\u02be\u02c1\u0003B\u0019\u0000\u02bf\u02c1\t\u0000\u0000\u0000\u02c0"+
-    "\u02be\u0001\u0000\u0000\u0000\u02c0\u02bf\u0001\u0000\u0000\u0000\u02c1"+
-    "\u02c4\u0001\u0000\u0000\u0000\u02c2\u02c3\u0001\u0000\u0000\u0000\u02c2"+
-    "\u02c0\u0001\u0000\u0000\u0000\u02c3\u02c5\u0001\u0000\u0000\u0000\u02c4"+
-    "\u02c2\u0001\u0000\u0000\u0000\u02c5\u02c6\u0005*\u0000\u0000\u02c6\u02c7"+
-    "\u0005/\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8\u02c9\u0006"+
-    "\u0019\u000b\u0000\u02c9C\u0001\u0000\u0000\u0000\u02ca\u02cc\u0007\u0017"+
-    "\u0000\u0000\u02cb\u02ca\u0001\u0000\u0000\u0000\u02cc\u02cd\u0001\u0000"+
-    "\u0000\u0000\u02cd\u02cb\u0001\u0000\u0000\u0000\u02cd\u02ce\u0001\u0000"+
-    "\u0000\u0000\u02ce\u02cf\u0001\u0000\u0000\u0000\u02cf\u02d0\u0006\u001a"+
-    "\u000b\u0000\u02d0E\u0001\u0000\u0000\u0000\u02d1\u02d2\u0005|\u0000\u0000"+
-    "\u02d2\u02d3\u0001\u0000\u0000\u0000\u02d3\u02d4\u0006\u001b\f\u0000\u02d4"+
-    "G\u0001\u0000\u0000\u0000\u02d5\u02d6\u0007\u0018\u0000\u0000\u02d6I\u0001"+
-    "\u0000\u0000\u0000\u02d7\u02d8\u0007\u0019\u0000\u0000\u02d8K\u0001\u0000"+
-    "\u0000\u0000\u02d9\u02da\u0005\\\u0000\u0000\u02da\u02db\u0007\u001a\u0000"+
-    "\u0000\u02dbM\u0001\u0000\u0000\u0000\u02dc\u02dd\b\u001b\u0000\u0000"+
-    "\u02ddO\u0001\u0000\u0000\u0000\u02de\u02e0\u0007\u0003\u0000\u0000\u02df"+
-    "\u02e1\u0007\u001c\u0000\u0000\u02e0\u02df\u0001\u0000\u0000\u0000\u02e0"+
-    "\u02e1\u0001\u0000\u0000\u0000\u02e1\u02e3\u0001\u0000\u0000\u0000\u02e2"+
-    "\u02e4\u0003H\u001c\u0000\u02e3\u02e2\u0001\u0000\u0000\u0000\u02e4\u02e5"+
-    "\u0001\u0000\u0000\u0000\u02e5\u02e3\u0001\u0000\u0000\u0000\u02e5\u02e6"+
-    "\u0001\u0000\u0000\u0000\u02e6Q\u0001\u0000\u0000\u0000\u02e7\u02e8\u0005"+
-    "@\u0000\u0000\u02e8S\u0001\u0000\u0000\u0000\u02e9\u02ea\u0005`\u0000"+
-    "\u0000\u02eaU\u0001\u0000\u0000\u0000\u02eb\u02ef\b\u001d\u0000\u0000"+
-    "\u02ec\u02ed\u0005`\u0000\u0000\u02ed\u02ef\u0005`\u0000\u0000\u02ee\u02eb"+
-    "\u0001\u0000\u0000\u0000\u02ee\u02ec\u0001\u0000\u0000\u0000\u02efW\u0001"+
-    "\u0000\u0000\u0000\u02f0\u02f1\u0005_\u0000\u0000\u02f1Y\u0001\u0000\u0000"+
-    "\u0000\u02f2\u02f6\u0003J\u001d\u0000\u02f3\u02f6\u0003H\u001c\u0000\u02f4"+
-    "\u02f6\u0003X$\u0000\u02f5\u02f2\u0001\u0000\u0000\u0000\u02f5\u02f3\u0001"+
-    "\u0000\u0000\u0000\u02f5\u02f4\u0001\u0000\u0000\u0000\u02f6[\u0001\u0000"+
-    "\u0000\u0000\u02f7\u02fc\u0005\"\u0000\u0000\u02f8\u02fb\u0003L\u001e"+
-    "\u0000\u02f9\u02fb\u0003N\u001f\u0000\u02fa\u02f8\u0001\u0000\u0000\u0000"+
-    "\u02fa\u02f9\u0001\u0000\u0000\u0000\u02fb\u02fe\u0001\u0000\u0000\u0000"+
-    "\u02fc\u02fa\u0001\u0000\u0000\u0000\u02fc\u02fd\u0001\u0000\u0000\u0000"+
-    "\u02fd\u02ff\u0001\u0000\u0000\u0000\u02fe\u02fc\u0001\u0000\u0000\u0000"+
-    "\u02ff\u0315\u0005\"\u0000\u0000\u0300\u0301\u0005\"\u0000\u0000\u0301"+
-    "\u0302\u0005\"\u0000\u0000\u0302\u0303\u0005\"\u0000\u0000\u0303\u0307"+
-    "\u0001\u0000\u0000\u0000\u0304\u0306\b\u0016\u0000\u0000\u0305\u0304\u0001"+
-    "\u0000\u0000\u0000\u0306\u0309\u0001\u0000\u0000\u0000\u0307\u0308\u0001"+
-    "\u0000\u0000\u0000\u0307\u0305\u0001\u0000\u0000\u0000\u0308\u030a\u0001"+
-    "\u0000\u0000\u0000\u0309\u0307\u0001\u0000\u0000\u0000\u030a\u030b\u0005"+
-    "\"\u0000\u0000\u030b\u030c\u0005\"\u0000\u0000\u030c\u030d\u0005\"\u0000"+
-    "\u0000\u030d\u030f\u0001\u0000\u0000\u0000\u030e\u0310\u0005\"\u0000\u0000"+
-    "\u030f\u030e\u0001\u0000\u0000\u0000\u030f\u0310\u0001\u0000\u0000\u0000"+
-    "\u0310\u0312\u0001\u0000\u0000\u0000\u0311\u0313\u0005\"\u0000\u0000\u0312"+
-    "\u0311\u0001\u0000\u0000\u0000\u0312\u0313\u0001\u0000\u0000\u0000\u0313"+
-    "\u0315\u0001\u0000\u0000\u0000\u0314\u02f7\u0001\u0000\u0000\u0000\u0314"+
-    "\u0300\u0001\u0000\u0000\u0000\u0315]\u0001\u0000\u0000\u0000\u0316\u0318"+
-    "\u0003H\u001c\u0000\u0317\u0316\u0001\u0000\u0000\u0000\u0318\u0319\u0001"+
-    "\u0000\u0000\u0000\u0319\u0317\u0001\u0000\u0000\u0000\u0319\u031a\u0001"+
-    "\u0000\u0000\u0000\u031a_\u0001\u0000\u0000\u0000\u031b\u031d\u0003H\u001c"+
-    "\u0000\u031c\u031b\u0001\u0000\u0000\u0000\u031d\u031e\u0001\u0000\u0000"+
-    "\u0000\u031e\u031c\u0001\u0000\u0000\u0000\u031e\u031f\u0001\u0000\u0000"+
-    "\u0000\u031f\u0320\u0001\u0000\u0000\u0000\u0320\u0324\u0003r1\u0000\u0321"+
-    "\u0323\u0003H\u001c\u0000\u0322\u0321\u0001\u0000\u0000\u0000\u0323\u0326"+
-    "\u0001\u0000\u0000\u0000\u0324\u0322\u0001\u0000\u0000\u0000\u0324\u0325"+
-    "\u0001\u0000\u0000\u0000\u0325\u0346\u0001\u0000\u0000\u0000\u0326\u0324"+
-    "\u0001\u0000\u0000\u0000\u0327\u0329\u0003r1\u0000\u0328\u032a\u0003H"+
-    "\u001c\u0000\u0329\u0328\u0001\u0000\u0000\u0000\u032a\u032b\u0001\u0000"+
-    "\u0000\u0000\u032b\u0329\u0001\u0000\u0000\u0000\u032b\u032c\u0001\u0000"+
-    "\u0000\u0000\u032c\u0346\u0001\u0000\u0000\u0000\u032d\u032f\u0003H\u001c"+
-    "\u0000\u032e\u032d\u0001\u0000\u0000\u0000\u032f\u0330\u0001\u0000\u0000"+
-    "\u0000\u0330\u032e\u0001\u0000\u0000\u0000\u0330\u0331\u0001\u0000\u0000"+
-    "\u0000\u0331\u0339\u0001\u0000\u0000\u0000\u0332\u0336\u0003r1\u0000\u0333"+
-    "\u0335\u0003H\u001c\u0000\u0334\u0333\u0001\u0000\u0000\u0000\u0335\u0338"+
-    "\u0001\u0000\u0000\u0000\u0336\u0334\u0001\u0000\u0000\u0000\u0336\u0337"+
-    "\u0001\u0000\u0000\u0000\u0337\u033a\u0001\u0000\u0000\u0000\u0338\u0336"+
-    "\u0001\u0000\u0000\u0000\u0339\u0332\u0001\u0000\u0000\u0000\u0339\u033a"+
-    "\u0001\u0000\u0000\u0000\u033a\u033b\u0001\u0000\u0000\u0000\u033b\u033c"+
-    "\u0003P \u0000\u033c\u0346\u0001\u0000\u0000\u0000\u033d\u033f\u0003r"+
-    "1\u0000\u033e\u0340\u0003H\u001c\u0000\u033f\u033e\u0001\u0000\u0000\u0000"+
-    "\u0340\u0341\u0001\u0000\u0000\u0000\u0341\u033f\u0001\u0000\u0000\u0000"+
-    "\u0341\u0342\u0001\u0000\u0000\u0000\u0342\u0343\u0001\u0000\u0000\u0000"+
-    "\u0343\u0344\u0003P \u0000\u0344\u0346\u0001\u0000\u0000\u0000\u0345\u031c"+
-    "\u0001\u0000\u0000\u0000\u0345\u0327\u0001\u0000\u0000\u0000\u0345\u032e"+
-    "\u0001\u0000\u0000\u0000\u0345\u033d\u0001\u0000\u0000\u0000\u0346a\u0001"+
-    "\u0000\u0000\u0000\u0347\u0348\u0007\u001e\u0000\u0000\u0348\u0349\u0007"+
-    "\u001f\u0000\u0000\u0349c\u0001\u0000\u0000\u0000\u034a\u034b\u0007\f"+
-    "\u0000\u0000\u034b\u034c\u0007\t\u0000\u0000\u034c\u034d\u0007\u0000\u0000"+
-    "\u0000\u034de\u0001\u0000\u0000\u0000\u034e\u034f\u0007\f\u0000\u0000"+
-    "\u034f\u0350\u0007\u0002\u0000\u0000\u0350\u0351\u0007\u0004\u0000\u0000"+
-    "\u0351g\u0001\u0000\u0000\u0000\u0352\u0353\u0005=\u0000\u0000\u0353i"+
-    "\u0001\u0000\u0000\u0000\u0354\u0355\u0005:\u0000\u0000\u0355\u0356\u0005"+
-    ":\u0000\u0000\u0356k\u0001\u0000\u0000\u0000\u0357\u0358\u0005:\u0000"+
-    "\u0000\u0358m\u0001\u0000\u0000\u0000\u0359\u035a\u0005,\u0000\u0000\u035a"+
-    "o\u0001\u0000\u0000\u0000\u035b\u035c\u0007\u0000\u0000\u0000\u035c\u035d"+
-    "\u0007\u0003\u0000\u0000\u035d\u035e\u0007\u0002\u0000\u0000\u035e\u035f"+
-    "\u0007\u0004\u0000\u0000\u035fq\u0001\u0000\u0000\u0000\u0360\u0361\u0005"+
-    ".\u0000\u0000\u0361s\u0001\u0000\u0000\u0000\u0362\u0363\u0007\u000f\u0000"+
-    "\u0000\u0363\u0364\u0007\f\u0000\u0000\u0364\u0365\u0007\r\u0000\u0000"+
-    "\u0365\u0366\u0007\u0002\u0000\u0000\u0366\u0367\u0007\u0003\u0000\u0000"+
-    "\u0367u\u0001\u0000\u0000\u0000\u0368\u0369\u0007\u000f\u0000\u0000\u0369"+
-    "\u036a\u0007\u0001\u0000\u0000\u036a\u036b\u0007\u0006\u0000\u0000\u036b"+
-    "\u036c\u0007\u0002\u0000\u0000\u036c\u036d\u0007\u0005\u0000\u0000\u036d"+
-    "w\u0001\u0000\u0000\u0000\u036e\u036f\u0007\u0001\u0000\u0000\u036f\u0370"+
-    "\u0007\t\u0000\u0000\u0370y\u0001\u0000\u0000\u0000\u0371\u0372\u0007"+
-    "\u0001\u0000\u0000\u0372\u0373\u0007\u0002\u0000\u0000\u0373{\u0001\u0000"+
-    "\u0000\u0000\u0374\u0375\u0007\r\u0000\u0000\u0375\u0376\u0007\f\u0000"+
-    "\u0000\u0376\u0377\u0007\u0002\u0000\u0000\u0377\u0378\u0007\u0005\u0000"+
-    "\u0000\u0378}\u0001\u0000\u0000\u0000\u0379\u037a\u0007\r\u0000\u0000"+
-    "\u037a\u037b\u0007\u0001\u0000\u0000\u037b\u037c\u0007\u0012\u0000\u0000"+
-    "\u037c\u037d\u0007\u0003\u0000\u0000\u037d\u007f\u0001\u0000\u0000\u0000"+
-    "\u037e\u037f\u0005(\u0000\u0000\u037f\u0081\u0001\u0000\u0000\u0000\u0380"+
-    "\u0381\u0007\t\u0000\u0000\u0381\u0382\u0007\u0007\u0000\u0000\u0382\u0383"+
-    "\u0007\u0005\u0000\u0000\u0383\u0083\u0001\u0000\u0000\u0000\u0384\u0385"+
-    "\u0007\t\u0000\u0000\u0385\u0386\u0007\u0014\u0000\u0000\u0386\u0387\u0007"+
-    "\r\u0000\u0000\u0387\u0388\u0007\r\u0000\u0000\u0388\u0085\u0001\u0000"+
-    "\u0000\u0000\u0389\u038a\u0007\t\u0000\u0000\u038a\u038b\u0007\u0014\u0000"+
-    "\u0000\u038b\u038c\u0007\r\u0000\u0000\u038c\u038d\u0007\r\u0000\u0000"+
-    "\u038d\u038e\u0007\u0002\u0000\u0000\u038e\u0087\u0001\u0000\u0000\u0000"+
-    "\u038f\u0390\u0007\u0007\u0000\u0000\u0390\u0391\u0007\u0006\u0000\u0000"+
-    "\u0391\u0089\u0001\u0000\u0000\u0000\u0392\u0393\u0005?\u0000\u0000\u0393"+
-    "\u008b\u0001\u0000\u0000\u0000\u0394\u0395\u0007\u0006\u0000\u0000\u0395"+
-    "\u0396\u0007\r\u0000\u0000\u0396\u0397\u0007\u0001\u0000\u0000\u0397\u0398"+
-    "\u0007\u0012\u0000\u0000\u0398\u0399\u0007\u0003\u0000\u0000\u0399\u008d"+
-    "\u0001\u0000\u0000\u0000\u039a\u039b\u0005)\u0000\u0000\u039b\u008f\u0001"+
-    "\u0000\u0000\u0000\u039c\u039d\u0007\u0005\u0000\u0000\u039d\u039e\u0007"+
-    "\u0006\u0000\u0000\u039e\u039f\u0007\u0014\u0000\u0000\u039f\u03a0\u0007"+
-    "\u0003\u0000\u0000\u03a0\u0091\u0001\u0000\u0000\u0000\u03a1\u03a2\u0005"+
-    "=\u0000\u0000\u03a2\u03a3\u0005=\u0000\u0000\u03a3\u0093\u0001\u0000\u0000"+
-    "\u0000\u03a4\u03a5\u0005=\u0000\u0000\u03a5\u03a6\u0005~\u0000\u0000\u03a6"+
-    "\u0095\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005!\u0000\u0000\u03a8\u03a9"+
-    "\u0005=\u0000\u0000\u03a9\u0097\u0001\u0000\u0000\u0000\u03aa\u03ab\u0005"+
-    "<\u0000\u0000\u03ab\u0099\u0001\u0000\u0000\u0000\u03ac\u03ad\u0005<\u0000"+
-    "\u0000\u03ad\u03ae\u0005=\u0000\u0000\u03ae\u009b\u0001\u0000\u0000\u0000"+
-    "\u03af\u03b0\u0005>\u0000\u0000\u03b0\u009d\u0001\u0000\u0000\u0000\u03b1"+
-    "\u03b2\u0005>\u0000\u0000\u03b2\u03b3\u0005=\u0000\u0000\u03b3\u009f\u0001"+
-    "\u0000\u0000\u0000\u03b4\u03b5\u0005+\u0000\u0000\u03b5\u00a1\u0001\u0000"+
-    "\u0000\u0000\u03b6\u03b7\u0005-\u0000\u0000\u03b7\u00a3\u0001\u0000\u0000"+
-    "\u0000\u03b8\u03b9\u0005*\u0000\u0000\u03b9\u00a5\u0001\u0000\u0000\u0000"+
-    "\u03ba\u03bb\u0005/\u0000\u0000\u03bb\u00a7\u0001\u0000\u0000\u0000\u03bc"+
-    "\u03bd\u0005%\u0000\u0000\u03bd\u00a9\u0001\u0000\u0000\u0000\u03be\u03bf"+
-    "\u0005{\u0000\u0000\u03bf\u00ab\u0001\u0000\u0000\u0000\u03c0\u03c1\u0005"+
-    "}\u0000\u0000\u03c1\u00ad\u0001\u0000\u0000\u0000\u03c2\u03c3\u0005?\u0000"+
-    "\u0000\u03c3\u03c4\u0005?\u0000\u0000\u03c4\u00af\u0001\u0000\u0000\u0000"+
-    "\u03c5\u03c6\u0003.\u000f\u0000\u03c6\u03c7\u0001\u0000\u0000\u0000\u03c7"+
-    "\u03c8\u0006P\r\u0000\u03c8\u00b1\u0001\u0000\u0000\u0000\u03c9\u03cc"+
-    "\u0003\u008a=\u0000\u03ca\u03cd\u0003J\u001d\u0000\u03cb\u03cd\u0003X"+
-    "$\u0000\u03cc\u03ca\u0001\u0000\u0000\u0000\u03cc\u03cb\u0001\u0000\u0000"+
-    "\u0000\u03cd\u03d1\u0001\u0000\u0000\u0000\u03ce\u03d0\u0003Z%\u0000\u03cf"+
-    "\u03ce\u0001\u0000\u0000\u0000\u03d0\u03d3\u0001\u0000\u0000\u0000\u03d1"+
-    "\u03cf\u0001\u0000\u0000\u0000\u03d1\u03d2\u0001\u0000\u0000\u0000\u03d2"+
-    "\u03db\u0001\u0000\u0000\u0000\u03d3\u03d1\u0001\u0000\u0000\u0000\u03d4"+
-    "\u03d6\u0003\u008a=\u0000\u03d5\u03d7\u0003H\u001c\u0000\u03d6\u03d5\u0001"+
-    "\u0000\u0000\u0000\u03d7\u03d8\u0001\u0000\u0000\u0000\u03d8\u03d6\u0001"+
-    "\u0000\u0000\u0000\u03d8\u03d9\u0001\u0000\u0000\u0000\u03d9\u03db\u0001"+
-    "\u0000\u0000\u0000\u03da\u03c9\u0001\u0000\u0000\u0000\u03da\u03d4\u0001"+
-    "\u0000\u0000\u0000\u03db\u00b3\u0001\u0000\u0000\u0000\u03dc\u03df\u0003"+
-    "\u00aeO\u0000\u03dd\u03e0\u0003J\u001d\u0000\u03de\u03e0\u0003X$\u0000"+
-    "\u03df\u03dd\u0001\u0000\u0000\u0000\u03df\u03de\u0001\u0000\u0000\u0000"+
-    "\u03e0\u03e4\u0001\u0000\u0000\u0000\u03e1\u03e3\u0003Z%\u0000\u03e2\u03e1"+
-    "\u0001\u0000\u0000\u0000\u03e3\u03e6\u0001\u0000\u0000\u0000\u03e4\u03e2"+
-    "\u0001\u0000\u0000\u0000\u03e4\u03e5\u0001\u0000\u0000\u0000\u03e5\u03ee"+
-    "\u0001\u0000\u0000\u0000\u03e6\u03e4\u0001\u0000\u0000\u0000\u03e7\u03e9"+
-    "\u0003\u00aeO\u0000\u03e8\u03ea\u0003H\u001c\u0000\u03e9\u03e8\u0001\u0000"+
-    "\u0000\u0000\u03ea\u03eb\u0001\u0000\u0000\u0000\u03eb\u03e9\u0001\u0000"+
-    "\u0000\u0000\u03eb\u03ec\u0001\u0000\u0000\u0000\u03ec\u03ee\u0001\u0000"+
-    "\u0000\u0000\u03ed\u03dc\u0001\u0000\u0000\u0000\u03ed\u03e7\u0001\u0000"+
-    "\u0000\u0000\u03ee\u00b5\u0001\u0000\u0000\u0000\u03ef\u03f0\u0005[\u0000"+
-    "\u0000\u03f0\u03f1\u0001\u0000\u0000\u0000\u03f1\u03f2\u0006S\u0000\u0000"+
-    "\u03f2\u03f3\u0006S\u0000\u0000\u03f3\u00b7\u0001\u0000\u0000\u0000\u03f4"+
-    "\u03f5\u0005]\u0000\u0000\u03f5\u03f6\u0001\u0000\u0000\u0000\u03f6\u03f7"+
-    "\u0006T\f\u0000\u03f7\u03f8\u0006T\f\u0000\u03f8\u00b9\u0001\u0000\u0000"+
-    "\u0000\u03f9\u03fd\u0003J\u001d\u0000\u03fa\u03fc\u0003Z%\u0000\u03fb"+
-    "\u03fa\u0001\u0000\u0000\u0000\u03fc\u03ff\u0001\u0000\u0000\u0000\u03fd"+
-    "\u03fb\u0001\u0000\u0000\u0000\u03fd\u03fe\u0001\u0000\u0000\u0000\u03fe"+
-    "\u040a\u0001\u0000\u0000\u0000\u03ff\u03fd\u0001\u0000\u0000\u0000\u0400"+
-    "\u0403\u0003X$\u0000\u0401\u0403\u0003R!\u0000\u0402\u0400\u0001\u0000"+
-    "\u0000\u0000\u0402\u0401\u0001\u0000\u0000\u0000\u0403\u0405\u0001\u0000"+
-    "\u0000\u0000\u0404\u0406\u0003Z%\u0000\u0405\u0404\u0001\u0000\u0000\u0000"+
-    "\u0406\u0407\u0001\u0000\u0000\u0000\u0407\u0405\u0001\u0000\u0000\u0000"+
-    "\u0407\u0408\u0001\u0000\u0000\u0000\u0408\u040a\u0001\u0000\u0000\u0000"+
-    "\u0409\u03f9\u0001\u0000\u0000\u0000\u0409\u0402\u0001\u0000\u0000\u0000"+
-    "\u040a\u00bb\u0001\u0000\u0000\u0000\u040b\u040d\u0003T\"\u0000\u040c"+
-    "\u040e\u0003V#\u0000\u040d\u040c\u0001\u0000\u0000\u0000\u040e\u040f\u0001"+
-    "\u0000\u0000\u0000\u040f\u040d\u0001\u0000\u0000\u0000\u040f\u0410\u0001"+
-    "\u0000\u0000\u0000\u0410\u0411\u0001\u0000\u0000\u0000\u0411\u0412\u0003"+
-    "T\"\u0000\u0412\u00bd\u0001\u0000\u0000\u0000\u0413\u0414\u0003\u00bc"+
-    "V\u0000\u0414\u00bf\u0001\u0000\u0000\u0000\u0415\u0416\u0003@\u0018\u0000"+
-    "\u0416\u0417\u0001\u0000\u0000\u0000\u0417\u0418\u0006X\u000b\u0000\u0418"+
-    "\u00c1\u0001\u0000\u0000\u0000\u0419\u041a\u0003B\u0019\u0000\u041a\u041b"+
-    "\u0001\u0000\u0000\u0000\u041b\u041c\u0006Y\u000b\u0000\u041c\u00c3\u0001"+
-    "\u0000\u0000\u0000\u041d\u041e\u0003D\u001a\u0000\u041e\u041f\u0001\u0000"+
-    "\u0000\u0000\u041f\u0420\u0006Z\u000b\u0000\u0420\u00c5\u0001\u0000\u0000"+
-    "\u0000\u0421\u0422\u0003\u00b6S\u0000\u0422\u0423\u0001\u0000\u0000\u0000"+
-    "\u0423\u0424\u0006[\u000e\u0000\u0424\u0425\u0006[\u000f\u0000\u0425\u00c7"+
-    "\u0001\u0000\u0000\u0000\u0426\u0427\u0003F\u001b\u0000\u0427\u0428\u0001"+
-    "\u0000\u0000\u0000\u0428\u0429\u0006\\\u0010\u0000\u0429\u042a\u0006\\"+
-    "\f\u0000\u042a\u00c9\u0001\u0000\u0000\u0000\u042b\u042c\u0003D\u001a"+
-    "\u0000\u042c\u042d\u0001\u0000\u0000\u0000\u042d\u042e\u0006]\u000b\u0000"+
-    "\u042e\u00cb\u0001\u0000\u0000\u0000\u042f\u0430\u0003@\u0018\u0000\u0430"+
-    "\u0431\u0001\u0000\u0000\u0000\u0431\u0432\u0006^\u000b\u0000\u0432\u00cd"+
-    "\u0001\u0000\u0000\u0000\u0433\u0434\u0003B\u0019\u0000\u0434\u0435\u0001"+
-    "\u0000\u0000\u0000\u0435\u0436\u0006_\u000b\u0000\u0436\u00cf\u0001\u0000"+
-    "\u0000\u0000\u0437\u0438\u0003F\u001b\u0000\u0438\u0439\u0001\u0000\u0000"+
-    "\u0000\u0439\u043a\u0006`\u0010\u0000\u043a\u043b\u0006`\f\u0000\u043b"+
-    "\u00d1\u0001\u0000\u0000\u0000\u043c\u043d\u0003\u00b6S\u0000\u043d\u043e"+
-    "\u0001\u0000\u0000\u0000\u043e\u043f\u0006a\u000e\u0000\u043f\u00d3\u0001"+
-    "\u0000\u0000\u0000\u0440\u0441\u0003\u00b8T\u0000\u0441\u0442\u0001\u0000"+
-    "\u0000\u0000\u0442\u0443\u0006b\u0011\u0000\u0443\u00d5\u0001\u0000\u0000"+
-    "\u0000\u0444\u0445\u0003l.\u0000\u0445\u0446\u0001\u0000\u0000\u0000\u0446"+
-    "\u0447\u0006c\u0012\u0000\u0447\u00d7\u0001\u0000\u0000\u0000\u0448\u0449"+
-    "\u0004d\u0006\u0000\u0449\u044a\u0003j-\u0000\u044a\u044b\u0001\u0000"+
-    "\u0000\u0000\u044b\u044c\u0006d\u0013\u0000\u044c\u00d9\u0001\u0000\u0000"+
-    "\u0000\u044d\u044e\u0003n/\u0000\u044e\u044f\u0001\u0000\u0000\u0000\u044f"+
-    "\u0450\u0006e\u0014\u0000\u0450\u00db\u0001\u0000\u0000\u0000\u0451\u0452"+
-    "\u0003h,\u0000\u0452\u0453\u0001\u0000\u0000\u0000\u0453\u0454\u0006f"+
-    "\u0015\u0000\u0454\u00dd\u0001\u0000\u0000\u0000\u0455\u0456\u0007\u0010"+
-    "\u0000\u0000\u0456\u0457\u0007\u0003\u0000\u0000\u0457\u0458\u0007\u0005"+
-    "\u0000\u0000\u0458\u0459\u0007\f\u0000\u0000\u0459\u045a\u0007\u0000\u0000"+
-    "\u0000\u045a\u045b\u0007\f\u0000\u0000\u045b\u045c\u0007\u0005\u0000\u0000"+
-    "\u045c\u045d\u0007\f\u0000\u0000\u045d\u00df\u0001\u0000\u0000\u0000\u045e"+
-    "\u0462\b \u0000\u0000\u045f\u0460\u0005/\u0000\u0000\u0460\u0462\b!\u0000"+
-    "\u0000\u0461\u045e\u0001\u0000\u0000\u0000\u0461\u045f\u0001\u0000\u0000"+
-    "\u0000\u0462\u00e1\u0001\u0000\u0000\u0000\u0463\u0465\u0003\u00e0h\u0000"+
-    "\u0464\u0463\u0001\u0000\u0000\u0000\u0465\u0466\u0001\u0000\u0000\u0000"+
-    "\u0466\u0464\u0001\u0000\u0000\u0000\u0466\u0467\u0001\u0000\u0000\u0000"+
-    "\u0467\u00e3\u0001\u0000\u0000\u0000\u0468\u0469\u0003\u00e2i\u0000\u0469"+
-    "\u046a\u0001\u0000\u0000\u0000\u046a\u046b\u0006j\u0016\u0000\u046b\u00e5"+
-    "\u0001\u0000\u0000\u0000\u046c\u046d\u0003\\&\u0000\u046d\u046e\u0001"+
-    "\u0000\u0000\u0000\u046e\u046f\u0006k\u0017\u0000\u046f\u00e7\u0001\u0000"+
-    "\u0000\u0000\u0470\u0471\u0003@\u0018\u0000\u0471\u0472\u0001\u0000\u0000"+
-    "\u0000\u0472\u0473\u0006l\u000b\u0000\u0473\u00e9\u0001\u0000\u0000\u0000"+
-    "\u0474\u0475\u0003B\u0019\u0000\u0475\u0476\u0001\u0000\u0000\u0000\u0476"+
-    "\u0477\u0006m\u000b\u0000\u0477\u00eb\u0001\u0000\u0000\u0000\u0478\u0479"+
-    "\u0003D\u001a\u0000\u0479\u047a\u0001\u0000\u0000\u0000\u047a\u047b\u0006"+
-    "n\u000b\u0000\u047b\u00ed\u0001\u0000\u0000\u0000\u047c\u047d\u0003F\u001b"+
-    "\u0000\u047d\u047e\u0001\u0000\u0000\u0000\u047e\u047f\u0006o\u0010\u0000"+
-    "\u047f\u0480\u0006o\f\u0000\u0480\u00ef\u0001\u0000\u0000\u0000\u0481"+
-    "\u0482\u0003r1\u0000\u0482\u0483\u0001\u0000\u0000\u0000\u0483\u0484\u0006"+
-    "p\u0018\u0000\u0484\u00f1\u0001\u0000\u0000\u0000\u0485\u0486\u0003n/"+
-    "\u0000\u0486\u0487\u0001\u0000\u0000\u0000\u0487\u0488\u0006q\u0014\u0000"+
-    "\u0488\u00f3\u0001\u0000\u0000\u0000\u0489\u048a\u0003\u008a=\u0000\u048a"+
-    "\u048b\u0001\u0000\u0000\u0000\u048b\u048c\u0006r\u0019\u0000\u048c\u00f5"+
-    "\u0001\u0000\u0000\u0000\u048d\u048e\u0003\u00b2Q\u0000\u048e\u048f\u0001"+
-    "\u0000\u0000\u0000\u048f\u0490\u0006s\u001a\u0000\u0490\u00f7\u0001\u0000"+
-    "\u0000\u0000\u0491\u0492\u0003\u00aeO\u0000\u0492\u0493\u0001\u0000\u0000"+
-    "\u0000\u0493\u0494\u0006t\u001b\u0000\u0494\u00f9\u0001\u0000\u0000\u0000"+
-    "\u0495\u0496\u0003\u00b4R\u0000\u0496\u0497\u0001\u0000\u0000\u0000\u0497"+
-    "\u0498\u0006u\u001c\u0000\u0498\u00fb\u0001\u0000\u0000\u0000\u0499\u049e"+
-    "\u0003J\u001d\u0000\u049a\u049e\u0003H\u001c\u0000\u049b\u049e\u0003X"+
-    "$\u0000\u049c\u049e\u0003\u00a4J\u0000\u049d\u0499\u0001\u0000\u0000\u0000"+
-    "\u049d\u049a\u0001\u0000\u0000\u0000\u049d\u049b\u0001\u0000\u0000\u0000"+
-    "\u049d\u049c\u0001\u0000\u0000\u0000\u049e\u00fd\u0001\u0000\u0000\u0000"+
-    "\u049f\u04a2\u0003J\u001d\u0000\u04a0\u04a2\u0003\u00a4J\u0000\u04a1\u049f"+
-    "\u0001\u0000\u0000\u0000\u04a1\u04a0\u0001\u0000\u0000\u0000\u04a2\u04a6"+
-    "\u0001\u0000\u0000\u0000\u04a3\u04a5\u0003\u00fcv\u0000\u04a4\u04a3\u0001"+
-    "\u0000\u0000\u0000\u04a5\u04a8\u0001\u0000\u0000\u0000\u04a6\u04a4\u0001"+
-    "\u0000\u0000\u0000\u04a6\u04a7\u0001\u0000\u0000\u0000\u04a7\u04b3\u0001"+
-    "\u0000\u0000\u0000\u04a8\u04a6\u0001\u0000\u0000\u0000\u04a9\u04ac\u0003"+
-    "X$\u0000\u04aa\u04ac\u0003R!\u0000\u04ab\u04a9\u0001\u0000\u0000\u0000"+
-    "\u04ab\u04aa\u0001\u0000\u0000\u0000\u04ac\u04ae\u0001\u0000\u0000\u0000"+
-    "\u04ad\u04af\u0003\u00fcv\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\u04b3\u0001\u0000\u0000\u0000\u04b2"+
-    "\u04a1\u0001\u0000\u0000\u0000\u04b2\u04ab\u0001\u0000\u0000\u0000\u04b3"+
-    "\u00ff\u0001\u0000\u0000\u0000\u04b4\u04b7\u0003\u00few\u0000\u04b5\u04b7"+
-    "\u0003\u00bcV\u0000\u04b6\u04b4\u0001\u0000\u0000\u0000\u04b6\u04b5\u0001"+
-    "\u0000\u0000\u0000\u04b7\u04b8\u0001\u0000\u0000\u0000\u04b8\u04b6\u0001"+
-    "\u0000\u0000\u0000\u04b8\u04b9\u0001\u0000\u0000\u0000\u04b9\u0101\u0001"+
-    "\u0000\u0000\u0000\u04ba\u04bb\u0003@\u0018\u0000\u04bb\u04bc\u0001\u0000"+
-    "\u0000\u0000\u04bc\u04bd\u0006y\u000b\u0000\u04bd\u0103\u0001\u0000\u0000"+
-    "\u0000\u04be\u04bf\u0003B\u0019\u0000\u04bf\u04c0\u0001\u0000\u0000\u0000"+
-    "\u04c0\u04c1\u0006z\u000b\u0000\u04c1\u0105\u0001\u0000\u0000\u0000\u04c2"+
-    "\u04c3\u0003D\u001a\u0000\u04c3\u04c4\u0001\u0000\u0000\u0000\u04c4\u04c5"+
-    "\u0006{\u000b\u0000\u04c5\u0107\u0001\u0000\u0000\u0000\u04c6\u04c7\u0003"+
-    "F\u001b\u0000\u04c7\u04c8\u0001\u0000\u0000\u0000\u04c8\u04c9\u0006|\u0010"+
-    "\u0000\u04c9\u04ca\u0006|\f\u0000\u04ca\u0109\u0001\u0000\u0000\u0000"+
-    "\u04cb\u04cc\u0003h,\u0000\u04cc\u04cd\u0001\u0000\u0000\u0000\u04cd\u04ce"+
-    "\u0006}\u0015\u0000\u04ce\u010b\u0001\u0000\u0000\u0000\u04cf\u04d0\u0003"+
-    "n/\u0000\u04d0\u04d1\u0001\u0000\u0000\u0000\u04d1\u04d2\u0006~\u0014"+
-    "\u0000\u04d2\u010d\u0001\u0000\u0000\u0000\u04d3\u04d4\u0003r1\u0000\u04d4"+
-    "\u04d5\u0001\u0000\u0000\u0000\u04d5\u04d6\u0006\u007f\u0018\u0000\u04d6"+
-    "\u010f\u0001\u0000\u0000\u0000\u04d7\u04d8\u0003\u008a=\u0000\u04d8\u04d9"+
-    "\u0001\u0000\u0000\u0000\u04d9\u04da\u0006\u0080\u0019\u0000\u04da\u0111"+
-    "\u0001\u0000\u0000\u0000\u04db\u04dc\u0003\u00b2Q\u0000\u04dc\u04dd\u0001"+
-    "\u0000\u0000\u0000\u04dd\u04de\u0006\u0081\u001a\u0000\u04de\u0113\u0001"+
-    "\u0000\u0000\u0000\u04df\u04e0\u0003\u00aeO\u0000\u04e0\u04e1\u0001\u0000"+
-    "\u0000\u0000\u04e1\u04e2\u0006\u0082\u001b\u0000\u04e2\u0115\u0001\u0000"+
-    "\u0000\u0000\u04e3\u04e4\u0003\u00b4R\u0000\u04e4\u04e5\u0001\u0000\u0000"+
-    "\u0000\u04e5\u04e6\u0006\u0083\u001c\u0000\u04e6\u0117\u0001\u0000\u0000"+
-    "\u0000\u04e7\u04e8\u0007\f\u0000\u0000\u04e8\u04e9\u0007\u0002\u0000\u0000"+
-    "\u04e9\u0119\u0001\u0000\u0000\u0000\u04ea\u04eb\u0003\u0100x\u0000\u04eb"+
-    "\u04ec\u0001\u0000\u0000\u0000\u04ec\u04ed\u0006\u0085\u001d\u0000\u04ed"+
-    "\u011b\u0001\u0000\u0000\u0000\u04ee\u04ef\u0003@\u0018\u0000\u04ef\u04f0"+
-    "\u0001\u0000\u0000\u0000\u04f0\u04f1\u0006\u0086\u000b\u0000\u04f1\u011d"+
-    "\u0001\u0000\u0000\u0000\u04f2\u04f3\u0003B\u0019\u0000\u04f3\u04f4\u0001"+
-    "\u0000\u0000\u0000\u04f4\u04f5\u0006\u0087\u000b\u0000\u04f5\u011f\u0001"+
-    "\u0000\u0000\u0000\u04f6\u04f7\u0003D\u001a\u0000\u04f7\u04f8\u0001\u0000"+
-    "\u0000\u0000\u04f8\u04f9\u0006\u0088\u000b\u0000\u04f9\u0121\u0001\u0000"+
-    "\u0000\u0000\u04fa\u04fb\u0003F\u001b\u0000\u04fb\u04fc\u0001\u0000\u0000"+
-    "\u0000\u04fc\u04fd\u0006\u0089\u0010\u0000\u04fd\u04fe\u0006\u0089\f\u0000"+
-    "\u04fe\u0123\u0001\u0000\u0000\u0000\u04ff\u0500\u0003\u00b6S\u0000\u0500"+
-    "\u0501\u0001\u0000\u0000\u0000\u0501\u0502\u0006\u008a\u000e\u0000\u0502"+
-    "\u0503\u0006\u008a\u001e\u0000\u0503\u0125\u0001\u0000\u0000\u0000\u0504"+
-    "\u0505\u0007\u0007\u0000\u0000\u0505\u0506\u0007\t\u0000\u0000\u0506\u0507"+
-    "\u0001\u0000\u0000\u0000\u0507\u0508\u0006\u008b\u001f\u0000\u0508\u0127"+
-    "\u0001\u0000\u0000\u0000\u0509\u050a\u0007\u0013\u0000\u0000\u050a\u050b"+
-    "\u0007\u0001\u0000\u0000\u050b\u050c\u0007\u0005\u0000\u0000\u050c\u050d"+
-    "\u0007\n\u0000\u0000\u050d\u050e\u0001\u0000\u0000\u0000\u050e\u050f\u0006"+
-    "\u008c\u001f\u0000\u050f\u0129\u0001\u0000\u0000\u0000\u0510\u0511\b\""+
-    "\u0000\u0000\u0511\u012b\u0001\u0000\u0000\u0000\u0512\u0514\u0003\u012a"+
-    "\u008d\u0000\u0513\u0512\u0001\u0000\u0000\u0000\u0514\u0515\u0001\u0000"+
-    "\u0000\u0000\u0515\u0513\u0001\u0000\u0000\u0000\u0515\u0516\u0001\u0000"+
-    "\u0000\u0000\u0516\u0517\u0001\u0000\u0000\u0000\u0517\u0518\u0003l.\u0000"+
-    "\u0518\u051a\u0001\u0000\u0000\u0000\u0519\u0513\u0001\u0000\u0000\u0000"+
-    "\u0519\u051a\u0001\u0000\u0000\u0000\u051a\u051c\u0001\u0000\u0000\u0000"+
-    "\u051b\u051d\u0003\u012a\u008d\u0000\u051c\u051b\u0001\u0000\u0000\u0000"+
-    "\u051d\u051e\u0001\u0000\u0000\u0000\u051e\u051c\u0001\u0000\u0000\u0000"+
-    "\u051e\u051f\u0001\u0000\u0000\u0000\u051f\u012d\u0001\u0000\u0000\u0000"+
-    "\u0520\u0521\u0003\u012c\u008e\u0000\u0521\u0522\u0001\u0000\u0000\u0000"+
-    "\u0522\u0523\u0006\u008f \u0000\u0523\u012f\u0001\u0000\u0000\u0000\u0524"+
-    "\u0525\u0003@\u0018\u0000\u0525\u0526\u0001\u0000\u0000\u0000\u0526\u0527"+
-    "\u0006\u0090\u000b\u0000\u0527\u0131\u0001\u0000\u0000\u0000\u0528\u0529"+
-    "\u0003B\u0019\u0000\u0529\u052a\u0001\u0000\u0000\u0000\u052a\u052b\u0006"+
-    "\u0091\u000b\u0000\u052b\u0133\u0001\u0000\u0000\u0000\u052c\u052d\u0003"+
-    "D\u001a\u0000\u052d\u052e\u0001\u0000\u0000\u0000\u052e\u052f\u0006\u0092"+
-    "\u000b\u0000\u052f\u0135\u0001\u0000\u0000\u0000\u0530\u0531\u0003F\u001b"+
-    "\u0000\u0531\u0532\u0001\u0000\u0000\u0000\u0532\u0533\u0006\u0093\u0010"+
-    "\u0000\u0533\u0534\u0006\u0093\f\u0000\u0534\u0535\u0006\u0093\f\u0000"+
-    "\u0535\u0137\u0001\u0000\u0000\u0000\u0536\u0537\u0003h,\u0000\u0537\u0538"+
-    "\u0001\u0000\u0000\u0000\u0538\u0539\u0006\u0094\u0015\u0000\u0539\u0139"+
-    "\u0001\u0000\u0000\u0000\u053a\u053b\u0003n/\u0000\u053b\u053c\u0001\u0000"+
-    "\u0000\u0000\u053c\u053d\u0006\u0095\u0014\u0000\u053d\u013b\u0001\u0000"+
-    "\u0000\u0000\u053e\u053f\u0003r1\u0000\u053f\u0540\u0001\u0000\u0000\u0000"+
-    "\u0540\u0541\u0006\u0096\u0018\u0000\u0541\u013d\u0001\u0000\u0000\u0000"+
-    "\u0542\u0543\u0003\u0128\u008c\u0000\u0543\u0544\u0001\u0000\u0000\u0000"+
-    "\u0544\u0545\u0006\u0097!\u0000\u0545\u013f\u0001\u0000\u0000\u0000\u0546"+
-    "\u0547\u0003\u0100x\u0000\u0547\u0548\u0001\u0000\u0000\u0000\u0548\u0549"+
-    "\u0006\u0098\u001d\u0000\u0549\u0141\u0001\u0000\u0000\u0000\u054a\u054b"+
-    "\u0003\u00beW\u0000\u054b\u054c\u0001\u0000\u0000\u0000\u054c\u054d\u0006"+
-    "\u0099\"\u0000\u054d\u0143\u0001\u0000\u0000\u0000\u054e\u054f\u0003\u008a"+
-    "=\u0000\u054f\u0550\u0001\u0000\u0000\u0000\u0550\u0551\u0006\u009a\u0019"+
-    "\u0000\u0551\u0145\u0001\u0000\u0000\u0000\u0552\u0553\u0003\u00b2Q\u0000"+
-    "\u0553\u0554\u0001\u0000\u0000\u0000\u0554\u0555\u0006\u009b\u001a\u0000"+
-    "\u0555\u0147\u0001\u0000\u0000\u0000\u0556\u0557\u0003\u00aeO\u0000\u0557"+
-    "\u0558\u0001\u0000\u0000\u0000\u0558\u0559\u0006\u009c\u001b\u0000\u0559"+
-    "\u0149\u0001\u0000\u0000\u0000\u055a\u055b\u0003\u00b4R\u0000\u055b\u055c"+
-    "\u0001\u0000\u0000\u0000\u055c\u055d\u0006\u009d\u001c\u0000\u055d\u014b"+
-    "\u0001\u0000\u0000\u0000\u055e\u055f\u0003@\u0018\u0000\u055f\u0560\u0001"+
-    "\u0000\u0000\u0000\u0560\u0561\u0006\u009e\u000b\u0000\u0561\u014d\u0001"+
-    "\u0000\u0000\u0000\u0562\u0563\u0003B\u0019\u0000\u0563\u0564\u0001\u0000"+
-    "\u0000\u0000\u0564\u0565\u0006\u009f\u000b\u0000\u0565\u014f\u0001\u0000"+
-    "\u0000\u0000\u0566\u0567\u0003D\u001a\u0000\u0567\u0568\u0001\u0000\u0000"+
-    "\u0000\u0568\u0569\u0006\u00a0\u000b\u0000\u0569\u0151\u0001\u0000\u0000"+
-    "\u0000\u056a\u056b\u0003F\u001b\u0000\u056b\u056c\u0001\u0000\u0000\u0000"+
-    "\u056c\u056d\u0006\u00a1\u0010\u0000\u056d\u056e\u0006\u00a1\f\u0000\u056e"+
-    "\u0153\u0001\u0000\u0000\u0000\u056f\u0570\u0003r1\u0000\u0570\u0571\u0001"+
-    "\u0000\u0000\u0000\u0571\u0572\u0006\u00a2\u0018\u0000\u0572\u0155\u0001"+
-    "\u0000\u0000\u0000\u0573\u0574\u0003\u008a=\u0000\u0574\u0575\u0001\u0000"+
-    "\u0000\u0000\u0575\u0576\u0006\u00a3\u0019\u0000\u0576\u0157\u0001\u0000"+
-    "\u0000\u0000\u0577\u0578\u0003\u00b2Q\u0000\u0578\u0579\u0001\u0000\u0000"+
-    "\u0000\u0579\u057a\u0006\u00a4\u001a\u0000\u057a\u0159\u0001\u0000\u0000"+
-    "\u0000\u057b\u057c\u0003\u00aeO\u0000\u057c\u057d\u0001\u0000\u0000\u0000"+
-    "\u057d\u057e\u0006\u00a5\u001b\u0000\u057e\u015b\u0001\u0000\u0000\u0000"+
-    "\u057f\u0580\u0003\u00b4R\u0000\u0580\u0581\u0001\u0000\u0000\u0000\u0581"+
-    "\u0582\u0006\u00a6\u001c\u0000\u0582\u015d\u0001\u0000\u0000\u0000\u0583"+
-    "\u0584\u0003\u00beW\u0000\u0584\u0585\u0001\u0000\u0000\u0000\u0585\u0586"+
-    "\u0006\u00a7\"\u0000\u0586\u015f\u0001\u0000\u0000\u0000\u0587\u0588\u0003"+
-    "\u00baU\u0000\u0588\u0589\u0001\u0000\u0000\u0000\u0589\u058a\u0006\u00a8"+
-    "#\u0000\u058a\u0161\u0001\u0000\u0000\u0000\u058b\u058c\u0003@\u0018\u0000"+
-    "\u058c\u058d\u0001\u0000\u0000\u0000\u058d\u058e\u0006\u00a9\u000b\u0000"+
-    "\u058e\u0163\u0001\u0000\u0000\u0000\u058f\u0590\u0003B\u0019\u0000\u0590"+
-    "\u0591\u0001\u0000\u0000\u0000\u0591\u0592\u0006\u00aa\u000b\u0000\u0592"+
-    "\u0165\u0001\u0000\u0000\u0000\u0593\u0594\u0003D\u001a\u0000\u0594\u0595"+
-    "\u0001\u0000\u0000\u0000\u0595\u0596\u0006\u00ab\u000b\u0000\u0596\u0167"+
-    "\u0001\u0000\u0000\u0000\u0597\u0598\u0003F\u001b\u0000\u0598\u0599\u0001"+
-    "\u0000\u0000\u0000\u0599\u059a\u0006\u00ac\u0010\u0000\u059a\u059b\u0006"+
-    "\u00ac\f\u0000\u059b\u0169\u0001\u0000\u0000\u0000\u059c\u059d\u0007\u0001"+
-    "\u0000\u0000\u059d\u059e\u0007\t\u0000\u0000\u059e\u059f\u0007\u000f\u0000"+
-    "\u0000\u059f\u05a0\u0007\u0007\u0000\u0000\u05a0\u016b\u0001\u0000\u0000"+
-    "\u0000\u05a1\u05a2\u0003@\u0018\u0000\u05a2\u05a3\u0001\u0000\u0000\u0000"+
-    "\u05a3\u05a4\u0006\u00ae\u000b\u0000\u05a4\u016d\u0001\u0000\u0000\u0000"+
-    "\u05a5\u05a6\u0003B\u0019\u0000\u05a6\u05a7\u0001\u0000\u0000\u0000\u05a7"+
-    "\u05a8\u0006\u00af\u000b\u0000\u05a8\u016f\u0001\u0000\u0000\u0000\u05a9"+
-    "\u05aa\u0003D\u001a\u0000\u05aa\u05ab\u0001\u0000\u0000\u0000\u05ab\u05ac"+
-    "\u0006\u00b0\u000b\u0000\u05ac\u0171\u0001\u0000\u0000\u0000\u05ad\u05ae"+
-    "\u0003\u00b8T\u0000\u05ae\u05af\u0001\u0000\u0000\u0000\u05af\u05b0\u0006"+
-    "\u00b1\u0011\u0000\u05b0\u05b1\u0006\u00b1\f\u0000\u05b1\u0173\u0001\u0000"+
-    "\u0000\u0000\u05b2\u05b3\u0003l.\u0000\u05b3\u05b4\u0001\u0000\u0000\u0000"+
-    "\u05b4\u05b5\u0006\u00b2\u0012\u0000\u05b5\u0175\u0001\u0000\u0000\u0000"+
-    "\u05b6\u05bc\u0003R!\u0000\u05b7\u05bc\u0003H\u001c\u0000\u05b8\u05bc"+
-    "\u0003r1\u0000\u05b9\u05bc\u0003J\u001d\u0000\u05ba\u05bc\u0003X$\u0000"+
-    "\u05bb\u05b6\u0001\u0000\u0000\u0000\u05bb\u05b7\u0001\u0000\u0000\u0000"+
-    "\u05bb\u05b8\u0001\u0000\u0000\u0000\u05bb\u05b9\u0001\u0000\u0000\u0000"+
-    "\u05bb\u05ba\u0001\u0000\u0000\u0000\u05bc\u05bd\u0001\u0000\u0000\u0000"+
-    "\u05bd\u05bb\u0001\u0000\u0000\u0000\u05bd\u05be\u0001\u0000\u0000\u0000"+
-    "\u05be\u0177\u0001\u0000\u0000\u0000\u05bf\u05c0\u0003@\u0018\u0000\u05c0"+
-    "\u05c1\u0001\u0000\u0000\u0000\u05c1\u05c2\u0006\u00b4\u000b\u0000\u05c2"+
-    "\u0179\u0001\u0000\u0000\u0000\u05c3\u05c4\u0003B\u0019\u0000\u05c4\u05c5"+
-    "\u0001\u0000\u0000\u0000\u05c5\u05c6\u0006\u00b5\u000b\u0000\u05c6\u017b"+
-    "\u0001\u0000\u0000\u0000\u05c7\u05c8\u0003D\u001a\u0000\u05c8\u05c9\u0001"+
-    "\u0000\u0000\u0000\u05c9\u05ca\u0006\u00b6\u000b\u0000\u05ca\u017d\u0001"+
-    "\u0000\u0000\u0000\u05cb\u05cc\u0003F\u001b\u0000\u05cc\u05cd\u0001\u0000"+
-    "\u0000\u0000\u05cd\u05ce\u0006\u00b7\u0010\u0000\u05ce\u05cf\u0006\u00b7"+
-    "\f\u0000\u05cf\u017f\u0001\u0000\u0000\u0000\u05d0\u05d1\u0003l.\u0000"+
-    "\u05d1\u05d2\u0001\u0000\u0000\u0000\u05d2\u05d3\u0006\u00b8\u0012\u0000"+
-    "\u05d3\u0181\u0001\u0000\u0000\u0000\u05d4\u05d5\u0003n/\u0000\u05d5\u05d6"+
-    "\u0001\u0000\u0000\u0000\u05d6\u05d7\u0006\u00b9\u0014\u0000\u05d7\u0183"+
-    "\u0001\u0000\u0000\u0000\u05d8\u05d9\u0003r1\u0000\u05d9\u05da\u0001\u0000"+
-    "\u0000\u0000\u05da\u05db\u0006\u00ba\u0018\u0000\u05db\u0185\u0001\u0000"+
-    "\u0000\u0000\u05dc\u05dd\u0003\u0126\u008b\u0000\u05dd\u05de\u0001\u0000"+
-    "\u0000\u0000\u05de\u05df\u0006\u00bb$\u0000\u05df\u05e0\u0006\u00bb%\u0000"+
-    "\u05e0\u0187\u0001\u0000\u0000\u0000\u05e1\u05e2\u0003\u00e2i\u0000\u05e2"+
-    "\u05e3\u0001\u0000\u0000\u0000\u05e3\u05e4\u0006\u00bc\u0016\u0000\u05e4"+
-    "\u0189\u0001\u0000\u0000\u0000\u05e5\u05e6\u0003\\&\u0000\u05e6\u05e7"+
-    "\u0001\u0000\u0000\u0000\u05e7\u05e8\u0006\u00bd\u0017\u0000\u05e8\u018b"+
-    "\u0001\u0000\u0000\u0000\u05e9\u05ea\u0003@\u0018\u0000\u05ea\u05eb\u0001"+
-    "\u0000\u0000\u0000\u05eb\u05ec\u0006\u00be\u000b\u0000\u05ec\u018d\u0001"+
-    "\u0000\u0000\u0000\u05ed\u05ee\u0003B\u0019\u0000\u05ee\u05ef\u0001\u0000"+
-    "\u0000\u0000\u05ef\u05f0\u0006\u00bf\u000b\u0000\u05f0\u018f\u0001\u0000"+
-    "\u0000\u0000\u05f1\u05f2\u0003D\u001a\u0000\u05f2\u05f3\u0001\u0000\u0000"+
-    "\u0000\u05f3\u05f4\u0006\u00c0\u000b\u0000\u05f4\u0191\u0001\u0000\u0000"+
-    "\u0000\u05f5\u05f6\u0003F\u001b\u0000\u05f6\u05f7\u0001\u0000\u0000\u0000"+
-    "\u05f7\u05f8\u0006\u00c1\u0010\u0000\u05f8\u05f9\u0006\u00c1\f\u0000\u05f9"+
-    "\u05fa\u0006\u00c1\f\u0000\u05fa\u0193\u0001\u0000\u0000\u0000\u05fb\u05fc"+
-    "\u0003n/\u0000\u05fc\u05fd\u0001\u0000\u0000\u0000\u05fd\u05fe\u0006\u00c2"+
-    "\u0014\u0000\u05fe\u0195\u0001\u0000\u0000\u0000\u05ff\u0600\u0003r1\u0000"+
-    "\u0600\u0601\u0001\u0000\u0000\u0000\u0601\u0602\u0006\u00c3\u0018\u0000"+
-    "\u0602\u0197\u0001\u0000\u0000\u0000\u0603\u0604\u0003\u0100x\u0000\u0604"+
-    "\u0605\u0001\u0000\u0000\u0000\u0605\u0606\u0006\u00c4\u001d\u0000\u0606"+
-    "\u0199\u0001\u0000\u0000\u0000\u0607\u0608\u0003@\u0018\u0000\u0608\u0609"+
-    "\u0001\u0000\u0000\u0000\u0609\u060a\u0006\u00c5\u000b\u0000\u060a\u019b"+
-    "\u0001\u0000\u0000\u0000\u060b\u060c\u0003B\u0019\u0000\u060c\u060d\u0001"+
-    "\u0000\u0000\u0000\u060d\u060e\u0006\u00c6\u000b\u0000\u060e\u019d\u0001"+
-    "\u0000\u0000\u0000\u060f\u0610\u0003D\u001a\u0000\u0610\u0611\u0001\u0000"+
-    "\u0000\u0000\u0611\u0612\u0006\u00c7\u000b\u0000\u0612\u019f\u0001\u0000"+
-    "\u0000\u0000\u0613\u0614\u0003F\u001b\u0000\u0614\u0615\u0001\u0000\u0000"+
-    "\u0000\u0615\u0616\u0006\u00c8\u0010\u0000\u0616\u0617\u0006\u00c8\f\u0000"+
-    "\u0617\u01a1\u0001\u0000\u0000\u0000\u0618\u0619\u0007#\u0000\u0000\u0619"+
-    "\u061a\u0007\u0007\u0000\u0000\u061a\u061b\u0007\u0001\u0000\u0000\u061b"+
-    "\u061c\u0007\t\u0000\u0000\u061c\u01a3\u0001\u0000\u0000\u0000\u061d\u061e"+
-    "\u0003\u0118\u0084\u0000\u061e\u061f\u0001\u0000\u0000\u0000\u061f\u0620"+
-    "\u0006\u00ca&\u0000\u0620\u01a5\u0001\u0000\u0000\u0000\u0621\u0622\u0003"+
-    "\u0126\u008b\u0000\u0622\u0623\u0001\u0000\u0000\u0000\u0623\u0624\u0006"+
-    "\u00cb$\u0000\u0624\u0625\u0006\u00cb\f\u0000\u0625\u0626\u0006\u00cb"+
-    "\u0000\u0000\u0626\u01a7\u0001\u0000\u0000\u0000\u0627\u0628\u0007\u0014"+
-    "\u0000\u0000\u0628\u0629\u0007\u0002\u0000\u0000\u0629\u062a\u0007\u0001"+
-    "\u0000\u0000\u062a\u062b\u0007\t\u0000\u0000\u062b\u062c\u0007\u0011\u0000"+
-    "\u0000\u062c\u062d\u0001\u0000\u0000\u0000\u062d\u062e\u0006\u00cc\f\u0000"+
-    "\u062e\u062f\u0006\u00cc\u0000\u0000\u062f\u01a9\u0001\u0000\u0000\u0000"+
-    "\u0630\u0631\u0003\u00e2i\u0000\u0631\u0632\u0001\u0000\u0000\u0000\u0632"+
-    "\u0633\u0006\u00cd\u0016\u0000\u0633\u01ab\u0001\u0000\u0000\u0000\u0634"+
-    "\u0635\u0003\\&\u0000\u0635\u0636\u0001\u0000\u0000\u0000\u0636\u0637"+
-    "\u0006\u00ce\u0017\u0000\u0637\u01ad\u0001\u0000\u0000\u0000\u0638\u0639"+
-    "\u0003l.\u0000\u0639\u063a\u0001\u0000\u0000\u0000\u063a\u063b\u0006\u00cf"+
-    "\u0012\u0000\u063b\u01af\u0001\u0000\u0000\u0000\u063c\u063d\u0003\u00ba"+
-    "U\u0000\u063d\u063e\u0001\u0000\u0000\u0000\u063e\u063f\u0006\u00d0#\u0000"+
-    "\u063f\u01b1\u0001\u0000\u0000\u0000\u0640\u0641\u0003\u00beW\u0000\u0641"+
-    "\u0642\u0001\u0000\u0000\u0000\u0642\u0643\u0006\u00d1\"\u0000\u0643\u01b3"+
-    "\u0001\u0000\u0000\u0000\u0644\u0645\u0003@\u0018\u0000\u0645\u0646\u0001"+
-    "\u0000\u0000\u0000\u0646\u0647\u0006\u00d2\u000b\u0000\u0647\u01b5\u0001"+
-    "\u0000\u0000\u0000\u0648\u0649\u0003B\u0019\u0000\u0649\u064a\u0001\u0000"+
-    "\u0000\u0000\u064a\u064b\u0006\u00d3\u000b\u0000\u064b\u01b7\u0001\u0000"+
-    "\u0000\u0000\u064c\u064d\u0003D\u001a\u0000\u064d\u064e\u0001\u0000\u0000"+
-    "\u0000\u064e\u064f\u0006\u00d4\u000b\u0000\u064f\u01b9\u0001\u0000\u0000"+
-    "\u0000\u0650\u0651\u0003F\u001b\u0000\u0651\u0652\u0001\u0000\u0000\u0000"+
-    "\u0652\u0653\u0006\u00d5\u0010\u0000\u0653\u0654\u0006\u00d5\f\u0000\u0654"+
-    "\u01bb\u0001\u0000\u0000\u0000\u0655\u0656\u0003\u00e2i\u0000\u0656\u0657"+
-    "\u0001\u0000\u0000\u0000\u0657\u0658\u0006\u00d6\u0016\u0000\u0658\u0659"+
-    "\u0006\u00d6\f\u0000\u0659\u065a\u0006\u00d6\'\u0000\u065a\u01bd\u0001"+
-    "\u0000\u0000\u0000\u065b\u065c\u0003\\&\u0000\u065c\u065d\u0001\u0000"+
-    "\u0000\u0000\u065d\u065e\u0006\u00d7\u0017\u0000\u065e\u065f\u0006\u00d7"+
-    "\f\u0000\u065f\u0660\u0006\u00d7\'\u0000\u0660\u01bf\u0001\u0000\u0000"+
-    "\u0000\u0661\u0662\u0003@\u0018\u0000\u0662\u0663\u0001\u0000\u0000\u0000"+
-    "\u0663\u0664\u0006\u00d8\u000b\u0000\u0664\u01c1\u0001\u0000\u0000\u0000"+
-    "\u0665\u0666\u0003B\u0019\u0000\u0666\u0667\u0001\u0000\u0000\u0000\u0667"+
-    "\u0668\u0006\u00d9\u000b\u0000\u0668\u01c3\u0001\u0000\u0000\u0000\u0669"+
-    "\u066a\u0003D\u001a\u0000\u066a\u066b\u0001\u0000\u0000\u0000\u066b\u066c"+
-    "\u0006\u00da\u000b\u0000\u066c\u01c5\u0001\u0000\u0000\u0000\u066d\u066e"+
-    "\u0003l.\u0000\u066e\u066f\u0001\u0000\u0000\u0000\u066f\u0670\u0006\u00db"+
-    "\u0012\u0000\u0670\u0671\u0006\u00db\f\u0000\u0671\u0672\u0006\u00db\n"+
-    "\u0000\u0672\u01c7\u0001\u0000\u0000\u0000\u0673\u0674\u0003j-\u0000\u0674"+
-    "\u0675\u0001\u0000\u0000\u0000\u0675\u0676\u0006\u00dc\u0013\u0000\u0676"+
-    "\u0677\u0006\u00dc\f\u0000\u0677\u0678\u0006\u00dc\n\u0000\u0678\u01c9"+
-    "\u0001\u0000\u0000\u0000\u0679\u067a\u0003n/\u0000\u067a\u067b\u0001\u0000"+
-    "\u0000\u0000\u067b\u067c\u0006\u00dd\u0014\u0000\u067c\u067d\u0006\u00dd"+
-    "\f\u0000\u067d\u067e\u0006\u00dd\n\u0000\u067e\u01cb\u0001\u0000\u0000"+
-    "\u0000\u067f\u0680\u0003@\u0018\u0000\u0680\u0681\u0001\u0000\u0000\u0000"+
-    "\u0681\u0682\u0006\u00de\u000b\u0000\u0682\u01cd\u0001\u0000\u0000\u0000"+
-    "\u0683\u0684\u0003B\u0019\u0000\u0684\u0685\u0001\u0000\u0000\u0000\u0685"+
-    "\u0686\u0006\u00df\u000b\u0000\u0686\u01cf\u0001\u0000\u0000\u0000\u0687"+
-    "\u0688\u0003D\u001a\u0000\u0688\u0689\u0001\u0000\u0000\u0000\u0689\u068a"+
-    "\u0006\u00e0\u000b\u0000\u068a\u01d1\u0001\u0000\u0000\u0000\u068b\u068c"+
-    "\u0003\u00beW\u0000\u068c\u068d\u0001\u0000\u0000\u0000\u068d\u068e\u0006"+
-    "\u00e1\f\u0000\u068e\u068f\u0006\u00e1\u0000\u0000\u068f\u0690\u0006\u00e1"+
-    "\"\u0000\u0690\u01d3\u0001\u0000\u0000\u0000\u0691\u0692\u0003\u00baU"+
-    "\u0000\u0692\u0693\u0001\u0000\u0000\u0000\u0693\u0694\u0006\u00e2\f\u0000"+
-    "\u0694\u0695\u0006\u00e2\u0000\u0000\u0695\u0696\u0006\u00e2#\u0000\u0696"+
-    "\u01d5\u0001\u0000\u0000\u0000\u0697\u0698\u0003b)\u0000\u0698\u0699\u0001"+
-    "\u0000\u0000\u0000\u0699\u069a\u0006\u00e3\f\u0000\u069a\u069b\u0006\u00e3"+
-    "\u0000\u0000\u069b\u069c\u0006\u00e3(\u0000\u069c\u01d7\u0001\u0000\u0000"+
-    "\u0000\u069d\u069e\u0003F\u001b\u0000\u069e\u069f\u0001\u0000\u0000\u0000"+
-    "\u069f\u06a0\u0006\u00e4\u0010\u0000\u06a0\u06a1\u0006\u00e4\f\u0000\u06a1"+
-    "\u01d9\u0001\u0000\u0000\u0000F\u0000\u0001\u0002\u0003\u0004\u0005\u0006"+
-    "\u0007\b\t\n\u000b\f\r\u000e\u000f\u02a6\u02b0\u02b4\u02b7\u02c0\u02c2"+
-    "\u02cd\u02e0\u02e5\u02ee\u02f5\u02fa\u02fc\u0307\u030f\u0312\u0314\u0319"+
-    "\u031e\u0324\u032b\u0330\u0336\u0339\u0341\u0345\u03cc\u03d1\u03d8\u03da"+
-    "\u03df\u03e4\u03eb\u03ed\u03fd\u0402\u0407\u0409\u040f\u0461\u0466\u049d"+
-    "\u04a1\u04a6\u04ab\u04b0\u04b2\u04b6\u04b8\u0515\u0519\u051e\u05bb\u05bd"+
-    ")\u0005\u0001\u0000\u0005\u0004\u0000\u0005\u0006\u0000\u0005\u0002\u0000"+
-    "\u0005\u0003\u0000\u0005\b\u0000\u0005\u0005\u0000\u0005\t\u0000\u0005"+
-    "\r\u0000\u0005\u000b\u0000\u0005\u000e\u0000\u0000\u0001\u0000\u0004\u0000"+
-    "\u0000\u0007\u0010\u0000\u0007I\u0000\u0005\u0000\u0000\u0007\u001c\u0000"+
-    "\u0007J\u0000\u0007%\u0000\u0007$\u0000\u0007&\u0000\u0007#\u0000\u0007"+
-    "T\u0000\u0007\u001d\u0000\u0007(\u0000\u00074\u0000\u0007G\u0000\u0007"+
-    "F\u0000\u0007H\u0000\u0007X\u0000\u0005\n\u0000\u0005\u0007\u0000\u0007"+
-    "b\u0000\u0007a\u0000\u0007L\u0000\u0007K\u0000\u0007`\u0000\u0005\f\u0000"+
-    "\u0007\\\u0000\u0005\u000f\u0000\u0007 \u0000";
+    "e\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001g\u0001"+
+    "g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001"+
+    "h\u0001h\u0001i\u0001i\u0001i\u0003i\u0488\bi\u0001j\u0004j\u048b\bj\u000b"+
+    "j\fj\u048c\u0001k\u0001k\u0001k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001"+
+    "m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001"+
+    "o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001p\u0001q\u0001q\u0001q\u0001"+
+    "q\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001t\u0001"+
+    "t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001"+
+    "v\u0001w\u0001w\u0001w\u0001w\u0003w\u04c4\bw\u0001x\u0001x\u0003x\u04c8"+
+    "\bx\u0001x\u0005x\u04cb\bx\nx\fx\u04ce\tx\u0001x\u0001x\u0003x\u04d2\b"+
+    "x\u0001x\u0004x\u04d5\bx\u000bx\fx\u04d6\u0003x\u04d9\bx\u0001y\u0001"+
+    "y\u0004y\u04dd\by\u000by\fy\u04de\u0001z\u0001z\u0001z\u0001z\u0001{\u0001"+
+    "{\u0001{\u0001{\u0001|\u0001|\u0001|\u0001|\u0001}\u0001}\u0001}\u0001"+
+    "}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f"+
+    "\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081"+
+    "\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082"+
+    "\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084"+
+    "\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085"+
+    "\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087"+
+    "\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088\u0001\u0088"+
+    "\u0001\u0089\u0001\u0089\u0001\u0089\u0001\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\u008d\u0001\u008d\u0001\u008e\u0001\u008e\u0001\u008f\u0004\u008f"+
+    "\u053a\b\u008f\u000b\u008f\f\u008f\u053b\u0001\u008f\u0001\u008f\u0003"+
+    "\u008f\u0540\b\u008f\u0001\u008f\u0004\u008f\u0543\b\u008f\u000b\u008f"+
+    "\f\u008f\u0544\u0001\u0090\u0001\u0090\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\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\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b"+
+    "\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c"+
+    "\u0001\u009c\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\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\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9"+
+    "\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\u00ad\u0001\u00ae"+
+    "\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\u00b3\u0001\u00b3\u0001\u00b3"+
+    "\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4"+
+    "\u0004\u00b4\u05e2\b\u00b4\u000b\u00b4\f\u00b4\u05e3\u0001\u00b5\u0001"+
+    "\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001"+
+    "\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8\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\u00bc\u0001"+
+    "\u00bc\u0001\u00bc\u0001\u00bc\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\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\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c9\u0001"+
+    "\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00ca\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\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\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001"+
+    "\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d7\u0001"+
+    "\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8\u0001"+
+    "\u00d8\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\u00dc\u0001\u00dc\u0001\u00dd\u0001"+
+    "\u00dd\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\u00e2\u0001\u00e2\u0001\u00e3\u0001"+
+    "\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e4\u0001"+
+    "\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e5\u0001"+
+    "\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\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\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001"+
+    "\u00ed\u0001\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ef\u0001"+
+    "\u00ef\u0001\u00ef\u0001\u00ef\u0002\u02e8\u032d\u0000\u00f0\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\u0013"+
+    "7\u00149\u0015;\u0016=\u0017?\u0018A\u0019C\u001aE\u001bG\u001cI\u001d"+
+    "K\u0000M\u0000O\u0000Q\u0000S\u0000U\u0000W\u0000Y\u0000[\u0000]\u0000"+
+    "_\u001ea\u001fc e!g\"i#k$m%o&q\'s(u)w*y+{,}-\u007f.\u0081/\u00830\u0085"+
+    "1\u00872\u00893\u008b4\u008d5\u008f6\u00917\u00938\u00959\u0097:\u0099"+
+    ";\u009b<\u009d=\u009f>\u00a1?\u00a3@\u00a5A\u00a7B\u00a9C\u00abD\u00ad"+
+    "E\u00afF\u00b1G\u00b3\u0000\u00b5H\u00b7I\u00b9J\u00bbK\u00bdL\u00bf\u0000"+
+    "\u00c1M\u00c3N\u00c5O\u00c7P\u00c9\u0000\u00cb\u0000\u00cdQ\u00cfR\u00d1"+
+    "S\u00d3\u0000\u00d5\u0000\u00d7\u0000\u00d9\u0000\u00db\u0000\u00dd\u0000"+
+    "\u00df\u0000\u00e1T\u00e3\u0000\u00e5U\u00e7\u0000\u00e9\u0000\u00ebV"+
+    "\u00edW\u00efX\u00f1\u0000\u00f3\u0000\u00f5\u0000\u00f7\u0000\u00f9\u0000"+
+    "\u00fb\u0000\u00fd\u0000\u00ff\u0000\u0101\u0000\u0103Y\u0105Z\u0107["+
+    "\u0109\\\u010b\u0000\u010d\u0000\u010f\u0000\u0111\u0000\u0113\u0000\u0115"+
+    "\u0000\u0117\u0000\u0119\u0000\u011b]\u011d\u0000\u011f^\u0121_\u0123"+
+    "`\u0125\u0000\u0127\u0000\u0129a\u012bb\u012d\u0000\u012fc\u0131\u0000"+
+    "\u0133d\u0135e\u0137f\u0139\u0000\u013b\u0000\u013d\u0000\u013f\u0000"+
+    "\u0141\u0000\u0143\u0000\u0145\u0000\u0147\u0000\u0149\u0000\u014b\u0000"+
+    "\u014d\u0000\u014fg\u0151h\u0153i\u0155\u0000\u0157\u0000\u0159\u0000"+
+    "\u015b\u0000\u015d\u0000\u015f\u0000\u0161\u0000\u0163\u0000\u0165j\u0167"+
+    "k\u0169l\u016b\u0000\u016dm\u016fn\u0171o\u0173p\u0175\u0000\u0177\u0000"+
+    "\u0179q\u017br\u017ds\u017ft\u0181\u0000\u0183\u0000\u0185\u0000\u0187"+
+    "\u0000\u0189\u0000\u018b\u0000\u018d\u0000\u018fu\u0191v\u0193w\u0195"+
+    "\u0000\u0197\u0000\u0199\u0000\u019b\u0000\u019dx\u019fy\u01a1z\u01a3"+
+    "\u0000\u01a5{\u01a7\u0000\u01a9\u0000\u01ab|\u01ad\u0000\u01af\u0000\u01b1"+
+    "\u0000\u01b3\u0000\u01b5\u0000\u01b7}\u01b9~\u01bb\u007f\u01bd\u0000\u01bf"+
+    "\u0000\u01c1\u0000\u01c3\u0080\u01c5\u0081\u01c7\u0082\u01c9\u0000\u01cb"+
+    "\u0000\u01cd\u0000\u01cf\u0083\u01d1\u0084\u01d3\u0085\u01d5\u0000\u01d7"+
+    "\u0000\u01d9\u0000\u01db\u0000\u01dd\u0000\u01df\u0000\u01e1\u0000\u01e3"+
+    "\u0000\u01e5\u0000\u01e7\u0000\u01e9\u0000\u01eb\u0086\u01ed\u0087\u01ef"+
+    "\u0088\u0011\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b"+
+    "\f\r\u000e\u000f\u0010$\u0002\u0000DDdd\u0002\u0000IIii\u0002\u0000SS"+
+    "ss\u0002\u0000EEee\u0002\u0000CCcc\u0002\u0000TTtt\u0002\u0000RRrr\u0002"+
+    "\u0000OOoo\u0002\u0000PPpp\u0002\u0000NNnn\u0002\u0000HHhh\u0002\u0000"+
+    "VVvv\u0002\u0000AAaa\u0002\u0000LLll\u0002\u0000XXxx\u0002\u0000FFff\u0002"+
+    "\u0000MMmm\u0002\u0000GGgg\u0002\u0000KKkk\u0002\u0000WWww\u0002\u0000"+
+    "UUuu\u0006\u0000\t\n\r\r  //[[]]\u0002\u0000\n\n\r\r\u0003\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\u0000"+
+    "YYyy\u000b\u0000\t\n\r\r  \"\",,//::==[[]]||\u0002\u0000**//\u000b\u0000"+
+    "\t\n\r\r  \"#,,//::<<>?\\\\||\u0002\u0000JJjj\u070f\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\u0000"+
+    "9\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\u0000"+
+    "G\u0001\u0000\u0000\u0000\u0001I\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\u0001"+
+    "i\u0001\u0000\u0000\u0000\u0001k\u0001\u0000\u0000\u0000\u0001m\u0001"+
+    "\u0000\u0000\u0000\u0001o\u0001\u0000\u0000\u0000\u0001q\u0001\u0000\u0000"+
+    "\u0000\u0001s\u0001\u0000\u0000\u0000\u0001u\u0001\u0000\u0000\u0000\u0001"+
+    "w\u0001\u0000\u0000\u0000\u0001y\u0001\u0000\u0000\u0000\u0001{\u0001"+
+    "\u0000\u0000\u0000\u0001}\u0001\u0000\u0000\u0000\u0001\u007f\u0001\u0000"+
+    "\u0000\u0000\u0001\u0081\u0001\u0000\u0000\u0000\u0001\u0083\u0001\u0000"+
+    "\u0000\u0000\u0001\u0085\u0001\u0000\u0000\u0000\u0001\u0087\u0001\u0000"+
+    "\u0000\u0000\u0001\u0089\u0001\u0000\u0000\u0000\u0001\u008b\u0001\u0000"+
+    "\u0000\u0000\u0001\u008d\u0001\u0000\u0000\u0000\u0001\u008f\u0001\u0000"+
+    "\u0000\u0000\u0001\u0091\u0001\u0000\u0000\u0000\u0001\u0093\u0001\u0000"+
+    "\u0000\u0000\u0001\u0095\u0001\u0000\u0000\u0000\u0001\u0097\u0001\u0000"+
+    "\u0000\u0000\u0001\u0099\u0001\u0000\u0000\u0000\u0001\u009b\u0001\u0000"+
+    "\u0000\u0000\u0001\u009d\u0001\u0000\u0000\u0000\u0001\u009f\u0001\u0000"+
+    "\u0000\u0000\u0001\u00a1\u0001\u0000\u0000\u0000\u0001\u00a3\u0001\u0000"+
+    "\u0000\u0000\u0001\u00a5\u0001\u0000\u0000\u0000\u0001\u00a7\u0001\u0000"+
+    "\u0000\u0000\u0001\u00a9\u0001\u0000\u0000\u0000\u0001\u00ab\u0001\u0000"+
+    "\u0000\u0000\u0001\u00ad\u0001\u0000\u0000\u0000\u0001\u00af\u0001\u0000"+
+    "\u0000\u0000\u0001\u00b1\u0001\u0000\u0000\u0000\u0001\u00b3\u0001\u0000"+
+    "\u0000\u0000\u0001\u00b5\u0001\u0000\u0000\u0000\u0001\u00b7\u0001\u0000"+
+    "\u0000\u0000\u0001\u00b9\u0001\u0000\u0000\u0000\u0001\u00bb\u0001\u0000"+
+    "\u0000\u0000\u0001\u00bd\u0001\u0000\u0000\u0000\u0001\u00c1\u0001\u0000"+
+    "\u0000\u0000\u0001\u00c3\u0001\u0000\u0000\u0000\u0001\u00c5\u0001\u0000"+
+    "\u0000\u0000\u0001\u00c7\u0001\u0000\u0000\u0000\u0002\u00c9\u0001\u0000"+
+    "\u0000\u0000\u0002\u00cb\u0001\u0000\u0000\u0000\u0002\u00cd\u0001\u0000"+
+    "\u0000\u0000\u0002\u00cf\u0001\u0000\u0000\u0000\u0002\u00d1\u0001\u0000"+
+    "\u0000\u0000\u0003\u00d3\u0001\u0000\u0000\u0000\u0003\u00d5\u0001\u0000"+
+    "\u0000\u0000\u0003\u00d7\u0001\u0000\u0000\u0000\u0003\u00d9\u0001\u0000"+
+    "\u0000\u0000\u0003\u00db\u0001\u0000\u0000\u0000\u0003\u00dd\u0001\u0000"+
+    "\u0000\u0000\u0003\u00df\u0001\u0000\u0000\u0000\u0003\u00e1\u0001\u0000"+
+    "\u0000\u0000\u0003\u00e5\u0001\u0000\u0000\u0000\u0003\u00e7\u0001\u0000"+
+    "\u0000\u0000\u0003\u00e9\u0001\u0000\u0000\u0000\u0003\u00eb\u0001\u0000"+
+    "\u0000\u0000\u0003\u00ed\u0001\u0000\u0000\u0000\u0003\u00ef\u0001\u0000"+
+    "\u0000\u0000\u0004\u00f1\u0001\u0000\u0000\u0000\u0004\u00f3\u0001\u0000"+
+    "\u0000\u0000\u0004\u00f5\u0001\u0000\u0000\u0000\u0004\u00f7\u0001\u0000"+
+    "\u0000\u0000\u0004\u00f9\u0001\u0000\u0000\u0000\u0004\u00fb\u0001\u0000"+
+    "\u0000\u0000\u0004\u00fd\u0001\u0000\u0000\u0000\u0004\u0103\u0001\u0000"+
+    "\u0000\u0000\u0004\u0105\u0001\u0000\u0000\u0000\u0004\u0107\u0001\u0000"+
+    "\u0000\u0000\u0004\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\u0006\u0125\u0001\u0000\u0000\u0000\u0006\u0127\u0001\u0000"+
+    "\u0000\u0000\u0006\u0129\u0001\u0000\u0000\u0000\u0006\u012b\u0001\u0000"+
+    "\u0000\u0000\u0006\u012f\u0001\u0000\u0000\u0000\u0006\u0131\u0001\u0000"+
+    "\u0000\u0000\u0006\u0133\u0001\u0000\u0000\u0000\u0006\u0135\u0001\u0000"+
+    "\u0000\u0000\u0006\u0137\u0001\u0000\u0000\u0000\u0007\u0139\u0001\u0000"+
+    "\u0000\u0000\u0007\u013b\u0001\u0000\u0000\u0000\u0007\u013d\u0001\u0000"+
+    "\u0000\u0000\u0007\u013f\u0001\u0000\u0000\u0000\u0007\u0141\u0001\u0000"+
+    "\u0000\u0000\u0007\u0143\u0001\u0000\u0000\u0000\u0007\u0145\u0001\u0000"+
+    "\u0000\u0000\u0007\u0147\u0001\u0000\u0000\u0000\u0007\u0149\u0001\u0000"+
+    "\u0000\u0000\u0007\u014b\u0001\u0000\u0000\u0000\u0007\u014d\u0001\u0000"+
+    "\u0000\u0000\u0007\u014f\u0001\u0000\u0000\u0000\u0007\u0151\u0001\u0000"+
+    "\u0000\u0000\u0007\u0153\u0001\u0000\u0000\u0000\b\u0155\u0001\u0000\u0000"+
+    "\u0000\b\u0157\u0001\u0000\u0000\u0000\b\u0159\u0001\u0000\u0000\u0000"+
+    "\b\u015b\u0001\u0000\u0000\u0000\b\u015d\u0001\u0000\u0000\u0000\b\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\t\u016b\u0001\u0000\u0000"+
+    "\u0000\t\u016d\u0001\u0000\u0000\u0000\t\u016f\u0001\u0000\u0000\u0000"+
+    "\t\u0171\u0001\u0000\u0000\u0000\t\u0173\u0001\u0000\u0000\u0000\n\u0175"+
+    "\u0001\u0000\u0000\u0000\n\u0177\u0001\u0000\u0000\u0000\n\u0179\u0001"+
+    "\u0000\u0000\u0000\n\u017b\u0001\u0000\u0000\u0000\n\u017d\u0001\u0000"+
+    "\u0000\u0000\n\u017f\u0001\u0000\u0000\u0000\u000b\u0181\u0001\u0000\u0000"+
+    "\u0000\u000b\u0183\u0001\u0000\u0000\u0000\u000b\u0185\u0001\u0000\u0000"+
+    "\u0000\u000b\u0187\u0001\u0000\u0000\u0000\u000b\u0189\u0001\u0000\u0000"+
+    "\u0000\u000b\u018b\u0001\u0000\u0000\u0000\u000b\u018d\u0001\u0000\u0000"+
+    "\u0000\u000b\u018f\u0001\u0000\u0000\u0000\u000b\u0191\u0001\u0000\u0000"+
+    "\u0000\u000b\u0193\u0001\u0000\u0000\u0000\f\u0195\u0001\u0000\u0000\u0000"+
+    "\f\u0197\u0001\u0000\u0000\u0000\f\u0199\u0001\u0000\u0000\u0000\f\u019b"+
+    "\u0001\u0000\u0000\u0000\f\u019d\u0001\u0000\u0000\u0000\f\u019f\u0001"+
+    "\u0000\u0000\u0000\f\u01a1\u0001\u0000\u0000\u0000\r\u01a3\u0001\u0000"+
+    "\u0000\u0000\r\u01a5\u0001\u0000\u0000\u0000\r\u01a7\u0001\u0000\u0000"+
+    "\u0000\r\u01a9\u0001\u0000\u0000\u0000\r\u01ab\u0001\u0000\u0000\u0000"+
+    "\r\u01ad\u0001\u0000\u0000\u0000\r\u01af\u0001\u0000\u0000\u0000\r\u01b1"+
+    "\u0001\u0000\u0000\u0000\r\u01b3\u0001\u0000\u0000\u0000\r\u01b5\u0001"+
+    "\u0000\u0000\u0000\r\u01b7\u0001\u0000\u0000\u0000\r\u01b9\u0001\u0000"+
+    "\u0000\u0000\r\u01bb\u0001\u0000\u0000\u0000\u000e\u01bd\u0001\u0000\u0000"+
+    "\u0000\u000e\u01bf\u0001\u0000\u0000\u0000\u000e\u01c1\u0001\u0000\u0000"+
+    "\u0000\u000e\u01c3\u0001\u0000\u0000\u0000\u000e\u01c5\u0001\u0000\u0000"+
+    "\u0000\u000e\u01c7\u0001\u0000\u0000\u0000\u000f\u01c9\u0001\u0000\u0000"+
+    "\u0000\u000f\u01cb\u0001\u0000\u0000\u0000\u000f\u01cd\u0001\u0000\u0000"+
+    "\u0000\u000f\u01cf\u0001\u0000\u0000\u0000\u000f\u01d1\u0001\u0000\u0000"+
+    "\u0000\u000f\u01d3\u0001\u0000\u0000\u0000\u000f\u01d5\u0001\u0000\u0000"+
+    "\u0000\u000f\u01d7\u0001\u0000\u0000\u0000\u000f\u01d9\u0001\u0000\u0000"+
+    "\u0000\u000f\u01db\u0001\u0000\u0000\u0000\u0010\u01dd\u0001\u0000\u0000"+
+    "\u0000\u0010\u01df\u0001\u0000\u0000\u0000\u0010\u01e1\u0001\u0000\u0000"+
+    "\u0000\u0010\u01e3\u0001\u0000\u0000\u0000\u0010\u01e5\u0001\u0000\u0000"+
+    "\u0000\u0010\u01e7\u0001\u0000\u0000\u0000\u0010\u01e9\u0001\u0000\u0000"+
+    "\u0000\u0010\u01eb\u0001\u0000\u0000\u0000\u0010\u01ed\u0001\u0000\u0000"+
+    "\u0000\u0010\u01ef\u0001\u0000\u0000\u0000\u0011\u01f1\u0001\u0000\u0000"+
+    "\u0000\u0013\u01fb\u0001\u0000\u0000\u0000\u0015\u0202\u0001\u0000\u0000"+
+    "\u0000\u0017\u020b\u0001\u0000\u0000\u0000\u0019\u0212\u0001\u0000\u0000"+
+    "\u0000\u001b\u021c\u0001\u0000\u0000\u0000\u001d\u0223\u0001\u0000\u0000"+
+    "\u0000\u001f\u022a\u0001\u0000\u0000\u0000!\u0231\u0001\u0000\u0000\u0000"+
+    "#\u0239\u0001\u0000\u0000\u0000%\u0245\u0001\u0000\u0000\u0000\'\u024e"+
+    "\u0001\u0000\u0000\u0000)\u0254\u0001\u0000\u0000\u0000+\u025b\u0001\u0000"+
+    "\u0000\u0000-\u0262\u0001\u0000\u0000\u0000/\u026a\u0001\u0000\u0000\u0000"+
+    "1\u0272\u0001\u0000\u0000\u00003\u027b\u0001\u0000\u0000\u00005\u028a"+
+    "\u0001\u0000\u0000\u00007\u0299\u0001\u0000\u0000\u00009\u02a5\u0001\u0000"+
+    "\u0000\u0000;\u02b0\u0001\u0000\u0000\u0000=\u02b8\u0001\u0000\u0000\u0000"+
+    "?\u02c0\u0001\u0000\u0000\u0000A\u02ca\u0001\u0000\u0000\u0000C\u02d0"+
+    "\u0001\u0000\u0000\u0000E\u02e1\u0001\u0000\u0000\u0000G\u02f1\u0001\u0000"+
+    "\u0000\u0000I\u02f7\u0001\u0000\u0000\u0000K\u02fb\u0001\u0000\u0000\u0000"+
+    "M\u02fd\u0001\u0000\u0000\u0000O\u02ff\u0001\u0000\u0000\u0000Q\u0302"+
+    "\u0001\u0000\u0000\u0000S\u0304\u0001\u0000\u0000\u0000U\u030d\u0001\u0000"+
+    "\u0000\u0000W\u030f\u0001\u0000\u0000\u0000Y\u0314\u0001\u0000\u0000\u0000"+
+    "[\u0316\u0001\u0000\u0000\u0000]\u031b\u0001\u0000\u0000\u0000_\u033a"+
+    "\u0001\u0000\u0000\u0000a\u033d\u0001\u0000\u0000\u0000c\u036b\u0001\u0000"+
+    "\u0000\u0000e\u036d\u0001\u0000\u0000\u0000g\u0370\u0001\u0000\u0000\u0000"+
+    "i\u0374\u0001\u0000\u0000\u0000k\u0378\u0001\u0000\u0000\u0000m\u037a"+
+    "\u0001\u0000\u0000\u0000o\u037d\u0001\u0000\u0000\u0000q\u037f\u0001\u0000"+
+    "\u0000\u0000s\u0381\u0001\u0000\u0000\u0000u\u0386\u0001\u0000\u0000\u0000"+
+    "w\u0388\u0001\u0000\u0000\u0000y\u038e\u0001\u0000\u0000\u0000{\u0394"+
+    "\u0001\u0000\u0000\u0000}\u0397\u0001\u0000\u0000\u0000\u007f\u039a\u0001"+
+    "\u0000\u0000\u0000\u0081\u039f\u0001\u0000\u0000\u0000\u0083\u03a4\u0001"+
+    "\u0000\u0000\u0000\u0085\u03a6\u0001\u0000\u0000\u0000\u0087\u03aa\u0001"+
+    "\u0000\u0000\u0000\u0089\u03af\u0001\u0000\u0000\u0000\u008b\u03b5\u0001"+
+    "\u0000\u0000\u0000\u008d\u03b8\u0001\u0000\u0000\u0000\u008f\u03ba\u0001"+
+    "\u0000\u0000\u0000\u0091\u03c0\u0001\u0000\u0000\u0000\u0093\u03c2\u0001"+
+    "\u0000\u0000\u0000\u0095\u03c7\u0001\u0000\u0000\u0000\u0097\u03ca\u0001"+
+    "\u0000\u0000\u0000\u0099\u03cd\u0001\u0000\u0000\u0000\u009b\u03d0\u0001"+
+    "\u0000\u0000\u0000\u009d\u03d2\u0001\u0000\u0000\u0000\u009f\u03d5\u0001"+
+    "\u0000\u0000\u0000\u00a1\u03d7\u0001\u0000\u0000\u0000\u00a3\u03da\u0001"+
+    "\u0000\u0000\u0000\u00a5\u03dc\u0001\u0000\u0000\u0000\u00a7\u03de\u0001"+
+    "\u0000\u0000\u0000\u00a9\u03e0\u0001\u0000\u0000\u0000\u00ab\u03e2\u0001"+
+    "\u0000\u0000\u0000\u00ad\u03e4\u0001\u0000\u0000\u0000\u00af\u03e6\u0001"+
+    "\u0000\u0000\u0000\u00b1\u03e8\u0001\u0000\u0000\u0000\u00b3\u03eb\u0001"+
+    "\u0000\u0000\u0000\u00b5\u0400\u0001\u0000\u0000\u0000\u00b7\u0413\u0001"+
+    "\u0000\u0000\u0000\u00b9\u0415\u0001\u0000\u0000\u0000\u00bb\u041a\u0001"+
+    "\u0000\u0000\u0000\u00bd\u042f\u0001\u0000\u0000\u0000\u00bf\u0431\u0001"+
+    "\u0000\u0000\u0000\u00c1\u0439\u0001\u0000\u0000\u0000\u00c3\u043b\u0001"+
+    "\u0000\u0000\u0000\u00c5\u043f\u0001\u0000\u0000\u0000\u00c7\u0443\u0001"+
+    "\u0000\u0000\u0000\u00c9\u0447\u0001\u0000\u0000\u0000\u00cb\u044c\u0001"+
+    "\u0000\u0000\u0000\u00cd\u0451\u0001\u0000\u0000\u0000\u00cf\u0455\u0001"+
+    "\u0000\u0000\u0000\u00d1\u0459\u0001\u0000\u0000\u0000\u00d3\u045d\u0001"+
+    "\u0000\u0000\u0000\u00d5\u0462\u0001\u0000\u0000\u0000\u00d7\u0466\u0001"+
+    "\u0000\u0000\u0000\u00d9\u046a\u0001\u0000\u0000\u0000\u00db\u046e\u0001"+
+    "\u0000\u0000\u0000\u00dd\u0473\u0001\u0000\u0000\u0000\u00df\u0477\u0001"+
+    "\u0000\u0000\u0000\u00e1\u047b\u0001\u0000\u0000\u0000\u00e3\u0487\u0001"+
+    "\u0000\u0000\u0000\u00e5\u048a\u0001\u0000\u0000\u0000\u00e7\u048e\u0001"+
+    "\u0000\u0000\u0000\u00e9\u0492\u0001\u0000\u0000\u0000\u00eb\u0496\u0001"+
+    "\u0000\u0000\u0000\u00ed\u049a\u0001\u0000\u0000\u0000\u00ef\u049e\u0001"+
+    "\u0000\u0000\u0000\u00f1\u04a2\u0001\u0000\u0000\u0000\u00f3\u04a7\u0001"+
+    "\u0000\u0000\u0000\u00f5\u04ab\u0001\u0000\u0000\u0000\u00f7\u04af\u0001"+
+    "\u0000\u0000\u0000\u00f9\u04b3\u0001\u0000\u0000\u0000\u00fb\u04b7\u0001"+
+    "\u0000\u0000\u0000\u00fd\u04bb\u0001\u0000\u0000\u0000\u00ff\u04c3\u0001"+
+    "\u0000\u0000\u0000\u0101\u04d8\u0001\u0000\u0000\u0000\u0103\u04dc\u0001"+
+    "\u0000\u0000\u0000\u0105\u04e0\u0001\u0000\u0000\u0000\u0107\u04e4\u0001"+
+    "\u0000\u0000\u0000\u0109\u04e8\u0001\u0000\u0000\u0000\u010b\u04ec\u0001"+
+    "\u0000\u0000\u0000\u010d\u04f1\u0001\u0000\u0000\u0000\u010f\u04f5\u0001"+
+    "\u0000\u0000\u0000\u0111\u04f9\u0001\u0000\u0000\u0000\u0113\u04fd\u0001"+
+    "\u0000\u0000\u0000\u0115\u0501\u0001\u0000\u0000\u0000\u0117\u0505\u0001"+
+    "\u0000\u0000\u0000\u0119\u0509\u0001\u0000\u0000\u0000\u011b\u050d\u0001"+
+    "\u0000\u0000\u0000\u011d\u0510\u0001\u0000\u0000\u0000\u011f\u0514\u0001"+
+    "\u0000\u0000\u0000\u0121\u0518\u0001\u0000\u0000\u0000\u0123\u051c\u0001"+
+    "\u0000\u0000\u0000\u0125\u0520\u0001\u0000\u0000\u0000\u0127\u0525\u0001"+
+    "\u0000\u0000\u0000\u0129\u052a\u0001\u0000\u0000\u0000\u012b\u052f\u0001"+
+    "\u0000\u0000\u0000\u012d\u0536\u0001\u0000\u0000\u0000\u012f\u053f\u0001"+
+    "\u0000\u0000\u0000\u0131\u0546\u0001\u0000\u0000\u0000\u0133\u054a\u0001"+
+    "\u0000\u0000\u0000\u0135\u054e\u0001\u0000\u0000\u0000\u0137\u0552\u0001"+
+    "\u0000\u0000\u0000\u0139\u0556\u0001\u0000\u0000\u0000\u013b\u055c\u0001"+
+    "\u0000\u0000\u0000\u013d\u0560\u0001\u0000\u0000\u0000\u013f\u0564\u0001"+
+    "\u0000\u0000\u0000\u0141\u0568\u0001\u0000\u0000\u0000\u0143\u056c\u0001"+
+    "\u0000\u0000\u0000\u0145\u0570\u0001\u0000\u0000\u0000\u0147\u0574\u0001"+
+    "\u0000\u0000\u0000\u0149\u0578\u0001\u0000\u0000\u0000\u014b\u057c\u0001"+
+    "\u0000\u0000\u0000\u014d\u0580\u0001\u0000\u0000\u0000\u014f\u0584\u0001"+
+    "\u0000\u0000\u0000\u0151\u0588\u0001\u0000\u0000\u0000\u0153\u058c\u0001"+
+    "\u0000\u0000\u0000\u0155\u0590\u0001\u0000\u0000\u0000\u0157\u0595\u0001"+
+    "\u0000\u0000\u0000\u0159\u0599\u0001\u0000\u0000\u0000\u015b\u059d\u0001"+
+    "\u0000\u0000\u0000\u015d\u05a1\u0001\u0000\u0000\u0000\u015f\u05a5\u0001"+
+    "\u0000\u0000\u0000\u0161\u05a9\u0001\u0000\u0000\u0000\u0163\u05ad\u0001"+
+    "\u0000\u0000\u0000\u0165\u05b1\u0001\u0000\u0000\u0000\u0167\u05b5\u0001"+
+    "\u0000\u0000\u0000\u0169\u05b9\u0001\u0000\u0000\u0000\u016b\u05bd\u0001"+
+    "\u0000\u0000\u0000\u016d\u05c2\u0001\u0000\u0000\u0000\u016f\u05c7\u0001"+
+    "\u0000\u0000\u0000\u0171\u05cb\u0001\u0000\u0000\u0000\u0173\u05cf\u0001"+
+    "\u0000\u0000\u0000\u0175\u05d3\u0001\u0000\u0000\u0000\u0177\u05d8\u0001"+
+    "\u0000\u0000\u0000\u0179\u05e1\u0001\u0000\u0000\u0000\u017b\u05e5\u0001"+
+    "\u0000\u0000\u0000\u017d\u05e9\u0001\u0000\u0000\u0000\u017f\u05ed\u0001"+
+    "\u0000\u0000\u0000\u0181\u05f1\u0001\u0000\u0000\u0000\u0183\u05f6\u0001"+
+    "\u0000\u0000\u0000\u0185\u05fa\u0001\u0000\u0000\u0000\u0187\u05fe\u0001"+
+    "\u0000\u0000\u0000\u0189\u0602\u0001\u0000\u0000\u0000\u018b\u0607\u0001"+
+    "\u0000\u0000\u0000\u018d\u060b\u0001\u0000\u0000\u0000\u018f\u060f\u0001"+
+    "\u0000\u0000\u0000\u0191\u0613\u0001\u0000\u0000\u0000\u0193\u0617\u0001"+
+    "\u0000\u0000\u0000\u0195\u061b\u0001\u0000\u0000\u0000\u0197\u0621\u0001"+
+    "\u0000\u0000\u0000\u0199\u0625\u0001\u0000\u0000\u0000\u019b\u0629\u0001"+
+    "\u0000\u0000\u0000\u019d\u062d\u0001\u0000\u0000\u0000\u019f\u0631\u0001"+
+    "\u0000\u0000\u0000\u01a1\u0635\u0001\u0000\u0000\u0000\u01a3\u0639\u0001"+
+    "\u0000\u0000\u0000\u01a5\u063e\u0001\u0000\u0000\u0000\u01a7\u0643\u0001"+
+    "\u0000\u0000\u0000\u01a9\u0647\u0001\u0000\u0000\u0000\u01ab\u064d\u0001"+
+    "\u0000\u0000\u0000\u01ad\u0656\u0001\u0000\u0000\u0000\u01af\u065a\u0001"+
+    "\u0000\u0000\u0000\u01b1\u065e\u0001\u0000\u0000\u0000\u01b3\u0662\u0001"+
+    "\u0000\u0000\u0000\u01b5\u0666\u0001\u0000\u0000\u0000\u01b7\u066a\u0001"+
+    "\u0000\u0000\u0000\u01b9\u066e\u0001\u0000\u0000\u0000\u01bb\u0672\u0001"+
+    "\u0000\u0000\u0000\u01bd\u0676\u0001\u0000\u0000\u0000\u01bf\u067b\u0001"+
+    "\u0000\u0000\u0000\u01c1\u0681\u0001\u0000\u0000\u0000\u01c3\u0687\u0001"+
+    "\u0000\u0000\u0000\u01c5\u068b\u0001\u0000\u0000\u0000\u01c7\u068f\u0001"+
+    "\u0000\u0000\u0000\u01c9\u0693\u0001\u0000\u0000\u0000\u01cb\u0699\u0001"+
+    "\u0000\u0000\u0000\u01cd\u069f\u0001\u0000\u0000\u0000\u01cf\u06a5\u0001"+
+    "\u0000\u0000\u0000\u01d1\u06a9\u0001\u0000\u0000\u0000\u01d3\u06ad\u0001"+
+    "\u0000\u0000\u0000\u01d5\u06b1\u0001\u0000\u0000\u0000\u01d7\u06b7\u0001"+
+    "\u0000\u0000\u0000\u01d9\u06bd\u0001\u0000\u0000\u0000\u01db\u06c3\u0001"+
+    "\u0000\u0000\u0000\u01dd\u06c8\u0001\u0000\u0000\u0000\u01df\u06cd\u0001"+
+    "\u0000\u0000\u0000\u01e1\u06d1\u0001\u0000\u0000\u0000\u01e3\u06d5\u0001"+
+    "\u0000\u0000\u0000\u01e5\u06d9\u0001\u0000\u0000\u0000\u01e7\u06dd\u0001"+
+    "\u0000\u0000\u0000\u01e9\u06e1\u0001\u0000\u0000\u0000\u01eb\u06e5\u0001"+
+    "\u0000\u0000\u0000\u01ed\u06e9\u0001\u0000\u0000\u0000\u01ef\u06ed\u0001"+
+    "\u0000\u0000\u0000\u01f1\u01f2\u0007\u0000\u0000\u0000\u01f2\u01f3\u0007"+
+    "\u0001\u0000\u0000\u01f3\u01f4\u0007\u0002\u0000\u0000\u01f4\u01f5\u0007"+
+    "\u0002\u0000\u0000\u01f5\u01f6\u0007\u0003\u0000\u0000\u01f6\u01f7\u0007"+
+    "\u0004\u0000\u0000\u01f7\u01f8\u0007\u0005\u0000\u0000\u01f8\u01f9\u0001"+
+    "\u0000\u0000\u0000\u01f9\u01fa\u0006\u0000\u0000\u0000\u01fa\u0012\u0001"+
+    "\u0000\u0000\u0000\u01fb\u01fc\u0007\u0000\u0000\u0000\u01fc\u01fd\u0007"+
+    "\u0006\u0000\u0000\u01fd\u01fe\u0007\u0007\u0000\u0000\u01fe\u01ff\u0007"+
+    "\b\u0000\u0000\u01ff\u0200\u0001\u0000\u0000\u0000\u0200\u0201\u0006\u0001"+
+    "\u0001\u0000\u0201\u0014\u0001\u0000\u0000\u0000\u0202\u0203\u0007\u0003"+
+    "\u0000\u0000\u0203\u0204\u0007\t\u0000\u0000\u0204\u0205\u0007\u0006\u0000"+
+    "\u0000\u0205\u0206\u0007\u0001\u0000\u0000\u0206\u0207\u0007\u0004\u0000"+
+    "\u0000\u0207\u0208\u0007\n\u0000\u0000\u0208\u0209\u0001\u0000\u0000\u0000"+
+    "\u0209\u020a\u0006\u0002\u0002\u0000\u020a\u0016\u0001\u0000\u0000\u0000"+
+    "\u020b\u020c\u0007\u0003\u0000\u0000\u020c\u020d\u0007\u000b\u0000\u0000"+
+    "\u020d\u020e\u0007\f\u0000\u0000\u020e\u020f\u0007\r\u0000\u0000\u020f"+
+    "\u0210\u0001\u0000\u0000\u0000\u0210\u0211\u0006\u0003\u0000\u0000\u0211"+
+    "\u0018\u0001\u0000\u0000\u0000\u0212\u0213\u0007\u0003\u0000\u0000\u0213"+
+    "\u0214\u0007\u000e\u0000\u0000\u0214\u0215\u0007\b\u0000\u0000\u0215\u0216"+
+    "\u0007\r\u0000\u0000\u0216\u0217\u0007\f\u0000\u0000\u0217\u0218\u0007"+
+    "\u0001\u0000\u0000\u0218\u0219\u0007\t\u0000\u0000\u0219\u021a\u0001\u0000"+
+    "\u0000\u0000\u021a\u021b\u0006\u0004\u0003\u0000\u021b\u001a\u0001\u0000"+
+    "\u0000\u0000\u021c\u021d\u0007\u000f\u0000\u0000\u021d\u021e\u0007\u0006"+
+    "\u0000\u0000\u021e\u021f\u0007\u0007\u0000\u0000\u021f\u0220\u0007\u0010"+
+    "\u0000\u0000\u0220\u0221\u0001\u0000\u0000\u0000\u0221\u0222\u0006\u0005"+
+    "\u0004\u0000\u0222\u001c\u0001\u0000\u0000\u0000\u0223\u0224\u0007\u0011"+
+    "\u0000\u0000\u0224\u0225\u0007\u0006\u0000\u0000\u0225\u0226\u0007\u0007"+
+    "\u0000\u0000\u0226\u0227\u0007\u0012\u0000\u0000\u0227\u0228\u0001\u0000"+
+    "\u0000\u0000\u0228\u0229\u0006\u0006\u0000\u0000\u0229\u001e\u0001\u0000"+
+    "\u0000\u0000\u022a\u022b\u0007\u0012\u0000\u0000\u022b\u022c\u0007\u0003"+
+    "\u0000\u0000\u022c\u022d\u0007\u0003\u0000\u0000\u022d\u022e\u0007\b\u0000"+
+    "\u0000\u022e\u022f\u0001\u0000\u0000\u0000\u022f\u0230\u0006\u0007\u0001"+
+    "\u0000\u0230 \u0001\u0000\u0000\u0000\u0231\u0232\u0007\r\u0000\u0000"+
+    "\u0232\u0233\u0007\u0001\u0000\u0000\u0233\u0234\u0007\u0010\u0000\u0000"+
+    "\u0234\u0235\u0007\u0001\u0000\u0000\u0235\u0236\u0007\u0005\u0000\u0000"+
+    "\u0236\u0237\u0001\u0000\u0000\u0000\u0237\u0238\u0006\b\u0000\u0000\u0238"+
+    "\"\u0001\u0000\u0000\u0000\u0239\u023a\u0007\u0010\u0000\u0000\u023a\u023b"+
+    "\u0007\u000b\u0000\u0000\u023b\u023c\u0005_\u0000\u0000\u023c\u023d\u0007"+
+    "\u0003\u0000\u0000\u023d\u023e\u0007\u000e\u0000\u0000\u023e\u023f\u0007"+
+    "\b\u0000\u0000\u023f\u0240\u0007\f\u0000\u0000\u0240\u0241\u0007\t\u0000"+
+    "\u0000\u0241\u0242\u0007\u0000\u0000\u0000\u0242\u0243\u0001\u0000\u0000"+
+    "\u0000\u0243\u0244\u0006\t\u0005\u0000\u0244$\u0001\u0000\u0000\u0000"+
+    "\u0245\u0246\u0007\u0006\u0000\u0000\u0246\u0247\u0007\u0003\u0000\u0000"+
+    "\u0247\u0248\u0007\t\u0000\u0000\u0248\u0249\u0007\f\u0000\u0000\u0249"+
+    "\u024a\u0007\u0010\u0000\u0000\u024a\u024b\u0007\u0003\u0000\u0000\u024b"+
+    "\u024c\u0001\u0000\u0000\u0000\u024c\u024d\u0006\n\u0006\u0000\u024d&"+
+    "\u0001\u0000\u0000\u0000\u024e\u024f\u0007\u0006\u0000\u0000\u024f\u0250"+
+    "\u0007\u0007\u0000\u0000\u0250\u0251\u0007\u0013\u0000\u0000\u0251\u0252"+
+    "\u0001\u0000\u0000\u0000\u0252\u0253\u0006\u000b\u0000\u0000\u0253(\u0001"+
+    "\u0000\u0000\u0000\u0254\u0255\u0007\u0002\u0000\u0000\u0255\u0256\u0007"+
+    "\n\u0000\u0000\u0256\u0257\u0007\u0007\u0000\u0000\u0257\u0258\u0007\u0013"+
+    "\u0000\u0000\u0258\u0259\u0001\u0000\u0000\u0000\u0259\u025a\u0006\f\u0007"+
+    "\u0000\u025a*\u0001\u0000\u0000\u0000\u025b\u025c\u0007\u0002\u0000\u0000"+
+    "\u025c\u025d\u0007\u0007\u0000\u0000\u025d\u025e\u0007\u0006\u0000\u0000"+
+    "\u025e\u025f\u0007\u0005\u0000\u0000\u025f\u0260\u0001\u0000\u0000\u0000"+
+    "\u0260\u0261\u0006\r\u0000\u0000\u0261,\u0001\u0000\u0000\u0000\u0262"+
+    "\u0263\u0007\u0002\u0000\u0000\u0263\u0264\u0007\u0005\u0000\u0000\u0264"+
+    "\u0265\u0007\f\u0000\u0000\u0265\u0266\u0007\u0005\u0000\u0000\u0266\u0267"+
+    "\u0007\u0002\u0000\u0000\u0267\u0268\u0001\u0000\u0000\u0000\u0268\u0269"+
+    "\u0006\u000e\u0000\u0000\u0269.\u0001\u0000\u0000\u0000\u026a\u026b\u0007"+
+    "\u0013\u0000\u0000\u026b\u026c\u0007\n\u0000\u0000\u026c\u026d\u0007\u0003"+
+    "\u0000\u0000\u026d\u026e\u0007\u0006\u0000\u0000\u026e\u026f\u0007\u0003"+
+    "\u0000\u0000\u026f\u0270\u0001\u0000\u0000\u0000\u0270\u0271\u0006\u000f"+
+    "\u0000\u0000\u02710\u0001\u0000\u0000\u0000\u0272\u0273\u0007\r\u0000"+
+    "\u0000\u0273\u0274\u0007\u0007\u0000\u0000\u0274\u0275\u0007\u0007\u0000"+
+    "\u0000\u0275\u0276\u0007\u0012\u0000\u0000\u0276\u0277\u0007\u0014\u0000"+
+    "\u0000\u0277\u0278\u0007\b\u0000\u0000\u0278\u0279\u0001\u0000\u0000\u0000"+
+    "\u0279\u027a\u0006\u0010\b\u0000\u027a2\u0001\u0000\u0000\u0000\u027b"+
+    "\u027c\u0007\u0004\u0000\u0000\u027c\u027d\u0007\n\u0000\u0000\u027d\u027e"+
+    "\u0007\f\u0000\u0000\u027e\u027f\u0007\t\u0000\u0000\u027f\u0280\u0007"+
+    "\u0011\u0000\u0000\u0280\u0281\u0007\u0003\u0000\u0000\u0281\u0282\u0005"+
+    "_\u0000\u0000\u0282\u0283\u0007\b\u0000\u0000\u0283\u0284\u0007\u0007"+
+    "\u0000\u0000\u0284\u0285\u0007\u0001\u0000\u0000\u0285\u0286\u0007\t\u0000"+
+    "\u0000\u0286\u0287\u0007\u0005\u0000\u0000\u0287\u0288\u0001\u0000\u0000"+
+    "\u0000\u0288\u0289\u0006\u0011\t\u0000\u02894\u0001\u0000\u0000\u0000"+
+    "\u028a\u028b\u0004\u0012\u0000\u0000\u028b\u028c\u0007\u0001\u0000\u0000"+
+    "\u028c\u028d\u0007\t\u0000\u0000\u028d\u028e\u0007\r\u0000\u0000\u028e"+
+    "\u028f\u0007\u0001\u0000\u0000\u028f\u0290\u0007\t\u0000\u0000\u0290\u0291"+
+    "\u0007\u0003\u0000\u0000\u0291\u0292\u0007\u0002\u0000\u0000\u0292\u0293"+
+    "\u0007\u0005\u0000\u0000\u0293\u0294\u0007\f\u0000\u0000\u0294\u0295\u0007"+
+    "\u0005\u0000\u0000\u0295\u0296\u0007\u0002\u0000\u0000\u0296\u0297\u0001"+
+    "\u0000\u0000\u0000\u0297\u0298\u0006\u0012\u0000\u0000\u02986\u0001\u0000"+
+    "\u0000\u0000\u0299\u029a\u0004\u0013\u0001\u0000\u029a\u029b\u0007\r\u0000"+
+    "\u0000\u029b\u029c\u0007\u0007\u0000\u0000\u029c\u029d\u0007\u0007\u0000"+
+    "\u0000\u029d\u029e\u0007\u0012\u0000\u0000\u029e\u029f\u0007\u0014\u0000"+
+    "\u0000\u029f\u02a0\u0007\b\u0000\u0000\u02a0\u02a1\u0005_\u0000\u0000"+
+    "\u02a1\u02a2\u0005\u8001\uf414\u0000\u0000\u02a2\u02a3\u0001\u0000\u0000"+
+    "\u0000\u02a3\u02a4\u0006\u0013\n\u0000\u02a48\u0001\u0000\u0000\u0000"+
+    "\u02a5\u02a6\u0004\u0014\u0002\u0000\u02a6\u02a7\u0007\u0010\u0000\u0000"+
+    "\u02a7\u02a8\u0007\u0003\u0000\u0000\u02a8\u02a9\u0007\u0005\u0000\u0000"+
+    "\u02a9\u02aa\u0007\u0006\u0000\u0000\u02aa\u02ab\u0007\u0001\u0000\u0000"+
+    "\u02ab\u02ac\u0007\u0004\u0000\u0000\u02ac\u02ad\u0007\u0002\u0000\u0000"+
+    "\u02ad\u02ae\u0001\u0000\u0000\u0000\u02ae\u02af\u0006\u0014\u000b\u0000"+
+    "\u02af:\u0001\u0000\u0000\u0000\u02b0\u02b1\u0004\u0015\u0003\u0000\u02b1"+
+    "\u02b2\u0007\u000f\u0000\u0000\u02b2\u02b3\u0007\u0014\u0000\u0000\u02b3"+
+    "\u02b4\u0007\r\u0000\u0000\u02b4\u02b5\u0007\r\u0000\u0000\u02b5\u02b6"+
+    "\u0001\u0000\u0000\u0000\u02b6\u02b7\u0006\u0015\b\u0000\u02b7<\u0001"+
+    "\u0000\u0000\u0000\u02b8\u02b9\u0004\u0016\u0004\u0000\u02b9\u02ba\u0007"+
+    "\r\u0000\u0000\u02ba\u02bb\u0007\u0003\u0000\u0000\u02bb\u02bc\u0007\u000f"+
+    "\u0000\u0000\u02bc\u02bd\u0007\u0005\u0000\u0000\u02bd\u02be\u0001\u0000"+
+    "\u0000\u0000\u02be\u02bf\u0006\u0016\b\u0000\u02bf>\u0001\u0000\u0000"+
+    "\u0000\u02c0\u02c1\u0004\u0017\u0005\u0000\u02c1\u02c2\u0007\u0006\u0000"+
+    "\u0000\u02c2\u02c3\u0007\u0001\u0000\u0000\u02c3\u02c4\u0007\u0011\u0000"+
+    "\u0000\u02c4\u02c5\u0007\n\u0000\u0000\u02c5\u02c6\u0007\u0005\u0000\u0000"+
+    "\u02c6\u02c7\u0001\u0000\u0000\u0000\u02c7\u02c8\u0006\u0017\b\u0000\u02c8"+
+    "@\u0001\u0000\u0000\u0000\u02c9\u02cb\b\u0015\u0000\u0000\u02ca\u02c9"+
+    "\u0001\u0000\u0000\u0000\u02cb\u02cc\u0001\u0000\u0000\u0000\u02cc\u02ca"+
+    "\u0001\u0000\u0000\u0000\u02cc\u02cd\u0001\u0000\u0000\u0000\u02cd\u02ce"+
+    "\u0001\u0000\u0000\u0000\u02ce\u02cf\u0006\u0018\u0000\u0000\u02cfB\u0001"+
+    "\u0000\u0000\u0000\u02d0\u02d1\u0005/\u0000\u0000\u02d1\u02d2\u0005/\u0000"+
+    "\u0000\u02d2\u02d6\u0001\u0000\u0000\u0000\u02d3\u02d5\b\u0016\u0000\u0000"+
+    "\u02d4\u02d3\u0001\u0000\u0000\u0000\u02d5\u02d8\u0001\u0000\u0000\u0000"+
+    "\u02d6\u02d4\u0001\u0000\u0000\u0000\u02d6\u02d7\u0001\u0000\u0000\u0000"+
+    "\u02d7\u02da\u0001\u0000\u0000\u0000\u02d8\u02d6\u0001\u0000\u0000\u0000"+
+    "\u02d9\u02db\u0005\r\u0000\u0000\u02da\u02d9\u0001\u0000\u0000\u0000\u02da"+
+    "\u02db\u0001\u0000\u0000\u0000\u02db\u02dd\u0001\u0000\u0000\u0000\u02dc"+
+    "\u02de\u0005\n\u0000\u0000\u02dd\u02dc\u0001\u0000\u0000\u0000\u02dd\u02de"+
+    "\u0001\u0000\u0000\u0000\u02de\u02df\u0001\u0000\u0000\u0000\u02df\u02e0"+
+    "\u0006\u0019\f\u0000\u02e0D\u0001\u0000\u0000\u0000\u02e1\u02e2\u0005"+
+    "/\u0000\u0000\u02e2\u02e3\u0005*\u0000\u0000\u02e3\u02e8\u0001\u0000\u0000"+
+    "\u0000\u02e4\u02e7\u0003E\u001a\u0000\u02e5\u02e7\t\u0000\u0000\u0000"+
+    "\u02e6\u02e4\u0001\u0000\u0000\u0000\u02e6\u02e5\u0001\u0000\u0000\u0000"+
+    "\u02e7\u02ea\u0001\u0000\u0000\u0000\u02e8\u02e9\u0001\u0000\u0000\u0000"+
+    "\u02e8\u02e6\u0001\u0000\u0000\u0000\u02e9\u02eb\u0001\u0000\u0000\u0000"+
+    "\u02ea\u02e8\u0001\u0000\u0000\u0000\u02eb\u02ec\u0005*\u0000\u0000\u02ec"+
+    "\u02ed\u0005/\u0000\u0000\u02ed\u02ee\u0001\u0000\u0000\u0000\u02ee\u02ef"+
+    "\u0006\u001a\f\u0000\u02efF\u0001\u0000\u0000\u0000\u02f0\u02f2\u0007"+
+    "\u0017\u0000\u0000\u02f1\u02f0\u0001\u0000\u0000\u0000\u02f2\u02f3\u0001"+
+    "\u0000\u0000\u0000\u02f3\u02f1\u0001\u0000\u0000\u0000\u02f3\u02f4\u0001"+
+    "\u0000\u0000\u0000\u02f4\u02f5\u0001\u0000\u0000\u0000\u02f5\u02f6\u0006"+
+    "\u001b\f\u0000\u02f6H\u0001\u0000\u0000\u0000\u02f7\u02f8\u0005|\u0000"+
+    "\u0000\u02f8\u02f9\u0001\u0000\u0000\u0000\u02f9\u02fa\u0006\u001c\r\u0000"+
+    "\u02faJ\u0001\u0000\u0000\u0000\u02fb\u02fc\u0007\u0018\u0000\u0000\u02fc"+
+    "L\u0001\u0000\u0000\u0000\u02fd\u02fe\u0007\u0019\u0000\u0000\u02feN\u0001"+
+    "\u0000\u0000\u0000\u02ff\u0300\u0005\\\u0000\u0000\u0300\u0301\u0007\u001a"+
+    "\u0000\u0000\u0301P\u0001\u0000\u0000\u0000\u0302\u0303\b\u001b\u0000"+
+    "\u0000\u0303R\u0001\u0000\u0000\u0000\u0304\u0306\u0007\u0003\u0000\u0000"+
+    "\u0305\u0307\u0007\u001c\u0000\u0000\u0306\u0305\u0001\u0000\u0000\u0000"+
+    "\u0306\u0307\u0001\u0000\u0000\u0000\u0307\u0309\u0001\u0000\u0000\u0000"+
+    "\u0308\u030a\u0003K\u001d\u0000\u0309\u0308\u0001\u0000\u0000\u0000\u030a"+
+    "\u030b\u0001\u0000\u0000\u0000\u030b\u0309\u0001\u0000\u0000\u0000\u030b"+
+    "\u030c\u0001\u0000\u0000\u0000\u030cT\u0001\u0000\u0000\u0000\u030d\u030e"+
+    "\u0005@\u0000\u0000\u030eV\u0001\u0000\u0000\u0000\u030f\u0310\u0005`"+
+    "\u0000\u0000\u0310X\u0001\u0000\u0000\u0000\u0311\u0315\b\u001d\u0000"+
+    "\u0000\u0312\u0313\u0005`\u0000\u0000\u0313\u0315\u0005`\u0000\u0000\u0314"+
+    "\u0311\u0001\u0000\u0000\u0000\u0314\u0312\u0001\u0000\u0000\u0000\u0315"+
+    "Z\u0001\u0000\u0000\u0000\u0316\u0317\u0005_\u0000\u0000\u0317\\\u0001"+
+    "\u0000\u0000\u0000\u0318\u031c\u0003M\u001e\u0000\u0319\u031c\u0003K\u001d"+
+    "\u0000\u031a\u031c\u0003[%\u0000\u031b\u0318\u0001\u0000\u0000\u0000\u031b"+
+    "\u0319\u0001\u0000\u0000\u0000\u031b\u031a\u0001\u0000\u0000\u0000\u031c"+
+    "^\u0001\u0000\u0000\u0000\u031d\u0322\u0005\"\u0000\u0000\u031e\u0321"+
+    "\u0003O\u001f\u0000\u031f\u0321\u0003Q \u0000\u0320\u031e\u0001\u0000"+
+    "\u0000\u0000\u0320\u031f\u0001\u0000\u0000\u0000\u0321\u0324\u0001\u0000"+
+    "\u0000\u0000\u0322\u0320\u0001\u0000\u0000\u0000\u0322\u0323\u0001\u0000"+
+    "\u0000\u0000\u0323\u0325\u0001\u0000\u0000\u0000\u0324\u0322\u0001\u0000"+
+    "\u0000\u0000\u0325\u033b\u0005\"\u0000\u0000\u0326\u0327\u0005\"\u0000"+
+    "\u0000\u0327\u0328\u0005\"\u0000\u0000\u0328\u0329\u0005\"\u0000\u0000"+
+    "\u0329\u032d\u0001\u0000\u0000\u0000\u032a\u032c\b\u0016\u0000\u0000\u032b"+
+    "\u032a\u0001\u0000\u0000\u0000\u032c\u032f\u0001\u0000\u0000\u0000\u032d"+
+    "\u032e\u0001\u0000\u0000\u0000\u032d\u032b\u0001\u0000\u0000\u0000\u032e"+
+    "\u0330\u0001\u0000\u0000\u0000\u032f\u032d\u0001\u0000\u0000\u0000\u0330"+
+    "\u0331\u0005\"\u0000\u0000\u0331\u0332\u0005\"\u0000\u0000\u0332\u0333"+
+    "\u0005\"\u0000\u0000\u0333\u0335\u0001\u0000\u0000\u0000\u0334\u0336\u0005"+
+    "\"\u0000\u0000\u0335\u0334\u0001\u0000\u0000\u0000\u0335\u0336\u0001\u0000"+
+    "\u0000\u0000\u0336\u0338\u0001\u0000\u0000\u0000\u0337\u0339\u0005\"\u0000"+
+    "\u0000\u0338\u0337\u0001\u0000\u0000\u0000\u0338\u0339\u0001\u0000\u0000"+
+    "\u0000\u0339\u033b\u0001\u0000\u0000\u0000\u033a\u031d\u0001\u0000\u0000"+
+    "\u0000\u033a\u0326\u0001\u0000\u0000\u0000\u033b`\u0001\u0000\u0000\u0000"+
+    "\u033c\u033e\u0003K\u001d\u0000\u033d\u033c\u0001\u0000\u0000\u0000\u033e"+
+    "\u033f\u0001\u0000\u0000\u0000\u033f\u033d\u0001\u0000\u0000\u0000\u033f"+
+    "\u0340\u0001\u0000\u0000\u0000\u0340b\u0001\u0000\u0000\u0000\u0341\u0343"+
+    "\u0003K\u001d\u0000\u0342\u0341\u0001\u0000\u0000\u0000\u0343\u0344\u0001"+
+    "\u0000\u0000\u0000\u0344\u0342\u0001\u0000\u0000\u0000\u0344\u0345\u0001"+
+    "\u0000\u0000\u0000\u0345\u0346\u0001\u0000\u0000\u0000\u0346\u034a\u0003"+
+    "u2\u0000\u0347\u0349\u0003K\u001d\u0000\u0348\u0347\u0001\u0000\u0000"+
+    "\u0000\u0349\u034c\u0001\u0000\u0000\u0000\u034a\u0348\u0001\u0000\u0000"+
+    "\u0000\u034a\u034b\u0001\u0000\u0000\u0000\u034b\u036c\u0001\u0000\u0000"+
+    "\u0000\u034c\u034a\u0001\u0000\u0000\u0000\u034d\u034f\u0003u2\u0000\u034e"+
+    "\u0350\u0003K\u001d\u0000\u034f\u034e\u0001\u0000\u0000\u0000\u0350\u0351"+
+    "\u0001\u0000\u0000\u0000\u0351\u034f\u0001\u0000\u0000\u0000\u0351\u0352"+
+    "\u0001\u0000\u0000\u0000\u0352\u036c\u0001\u0000\u0000\u0000\u0353\u0355"+
+    "\u0003K\u001d\u0000\u0354\u0353\u0001\u0000\u0000\u0000\u0355\u0356\u0001"+
+    "\u0000\u0000\u0000\u0356\u0354\u0001\u0000\u0000\u0000\u0356\u0357\u0001"+
+    "\u0000\u0000\u0000\u0357\u035f\u0001\u0000\u0000\u0000\u0358\u035c\u0003"+
+    "u2\u0000\u0359\u035b\u0003K\u001d\u0000\u035a\u0359\u0001\u0000\u0000"+
+    "\u0000\u035b\u035e\u0001\u0000\u0000\u0000\u035c\u035a\u0001\u0000\u0000"+
+    "\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u0360\u0001\u0000\u0000"+
+    "\u0000\u035e\u035c\u0001\u0000\u0000\u0000\u035f\u0358\u0001\u0000\u0000"+
+    "\u0000\u035f\u0360\u0001\u0000\u0000\u0000\u0360\u0361\u0001\u0000\u0000"+
+    "\u0000\u0361\u0362\u0003S!\u0000\u0362\u036c\u0001\u0000\u0000\u0000\u0363"+
+    "\u0365\u0003u2\u0000\u0364\u0366\u0003K\u001d\u0000\u0365\u0364\u0001"+
+    "\u0000\u0000\u0000\u0366\u0367\u0001\u0000\u0000\u0000\u0367\u0365\u0001"+
+    "\u0000\u0000\u0000\u0367\u0368\u0001\u0000\u0000\u0000\u0368\u0369\u0001"+
+    "\u0000\u0000\u0000\u0369\u036a\u0003S!\u0000\u036a\u036c\u0001\u0000\u0000"+
+    "\u0000\u036b\u0342\u0001\u0000\u0000\u0000\u036b\u034d\u0001\u0000\u0000"+
+    "\u0000\u036b\u0354\u0001\u0000\u0000\u0000\u036b\u0363\u0001\u0000\u0000"+
+    "\u0000\u036cd\u0001\u0000\u0000\u0000\u036d\u036e\u0007\u001e\u0000\u0000"+
+    "\u036e\u036f\u0007\u001f\u0000\u0000\u036ff\u0001\u0000\u0000\u0000\u0370"+
+    "\u0371\u0007\f\u0000\u0000\u0371\u0372\u0007\t\u0000\u0000\u0372\u0373"+
+    "\u0007\u0000\u0000\u0000\u0373h\u0001\u0000\u0000\u0000\u0374\u0375\u0007"+
+    "\f\u0000\u0000\u0375\u0376\u0007\u0002\u0000\u0000\u0376\u0377\u0007\u0004"+
+    "\u0000\u0000\u0377j\u0001\u0000\u0000\u0000\u0378\u0379\u0005=\u0000\u0000"+
+    "\u0379l\u0001\u0000\u0000\u0000\u037a\u037b\u0005:\u0000\u0000\u037b\u037c"+
+    "\u0005:\u0000\u0000\u037cn\u0001\u0000\u0000\u0000\u037d\u037e\u0005:"+
+    "\u0000\u0000\u037ep\u0001\u0000\u0000\u0000\u037f\u0380\u0005,\u0000\u0000"+
+    "\u0380r\u0001\u0000\u0000\u0000\u0381\u0382\u0007\u0000\u0000\u0000\u0382"+
+    "\u0383\u0007\u0003\u0000\u0000\u0383\u0384\u0007\u0002\u0000\u0000\u0384"+
+    "\u0385\u0007\u0004\u0000\u0000\u0385t\u0001\u0000\u0000\u0000\u0386\u0387"+
+    "\u0005.\u0000\u0000\u0387v\u0001\u0000\u0000\u0000\u0388\u0389\u0007\u000f"+
+    "\u0000\u0000\u0389\u038a\u0007\f\u0000\u0000\u038a\u038b\u0007\r\u0000"+
+    "\u0000\u038b\u038c\u0007\u0002\u0000\u0000\u038c\u038d\u0007\u0003\u0000"+
+    "\u0000\u038dx\u0001\u0000\u0000\u0000\u038e\u038f\u0007\u000f\u0000\u0000"+
+    "\u038f\u0390\u0007\u0001\u0000\u0000\u0390\u0391\u0007\u0006\u0000\u0000"+
+    "\u0391\u0392\u0007\u0002\u0000\u0000\u0392\u0393\u0007\u0005\u0000\u0000"+
+    "\u0393z\u0001\u0000\u0000\u0000\u0394\u0395\u0007\u0001\u0000\u0000\u0395"+
+    "\u0396\u0007\t\u0000\u0000\u0396|\u0001\u0000\u0000\u0000\u0397\u0398"+
+    "\u0007\u0001\u0000\u0000\u0398\u0399\u0007\u0002\u0000\u0000\u0399~\u0001"+
+    "\u0000\u0000\u0000\u039a\u039b\u0007\r\u0000\u0000\u039b\u039c\u0007\f"+
+    "\u0000\u0000\u039c\u039d\u0007\u0002\u0000\u0000\u039d\u039e\u0007\u0005"+
+    "\u0000\u0000\u039e\u0080\u0001\u0000\u0000\u0000\u039f\u03a0\u0007\r\u0000"+
+    "\u0000\u03a0\u03a1\u0007\u0001\u0000\u0000\u03a1\u03a2\u0007\u0012\u0000"+
+    "\u0000\u03a2\u03a3\u0007\u0003\u0000\u0000\u03a3\u0082\u0001\u0000\u0000"+
+    "\u0000\u03a4\u03a5\u0005(\u0000\u0000\u03a5\u0084\u0001\u0000\u0000\u0000"+
+    "\u03a6\u03a7\u0007\t\u0000\u0000\u03a7\u03a8\u0007\u0007\u0000\u0000\u03a8"+
+    "\u03a9\u0007\u0005\u0000\u0000\u03a9\u0086\u0001\u0000\u0000\u0000\u03aa"+
+    "\u03ab\u0007\t\u0000\u0000\u03ab\u03ac\u0007\u0014\u0000\u0000\u03ac\u03ad"+
+    "\u0007\r\u0000\u0000\u03ad\u03ae\u0007\r\u0000\u0000\u03ae\u0088\u0001"+
+    "\u0000\u0000\u0000\u03af\u03b0\u0007\t\u0000\u0000\u03b0\u03b1\u0007\u0014"+
+    "\u0000\u0000\u03b1\u03b2\u0007\r\u0000\u0000\u03b2\u03b3\u0007\r\u0000"+
+    "\u0000\u03b3\u03b4\u0007\u0002\u0000\u0000\u03b4\u008a\u0001\u0000\u0000"+
+    "\u0000\u03b5\u03b6\u0007\u0007\u0000\u0000\u03b6\u03b7\u0007\u0006\u0000"+
+    "\u0000\u03b7\u008c\u0001\u0000\u0000\u0000\u03b8\u03b9\u0005?\u0000\u0000"+
+    "\u03b9\u008e\u0001\u0000\u0000\u0000\u03ba\u03bb\u0007\u0006\u0000\u0000"+
+    "\u03bb\u03bc\u0007\r\u0000\u0000\u03bc\u03bd\u0007\u0001\u0000\u0000\u03bd"+
+    "\u03be\u0007\u0012\u0000\u0000\u03be\u03bf\u0007\u0003\u0000\u0000\u03bf"+
+    "\u0090\u0001\u0000\u0000\u0000\u03c0\u03c1\u0005)\u0000\u0000\u03c1\u0092"+
+    "\u0001\u0000\u0000\u0000\u03c2\u03c3\u0007\u0005\u0000\u0000\u03c3\u03c4"+
+    "\u0007\u0006\u0000\u0000\u03c4\u03c5\u0007\u0014\u0000\u0000\u03c5\u03c6"+
+    "\u0007\u0003\u0000\u0000\u03c6\u0094\u0001\u0000\u0000\u0000\u03c7\u03c8"+
+    "\u0005=\u0000\u0000\u03c8\u03c9\u0005=\u0000\u0000\u03c9\u0096\u0001\u0000"+
+    "\u0000\u0000\u03ca\u03cb\u0005=\u0000\u0000\u03cb\u03cc\u0005~\u0000\u0000"+
+    "\u03cc\u0098\u0001\u0000\u0000\u0000\u03cd\u03ce\u0005!\u0000\u0000\u03ce"+
+    "\u03cf\u0005=\u0000\u0000\u03cf\u009a\u0001\u0000\u0000\u0000\u03d0\u03d1"+
+    "\u0005<\u0000\u0000\u03d1\u009c\u0001\u0000\u0000\u0000\u03d2\u03d3\u0005"+
+    "<\u0000\u0000\u03d3\u03d4\u0005=\u0000\u0000\u03d4\u009e\u0001\u0000\u0000"+
+    "\u0000\u03d5\u03d6\u0005>\u0000\u0000\u03d6\u00a0\u0001\u0000\u0000\u0000"+
+    "\u03d7\u03d8\u0005>\u0000\u0000\u03d8\u03d9\u0005=\u0000\u0000\u03d9\u00a2"+
+    "\u0001\u0000\u0000\u0000\u03da\u03db\u0005+\u0000\u0000\u03db\u00a4\u0001"+
+    "\u0000\u0000\u0000\u03dc\u03dd\u0005-\u0000\u0000\u03dd\u00a6\u0001\u0000"+
+    "\u0000\u0000\u03de\u03df\u0005*\u0000\u0000\u03df\u00a8\u0001\u0000\u0000"+
+    "\u0000\u03e0\u03e1\u0005/\u0000\u0000\u03e1\u00aa\u0001\u0000\u0000\u0000"+
+    "\u03e2\u03e3\u0005%\u0000\u0000\u03e3\u00ac\u0001\u0000\u0000\u0000\u03e4"+
+    "\u03e5\u0005{\u0000\u0000\u03e5\u00ae\u0001\u0000\u0000\u0000\u03e6\u03e7"+
+    "\u0005}\u0000\u0000\u03e7\u00b0\u0001\u0000\u0000\u0000\u03e8\u03e9\u0005"+
+    "?\u0000\u0000\u03e9\u03ea\u0005?\u0000\u0000\u03ea\u00b2\u0001\u0000\u0000"+
+    "\u0000\u03eb\u03ec\u0003/\u000f\u0000\u03ec\u03ed\u0001\u0000\u0000\u0000"+
+    "\u03ed\u03ee\u0006Q\u000e\u0000\u03ee\u00b4\u0001\u0000\u0000\u0000\u03ef"+
+    "\u03f2\u0003\u008d>\u0000\u03f0\u03f3\u0003M\u001e\u0000\u03f1\u03f3\u0003"+
+    "[%\u0000\u03f2\u03f0\u0001\u0000\u0000\u0000\u03f2\u03f1\u0001\u0000\u0000"+
+    "\u0000\u03f3\u03f7\u0001\u0000\u0000\u0000\u03f4\u03f6\u0003]&\u0000\u03f5"+
+    "\u03f4\u0001\u0000\u0000\u0000\u03f6\u03f9\u0001\u0000\u0000\u0000\u03f7"+
+    "\u03f5\u0001\u0000\u0000\u0000\u03f7\u03f8\u0001\u0000\u0000\u0000\u03f8"+
+    "\u0401\u0001\u0000\u0000\u0000\u03f9\u03f7\u0001\u0000\u0000\u0000\u03fa"+
+    "\u03fc\u0003\u008d>\u0000\u03fb\u03fd\u0003K\u001d\u0000\u03fc\u03fb\u0001"+
+    "\u0000\u0000\u0000\u03fd\u03fe\u0001\u0000\u0000\u0000\u03fe\u03fc\u0001"+
+    "\u0000\u0000\u0000\u03fe\u03ff\u0001\u0000\u0000\u0000\u03ff\u0401\u0001"+
+    "\u0000\u0000\u0000\u0400\u03ef\u0001\u0000\u0000\u0000\u0400\u03fa\u0001"+
+    "\u0000\u0000\u0000\u0401\u00b6\u0001\u0000\u0000\u0000\u0402\u0405\u0003"+
+    "\u00b1P\u0000\u0403\u0406\u0003M\u001e\u0000\u0404\u0406\u0003[%\u0000"+
+    "\u0405\u0403\u0001\u0000\u0000\u0000\u0405\u0404\u0001\u0000\u0000\u0000"+
+    "\u0406\u040a\u0001\u0000\u0000\u0000\u0407\u0409\u0003]&\u0000\u0408\u0407"+
+    "\u0001\u0000\u0000\u0000\u0409\u040c\u0001\u0000\u0000\u0000\u040a\u0408"+
+    "\u0001\u0000\u0000\u0000\u040a\u040b\u0001\u0000\u0000\u0000\u040b\u0414"+
+    "\u0001\u0000\u0000\u0000\u040c\u040a\u0001\u0000\u0000\u0000\u040d\u040f"+
+    "\u0003\u00b1P\u0000\u040e\u0410\u0003K\u001d\u0000\u040f\u040e\u0001\u0000"+
+    "\u0000\u0000\u0410\u0411\u0001\u0000\u0000\u0000\u0411\u040f\u0001\u0000"+
+    "\u0000\u0000\u0411\u0412\u0001\u0000\u0000\u0000\u0412\u0414\u0001\u0000"+
+    "\u0000\u0000\u0413\u0402\u0001\u0000\u0000\u0000\u0413\u040d\u0001\u0000"+
+    "\u0000\u0000\u0414\u00b8\u0001\u0000\u0000\u0000\u0415\u0416\u0005[\u0000"+
+    "\u0000\u0416\u0417\u0001\u0000\u0000\u0000\u0417\u0418\u0006T\u0000\u0000"+
+    "\u0418\u0419\u0006T\u0000\u0000\u0419\u00ba\u0001\u0000\u0000\u0000\u041a"+
+    "\u041b\u0005]\u0000\u0000\u041b\u041c\u0001\u0000\u0000\u0000\u041c\u041d"+
+    "\u0006U\r\u0000\u041d\u041e\u0006U\r\u0000\u041e\u00bc\u0001\u0000\u0000"+
+    "\u0000\u041f\u0423\u0003M\u001e\u0000\u0420\u0422\u0003]&\u0000\u0421"+
+    "\u0420\u0001\u0000\u0000\u0000\u0422\u0425\u0001\u0000\u0000\u0000\u0423"+
+    "\u0421\u0001\u0000\u0000\u0000\u0423\u0424\u0001\u0000\u0000\u0000\u0424"+
+    "\u0430\u0001\u0000\u0000\u0000\u0425\u0423\u0001\u0000\u0000\u0000\u0426"+
+    "\u0429\u0003[%\u0000\u0427\u0429\u0003U\"\u0000\u0428\u0426\u0001\u0000"+
+    "\u0000\u0000\u0428\u0427\u0001\u0000\u0000\u0000\u0429\u042b\u0001\u0000"+
+    "\u0000\u0000\u042a\u042c\u0003]&\u0000\u042b\u042a\u0001\u0000\u0000\u0000"+
+    "\u042c\u042d\u0001\u0000\u0000\u0000\u042d\u042b\u0001\u0000\u0000\u0000"+
+    "\u042d\u042e\u0001\u0000\u0000\u0000\u042e\u0430\u0001\u0000\u0000\u0000"+
+    "\u042f\u041f\u0001\u0000\u0000\u0000\u042f\u0428\u0001\u0000\u0000\u0000"+
+    "\u0430\u00be\u0001\u0000\u0000\u0000\u0431\u0433\u0003W#\u0000\u0432\u0434"+
+    "\u0003Y$\u0000\u0433\u0432\u0001\u0000\u0000\u0000\u0434\u0435\u0001\u0000"+
+    "\u0000\u0000\u0435\u0433\u0001\u0000\u0000\u0000\u0435\u0436\u0001\u0000"+
+    "\u0000\u0000\u0436\u0437\u0001\u0000\u0000\u0000\u0437\u0438\u0003W#\u0000"+
+    "\u0438\u00c0\u0001\u0000\u0000\u0000\u0439\u043a\u0003\u00bfW\u0000\u043a"+
+    "\u00c2\u0001\u0000\u0000\u0000\u043b\u043c\u0003C\u0019\u0000\u043c\u043d"+
+    "\u0001\u0000\u0000\u0000\u043d\u043e\u0006Y\f\u0000\u043e\u00c4\u0001"+
+    "\u0000\u0000\u0000\u043f\u0440\u0003E\u001a\u0000\u0440\u0441\u0001\u0000"+
+    "\u0000\u0000\u0441\u0442\u0006Z\f\u0000\u0442\u00c6\u0001\u0000\u0000"+
+    "\u0000\u0443\u0444\u0003G\u001b\u0000\u0444\u0445\u0001\u0000\u0000\u0000"+
+    "\u0445\u0446\u0006[\f\u0000\u0446\u00c8\u0001\u0000\u0000\u0000\u0447"+
+    "\u0448\u0003\u00b9T\u0000\u0448\u0449\u0001\u0000\u0000\u0000\u0449\u044a"+
+    "\u0006\\\u000f\u0000\u044a\u044b\u0006\\\u0010\u0000\u044b\u00ca\u0001"+
+    "\u0000\u0000\u0000\u044c\u044d\u0003I\u001c\u0000\u044d\u044e\u0001\u0000"+
+    "\u0000\u0000\u044e\u044f\u0006]\u0011\u0000\u044f\u0450\u0006]\r\u0000"+
+    "\u0450\u00cc\u0001\u0000\u0000\u0000\u0451\u0452\u0003G\u001b\u0000\u0452"+
+    "\u0453\u0001\u0000\u0000\u0000\u0453\u0454\u0006^\f\u0000\u0454\u00ce"+
+    "\u0001\u0000\u0000\u0000\u0455\u0456\u0003C\u0019\u0000\u0456\u0457\u0001"+
+    "\u0000\u0000\u0000\u0457\u0458\u0006_\f\u0000\u0458\u00d0\u0001\u0000"+
+    "\u0000\u0000\u0459\u045a\u0003E\u001a\u0000\u045a\u045b\u0001\u0000\u0000"+
+    "\u0000\u045b\u045c\u0006`\f\u0000\u045c\u00d2\u0001\u0000\u0000\u0000"+
+    "\u045d\u045e\u0003I\u001c\u0000\u045e\u045f\u0001\u0000\u0000\u0000\u045f"+
+    "\u0460\u0006a\u0011\u0000\u0460\u0461\u0006a\r\u0000\u0461\u00d4\u0001"+
+    "\u0000\u0000\u0000\u0462\u0463\u0003\u00b9T\u0000\u0463\u0464\u0001\u0000"+
+    "\u0000\u0000\u0464\u0465\u0006b\u000f\u0000\u0465\u00d6\u0001\u0000\u0000"+
+    "\u0000\u0466\u0467\u0003\u00bbU\u0000\u0467\u0468\u0001\u0000\u0000\u0000"+
+    "\u0468\u0469\u0006c\u0012\u0000\u0469\u00d8\u0001\u0000\u0000\u0000\u046a"+
+    "\u046b\u0003o/\u0000\u046b\u046c\u0001\u0000\u0000\u0000\u046c\u046d\u0006"+
+    "d\u0013\u0000\u046d\u00da\u0001\u0000\u0000\u0000\u046e\u046f\u0004e\u0006"+
+    "\u0000\u046f\u0470\u0003m.\u0000\u0470\u0471\u0001\u0000\u0000\u0000\u0471"+
+    "\u0472\u0006e\u0014\u0000\u0472\u00dc\u0001\u0000\u0000\u0000\u0473\u0474"+
+    "\u0003q0\u0000\u0474\u0475\u0001\u0000\u0000\u0000\u0475\u0476\u0006f"+
+    "\u0015\u0000\u0476\u00de\u0001\u0000\u0000\u0000\u0477\u0478\u0003k-\u0000"+
+    "\u0478\u0479\u0001\u0000\u0000\u0000\u0479\u047a\u0006g\u0016\u0000\u047a"+
+    "\u00e0\u0001\u0000\u0000\u0000\u047b\u047c\u0007\u0010\u0000\u0000\u047c"+
+    "\u047d\u0007\u0003\u0000\u0000\u047d\u047e\u0007\u0005\u0000\u0000\u047e"+
+    "\u047f\u0007\f\u0000\u0000\u047f\u0480\u0007\u0000\u0000\u0000\u0480\u0481"+
+    "\u0007\f\u0000\u0000\u0481\u0482\u0007\u0005\u0000\u0000\u0482\u0483\u0007"+
+    "\f\u0000\u0000\u0483\u00e2\u0001\u0000\u0000\u0000\u0484\u0488\b \u0000"+
+    "\u0000\u0485\u0486\u0005/\u0000\u0000\u0486\u0488\b!\u0000\u0000\u0487"+
+    "\u0484\u0001\u0000\u0000\u0000\u0487\u0485\u0001\u0000\u0000\u0000\u0488"+
+    "\u00e4\u0001\u0000\u0000\u0000\u0489\u048b\u0003\u00e3i\u0000\u048a\u0489"+
+    "\u0001\u0000\u0000\u0000\u048b\u048c\u0001\u0000\u0000\u0000\u048c\u048a"+
+    "\u0001\u0000\u0000\u0000\u048c\u048d\u0001\u0000\u0000\u0000\u048d\u00e6"+
+    "\u0001\u0000\u0000\u0000\u048e\u048f\u0003\u00e5j\u0000\u048f\u0490\u0001"+
+    "\u0000\u0000\u0000\u0490\u0491\u0006k\u0017\u0000\u0491\u00e8\u0001\u0000"+
+    "\u0000\u0000\u0492\u0493\u0003_\'\u0000\u0493\u0494\u0001\u0000\u0000"+
+    "\u0000\u0494\u0495\u0006l\u0018\u0000\u0495\u00ea\u0001\u0000\u0000\u0000"+
+    "\u0496\u0497\u0003C\u0019\u0000\u0497\u0498\u0001\u0000\u0000\u0000\u0498"+
+    "\u0499\u0006m\f\u0000\u0499\u00ec\u0001\u0000\u0000\u0000\u049a\u049b"+
+    "\u0003E\u001a\u0000\u049b\u049c\u0001\u0000\u0000\u0000\u049c\u049d\u0006"+
+    "n\f\u0000\u049d\u00ee\u0001\u0000\u0000\u0000\u049e\u049f\u0003G\u001b"+
+    "\u0000\u049f\u04a0\u0001\u0000\u0000\u0000\u04a0\u04a1\u0006o\f\u0000"+
+    "\u04a1\u00f0\u0001\u0000\u0000\u0000\u04a2\u04a3\u0003I\u001c\u0000\u04a3"+
+    "\u04a4\u0001\u0000\u0000\u0000\u04a4\u04a5\u0006p\u0011\u0000\u04a5\u04a6"+
+    "\u0006p\r\u0000\u04a6\u00f2\u0001\u0000\u0000\u0000\u04a7\u04a8\u0003"+
+    "u2\u0000\u04a8\u04a9\u0001\u0000\u0000\u0000\u04a9\u04aa\u0006q\u0019"+
+    "\u0000\u04aa\u00f4\u0001\u0000\u0000\u0000\u04ab\u04ac\u0003q0\u0000\u04ac"+
+    "\u04ad\u0001\u0000\u0000\u0000\u04ad\u04ae\u0006r\u0015\u0000\u04ae\u00f6"+
+    "\u0001\u0000\u0000\u0000\u04af\u04b0\u0003\u008d>\u0000\u04b0\u04b1\u0001"+
+    "\u0000\u0000\u0000\u04b1\u04b2\u0006s\u001a\u0000\u04b2\u00f8\u0001\u0000"+
+    "\u0000\u0000\u04b3\u04b4\u0003\u00b5R\u0000\u04b4\u04b5\u0001\u0000\u0000"+
+    "\u0000\u04b5\u04b6\u0006t\u001b\u0000\u04b6\u00fa\u0001\u0000\u0000\u0000"+
+    "\u04b7\u04b8\u0003\u00b1P\u0000\u04b8\u04b9\u0001\u0000\u0000\u0000\u04b9"+
+    "\u04ba\u0006u\u001c\u0000\u04ba\u00fc\u0001\u0000\u0000\u0000\u04bb\u04bc"+
+    "\u0003\u00b7S\u0000\u04bc\u04bd\u0001\u0000\u0000\u0000\u04bd\u04be\u0006"+
+    "v\u001d\u0000\u04be\u00fe\u0001\u0000\u0000\u0000\u04bf\u04c4\u0003M\u001e"+
+    "\u0000\u04c0\u04c4\u0003K\u001d\u0000\u04c1\u04c4\u0003[%\u0000\u04c2"+
+    "\u04c4\u0003\u00a7K\u0000\u04c3\u04bf\u0001\u0000\u0000\u0000\u04c3\u04c0"+
+    "\u0001\u0000\u0000\u0000\u04c3\u04c1\u0001\u0000\u0000\u0000\u04c3\u04c2"+
+    "\u0001\u0000\u0000\u0000\u04c4\u0100\u0001\u0000\u0000\u0000\u04c5\u04c8"+
+    "\u0003M\u001e\u0000\u04c6\u04c8\u0003\u00a7K\u0000\u04c7\u04c5\u0001\u0000"+
+    "\u0000\u0000\u04c7\u04c6\u0001\u0000\u0000\u0000\u04c8\u04cc\u0001\u0000"+
+    "\u0000\u0000\u04c9\u04cb\u0003\u00ffw\u0000\u04ca\u04c9\u0001\u0000\u0000"+
+    "\u0000\u04cb\u04ce\u0001\u0000\u0000\u0000\u04cc\u04ca\u0001\u0000\u0000"+
+    "\u0000\u04cc\u04cd\u0001\u0000\u0000\u0000\u04cd\u04d9\u0001\u0000\u0000"+
+    "\u0000\u04ce\u04cc\u0001\u0000\u0000\u0000\u04cf\u04d2\u0003[%\u0000\u04d0"+
+    "\u04d2\u0003U\"\u0000\u04d1\u04cf\u0001\u0000\u0000\u0000\u04d1\u04d0"+
+    "\u0001\u0000\u0000\u0000\u04d2\u04d4\u0001\u0000\u0000\u0000\u04d3\u04d5"+
+    "\u0003\u00ffw\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\u04d9\u0001\u0000\u0000\u0000\u04d8\u04c7\u0001"+
+    "\u0000\u0000\u0000\u04d8\u04d1\u0001\u0000\u0000\u0000\u04d9\u0102\u0001"+
+    "\u0000\u0000\u0000\u04da\u04dd\u0003\u0101x\u0000\u04db\u04dd\u0003\u00bf"+
+    "W\u0000\u04dc\u04da\u0001\u0000\u0000\u0000\u04dc\u04db\u0001\u0000\u0000"+
+    "\u0000\u04dd\u04de\u0001\u0000\u0000\u0000\u04de\u04dc\u0001\u0000\u0000"+
+    "\u0000\u04de\u04df\u0001\u0000\u0000\u0000\u04df\u0104\u0001\u0000\u0000"+
+    "\u0000\u04e0\u04e1\u0003C\u0019\u0000\u04e1\u04e2\u0001\u0000\u0000\u0000"+
+    "\u04e2\u04e3\u0006z\f\u0000\u04e3\u0106\u0001\u0000\u0000\u0000\u04e4"+
+    "\u04e5\u0003E\u001a\u0000\u04e5\u04e6\u0001\u0000\u0000\u0000\u04e6\u04e7"+
+    "\u0006{\f\u0000\u04e7\u0108\u0001\u0000\u0000\u0000\u04e8\u04e9\u0003"+
+    "G\u001b\u0000\u04e9\u04ea\u0001\u0000\u0000\u0000\u04ea\u04eb\u0006|\f"+
+    "\u0000\u04eb\u010a\u0001\u0000\u0000\u0000\u04ec\u04ed\u0003I\u001c\u0000"+
+    "\u04ed\u04ee\u0001\u0000\u0000\u0000\u04ee\u04ef\u0006}\u0011\u0000\u04ef"+
+    "\u04f0\u0006}\r\u0000\u04f0\u010c\u0001\u0000\u0000\u0000\u04f1\u04f2"+
+    "\u0003k-\u0000\u04f2\u04f3\u0001\u0000\u0000\u0000\u04f3\u04f4\u0006~"+
+    "\u0016\u0000\u04f4\u010e\u0001\u0000\u0000\u0000\u04f5\u04f6\u0003q0\u0000"+
+    "\u04f6\u04f7\u0001\u0000\u0000\u0000\u04f7\u04f8\u0006\u007f\u0015\u0000"+
+    "\u04f8\u0110\u0001\u0000\u0000\u0000\u04f9\u04fa\u0003u2\u0000\u04fa\u04fb"+
+    "\u0001\u0000\u0000\u0000\u04fb\u04fc\u0006\u0080\u0019\u0000\u04fc\u0112"+
+    "\u0001\u0000\u0000\u0000\u04fd\u04fe\u0003\u008d>\u0000\u04fe\u04ff\u0001"+
+    "\u0000\u0000\u0000\u04ff\u0500\u0006\u0081\u001a\u0000\u0500\u0114\u0001"+
+    "\u0000\u0000\u0000\u0501\u0502\u0003\u00b5R\u0000\u0502\u0503\u0001\u0000"+
+    "\u0000\u0000\u0503\u0504\u0006\u0082\u001b\u0000\u0504\u0116\u0001\u0000"+
+    "\u0000\u0000\u0505\u0506\u0003\u00b1P\u0000\u0506\u0507\u0001\u0000\u0000"+
+    "\u0000\u0507\u0508\u0006\u0083\u001c\u0000\u0508\u0118\u0001\u0000\u0000"+
+    "\u0000\u0509\u050a\u0003\u00b7S\u0000\u050a\u050b\u0001\u0000\u0000\u0000"+
+    "\u050b\u050c\u0006\u0084\u001d\u0000\u050c\u011a\u0001\u0000\u0000\u0000"+
+    "\u050d\u050e\u0007\f\u0000\u0000\u050e\u050f\u0007\u0002\u0000\u0000\u050f"+
+    "\u011c\u0001\u0000\u0000\u0000\u0510\u0511\u0003\u0103y\u0000\u0511\u0512"+
+    "\u0001\u0000\u0000\u0000\u0512\u0513\u0006\u0086\u001e\u0000\u0513\u011e"+
+    "\u0001\u0000\u0000\u0000\u0514\u0515\u0003C\u0019\u0000\u0515\u0516\u0001"+
+    "\u0000\u0000\u0000\u0516\u0517\u0006\u0087\f\u0000\u0517\u0120\u0001\u0000"+
+    "\u0000\u0000\u0518\u0519\u0003E\u001a\u0000\u0519\u051a\u0001\u0000\u0000"+
+    "\u0000\u051a\u051b\u0006\u0088\f\u0000\u051b\u0122\u0001\u0000\u0000\u0000"+
+    "\u051c\u051d\u0003G\u001b\u0000\u051d\u051e\u0001\u0000\u0000\u0000\u051e"+
+    "\u051f\u0006\u0089\f\u0000\u051f\u0124\u0001\u0000\u0000\u0000\u0520\u0521"+
+    "\u0003I\u001c\u0000\u0521\u0522\u0001\u0000\u0000\u0000\u0522\u0523\u0006"+
+    "\u008a\u0011\u0000\u0523\u0524\u0006\u008a\r\u0000\u0524\u0126\u0001\u0000"+
+    "\u0000\u0000\u0525\u0526\u0003\u00b9T\u0000\u0526\u0527\u0001\u0000\u0000"+
+    "\u0000\u0527\u0528\u0006\u008b\u000f\u0000\u0528\u0529\u0006\u008b\u001f"+
+    "\u0000\u0529\u0128\u0001\u0000\u0000\u0000\u052a\u052b\u0007\u0007\u0000"+
+    "\u0000\u052b\u052c\u0007\t\u0000\u0000\u052c\u052d\u0001\u0000\u0000\u0000"+
+    "\u052d\u052e\u0006\u008c \u0000\u052e\u012a\u0001\u0000\u0000\u0000\u052f"+
+    "\u0530\u0007\u0013\u0000\u0000\u0530\u0531\u0007\u0001\u0000\u0000\u0531"+
+    "\u0532\u0007\u0005\u0000\u0000\u0532\u0533\u0007\n\u0000\u0000\u0533\u0534"+
+    "\u0001\u0000\u0000\u0000\u0534\u0535\u0006\u008d \u0000\u0535\u012c\u0001"+
+    "\u0000\u0000\u0000\u0536\u0537\b\"\u0000\u0000\u0537\u012e\u0001\u0000"+
+    "\u0000\u0000\u0538\u053a\u0003\u012d\u008e\u0000\u0539\u0538\u0001\u0000"+
+    "\u0000\u0000\u053a\u053b\u0001\u0000\u0000\u0000\u053b\u0539\u0001\u0000"+
+    "\u0000\u0000\u053b\u053c\u0001\u0000\u0000\u0000\u053c\u053d\u0001\u0000"+
+    "\u0000\u0000\u053d\u053e\u0003o/\u0000\u053e\u0540\u0001\u0000\u0000\u0000"+
+    "\u053f\u0539\u0001\u0000\u0000\u0000\u053f\u0540\u0001\u0000\u0000\u0000"+
+    "\u0540\u0542\u0001\u0000\u0000\u0000\u0541\u0543\u0003\u012d\u008e\u0000"+
+    "\u0542\u0541\u0001\u0000\u0000\u0000\u0543\u0544\u0001\u0000\u0000\u0000"+
+    "\u0544\u0542\u0001\u0000\u0000\u0000\u0544\u0545\u0001\u0000\u0000\u0000"+
+    "\u0545\u0130\u0001\u0000\u0000\u0000\u0546\u0547\u0003\u012f\u008f\u0000"+
+    "\u0547\u0548\u0001\u0000\u0000\u0000\u0548\u0549\u0006\u0090!\u0000\u0549"+
+    "\u0132\u0001\u0000\u0000\u0000\u054a\u054b\u0003C\u0019\u0000\u054b\u054c"+
+    "\u0001\u0000\u0000\u0000\u054c\u054d\u0006\u0091\f\u0000\u054d\u0134\u0001"+
+    "\u0000\u0000\u0000\u054e\u054f\u0003E\u001a\u0000\u054f\u0550\u0001\u0000"+
+    "\u0000\u0000\u0550\u0551\u0006\u0092\f\u0000\u0551\u0136\u0001\u0000\u0000"+
+    "\u0000\u0552\u0553\u0003G\u001b\u0000\u0553\u0554\u0001\u0000\u0000\u0000"+
+    "\u0554\u0555\u0006\u0093\f\u0000\u0555\u0138\u0001\u0000\u0000\u0000\u0556"+
+    "\u0557\u0003I\u001c\u0000\u0557\u0558\u0001\u0000\u0000\u0000\u0558\u0559"+
+    "\u0006\u0094\u0011\u0000\u0559\u055a\u0006\u0094\r\u0000\u055a\u055b\u0006"+
+    "\u0094\r\u0000\u055b\u013a\u0001\u0000\u0000\u0000\u055c\u055d\u0003k"+
+    "-\u0000\u055d\u055e\u0001\u0000\u0000\u0000\u055e\u055f\u0006\u0095\u0016"+
+    "\u0000\u055f\u013c\u0001\u0000\u0000\u0000\u0560\u0561\u0003q0\u0000\u0561"+
+    "\u0562\u0001\u0000\u0000\u0000\u0562\u0563\u0006\u0096\u0015\u0000\u0563"+
+    "\u013e\u0001\u0000\u0000\u0000\u0564\u0565\u0003u2\u0000\u0565\u0566\u0001"+
+    "\u0000\u0000\u0000\u0566\u0567\u0006\u0097\u0019\u0000\u0567\u0140\u0001"+
+    "\u0000\u0000\u0000\u0568\u0569\u0003\u012b\u008d\u0000\u0569\u056a\u0001"+
+    "\u0000\u0000\u0000\u056a\u056b\u0006\u0098\"\u0000\u056b\u0142\u0001\u0000"+
+    "\u0000\u0000\u056c\u056d\u0003\u0103y\u0000\u056d\u056e\u0001\u0000\u0000"+
+    "\u0000\u056e\u056f\u0006\u0099\u001e\u0000\u056f\u0144\u0001\u0000\u0000"+
+    "\u0000\u0570\u0571\u0003\u00c1X\u0000\u0571\u0572\u0001\u0000\u0000\u0000"+
+    "\u0572\u0573\u0006\u009a#\u0000\u0573\u0146\u0001\u0000\u0000\u0000\u0574"+
+    "\u0575\u0003\u008d>\u0000\u0575\u0576\u0001\u0000\u0000\u0000\u0576\u0577"+
+    "\u0006\u009b\u001a\u0000\u0577\u0148\u0001\u0000\u0000\u0000\u0578\u0579"+
+    "\u0003\u00b5R\u0000\u0579\u057a\u0001\u0000\u0000\u0000\u057a\u057b\u0006"+
+    "\u009c\u001b\u0000\u057b\u014a\u0001\u0000\u0000\u0000\u057c\u057d\u0003"+
+    "\u00b1P\u0000\u057d\u057e\u0001\u0000\u0000\u0000\u057e\u057f\u0006\u009d"+
+    "\u001c\u0000\u057f\u014c\u0001\u0000\u0000\u0000\u0580\u0581\u0003\u00b7"+
+    "S\u0000\u0581\u0582\u0001\u0000\u0000\u0000\u0582\u0583\u0006\u009e\u001d"+
+    "\u0000\u0583\u014e\u0001\u0000\u0000\u0000\u0584\u0585\u0003C\u0019\u0000"+
+    "\u0585\u0586\u0001\u0000\u0000\u0000\u0586\u0587\u0006\u009f\f\u0000\u0587"+
+    "\u0150\u0001\u0000\u0000\u0000\u0588\u0589\u0003E\u001a\u0000\u0589\u058a"+
+    "\u0001\u0000\u0000\u0000\u058a\u058b\u0006\u00a0\f\u0000\u058b\u0152\u0001"+
+    "\u0000\u0000\u0000\u058c\u058d\u0003G\u001b\u0000\u058d\u058e\u0001\u0000"+
+    "\u0000\u0000\u058e\u058f\u0006\u00a1\f\u0000\u058f\u0154\u0001\u0000\u0000"+
+    "\u0000\u0590\u0591\u0003I\u001c\u0000\u0591\u0592\u0001\u0000\u0000\u0000"+
+    "\u0592\u0593\u0006\u00a2\u0011\u0000\u0593\u0594\u0006\u00a2\r\u0000\u0594"+
+    "\u0156\u0001\u0000\u0000\u0000\u0595\u0596\u0003u2\u0000\u0596\u0597\u0001"+
+    "\u0000\u0000\u0000\u0597\u0598\u0006\u00a3\u0019\u0000\u0598\u0158\u0001"+
+    "\u0000\u0000\u0000\u0599\u059a\u0003\u008d>\u0000\u059a\u059b\u0001\u0000"+
+    "\u0000\u0000\u059b\u059c\u0006\u00a4\u001a\u0000\u059c\u015a\u0001\u0000"+
+    "\u0000\u0000\u059d\u059e\u0003\u00b5R\u0000\u059e\u059f\u0001\u0000\u0000"+
+    "\u0000\u059f\u05a0\u0006\u00a5\u001b\u0000\u05a0\u015c\u0001\u0000\u0000"+
+    "\u0000\u05a1\u05a2\u0003\u00b1P\u0000\u05a2\u05a3\u0001\u0000\u0000\u0000"+
+    "\u05a3\u05a4\u0006\u00a6\u001c\u0000\u05a4\u015e\u0001\u0000\u0000\u0000"+
+    "\u05a5\u05a6\u0003\u00b7S\u0000\u05a6\u05a7\u0001\u0000\u0000\u0000\u05a7"+
+    "\u05a8\u0006\u00a7\u001d\u0000\u05a8\u0160\u0001\u0000\u0000\u0000\u05a9"+
+    "\u05aa\u0003\u00c1X\u0000\u05aa\u05ab\u0001\u0000\u0000\u0000\u05ab\u05ac"+
+    "\u0006\u00a8#\u0000\u05ac\u0162\u0001\u0000\u0000\u0000\u05ad\u05ae\u0003"+
+    "\u00bdV\u0000\u05ae\u05af\u0001\u0000\u0000\u0000\u05af\u05b0\u0006\u00a9"+
+    "$\u0000\u05b0\u0164\u0001\u0000\u0000\u0000\u05b1\u05b2\u0003C\u0019\u0000"+
+    "\u05b2\u05b3\u0001\u0000\u0000\u0000\u05b3\u05b4\u0006\u00aa\f\u0000\u05b4"+
+    "\u0166\u0001\u0000\u0000\u0000\u05b5\u05b6\u0003E\u001a\u0000\u05b6\u05b7"+
+    "\u0001\u0000\u0000\u0000\u05b7\u05b8\u0006\u00ab\f\u0000\u05b8\u0168\u0001"+
+    "\u0000\u0000\u0000\u05b9\u05ba\u0003G\u001b\u0000\u05ba\u05bb\u0001\u0000"+
+    "\u0000\u0000\u05bb\u05bc\u0006\u00ac\f\u0000\u05bc\u016a\u0001\u0000\u0000"+
+    "\u0000\u05bd\u05be\u0003I\u001c\u0000\u05be\u05bf\u0001\u0000\u0000\u0000"+
+    "\u05bf\u05c0\u0006\u00ad\u0011\u0000\u05c0\u05c1\u0006\u00ad\r\u0000\u05c1"+
+    "\u016c\u0001\u0000\u0000\u0000\u05c2\u05c3\u0007\u0001\u0000\u0000\u05c3"+
+    "\u05c4\u0007\t\u0000\u0000\u05c4\u05c5\u0007\u000f\u0000\u0000\u05c5\u05c6"+
+    "\u0007\u0007\u0000\u0000\u05c6\u016e\u0001\u0000\u0000\u0000\u05c7\u05c8"+
+    "\u0003C\u0019\u0000\u05c8\u05c9\u0001\u0000\u0000\u0000\u05c9\u05ca\u0006"+
+    "\u00af\f\u0000\u05ca\u0170\u0001\u0000\u0000\u0000\u05cb\u05cc\u0003E"+
+    "\u001a\u0000\u05cc\u05cd\u0001\u0000\u0000\u0000\u05cd\u05ce\u0006\u00b0"+
+    "\f\u0000\u05ce\u0172\u0001\u0000\u0000\u0000\u05cf\u05d0\u0003G\u001b"+
+    "\u0000\u05d0\u05d1\u0001\u0000\u0000\u0000\u05d1\u05d2\u0006\u00b1\f\u0000"+
+    "\u05d2\u0174\u0001\u0000\u0000\u0000\u05d3\u05d4\u0003\u00bbU\u0000\u05d4"+
+    "\u05d5\u0001\u0000\u0000\u0000\u05d5\u05d6\u0006\u00b2\u0012\u0000\u05d6"+
+    "\u05d7\u0006\u00b2\r\u0000\u05d7\u0176\u0001\u0000\u0000\u0000\u05d8\u05d9"+
+    "\u0003o/\u0000\u05d9\u05da\u0001\u0000\u0000\u0000\u05da\u05db\u0006\u00b3"+
+    "\u0013\u0000\u05db\u0178\u0001\u0000\u0000\u0000\u05dc\u05e2\u0003U\""+
+    "\u0000\u05dd\u05e2\u0003K\u001d\u0000\u05de\u05e2\u0003u2\u0000\u05df"+
+    "\u05e2\u0003M\u001e\u0000\u05e0\u05e2\u0003[%\u0000\u05e1\u05dc\u0001"+
+    "\u0000\u0000\u0000\u05e1\u05dd\u0001\u0000\u0000\u0000\u05e1\u05de\u0001"+
+    "\u0000\u0000\u0000\u05e1\u05df\u0001\u0000\u0000\u0000\u05e1\u05e0\u0001"+
+    "\u0000\u0000\u0000\u05e2\u05e3\u0001\u0000\u0000\u0000\u05e3\u05e1\u0001"+
+    "\u0000\u0000\u0000\u05e3\u05e4\u0001\u0000\u0000\u0000\u05e4\u017a\u0001"+
+    "\u0000\u0000\u0000\u05e5\u05e6\u0003C\u0019\u0000\u05e6\u05e7\u0001\u0000"+
+    "\u0000\u0000\u05e7\u05e8\u0006\u00b5\f\u0000\u05e8\u017c\u0001\u0000\u0000"+
+    "\u0000\u05e9\u05ea\u0003E\u001a\u0000\u05ea\u05eb\u0001\u0000\u0000\u0000"+
+    "\u05eb\u05ec\u0006\u00b6\f\u0000\u05ec\u017e\u0001\u0000\u0000\u0000\u05ed"+
+    "\u05ee\u0003G\u001b\u0000\u05ee\u05ef\u0001\u0000\u0000\u0000\u05ef\u05f0"+
+    "\u0006\u00b7\f\u0000\u05f0\u0180\u0001\u0000\u0000\u0000\u05f1\u05f2\u0003"+
+    "I\u001c\u0000\u05f2\u05f3\u0001\u0000\u0000\u0000\u05f3\u05f4\u0006\u00b8"+
+    "\u0011\u0000\u05f4\u05f5\u0006\u00b8\r\u0000\u05f5\u0182\u0001\u0000\u0000"+
+    "\u0000\u05f6\u05f7\u0003o/\u0000\u05f7\u05f8\u0001\u0000\u0000\u0000\u05f8"+
+    "\u05f9\u0006\u00b9\u0013\u0000\u05f9\u0184\u0001\u0000\u0000\u0000\u05fa"+
+    "\u05fb\u0003q0\u0000\u05fb\u05fc\u0001\u0000\u0000\u0000\u05fc\u05fd\u0006"+
+    "\u00ba\u0015\u0000\u05fd\u0186\u0001\u0000\u0000\u0000\u05fe\u05ff\u0003"+
+    "u2\u0000\u05ff\u0600\u0001\u0000\u0000\u0000\u0600\u0601\u0006\u00bb\u0019"+
+    "\u0000\u0601\u0188\u0001\u0000\u0000\u0000\u0602\u0603\u0003\u0129\u008c"+
+    "\u0000\u0603\u0604\u0001\u0000\u0000\u0000\u0604\u0605\u0006\u00bc%\u0000"+
+    "\u0605\u0606\u0006\u00bc&\u0000\u0606\u018a\u0001\u0000\u0000\u0000\u0607"+
+    "\u0608\u0003\u00e5j\u0000\u0608\u0609\u0001\u0000\u0000\u0000\u0609\u060a"+
+    "\u0006\u00bd\u0017\u0000\u060a\u018c\u0001\u0000\u0000\u0000\u060b\u060c"+
+    "\u0003_\'\u0000\u060c\u060d\u0001\u0000\u0000\u0000\u060d\u060e\u0006"+
+    "\u00be\u0018\u0000\u060e\u018e\u0001\u0000\u0000\u0000\u060f\u0610\u0003"+
+    "C\u0019\u0000\u0610\u0611\u0001\u0000\u0000\u0000\u0611\u0612\u0006\u00bf"+
+    "\f\u0000\u0612\u0190\u0001\u0000\u0000\u0000\u0613\u0614\u0003E\u001a"+
+    "\u0000\u0614\u0615\u0001\u0000\u0000\u0000\u0615\u0616\u0006\u00c0\f\u0000"+
+    "\u0616\u0192\u0001\u0000\u0000\u0000\u0617\u0618\u0003G\u001b\u0000\u0618"+
+    "\u0619\u0001\u0000\u0000\u0000\u0619\u061a\u0006\u00c1\f\u0000\u061a\u0194"+
+    "\u0001\u0000\u0000\u0000\u061b\u061c\u0003I\u001c\u0000\u061c\u061d\u0001"+
+    "\u0000\u0000\u0000\u061d\u061e\u0006\u00c2\u0011\u0000\u061e\u061f\u0006"+
+    "\u00c2\r\u0000\u061f\u0620\u0006\u00c2\r\u0000\u0620\u0196\u0001\u0000"+
+    "\u0000\u0000\u0621\u0622\u0003q0\u0000\u0622\u0623\u0001\u0000\u0000\u0000"+
+    "\u0623\u0624\u0006\u00c3\u0015\u0000\u0624\u0198\u0001\u0000\u0000\u0000"+
+    "\u0625\u0626\u0003u2\u0000\u0626\u0627\u0001\u0000\u0000\u0000\u0627\u0628"+
+    "\u0006\u00c4\u0019\u0000\u0628\u019a\u0001\u0000\u0000\u0000\u0629\u062a"+
+    "\u0003\u0103y\u0000\u062a\u062b\u0001\u0000\u0000\u0000\u062b\u062c\u0006"+
+    "\u00c5\u001e\u0000\u062c\u019c\u0001\u0000\u0000\u0000\u062d\u062e\u0003"+
+    "C\u0019\u0000\u062e\u062f\u0001\u0000\u0000\u0000\u062f\u0630\u0006\u00c6"+
+    "\f\u0000\u0630\u019e\u0001\u0000\u0000\u0000\u0631\u0632\u0003E\u001a"+
+    "\u0000\u0632\u0633\u0001\u0000\u0000\u0000\u0633\u0634\u0006\u00c7\f\u0000"+
+    "\u0634\u01a0\u0001\u0000\u0000\u0000\u0635\u0636\u0003G\u001b\u0000\u0636"+
+    "\u0637\u0001\u0000\u0000\u0000\u0637\u0638\u0006\u00c8\f\u0000\u0638\u01a2"+
+    "\u0001\u0000\u0000\u0000\u0639\u063a\u0003I\u001c\u0000\u063a\u063b\u0001"+
+    "\u0000\u0000\u0000\u063b\u063c\u0006\u00c9\u0011\u0000\u063c\u063d\u0006"+
+    "\u00c9\r\u0000\u063d\u01a4\u0001\u0000\u0000\u0000\u063e\u063f\u0007#"+
+    "\u0000\u0000\u063f\u0640\u0007\u0007\u0000\u0000\u0640\u0641\u0007\u0001"+
+    "\u0000\u0000\u0641\u0642\u0007\t\u0000\u0000\u0642\u01a6\u0001\u0000\u0000"+
+    "\u0000\u0643\u0644\u0003\u011b\u0085\u0000\u0644\u0645\u0001\u0000\u0000"+
+    "\u0000\u0645\u0646\u0006\u00cb\'\u0000\u0646\u01a8\u0001\u0000\u0000\u0000"+
+    "\u0647\u0648\u0003\u0129\u008c\u0000\u0648\u0649\u0001\u0000\u0000\u0000"+
+    "\u0649\u064a\u0006\u00cc%\u0000\u064a\u064b\u0006\u00cc\r\u0000\u064b"+
+    "\u064c\u0006\u00cc\u0000\u0000\u064c\u01aa\u0001\u0000\u0000\u0000\u064d"+
+    "\u064e\u0007\u0014\u0000\u0000\u064e\u064f\u0007\u0002\u0000\u0000\u064f"+
+    "\u0650\u0007\u0001\u0000\u0000\u0650\u0651\u0007\t\u0000\u0000\u0651\u0652"+
+    "\u0007\u0011\u0000\u0000\u0652\u0653\u0001\u0000\u0000\u0000\u0653\u0654"+
+    "\u0006\u00cd\r\u0000\u0654\u0655\u0006\u00cd\u0000\u0000\u0655\u01ac\u0001"+
+    "\u0000\u0000\u0000\u0656\u0657\u0003\u00e5j\u0000\u0657\u0658\u0001\u0000"+
+    "\u0000\u0000\u0658\u0659\u0006\u00ce\u0017\u0000\u0659\u01ae\u0001\u0000"+
+    "\u0000\u0000\u065a\u065b\u0003_\'\u0000\u065b\u065c\u0001\u0000\u0000"+
+    "\u0000\u065c\u065d\u0006\u00cf\u0018\u0000\u065d\u01b0\u0001\u0000\u0000"+
+    "\u0000\u065e\u065f\u0003o/\u0000\u065f\u0660\u0001\u0000\u0000\u0000\u0660"+
+    "\u0661\u0006\u00d0\u0013\u0000\u0661\u01b2\u0001\u0000\u0000\u0000\u0662"+
+    "\u0663\u0003\u00bdV\u0000\u0663\u0664\u0001\u0000\u0000\u0000\u0664\u0665"+
+    "\u0006\u00d1$\u0000\u0665\u01b4\u0001\u0000\u0000\u0000\u0666\u0667\u0003"+
+    "\u00c1X\u0000\u0667\u0668\u0001\u0000\u0000\u0000\u0668\u0669\u0006\u00d2"+
+    "#\u0000\u0669\u01b6\u0001\u0000\u0000\u0000\u066a\u066b\u0003C\u0019\u0000"+
+    "\u066b\u066c\u0001\u0000\u0000\u0000\u066c\u066d\u0006\u00d3\f\u0000\u066d"+
+    "\u01b8\u0001\u0000\u0000\u0000\u066e\u066f\u0003E\u001a\u0000\u066f\u0670"+
+    "\u0001\u0000\u0000\u0000\u0670\u0671\u0006\u00d4\f\u0000\u0671\u01ba\u0001"+
+    "\u0000\u0000\u0000\u0672\u0673\u0003G\u001b\u0000\u0673\u0674\u0001\u0000"+
+    "\u0000\u0000\u0674\u0675\u0006\u00d5\f\u0000\u0675\u01bc\u0001\u0000\u0000"+
+    "\u0000\u0676\u0677\u0003I\u001c\u0000\u0677\u0678\u0001\u0000\u0000\u0000"+
+    "\u0678\u0679\u0006\u00d6\u0011\u0000\u0679\u067a\u0006\u00d6\r\u0000\u067a"+
+    "\u01be\u0001\u0000\u0000\u0000\u067b\u067c\u0003\u00e5j\u0000\u067c\u067d"+
+    "\u0001\u0000\u0000\u0000\u067d\u067e\u0006\u00d7\u0017\u0000\u067e\u067f"+
+    "\u0006\u00d7\r\u0000\u067f\u0680\u0006\u00d7(\u0000\u0680\u01c0\u0001"+
+    "\u0000\u0000\u0000\u0681\u0682\u0003_\'\u0000\u0682\u0683\u0001\u0000"+
+    "\u0000\u0000\u0683\u0684\u0006\u00d8\u0018\u0000\u0684\u0685\u0006\u00d8"+
+    "\r\u0000\u0685\u0686\u0006\u00d8(\u0000\u0686\u01c2\u0001\u0000\u0000"+
+    "\u0000\u0687\u0688\u0003C\u0019\u0000\u0688\u0689\u0001\u0000\u0000\u0000"+
+    "\u0689\u068a\u0006\u00d9\f\u0000\u068a\u01c4\u0001\u0000\u0000\u0000\u068b"+
+    "\u068c\u0003E\u001a\u0000\u068c\u068d\u0001\u0000\u0000\u0000\u068d\u068e"+
+    "\u0006\u00da\f\u0000\u068e\u01c6\u0001\u0000\u0000\u0000\u068f\u0690\u0003"+
+    "G\u001b\u0000\u0690\u0691\u0001\u0000\u0000\u0000\u0691\u0692\u0006\u00db"+
+    "\f\u0000\u0692\u01c8\u0001\u0000\u0000\u0000\u0693\u0694\u0003o/\u0000"+
+    "\u0694\u0695\u0001\u0000\u0000\u0000\u0695\u0696\u0006\u00dc\u0013\u0000"+
+    "\u0696\u0697\u0006\u00dc\r\u0000\u0697\u0698\u0006\u00dc\u000b\u0000\u0698"+
+    "\u01ca\u0001\u0000\u0000\u0000\u0699\u069a\u0003m.\u0000\u069a\u069b\u0001"+
+    "\u0000\u0000\u0000\u069b\u069c\u0006\u00dd\u0014\u0000\u069c\u069d\u0006"+
+    "\u00dd\r\u0000\u069d\u069e\u0006\u00dd\u000b\u0000\u069e\u01cc\u0001\u0000"+
+    "\u0000\u0000\u069f\u06a0\u0003q0\u0000\u06a0\u06a1\u0001\u0000\u0000\u0000"+
+    "\u06a1\u06a2\u0006\u00de\u0015\u0000\u06a2\u06a3\u0006\u00de\r\u0000\u06a3"+
+    "\u06a4\u0006\u00de\u000b\u0000\u06a4\u01ce\u0001\u0000\u0000\u0000\u06a5"+
+    "\u06a6\u0003C\u0019\u0000\u06a6\u06a7\u0001\u0000\u0000\u0000\u06a7\u06a8"+
+    "\u0006\u00df\f\u0000\u06a8\u01d0\u0001\u0000\u0000\u0000\u06a9\u06aa\u0003"+
+    "E\u001a\u0000\u06aa\u06ab\u0001\u0000\u0000\u0000\u06ab\u06ac\u0006\u00e0"+
+    "\f\u0000\u06ac\u01d2\u0001\u0000\u0000\u0000\u06ad\u06ae\u0003G\u001b"+
+    "\u0000\u06ae\u06af\u0001\u0000\u0000\u0000\u06af\u06b0\u0006\u00e1\f\u0000"+
+    "\u06b0\u01d4\u0001\u0000\u0000\u0000\u06b1\u06b2\u0003\u00c1X\u0000\u06b2"+
+    "\u06b3\u0001\u0000\u0000\u0000\u06b3\u06b4\u0006\u00e2\r\u0000\u06b4\u06b5"+
+    "\u0006\u00e2\u0000\u0000\u06b5\u06b6\u0006\u00e2#\u0000\u06b6\u01d6\u0001"+
+    "\u0000\u0000\u0000\u06b7\u06b8\u0003\u00bdV\u0000\u06b8\u06b9\u0001\u0000"+
+    "\u0000\u0000\u06b9\u06ba\u0006\u00e3\r\u0000\u06ba\u06bb\u0006\u00e3\u0000"+
+    "\u0000\u06bb\u06bc\u0006\u00e3$\u0000\u06bc\u01d8\u0001\u0000\u0000\u0000"+
+    "\u06bd\u06be\u0003e*\u0000\u06be\u06bf\u0001\u0000\u0000\u0000\u06bf\u06c0"+
+    "\u0006\u00e4\r\u0000\u06c0\u06c1\u0006\u00e4\u0000\u0000\u06c1\u06c2\u0006"+
+    "\u00e4)\u0000\u06c2\u01da\u0001\u0000\u0000\u0000\u06c3\u06c4\u0003I\u001c"+
+    "\u0000\u06c4\u06c5\u0001\u0000\u0000\u0000\u06c5\u06c6\u0006\u00e5\u0011"+
+    "\u0000\u06c6\u06c7\u0006\u00e5\r\u0000\u06c7\u01dc\u0001\u0000\u0000\u0000"+
+    "\u06c8\u06c9\u0003I\u001c\u0000\u06c9\u06ca\u0001\u0000\u0000\u0000\u06ca"+
+    "\u06cb\u0006\u00e6\u0011\u0000\u06cb\u06cc\u0006\u00e6\r\u0000\u06cc\u01de"+
+    "\u0001\u0000\u0000\u0000\u06cd\u06ce\u0003\u0129\u008c\u0000\u06ce\u06cf"+
+    "\u0001\u0000\u0000\u0000\u06cf\u06d0\u0006\u00e7%\u0000\u06d0\u01e0\u0001"+
+    "\u0000\u0000\u0000\u06d1\u06d2\u0003\u011b\u0085\u0000\u06d2\u06d3\u0001"+
+    "\u0000\u0000\u0000\u06d3\u06d4\u0006\u00e8\'\u0000\u06d4\u01e2\u0001\u0000"+
+    "\u0000\u0000\u06d5\u06d6\u0003u2\u0000\u06d6\u06d7\u0001\u0000\u0000\u0000"+
+    "\u06d7\u06d8\u0006\u00e9\u0019\u0000\u06d8\u01e4\u0001\u0000\u0000\u0000"+
+    "\u06d9\u06da\u0003q0\u0000\u06da\u06db\u0001\u0000\u0000\u0000\u06db\u06dc"+
+    "\u0006\u00ea\u0015\u0000\u06dc\u01e6\u0001\u0000\u0000\u0000\u06dd\u06de"+
+    "\u0003\u00c1X\u0000\u06de\u06df\u0001\u0000\u0000\u0000\u06df\u06e0\u0006"+
+    "\u00eb#\u0000\u06e0\u01e8\u0001\u0000\u0000\u0000\u06e1\u06e2\u0003\u00bd"+
+    "V\u0000\u06e2\u06e3\u0001\u0000\u0000\u0000\u06e3\u06e4\u0006\u00ec$\u0000"+
+    "\u06e4\u01ea\u0001\u0000\u0000\u0000\u06e5\u06e6\u0003C\u0019\u0000\u06e6"+
+    "\u06e7\u0001\u0000\u0000\u0000\u06e7\u06e8\u0006\u00ed\f\u0000\u06e8\u01ec"+
+    "\u0001\u0000\u0000\u0000\u06e9\u06ea\u0003E\u001a\u0000\u06ea\u06eb\u0001"+
+    "\u0000\u0000\u0000\u06eb\u06ec\u0006\u00ee\f\u0000\u06ec\u01ee\u0001\u0000"+
+    "\u0000\u0000\u06ed\u06ee\u0003G\u001b\u0000\u06ee\u06ef\u0001\u0000\u0000"+
+    "\u0000\u06ef\u06f0\u0006\u00ef\f\u0000\u06f0\u01f0\u0001\u0000\u0000\u0000"+
+    "G\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e"+
+    "\u000f\u0010\u02cc\u02d6\u02da\u02dd\u02e6\u02e8\u02f3\u0306\u030b\u0314"+
+    "\u031b\u0320\u0322\u032d\u0335\u0338\u033a\u033f\u0344\u034a\u0351\u0356"+
+    "\u035c\u035f\u0367\u036b\u03f2\u03f7\u03fe\u0400\u0405\u040a\u0411\u0413"+
+    "\u0423\u0428\u042d\u042f\u0435\u0487\u048c\u04c3\u04c7\u04cc\u04d1\u04d6"+
+    "\u04d8\u04dc\u04de\u053b\u053f\u0544\u05e1\u05e3*\u0005\u0001\u0000\u0005"+
+    "\u0004\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0005\u0003\u0000\u0005"+
+    "\b\u0000\u0005\u0005\u0000\u0005\t\u0000\u0005\r\u0000\u0005\u0010\u0000"+
+    "\u0005\u000b\u0000\u0005\u000e\u0000\u0000\u0001\u0000\u0004\u0000\u0000"+
+    "\u0007\u0010\u0000\u0007J\u0000\u0005\u0000\u0000\u0007\u001d\u0000\u0007"+
+    "K\u0000\u0007&\u0000\u0007%\u0000\u0007\'\u0000\u0007$\u0000\u0007U\u0000"+
+    "\u0007\u001e\u0000\u0007)\u0000\u00075\u0000\u0007H\u0000\u0007G\u0000"+
+    "\u0007I\u0000\u0007Y\u0000\u0005\n\u0000\u0005\u0007\u0000\u0007c\u0000"+
+    "\u0007b\u0000\u0007M\u0000\u0007L\u0000\u0007a\u0000\u0005\f\u0000\u0007"+
+    "]\u0000\u0005\u000f\u0000\u0007!\u0000";
   public static final ATN _ATN =
     new ATNDeserializer().deserialize(_serializedATN.toCharArray());
   static {

文件差异内容过多而无法显示
+ 9 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp


文件差异内容过多而无法显示
+ 197 - 183
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java


+ 12 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java

@@ -1088,6 +1088,18 @@ public class EsqlBaseParserBaseListener implements EsqlBaseParserListener {
    * <p>The default implementation does nothing.</p>
    */
   @Override public void exitEnrichWithClause(EsqlBaseParser.EnrichWithClauseContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void enterChangePointCommand(EsqlBaseParser.ChangePointCommandContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void exitChangePointCommand(EsqlBaseParser.ChangePointCommandContext ctx) { }
   /**
    * {@inheritDoc}
    *

+ 7 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java

@@ -643,6 +643,13 @@ public class EsqlBaseParserBaseVisitor<T> extends AbstractParseTreeVisitor<T> im
    * {@link #visitChildren} on {@code ctx}.</p>
    */
   @Override public T visitEnrichWithClause(EsqlBaseParser.EnrichWithClauseContext ctx) { return visitChildren(ctx); }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation returns the result of calling
+   * {@link #visitChildren} on {@code ctx}.</p>
+   */
+  @Override public T visitChangePointCommand(EsqlBaseParser.ChangePointCommandContext ctx) { return visitChildren(ctx); }
   /**
    * {@inheritDoc}
    *

+ 10 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java

@@ -975,6 +975,16 @@ public interface EsqlBaseParserListener extends ParseTreeListener {
    * @param ctx the parse tree
    */
   void exitEnrichWithClause(EsqlBaseParser.EnrichWithClauseContext ctx);
+  /**
+   * Enter a parse tree produced by {@link EsqlBaseParser#changePointCommand}.
+   * @param ctx the parse tree
+   */
+  void enterChangePointCommand(EsqlBaseParser.ChangePointCommandContext ctx);
+  /**
+   * Exit a parse tree produced by {@link EsqlBaseParser#changePointCommand}.
+   * @param ctx the parse tree
+   */
+  void exitChangePointCommand(EsqlBaseParser.ChangePointCommandContext ctx);
   /**
    * Enter a parse tree produced by {@link EsqlBaseParser#lookupCommand}.
    * @param ctx the parse tree

+ 6 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java

@@ -587,6 +587,12 @@ public interface EsqlBaseParserVisitor<T> extends ParseTreeVisitor<T> {
    * @return the visitor result
    */
   T visitEnrichWithClause(EsqlBaseParser.EnrichWithClauseContext ctx);
+  /**
+   * Visit a parse tree produced by {@link EsqlBaseParser#changePointCommand}.
+   * @param ctx the parse tree
+   * @return the visitor result
+   */
+  T visitChangePointCommand(EsqlBaseParser.ChangePointCommandContext ctx);
   /**
    * Visit a parse tree produced by {@link EsqlBaseParser#lookupCommand}.
    * @param ctx the parse tree

+ 20 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java

@@ -31,6 +31,7 @@ import org.elasticsearch.xpack.esql.core.expression.FoldContext;
 import org.elasticsearch.xpack.esql.core.expression.Literal;
 import org.elasticsearch.xpack.esql.core.expression.MetadataAttribute;
 import org.elasticsearch.xpack.esql.core.expression.NamedExpression;
+import org.elasticsearch.xpack.esql.core.expression.ReferenceAttribute;
 import org.elasticsearch.xpack.esql.core.expression.UnresolvedAttribute;
 import org.elasticsearch.xpack.esql.core.expression.UnresolvedStar;
 import org.elasticsearch.xpack.esql.core.tree.Source;
@@ -42,6 +43,7 @@ import org.elasticsearch.xpack.esql.expression.function.UnresolvedFunction;
 import org.elasticsearch.xpack.esql.parser.EsqlBaseParser.MetadataOptionContext;
 import org.elasticsearch.xpack.esql.plan.IndexPattern;
 import org.elasticsearch.xpack.esql.plan.logical.Aggregate;
+import org.elasticsearch.xpack.esql.plan.logical.ChangePoint;
 import org.elasticsearch.xpack.esql.plan.logical.Dissect;
 import org.elasticsearch.xpack.esql.plan.logical.Drop;
 import org.elasticsearch.xpack.esql.plan.logical.Enrich;
@@ -460,6 +462,24 @@ public class LogicalPlanBuilder extends ExpressionBuilder {
         };
     }
 
+    @Override
+    public PlanFactory visitChangePointCommand(EsqlBaseParser.ChangePointCommandContext ctx) {
+        Source src = source(ctx);
+        Attribute value = visitQualifiedName(ctx.value);
+        Attribute key = ctx.key == null ? new UnresolvedAttribute(src, "@timestamp") : visitQualifiedName(ctx.key);
+        Attribute targetType = new ReferenceAttribute(
+            src,
+            ctx.targetType == null ? "type" : visitQualifiedName(ctx.targetType).name(),
+            DataType.KEYWORD
+        );
+        Attribute targetPvalue = new ReferenceAttribute(
+            src,
+            ctx.targetPvalue == null ? "pvalue" : visitQualifiedName(ctx.targetPvalue).name(),
+            DataType.DOUBLE
+        );
+        return child -> new ChangePoint(src, child, value, key, targetType, targetPvalue);
+    }
+
     private static Tuple<Mode, String> parsePolicyName(Token policyToken) {
         String stringValue = policyToken.getText();
         int index = stringValue.indexOf(":");

+ 2 - 2
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/PlanWritables.java

@@ -56,7 +56,7 @@ public class PlanWritables {
     public static List<NamedWriteableRegistry.Entry> getNamedWriteables() {
         List<NamedWriteableRegistry.Entry> entries = new ArrayList<>();
         entries.addAll(logical());
-        entries.addAll(phsyical());
+        entries.addAll(physical());
         return entries;
     }
 
@@ -83,7 +83,7 @@ public class PlanWritables {
         );
     }
 
-    public static List<NamedWriteableRegistry.Entry> phsyical() {
+    public static List<NamedWriteableRegistry.Entry> physical() {
         return List.of(
             AggregateExec.ENTRY,
             DissectExec.ENTRY,

+ 164 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/ChangePoint.java

@@ -0,0 +1,164 @@
+/*
+ * 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.
+ */
+package org.elasticsearch.xpack.esql.plan.logical;
+
+import org.elasticsearch.common.io.stream.StreamOutput;
+import org.elasticsearch.compute.operator.ChangePointOperator;
+import org.elasticsearch.license.XPackLicenseState;
+import org.elasticsearch.xpack.esql.LicenseAware;
+import org.elasticsearch.xpack.esql.capabilities.PostAnalysisVerificationAware;
+import org.elasticsearch.xpack.esql.common.Failures;
+import org.elasticsearch.xpack.esql.core.expression.Attribute;
+import org.elasticsearch.xpack.esql.core.expression.AttributeSet;
+import org.elasticsearch.xpack.esql.core.expression.Expressions;
+import org.elasticsearch.xpack.esql.core.expression.Literal;
+import org.elasticsearch.xpack.esql.core.tree.NodeInfo;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.core.type.DataType;
+import org.elasticsearch.xpack.esql.expression.NamedExpressions;
+import org.elasticsearch.xpack.esql.expression.Order;
+import org.elasticsearch.xpack.ml.MachineLearning;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+
+import static org.elasticsearch.xpack.esql.common.Failure.fail;
+
+/**
+ * Plan that detects change points in a list of values. See also:
+ * <ul>
+ * <li> {@link org.elasticsearch.compute.operator.ChangePointOperator}
+ * <li> {@link org.elasticsearch.xpack.ml.aggs.changepoint.ChangePointDetector}
+ * </ul>
+ *
+ * ChangePoint should always run on the coordinating node after the data is collected
+ * in sorted order by key. This is enforced by adding OrderBy in the surrogate plan.
+ * Furthermore, ChangePoint should be called with at most 1000 data points. That's
+ * enforced by the Limit in the surrogate plan.
+ */
+public class ChangePoint extends UnaryPlan implements SurrogateLogicalPlan, PostAnalysisVerificationAware, LicenseAware {
+
+    private final Attribute value;
+    private final Attribute key;
+    private final Attribute targetType;
+    private final Attribute targetPvalue;
+
+    private List<Attribute> output;
+
+    public ChangePoint(Source source, LogicalPlan child, Attribute value, Attribute key, Attribute targetType, Attribute targetPvalue) {
+        super(source, child);
+        this.value = value;
+        this.key = key;
+        this.targetType = targetType;
+        this.targetPvalue = targetPvalue;
+    }
+
+    @Override
+    public void writeTo(StreamOutput out) throws IOException {
+        throw new UnsupportedOperationException("not serialized");
+    }
+
+    @Override
+    public String getWriteableName() {
+        throw new UnsupportedOperationException("not serialized");
+    }
+
+    @Override
+    protected NodeInfo<ChangePoint> info() {
+        return NodeInfo.create(this, ChangePoint::new, child(), value, key, targetType, targetPvalue);
+    }
+
+    @Override
+    public UnaryPlan replaceChild(LogicalPlan newChild) {
+        return new ChangePoint(source(), newChild, value, key, targetType, targetPvalue);
+    }
+
+    @Override
+    public List<Attribute> output() {
+        if (output == null) {
+            output = NamedExpressions.mergeOutputAttributes(List.of(targetType, targetPvalue), child().output());
+        }
+        return output;
+    }
+
+    public Attribute value() {
+        return value;
+    }
+
+    public Attribute key() {
+        return key;
+    }
+
+    public Attribute targetType() {
+        return targetType;
+    }
+
+    public Attribute targetPvalue() {
+        return targetPvalue;
+    }
+
+    @Override
+    protected AttributeSet computeReferences() {
+        return Expressions.references(List.of(key, value));
+    }
+
+    @Override
+    public boolean expressionsResolved() {
+        return value.resolved() && key.resolved();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), value, key, targetType, targetPvalue);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        return super.equals(other)
+            && Objects.equals(value, ((ChangePoint) other).value)
+            && Objects.equals(key, ((ChangePoint) other).key)
+            && Objects.equals(targetType, ((ChangePoint) other).targetType)
+            && Objects.equals(targetPvalue, ((ChangePoint) other).targetPvalue);
+    }
+
+    private Order order() {
+        return new Order(source(), key, Order.OrderDirection.ASC, Order.NullsPosition.ANY);
+    }
+
+    @Override
+    public LogicalPlan surrogate() {
+        OrderBy orderBy = new OrderBy(source(), child(), List.of(order()));
+        // The first Limit of N+1 data points is necessary to generate a possible warning,
+        Limit limit = new Limit(
+            source(),
+            new Literal(Source.EMPTY, ChangePointOperator.INPUT_VALUE_COUNT_LIMIT + 1, DataType.INTEGER),
+            orderBy
+        );
+        ChangePoint changePoint = new ChangePoint(source(), limit, value, key, targetType, targetPvalue);
+        // The second Limit of N data points is to truncate the output.
+        return new Limit(source(), new Literal(Source.EMPTY, ChangePointOperator.INPUT_VALUE_COUNT_LIMIT, DataType.INTEGER), changePoint);
+    }
+
+    @Override
+    public void postAnalysisVerification(Failures failures) {
+        // Key must be sortable
+        Order order = order();
+        if (DataType.isSortable(order.dataType()) == false) {
+            failures.add(fail(this, "change point key [" + key.name() + "] must be sortable"));
+        }
+        // Value must be a number
+        if (value.dataType().isNumeric() == false) {
+            failures.add(fail(this, "change point value [" + value.name() + "] must be numeric"));
+        }
+    }
+
+    @Override
+    public boolean licenseCheck(XPackLicenseState state) {
+        return MachineLearning.CHANGE_POINT_AGG_FEATURE.check(state);
+    }
+}

+ 107 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/ChangePointExec.java

@@ -0,0 +1,107 @@
+/*
+ * 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.
+ */
+
+package org.elasticsearch.xpack.esql.plan.physical;
+
+import org.elasticsearch.common.io.stream.StreamOutput;
+import org.elasticsearch.xpack.esql.core.expression.Attribute;
+import org.elasticsearch.xpack.esql.core.expression.AttributeSet;
+import org.elasticsearch.xpack.esql.core.tree.NodeInfo;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.NamedExpressions;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+
+public class ChangePointExec extends UnaryExec {
+
+    private final Attribute value;
+    private final Attribute key;
+    private final Attribute targetType;
+    private final Attribute targetPvalue;
+
+    private List<Attribute> output;
+
+    public ChangePointExec(
+        Source source,
+        PhysicalPlan child,
+        Attribute value,
+        Attribute key,
+        Attribute targetType,
+        Attribute targetPvalue
+    ) {
+        super(source, child);
+        this.value = value;
+        this.key = key;
+        this.targetType = targetType;
+        this.targetPvalue = targetPvalue;
+    }
+
+    @Override
+    public void writeTo(StreamOutput out) throws IOException {
+        throw new UnsupportedOperationException("not serialized");
+    }
+
+    @Override
+    public String getWriteableName() {
+        throw new UnsupportedOperationException("not serialized");
+    }
+
+    @Override
+    protected NodeInfo<? extends ChangePointExec> info() {
+        return NodeInfo.create(this, ChangePointExec::new, child(), value, key, targetType, targetPvalue);
+    }
+
+    @Override
+    public ChangePointExec replaceChild(PhysicalPlan newChild) {
+        return new ChangePointExec(source(), newChild, value, key, targetType, targetPvalue);
+    }
+
+    @Override
+    protected AttributeSet computeReferences() {
+        return key.references().combine(value.references());
+    }
+
+    @Override
+    public List<Attribute> output() {
+        if (output == null) {
+            output = NamedExpressions.mergeOutputAttributes(List.of(targetType, targetPvalue), child().output());
+        }
+        return output;
+    }
+
+    public Attribute value() {
+        return value;
+    }
+
+    public Attribute key() {
+        return key;
+    }
+
+    public Attribute targetType() {
+        return targetType;
+    }
+
+    public Attribute targetPvalue() {
+        return targetPvalue;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), value, key, targetType, targetPvalue);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        return super.equals(other)
+            && Objects.equals(value, ((ChangePointExec) other).value)
+            && Objects.equals(key, ((ChangePointExec) other).key)
+            && Objects.equals(targetType, ((ChangePointExec) other).targetType)
+            && Objects.equals(targetPvalue, ((ChangePointExec) other).targetPvalue);
+    }
+}

+ 20 - 2
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlanner.java

@@ -17,12 +17,14 @@ import org.elasticsearch.compute.data.ElementType;
 import org.elasticsearch.compute.data.LocalCircuitBreaker;
 import org.elasticsearch.compute.data.Page;
 import org.elasticsearch.compute.lucene.LuceneOperator;
+import org.elasticsearch.compute.operator.ChangePointOperator;
 import org.elasticsearch.compute.operator.ColumnExtractOperator;
 import org.elasticsearch.compute.operator.ColumnLoadOperator;
 import org.elasticsearch.compute.operator.Driver;
 import org.elasticsearch.compute.operator.DriverContext;
 import org.elasticsearch.compute.operator.EvalOperator.EvalOperatorFactory;
 import org.elasticsearch.compute.operator.FilterOperator.FilterOperatorFactory;
+import org.elasticsearch.compute.operator.LimitOperator;
 import org.elasticsearch.compute.operator.LocalSourceOperator;
 import org.elasticsearch.compute.operator.LocalSourceOperator.LocalSourceFactory;
 import org.elasticsearch.compute.operator.MvExpandOperator;
@@ -73,6 +75,7 @@ import org.elasticsearch.xpack.esql.evaluator.EvalMapper;
 import org.elasticsearch.xpack.esql.evaluator.command.GrokEvaluatorExtracter;
 import org.elasticsearch.xpack.esql.expression.Order;
 import org.elasticsearch.xpack.esql.plan.physical.AggregateExec;
+import org.elasticsearch.xpack.esql.plan.physical.ChangePointExec;
 import org.elasticsearch.xpack.esql.plan.physical.DissectExec;
 import org.elasticsearch.xpack.esql.plan.physical.EnrichExec;
 import org.elasticsearch.xpack.esql.plan.physical.EsQueryExec;
@@ -113,7 +116,6 @@ import java.util.stream.Stream;
 
 import static java.util.Arrays.asList;
 import static java.util.stream.Collectors.joining;
-import static org.elasticsearch.compute.operator.LimitOperator.Factory;
 import static org.elasticsearch.compute.operator.ProjectOperator.ProjectOperatorFactory;
 import static org.elasticsearch.xpack.esql.type.EsqlDataTypeConverter.stringToInt;
 
@@ -224,6 +226,8 @@ public class LocalExecutionPlanner {
             return planLimit(limit, context);
         } else if (node instanceof MvExpandExec mvExpand) {
             return planMvExpand(mvExpand, context);
+        } else if (node instanceof ChangePointExec changePoint) {
+            return planChangePoint(changePoint, context);
         }
         // source nodes
         else if (node instanceof EsQueryExec esQuery) {
@@ -706,7 +710,7 @@ public class LocalExecutionPlanner {
 
     private PhysicalOperation planLimit(LimitExec limit, LocalExecutionPlannerContext context) {
         PhysicalOperation source = plan(limit.child(), context);
-        return source.with(new Factory((Integer) limit.limit().fold(context.foldCtx)), source.layout);
+        return source.with(new LimitOperator.Factory((Integer) limit.limit().fold(context.foldCtx)), source.layout);
     }
 
     private PhysicalOperation planMvExpand(MvExpandExec mvExpandExec, LocalExecutionPlannerContext context) {
@@ -720,6 +724,20 @@ public class LocalExecutionPlanner {
         );
     }
 
+    private PhysicalOperation planChangePoint(ChangePointExec changePoint, LocalExecutionPlannerContext context) {
+        PhysicalOperation source = plan(changePoint.child(), context);
+        Layout layout = source.layout.builder().append(changePoint.targetType()).append(changePoint.targetPvalue()).build();
+        return source.with(
+            new ChangePointOperator.Factory(
+                layout.get(changePoint.value().id()).channel(),
+                changePoint.sourceText(),
+                changePoint.sourceLocation().getLineNumber(),
+                changePoint.sourceLocation().getColumnNumber()
+            ),
+            layout
+        );
+    }
+
     /**
      * Immutable physical operation.
      */

+ 13 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/mapper/MapperUtils.java

@@ -13,6 +13,7 @@ import org.elasticsearch.xpack.esql.EsqlIllegalArgumentException;
 import org.elasticsearch.xpack.esql.core.expression.Attribute;
 import org.elasticsearch.xpack.esql.core.expression.FoldContext;
 import org.elasticsearch.xpack.esql.plan.logical.Aggregate;
+import org.elasticsearch.xpack.esql.plan.logical.ChangePoint;
 import org.elasticsearch.xpack.esql.plan.logical.Dissect;
 import org.elasticsearch.xpack.esql.plan.logical.Enrich;
 import org.elasticsearch.xpack.esql.plan.logical.Eval;
@@ -26,6 +27,7 @@ import org.elasticsearch.xpack.esql.plan.logical.UnaryPlan;
 import org.elasticsearch.xpack.esql.plan.logical.local.LocalRelation;
 import org.elasticsearch.xpack.esql.plan.logical.show.ShowInfo;
 import org.elasticsearch.xpack.esql.plan.physical.AggregateExec;
+import org.elasticsearch.xpack.esql.plan.physical.ChangePointExec;
 import org.elasticsearch.xpack.esql.plan.physical.DissectExec;
 import org.elasticsearch.xpack.esql.plan.physical.EnrichExec;
 import org.elasticsearch.xpack.esql.plan.physical.EvalExec;
@@ -98,6 +100,17 @@ class MapperUtils {
             return new MvExpandExec(mvExpand.source(), child, mvExpand.target(), mvExpand.expanded());
         }
 
+        if (p instanceof ChangePoint changePoint) {
+            return new ChangePointExec(
+                changePoint.source(),
+                child,
+                changePoint.value(),
+                changePoint.key(),
+                changePoint.targetType(),
+                changePoint.targetPvalue()
+            );
+        }
+
         return unsupported(p);
     }
 

+ 2 - 4
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java

@@ -75,6 +75,7 @@ import org.elasticsearch.xpack.esql.optimizer.TestLocalPhysicalPlanOptimizer;
 import org.elasticsearch.xpack.esql.parser.EsqlParser;
 import org.elasticsearch.xpack.esql.plan.logical.Enrich;
 import org.elasticsearch.xpack.esql.plan.logical.LogicalPlan;
+import org.elasticsearch.xpack.esql.plan.physical.ChangePointExec;
 import org.elasticsearch.xpack.esql.plan.physical.HashJoinExec;
 import org.elasticsearch.xpack.esql.plan.physical.LocalSourceExec;
 import org.elasticsearch.xpack.esql.plan.physical.OutputExec;
@@ -575,12 +576,9 @@ public class CsvTests extends ESTestCase {
 
     // Asserts that the serialization and deserialization of the plan creates an equivalent plan.
     private void opportunisticallyAssertPlanSerialization(PhysicalPlan plan) {
-
-        // skip plans with localSourceExec
-        if (plan.anyMatch(p -> p instanceof LocalSourceExec || p instanceof HashJoinExec)) {
+        if (plan.anyMatch(p -> p instanceof LocalSourceExec || p instanceof HashJoinExec || p instanceof ChangePointExec)) {
             return;
         }
-
         SerializationTestUtils.assertSerialization(plan, configuration);
     }
 

+ 58 - 7
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java

@@ -8,6 +8,7 @@
 package org.elasticsearch.xpack.esql.analysis;
 
 import org.elasticsearch.Build;
+import org.elasticsearch.common.Strings;
 import org.elasticsearch.test.ESTestCase;
 import org.elasticsearch.xpack.esql.VerificationException;
 import org.elasticsearch.xpack.esql.action.EsqlCapabilities;
@@ -37,15 +38,23 @@ import static org.elasticsearch.xpack.esql.EsqlTestUtils.paramAsConstant;
 import static org.elasticsearch.xpack.esql.EsqlTestUtils.withDefaultLimitWarning;
 import static org.elasticsearch.xpack.esql.analysis.AnalyzerTestUtils.loadMapping;
 import static org.elasticsearch.xpack.esql.core.type.DataType.BOOLEAN;
+import static org.elasticsearch.xpack.esql.core.type.DataType.CARTESIAN_POINT;
+import static org.elasticsearch.xpack.esql.core.type.DataType.CARTESIAN_SHAPE;
 import static org.elasticsearch.xpack.esql.core.type.DataType.COUNTER_DOUBLE;
 import static org.elasticsearch.xpack.esql.core.type.DataType.COUNTER_INTEGER;
 import static org.elasticsearch.xpack.esql.core.type.DataType.COUNTER_LONG;
+import static org.elasticsearch.xpack.esql.core.type.DataType.DATETIME;
+import static org.elasticsearch.xpack.esql.core.type.DataType.DATE_NANOS;
 import static org.elasticsearch.xpack.esql.core.type.DataType.DOUBLE;
 import static org.elasticsearch.xpack.esql.core.type.DataType.FLOAT;
+import static org.elasticsearch.xpack.esql.core.type.DataType.GEO_POINT;
+import static org.elasticsearch.xpack.esql.core.type.DataType.GEO_SHAPE;
 import static org.elasticsearch.xpack.esql.core.type.DataType.INTEGER;
+import static org.elasticsearch.xpack.esql.core.type.DataType.IP;
 import static org.elasticsearch.xpack.esql.core.type.DataType.KEYWORD;
 import static org.elasticsearch.xpack.esql.core.type.DataType.LONG;
 import static org.elasticsearch.xpack.esql.core.type.DataType.UNSIGNED_LONG;
+import static org.elasticsearch.xpack.esql.core.type.DataType.VERSION;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.instanceOf;
@@ -2034,6 +2043,54 @@ public class VerifierTests extends ESTestCase {
         );
     }
 
+    public void testChangePoint() {
+        var airports = AnalyzerTestUtils.analyzer(loadMapping("mapping-airports.json", "airports"));
+        assertEquals("1:30: Unknown column [blahblah]", error("FROM airports | CHANGE_POINT blahblah ON scalerank", airports));
+        assertEquals("1:43: Unknown column [blahblah]", error("FROM airports | CHANGE_POINT scalerank ON blahblah", airports));
+        // TODO: nicer error message for missing default column "@timestamp"
+        assertEquals("1:17: Unknown column [@timestamp]", error("FROM airports | CHANGE_POINT scalerank", airports));
+    }
+
+    public void testChangePoint_keySortable() {
+        List<DataType> sortableTypes = List.of(BOOLEAN, DOUBLE, DATE_NANOS, DATETIME, INTEGER, IP, KEYWORD, LONG, UNSIGNED_LONG, VERSION);
+        List<DataType> unsortableTypes = List.of(CARTESIAN_POINT, CARTESIAN_SHAPE, GEO_POINT, GEO_SHAPE);
+        for (DataType type : sortableTypes) {
+            query(Strings.format("ROW key=NULL::%s, value=0\n | CHANGE_POINT value ON key", type));
+        }
+        for (DataType type : unsortableTypes) {
+            assertEquals(
+                "2:4: change point key [key] must be sortable",
+                error(Strings.format("ROW key=NULL::%s, value=0\n | CHANGE_POINT value ON key", type))
+            );
+        }
+    }
+
+    public void testChangePoint_valueNumeric() {
+        List<DataType> numericTypes = List.of(DOUBLE, INTEGER, LONG, UNSIGNED_LONG);
+        List<DataType> nonNumericTypes = List.of(
+            BOOLEAN,
+            CARTESIAN_POINT,
+            CARTESIAN_SHAPE,
+            DATE_NANOS,
+            DATETIME,
+            GEO_POINT,
+            GEO_SHAPE,
+            IP,
+            KEYWORD,
+            VERSION
+        );
+        for (DataType type : numericTypes) {
+            query(Strings.format("ROW key=0, value=NULL::%s\n | CHANGE_POINT value ON key", type));
+        }
+        for (DataType type : nonNumericTypes) {
+            assertEquals(
+                "2:4: change point value [value] must be numeric",
+                error(Strings.format("ROW key=0, value=NULL::%s\n | CHANGE_POINT value ON key", type))
+            );
+        }
+        assertEquals("2:4: change point value [value] must be numeric", error("ROW key=0, value=NULL\n | CHANGE_POINT value ON key"));
+    }
+
     public void testSortByAggregate() {
         assertEquals("1:18: aggregate function [count(*)] not allowed outside STATS command", error("ROW a = 1 | SORT count(*)"));
         assertEquals(
@@ -2110,13 +2167,7 @@ public class VerifierTests extends ESTestCase {
         query("FROM test | WHERE match(first_name, \"Jean\", {\"auto_generate_synonyms_phrase_query\": true})");
 
         // Check all data types for available options
-        DataType[] optionTypes = new DataType[] {
-            DataType.INTEGER,
-            DataType.LONG,
-            DataType.FLOAT,
-            DataType.DOUBLE,
-            DataType.KEYWORD,
-            DataType.BOOLEAN };
+        DataType[] optionTypes = new DataType[] { INTEGER, LONG, FLOAT, DOUBLE, KEYWORD, BOOLEAN };
         for (Map.Entry<String, DataType> allowedOptions : Match.ALLOWED_OPTIONS.entrySet()) {
             String optionName = allowedOptions.getKey();
             DataType optionType = allowedOptions.getValue();

+ 3 - 0
x-pack/plugin/ml/src/main/java/module-info.java

@@ -37,8 +37,11 @@ module org.elasticsearch.ml {
 
     exports org.elasticsearch.xpack.ml;
     exports org.elasticsearch.xpack.ml.action;
+    exports org.elasticsearch.xpack.ml.aggs;
     exports org.elasticsearch.xpack.ml.aggs.categorization;
+    exports org.elasticsearch.xpack.ml.aggs.changepoint;
     exports org.elasticsearch.xpack.ml.autoscaling;
     exports org.elasticsearch.xpack.ml.job.categorization;
     exports org.elasticsearch.xpack.ml.notifications;
+
 }

+ 1 - 1
x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/MachineLearning.java

@@ -541,7 +541,7 @@ public class MachineLearning extends Plugin
         "inference-agg",
         License.OperationMode.PLATINUM
     );
-    private static final LicensedFeature.Momentary CHANGE_POINT_AGG_FEATURE = LicensedFeature.momentary(
+    public static final LicensedFeature.Momentary CHANGE_POINT_AGG_FEATURE = LicensedFeature.momentary(
         MachineLearningField.ML_FEATURE_FAMILY,
         "change-point-agg",
         License.OperationMode.PLATINUM

+ 4 - 0
x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/aggs/changepoint/ChangeType.java

@@ -121,6 +121,10 @@ public interface ChangeType extends NamedWriteable, NamedXContentObject {
             return NAME;
         }
 
+        public String getReason() {
+            return reason;
+        }
+
         @Override
         public boolean equals(Object o) {
             if (this == o) return true;

部分文件因为文件数量过多而无法显示