diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fb9f08fd3a..b72e77c7fd 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -46,8 +46,15 @@ FrontendTests:
RuntimeTests:
stage: tests3
+ artifacts:
+ name: "Runtime Tests log"
+ paths:
+ - target/runtime_test.log
+ when:
+ always
+ expire_in: 2 days
script:
- - mvn -Dtest=RuntimeTests test
+ - mvn -Dtest=RuntimeTests test --log-file target/runtime_test.log
RuntimeTestsNoParallelism:
stage: tests3
diff --git a/gen/XQueryParserScripting.interp b/gen/XQueryParserScripting.interp
index a8a5b7efd5..b8693908f5 100644
--- a/gen/XQueryParserScripting.interp
+++ b/gen/XQueryParserScripting.interp
@@ -556,7 +556,7 @@ whileStatement
pathExpr
relativePathExpr
stepExpr
-axisStep
+stepExpr
forwardStep
forwardAxis
abbrevForwardStep
diff --git a/src/main/java/org/rumbledb/api/Item.java b/src/main/java/org/rumbledb/api/Item.java
index ae0feeb357..31505a65a6 100644
--- a/src/main/java/org/rumbledb/api/Item.java
+++ b/src/main/java/org/rumbledb/api/Item.java
@@ -1,11 +1,6 @@
package org.rumbledb.api;
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.List;
-import java.util.Map;
-
+import com.esotericsoftware.kryo.KryoSerializable;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.ml.Estimator;
import org.apache.spark.ml.Transformer;
@@ -20,8 +15,14 @@
import org.rumbledb.serialization.Serializer;
import org.rumbledb.types.FunctionSignature;
import org.rumbledb.types.ItemType;
+import org.w3c.dom.Node;
-import com.esotericsoftware.kryo.KryoSerializable;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
/**
@@ -297,6 +298,46 @@ default boolean isBase64Binary() {
return false;
}
+ /**
+ * Tests whether the item is an XML Element node.
+ *
+ * @return true if it is an XML Element node, false otherwise.
+ */
+ default boolean isElementNode() {
+ return false;
+ }
+
+ /**
+ * Tests whether the item is an XML Attribute node.
+ *
+ * @return true if it is an XML Attribute node, false otherwise.
+ */
+ default boolean isAttributeNode() {
+ return false;
+ }
+
+ /**
+ * Tests whether the item is an XML Text node.
+ *
+ * @return true if it is an XML Text node, false otherwise.
+ */
+ default boolean getContent() {
+ return false;
+ }
+
+ /**
+ * Tests whether the item is an XML Document node.
+ *
+ * @return true if it is an XML Document node, false otherwise.
+ */
+ default boolean isDocumentNode() {
+ return false;
+ }
+
+ default boolean isTextNode() {
+ return false;
+ }
+
/**
* Returns the members of the item if it is an array.
*
@@ -747,4 +788,96 @@ default boolean isTransformer() {
default Transformer getTransformer() {
throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
}
+
+ /**
+ * Returns the string value of the text item, if it is a text item.
+ *
+ * @return the string value.
+ */
+ default String getTextValue() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ /**
+ * Method sets the parent item for all descendents of the current item.
+ */
+ default void addParentToDescendants() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default List- attributes() {
+ return new ArrayList<>();
+ }
+
+ default String baseUri() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default List
- children() {
+ return new ArrayList<>();
+ }
+
+ default String documentUri() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default boolean isId() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default boolean isIdRefs() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default List
- namespaceNodes() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default boolean nilled() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default String nodeKind() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default String nodeName() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default Item parent() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default String stringValue() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default String typeName() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default Item typedValue() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default String unparsedEntityPublicId() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default String unparsedEntityServerId() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default void setParent(Item parent) {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default int compareXmlNode(Item otherNode) {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ default Node getXmlNode() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
}
diff --git a/src/main/java/org/rumbledb/compiler/CloneVisitor.java b/src/main/java/org/rumbledb/compiler/CloneVisitor.java
index 546af9628d..e77ff5a57a 100644
--- a/src/main/java/org/rumbledb/compiler/CloneVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/CloneVisitor.java
@@ -1045,4 +1045,43 @@ public Node visitVariableDeclStatement(VariableDeclStatement statement, Node arg
return result;
}
// end region scripting
+
+ // begin region xml
+
+ // @Override
+ // public Node visitPathExpr(PathExpr expression, Node argument) {
+ // List intermediaryPaths = new ArrayList<>();
+ // for (IntermediaryPath path : expression.getRelativePathExpressions()) {
+ // Dash dash = null;
+ // if (path.getPreStepExprDash() != null) {
+ // dash = new Dash(
+ // path.getPreStepExprDash().requiresRoot(),
+ // (StepExpr) this.visitAxisStep(path.getPreStepExprDash().getAxisStep(), argument)
+ // );
+ // }
+ // StepExpr stepExpr = (StepExpr) this.visitStepExpr(path.getStepExpr(), argument);
+ // intermediaryPaths.add(new IntermediaryPath(dash, stepExpr));
+ // }
+ // PathExpr result = new PathExpr(intermediaryPaths, expression.getMetadata());
+ // result.setStaticSequenceType(expression.getStaticSequenceType());
+ // result.setStaticContext(expression.getStaticContext());
+ // return result;
+ // }
+
+ // @Override
+ // public Node visitStepExpr(StepExpr expression, Node argument) {
+ // StepExpr result;
+ // if (expression.getPostFixExpr() != null) {
+ // Expression postFixExpr = (Expression) this.visit(expression.getPostFixExpr(), argument);
+ // result = new StepExpr(postFixExpr, expression.getMetadata());
+ // } else {
+ // StepExpr stepExpr = (StepExpr) this.visitAxisStep(expression.getAxisStep(), argument);
+ // result = new StepExpr(stepExpr, expression.getMetadata());
+ // }
+ // result.setStaticSequenceType(expression.getStaticSequenceType());
+ // result.setStaticContext(expression.getStaticContext());
+ // return result;
+ // }
+
+ // end region xml
}
diff --git a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java
index 9a8cb0d434..07a4b7a1c7 100644
--- a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java
@@ -103,6 +103,8 @@
import org.rumbledb.expressions.update.RenameExpression;
import org.rumbledb.expressions.update.ReplaceExpression;
import org.rumbledb.expressions.update.TransformExpression;
+import org.rumbledb.expressions.xml.PathExpr;
+import org.rumbledb.expressions.xml.StepExpr;
import org.rumbledb.runtime.functions.input.FileSystemUtil;
import org.rumbledb.types.BuiltinTypesCatalogue;
import org.rumbledb.types.FieldDescriptor;
@@ -2598,4 +2600,22 @@ public StaticContext visitBlockExpr(BlockExpression expression, StaticContext ar
}
// endregion
+
+ // region xml
+
+ @Override
+ public StaticContext visitPathExpr(PathExpr pathExpr, StaticContext argument) {
+ visitDescendants(pathExpr, argument);
+ pathExpr.setStaticSequenceType(SequenceType.ITEM_STAR);
+ return argument;
+ }
+
+ // TODO: Currently, step expressions are marked as string, but this type may differ. Update to relevant type.
+ @Override
+ public StaticContext visitStepExpr(StepExpr stepExpr, StaticContext argument) {
+ stepExpr.setStaticSequenceType(SequenceType.ITEM_STAR);
+ return argument;
+ }
+
+ // end xml
}
diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java
index 9d5354e400..9af610480a 100644
--- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java
@@ -32,6 +32,7 @@
import org.rumbledb.exceptions.UnsupportedFeatureException;
import org.rumbledb.expressions.AbstractNodeVisitor;
import org.rumbledb.expressions.CommaExpression;
+import org.rumbledb.expressions.ExecutionMode;
import org.rumbledb.expressions.Expression;
import org.rumbledb.expressions.Node;
import org.rumbledb.expressions.arithmetic.AdditiveExpression;
@@ -114,6 +115,9 @@
import org.rumbledb.expressions.update.RenameExpression;
import org.rumbledb.expressions.update.ReplaceExpression;
import org.rumbledb.expressions.update.TransformExpression;
+import org.rumbledb.expressions.xml.PathExpr;
+import org.rumbledb.expressions.xml.StepExpr;
+import org.rumbledb.expressions.xml.node_test.NodeTest;
import org.rumbledb.items.ItemFactory;
import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator;
import org.rumbledb.runtime.CommaExpressionIterator;
@@ -190,6 +194,11 @@
import org.rumbledb.runtime.update.expression.RenameExpressionIterator;
import org.rumbledb.runtime.update.expression.ReplaceExpressionIterator;
import org.rumbledb.runtime.update.expression.TransformExpressionIterator;
+import org.rumbledb.runtime.xml.AtomizationIterator;
+import org.rumbledb.runtime.xml.PathExprIterator;
+import org.rumbledb.runtime.xml.StepExprIterator;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor;
import org.rumbledb.types.BuiltinTypesCatalogue;
import org.rumbledb.types.SequenceType;
@@ -944,6 +953,13 @@ public RuntimeIterator visitRangeExpr(RangeExpression expression, RuntimeIterato
public RuntimeIterator visitComparisonExpr(ComparisonExpression expression, RuntimeIterator argument) {
RuntimeIterator left = this.visit(expression.getChildren().get(0), argument);
RuntimeIterator right = this.visit(expression.getChildren().get(1), argument);
+ if (left instanceof PathExprIterator) {
+ // We potentially need to atomize
+ left = new AtomizationIterator(
+ left,
+ expression.getStaticContextForRuntime(this.config, this.visitorConfig)
+ );
+ }
RuntimeIterator runtimeIterator = new ComparisonIterator(
left,
right,
@@ -1414,4 +1430,56 @@ public RuntimeIterator visitFlowrStatement(FlowrStatement statement, RuntimeIter
runtimeIterator.setStaticContext(statement.getStaticContext());
return runtimeIterator;
}
+
+ @Override
+ public RuntimeIterator visitPathExpr(PathExpr pathExpr, RuntimeIterator argument) {
+ List stepExprIterators = new ArrayList<>();
+ pathExpr.getRelativePathExpressions()
+ .forEach(relativePathExpr -> stepExprIterators.add(this.visit(relativePathExpr, argument)));
+ RuntimeIterator getRootIterator = null;
+ if (pathExpr.needsRoot()) {
+ getRootIterator = this.visitFunctionCall(pathExpr.getFetchRootFunction(), argument);
+ }
+ RuntimeIterator runtimeIterator = new PathExprIterator(
+ stepExprIterators,
+ getRootIterator,
+ new RuntimeStaticContext(
+ this.config,
+ pathExpr.getStaticSequenceType(),
+ pathExpr.getHighestExecutionMode(this.visitorConfig),
+ pathExpr.getMetadata()
+ )
+ );
+ runtimeIterator.setStaticContext(pathExpr.getStaticContext());
+ return runtimeIterator;
+ }
+
+ @Override
+ public RuntimeIterator visitStepExpr(StepExpr stepExpr, RuntimeIterator argument) {
+ AxisIterator axisIterator = this.visitAxisStep(stepExpr, stepExpr.getMetadata());
+ NodeTest nodeTest = stepExpr.getNodeTest();
+ return new StepExprIterator(
+ axisIterator,
+ nodeTest,
+ new RuntimeStaticContext(
+ this.config,
+ SequenceType.ITEM,
+ stepExpr.getHighestExecutionMode(this.visitorConfig),
+ stepExpr.getMetadata()
+ )
+ );
+ }
+
+ private AxisIterator visitAxisStep(StepExpr stepExpr, ExceptionMetadata metadata) {
+ return stepExpr.accept(
+ new AxisIteratorVisitor(),
+ new RuntimeStaticContext(
+ this.config,
+ SequenceType.STRING,
+ ExecutionMode.LOCAL,
+ metadata
+ )
+ );
+ }
+
}
diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java
index f758f29134..641c309189 100644
--- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java
@@ -138,6 +138,20 @@
import org.rumbledb.expressions.update.RenameExpression;
import org.rumbledb.expressions.update.ReplaceExpression;
import org.rumbledb.expressions.update.TransformExpression;
+import org.rumbledb.expressions.xml.PathExpr;
+import org.rumbledb.expressions.xml.StepExpr;
+import org.rumbledb.expressions.xml.axis.EmptyStepExpr;
+import org.rumbledb.expressions.xml.axis.ForwardAxis;
+import org.rumbledb.expressions.xml.axis.ForwardStepExpr;
+import org.rumbledb.expressions.xml.axis.ReverseAxis;
+import org.rumbledb.expressions.xml.axis.ReverseStepExpr;
+import org.rumbledb.expressions.xml.node_test.AnyKindTest;
+import org.rumbledb.expressions.xml.node_test.AttributeTest;
+import org.rumbledb.expressions.xml.node_test.DocumentTest;
+import org.rumbledb.expressions.xml.node_test.ElementTest;
+import org.rumbledb.expressions.xml.node_test.NameTest;
+import org.rumbledb.expressions.xml.node_test.NodeTest;
+import org.rumbledb.expressions.xml.node_test.TextTest;
import org.rumbledb.items.parsing.ItemParser;
import org.rumbledb.parser.JsoniqParser;
import org.rumbledb.parser.JsoniqParser.DefaultCollationDeclContext;
@@ -628,6 +642,9 @@ public Node visitExprSimple(JsoniqParser.ExprSimpleContext ctx) {
if (content instanceof JsoniqParser.TransformExprContext) {
return this.visitTransformExpr((JsoniqParser.TransformExprContext) content);
}
+ if (content instanceof JsoniqParser.PathExprContext) {
+ return this.visitPathExpr((JsoniqParser.PathExprContext) content);
+ }
throw new OurBadException("Unrecognized ExprSimple.");
}
@@ -1036,13 +1053,13 @@ public Node visitMultiplicativeExpr(JsoniqParser.MultiplicativeExprContext ctx)
@Override
public Node visitSimpleMapExpr(JsoniqParser.SimpleMapExprContext ctx) {
- Expression result = (Expression) this.visitPostFixExpr(ctx.main_expr);
+ Expression result = (Expression) this.visitPathExpr(ctx.main_expr);
if (ctx.map_expr == null || ctx.map_expr.isEmpty()) {
return result;
}
for (int i = 0; i < ctx.map_expr.size(); ++i) {
- JsoniqParser.PostFixExprContext child = ctx.map_expr.get(i);
- Expression rightExpression = (Expression) this.visitPostFixExpr(child);
+ JsoniqParser.PathExprContext child = ctx.map_expr.get(i);
+ Expression rightExpression = (Expression) this.visitPathExpr(child);
result = new SimpleMapExpression(
result,
rightExpression,
@@ -2274,6 +2291,247 @@ public Node visitVarDeclStatement(JsoniqParser.VarDeclStatementContext ctx) {
// end declaration
+ // start xml
+
+ @Override
+ public Node visitPathExpr(JsoniqParser.PathExprContext ctx) {
+ if (ctx.singleslash != null) {
+ return visitSingleSlash(ctx.singleslash);
+ } else if (ctx.doubleslash != null) {
+ return visitDoubleSlash(ctx.doubleslash);
+ } else if (ctx.relative != null) {
+ return visitRelativeWithoutSlash(ctx.relative);
+ }
+ return visitSingleSlashNoStepExpr(ctx);
+ }
+
+ private Node visitSingleSlashNoStepExpr(JsoniqParser.PathExprContext ctx) {
+ // Case: No StepExpr, only dash
+ StepExpr stepExpr = new EmptyStepExpr(createMetadataFromContext(ctx));
+ List intermediaryPaths = Collections.singletonList(stepExpr);
+ FunctionCallExpression functionCallExpression = new FunctionCallExpression(
+ Name.createVariableInDefaultXQueryTypeNamespace("root"),
+ Collections.emptyList(),
+ createMetadataFromContext(ctx)
+ );
+ return new PathExpr(functionCallExpression, intermediaryPaths, createMetadataFromContext(ctx));
+ }
+
+ private Node visitRelativeWithoutSlash(JsoniqParser.RelativePathExprContext relativeContext) {
+ if (relativeContext.stepExpr().size() == 1 && relativeContext.stepExpr(0).postFixExpr() != null) {
+ // We only have a postfix expression, not a path expression
+ return this.visitPostFixExpr(relativeContext.stepExpr(0).postFixExpr());
+ }
+ List intermediaryPaths = getIntermediaryPaths(relativeContext);
+ return new PathExpr(null, intermediaryPaths, createMetadataFromContext(relativeContext));
+ }
+
+ private Node visitDoubleSlash(JsoniqParser.RelativePathExprContext doubleSlashContext) {
+ StepExpr stepExpr = new ForwardStepExpr(
+ ForwardAxis.DESCENDANT_OR_SELF,
+ new AnyKindTest(),
+ createMetadataFromContext(doubleSlashContext)
+ );
+ List intermediaryPaths = getIntermediaryPaths(stepExpr, doubleSlashContext);
+ FunctionCallExpression functionCallExpression = new FunctionCallExpression(
+ Name.createVariableInDefaultXQueryTypeNamespace("root"),
+ Collections.emptyList(),
+ createMetadataFromContext(doubleSlashContext)
+ );
+ return new PathExpr(functionCallExpression, intermediaryPaths, createMetadataFromContext(doubleSlashContext));
+ }
+
+ private Node visitSingleSlash(JsoniqParser.RelativePathExprContext singleSlashContext) {
+ List intermediaryPaths = getIntermediaryPaths(singleSlashContext);
+ FunctionCallExpression functionCallExpression = new FunctionCallExpression(
+ Name.createVariableInDefaultXQueryTypeNamespace("root"),
+ Collections.emptyList(),
+ createMetadataFromContext(singleSlashContext)
+ );
+ return new PathExpr(functionCallExpression, intermediaryPaths, createMetadataFromContext(singleSlashContext));
+ }
+
+
+ // The path may start with a '/' or '//' which should be already converted to a StepExpr.
+ private List getIntermediaryPaths(
+ StepExpr stepExpr,
+ JsoniqParser.RelativePathExprContext relativePathExprContext
+ ) {
+ List intermediaryPaths = new ArrayList<>();
+ Expression currentStepExpr;
+ intermediaryPaths.add(stepExpr);
+ for (int i = 0; i < relativePathExprContext.stepExpr().size(); ++i) {
+ currentStepExpr = (Expression) this.visitStepExpr(relativePathExprContext.stepExpr(i));
+ if (i > 0 && relativePathExprContext.sep.get(i - 1).getText().equals("//")) {
+ // Unroll '//' to forward axis
+ StepExpr intermediaryStepExpr = new ForwardStepExpr(
+ ForwardAxis.DESCENDANT_OR_SELF,
+ new AnyKindTest(),
+ createMetadataFromContext(relativePathExprContext)
+ );
+ intermediaryPaths.add(intermediaryStepExpr);
+ }
+ intermediaryPaths.add(currentStepExpr);
+ }
+ return intermediaryPaths;
+ }
+
+ private List getIntermediaryPaths(
+ JsoniqParser.RelativePathExprContext relativePathExprContext
+ ) {
+ List intermediaryPaths = new ArrayList<>();
+ Expression currentStepExpr;
+ for (int i = 0; i < relativePathExprContext.stepExpr().size(); ++i) {
+ currentStepExpr = (Expression) this.visitStepExpr(relativePathExprContext.stepExpr(i));
+ if (i > 0 && relativePathExprContext.sep.get(i - 1).getText().equals("//")) {
+ // Unroll '//' to forward axis
+ StepExpr intermediaryStepExpr = new ForwardStepExpr(
+ ForwardAxis.DESCENDANT_OR_SELF,
+ new AnyKindTest(),
+ createMetadataFromContext(relativePathExprContext)
+ );
+ intermediaryPaths.add(intermediaryStepExpr);
+ }
+ intermediaryPaths.add(currentStepExpr);
+ }
+ return intermediaryPaths;
+ }
+
+ @Override
+ public Node visitStepExpr(JsoniqParser.StepExprContext ctx) {
+ if (ctx.postFixExpr() == null) {
+ Expression stepExpr = getStep(ctx.axisStep());
+ for (JsoniqParser.PredicateContext predicateContext : ctx.axisStep().predicateList().predicate()) {
+ Expression predicate = (Expression) this.visitPredicate(predicateContext);
+ stepExpr = new FilterExpression(
+ stepExpr,
+ predicate,
+ createMetadataFromContext(ctx)
+ );
+ }
+ return stepExpr;
+ }
+ return this.visitPostFixExpr(ctx.postFixExpr());
+ }
+
+ private StepExpr getStep(JsoniqParser.AxisStepContext ctx) {
+ if (ctx.forwardStep() == null) {
+ return getReverseStep(ctx.reverseStep());
+ }
+ return getForwardStep(ctx.forwardStep());
+ }
+
+ private StepExpr getForwardStep(JsoniqParser.ForwardStepContext ctx) {
+ ForwardAxis forwardAxis;
+ NodeTest nodeTest;
+ if (ctx.nodeTest() == null) {
+ nodeTest = getNodeTest(ctx.abbrevForwardStep().nodeTest());
+ if (ctx.abbrevForwardStep().Kat_symbol() != null) {
+ // @ equivalent with 'attribute::'
+ forwardAxis = ForwardAxis.ATTRIBUTE;
+ } else if (nodeTest instanceof AttributeTest) {
+ forwardAxis = ForwardAxis.ATTRIBUTE;
+ } else {
+ forwardAxis = ForwardAxis.CHILD;
+ }
+ return new ForwardStepExpr(forwardAxis, nodeTest, createMetadataFromContext(ctx));
+ }
+ forwardAxis = ForwardAxis.fromString(ctx.forwardAxis().getText());
+ nodeTest = getNodeTest(ctx.nodeTest());
+ return new ForwardStepExpr(forwardAxis, nodeTest, createMetadataFromContext(ctx));
+ }
+
+ private StepExpr getReverseStep(JsoniqParser.ReverseStepContext ctx) {
+ if (ctx.nodeTest() == null) {
+ // .. equivalent with 'parent::node()'
+ ReverseAxis reverseAxis = ReverseAxis.PARENT;
+ NodeTest nodeTest = new AnyKindTest();
+ return new ReverseStepExpr(reverseAxis, nodeTest, createMetadataFromContext(ctx));
+ }
+ ReverseAxis reverseAxis = ReverseAxis.fromString(ctx.reverseAxis().getText());
+ NodeTest nodeTest = getNodeTest(ctx.nodeTest());
+ return new ReverseStepExpr(reverseAxis, nodeTest, createMetadataFromContext(ctx));
+ }
+
+ private NodeTest getNodeTest(JsoniqParser.NodeTestContext nodeTestContext) {
+ if (nodeTestContext.nameTest() == null) {
+ // kind test
+ return getKindTest(nodeTestContext.kindTest().children.get(0));
+ }
+ if (nodeTestContext.nameTest().wildcard() == null) {
+ Name name = parseName(nodeTestContext.nameTest().qname(), false, false);
+ return new NameTest(name);
+ } else {
+ String wildcard = nodeTestContext.nameTest().wildcard().getText();
+ return new NameTest(wildcard);
+ }
+ }
+
+ private NodeTest getKindTest(ParseTree kindTest) {
+ if (kindTest instanceof JsoniqParser.DocumentTestContext) {
+ JsoniqParser.DocumentTestContext docContext = (JsoniqParser.DocumentTestContext) kindTest;
+ if (docContext.schemaElementTest() != null) {
+ throw new UnsupportedFeatureException(
+ "Kind tests of type document, element, attribute, text and any are supported at the moment",
+ createMetadataFromContext((ParserRuleContext) kindTest)
+ );
+ }
+ if (docContext.elementTest() == null) {
+ return new DocumentTest(null);
+ }
+ return new DocumentTest(getKindTest(docContext.elementTest()));
+ } else if (kindTest instanceof JsoniqParser.ElementTestContext) {
+ JsoniqParser.ElementTestContext elementContext = (JsoniqParser.ElementTestContext) kindTest;
+ Name elementName;
+ if (elementContext.elementNameOrWildcard() != null) {
+ boolean hasWildcard = elementContext.elementNameOrWildcard().elementName() == null;
+ if (!hasWildcard) {
+ elementName = parseName(elementContext.elementNameOrWildcard().elementName().qname(), false, false);
+ if (elementContext.typeName() == null) {
+ return new ElementTest(elementName, null);
+ }
+ Name typeName = parseName(elementContext.typeName().qname(), false, false);
+ return new ElementTest(elementName, typeName);
+ }
+ return new ElementTest(true);
+ }
+ return new ElementTest();
+ } else if (kindTest instanceof JsoniqParser.AttributeTestContext) {
+ JsoniqParser.AttributeTestContext attributeTestContext =
+ (JsoniqParser.AttributeTestContext) kindTest;
+ Name elementName;
+ if (attributeTestContext.attributeNameOrWildcard() != null) {
+ boolean hasWildcard = attributeTestContext.attributeNameOrWildcard().attributeName() == null;
+ if (!hasWildcard) {
+ elementName = parseName(
+ attributeTestContext.attributeNameOrWildcard().attributeName().qname(),
+ false,
+ false
+ );
+ if (attributeTestContext.typeName() != null) {
+ Name typeName = parseName(attributeTestContext.typeName().qname(), false, false);
+ return new AttributeTest(elementName, typeName);
+ } else {
+ return new AttributeTest(elementName, null);
+ }
+ } else {
+ return new AttributeTest(true);
+ }
+ }
+ return new AttributeTest();
+ } else if (kindTest instanceof JsoniqParser.TextTestContext) {
+ return new TextTest();
+ } else if (kindTest instanceof JsoniqParser.AnyKindTestContext) {
+ return new AnyKindTest();
+ } else {
+ throw new UnsupportedFeatureException(
+ "Kind tests of type document, element, attribute, text and any are supported at the moment",
+ createMetadataFromContext((ParserRuleContext) kindTest)
+ );
+ }
+ }
+
+
// end region
public void processNamespaceDecl(JsoniqParser.NamespaceDeclContext ctx) {
diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java
index 8ff2d1970d..7334c1decf 100644
--- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java
+++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java
@@ -19,6 +19,7 @@
import org.rumbledb.runtime.functions.datetime.FormatDateFunctionIterator;
import org.rumbledb.runtime.functions.datetime.FormatDateTimeFunctionIterator;
import org.rumbledb.runtime.functions.datetime.FormatTimeFunctionIterator;
+import org.rumbledb.runtime.functions.datetime.TimeInMillis;
import org.rumbledb.runtime.functions.datetime.components.AdjustDateTimeToTimezone;
import org.rumbledb.runtime.functions.datetime.components.AdjustDateToTimezone;
import org.rumbledb.runtime.functions.datetime.components.AdjustTimeToTimezone;
@@ -44,6 +45,7 @@
import org.rumbledb.runtime.functions.durations.components.MonthsFromDurationFunctionIterator;
import org.rumbledb.runtime.functions.durations.components.SecondsFromDurationFunctionIterator;
import org.rumbledb.runtime.functions.durations.components.YearsFromDurationFunctionIterator;
+import org.rumbledb.runtime.functions.error.ThrowErrorIterator;
import org.rumbledb.runtime.functions.input.AvroFileFunctionIterator;
import org.rumbledb.runtime.functions.input.CSVFileFunctionIterator;
import org.rumbledb.runtime.functions.input.JsonFileFunctionIterator;
@@ -60,7 +62,9 @@
import org.rumbledb.runtime.functions.io.ParseJsonFunctionIterator;
import org.rumbledb.runtime.functions.io.TraceFunctionIterator;
import org.rumbledb.runtime.functions.io.UnparsedTextFunctionIterator;
+import org.rumbledb.runtime.functions.io.XmlDocFunctionIterator;
import org.rumbledb.runtime.functions.io.YamlDocFunctionIterator;
+import org.rumbledb.runtime.functions.nullable.IsNullIterator;
import org.rumbledb.runtime.functions.numerics.AbsFunctionIterator;
import org.rumbledb.runtime.functions.numerics.CeilingFunctionIterator;
import org.rumbledb.runtime.functions.numerics.FloorFunctionIterator;
@@ -91,6 +95,10 @@
import org.rumbledb.runtime.functions.object.ObjectProjectFunctionIterator;
import org.rumbledb.runtime.functions.object.ObjectRemoveKeysFunctionIterator;
import org.rumbledb.runtime.functions.object.ObjectValuesFunctionIterator;
+import org.rumbledb.runtime.functions.random.RandomNumberGeneratorIterator;
+import org.rumbledb.runtime.functions.random.RandomSequenceGeneratorIterator;
+import org.rumbledb.runtime.functions.random.RandomSequenceWithBoundsAndSeedIterator;
+import org.rumbledb.runtime.functions.random.RandomSequenceWithBoundsIterator;
import org.rumbledb.runtime.functions.sequences.aggregate.AvgFunctionIterator;
import org.rumbledb.runtime.functions.sequences.aggregate.CountFunctionIterator;
import org.rumbledb.runtime.functions.sequences.aggregate.MaxFunctionIterator;
@@ -137,6 +145,8 @@
import org.rumbledb.runtime.functions.strings.TokenizeFunctionIterator;
import org.rumbledb.runtime.functions.strings.TranslateFunctionIterator;
import org.rumbledb.runtime.functions.strings.UpperCaseFunctionIterator;
+import org.rumbledb.runtime.functions.typing.DynamicItemTypeIterator;
+import org.rumbledb.runtime.functions.xml.GetRootFunctionIterator;
import org.rumbledb.types.FunctionSignature;
import org.rumbledb.types.SequenceType;
import sparksoniq.spark.ml.AnnotateFunctionIterator;
@@ -354,6 +364,36 @@ private static BuiltinFunction createBuiltinFunction(
);
}
+ private static BuiltinFunction createBuiltinFunction(
+ Name functionName,
+ String param1Type,
+ String param2Type,
+ String param3Type,
+ String param4Type,
+ String param5Type,
+ String returnType,
+ Class extends RuntimeIterator> functionIteratorClass,
+ BuiltinFunction.BuiltinFunctionExecutionMode builtInFunctionExecutionMode
+ ) {
+ return new BuiltinFunction(
+ new FunctionIdentifier(functionName, 5),
+ new FunctionSignature(
+ Collections.unmodifiableList(
+ Arrays.asList(
+ SequenceType.createSequenceType(param1Type),
+ SequenceType.createSequenceType(param2Type),
+ SequenceType.createSequenceType(param3Type),
+ SequenceType.createSequenceType(param4Type),
+ SequenceType.createSequenceType(param5Type)
+ )
+ ),
+ SequenceType.createSequenceType(returnType)
+ ),
+ functionIteratorClass,
+ builtInFunctionExecutionMode
+ );
+ }
+
/**
* function that returns the context position
*/
@@ -434,6 +474,28 @@ private static BuiltinFunction createBuiltinFunction(
ParseJsonFunctionIterator.class,
BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
);
+ static final BuiltinFunction xml_doc = createBuiltinFunction(
+ new Name(Name.FN_NS, "fn", "xml-doc"),
+ "string",
+ "item*",
+ XmlDocFunctionIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
+ static final BuiltinFunction root_with_arg = createBuiltinFunction(
+ new Name(Name.FN_NS, "fn", "root"),
+ "item",
+ "item",
+ GetRootFunctionIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
+ static final BuiltinFunction root_without_arg = createBuiltinFunction(
+ new Name(Name.FN_NS, "fn", "root"),
+ "item",
+ GetRootFunctionIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
/**
* function that parses a text file
@@ -2677,6 +2739,173 @@ private static BuiltinFunction createBuiltinFunction(
BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
);
+ /**
+ * function that returns a random number
+ */
+ static final BuiltinFunction random_number_generator = createBuiltinFunction(
+ new Name(
+ Name.FN_NS,
+ "",
+ "random"
+ ),
+ "double",
+ RandomNumberGeneratorIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
+ /**
+ * function that returns a sequence of random numbers
+ */
+ static final BuiltinFunction random_sequence_generator = createBuiltinFunction(
+ new Name(
+ Name.FN_NS,
+ "",
+ "random"
+ ),
+ "integer",
+ "item*",
+ RandomSequenceGeneratorIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
+ /**
+ * function that returns a sequence of random numbers using a seed
+ */
+ static final BuiltinFunction random_sequence_generator_with_seed = createBuiltinFunction(
+ new Name(
+ Name.FN_NS,
+ "",
+ "seeded_random"
+ ),
+ "integer",
+ "integer",
+ "item*",
+ RandomSequenceGeneratorIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
+ /**
+ * function that returns a sequence of random numbers using a low and high bound, while also allowing to limit the
+ * number of elements generated and their type
+ */
+ static final BuiltinFunction random_sequence_with_bounds = createBuiltinFunction(
+ new Name(
+ Name.FN_NS,
+ "",
+ "random-between"
+ ),
+ "integer",
+ "integer",
+ "integer",
+ "string",
+ "integer",
+ "item*",
+ RandomSequenceWithBoundsIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
+ static final BuiltinFunction random_sequence_with_bounds_double = createBuiltinFunction(
+ new Name(
+ Name.FN_NS,
+ "",
+ "random-between"
+ ),
+ "double",
+ "double",
+ "integer",
+ "string",
+ "item*",
+ RandomSequenceWithBoundsIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
+ static final BuiltinFunction random_sequence_with_bounds_seeded_int = createBuiltinFunction(
+ new Name(
+ Name.FN_NS,
+ "",
+ "random-between"
+ ),
+ "integer",
+ "integer",
+ "integer",
+ "string",
+ "integer",
+ "item*",
+ RandomSequenceWithBoundsAndSeedIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
+ static final BuiltinFunction error = createBuiltinFunction(
+ new Name(
+ Name.FN_NS,
+ "",
+ "error"
+ ),
+ "null?",
+ ThrowErrorIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
+ static final BuiltinFunction error_with_code = createBuiltinFunction(
+ new Name(
+ Name.FN_NS,
+ "",
+ "error"
+ ),
+ "string",
+ "null?",
+ ThrowErrorIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
+ static final BuiltinFunction error_with_code_and_description = createBuiltinFunction(
+ new Name(
+ Name.FN_NS,
+ "",
+ "error"
+ ),
+ "string",
+ "string",
+ "null?",
+ ThrowErrorIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
+ static final BuiltinFunction item_type = createBuiltinFunction(
+ new Name(
+ Name.FN_NS,
+ "",
+ "item-type"
+ ),
+ "item*",
+ "string",
+ DynamicItemTypeIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
+ static final BuiltinFunction is_null = createBuiltinFunction(
+ new Name(
+ Name.JN_NS,
+ "jn",
+ "is-null"
+ ),
+ "item*",
+ "boolean",
+ IsNullIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
+ static final BuiltinFunction current_time_millis = createBuiltinFunction(
+ new Name(
+ Name.JN_NS,
+ "jn",
+ "current-time-milis"
+ ),
+ "integer",
+ TimeInMillis.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
static {
builtinFunctions = new HashMap<>();
@@ -2880,6 +3109,24 @@ private static BuiltinFunction createBuiltinFunction(
builtinFunctions.put(binary_classification_metrics1.getIdentifier(), binary_classification_metrics1);
builtinFunctions.put(binary_classification_metrics2.getIdentifier(), binary_classification_metrics2);
builtinFunctions.put(print_variable_values.getIdentifier(), print_variable_values);
+ builtinFunctions.put(random_number_generator.getIdentifier(), random_number_generator);
+ builtinFunctions.put(random_sequence_generator.getIdentifier(), random_sequence_generator);
+ builtinFunctions.put(random_sequence_generator_with_seed.getIdentifier(), random_sequence_generator_with_seed);
+ builtinFunctions.put(random_sequence_with_bounds.getIdentifier(), random_sequence_with_bounds);
+ builtinFunctions.put(random_sequence_with_bounds_double.getIdentifier(), random_sequence_with_bounds_double);
+ builtinFunctions.put(error.getIdentifier(), error);
+ builtinFunctions.put(error_with_code.getIdentifier(), error_with_code);
+ builtinFunctions.put(error_with_code_and_description.getIdentifier(), error_with_code_and_description);
+ builtinFunctions.put(item_type.getIdentifier(), item_type);
+ builtinFunctions.put(is_null.getIdentifier(), is_null);
+ builtinFunctions.put(
+ random_sequence_with_bounds_seeded_int.getIdentifier(),
+ random_sequence_with_bounds_seeded_int
+ );
+ builtinFunctions.put(xml_doc.getIdentifier(), xml_doc);
+ builtinFunctions.put(root_with_arg.getIdentifier(), root_with_arg);
+ builtinFunctions.put(root_without_arg.getIdentifier(), root_without_arg);
+ builtinFunctions.put(current_time_millis.getIdentifier(), current_time_millis);
}
diff --git a/src/main/java/org/rumbledb/context/UserDefinedFunctionExecutionModes.java b/src/main/java/org/rumbledb/context/UserDefinedFunctionExecutionModes.java
index b16f4fb715..927c27c943 100644
--- a/src/main/java/org/rumbledb/context/UserDefinedFunctionExecutionModes.java
+++ b/src/main/java/org/rumbledb/context/UserDefinedFunctionExecutionModes.java
@@ -20,17 +20,16 @@
package org.rumbledb.context;
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.KryoSerializable;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
import org.rumbledb.exceptions.DuplicateFunctionIdentifierException;
import org.rumbledb.exceptions.ExceptionMetadata;
import org.rumbledb.exceptions.OurBadException;
import org.rumbledb.exceptions.UnknownFunctionCallException;
import org.rumbledb.expressions.ExecutionMode;
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.KryoSerializable;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
-
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
@@ -139,7 +138,11 @@ public void setParameterExecutionMode(
continue;
}
throw new OurBadException(
- "Conflicting execution modes in user-defined function parameters. This happens when the same function is used in a setting with big sequences and another with small sequences, which is an unsupported feature. If you need this, please let us know so we can prioritize."
+ "Conflicting execution modes in user-defined function parameters for function: "
+ + functionIdentifier.getName()
+ + " with arity: "
+ + functionIdentifier.getArity()
+ + ". This happens when the same function is used in a setting with big sequences and another with small sequences, which is an unsupported feature. If you need this, please let us know so we can prioritize."
);
}
if (oldModes.hasNext() || updatedModes.hasNext()) {
diff --git a/src/main/java/org/rumbledb/errorcodes/ErrorCode.java b/src/main/java/org/rumbledb/errorcodes/ErrorCode.java
index c2f8621601..4c452e3a33 100644
--- a/src/main/java/org/rumbledb/errorcodes/ErrorCode.java
+++ b/src/main/java/org/rumbledb/errorcodes/ErrorCode.java
@@ -149,8 +149,9 @@ public enum ErrorCode {
InvalidAssignableVariableComposability("SCCP0005"),
InvalidSequentialChildInNonSequentialParent("SCCP0006"),
InvalidAnnotation("XQAN0001"),
- InvalidVariableDeclaration("SCIN0001");
+ InvalidVariableDeclaration("SCIN0001"),
+ UnexpectedNode("XPTY0019");
private String code;
diff --git a/src/main/java/org/rumbledb/exceptions/RumbleException.java b/src/main/java/org/rumbledb/exceptions/RumbleException.java
index e799cb9a31..36eef0c73f 100644
--- a/src/main/java/org/rumbledb/exceptions/RumbleException.java
+++ b/src/main/java/org/rumbledb/exceptions/RumbleException.java
@@ -41,7 +41,7 @@ public class RumbleException extends RuntimeException {
this.metadata = ExceptionMetadata.EMPTY_METADATA;
}
- RumbleException(String message, ErrorCode errorCode) {
+ public RumbleException(String message, ErrorCode errorCode) {
super(formatMessage(errorCode, ExceptionMetadata.EMPTY_METADATA, message));
if (!Arrays.asList(ErrorCode.class.getFields()).stream().anyMatch(f -> {
try {
diff --git a/src/main/java/org/rumbledb/exceptions/UnexpectedNodeException.java b/src/main/java/org/rumbledb/exceptions/UnexpectedNodeException.java
new file mode 100644
index 0000000000..ec96e35ca8
--- /dev/null
+++ b/src/main/java/org/rumbledb/exceptions/UnexpectedNodeException.java
@@ -0,0 +1,9 @@
+package org.rumbledb.exceptions;
+
+import org.rumbledb.errorcodes.ErrorCode;
+
+public class UnexpectedNodeException extends RumbleException {
+ public UnexpectedNodeException(String message, ExceptionMetadata metadata) {
+ super(message, ErrorCode.UnexpectedNode, metadata);
+ }
+}
diff --git a/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java b/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java
index 85a08deb10..7a8d33f396 100644
--- a/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java
+++ b/src/main/java/org/rumbledb/expressions/AbstractNodeVisitor.java
@@ -97,6 +97,8 @@
import org.rumbledb.expressions.update.RenameExpression;
import org.rumbledb.expressions.update.ReplaceExpression;
import org.rumbledb.expressions.update.TransformExpression;
+import org.rumbledb.expressions.xml.PathExpr;
+import org.rumbledb.expressions.xml.StepExpr;
public abstract class AbstractNodeVisitor {
@@ -453,4 +455,12 @@ public T visitBlockExpr(BlockExpression expression, T argument) {
public T visitCommaVariableDeclStatement(CommaVariableDeclStatement statement, T argument) {
return defaultAction(statement, argument);
}
+
+ public T visitPathExpr(PathExpr pathExpr, T argument) {
+ return defaultAction(pathExpr, argument);
+ }
+
+ public T visitStepExpr(StepExpr stepExpr, T argument) {
+ return defaultAction(stepExpr, argument);
+ }
}
diff --git a/src/main/java/org/rumbledb/expressions/xml/PathExpr.java b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java
new file mode 100644
index 0000000000..16f5fafeea
--- /dev/null
+++ b/src/main/java/org/rumbledb/expressions/xml/PathExpr.java
@@ -0,0 +1,63 @@
+package org.rumbledb.expressions.xml;
+
+import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.expressions.AbstractNodeVisitor;
+import org.rumbledb.expressions.Expression;
+import org.rumbledb.expressions.Node;
+import org.rumbledb.expressions.primary.FunctionCallExpression;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PathExpr extends Expression {
+ private final List relativePathExpressions;
+ private final FunctionCallExpression fetchRootFunction;
+
+ public PathExpr(
+ FunctionCallExpression fetchRootFunction,
+ List relativePathExpressions,
+ ExceptionMetadata metadata
+ ) {
+ super(metadata);
+ this.fetchRootFunction = fetchRootFunction;
+ this.relativePathExpressions = relativePathExpressions;
+ }
+
+ @Override
+ public T accept(AbstractNodeVisitor visitor, T argument) {
+ return visitor.visitPathExpr(this, argument);
+ }
+
+ @Override
+ public List getChildren() {
+ return new ArrayList<>(this.relativePathExpressions);
+ }
+
+ @Override
+ public void serializeToJSONiq(StringBuffer sb, int indent) {
+ int pathCounter = 0;
+ indentIt(sb, indent);
+ if (this.fetchRootFunction != null) {
+ sb.append("/");
+ }
+ for (Expression stepExpr : this.relativePathExpressions) {
+ stepExpr.serializeToJSONiq(sb, indent);
+ if (++pathCounter < this.relativePathExpressions.size()) {
+ sb.append("/");
+ }
+ }
+ sb.append("\n");
+ }
+
+ public List getRelativePathExpressions() {
+ return this.relativePathExpressions;
+ }
+
+ public boolean needsRoot() {
+ return this.fetchRootFunction != null;
+ }
+
+ public FunctionCallExpression getFetchRootFunction() {
+ return fetchRootFunction;
+ }
+}
diff --git a/src/main/java/org/rumbledb/expressions/xml/StepExpr.java b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java
new file mode 100644
index 0000000000..5aeb175d33
--- /dev/null
+++ b/src/main/java/org/rumbledb/expressions/xml/StepExpr.java
@@ -0,0 +1,24 @@
+package org.rumbledb.expressions.xml;
+
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.expressions.AbstractNodeVisitor;
+import org.rumbledb.expressions.Expression;
+import org.rumbledb.expressions.xml.node_test.NodeTest;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor;
+
+public abstract class StepExpr extends Expression {
+ public StepExpr(ExceptionMetadata metadata) {
+ super(metadata);
+ }
+
+ @Override
+ public T accept(AbstractNodeVisitor visitor, T argument) {
+ return visitor.visitStepExpr(this, argument);
+ }
+
+ public abstract AxisIterator accept(AxisIteratorVisitor visitor, RuntimeStaticContext staticContext);
+
+ public abstract NodeTest getNodeTest();
+}
diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/EmptyStepExpr.java b/src/main/java/org/rumbledb/expressions/xml/axis/EmptyStepExpr.java
new file mode 100644
index 0000000000..9f0a9c90ad
--- /dev/null
+++ b/src/main/java/org/rumbledb/expressions/xml/axis/EmptyStepExpr.java
@@ -0,0 +1,39 @@
+package org.rumbledb.expressions.xml.axis;
+
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.expressions.Node;
+import org.rumbledb.expressions.xml.StepExpr;
+import org.rumbledb.expressions.xml.node_test.NodeTest;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor;
+
+import java.util.Collections;
+import java.util.List;
+
+public class EmptyStepExpr extends StepExpr {
+
+ public EmptyStepExpr(ExceptionMetadata metadata) {
+ super(metadata);
+ }
+
+ @Override
+ public List getChildren() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public void serializeToJSONiq(StringBuffer sb, int indent) {
+ indentIt(sb, indent);
+ }
+
+ @Override
+ public AxisIterator accept(AxisIteratorVisitor visitor, RuntimeStaticContext staticContext) {
+ return null;
+ }
+
+ @Override
+ public NodeTest getNodeTest() {
+ return null;
+ }
+}
diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardAxis.java b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardAxis.java
new file mode 100644
index 0000000000..764dc223af
--- /dev/null
+++ b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardAxis.java
@@ -0,0 +1,30 @@
+package org.rumbledb.expressions.xml.axis;
+
+public enum ForwardAxis {
+ CHILD("child::"),
+ DESCENDANT("descendant::"),
+ ATTRIBUTE("attribute::"),
+ SELF("self::"),
+ DESCENDANT_OR_SELF("descendant-or-self::"),
+ FOLLOWING_SIBLING("following-sibling::"),
+ FOLLOWING("following::");
+
+ private final String axisValue;
+
+ ForwardAxis(String axisValue) {
+ this.axisValue = axisValue;
+ }
+
+ public String getAxisValue() {
+ return axisValue;
+ }
+
+ public static ForwardAxis fromString(String text) {
+ for (ForwardAxis forwardAxis : ForwardAxis.values()) {
+ if (forwardAxis.axisValue.equalsIgnoreCase(text)) {
+ return forwardAxis;
+ }
+ }
+ throw new IllegalArgumentException("No constant with text: " + text + " found!");
+ }
+}
diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStepExpr.java b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStepExpr.java
new file mode 100644
index 0000000000..16e71b607f
--- /dev/null
+++ b/src/main/java/org/rumbledb/expressions/xml/axis/ForwardStepExpr.java
@@ -0,0 +1,49 @@
+package org.rumbledb.expressions.xml.axis;
+
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.expressions.Node;
+import org.rumbledb.expressions.xml.StepExpr;
+import org.rumbledb.expressions.xml.node_test.NodeTest;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor;
+
+import java.util.Collections;
+import java.util.List;
+
+public class ForwardStepExpr extends StepExpr {
+ private ForwardAxis forwardAxis;
+ private NodeTest nodeTest;
+
+ public ForwardStepExpr(ForwardAxis forwardAxis, NodeTest nodeTest, ExceptionMetadata exceptionMetadata) {
+ super(exceptionMetadata);
+ this.forwardAxis = forwardAxis;
+ this.nodeTest = nodeTest;
+ }
+
+ @Override
+ public List getChildren() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public void serializeToJSONiq(StringBuffer sb, int indent) {
+ indentIt(sb, indent);
+ sb.append(forwardAxis.getAxisValue());
+ sb.append(nodeTest.toString());
+ }
+
+ public ForwardAxis getForwardAxis() {
+ return forwardAxis;
+ }
+
+ @Override
+ public AxisIterator accept(AxisIteratorVisitor visitor, RuntimeStaticContext staticContext) {
+ return visitor.visit(this, staticContext);
+ }
+
+ @Override
+ public NodeTest getNodeTest() {
+ return nodeTest;
+ }
+}
diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseAxis.java b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseAxis.java
new file mode 100644
index 0000000000..65858583d3
--- /dev/null
+++ b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseAxis.java
@@ -0,0 +1,28 @@
+package org.rumbledb.expressions.xml.axis;
+
+public enum ReverseAxis {
+ PARENT("parent::"),
+ ANCESTOR("ancestor::"),
+ PRECEDING_SIBLING("preceding-sibling::"),
+ PRECEDING("preceding::"),
+ ANCESTOR_OR_SELF("ancestor-or-self::");
+
+ private final String axisValue;
+
+ ReverseAxis(String axisValue) {
+ this.axisValue = axisValue;
+ }
+
+ public String getAxisValue() {
+ return axisValue;
+ }
+
+ public static ReverseAxis fromString(String text) {
+ for (ReverseAxis forwardAxis : ReverseAxis.values()) {
+ if (forwardAxis.axisValue.equalsIgnoreCase(text)) {
+ return forwardAxis;
+ }
+ }
+ throw new IllegalArgumentException("No constant with text: " + text + " found!");
+ }
+}
diff --git a/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStepExpr.java b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStepExpr.java
new file mode 100644
index 0000000000..0b75e028e2
--- /dev/null
+++ b/src/main/java/org/rumbledb/expressions/xml/axis/ReverseStepExpr.java
@@ -0,0 +1,49 @@
+package org.rumbledb.expressions.xml.axis;
+
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.expressions.Node;
+import org.rumbledb.expressions.xml.StepExpr;
+import org.rumbledb.expressions.xml.node_test.NodeTest;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+import org.rumbledb.runtime.xml.axis.AxisIteratorVisitor;
+
+import java.util.Collections;
+import java.util.List;
+
+public class ReverseStepExpr extends StepExpr {
+ private ReverseAxis reverseAxis;
+ private NodeTest nodeTest;
+
+ public ReverseStepExpr(ReverseAxis reverseAxis, NodeTest nodeTest, ExceptionMetadata exceptionMetadata) {
+ super(exceptionMetadata);
+ this.reverseAxis = reverseAxis;
+ this.nodeTest = nodeTest;
+ }
+
+ @Override
+ public List getChildren() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public void serializeToJSONiq(StringBuffer sb, int indent) {
+ indentIt(sb, indent);
+ sb.append(reverseAxis.getAxisValue());
+ sb.append(nodeTest.toString());
+ }
+
+ public ReverseAxis getReverseAxis() {
+ return this.reverseAxis;
+ }
+
+ @Override
+ public AxisIterator accept(AxisIteratorVisitor visitor, RuntimeStaticContext staticContext) {
+ return visitor.visit(this, staticContext);
+ }
+
+ @Override
+ public NodeTest getNodeTest() {
+ return nodeTest;
+ }
+}
diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/AnyKindTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/AnyKindTest.java
new file mode 100644
index 0000000000..6041e4cdbc
--- /dev/null
+++ b/src/main/java/org/rumbledb/expressions/xml/node_test/AnyKindTest.java
@@ -0,0 +1,9 @@
+package org.rumbledb.expressions.xml.node_test;
+
+public class AnyKindTest implements NodeTest {
+
+ @Override
+ public String toString() {
+ return "node()";
+ }
+}
diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/AttributeTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/AttributeTest.java
new file mode 100644
index 0000000000..163d166340
--- /dev/null
+++ b/src/main/java/org/rumbledb/expressions/xml/node_test/AttributeTest.java
@@ -0,0 +1,65 @@
+package org.rumbledb.expressions.xml.node_test;
+
+import org.rumbledb.context.Name;
+
+public class AttributeTest implements NodeTest {
+ private Name attributeName;
+ private boolean hasWildcard;
+ private Name typeName;
+
+ public AttributeTest(Name attributeName, Name typeName) {
+ this.attributeName = attributeName;
+ this.typeName = typeName;
+ this.hasWildcard = false;
+ }
+
+ public AttributeTest(Name typeName) {
+ this.attributeName = null;
+ this.typeName = typeName;
+ this.hasWildcard = true;
+ }
+
+ public AttributeTest(boolean hasWildcard) {
+ this.attributeName = null;
+ this.typeName = null;
+ this.hasWildcard = hasWildcard;
+ }
+
+ public AttributeTest() {
+ this.attributeName = null;
+ this.typeName = null;
+ this.hasWildcard = false;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("attribute(");
+ if (this.hasWildcard) {
+ sb.append("*");
+ } else if (this.attributeName != null) {
+ sb.append(this.attributeName);
+ }
+ if (typeName != null) {
+ sb.append(",");
+ sb.append(this.typeName);
+ }
+ sb.append(")");
+ return sb.toString();
+ }
+
+ public boolean isEmptyCheck() {
+ return !this.hasWildcard && this.attributeName == null;
+ }
+
+ public boolean isNameWithoutTypeCheck() {
+ return this.attributeName != null && this.typeName == null;
+ }
+
+ public String getAttributeName() {
+ return this.attributeName.getLocalName();
+ }
+
+ public boolean isWildcardOnly() {
+ return this.attributeName == null && this.typeName == null && this.hasWildcard;
+ }
+}
diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/DocumentTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/DocumentTest.java
new file mode 100644
index 0000000000..98ed973693
--- /dev/null
+++ b/src/main/java/org/rumbledb/expressions/xml/node_test/DocumentTest.java
@@ -0,0 +1,28 @@
+package org.rumbledb.expressions.xml.node_test;
+
+public class DocumentTest implements NodeTest {
+ // TODO: schemaElement test unsupported yet.
+ private NodeTest nodeTest;
+
+ public DocumentTest(NodeTest nodeTest) {
+ this.nodeTest = nodeTest;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("document-node(");
+ if (this.nodeTest != null) {
+ sb.append(this.nodeTest);
+ }
+ sb.append(")");
+ return sb.toString();
+ }
+
+ public boolean isEmptyCheck() {
+ return nodeTest == null;
+ }
+
+ public NodeTest getNodeTest() {
+ return this.nodeTest;
+ }
+}
diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java
new file mode 100644
index 0000000000..0984589171
--- /dev/null
+++ b/src/main/java/org/rumbledb/expressions/xml/node_test/ElementTest.java
@@ -0,0 +1,66 @@
+package org.rumbledb.expressions.xml.node_test;
+
+import org.rumbledb.context.Name;
+
+public class ElementTest implements NodeTest {
+ private Name elementName;
+ private boolean hasWildcard;
+ private Name typeName;
+ // TODO: add support for optional type
+
+
+ public ElementTest(Name elementName, Name typeName) {
+ this.elementName = elementName;
+ this.typeName = typeName;
+ this.hasWildcard = false;
+ }
+
+ public ElementTest(Name typeName) {
+ this.elementName = null;
+ this.typeName = typeName;
+ this.hasWildcard = true;
+ }
+
+ public ElementTest(boolean hasWildcard) {
+ this.elementName = null;
+ this.typeName = null;
+ this.hasWildcard = true;
+ }
+
+ public ElementTest() {
+ this.elementName = null;
+ this.typeName = null;
+ this.hasWildcard = false;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("element(");
+ if (this.hasWildcard) {
+ sb.append("*");
+ } else if (this.elementName != null) {
+ sb.append(this.elementName);
+ }
+ if (this.typeName != null) {
+ sb.append(this.typeName);
+ }
+ sb.append(")");
+ return sb.toString();
+ }
+
+ public boolean isEmptyCheck() {
+ return !this.hasWildcard && this.elementName == null;
+ }
+
+ public boolean isNameWithoutTypeCheck() {
+ return this.elementName != null && this.typeName == null;
+ }
+
+ public String getElementName() {
+ return elementName.getLocalName();
+ }
+
+ public boolean isWildcardOnly() {
+ return this.elementName == null && this.typeName == null && this.hasWildcard;
+ }
+}
diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java
new file mode 100644
index 0000000000..061d2b413a
--- /dev/null
+++ b/src/main/java/org/rumbledb/expressions/xml/node_test/NameTest.java
@@ -0,0 +1,43 @@
+package org.rumbledb.expressions.xml.node_test;
+
+import org.rumbledb.context.Name;
+
+// TODO: Add support for name test
+public class NameTest implements NodeTest {
+ private Name qname;
+ private String wildcardWithNCName;
+
+ public NameTest(Name qname) {
+ this.qname = qname;
+ this.wildcardWithNCName = null;
+ }
+
+ public NameTest(String wildcardWithNCName) {
+ this.qname = null;
+ this.wildcardWithNCName = wildcardWithNCName;
+ }
+
+ @Override
+ public String toString() {
+ if (this.qname != null) {
+ return this.qname.toString();
+ }
+ return this.wildcardWithNCName;
+ }
+
+ public boolean hasQName() {
+ return this.qname != null;
+ }
+
+ public String getQName() {
+ return this.qname.toString();
+ }
+
+ public boolean hasWildcardOnly() {
+ return this.wildcardWithNCName != null && this.wildcardWithNCName.equals("*");
+ }
+
+ public String getWildcardQName() {
+ return this.wildcardWithNCName;
+ }
+}
diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/NodeTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/NodeTest.java
new file mode 100644
index 0000000000..3a4babc074
--- /dev/null
+++ b/src/main/java/org/rumbledb/expressions/xml/node_test/NodeTest.java
@@ -0,0 +1,4 @@
+package org.rumbledb.expressions.xml.node_test;
+
+public interface NodeTest {
+}
diff --git a/src/main/java/org/rumbledb/expressions/xml/node_test/TextTest.java b/src/main/java/org/rumbledb/expressions/xml/node_test/TextTest.java
new file mode 100644
index 0000000000..6d3fd41e95
--- /dev/null
+++ b/src/main/java/org/rumbledb/expressions/xml/node_test/TextTest.java
@@ -0,0 +1,9 @@
+package org.rumbledb.expressions.xml.node_test;
+
+public class TextTest implements NodeTest {
+
+ @Override
+ public String toString() {
+ return "text()";
+ }
+}
diff --git a/src/main/java/org/rumbledb/items/AnnotatedItem.java b/src/main/java/org/rumbledb/items/AnnotatedItem.java
index 5d110a4014..1357718514 100644
--- a/src/main/java/org/rumbledb/items/AnnotatedItem.java
+++ b/src/main/java/org/rumbledb/items/AnnotatedItem.java
@@ -48,13 +48,16 @@ public AnnotatedItem(Item itemToAnnotate, ItemType type) {
@Override
public boolean equals(Object otherItem) {
if (otherItem instanceof Item) {
- long c = ComparisonIterator.compareItems(
- this,
- (Item) otherItem,
- ComparisonOperator.VC_EQ,
- ExceptionMetadata.EMPTY_METADATA
- );
- return c == 0;
+ if (((Item) otherItem).isAtomic()) {
+ long c = ComparisonIterator.compareItems(
+ this,
+ (Item) otherItem,
+ ComparisonOperator.VC_EQ,
+ ExceptionMetadata.EMPTY_METADATA
+ );
+ return c == 0;
+ }
+ return this.itemToAnnotate.equals(otherItem);
}
return false;
}
diff --git a/src/main/java/org/rumbledb/items/ItemFactory.java b/src/main/java/org/rumbledb/items/ItemFactory.java
index c81854cd47..b9ed49d85e 100644
--- a/src/main/java/org/rumbledb/items/ItemFactory.java
+++ b/src/main/java/org/rumbledb/items/ItemFactory.java
@@ -4,7 +4,12 @@
import org.joda.time.Period;
import org.rumbledb.api.Item;
import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.items.xml.AttributeItem;
+import org.rumbledb.items.xml.DocumentItem;
+import org.rumbledb.items.xml.ElementItem;
+import org.rumbledb.items.xml.TextItem;
import org.rumbledb.types.ItemType;
+import org.w3c.dom.Node;
import java.math.BigDecimal;
import java.math.BigInteger;
@@ -221,4 +226,19 @@ public Item createObjectItem(Map> keyValuePairs) {
return new ObjectItem(keyValuePairs);
}
+ public Item createXmlTextNode(Node currentNode) {
+ return new TextItem(currentNode);
+ }
+
+ public Item createXmlAttributeNode(Node attribute) {
+ return new AttributeItem(attribute);
+ }
+
+ public Item createXmlDocumentNode(Node documentNode, List
- children) {
+ return new DocumentItem(documentNode, children);
+ }
+
+ public Item createXmlElementNode(Node elementNode, List
- children, List
- attributes) {
+ return new ElementItem(elementNode, children, attributes);
+ }
}
diff --git a/src/main/java/org/rumbledb/items/parsing/ItemParser.java b/src/main/java/org/rumbledb/items/parsing/ItemParser.java
index 0229a79551..9c7087ca72 100644
--- a/src/main/java/org/rumbledb/items/parsing/ItemParser.java
+++ b/src/main/java/org/rumbledb/items/parsing/ItemParser.java
@@ -20,6 +20,9 @@
package org.rumbledb.items.parsing;
+import com.fasterxml.jackson.dataformat.yaml.YAMLParser;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonToken;
import org.apache.commons.codec.binary.Hex;
import org.apache.spark.ml.linalg.DenseVector;
import org.apache.spark.ml.linalg.SparseVector;
@@ -39,13 +42,12 @@
import org.rumbledb.exceptions.ParsingException;
import org.rumbledb.exceptions.RumbleException;
import org.rumbledb.items.ItemFactory;
-
-import com.fasterxml.jackson.dataformat.yaml.YAMLParser;
-import com.google.gson.stream.JsonReader;
-import com.google.gson.stream.JsonToken;
import org.rumbledb.types.BuiltinTypesCatalogue;
import org.rumbledb.types.FieldDescriptor;
import org.rumbledb.types.ItemType;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
import scala.collection.mutable.WrappedArray;
import sparksoniq.spark.SparkSessionManager;
@@ -581,4 +583,74 @@ private static Item convertValueToItem(
throw new RuntimeException("DataFrame type unsupported: " + fieldType.json());
}
}
+
+ /**
+ * Parses an XML document to an item.
+ *
+ * @param currentNode The current node
+ * @return the parsed item
+ */
+ public static Item getItemFromXML(Node currentNode) {
+ if (currentNode.getNodeType() == Node.TEXT_NODE && !hasWhitespaceText(currentNode)) {
+ return getTextNodeItem(currentNode);
+ } else if (currentNode.getNodeType() == Node.DOCUMENT_NODE) {
+ return getDocumentNodeItem(currentNode);
+ }
+ return getElementNodeItem(currentNode);
+ }
+
+ private static Item getDocumentNodeItem(Node currentNode) {
+ List
- children = getChildren(currentNode);
+ Item documentItem = ItemFactory.getInstance().createXmlDocumentNode(currentNode, children);
+ addParentToChildrenAndAttributes(documentItem);
+ return documentItem;
+ }
+
+ private static Item getElementNodeItem(Node currentNode) {
+ List
- children = getChildren(currentNode);
+ List
- attributes = getAttributes(currentNode);
+ Item elementItem = ItemFactory.getInstance()
+ .createXmlElementNode(currentNode, children, attributes);
+ addParentToChildrenAndAttributes(elementItem);
+ return elementItem;
+ }
+
+ private static boolean hasWhitespaceText(Node currentNode) {
+ String content = currentNode.getTextContent();
+ content = content.replaceAll("[\\r\\n]+\\s", "");
+ return content.trim().isEmpty();
+ }
+
+ private static List
- getChildren(Node currentNode) {
+ List
- children = new ArrayList<>();
+ NodeList nodeList = currentNode.getChildNodes();
+ for (int i = 0; i < nodeList.getLength(); ++i) {
+ Node childNode = nodeList.item(i);
+ if (childNode.getNodeType() == Node.ELEMENT_NODE) {
+ children.add(getItemFromXML(childNode));
+ } else if (childNode.getNodeType() == Node.TEXT_NODE && !hasWhitespaceText(childNode)) {
+ children.add(ItemFactory.getInstance().createXmlTextNode(childNode));
+ }
+ }
+ return children;
+ }
+
+ private static List
- getAttributes(Node currentNode) {
+ List
- attributes = new ArrayList<>();
+ NamedNodeMap attributesMap = currentNode.getAttributes();
+
+ for (int i = 0; i < attributesMap.getLength(); ++i) {
+ Node attribute = attributesMap.item(i);
+ attributes.add(ItemFactory.getInstance().createXmlAttributeNode(attribute));
+ }
+ return attributes;
+ }
+
+ private static void addParentToChildrenAndAttributes(Item nodeItem) {
+ nodeItem.addParentToDescendants();
+ }
+
+ private static Item getTextNodeItem(Node currentNode) {
+ return ItemFactory.getInstance().createXmlTextNode(currentNode);
+ }
}
diff --git a/src/main/java/org/rumbledb/items/xml/AttributeItem.java b/src/main/java/org/rumbledb/items/xml/AttributeItem.java
new file mode 100644
index 0000000000..2907ee72ab
--- /dev/null
+++ b/src/main/java/org/rumbledb/items/xml/AttributeItem.java
@@ -0,0 +1,111 @@
+package org.rumbledb.items.xml;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import org.rumbledb.api.Item;
+import org.rumbledb.items.ItemFactory;
+import org.rumbledb.types.BuiltinTypesCatalogue;
+import org.rumbledb.types.ItemType;
+import org.w3c.dom.Node;
+
+public class AttributeItem implements Item {
+ private static final long serialVersionUID = 1L;
+ private Node attributeNode;
+ private Item parent;
+ // TODO: add schema-type, typed-value, is-id, is-idrefs
+
+ public AttributeItem(Node attributeNode) {
+ this.attributeNode = attributeNode;
+ }
+
+ @Override
+ public void write(Kryo kryo, Output output) {
+ kryo.writeObject(output, this.parent);
+ kryo.writeObject(output, this.attributeNode);
+ }
+
+ @Override
+ public void read(Kryo kryo, Input input) {
+ this.parent = kryo.readObject(input, Item.class);
+ this.attributeNode = kryo.readObject(input, Node.class);
+ }
+
+ @Override
+ public boolean nilled() {
+ return false;
+ }
+
+ @Override
+ public String nodeKind() {
+ return "attribute";
+ }
+
+ @Override
+ public String nodeName() {
+ return this.attributeNode.getNodeName();
+ }
+
+ @Override
+ public Item parent() {
+ return this.parent;
+ }
+
+ @Override
+ public String stringValue() {
+ return this.attributeNode.getNodeValue();
+ }
+
+ @Override
+ public void setParent(Item parent) {
+ this.parent = parent;
+ }
+
+ @Override
+ public ItemType getDynamicType() {
+ return BuiltinTypesCatalogue.item;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof AttributeItem)) {
+ return false;
+ }
+ AttributeItem otherAttributeItem = (AttributeItem) other;
+ return otherAttributeItem.attributeNode.isEqualNode(this.attributeNode);
+ }
+
+ @Override
+ public boolean isAttributeNode() {
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return this.attributeNode.hashCode();
+ }
+
+ @Override
+ public int compareXmlNode(Item otherNode) {
+ int position = this.attributeNode.compareDocumentPosition(otherNode.getXmlNode());
+ if ((position & Node.DOCUMENT_POSITION_FOLLOWING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0) {
+ return -1;
+ } else if (
+ (position & Node.DOCUMENT_POSITION_PRECEDING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINS) > 0
+ ) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
+ public Node getXmlNode() {
+ return this.attributeNode;
+ }
+
+ @Override
+ public Item typedValue() {
+ return ItemFactory.getInstance().createStringItem(this.attributeNode.getNodeValue());
+ }
+}
diff --git a/src/main/java/org/rumbledb/items/xml/DocumentItem.java b/src/main/java/org/rumbledb/items/xml/DocumentItem.java
new file mode 100644
index 0000000000..55a0d64f15
--- /dev/null
+++ b/src/main/java/org/rumbledb/items/xml/DocumentItem.java
@@ -0,0 +1,116 @@
+package org.rumbledb.items.xml;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import org.rumbledb.api.Item;
+import org.rumbledb.items.ItemFactory;
+import org.rumbledb.types.BuiltinTypesCatalogue;
+import org.rumbledb.types.ItemType;
+import org.w3c.dom.Node;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DocumentItem implements Item {
+ private static final long serialVersionUID = 1L;
+ private Node documentNode;
+ private List
- children;
+ // TODO: add base-uri, document-uri, typed-value
+
+ public DocumentItem(Node documentNode, List
- children) {
+ this.documentNode = documentNode;
+ this.children = children;
+ }
+
+ @Override
+ public void addParentToDescendants() {
+ this.children.forEach(child -> child.setParent(this));
+ }
+
+ @Override
+ public void write(Kryo kryo, Output output) {
+ kryo.writeObject(output, this.documentNode);
+ kryo.writeObject(output, this.children);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void read(Kryo kryo, Input input) {
+ this.documentNode = kryo.readObject(input, Node.class);
+ this.children = kryo.readObject(input, ArrayList.class);
+ }
+
+ @Override
+ public List
- children() {
+ return this.children;
+ }
+
+ @Override
+ public boolean nilled() {
+ return false;
+ }
+
+ @Override
+ public String nodeKind() {
+ return "document";
+ }
+
+ @Override
+ public Item parent() {
+ return null;
+ }
+
+ @Override
+ public String stringValue() {
+ return this.documentNode.getTextContent();
+ }
+
+ @Override
+ public ItemType getDynamicType() {
+ return BuiltinTypesCatalogue.item;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof DocumentItem)) {
+ return false;
+ }
+ DocumentItem otherDocumentItem = (DocumentItem) other;
+ return otherDocumentItem.documentNode.isEqualNode(this.documentNode);
+ }
+
+ @Override
+ public boolean isDocumentNode() {
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return this.documentNode.hashCode();
+ }
+
+ @Override
+ public int compareXmlNode(Item otherNode) {
+ int position = this.documentNode.compareDocumentPosition(otherNode.getXmlNode());
+ if ((position & Node.DOCUMENT_POSITION_FOLLOWING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0) {
+ return -1;
+ } else if (
+ (position & Node.DOCUMENT_POSITION_PRECEDING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINS) > 0
+ ) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
+ public Node getXmlNode() {
+ return this.documentNode;
+ }
+
+ @Override
+ public Item typedValue() {
+ return ItemFactory.getInstance().createStringItem(this.documentNode.getNodeValue());
+ }
+}
diff --git a/src/main/java/org/rumbledb/items/xml/ElementItem.java b/src/main/java/org/rumbledb/items/xml/ElementItem.java
new file mode 100644
index 0000000000..0872e42e41
--- /dev/null
+++ b/src/main/java/org/rumbledb/items/xml/ElementItem.java
@@ -0,0 +1,143 @@
+package org.rumbledb.items.xml;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import org.rumbledb.api.Item;
+import org.rumbledb.items.ItemFactory;
+import org.rumbledb.types.BuiltinTypesCatalogue;
+import org.rumbledb.types.ItemType;
+import org.w3c.dom.Node;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ElementItem implements Item {
+ private static final long serialVersionUID = 1L;
+ private List
- children;
+ private List
- attributes;
+ private Node elementNode;
+ private Item parent;
+ // TODO: add base-uri, schema-type, namespaces, is-id, is-idrefs
+
+ public ElementItem(Node elementNode, List
- children, List
- attributes) {
+ this.elementNode = elementNode;
+ this.children = children;
+ this.attributes = attributes;
+ }
+
+ @Override
+ public void addParentToDescendants() {
+ this.children.forEach(child -> child.setParent(this));
+ this.attributes.forEach(attribute -> attribute.setParent(this));
+ }
+
+ @Override
+ public void write(Kryo kryo, Output output) {
+ kryo.writeObject(output, this.elementNode);
+ kryo.writeObject(output, this.children);
+ kryo.writeObject(output, this.attributes);
+ kryo.writeObject(output, this.parent);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void read(Kryo kryo, Input input) {
+ this.elementNode = kryo.readObject(input, Node.class);
+ this.children = kryo.readObject(input, ArrayList.class);
+ this.attributes = kryo.readObject(input, ArrayList.class);
+ this.parent = kryo.readObject(input, Item.class);
+ }
+
+ @Override
+ public boolean isElementNode() {
+ return true;
+ }
+
+
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof ElementItem)) {
+ return false;
+ }
+ ElementItem otherElementItem = (ElementItem) other;
+ return otherElementItem.elementNode.isEqualNode(this.elementNode);
+ }
+
+ @Override
+ public List
- attributes() {
+ return this.attributes;
+ }
+
+ @Override
+ public List
- children() {
+ return this.children;
+ }
+
+ // TODO: may require more checks to comply with the specification using typing.
+ @Override
+ public boolean nilled() {
+ return false;
+ }
+
+ @Override
+ public String nodeKind() {
+ return "element";
+ }
+
+ @Override
+ public String nodeName() {
+ return this.elementNode.getNodeName();
+ }
+
+ @Override
+ public Item parent() {
+ return this.parent;
+ }
+
+
+ @Override
+ public String stringValue() {
+ return this.elementNode.getTextContent();
+ }
+
+ @Override
+ public ItemType getDynamicType() {
+ return BuiltinTypesCatalogue.item;
+ }
+
+ @Override
+ public void setParent(Item parent) {
+ this.parent = parent;
+ }
+
+ @Override
+ public int hashCode() {
+ return this.elementNode.hashCode();
+ }
+
+ @Override
+ public int compareXmlNode(Item otherNode) {
+ int position = this.elementNode.compareDocumentPosition(otherNode.getXmlNode());
+ if ((position & Node.DOCUMENT_POSITION_FOLLOWING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0) {
+ return -1;
+ } else if (
+ (position & Node.DOCUMENT_POSITION_PRECEDING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINS) > 0
+ ) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
+ public Node getXmlNode() {
+ return this.elementNode;
+ }
+
+ @Override
+ public Item typedValue() {
+ return ItemFactory.getInstance().createStringItem(this.elementNode.getTextContent());
+ }
+}
diff --git a/src/main/java/org/rumbledb/items/xml/TextItem.java b/src/main/java/org/rumbledb/items/xml/TextItem.java
new file mode 100644
index 0000000000..2f8a03af68
--- /dev/null
+++ b/src/main/java/org/rumbledb/items/xml/TextItem.java
@@ -0,0 +1,123 @@
+package org.rumbledb.items.xml;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import org.rumbledb.api.Item;
+import org.rumbledb.items.ItemFactory;
+import org.rumbledb.types.BuiltinTypesCatalogue;
+import org.rumbledb.types.ItemType;
+import org.w3c.dom.Node;
+
+public class TextItem implements Item {
+ private static final long serialVersionUID = 1L;
+ private Node textNode;
+ private Item parent;
+
+ public TextItem() {
+ super();
+ }
+
+ public TextItem(Node textNode) {
+ super();
+ this.textNode = textNode;
+ }
+
+ @Override
+ public void setParent(Item parent) {
+ this.parent = parent;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof TextItem)) {
+ return false;
+ }
+ TextItem otherTextItem = (TextItem) other;
+ return otherTextItem.textNode.isEqualNode(this.textNode);
+ }
+
+ @Override
+ public String getTextValue() {
+ return this.textNode.getNodeValue();
+ }
+
+ public boolean getEffectiveBooleanValue() {
+ return !this.getTextValue().isEmpty();
+ }
+
+ @Override
+ public void write(Kryo kryo, Output output) {
+ kryo.writeObject(output, this.textNode);
+ kryo.writeObject(output, this.parent);
+ }
+
+ @Override
+ public void read(Kryo kryo, Input input) {
+ this.textNode = kryo.readObject(input, Node.class);
+ this.parent = kryo.readObject(input, Item.class);
+ }
+
+ public int hashCode() {
+ return this.textNode.hashCode();
+ }
+
+ @Override
+ public boolean nilled() {
+ return false;
+ }
+
+ @Override
+ public String nodeKind() {
+ return "text";
+ }
+
+ @Override
+ public String stringValue() {
+ return this.textNode.getTextContent();
+ }
+
+ @Override
+ public Item parent() {
+ return this.parent;
+ }
+
+ @Override
+ public ItemType getDynamicType() {
+ return BuiltinTypesCatalogue.item;
+ }
+
+ @Override
+ public boolean isTextNode() {
+ return true;
+ }
+
+ @Override
+ public String nodeName() {
+ return "";
+ }
+
+ @Override
+ public int compareXmlNode(Item otherNode) {
+ int position = this.textNode.compareDocumentPosition(otherNode.getXmlNode());
+ if ((position & Node.DOCUMENT_POSITION_FOLLOWING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0) {
+ return -1;
+ } else if (
+ (position & Node.DOCUMENT_POSITION_PRECEDING) > 0 || (position & Node.DOCUMENT_POSITION_CONTAINS) > 0
+ ) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
+ public Node getXmlNode() {
+ return this.textNode;
+ }
+
+ @Override
+ public Item typedValue() {
+ return ItemFactory.getInstance().createStringItem(this.textNode.getNodeValue());
+ }
+}
diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.g4 b/src/main/java/org/rumbledb/parser/Jsoniq.g4
index 34dedea4e8..490821edd7 100644
--- a/src/main/java/org/rumbledb/parser/Jsoniq.g4
+++ b/src/main/java/org/rumbledb/parser/Jsoniq.g4
@@ -265,7 +265,7 @@ validateExpr : Kvalidate Ktype sequenceType '{' expr '}';
annotateExpr : Kannotate Ktype sequenceType '{' expr '}';
-simpleMapExpr : main_expr=postFixExpr ('!' map_expr+=postFixExpr)*;
+simpleMapExpr : main_expr=pathExpr ('!' map_expr+=pathExpr)*;
postFixExpr : main_expr=primaryExpr (arrayLookup | predicate | objectLookup | arrayUnboxing | argumentList)*;
@@ -342,6 +342,109 @@ copyDecl : var_ref=varRef ':=' src_expr=exprSingle;
// TODO: Direct element constructors
+
+///////////////////////// XPath
+
+// PATHS ///////////////////////////////////////////////////////////////////////
+
+pathExpr: (Kslash singleslash=relativePathExpr?) | (Kdslash doubleslash=relativePathExpr) | relative=relativePathExpr ;
+
+relativePathExpr: stepExpr (sep+=(Kslash|Kdslash) stepExpr)* ;
+
+stepExpr: postFixExpr | axisStep ;
+
+axisStep: (reverseStep | forwardStep) predicateList ;
+
+forwardStep: (forwardAxis nodeTest) | abbrevForwardStep ;
+
+forwardAxis: ( Kchild
+ | Kdescendant
+ | Kattribute
+ | Kself
+ | Kdescendant_or_self
+ | Kfollowing_sibling
+ | Kfollowing ) ':' ':' ;
+
+abbrevForwardStep: Kat_symbol nodeTest ;
+
+reverseStep: (reverseAxis nodeTest) | abbrevReverseStep ;
+
+reverseAxis: ( Kparent
+ | Kancestor
+ | Kpreceding_sibling
+ | Kpreceding
+ | Kancestor_or_self ) ':' ':';
+
+abbrevReverseStep: '..' ;
+
+// Causes issues
+nodeTest: nameTest | kindTest ;
+
+//nodeTest: kindTest;
+
+nameTest: qname | wildcard ;
+
+wildcard: '*' # allNames
+ | nCNameWithLocalWildcard # allWithNS // walkers must strip out the trailing :*
+ | nCNameWithPrefixWildcard # allWithLocal // walkers must strip out the leading *:
+ ;
+nCNameWithLocalWildcard : NCName ':' '*' ;
+nCNameWithPrefixWildcard: '*' ':' NCName ;
+
+
+predicateList: predicate*;
+
+kindTest: documentTest
+ | elementTest
+ | attributeTest
+ | schemaElementTest
+ | schemaAttributeTest
+ | piTest
+ | commentTest
+ | textTest
+ | namespaceNodeTest
+ | binaryNodeTest
+ | anyKindTest
+ ;
+
+anyKindTest: Knode '(' ')' ;
+
+binaryNodeTest: Kbinary '(' ')' ;
+
+documentTest: Kdocument_node '(' (elementTest | schemaElementTest)? ')' ;
+
+textTest: Ktext '(' ')' ;
+
+commentTest: Kcomment '(' ')' ;
+
+namespaceNodeTest: Knamespace_node '(' ')' ;
+
+piTest: Kpi '(' (NCName | stringLiteral)? ')' ;
+
+attributeTest: Kattribute '(' (attributeNameOrWildcard (',' type=typeName)?)? ')' ;
+
+attributeNameOrWildcard: attributeName | '*' ;
+
+schemaAttributeTest: Kschema_attribute '(' attributeDeclaration ')' ;
+
+attributeDeclaration: attributeName ;
+
+elementTest: Kelement '(' (elementNameOrWildcard (',' type=typeName optional='?'?)?)? ')' ;
+
+elementNameOrWildcard: elementName | '*' ;
+
+schemaElementTest: Kschema_element '(' elementDeclaration ')' ;
+
+elementDeclaration: elementName ;
+
+attributeName: qname ;
+
+elementName: qname ;
+
+simpleTypeName: typeName ;
+
+typeName: qname;
+
///////////////////////// Types
sequenceType : '(' ')'
@@ -579,6 +682,43 @@ Kwith : 'with';
Kposition : 'position';
+
+///////////////////////// XPath
+Kimport : 'import';
+Kschema : 'schema';
+Knamespace : 'namespace';
+Kelement : 'element';
+Kslash : '/';
+Kdslash : '//';
+Kat_symbol : '@';
+Kchild : 'child';
+Kdescendant : 'descendant';
+Kattribute : 'attribute';
+Kself : 'self';
+Kdescendant_or_self : 'descendant-or-self';
+Kfollowing_sibling : 'following-sibling';
+Kfollowing : 'following';
+Kparent : 'parent';
+Kancestor : 'ancestor';
+Kpreceding_sibling : 'preceding-sibling';
+Kpreceding : 'preceding';
+Kancestor_or_self : 'ancestor-or-self';
+Knode : 'node';
+Kbinary : 'binary';
+Kdocument : 'document';
+Kdocument_node : 'document-node';
+Ktext : 'text';
+Kpi : 'processing-instruction';
+Knamespace_node : 'namespace-node';
+Kschema_attribute : 'schema-attribute';
+Kschema_element : 'schema-element';
+Karray_node : 'array-node';
+Kboolean_node : 'boolean-node';
+Knull_node : 'null-node';
+Knumber_node : 'number-node';
+Kobject_node : 'object-node';
+Kcomment : 'comment';
+
///////////////////////// Scripting keywords
Kbreak : 'break' ;
Kloop : 'loop' ;
diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.interp b/src/main/java/org/rumbledb/parser/Jsoniq.interp
index 7f0f9de695..c467abd2df 100644
--- a/src/main/java/org/rumbledb/parser/Jsoniq.interp
+++ b/src/main/java/org/rumbledb/parser/Jsoniq.interp
@@ -2,7 +2,6 @@ token literal names:
null
';'
'module'
-'namespace'
'='
'$'
':='
@@ -28,13 +27,11 @@ null
'zero-digit'
'digit'
'pattern-separator'
-'import'
'external'
'function'
'jsound'
'compact'
'verbose'
-'schema'
'eq'
'ne'
'lt'
@@ -58,6 +55,7 @@ null
'.'
'$$'
'#'
+'..'
'{|'
'|}'
'for'
@@ -126,6 +124,40 @@ null
'json'
'with'
'position'
+'import'
+'schema'
+'namespace'
+'element'
+'/'
+'//'
+'@'
+'child'
+'descendant'
+'attribute'
+'self'
+'descendant-or-self'
+'following-sibling'
+'following'
+'parent'
+'ancestor'
+'preceding-sibling'
+'preceding'
+'ancestor-or-self'
+'node'
+'binary'
+'document'
+'document-node'
+'text'
+'processing-instruction'
+'namespace-node'
+'schema-attribute'
+'schema-element'
+'array-node'
+'boolean-node'
+'null-node'
+'number-node'
+'object-node'
+'comment'
'break'
'loop'
'continue'
@@ -205,8 +237,6 @@ null
null
null
null
-null
-null
Kfor
Klet
Kwhere
@@ -273,6 +303,40 @@ Kvalue
Kjson
Kwith
Kposition
+Kimport
+Kschema
+Knamespace
+Kelement
+Kslash
+Kdslash
+Kat_symbol
+Kchild
+Kdescendant
+Kattribute
+Kself
+Kdescendant_or_self
+Kfollowing_sibling
+Kfollowing
+Kparent
+Kancestor
+Kpreceding_sibling
+Kpreceding
+Kancestor_or_self
+Knode
+Kbinary
+Kdocument
+Kdocument_node
+Ktext
+Kpi
+Knamespace_node
+Kschema_attribute
+Kschema_element
+Karray_node
+Kboolean_node
+Knull_node
+Knumber_node
+Kobject_node
+Kcomment
Kbreak
Kloop
Kcontinue
@@ -408,6 +472,42 @@ transformExpr
appendExpr
updateLocator
copyDecl
+pathExpr
+relativePathExpr
+stepExpr
+axisStep
+forwardStep
+forwardAxis
+abbrevForwardStep
+reverseStep
+reverseAxis
+abbrevReverseStep
+nodeTest
+nameTest
+wildcard
+nCNameWithLocalWildcard
+nCNameWithPrefixWildcard
+predicateList
+kindTest
+anyKindTest
+binaryNodeTest
+documentTest
+textTest
+commentTest
+namespaceNodeTest
+piTest
+attributeTest
+attributeNameOrWildcard
+schemaAttributeTest
+attributeDeclaration
+elementTest
+elementNameOrWildcard
+schemaElementTest
+elementDeclaration
+attributeName
+elementName
+simpleTypeName
+typeName
sequenceType
objectConstructor
itemType
@@ -423,4 +523,4 @@ keyWords
atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 146, 1346, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 265, 10, 3, 3, 3, 3, 3, 5, 3, 269, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 285, 10, 6, 3, 6, 3, 6, 7, 6, 289, 10, 6, 12, 6, 14, 6, 292, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 297, 10, 6, 12, 6, 14, 6, 300, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 305, 10, 8, 12, 8, 14, 8, 308, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 315, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 330, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 360, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 368, 10, 18, 12, 18, 14, 18, 371, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 390, 10, 20, 13, 20, 14, 20, 391, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 400, 10, 21, 13, 21, 14, 21, 401, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 410, 10, 22, 13, 22, 14, 22, 411, 3, 23, 3, 23, 3, 23, 5, 23, 417, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 422, 10, 23, 7, 23, 424, 10, 23, 12, 23, 14, 23, 427, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 436, 10, 24, 13, 24, 14, 24, 437, 3, 24, 3, 24, 5, 24, 442, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 451, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 456, 10, 25, 12, 25, 14, 25, 459, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 470, 10, 26, 12, 26, 14, 26, 473, 11, 26, 3, 26, 5, 26, 476, 10, 26, 3, 27, 7, 27, 479, 10, 27, 12, 27, 14, 27, 482, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 489, 10, 28, 12, 28, 14, 28, 492, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 499, 10, 29, 3, 29, 3, 29, 5, 29, 503, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 515, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 527, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 549, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 555, 10, 37, 12, 37, 14, 37, 558, 11, 37, 3, 38, 3, 38, 5, 38, 562, 10, 38, 3, 38, 5, 38, 565, 10, 38, 3, 38, 3, 38, 5, 38, 569, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 578, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 585, 10, 40, 12, 40, 14, 40, 588, 11, 40, 5, 40, 590, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 598, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 605, 10, 41, 5, 41, 607, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 614, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 621, 10, 42, 5, 42, 623, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 631, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 636, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 643, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 650, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 660, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 665, 10, 46, 12, 46, 14, 46, 668, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 674, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 679, 10, 48, 12, 48, 14, 48, 682, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 690, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 700, 10, 50, 3, 51, 3, 51, 5, 51, 704, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 712, 10, 51, 12, 51, 14, 51, 715, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 724, 10, 52, 12, 52, 14, 52, 727, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 732, 10, 53, 3, 53, 3, 53, 5, 53, 736, 10, 53, 3, 53, 3, 53, 5, 53, 740, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 749, 10, 54, 12, 54, 14, 54, 752, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 757, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 770, 10, 57, 12, 57, 14, 57, 773, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 778, 10, 58, 3, 58, 3, 58, 5, 58, 782, 10, 58, 3, 58, 3, 58, 5, 58, 786, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 793, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 798, 10, 59, 12, 59, 14, 59, 801, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 806, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 811, 10, 60, 5, 60, 813, 10, 60, 3, 60, 3, 60, 5, 60, 817, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 824, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 829, 10, 62, 12, 62, 14, 62, 832, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 840, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 850, 10, 64, 13, 64, 14, 64, 851, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 860, 10, 65, 13, 65, 14, 65, 861, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 872, 10, 66, 13, 66, 14, 66, 873, 3, 66, 3, 66, 5, 66, 878, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 887, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 892, 10, 67, 12, 67, 14, 67, 895, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 914, 10, 69, 13, 69, 14, 69, 915, 3, 70, 3, 70, 3, 70, 5, 70, 921, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 926, 10, 70, 7, 70, 928, 10, 70, 12, 70, 14, 70, 931, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 940, 10, 71, 12, 71, 14, 71, 943, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 948, 10, 72, 12, 72, 14, 72, 951, 11, 72, 3, 73, 5, 73, 954, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 961, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 966, 10, 75, 12, 75, 14, 75, 969, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 974, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 979, 10, 77, 12, 77, 14, 77, 982, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 987, 10, 78, 12, 78, 14, 78, 990, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 996, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1002, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1008, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1014, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1020, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1029, 10, 84, 12, 84, 14, 84, 1032, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1037, 10, 85, 3, 86, 7, 86, 1040, 10, 86, 12, 86, 14, 86, 1043, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1050, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1069, 10, 90, 12, 90, 14, 90, 1072, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1080, 10, 91, 12, 91, 14, 91, 1083, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1105, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1122, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1133, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1155, 10, 104, 7, 104, 1157, 10, 104, 12, 104, 14, 104, 1160, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1166, 10, 105, 3, 106, 3, 106, 5, 106, 1170, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1180, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1185, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1199, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1206, 10, 109, 12, 109, 14, 109, 1209, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1214, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1238, 10, 113, 12, 113, 14, 113, 1241, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1257, 10, 115, 13, 115, 14, 115, 1258, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 5, 117, 1271, 10, 117, 5, 117, 1273, 10, 117, 3, 118, 3, 118, 3, 118, 3, 118, 7, 118, 1279, 10, 118, 12, 118, 14, 118, 1282, 11, 118, 5, 118, 1284, 10, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 5, 118, 1291, 10, 118, 3, 119, 3, 119, 3, 119, 5, 119, 1296, 10, 119, 3, 120, 3, 120, 5, 120, 1300, 10, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 7, 122, 1312, 10, 122, 12, 122, 14, 122, 1315, 11, 122, 5, 122, 1317, 10, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 5, 123, 1325, 10, 123, 3, 124, 3, 124, 5, 124, 1329, 10, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 5, 125, 1336, 10, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 2, 2, 129, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 2, 10, 4, 2, 18, 18, 107, 107, 3, 2, 84, 85, 3, 2, 21, 30, 4, 2, 6, 6, 38, 48, 3, 2, 50, 51, 4, 2, 13, 13, 52, 54, 4, 2, 20, 20, 136, 136, 4, 2, 63, 134, 137, 137, 2, 1411, 2, 256, 3, 2, 2, 2, 4, 264, 3, 2, 2, 2, 6, 270, 3, 2, 2, 2, 8, 273, 3, 2, 2, 2, 10, 290, 3, 2, 2, 2, 12, 301, 3, 2, 2, 2, 14, 306, 3, 2, 2, 2, 16, 309, 3, 2, 2, 2, 18, 312, 3, 2, 2, 2, 20, 329, 3, 2, 2, 2, 22, 331, 3, 2, 2, 2, 24, 334, 3, 2, 2, 2, 26, 340, 3, 2, 2, 2, 28, 344, 3, 2, 2, 2, 30, 348, 3, 2, 2, 2, 32, 352, 3, 2, 2, 2, 34, 359, 3, 2, 2, 2, 36, 375, 3, 2, 2, 2, 38, 384, 3, 2, 2, 2, 40, 399, 3, 2, 2, 2, 42, 406, 3, 2, 2, 2, 44, 413, 3, 2, 2, 2, 46, 430, 3, 2, 2, 2, 48, 446, 3, 2, 2, 2, 50, 463, 3, 2, 2, 2, 52, 480, 3, 2, 2, 2, 54, 483, 3, 2, 2, 2, 56, 495, 3, 2, 2, 2, 58, 504, 3, 2, 2, 2, 60, 514, 3, 2, 2, 2, 62, 516, 3, 2, 2, 2, 64, 526, 3, 2, 2, 2, 66, 528, 3, 2, 2, 2, 68, 533, 3, 2, 2, 2, 70, 537, 3, 2, 2, 2, 72, 543, 3, 2, 2, 2, 74, 564, 3, 2, 2, 2, 76, 570, 3, 2, 2, 2, 78, 572, 3, 2, 2, 2, 80, 591, 3, 2, 2, 2, 82, 608, 3, 2, 2, 2, 84, 624, 3, 2, 2, 2, 86, 644, 3, 2, 2, 2, 88, 659, 3, 2, 2, 2, 90, 661, 3, 2, 2, 2, 92, 669, 3, 2, 2, 2, 94, 675, 3, 2, 2, 2, 96, 689, 3, 2, 2, 2, 98, 699, 3, 2, 2, 2, 100, 703, 3, 2, 2, 2, 102, 719, 3, 2, 2, 2, 104, 728, 3, 2, 2, 2, 106, 744, 3, 2, 2, 2, 108, 753, 3, 2, 2, 2, 110, 761, 3, 2, 2, 2, 112, 764, 3, 2, 2, 2, 114, 774, 3, 2, 2, 2, 116, 792, 3, 2, 2, 2, 118, 802, 3, 2, 2, 2, 120, 818, 3, 2, 2, 2, 122, 823, 3, 2, 2, 2, 124, 836, 3, 2, 2, 2, 126, 844, 3, 2, 2, 2, 128, 859, 3, 2, 2, 2, 130, 866, 3, 2, 2, 2, 132, 882, 3, 2, 2, 2, 134, 899, 3, 2, 2, 2, 136, 908, 3, 2, 2, 2, 138, 917, 3, 2, 2, 2, 140, 936, 3, 2, 2, 2, 142, 944, 3, 2, 2, 2, 144, 953, 3, 2, 2, 2, 146, 957, 3, 2, 2, 2, 148, 962, 3, 2, 2, 2, 150, 970, 3, 2, 2, 2, 152, 975, 3, 2, 2, 2, 154, 983, 3, 2, 2, 2, 156, 991, 3, 2, 2, 2, 158, 997, 3, 2, 2, 2, 160, 1003, 3, 2, 2, 2, 162, 1009, 3, 2, 2, 2, 164, 1015, 3, 2, 2, 2, 166, 1021, 3, 2, 2, 2, 168, 1036, 3, 2, 2, 2, 170, 1041, 3, 2, 2, 2, 172, 1049, 3, 2, 2, 2, 174, 1051, 3, 2, 2, 2, 176, 1058, 3, 2, 2, 2, 178, 1065, 3, 2, 2, 2, 180, 1073, 3, 2, 2, 2, 182, 1084, 3, 2, 2, 2, 184, 1090, 3, 2, 2, 2, 186, 1093, 3, 2, 2, 2, 188, 1097, 3, 2, 2, 2, 190, 1121, 3, 2, 2, 2, 192, 1123, 3, 2, 2, 2, 194, 1127, 3, 2, 2, 2, 196, 1130, 3, 2, 2, 2, 198, 1136, 3, 2, 2, 2, 200, 1138, 3, 2, 2, 2, 202, 1143, 3, 2, 2, 2, 204, 1148, 3, 2, 2, 2, 206, 1151, 3, 2, 2, 2, 208, 1165, 3, 2, 2, 2, 210, 1169, 3, 2, 2, 2, 212, 1171, 3, 2, 2, 2, 214, 1175, 3, 2, 2, 2, 216, 1213, 3, 2, 2, 2, 218, 1215, 3, 2, 2, 2, 220, 1219, 3, 2, 2, 2, 222, 1225, 3, 2, 2, 2, 224, 1233, 3, 2, 2, 2, 226, 1247, 3, 2, 2, 2, 228, 1253, 3, 2, 2, 2, 230, 1260, 3, 2, 2, 2, 232, 1272, 3, 2, 2, 2, 234, 1290, 3, 2, 2, 2, 236, 1295, 3, 2, 2, 2, 238, 1299, 3, 2, 2, 2, 240, 1301, 3, 2, 2, 2, 242, 1306, 3, 2, 2, 2, 244, 1322, 3, 2, 2, 2, 246, 1328, 3, 2, 2, 2, 248, 1333, 3, 2, 2, 2, 250, 1339, 3, 2, 2, 2, 252, 1341, 3, 2, 2, 2, 254, 1343, 3, 2, 2, 2, 256, 257, 5, 4, 3, 2, 257, 258, 7, 2, 2, 3, 258, 3, 3, 2, 2, 2, 259, 260, 7, 106, 2, 2, 260, 261, 7, 105, 2, 2, 261, 262, 5, 252, 127, 2, 262, 263, 7, 3, 2, 2, 263, 265, 3, 2, 2, 2, 264, 259, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 269, 5, 8, 5, 2, 267, 269, 5, 6, 4, 2, 268, 266, 3, 2, 2, 2, 268, 267, 3, 2, 2, 2, 269, 5, 3, 2, 2, 2, 270, 271, 5, 10, 6, 2, 271, 272, 5, 12, 7, 2, 272, 7, 3, 2, 2, 2, 273, 274, 7, 4, 2, 2, 274, 275, 7, 5, 2, 2, 275, 276, 7, 144, 2, 2, 276, 277, 7, 6, 2, 2, 277, 278, 5, 250, 126, 2, 278, 279, 7, 3, 2, 2, 279, 280, 5, 10, 6, 2, 280, 9, 3, 2, 2, 2, 281, 285, 5, 60, 31, 2, 282, 285, 5, 62, 32, 2, 283, 285, 5, 78, 40, 2, 284, 281, 3, 2, 2, 2, 284, 282, 3, 2, 2, 2, 284, 283, 3, 2, 2, 2, 285, 286, 3, 2, 2, 2, 286, 287, 7, 3, 2, 2, 287, 289, 3, 2, 2, 2, 288, 284, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 288, 3, 2, 2, 2, 290, 291, 3, 2, 2, 2, 291, 298, 3, 2, 2, 2, 292, 290, 3, 2, 2, 2, 293, 294, 5, 64, 33, 2, 294, 295, 7, 3, 2, 2, 295, 297, 3, 2, 2, 2, 296, 293, 3, 2, 2, 2, 297, 300, 3, 2, 2, 2, 298, 296, 3, 2, 2, 2, 298, 299, 3, 2, 2, 2, 299, 11, 3, 2, 2, 2, 300, 298, 3, 2, 2, 2, 301, 302, 5, 18, 10, 2, 302, 13, 3, 2, 2, 2, 303, 305, 5, 20, 11, 2, 304, 303, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 15, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 309, 310, 5, 14, 8, 2, 310, 311, 5, 94, 48, 2, 311, 17, 3, 2, 2, 2, 312, 314, 5, 14, 8, 2, 313, 315, 5, 94, 48, 2, 314, 313, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 19, 3, 2, 2, 2, 316, 330, 5, 22, 12, 2, 317, 330, 5, 24, 13, 2, 318, 330, 5, 26, 14, 2, 319, 330, 5, 28, 15, 2, 320, 330, 5, 30, 16, 2, 321, 330, 5, 32, 17, 2, 322, 330, 5, 34, 18, 2, 323, 330, 5, 36, 19, 2, 324, 330, 5, 38, 20, 2, 325, 330, 5, 42, 22, 2, 326, 330, 5, 46, 24, 2, 327, 330, 5, 54, 28, 2, 328, 330, 5, 58, 30, 2, 329, 316, 3, 2, 2, 2, 329, 317, 3, 2, 2, 2, 329, 318, 3, 2, 2, 2, 329, 319, 3, 2, 2, 2, 329, 320, 3, 2, 2, 2, 329, 321, 3, 2, 2, 2, 329, 322, 3, 2, 2, 2, 329, 323, 3, 2, 2, 2, 329, 324, 3, 2, 2, 2, 329, 325, 3, 2, 2, 2, 329, 326, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 328, 3, 2, 2, 2, 330, 21, 3, 2, 2, 2, 331, 332, 5, 98, 50, 2, 332, 333, 7, 3, 2, 2, 333, 23, 3, 2, 2, 2, 334, 335, 7, 7, 2, 2, 335, 336, 5, 74, 38, 2, 336, 337, 7, 8, 2, 2, 337, 338, 5, 96, 49, 2, 338, 339, 7, 3, 2, 2, 339, 25, 3, 2, 2, 2, 340, 341, 7, 9, 2, 2, 341, 342, 5, 14, 8, 2, 342, 343, 7, 10, 2, 2, 343, 27, 3, 2, 2, 2, 344, 345, 7, 129, 2, 2, 345, 346, 7, 130, 2, 2, 346, 347, 7, 3, 2, 2, 347, 29, 3, 2, 2, 2, 348, 349, 7, 131, 2, 2, 349, 350, 7, 130, 2, 2, 350, 351, 7, 3, 2, 2, 351, 31, 3, 2, 2, 2, 352, 353, 7, 132, 2, 2, 353, 354, 7, 133, 2, 2, 354, 355, 5, 96, 49, 2, 355, 356, 7, 3, 2, 2, 356, 33, 3, 2, 2, 2, 357, 360, 5, 102, 52, 2, 358, 360, 5, 106, 54, 2, 359, 357, 3, 2, 2, 2, 359, 358, 3, 2, 2, 2, 360, 369, 3, 2, 2, 2, 361, 368, 5, 102, 52, 2, 362, 368, 5, 106, 54, 2, 363, 368, 5, 110, 56, 2, 364, 368, 5, 112, 57, 2, 365, 368, 5, 116, 59, 2, 366, 368, 5, 120, 61, 2, 367, 361, 3, 2, 2, 2, 367, 362, 3, 2, 2, 2, 367, 363, 3, 2, 2, 2, 367, 364, 3, 2, 2, 2, 367, 365, 3, 2, 2, 2, 367, 366, 3, 2, 2, 2, 368, 371, 3, 2, 2, 2, 369, 367, 3, 2, 2, 2, 369, 370, 3, 2, 2, 2, 370, 372, 3, 2, 2, 2, 371, 369, 3, 2, 2, 2, 372, 373, 7, 69, 2, 2, 373, 374, 5, 20, 11, 2, 374, 35, 3, 2, 2, 2, 375, 376, 7, 70, 2, 2, 376, 377, 7, 11, 2, 2, 377, 378, 5, 94, 48, 2, 378, 379, 7, 12, 2, 2, 379, 380, 7, 91, 2, 2, 380, 381, 5, 20, 11, 2, 381, 382, 7, 92, 2, 2, 382, 383, 5, 20, 11, 2, 383, 37, 3, 2, 2, 2, 384, 385, 7, 86, 2, 2, 385, 386, 7, 11, 2, 2, 386, 387, 5, 94, 48, 2, 387, 389, 7, 12, 2, 2, 388, 390, 5, 40, 21, 2, 389, 388, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 393, 3, 2, 2, 2, 393, 394, 7, 90, 2, 2, 394, 395, 7, 69, 2, 2, 395, 396, 5, 20, 11, 2, 396, 39, 3, 2, 2, 2, 397, 398, 7, 87, 2, 2, 398, 400, 5, 96, 49, 2, 399, 397, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 401, 402, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 404, 7, 69, 2, 2, 404, 405, 5, 20, 11, 2, 405, 41, 3, 2, 2, 2, 406, 407, 7, 88, 2, 2, 407, 409, 5, 26, 14, 2, 408, 410, 5, 44, 23, 2, 409, 408, 3, 2, 2, 2, 410, 411, 3, 2, 2, 2, 411, 409, 3, 2, 2, 2, 411, 412, 3, 2, 2, 2, 412, 43, 3, 2, 2, 2, 413, 416, 7, 89, 2, 2, 414, 417, 7, 13, 2, 2, 415, 417, 5, 74, 38, 2, 416, 414, 3, 2, 2, 2, 416, 415, 3, 2, 2, 2, 417, 425, 3, 2, 2, 2, 418, 421, 7, 14, 2, 2, 419, 422, 7, 13, 2, 2, 420, 422, 5, 74, 38, 2, 421, 419, 3, 2, 2, 2, 421, 420, 3, 2, 2, 2, 422, 424, 3, 2, 2, 2, 423, 418, 3, 2, 2, 2, 424, 427, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 428, 429, 5, 26, 14, 2, 429, 45, 3, 2, 2, 2, 430, 431, 7, 93, 2, 2, 431, 432, 7, 11, 2, 2, 432, 433, 5, 94, 48, 2, 433, 435, 7, 12, 2, 2, 434, 436, 5, 48, 25, 2, 435, 434, 3, 2, 2, 2, 436, 437, 3, 2, 2, 2, 437, 435, 3, 2, 2, 2, 437, 438, 3, 2, 2, 2, 438, 439, 3, 2, 2, 2, 439, 441, 7, 90, 2, 2, 440, 442, 5, 194, 98, 2, 441, 440, 3, 2, 2, 2, 441, 442, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 444, 7, 69, 2, 2, 444, 445, 5, 20, 11, 2, 445, 47, 3, 2, 2, 2, 446, 450, 7, 87, 2, 2, 447, 448, 5, 194, 98, 2, 448, 449, 7, 72, 2, 2, 449, 451, 3, 2, 2, 2, 450, 447, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 457, 5, 232, 117, 2, 453, 454, 7, 14, 2, 2, 454, 456, 5, 232, 117, 2, 455, 453, 3, 2, 2, 2, 456, 459, 3, 2, 2, 2, 457, 455, 3, 2, 2, 2, 457, 458, 3, 2, 2, 2, 458, 460, 3, 2, 2, 2, 459, 457, 3, 2, 2, 2, 460, 461, 7, 69, 2, 2, 461, 462, 5, 20, 11, 2, 462, 49, 3, 2, 2, 2, 463, 464, 7, 15, 2, 2, 464, 475, 5, 74, 38, 2, 465, 466, 7, 11, 2, 2, 466, 471, 7, 138, 2, 2, 467, 468, 7, 16, 2, 2, 468, 470, 7, 138, 2, 2, 469, 467, 3, 2, 2, 2, 470, 473, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 474, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 474, 476, 7, 12, 2, 2, 475, 465, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 51, 3, 2, 2, 2, 477, 479, 5, 50, 26, 2, 478, 477, 3, 2, 2, 2, 479, 482, 3, 2, 2, 2, 480, 478, 3, 2, 2, 2, 480, 481, 3, 2, 2, 2, 481, 53, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 483, 484, 5, 52, 27, 2, 484, 485, 7, 116, 2, 2, 485, 490, 5, 56, 29, 2, 486, 487, 7, 16, 2, 2, 487, 489, 5, 56, 29, 2, 488, 486, 3, 2, 2, 2, 489, 492, 3, 2, 2, 2, 490, 488, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 493, 3, 2, 2, 2, 492, 490, 3, 2, 2, 2, 493, 494, 7, 3, 2, 2, 494, 55, 3, 2, 2, 2, 495, 498, 5, 194, 98, 2, 496, 497, 7, 72, 2, 2, 497, 499, 5, 232, 117, 2, 498, 496, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 502, 3, 2, 2, 2, 500, 501, 7, 8, 2, 2, 501, 503, 5, 96, 49, 2, 502, 500, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 57, 3, 2, 2, 2, 504, 505, 7, 134, 2, 2, 505, 506, 7, 11, 2, 2, 506, 507, 5, 94, 48, 2, 507, 508, 7, 12, 2, 2, 508, 509, 5, 20, 11, 2, 509, 59, 3, 2, 2, 2, 510, 515, 5, 66, 34, 2, 511, 515, 5, 68, 35, 2, 512, 515, 5, 70, 36, 2, 513, 515, 5, 72, 37, 2, 514, 510, 3, 2, 2, 2, 514, 511, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 514, 513, 3, 2, 2, 2, 515, 61, 3, 2, 2, 2, 516, 517, 7, 113, 2, 2, 517, 518, 7, 5, 2, 2, 518, 519, 7, 144, 2, 2, 519, 520, 7, 6, 2, 2, 520, 521, 5, 250, 126, 2, 521, 63, 3, 2, 2, 2, 522, 527, 5, 84, 43, 2, 523, 527, 5, 80, 41, 2, 524, 527, 5, 86, 44, 2, 525, 527, 5, 82, 42, 2, 526, 522, 3, 2, 2, 2, 526, 523, 3, 2, 2, 2, 526, 524, 3, 2, 2, 2, 526, 525, 3, 2, 2, 2, 527, 65, 3, 2, 2, 2, 528, 529, 7, 113, 2, 2, 529, 530, 7, 90, 2, 2, 530, 531, 7, 83, 2, 2, 531, 532, 5, 250, 126, 2, 532, 67, 3, 2, 2, 2, 533, 534, 7, 113, 2, 2, 534, 535, 7, 17, 2, 2, 535, 536, 9, 2, 2, 2, 536, 69, 3, 2, 2, 2, 537, 538, 7, 113, 2, 2, 538, 539, 7, 90, 2, 2, 539, 540, 7, 68, 2, 2, 540, 541, 7, 75, 2, 2, 541, 542, 9, 3, 2, 2, 542, 71, 3, 2, 2, 2, 543, 548, 7, 113, 2, 2, 544, 545, 7, 19, 2, 2, 545, 549, 5, 74, 38, 2, 546, 547, 7, 90, 2, 2, 547, 549, 7, 19, 2, 2, 548, 544, 3, 2, 2, 2, 548, 546, 3, 2, 2, 2, 549, 556, 3, 2, 2, 2, 550, 551, 5, 76, 39, 2, 551, 552, 7, 6, 2, 2, 552, 553, 5, 252, 127, 2, 553, 555, 3, 2, 2, 2, 554, 550, 3, 2, 2, 2, 555, 558, 3, 2, 2, 2, 556, 554, 3, 2, 2, 2, 556, 557, 3, 2, 2, 2, 557, 73, 3, 2, 2, 2, 558, 556, 3, 2, 2, 2, 559, 562, 7, 144, 2, 2, 560, 562, 5, 254, 128, 2, 561, 559, 3, 2, 2, 2, 561, 560, 3, 2, 2, 2, 562, 563, 3, 2, 2, 2, 563, 565, 7, 20, 2, 2, 564, 561, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 568, 3, 2, 2, 2, 566, 569, 7, 144, 2, 2, 567, 569, 5, 254, 128, 2, 568, 566, 3, 2, 2, 2, 568, 567, 3, 2, 2, 2, 569, 75, 3, 2, 2, 2, 570, 571, 9, 4, 2, 2, 571, 77, 3, 2, 2, 2, 572, 573, 7, 31, 2, 2, 573, 577, 7, 4, 2, 2, 574, 575, 7, 5, 2, 2, 575, 576, 7, 144, 2, 2, 576, 578, 7, 6, 2, 2, 577, 574, 3, 2, 2, 2, 577, 578, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 589, 5, 250, 126, 2, 580, 581, 7, 73, 2, 2, 581, 586, 5, 250, 126, 2, 582, 583, 7, 16, 2, 2, 583, 585, 5, 250, 126, 2, 584, 582, 3, 2, 2, 2, 585, 588, 3, 2, 2, 2, 586, 584, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 590, 3, 2, 2, 2, 588, 586, 3, 2, 2, 2, 589, 580, 3, 2, 2, 2, 589, 590, 3, 2, 2, 2, 590, 79, 3, 2, 2, 2, 591, 592, 7, 113, 2, 2, 592, 593, 5, 52, 27, 2, 593, 594, 7, 116, 2, 2, 594, 597, 5, 194, 98, 2, 595, 596, 7, 72, 2, 2, 596, 598, 5, 232, 117, 2, 597, 595, 3, 2, 2, 2, 597, 598, 3, 2, 2, 2, 598, 606, 3, 2, 2, 2, 599, 600, 7, 8, 2, 2, 600, 607, 5, 96, 49, 2, 601, 604, 7, 32, 2, 2, 602, 603, 7, 8, 2, 2, 603, 605, 5, 96, 49, 2, 604, 602, 3, 2, 2, 2, 604, 605, 3, 2, 2, 2, 605, 607, 3, 2, 2, 2, 606, 599, 3, 2, 2, 2, 606, 601, 3, 2, 2, 2, 607, 81, 3, 2, 2, 2, 608, 609, 7, 113, 2, 2, 609, 610, 7, 114, 2, 2, 610, 613, 7, 115, 2, 2, 611, 612, 7, 72, 2, 2, 612, 614, 5, 232, 117, 2, 613, 611, 3, 2, 2, 2, 613, 614, 3, 2, 2, 2, 614, 622, 3, 2, 2, 2, 615, 616, 7, 8, 2, 2, 616, 623, 5, 96, 49, 2, 617, 620, 7, 32, 2, 2, 618, 619, 7, 8, 2, 2, 619, 621, 5, 96, 49, 2, 620, 618, 3, 2, 2, 2, 620, 621, 3, 2, 2, 2, 621, 623, 3, 2, 2, 2, 622, 615, 3, 2, 2, 2, 622, 617, 3, 2, 2, 2, 623, 83, 3, 2, 2, 2, 624, 625, 7, 113, 2, 2, 625, 626, 5, 52, 27, 2, 626, 627, 7, 33, 2, 2, 627, 628, 5, 74, 38, 2, 628, 630, 7, 11, 2, 2, 629, 631, 5, 90, 46, 2, 630, 629, 3, 2, 2, 2, 630, 631, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 635, 7, 12, 2, 2, 633, 634, 7, 72, 2, 2, 634, 636, 5, 232, 117, 2, 635, 633, 3, 2, 2, 2, 635, 636, 3, 2, 2, 2, 636, 642, 3, 2, 2, 2, 637, 638, 7, 9, 2, 2, 638, 639, 5, 18, 10, 2, 639, 640, 7, 10, 2, 2, 640, 643, 3, 2, 2, 2, 641, 643, 7, 32, 2, 2, 642, 637, 3, 2, 2, 2, 642, 641, 3, 2, 2, 2, 643, 85, 3, 2, 2, 2, 644, 645, 7, 113, 2, 2, 645, 646, 7, 110, 2, 2, 646, 647, 5, 74, 38, 2, 647, 649, 7, 72, 2, 2, 648, 650, 5, 88, 45, 2, 649, 648, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 652, 5, 96, 49, 2, 652, 87, 3, 2, 2, 2, 653, 654, 7, 34, 2, 2, 654, 660, 7, 35, 2, 2, 655, 656, 7, 34, 2, 2, 656, 660, 7, 36, 2, 2, 657, 658, 7, 126, 2, 2, 658, 660, 7, 37, 2, 2, 659, 653, 3, 2, 2, 2, 659, 655, 3, 2, 2, 2, 659, 657, 3, 2, 2, 2, 660, 89, 3, 2, 2, 2, 661, 666, 5, 92, 47, 2, 662, 663, 7, 16, 2, 2, 663, 665, 5, 92, 47, 2, 664, 662, 3, 2, 2, 2, 665, 668, 3, 2, 2, 2, 666, 664, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 91, 3, 2, 2, 2, 668, 666, 3, 2, 2, 2, 669, 670, 7, 7, 2, 2, 670, 673, 5, 74, 38, 2, 671, 672, 7, 72, 2, 2, 672, 674, 5, 232, 117, 2, 673, 671, 3, 2, 2, 2, 673, 674, 3, 2, 2, 2, 674, 93, 3, 2, 2, 2, 675, 680, 5, 96, 49, 2, 676, 677, 7, 16, 2, 2, 677, 679, 5, 96, 49, 2, 678, 676, 3, 2, 2, 2, 679, 682, 3, 2, 2, 2, 680, 678, 3, 2, 2, 2, 680, 681, 3, 2, 2, 2, 681, 95, 3, 2, 2, 2, 682, 680, 3, 2, 2, 2, 683, 690, 5, 98, 50, 2, 684, 690, 5, 100, 51, 2, 685, 690, 5, 126, 64, 2, 686, 690, 5, 130, 66, 2, 687, 690, 5, 134, 68, 2, 688, 690, 5, 136, 69, 2, 689, 683, 3, 2, 2, 2, 689, 684, 3, 2, 2, 2, 689, 685, 3, 2, 2, 2, 689, 686, 3, 2, 2, 2, 689, 687, 3, 2, 2, 2, 689, 688, 3, 2, 2, 2, 690, 97, 3, 2, 2, 2, 691, 700, 5, 122, 62, 2, 692, 700, 5, 140, 71, 2, 693, 700, 5, 216, 109, 2, 694, 700, 5, 218, 110, 2, 695, 700, 5, 220, 111, 2, 696, 700, 5, 222, 112, 2, 697, 700, 5, 224, 113, 2, 698, 700, 5, 226, 114, 2, 699, 691, 3, 2, 2, 2, 699, 692, 3, 2, 2, 2, 699, 693, 3, 2, 2, 2, 699, 694, 3, 2, 2, 2, 699, 695, 3, 2, 2, 2, 699, 696, 3, 2, 2, 2, 699, 697, 3, 2, 2, 2, 699, 698, 3, 2, 2, 2, 700, 99, 3, 2, 2, 2, 701, 704, 5, 102, 52, 2, 702, 704, 5, 106, 54, 2, 703, 701, 3, 2, 2, 2, 703, 702, 3, 2, 2, 2, 704, 713, 3, 2, 2, 2, 705, 712, 5, 102, 52, 2, 706, 712, 5, 106, 54, 2, 707, 712, 5, 110, 56, 2, 708, 712, 5, 112, 57, 2, 709, 712, 5, 116, 59, 2, 710, 712, 5, 120, 61, 2, 711, 705, 3, 2, 2, 2, 711, 706, 3, 2, 2, 2, 711, 707, 3, 2, 2, 2, 711, 708, 3, 2, 2, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 715, 3, 2, 2, 2, 713, 711, 3, 2, 2, 2, 713, 714, 3, 2, 2, 2, 714, 716, 3, 2, 2, 2, 715, 713, 3, 2, 2, 2, 716, 717, 7, 69, 2, 2, 717, 718, 5, 96, 49, 2, 718, 101, 3, 2, 2, 2, 719, 720, 7, 63, 2, 2, 720, 725, 5, 104, 53, 2, 721, 722, 7, 16, 2, 2, 722, 724, 5, 104, 53, 2, 723, 721, 3, 2, 2, 2, 724, 727, 3, 2, 2, 2, 725, 723, 3, 2, 2, 2, 725, 726, 3, 2, 2, 2, 726, 103, 3, 2, 2, 2, 727, 725, 3, 2, 2, 2, 728, 731, 5, 194, 98, 2, 729, 730, 7, 72, 2, 2, 730, 732, 5, 232, 117, 2, 731, 729, 3, 2, 2, 2, 731, 732, 3, 2, 2, 2, 732, 735, 3, 2, 2, 2, 733, 734, 7, 74, 2, 2, 734, 736, 7, 75, 2, 2, 735, 733, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 739, 3, 2, 2, 2, 737, 738, 7, 73, 2, 2, 738, 740, 5, 194, 98, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 742, 7, 71, 2, 2, 742, 743, 5, 96, 49, 2, 743, 105, 3, 2, 2, 2, 744, 745, 7, 64, 2, 2, 745, 750, 5, 108, 55, 2, 746, 747, 7, 16, 2, 2, 747, 749, 5, 108, 55, 2, 748, 746, 3, 2, 2, 2, 749, 752, 3, 2, 2, 2, 750, 748, 3, 2, 2, 2, 750, 751, 3, 2, 2, 2, 751, 107, 3, 2, 2, 2, 752, 750, 3, 2, 2, 2, 753, 756, 5, 194, 98, 2, 754, 755, 7, 72, 2, 2, 755, 757, 5, 232, 117, 2, 756, 754, 3, 2, 2, 2, 756, 757, 3, 2, 2, 2, 757, 758, 3, 2, 2, 2, 758, 759, 7, 8, 2, 2, 759, 760, 5, 96, 49, 2, 760, 109, 3, 2, 2, 2, 761, 762, 7, 65, 2, 2, 762, 763, 5, 96, 49, 2, 763, 111, 3, 2, 2, 2, 764, 765, 7, 66, 2, 2, 765, 766, 7, 67, 2, 2, 766, 771, 5, 114, 58, 2, 767, 768, 7, 16, 2, 2, 768, 770, 5, 114, 58, 2, 769, 767, 3, 2, 2, 2, 770, 773, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 771, 772, 3, 2, 2, 2, 772, 113, 3, 2, 2, 2, 773, 771, 3, 2, 2, 2, 774, 781, 5, 194, 98, 2, 775, 776, 7, 72, 2, 2, 776, 778, 5, 232, 117, 2, 777, 775, 3, 2, 2, 2, 777, 778, 3, 2, 2, 2, 778, 779, 3, 2, 2, 2, 779, 780, 7, 8, 2, 2, 780, 782, 5, 96, 49, 2, 781, 777, 3, 2, 2, 2, 781, 782, 3, 2, 2, 2, 782, 785, 3, 2, 2, 2, 783, 784, 7, 83, 2, 2, 784, 786, 5, 250, 126, 2, 785, 783, 3, 2, 2, 2, 785, 786, 3, 2, 2, 2, 786, 115, 3, 2, 2, 2, 787, 788, 7, 68, 2, 2, 788, 793, 7, 67, 2, 2, 789, 790, 7, 77, 2, 2, 790, 791, 7, 68, 2, 2, 791, 793, 7, 67, 2, 2, 792, 787, 3, 2, 2, 2, 792, 789, 3, 2, 2, 2, 793, 794, 3, 2, 2, 2, 794, 799, 5, 118, 60, 2, 795, 796, 7, 16, 2, 2, 796, 798, 5, 118, 60, 2, 797, 795, 3, 2, 2, 2, 798, 801, 3, 2, 2, 2, 799, 797, 3, 2, 2, 2, 799, 800, 3, 2, 2, 2, 800, 117, 3, 2, 2, 2, 801, 799, 3, 2, 2, 2, 802, 805, 5, 96, 49, 2, 803, 806, 7, 78, 2, 2, 804, 806, 7, 79, 2, 2, 805, 803, 3, 2, 2, 2, 805, 804, 3, 2, 2, 2, 805, 806, 3, 2, 2, 2, 806, 812, 3, 2, 2, 2, 807, 810, 7, 75, 2, 2, 808, 811, 7, 84, 2, 2, 809, 811, 7, 85, 2, 2, 810, 808, 3, 2, 2, 2, 810, 809, 3, 2, 2, 2, 811, 813, 3, 2, 2, 2, 812, 807, 3, 2, 2, 2, 812, 813, 3, 2, 2, 2, 813, 816, 3, 2, 2, 2, 814, 815, 7, 83, 2, 2, 815, 817, 5, 250, 126, 2, 816, 814, 3, 2, 2, 2, 816, 817, 3, 2, 2, 2, 817, 119, 3, 2, 2, 2, 818, 819, 7, 76, 2, 2, 819, 820, 5, 194, 98, 2, 820, 121, 3, 2, 2, 2, 821, 824, 7, 80, 2, 2, 822, 824, 7, 81, 2, 2, 823, 821, 3, 2, 2, 2, 823, 822, 3, 2, 2, 2, 824, 825, 3, 2, 2, 2, 825, 830, 5, 124, 63, 2, 826, 827, 7, 16, 2, 2, 827, 829, 5, 124, 63, 2, 828, 826, 3, 2, 2, 2, 829, 832, 3, 2, 2, 2, 830, 828, 3, 2, 2, 2, 830, 831, 3, 2, 2, 2, 831, 833, 3, 2, 2, 2, 832, 830, 3, 2, 2, 2, 833, 834, 7, 82, 2, 2, 834, 835, 5, 96, 49, 2, 835, 123, 3, 2, 2, 2, 836, 839, 5, 194, 98, 2, 837, 838, 7, 72, 2, 2, 838, 840, 5, 232, 117, 2, 839, 837, 3, 2, 2, 2, 839, 840, 3, 2, 2, 2, 840, 841, 3, 2, 2, 2, 841, 842, 7, 71, 2, 2, 842, 843, 5, 96, 49, 2, 843, 125, 3, 2, 2, 2, 844, 845, 7, 86, 2, 2, 845, 846, 7, 11, 2, 2, 846, 847, 5, 94, 48, 2, 847, 849, 7, 12, 2, 2, 848, 850, 5, 128, 65, 2, 849, 848, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 851, 849, 3, 2, 2, 2, 851, 852, 3, 2, 2, 2, 852, 853, 3, 2, 2, 2, 853, 854, 7, 90, 2, 2, 854, 855, 7, 69, 2, 2, 855, 856, 5, 96, 49, 2, 856, 127, 3, 2, 2, 2, 857, 858, 7, 87, 2, 2, 858, 860, 5, 96, 49, 2, 859, 857, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 859, 3, 2, 2, 2, 861, 862, 3, 2, 2, 2, 862, 863, 3, 2, 2, 2, 863, 864, 7, 69, 2, 2, 864, 865, 5, 96, 49, 2, 865, 129, 3, 2, 2, 2, 866, 867, 7, 93, 2, 2, 867, 868, 7, 11, 2, 2, 868, 869, 5, 94, 48, 2, 869, 871, 7, 12, 2, 2, 870, 872, 5, 132, 67, 2, 871, 870, 3, 2, 2, 2, 872, 873, 3, 2, 2, 2, 873, 871, 3, 2, 2, 2, 873, 874, 3, 2, 2, 2, 874, 875, 3, 2, 2, 2, 875, 877, 7, 90, 2, 2, 876, 878, 5, 194, 98, 2, 877, 876, 3, 2, 2, 2, 877, 878, 3, 2, 2, 2, 878, 879, 3, 2, 2, 2, 879, 880, 7, 69, 2, 2, 880, 881, 5, 96, 49, 2, 881, 131, 3, 2, 2, 2, 882, 886, 7, 87, 2, 2, 883, 884, 5, 194, 98, 2, 884, 885, 7, 72, 2, 2, 885, 887, 3, 2, 2, 2, 886, 883, 3, 2, 2, 2, 886, 887, 3, 2, 2, 2, 887, 888, 3, 2, 2, 2, 888, 893, 5, 232, 117, 2, 889, 890, 7, 14, 2, 2, 890, 892, 5, 232, 117, 2, 891, 889, 3, 2, 2, 2, 892, 895, 3, 2, 2, 2, 893, 891, 3, 2, 2, 2, 893, 894, 3, 2, 2, 2, 894, 896, 3, 2, 2, 2, 895, 893, 3, 2, 2, 2, 896, 897, 7, 69, 2, 2, 897, 898, 5, 96, 49, 2, 898, 133, 3, 2, 2, 2, 899, 900, 7, 70, 2, 2, 900, 901, 7, 11, 2, 2, 901, 902, 5, 94, 48, 2, 902, 903, 7, 12, 2, 2, 903, 904, 7, 91, 2, 2, 904, 905, 5, 96, 49, 2, 905, 906, 7, 92, 2, 2, 906, 907, 5, 96, 49, 2, 907, 135, 3, 2, 2, 2, 908, 909, 7, 88, 2, 2, 909, 910, 7, 9, 2, 2, 910, 911, 5, 94, 48, 2, 911, 913, 7, 10, 2, 2, 912, 914, 5, 138, 70, 2, 913, 912, 3, 2, 2, 2, 914, 915, 3, 2, 2, 2, 915, 913, 3, 2, 2, 2, 915, 916, 3, 2, 2, 2, 916, 137, 3, 2, 2, 2, 917, 920, 7, 89, 2, 2, 918, 921, 7, 13, 2, 2, 919, 921, 5, 74, 38, 2, 920, 918, 3, 2, 2, 2, 920, 919, 3, 2, 2, 2, 921, 929, 3, 2, 2, 2, 922, 925, 7, 14, 2, 2, 923, 926, 7, 13, 2, 2, 924, 926, 5, 74, 38, 2, 925, 923, 3, 2, 2, 2, 925, 924, 3, 2, 2, 2, 926, 928, 3, 2, 2, 2, 927, 922, 3, 2, 2, 2, 928, 931, 3, 2, 2, 2, 929, 927, 3, 2, 2, 2, 929, 930, 3, 2, 2, 2, 930, 932, 3, 2, 2, 2, 931, 929, 3, 2, 2, 2, 932, 933, 7, 9, 2, 2, 933, 934, 5, 94, 48, 2, 934, 935, 7, 10, 2, 2, 935, 139, 3, 2, 2, 2, 936, 941, 5, 142, 72, 2, 937, 938, 7, 94, 2, 2, 938, 940, 5, 142, 72, 2, 939, 937, 3, 2, 2, 2, 940, 943, 3, 2, 2, 2, 941, 939, 3, 2, 2, 2, 941, 942, 3, 2, 2, 2, 942, 141, 3, 2, 2, 2, 943, 941, 3, 2, 2, 2, 944, 949, 5, 144, 73, 2, 945, 946, 7, 95, 2, 2, 946, 948, 5, 144, 73, 2, 947, 945, 3, 2, 2, 2, 948, 951, 3, 2, 2, 2, 949, 947, 3, 2, 2, 2, 949, 950, 3, 2, 2, 2, 950, 143, 3, 2, 2, 2, 951, 949, 3, 2, 2, 2, 952, 954, 7, 96, 2, 2, 953, 952, 3, 2, 2, 2, 953, 954, 3, 2, 2, 2, 954, 955, 3, 2, 2, 2, 955, 956, 5, 146, 74, 2, 956, 145, 3, 2, 2, 2, 957, 960, 5, 148, 75, 2, 958, 959, 9, 5, 2, 2, 959, 961, 5, 148, 75, 2, 960, 958, 3, 2, 2, 2, 960, 961, 3, 2, 2, 2, 961, 147, 3, 2, 2, 2, 962, 967, 5, 150, 76, 2, 963, 964, 7, 49, 2, 2, 964, 966, 5, 150, 76, 2, 965, 963, 3, 2, 2, 2, 966, 969, 3, 2, 2, 2, 967, 965, 3, 2, 2, 2, 967, 968, 3, 2, 2, 2, 968, 149, 3, 2, 2, 2, 969, 967, 3, 2, 2, 2, 970, 973, 5, 152, 77, 2, 971, 972, 7, 97, 2, 2, 972, 974, 5, 152, 77, 2, 973, 971, 3, 2, 2, 2, 973, 974, 3, 2, 2, 2, 974, 151, 3, 2, 2, 2, 975, 980, 5, 154, 78, 2, 976, 977, 9, 6, 2, 2, 977, 979, 5, 154, 78, 2, 978, 976, 3, 2, 2, 2, 979, 982, 3, 2, 2, 2, 980, 978, 3, 2, 2, 2, 980, 981, 3, 2, 2, 2, 981, 153, 3, 2, 2, 2, 982, 980, 3, 2, 2, 2, 983, 988, 5, 156, 79, 2, 984, 985, 9, 7, 2, 2, 985, 987, 5, 156, 79, 2, 986, 984, 3, 2, 2, 2, 987, 990, 3, 2, 2, 2, 988, 986, 3, 2, 2, 2, 988, 989, 3, 2, 2, 2, 989, 155, 3, 2, 2, 2, 990, 988, 3, 2, 2, 2, 991, 995, 5, 158, 80, 2, 992, 993, 7, 98, 2, 2, 993, 994, 7, 99, 2, 2, 994, 996, 5, 232, 117, 2, 995, 992, 3, 2, 2, 2, 995, 996, 3, 2, 2, 2, 996, 157, 3, 2, 2, 2, 997, 1001, 5, 160, 81, 2, 998, 999, 7, 101, 2, 2, 999, 1000, 7, 100, 2, 2, 1000, 1002, 5, 232, 117, 2, 1001, 998, 3, 2, 2, 2, 1001, 1002, 3, 2, 2, 2, 1002, 159, 3, 2, 2, 2, 1003, 1007, 5, 162, 82, 2, 1004, 1005, 7, 102, 2, 2, 1005, 1006, 7, 72, 2, 2, 1006, 1008, 5, 232, 117, 2, 1007, 1004, 3, 2, 2, 2, 1007, 1008, 3, 2, 2, 2, 1008, 161, 3, 2, 2, 2, 1009, 1013, 5, 164, 83, 2, 1010, 1011, 7, 104, 2, 2, 1011, 1012, 7, 72, 2, 2, 1012, 1014, 5, 244, 123, 2, 1013, 1010, 3, 2, 2, 2, 1013, 1014, 3, 2, 2, 2, 1014, 163, 3, 2, 2, 2, 1015, 1019, 5, 166, 84, 2, 1016, 1017, 7, 103, 2, 2, 1017, 1018, 7, 72, 2, 2, 1018, 1020, 5, 244, 123, 2, 1019, 1016, 3, 2, 2, 2, 1019, 1020, 3, 2, 2, 2, 1020, 165, 3, 2, 2, 2, 1021, 1030, 5, 170, 86, 2, 1022, 1023, 7, 6, 2, 2, 1023, 1024, 7, 47, 2, 2, 1024, 1025, 3, 2, 2, 2, 1025, 1026, 5, 168, 85, 2, 1026, 1027, 5, 206, 104, 2, 1027, 1029, 3, 2, 2, 2, 1028, 1022, 3, 2, 2, 2, 1029, 1032, 3, 2, 2, 2, 1030, 1028, 3, 2, 2, 2, 1030, 1031, 3, 2, 2, 2, 1031, 167, 3, 2, 2, 2, 1032, 1030, 3, 2, 2, 2, 1033, 1037, 5, 74, 38, 2, 1034, 1037, 5, 194, 98, 2, 1035, 1037, 5, 196, 99, 2, 1036, 1033, 3, 2, 2, 2, 1036, 1034, 3, 2, 2, 2, 1036, 1035, 3, 2, 2, 2, 1037, 169, 3, 2, 2, 2, 1038, 1040, 9, 6, 2, 2, 1039, 1038, 3, 2, 2, 2, 1040, 1043, 3, 2, 2, 2, 1041, 1039, 3, 2, 2, 2, 1041, 1042, 3, 2, 2, 2, 1042, 1044, 3, 2, 2, 2, 1043, 1041, 3, 2, 2, 2, 1044, 1045, 5, 172, 87, 2, 1045, 171, 3, 2, 2, 2, 1046, 1050, 5, 178, 90, 2, 1047, 1050, 5, 174, 88, 2, 1048, 1050, 5, 176, 89, 2, 1049, 1046, 3, 2, 2, 2, 1049, 1047, 3, 2, 2, 2, 1049, 1048, 3, 2, 2, 2, 1050, 173, 3, 2, 2, 2, 1051, 1052, 7, 111, 2, 2, 1052, 1053, 7, 110, 2, 2, 1053, 1054, 5, 232, 117, 2, 1054, 1055, 7, 9, 2, 2, 1055, 1056, 5, 94, 48, 2, 1056, 1057, 7, 10, 2, 2, 1057, 175, 3, 2, 2, 2, 1058, 1059, 7, 112, 2, 2, 1059, 1060, 7, 110, 2, 2, 1060, 1061, 5, 232, 117, 2, 1061, 1062, 7, 9, 2, 2, 1062, 1063, 5, 94, 48, 2, 1063, 1064, 7, 10, 2, 2, 1064, 177, 3, 2, 2, 2, 1065, 1070, 5, 180, 91, 2, 1066, 1067, 7, 55, 2, 2, 1067, 1069, 5, 180, 91, 2, 1068, 1066, 3, 2, 2, 2, 1069, 1072, 3, 2, 2, 2, 1070, 1068, 3, 2, 2, 2, 1070, 1071, 3, 2, 2, 2, 1071, 179, 3, 2, 2, 2, 1072, 1070, 3, 2, 2, 2, 1073, 1081, 5, 190, 96, 2, 1074, 1080, 5, 182, 92, 2, 1075, 1080, 5, 186, 94, 2, 1076, 1080, 5, 188, 95, 2, 1077, 1080, 5, 184, 93, 2, 1078, 1080, 5, 206, 104, 2, 1079, 1074, 3, 2, 2, 2, 1079, 1075, 3, 2, 2, 2, 1079, 1076, 3, 2, 2, 2, 1079, 1077, 3, 2, 2, 2, 1079, 1078, 3, 2, 2, 2, 1080, 1083, 3, 2, 2, 2, 1081, 1079, 3, 2, 2, 2, 1081, 1082, 3, 2, 2, 2, 1082, 181, 3, 2, 2, 2, 1083, 1081, 3, 2, 2, 2, 1084, 1085, 7, 56, 2, 2, 1085, 1086, 7, 56, 2, 2, 1086, 1087, 5, 94, 48, 2, 1087, 1088, 7, 57, 2, 2, 1088, 1089, 7, 57, 2, 2, 1089, 183, 3, 2, 2, 2, 1090, 1091, 7, 56, 2, 2, 1091, 1092, 7, 57, 2, 2, 1092, 185, 3, 2, 2, 2, 1093, 1094, 7, 56, 2, 2, 1094, 1095, 5, 94, 48, 2, 1095, 1096, 7, 57, 2, 2, 1096, 187, 3, 2, 2, 2, 1097, 1104, 7, 58, 2, 2, 1098, 1105, 5, 254, 128, 2, 1099, 1105, 5, 252, 127, 2, 1100, 1105, 7, 144, 2, 2, 1101, 1105, 5, 196, 99, 2, 1102, 1105, 5, 194, 98, 2, 1103, 1105, 5, 198, 100, 2, 1104, 1098, 3, 2, 2, 2, 1104, 1099, 3, 2, 2, 2, 1104, 1100, 3, 2, 2, 2, 1104, 1101, 3, 2, 2, 2, 1104, 1102, 3, 2, 2, 2, 1104, 1103, 3, 2, 2, 2, 1105, 189, 3, 2, 2, 2, 1106, 1122, 7, 137, 2, 2, 1107, 1122, 7, 108, 2, 2, 1108, 1122, 7, 109, 2, 2, 1109, 1122, 7, 138, 2, 2, 1110, 1122, 5, 252, 127, 2, 1111, 1122, 5, 194, 98, 2, 1112, 1122, 5, 196, 99, 2, 1113, 1122, 5, 198, 100, 2, 1114, 1122, 5, 234, 118, 2, 1115, 1122, 5, 204, 103, 2, 1116, 1122, 5, 200, 101, 2, 1117, 1122, 5, 202, 102, 2, 1118, 1122, 5, 248, 125, 2, 1119, 1122, 5, 210, 106, 2, 1120, 1122, 5, 192, 97, 2, 1121, 1106, 3, 2, 2, 2, 1121, 1107, 3, 2, 2, 2, 1121, 1108, 3, 2, 2, 2, 1121, 1109, 3, 2, 2, 2, 1121, 1110, 3, 2, 2, 2, 1121, 1111, 3, 2, 2, 2, 1121, 1112, 3, 2, 2, 2, 1121, 1113, 3, 2, 2, 2, 1121, 1114, 3, 2, 2, 2, 1121, 1115, 3, 2, 2, 2, 1121, 1116, 3, 2, 2, 2, 1121, 1117, 3, 2, 2, 2, 1121, 1118, 3, 2, 2, 2, 1121, 1119, 3, 2, 2, 2, 1121, 1120, 3, 2, 2, 2, 1122, 191, 3, 2, 2, 2, 1123, 1124, 7, 9, 2, 2, 1124, 1125, 5, 16, 9, 2, 1125, 1126, 7, 10, 2, 2, 1126, 193, 3, 2, 2, 2, 1127, 1128, 7, 7, 2, 2, 1128, 1129, 5, 74, 38, 2, 1129, 195, 3, 2, 2, 2, 1130, 1132, 7, 11, 2, 2, 1131, 1133, 5, 94, 48, 2, 1132, 1131, 3, 2, 2, 2, 1132, 1133, 3, 2, 2, 2, 1133, 1134, 3, 2, 2, 2, 1134, 1135, 7, 12, 2, 2, 1135, 197, 3, 2, 2, 2, 1136, 1137, 7, 59, 2, 2, 1137, 199, 3, 2, 2, 2, 1138, 1139, 7, 18, 2, 2, 1139, 1140, 7, 9, 2, 2, 1140, 1141, 5, 94, 48, 2, 1141, 1142, 7, 10, 2, 2, 1142, 201, 3, 2, 2, 2, 1143, 1144, 7, 107, 2, 2, 1144, 1145, 7, 9, 2, 2, 1145, 1146, 5, 94, 48, 2, 1146, 1147, 7, 10, 2, 2, 1147, 203, 3, 2, 2, 2, 1148, 1149, 5, 74, 38, 2, 1149, 1150, 5, 206, 104, 2, 1150, 205, 3, 2, 2, 2, 1151, 1158, 7, 11, 2, 2, 1152, 1154, 5, 208, 105, 2, 1153, 1155, 7, 16, 2, 2, 1154, 1153, 3, 2, 2, 2, 1154, 1155, 3, 2, 2, 2, 1155, 1157, 3, 2, 2, 2, 1156, 1152, 3, 2, 2, 2, 1157, 1160, 3, 2, 2, 2, 1158, 1156, 3, 2, 2, 2, 1158, 1159, 3, 2, 2, 2, 1159, 1161, 3, 2, 2, 2, 1160, 1158, 3, 2, 2, 2, 1161, 1162, 7, 12, 2, 2, 1162, 207, 3, 2, 2, 2, 1163, 1166, 5, 96, 49, 2, 1164, 1166, 7, 136, 2, 2, 1165, 1163, 3, 2, 2, 2, 1165, 1164, 3, 2, 2, 2, 1166, 209, 3, 2, 2, 2, 1167, 1170, 5, 212, 107, 2, 1168, 1170, 5, 214, 108, 2, 1169, 1167, 3, 2, 2, 2, 1169, 1168, 3, 2, 2, 2, 1170, 211, 3, 2, 2, 2, 1171, 1172, 5, 74, 38, 2, 1172, 1173, 7, 60, 2, 2, 1173, 1174, 7, 138, 2, 2, 1174, 213, 3, 2, 2, 2, 1175, 1176, 5, 52, 27, 2, 1176, 1177, 7, 33, 2, 2, 1177, 1179, 7, 11, 2, 2, 1178, 1180, 5, 90, 46, 2, 1179, 1178, 3, 2, 2, 2, 1179, 1180, 3, 2, 2, 2, 1180, 1181, 3, 2, 2, 2, 1181, 1184, 7, 12, 2, 2, 1182, 1183, 7, 72, 2, 2, 1183, 1185, 5, 232, 117, 2, 1184, 1182, 3, 2, 2, 2, 1184, 1185, 3, 2, 2, 2, 1185, 1186, 3, 2, 2, 2, 1186, 1187, 7, 9, 2, 2, 1187, 1188, 5, 18, 10, 2, 1188, 1189, 7, 10, 2, 2, 1189, 215, 3, 2, 2, 2, 1190, 1191, 7, 117, 2, 2, 1191, 1192, 7, 126, 2, 2, 1192, 1193, 5, 96, 49, 2, 1193, 1194, 7, 124, 2, 2, 1194, 1198, 5, 96, 49, 2, 1195, 1196, 7, 73, 2, 2, 1196, 1197, 7, 128, 2, 2, 1197, 1199, 5, 96, 49, 2, 1198, 1195, 3, 2, 2, 2, 1198, 1199, 3, 2, 2, 2, 1199, 1214, 3, 2, 2, 2, 1200, 1201, 7, 117, 2, 2, 1201, 1202, 7, 126, 2, 2, 1202, 1207, 5, 246, 124, 2, 1203, 1204, 7, 16, 2, 2, 1204, 1206, 5, 246, 124, 2, 1205, 1203, 3, 2, 2, 2, 1206, 1209, 3, 2, 2, 2, 1207, 1205, 3, 2, 2, 2, 1207, 1208, 3, 2, 2, 2, 1208, 1210, 3, 2, 2, 2, 1209, 1207, 3, 2, 2, 2, 1210, 1211, 7, 124, 2, 2, 1211, 1212, 5, 96, 49, 2, 1212, 1214, 3, 2, 2, 2, 1213, 1190, 3, 2, 2, 2, 1213, 1200, 3, 2, 2, 2, 1214, 217, 3, 2, 2, 2, 1215, 1216, 7, 118, 2, 2, 1216, 1217, 7, 126, 2, 2, 1217, 1218, 5, 228, 115, 2, 1218, 219, 3, 2, 2, 2, 1219, 1220, 7, 119, 2, 2, 1220, 1221, 7, 126, 2, 2, 1221, 1222, 5, 228, 115, 2, 1222, 1223, 7, 72, 2, 2, 1223, 1224, 5, 96, 49, 2, 1224, 221, 3, 2, 2, 2, 1225, 1226, 7, 120, 2, 2, 1226, 1227, 7, 125, 2, 2, 1227, 1228, 7, 99, 2, 2, 1228, 1229, 7, 126, 2, 2, 1229, 1230, 5, 228, 115, 2, 1230, 1231, 7, 127, 2, 2, 1231, 1232, 5, 96, 49, 2, 1232, 223, 3, 2, 2, 2, 1233, 1234, 7, 121, 2, 2, 1234, 1239, 5, 230, 116, 2, 1235, 1236, 7, 16, 2, 2, 1236, 1238, 5, 230, 116, 2, 1237, 1235, 3, 2, 2, 2, 1238, 1241, 3, 2, 2, 2, 1239, 1237, 3, 2, 2, 2, 1239, 1240, 3, 2, 2, 2, 1240, 1242, 3, 2, 2, 2, 1241, 1239, 3, 2, 2, 2, 1242, 1243, 7, 122, 2, 2, 1243, 1244, 5, 96, 49, 2, 1244, 1245, 7, 69, 2, 2, 1245, 1246, 5, 96, 49, 2, 1246, 225, 3, 2, 2, 2, 1247, 1248, 7, 123, 2, 2, 1248, 1249, 7, 126, 2, 2, 1249, 1250, 5, 96, 49, 2, 1250, 1251, 7, 124, 2, 2, 1251, 1252, 5, 96, 49, 2, 1252, 227, 3, 2, 2, 2, 1253, 1256, 5, 190, 96, 2, 1254, 1257, 5, 182, 92, 2, 1255, 1257, 5, 188, 95, 2, 1256, 1254, 3, 2, 2, 2, 1256, 1255, 3, 2, 2, 2, 1257, 1258, 3, 2, 2, 2, 1258, 1256, 3, 2, 2, 2, 1258, 1259, 3, 2, 2, 2, 1259, 229, 3, 2, 2, 2, 1260, 1261, 5, 194, 98, 2, 1261, 1262, 7, 8, 2, 2, 1262, 1263, 5, 96, 49, 2, 1263, 231, 3, 2, 2, 2, 1264, 1265, 7, 11, 2, 2, 1265, 1273, 7, 12, 2, 2, 1266, 1270, 5, 236, 119, 2, 1267, 1271, 7, 136, 2, 2, 1268, 1271, 7, 13, 2, 2, 1269, 1271, 7, 50, 2, 2, 1270, 1267, 3, 2, 2, 2, 1270, 1268, 3, 2, 2, 2, 1270, 1269, 3, 2, 2, 2, 1270, 1271, 3, 2, 2, 2, 1271, 1273, 3, 2, 2, 2, 1272, 1264, 3, 2, 2, 2, 1272, 1266, 3, 2, 2, 2, 1273, 233, 3, 2, 2, 2, 1274, 1283, 7, 9, 2, 2, 1275, 1280, 5, 246, 124, 2, 1276, 1277, 7, 16, 2, 2, 1277, 1279, 5, 246, 124, 2, 1278, 1276, 3, 2, 2, 2, 1279, 1282, 3, 2, 2, 2, 1280, 1278, 3, 2, 2, 2, 1280, 1281, 3, 2, 2, 2, 1281, 1284, 3, 2, 2, 2, 1282, 1280, 3, 2, 2, 2, 1283, 1275, 3, 2, 2, 2, 1283, 1284, 3, 2, 2, 2, 1284, 1285, 3, 2, 2, 2, 1285, 1291, 7, 10, 2, 2, 1286, 1287, 7, 61, 2, 2, 1287, 1288, 5, 94, 48, 2, 1288, 1289, 7, 62, 2, 2, 1289, 1291, 3, 2, 2, 2, 1290, 1274, 3, 2, 2, 2, 1290, 1286, 3, 2, 2, 2, 1291, 235, 3, 2, 2, 2, 1292, 1296, 5, 74, 38, 2, 1293, 1296, 7, 137, 2, 2, 1294, 1296, 5, 238, 120, 2, 1295, 1292, 3, 2, 2, 2, 1295, 1293, 3, 2, 2, 2, 1295, 1294, 3, 2, 2, 2, 1296, 237, 3, 2, 2, 2, 1297, 1300, 5, 240, 121, 2, 1298, 1300, 5, 242, 122, 2, 1299, 1297, 3, 2, 2, 2, 1299, 1298, 3, 2, 2, 2, 1300, 239, 3, 2, 2, 2, 1301, 1302, 7, 33, 2, 2, 1302, 1303, 7, 11, 2, 2, 1303, 1304, 7, 13, 2, 2, 1304, 1305, 7, 12, 2, 2, 1305, 241, 3, 2, 2, 2, 1306, 1307, 7, 33, 2, 2, 1307, 1316, 7, 11, 2, 2, 1308, 1313, 5, 232, 117, 2, 1309, 1310, 7, 16, 2, 2, 1310, 1312, 5, 232, 117, 2, 1311, 1309, 3, 2, 2, 2, 1312, 1315, 3, 2, 2, 2, 1313, 1311, 3, 2, 2, 2, 1313, 1314, 3, 2, 2, 2, 1314, 1317, 3, 2, 2, 2, 1315, 1313, 3, 2, 2, 2, 1316, 1308, 3, 2, 2, 2, 1316, 1317, 3, 2, 2, 2, 1317, 1318, 3, 2, 2, 2, 1318, 1319, 7, 12, 2, 2, 1319, 1320, 7, 72, 2, 2, 1320, 1321, 5, 232, 117, 2, 1321, 243, 3, 2, 2, 2, 1322, 1324, 5, 236, 119, 2, 1323, 1325, 7, 136, 2, 2, 1324, 1323, 3, 2, 2, 2, 1324, 1325, 3, 2, 2, 2, 1325, 245, 3, 2, 2, 2, 1326, 1329, 5, 96, 49, 2, 1327, 1329, 7, 144, 2, 2, 1328, 1326, 3, 2, 2, 2, 1328, 1327, 3, 2, 2, 2, 1329, 1330, 3, 2, 2, 2, 1330, 1331, 9, 8, 2, 2, 1331, 1332, 5, 96, 49, 2, 1332, 247, 3, 2, 2, 2, 1333, 1335, 7, 56, 2, 2, 1334, 1336, 5, 94, 48, 2, 1335, 1334, 3, 2, 2, 2, 1335, 1336, 3, 2, 2, 2, 1336, 1337, 3, 2, 2, 2, 1337, 1338, 7, 57, 2, 2, 1338, 249, 3, 2, 2, 2, 1339, 1340, 5, 252, 127, 2, 1340, 251, 3, 2, 2, 2, 1341, 1342, 7, 135, 2, 2, 1342, 253, 3, 2, 2, 2, 1343, 1344, 9, 9, 2, 2, 1344, 255, 3, 2, 2, 2, 134, 264, 268, 284, 290, 298, 306, 314, 329, 359, 367, 369, 391, 401, 411, 416, 421, 425, 437, 441, 450, 457, 471, 475, 480, 490, 498, 502, 514, 526, 548, 556, 561, 564, 568, 577, 586, 589, 597, 604, 606, 613, 620, 622, 630, 635, 642, 649, 659, 666, 673, 680, 689, 699, 703, 711, 713, 725, 731, 735, 739, 750, 756, 771, 777, 781, 785, 792, 799, 805, 810, 812, 816, 823, 830, 839, 851, 861, 873, 877, 886, 893, 915, 920, 925, 929, 941, 949, 953, 960, 967, 973, 980, 988, 995, 1001, 1007, 1013, 1019, 1030, 1036, 1041, 1049, 1070, 1079, 1081, 1104, 1121, 1132, 1154, 1158, 1165, 1169, 1179, 1184, 1198, 1207, 1213, 1239, 1256, 1258, 1270, 1272, 1280, 1283, 1290, 1295, 1299, 1313, 1316, 1324, 1328, 1335]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 178, 1601, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 337, 10, 3, 3, 3, 3, 3, 5, 3, 341, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 357, 10, 6, 3, 6, 3, 6, 7, 6, 361, 10, 6, 12, 6, 14, 6, 364, 11, 6, 3, 6, 3, 6, 3, 6, 7, 6, 369, 10, 6, 12, 6, 14, 6, 372, 11, 6, 3, 7, 3, 7, 3, 8, 7, 8, 377, 10, 8, 12, 8, 14, 8, 380, 11, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 387, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 402, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 5, 18, 432, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 440, 10, 18, 12, 18, 14, 18, 443, 11, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 6, 20, 462, 10, 20, 13, 20, 14, 20, 463, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 6, 21, 472, 10, 21, 13, 21, 14, 21, 473, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 6, 22, 482, 10, 22, 13, 22, 14, 22, 483, 3, 23, 3, 23, 3, 23, 5, 23, 489, 10, 23, 3, 23, 3, 23, 3, 23, 5, 23, 494, 10, 23, 7, 23, 496, 10, 23, 12, 23, 14, 23, 499, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 6, 24, 508, 10, 24, 13, 24, 14, 24, 509, 3, 24, 3, 24, 5, 24, 514, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 523, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 528, 10, 25, 12, 25, 14, 25, 531, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 542, 10, 26, 12, 26, 14, 26, 545, 11, 26, 3, 26, 5, 26, 548, 10, 26, 3, 27, 7, 27, 551, 10, 27, 12, 27, 14, 27, 554, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 561, 10, 28, 12, 28, 14, 28, 564, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 571, 10, 29, 3, 29, 3, 29, 5, 29, 575, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 587, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 599, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 621, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 627, 10, 37, 12, 37, 14, 37, 630, 11, 37, 3, 38, 3, 38, 5, 38, 634, 10, 38, 3, 38, 5, 38, 637, 10, 38, 3, 38, 3, 38, 5, 38, 641, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 650, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 657, 10, 40, 12, 40, 14, 40, 660, 11, 40, 5, 40, 662, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 670, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 677, 10, 41, 5, 41, 679, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 686, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 693, 10, 42, 5, 42, 695, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 703, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 708, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 715, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 722, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 732, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 737, 10, 46, 12, 46, 14, 46, 740, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 746, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 751, 10, 48, 12, 48, 14, 48, 754, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 762, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 772, 10, 50, 3, 51, 3, 51, 5, 51, 776, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 784, 10, 51, 12, 51, 14, 51, 787, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 796, 10, 52, 12, 52, 14, 52, 799, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 804, 10, 53, 3, 53, 3, 53, 5, 53, 808, 10, 53, 3, 53, 3, 53, 5, 53, 812, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 821, 10, 54, 12, 54, 14, 54, 824, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 829, 10, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 7, 57, 842, 10, 57, 12, 57, 14, 57, 845, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 850, 10, 58, 3, 58, 3, 58, 5, 58, 854, 10, 58, 3, 58, 3, 58, 5, 58, 858, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 865, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 870, 10, 59, 12, 59, 14, 59, 873, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 878, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 883, 10, 60, 5, 60, 885, 10, 60, 3, 60, 3, 60, 5, 60, 889, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 896, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 901, 10, 62, 12, 62, 14, 62, 904, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 912, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 922, 10, 64, 13, 64, 14, 64, 923, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 932, 10, 65, 13, 65, 14, 65, 933, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 944, 10, 66, 13, 66, 14, 66, 945, 3, 66, 3, 66, 5, 66, 950, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 959, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 964, 10, 67, 12, 67, 14, 67, 967, 11, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 986, 10, 69, 13, 69, 14, 69, 987, 3, 70, 3, 70, 3, 70, 5, 70, 993, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 998, 10, 70, 7, 70, 1000, 10, 70, 12, 70, 14, 70, 1003, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 1012, 10, 71, 12, 71, 14, 71, 1015, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 1020, 10, 72, 12, 72, 14, 72, 1023, 11, 72, 3, 73, 5, 73, 1026, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 1033, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 1038, 10, 75, 12, 75, 14, 75, 1041, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 1046, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 1051, 10, 77, 12, 77, 14, 77, 1054, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 1059, 10, 78, 12, 78, 14, 78, 1062, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 1068, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1074, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1080, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1086, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1092, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1101, 10, 84, 12, 84, 14, 84, 1104, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1109, 10, 85, 3, 86, 7, 86, 1112, 10, 86, 12, 86, 14, 86, 1115, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1122, 10, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 7, 90, 1141, 10, 90, 12, 90, 14, 90, 1144, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1152, 10, 91, 12, 91, 14, 91, 1155, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 5, 95, 1177, 10, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 1194, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1205, 10, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 5, 104, 1227, 10, 104, 7, 104, 1229, 10, 104, 12, 104, 14, 104, 1232, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1238, 10, 105, 3, 106, 3, 106, 5, 106, 1242, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1252, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1257, 10, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1271, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1278, 10, 109, 12, 109, 14, 109, 1281, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1286, 10, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 1310, 10, 113, 12, 113, 14, 113, 1313, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 6, 115, 1329, 10, 115, 13, 115, 14, 115, 1330, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 5, 117, 1339, 10, 117, 3, 117, 3, 117, 3, 117, 5, 117, 1344, 10, 117, 3, 118, 3, 118, 3, 118, 7, 118, 1349, 10, 118, 12, 118, 14, 118, 1352, 11, 118, 3, 119, 3, 119, 5, 119, 1356, 10, 119, 3, 120, 3, 120, 5, 120, 1360, 10, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 5, 121, 1368, 10, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 5, 124, 1381, 10, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 127, 3, 127, 5, 127, 1391, 10, 127, 3, 128, 3, 128, 5, 128, 1395, 10, 128, 3, 129, 3, 129, 3, 129, 5, 129, 1400, 10, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 7, 132, 1411, 10, 132, 12, 132, 14, 132, 1414, 11, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 5, 133, 1427, 10, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 5, 136, 1441, 10, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 5, 140, 1461, 10, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 5, 141, 1470, 10, 141, 5, 141, 1472, 10, 141, 3, 141, 3, 141, 3, 142, 3, 142, 5, 142, 1478, 10, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 5, 145, 1493, 10, 145, 5, 145, 1495, 10, 145, 5, 145, 1497, 10, 145, 3, 145, 3, 145, 3, 146, 3, 146, 5, 146, 1503, 10, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 149, 3, 149, 3, 150, 3, 150, 3, 151, 3, 151, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 5, 153, 1526, 10, 153, 5, 153, 1528, 10, 153, 3, 154, 3, 154, 3, 154, 3, 154, 7, 154, 1534, 10, 154, 12, 154, 14, 154, 1537, 11, 154, 5, 154, 1539, 10, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 5, 154, 1546, 10, 154, 3, 155, 3, 155, 3, 155, 5, 155, 1551, 10, 155, 3, 156, 3, 156, 5, 156, 1555, 10, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 7, 158, 1567, 10, 158, 12, 158, 14, 158, 1570, 11, 158, 5, 158, 1572, 10, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 5, 159, 1580, 10, 159, 3, 160, 3, 160, 5, 160, 1584, 10, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 5, 161, 1591, 10, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 2, 2, 165, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 2, 13, 4, 2, 17, 17, 105, 105, 3, 2, 82, 83, 3, 2, 20, 29, 4, 2, 5, 5, 35, 45, 3, 2, 47, 48, 4, 2, 12, 12, 49, 51, 3, 2, 131, 132, 3, 2, 134, 140, 3, 2, 141, 145, 4, 2, 19, 19, 168, 168, 5, 2, 61, 126, 161, 166, 169, 169, 2, 1664, 2, 328, 3, 2, 2, 2, 4, 336, 3, 2, 2, 2, 6, 342, 3, 2, 2, 2, 8, 345, 3, 2, 2, 2, 10, 362, 3, 2, 2, 2, 12, 373, 3, 2, 2, 2, 14, 378, 3, 2, 2, 2, 16, 381, 3, 2, 2, 2, 18, 384, 3, 2, 2, 2, 20, 401, 3, 2, 2, 2, 22, 403, 3, 2, 2, 2, 24, 406, 3, 2, 2, 2, 26, 412, 3, 2, 2, 2, 28, 416, 3, 2, 2, 2, 30, 420, 3, 2, 2, 2, 32, 424, 3, 2, 2, 2, 34, 431, 3, 2, 2, 2, 36, 447, 3, 2, 2, 2, 38, 456, 3, 2, 2, 2, 40, 471, 3, 2, 2, 2, 42, 478, 3, 2, 2, 2, 44, 485, 3, 2, 2, 2, 46, 502, 3, 2, 2, 2, 48, 518, 3, 2, 2, 2, 50, 535, 3, 2, 2, 2, 52, 552, 3, 2, 2, 2, 54, 555, 3, 2, 2, 2, 56, 567, 3, 2, 2, 2, 58, 576, 3, 2, 2, 2, 60, 586, 3, 2, 2, 2, 62, 588, 3, 2, 2, 2, 64, 598, 3, 2, 2, 2, 66, 600, 3, 2, 2, 2, 68, 605, 3, 2, 2, 2, 70, 609, 3, 2, 2, 2, 72, 615, 3, 2, 2, 2, 74, 636, 3, 2, 2, 2, 76, 642, 3, 2, 2, 2, 78, 644, 3, 2, 2, 2, 80, 663, 3, 2, 2, 2, 82, 680, 3, 2, 2, 2, 84, 696, 3, 2, 2, 2, 86, 716, 3, 2, 2, 2, 88, 731, 3, 2, 2, 2, 90, 733, 3, 2, 2, 2, 92, 741, 3, 2, 2, 2, 94, 747, 3, 2, 2, 2, 96, 761, 3, 2, 2, 2, 98, 771, 3, 2, 2, 2, 100, 775, 3, 2, 2, 2, 102, 791, 3, 2, 2, 2, 104, 800, 3, 2, 2, 2, 106, 816, 3, 2, 2, 2, 108, 825, 3, 2, 2, 2, 110, 833, 3, 2, 2, 2, 112, 836, 3, 2, 2, 2, 114, 846, 3, 2, 2, 2, 116, 864, 3, 2, 2, 2, 118, 874, 3, 2, 2, 2, 120, 890, 3, 2, 2, 2, 122, 895, 3, 2, 2, 2, 124, 908, 3, 2, 2, 2, 126, 916, 3, 2, 2, 2, 128, 931, 3, 2, 2, 2, 130, 938, 3, 2, 2, 2, 132, 954, 3, 2, 2, 2, 134, 971, 3, 2, 2, 2, 136, 980, 3, 2, 2, 2, 138, 989, 3, 2, 2, 2, 140, 1008, 3, 2, 2, 2, 142, 1016, 3, 2, 2, 2, 144, 1025, 3, 2, 2, 2, 146, 1029, 3, 2, 2, 2, 148, 1034, 3, 2, 2, 2, 150, 1042, 3, 2, 2, 2, 152, 1047, 3, 2, 2, 2, 154, 1055, 3, 2, 2, 2, 156, 1063, 3, 2, 2, 2, 158, 1069, 3, 2, 2, 2, 160, 1075, 3, 2, 2, 2, 162, 1081, 3, 2, 2, 2, 164, 1087, 3, 2, 2, 2, 166, 1093, 3, 2, 2, 2, 168, 1108, 3, 2, 2, 2, 170, 1113, 3, 2, 2, 2, 172, 1121, 3, 2, 2, 2, 174, 1123, 3, 2, 2, 2, 176, 1130, 3, 2, 2, 2, 178, 1137, 3, 2, 2, 2, 180, 1145, 3, 2, 2, 2, 182, 1156, 3, 2, 2, 2, 184, 1162, 3, 2, 2, 2, 186, 1165, 3, 2, 2, 2, 188, 1169, 3, 2, 2, 2, 190, 1193, 3, 2, 2, 2, 192, 1195, 3, 2, 2, 2, 194, 1199, 3, 2, 2, 2, 196, 1202, 3, 2, 2, 2, 198, 1208, 3, 2, 2, 2, 200, 1210, 3, 2, 2, 2, 202, 1215, 3, 2, 2, 2, 204, 1220, 3, 2, 2, 2, 206, 1223, 3, 2, 2, 2, 208, 1237, 3, 2, 2, 2, 210, 1241, 3, 2, 2, 2, 212, 1243, 3, 2, 2, 2, 214, 1247, 3, 2, 2, 2, 216, 1285, 3, 2, 2, 2, 218, 1287, 3, 2, 2, 2, 220, 1291, 3, 2, 2, 2, 222, 1297, 3, 2, 2, 2, 224, 1305, 3, 2, 2, 2, 226, 1319, 3, 2, 2, 2, 228, 1325, 3, 2, 2, 2, 230, 1332, 3, 2, 2, 2, 232, 1343, 3, 2, 2, 2, 234, 1345, 3, 2, 2, 2, 236, 1355, 3, 2, 2, 2, 238, 1359, 3, 2, 2, 2, 240, 1367, 3, 2, 2, 2, 242, 1369, 3, 2, 2, 2, 244, 1373, 3, 2, 2, 2, 246, 1380, 3, 2, 2, 2, 248, 1382, 3, 2, 2, 2, 250, 1386, 3, 2, 2, 2, 252, 1390, 3, 2, 2, 2, 254, 1394, 3, 2, 2, 2, 256, 1399, 3, 2, 2, 2, 258, 1401, 3, 2, 2, 2, 260, 1405, 3, 2, 2, 2, 262, 1412, 3, 2, 2, 2, 264, 1426, 3, 2, 2, 2, 266, 1428, 3, 2, 2, 2, 268, 1432, 3, 2, 2, 2, 270, 1436, 3, 2, 2, 2, 272, 1444, 3, 2, 2, 2, 274, 1448, 3, 2, 2, 2, 276, 1452, 3, 2, 2, 2, 278, 1456, 3, 2, 2, 2, 280, 1464, 3, 2, 2, 2, 282, 1477, 3, 2, 2, 2, 284, 1479, 3, 2, 2, 2, 286, 1484, 3, 2, 2, 2, 288, 1486, 3, 2, 2, 2, 290, 1502, 3, 2, 2, 2, 292, 1504, 3, 2, 2, 2, 294, 1509, 3, 2, 2, 2, 296, 1511, 3, 2, 2, 2, 298, 1513, 3, 2, 2, 2, 300, 1515, 3, 2, 2, 2, 302, 1517, 3, 2, 2, 2, 304, 1527, 3, 2, 2, 2, 306, 1545, 3, 2, 2, 2, 308, 1550, 3, 2, 2, 2, 310, 1554, 3, 2, 2, 2, 312, 1556, 3, 2, 2, 2, 314, 1561, 3, 2, 2, 2, 316, 1577, 3, 2, 2, 2, 318, 1583, 3, 2, 2, 2, 320, 1588, 3, 2, 2, 2, 322, 1594, 3, 2, 2, 2, 324, 1596, 3, 2, 2, 2, 326, 1598, 3, 2, 2, 2, 328, 329, 5, 4, 3, 2, 329, 330, 7, 2, 2, 3, 330, 3, 3, 2, 2, 2, 331, 332, 7, 104, 2, 2, 332, 333, 7, 103, 2, 2, 333, 334, 5, 324, 163, 2, 334, 335, 7, 3, 2, 2, 335, 337, 3, 2, 2, 2, 336, 331, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 340, 3, 2, 2, 2, 338, 341, 5, 8, 5, 2, 339, 341, 5, 6, 4, 2, 340, 338, 3, 2, 2, 2, 340, 339, 3, 2, 2, 2, 341, 5, 3, 2, 2, 2, 342, 343, 5, 10, 6, 2, 343, 344, 5, 12, 7, 2, 344, 7, 3, 2, 2, 2, 345, 346, 7, 4, 2, 2, 346, 347, 7, 129, 2, 2, 347, 348, 7, 176, 2, 2, 348, 349, 7, 5, 2, 2, 349, 350, 5, 322, 162, 2, 350, 351, 7, 3, 2, 2, 351, 352, 5, 10, 6, 2, 352, 9, 3, 2, 2, 2, 353, 357, 5, 60, 31, 2, 354, 357, 5, 62, 32, 2, 355, 357, 5, 78, 40, 2, 356, 353, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 355, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 359, 7, 3, 2, 2, 359, 361, 3, 2, 2, 2, 360, 356, 3, 2, 2, 2, 361, 364, 3, 2, 2, 2, 362, 360, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 370, 3, 2, 2, 2, 364, 362, 3, 2, 2, 2, 365, 366, 5, 64, 33, 2, 366, 367, 7, 3, 2, 2, 367, 369, 3, 2, 2, 2, 368, 365, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 368, 3, 2, 2, 2, 370, 371, 3, 2, 2, 2, 371, 11, 3, 2, 2, 2, 372, 370, 3, 2, 2, 2, 373, 374, 5, 18, 10, 2, 374, 13, 3, 2, 2, 2, 375, 377, 5, 20, 11, 2, 376, 375, 3, 2, 2, 2, 377, 380, 3, 2, 2, 2, 378, 376, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 15, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 381, 382, 5, 14, 8, 2, 382, 383, 5, 94, 48, 2, 383, 17, 3, 2, 2, 2, 384, 386, 5, 14, 8, 2, 385, 387, 5, 94, 48, 2, 386, 385, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 19, 3, 2, 2, 2, 388, 402, 5, 22, 12, 2, 389, 402, 5, 24, 13, 2, 390, 402, 5, 26, 14, 2, 391, 402, 5, 28, 15, 2, 392, 402, 5, 30, 16, 2, 393, 402, 5, 32, 17, 2, 394, 402, 5, 34, 18, 2, 395, 402, 5, 36, 19, 2, 396, 402, 5, 38, 20, 2, 397, 402, 5, 42, 22, 2, 398, 402, 5, 46, 24, 2, 399, 402, 5, 54, 28, 2, 400, 402, 5, 58, 30, 2, 401, 388, 3, 2, 2, 2, 401, 389, 3, 2, 2, 2, 401, 390, 3, 2, 2, 2, 401, 391, 3, 2, 2, 2, 401, 392, 3, 2, 2, 2, 401, 393, 3, 2, 2, 2, 401, 394, 3, 2, 2, 2, 401, 395, 3, 2, 2, 2, 401, 396, 3, 2, 2, 2, 401, 397, 3, 2, 2, 2, 401, 398, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 401, 400, 3, 2, 2, 2, 402, 21, 3, 2, 2, 2, 403, 404, 5, 98, 50, 2, 404, 405, 7, 3, 2, 2, 405, 23, 3, 2, 2, 2, 406, 407, 7, 6, 2, 2, 407, 408, 5, 74, 38, 2, 408, 409, 7, 7, 2, 2, 409, 410, 5, 96, 49, 2, 410, 411, 7, 3, 2, 2, 411, 25, 3, 2, 2, 2, 412, 413, 7, 8, 2, 2, 413, 414, 5, 14, 8, 2, 414, 415, 7, 9, 2, 2, 415, 27, 3, 2, 2, 2, 416, 417, 7, 161, 2, 2, 417, 418, 7, 162, 2, 2, 418, 419, 7, 3, 2, 2, 419, 29, 3, 2, 2, 2, 420, 421, 7, 163, 2, 2, 421, 422, 7, 162, 2, 2, 422, 423, 7, 3, 2, 2, 423, 31, 3, 2, 2, 2, 424, 425, 7, 164, 2, 2, 425, 426, 7, 165, 2, 2, 426, 427, 5, 96, 49, 2, 427, 428, 7, 3, 2, 2, 428, 33, 3, 2, 2, 2, 429, 432, 5, 102, 52, 2, 430, 432, 5, 106, 54, 2, 431, 429, 3, 2, 2, 2, 431, 430, 3, 2, 2, 2, 432, 441, 3, 2, 2, 2, 433, 440, 5, 102, 52, 2, 434, 440, 5, 106, 54, 2, 435, 440, 5, 110, 56, 2, 436, 440, 5, 112, 57, 2, 437, 440, 5, 116, 59, 2, 438, 440, 5, 120, 61, 2, 439, 433, 3, 2, 2, 2, 439, 434, 3, 2, 2, 2, 439, 435, 3, 2, 2, 2, 439, 436, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 438, 3, 2, 2, 2, 440, 443, 3, 2, 2, 2, 441, 439, 3, 2, 2, 2, 441, 442, 3, 2, 2, 2, 442, 444, 3, 2, 2, 2, 443, 441, 3, 2, 2, 2, 444, 445, 7, 67, 2, 2, 445, 446, 5, 20, 11, 2, 446, 35, 3, 2, 2, 2, 447, 448, 7, 68, 2, 2, 448, 449, 7, 10, 2, 2, 449, 450, 5, 94, 48, 2, 450, 451, 7, 11, 2, 2, 451, 452, 7, 89, 2, 2, 452, 453, 5, 20, 11, 2, 453, 454, 7, 90, 2, 2, 454, 455, 5, 20, 11, 2, 455, 37, 3, 2, 2, 2, 456, 457, 7, 84, 2, 2, 457, 458, 7, 10, 2, 2, 458, 459, 5, 94, 48, 2, 459, 461, 7, 11, 2, 2, 460, 462, 5, 40, 21, 2, 461, 460, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 461, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 88, 2, 2, 466, 467, 7, 67, 2, 2, 467, 468, 5, 20, 11, 2, 468, 39, 3, 2, 2, 2, 469, 470, 7, 85, 2, 2, 470, 472, 5, 96, 49, 2, 471, 469, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 7, 67, 2, 2, 476, 477, 5, 20, 11, 2, 477, 41, 3, 2, 2, 2, 478, 479, 7, 86, 2, 2, 479, 481, 5, 26, 14, 2, 480, 482, 5, 44, 23, 2, 481, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 483, 484, 3, 2, 2, 2, 484, 43, 3, 2, 2, 2, 485, 488, 7, 87, 2, 2, 486, 489, 7, 12, 2, 2, 487, 489, 5, 74, 38, 2, 488, 486, 3, 2, 2, 2, 488, 487, 3, 2, 2, 2, 489, 497, 3, 2, 2, 2, 490, 493, 7, 13, 2, 2, 491, 494, 7, 12, 2, 2, 492, 494, 5, 74, 38, 2, 493, 491, 3, 2, 2, 2, 493, 492, 3, 2, 2, 2, 494, 496, 3, 2, 2, 2, 495, 490, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 500, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 500, 501, 5, 26, 14, 2, 501, 45, 3, 2, 2, 2, 502, 503, 7, 91, 2, 2, 503, 504, 7, 10, 2, 2, 504, 505, 5, 94, 48, 2, 505, 507, 7, 11, 2, 2, 506, 508, 5, 48, 25, 2, 507, 506, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 507, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 513, 7, 88, 2, 2, 512, 514, 5, 194, 98, 2, 513, 512, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 516, 7, 67, 2, 2, 516, 517, 5, 20, 11, 2, 517, 47, 3, 2, 2, 2, 518, 522, 7, 85, 2, 2, 519, 520, 5, 194, 98, 2, 520, 521, 7, 70, 2, 2, 521, 523, 3, 2, 2, 2, 522, 519, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 524, 3, 2, 2, 2, 524, 529, 5, 304, 153, 2, 525, 526, 7, 13, 2, 2, 526, 528, 5, 304, 153, 2, 527, 525, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 532, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 533, 7, 67, 2, 2, 533, 534, 5, 20, 11, 2, 534, 49, 3, 2, 2, 2, 535, 536, 7, 14, 2, 2, 536, 547, 5, 74, 38, 2, 537, 538, 7, 10, 2, 2, 538, 543, 7, 170, 2, 2, 539, 540, 7, 15, 2, 2, 540, 542, 7, 170, 2, 2, 541, 539, 3, 2, 2, 2, 542, 545, 3, 2, 2, 2, 543, 541, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 546, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 546, 548, 7, 11, 2, 2, 547, 537, 3, 2, 2, 2, 547, 548, 3, 2, 2, 2, 548, 51, 3, 2, 2, 2, 549, 551, 5, 50, 26, 2, 550, 549, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 53, 3, 2, 2, 2, 554, 552, 3, 2, 2, 2, 555, 556, 5, 52, 27, 2, 556, 557, 7, 114, 2, 2, 557, 562, 5, 56, 29, 2, 558, 559, 7, 15, 2, 2, 559, 561, 5, 56, 29, 2, 560, 558, 3, 2, 2, 2, 561, 564, 3, 2, 2, 2, 562, 560, 3, 2, 2, 2, 562, 563, 3, 2, 2, 2, 563, 565, 3, 2, 2, 2, 564, 562, 3, 2, 2, 2, 565, 566, 7, 3, 2, 2, 566, 55, 3, 2, 2, 2, 567, 570, 5, 194, 98, 2, 568, 569, 7, 70, 2, 2, 569, 571, 5, 304, 153, 2, 570, 568, 3, 2, 2, 2, 570, 571, 3, 2, 2, 2, 571, 574, 3, 2, 2, 2, 572, 573, 7, 7, 2, 2, 573, 575, 5, 96, 49, 2, 574, 572, 3, 2, 2, 2, 574, 575, 3, 2, 2, 2, 575, 57, 3, 2, 2, 2, 576, 577, 7, 166, 2, 2, 577, 578, 7, 10, 2, 2, 578, 579, 5, 94, 48, 2, 579, 580, 7, 11, 2, 2, 580, 581, 5, 20, 11, 2, 581, 59, 3, 2, 2, 2, 582, 587, 5, 66, 34, 2, 583, 587, 5, 68, 35, 2, 584, 587, 5, 70, 36, 2, 585, 587, 5, 72, 37, 2, 586, 582, 3, 2, 2, 2, 586, 583, 3, 2, 2, 2, 586, 584, 3, 2, 2, 2, 586, 585, 3, 2, 2, 2, 587, 61, 3, 2, 2, 2, 588, 589, 7, 111, 2, 2, 589, 590, 7, 129, 2, 2, 590, 591, 7, 176, 2, 2, 591, 592, 7, 5, 2, 2, 592, 593, 5, 322, 162, 2, 593, 63, 3, 2, 2, 2, 594, 599, 5, 84, 43, 2, 595, 599, 5, 80, 41, 2, 596, 599, 5, 86, 44, 2, 597, 599, 5, 82, 42, 2, 598, 594, 3, 2, 2, 2, 598, 595, 3, 2, 2, 2, 598, 596, 3, 2, 2, 2, 598, 597, 3, 2, 2, 2, 599, 65, 3, 2, 2, 2, 600, 601, 7, 111, 2, 2, 601, 602, 7, 88, 2, 2, 602, 603, 7, 81, 2, 2, 603, 604, 5, 322, 162, 2, 604, 67, 3, 2, 2, 2, 605, 606, 7, 111, 2, 2, 606, 607, 7, 16, 2, 2, 607, 608, 9, 2, 2, 2, 608, 69, 3, 2, 2, 2, 609, 610, 7, 111, 2, 2, 610, 611, 7, 88, 2, 2, 611, 612, 7, 66, 2, 2, 612, 613, 7, 73, 2, 2, 613, 614, 9, 3, 2, 2, 614, 71, 3, 2, 2, 2, 615, 620, 7, 111, 2, 2, 616, 617, 7, 18, 2, 2, 617, 621, 5, 74, 38, 2, 618, 619, 7, 88, 2, 2, 619, 621, 7, 18, 2, 2, 620, 616, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 621, 628, 3, 2, 2, 2, 622, 623, 5, 76, 39, 2, 623, 624, 7, 5, 2, 2, 624, 625, 5, 324, 163, 2, 625, 627, 3, 2, 2, 2, 626, 622, 3, 2, 2, 2, 627, 630, 3, 2, 2, 2, 628, 626, 3, 2, 2, 2, 628, 629, 3, 2, 2, 2, 629, 73, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 631, 634, 7, 176, 2, 2, 632, 634, 5, 326, 164, 2, 633, 631, 3, 2, 2, 2, 633, 632, 3, 2, 2, 2, 634, 635, 3, 2, 2, 2, 635, 637, 7, 19, 2, 2, 636, 633, 3, 2, 2, 2, 636, 637, 3, 2, 2, 2, 637, 640, 3, 2, 2, 2, 638, 641, 7, 176, 2, 2, 639, 641, 5, 326, 164, 2, 640, 638, 3, 2, 2, 2, 640, 639, 3, 2, 2, 2, 641, 75, 3, 2, 2, 2, 642, 643, 9, 4, 2, 2, 643, 77, 3, 2, 2, 2, 644, 645, 7, 127, 2, 2, 645, 649, 7, 4, 2, 2, 646, 647, 7, 129, 2, 2, 647, 648, 7, 176, 2, 2, 648, 650, 7, 5, 2, 2, 649, 646, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 661, 5, 322, 162, 2, 652, 653, 7, 71, 2, 2, 653, 658, 5, 322, 162, 2, 654, 655, 7, 15, 2, 2, 655, 657, 5, 322, 162, 2, 656, 654, 3, 2, 2, 2, 657, 660, 3, 2, 2, 2, 658, 656, 3, 2, 2, 2, 658, 659, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 661, 652, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 79, 3, 2, 2, 2, 663, 664, 7, 111, 2, 2, 664, 665, 5, 52, 27, 2, 665, 666, 7, 114, 2, 2, 666, 669, 5, 194, 98, 2, 667, 668, 7, 70, 2, 2, 668, 670, 5, 304, 153, 2, 669, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 678, 3, 2, 2, 2, 671, 672, 7, 7, 2, 2, 672, 679, 5, 96, 49, 2, 673, 676, 7, 30, 2, 2, 674, 675, 7, 7, 2, 2, 675, 677, 5, 96, 49, 2, 676, 674, 3, 2, 2, 2, 676, 677, 3, 2, 2, 2, 677, 679, 3, 2, 2, 2, 678, 671, 3, 2, 2, 2, 678, 673, 3, 2, 2, 2, 679, 81, 3, 2, 2, 2, 680, 681, 7, 111, 2, 2, 681, 682, 7, 112, 2, 2, 682, 685, 7, 113, 2, 2, 683, 684, 7, 70, 2, 2, 684, 686, 5, 304, 153, 2, 685, 683, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 694, 3, 2, 2, 2, 687, 688, 7, 7, 2, 2, 688, 695, 5, 96, 49, 2, 689, 692, 7, 30, 2, 2, 690, 691, 7, 7, 2, 2, 691, 693, 5, 96, 49, 2, 692, 690, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 695, 3, 2, 2, 2, 694, 687, 3, 2, 2, 2, 694, 689, 3, 2, 2, 2, 695, 83, 3, 2, 2, 2, 696, 697, 7, 111, 2, 2, 697, 698, 5, 52, 27, 2, 698, 699, 7, 31, 2, 2, 699, 700, 5, 74, 38, 2, 700, 702, 7, 10, 2, 2, 701, 703, 5, 90, 46, 2, 702, 701, 3, 2, 2, 2, 702, 703, 3, 2, 2, 2, 703, 704, 3, 2, 2, 2, 704, 707, 7, 11, 2, 2, 705, 706, 7, 70, 2, 2, 706, 708, 5, 304, 153, 2, 707, 705, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, 714, 3, 2, 2, 2, 709, 710, 7, 8, 2, 2, 710, 711, 5, 18, 10, 2, 711, 712, 7, 9, 2, 2, 712, 715, 3, 2, 2, 2, 713, 715, 7, 30, 2, 2, 714, 709, 3, 2, 2, 2, 714, 713, 3, 2, 2, 2, 715, 85, 3, 2, 2, 2, 716, 717, 7, 111, 2, 2, 717, 718, 7, 108, 2, 2, 718, 719, 5, 74, 38, 2, 719, 721, 7, 70, 2, 2, 720, 722, 5, 88, 45, 2, 721, 720, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 723, 3, 2, 2, 2, 723, 724, 5, 96, 49, 2, 724, 87, 3, 2, 2, 2, 725, 726, 7, 32, 2, 2, 726, 732, 7, 33, 2, 2, 727, 728, 7, 32, 2, 2, 728, 732, 7, 34, 2, 2, 729, 730, 7, 124, 2, 2, 730, 732, 7, 128, 2, 2, 731, 725, 3, 2, 2, 2, 731, 727, 3, 2, 2, 2, 731, 729, 3, 2, 2, 2, 732, 89, 3, 2, 2, 2, 733, 738, 5, 92, 47, 2, 734, 735, 7, 15, 2, 2, 735, 737, 5, 92, 47, 2, 736, 734, 3, 2, 2, 2, 737, 740, 3, 2, 2, 2, 738, 736, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 91, 3, 2, 2, 2, 740, 738, 3, 2, 2, 2, 741, 742, 7, 6, 2, 2, 742, 745, 5, 74, 38, 2, 743, 744, 7, 70, 2, 2, 744, 746, 5, 304, 153, 2, 745, 743, 3, 2, 2, 2, 745, 746, 3, 2, 2, 2, 746, 93, 3, 2, 2, 2, 747, 752, 5, 96, 49, 2, 748, 749, 7, 15, 2, 2, 749, 751, 5, 96, 49, 2, 750, 748, 3, 2, 2, 2, 751, 754, 3, 2, 2, 2, 752, 750, 3, 2, 2, 2, 752, 753, 3, 2, 2, 2, 753, 95, 3, 2, 2, 2, 754, 752, 3, 2, 2, 2, 755, 762, 5, 98, 50, 2, 756, 762, 5, 100, 51, 2, 757, 762, 5, 126, 64, 2, 758, 762, 5, 130, 66, 2, 759, 762, 5, 134, 68, 2, 760, 762, 5, 136, 69, 2, 761, 755, 3, 2, 2, 2, 761, 756, 3, 2, 2, 2, 761, 757, 3, 2, 2, 2, 761, 758, 3, 2, 2, 2, 761, 759, 3, 2, 2, 2, 761, 760, 3, 2, 2, 2, 762, 97, 3, 2, 2, 2, 763, 772, 5, 122, 62, 2, 764, 772, 5, 140, 71, 2, 765, 772, 5, 216, 109, 2, 766, 772, 5, 218, 110, 2, 767, 772, 5, 220, 111, 2, 768, 772, 5, 222, 112, 2, 769, 772, 5, 224, 113, 2, 770, 772, 5, 226, 114, 2, 771, 763, 3, 2, 2, 2, 771, 764, 3, 2, 2, 2, 771, 765, 3, 2, 2, 2, 771, 766, 3, 2, 2, 2, 771, 767, 3, 2, 2, 2, 771, 768, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 771, 770, 3, 2, 2, 2, 772, 99, 3, 2, 2, 2, 773, 776, 5, 102, 52, 2, 774, 776, 5, 106, 54, 2, 775, 773, 3, 2, 2, 2, 775, 774, 3, 2, 2, 2, 776, 785, 3, 2, 2, 2, 777, 784, 5, 102, 52, 2, 778, 784, 5, 106, 54, 2, 779, 784, 5, 110, 56, 2, 780, 784, 5, 112, 57, 2, 781, 784, 5, 116, 59, 2, 782, 784, 5, 120, 61, 2, 783, 777, 3, 2, 2, 2, 783, 778, 3, 2, 2, 2, 783, 779, 3, 2, 2, 2, 783, 780, 3, 2, 2, 2, 783, 781, 3, 2, 2, 2, 783, 782, 3, 2, 2, 2, 784, 787, 3, 2, 2, 2, 785, 783, 3, 2, 2, 2, 785, 786, 3, 2, 2, 2, 786, 788, 3, 2, 2, 2, 787, 785, 3, 2, 2, 2, 788, 789, 7, 67, 2, 2, 789, 790, 5, 96, 49, 2, 790, 101, 3, 2, 2, 2, 791, 792, 7, 61, 2, 2, 792, 797, 5, 104, 53, 2, 793, 794, 7, 15, 2, 2, 794, 796, 5, 104, 53, 2, 795, 793, 3, 2, 2, 2, 796, 799, 3, 2, 2, 2, 797, 795, 3, 2, 2, 2, 797, 798, 3, 2, 2, 2, 798, 103, 3, 2, 2, 2, 799, 797, 3, 2, 2, 2, 800, 803, 5, 194, 98, 2, 801, 802, 7, 70, 2, 2, 802, 804, 5, 304, 153, 2, 803, 801, 3, 2, 2, 2, 803, 804, 3, 2, 2, 2, 804, 807, 3, 2, 2, 2, 805, 806, 7, 72, 2, 2, 806, 808, 7, 73, 2, 2, 807, 805, 3, 2, 2, 2, 807, 808, 3, 2, 2, 2, 808, 811, 3, 2, 2, 2, 809, 810, 7, 71, 2, 2, 810, 812, 5, 194, 98, 2, 811, 809, 3, 2, 2, 2, 811, 812, 3, 2, 2, 2, 812, 813, 3, 2, 2, 2, 813, 814, 7, 69, 2, 2, 814, 815, 5, 96, 49, 2, 815, 105, 3, 2, 2, 2, 816, 817, 7, 62, 2, 2, 817, 822, 5, 108, 55, 2, 818, 819, 7, 15, 2, 2, 819, 821, 5, 108, 55, 2, 820, 818, 3, 2, 2, 2, 821, 824, 3, 2, 2, 2, 822, 820, 3, 2, 2, 2, 822, 823, 3, 2, 2, 2, 823, 107, 3, 2, 2, 2, 824, 822, 3, 2, 2, 2, 825, 828, 5, 194, 98, 2, 826, 827, 7, 70, 2, 2, 827, 829, 5, 304, 153, 2, 828, 826, 3, 2, 2, 2, 828, 829, 3, 2, 2, 2, 829, 830, 3, 2, 2, 2, 830, 831, 7, 7, 2, 2, 831, 832, 5, 96, 49, 2, 832, 109, 3, 2, 2, 2, 833, 834, 7, 63, 2, 2, 834, 835, 5, 96, 49, 2, 835, 111, 3, 2, 2, 2, 836, 837, 7, 64, 2, 2, 837, 838, 7, 65, 2, 2, 838, 843, 5, 114, 58, 2, 839, 840, 7, 15, 2, 2, 840, 842, 5, 114, 58, 2, 841, 839, 3, 2, 2, 2, 842, 845, 3, 2, 2, 2, 843, 841, 3, 2, 2, 2, 843, 844, 3, 2, 2, 2, 844, 113, 3, 2, 2, 2, 845, 843, 3, 2, 2, 2, 846, 853, 5, 194, 98, 2, 847, 848, 7, 70, 2, 2, 848, 850, 5, 304, 153, 2, 849, 847, 3, 2, 2, 2, 849, 850, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 851, 852, 7, 7, 2, 2, 852, 854, 5, 96, 49, 2, 853, 849, 3, 2, 2, 2, 853, 854, 3, 2, 2, 2, 854, 857, 3, 2, 2, 2, 855, 856, 7, 81, 2, 2, 856, 858, 5, 322, 162, 2, 857, 855, 3, 2, 2, 2, 857, 858, 3, 2, 2, 2, 858, 115, 3, 2, 2, 2, 859, 860, 7, 66, 2, 2, 860, 865, 7, 65, 2, 2, 861, 862, 7, 75, 2, 2, 862, 863, 7, 66, 2, 2, 863, 865, 7, 65, 2, 2, 864, 859, 3, 2, 2, 2, 864, 861, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 871, 5, 118, 60, 2, 867, 868, 7, 15, 2, 2, 868, 870, 5, 118, 60, 2, 869, 867, 3, 2, 2, 2, 870, 873, 3, 2, 2, 2, 871, 869, 3, 2, 2, 2, 871, 872, 3, 2, 2, 2, 872, 117, 3, 2, 2, 2, 873, 871, 3, 2, 2, 2, 874, 877, 5, 96, 49, 2, 875, 878, 7, 76, 2, 2, 876, 878, 7, 77, 2, 2, 877, 875, 3, 2, 2, 2, 877, 876, 3, 2, 2, 2, 877, 878, 3, 2, 2, 2, 878, 884, 3, 2, 2, 2, 879, 882, 7, 73, 2, 2, 880, 883, 7, 82, 2, 2, 881, 883, 7, 83, 2, 2, 882, 880, 3, 2, 2, 2, 882, 881, 3, 2, 2, 2, 883, 885, 3, 2, 2, 2, 884, 879, 3, 2, 2, 2, 884, 885, 3, 2, 2, 2, 885, 888, 3, 2, 2, 2, 886, 887, 7, 81, 2, 2, 887, 889, 5, 322, 162, 2, 888, 886, 3, 2, 2, 2, 888, 889, 3, 2, 2, 2, 889, 119, 3, 2, 2, 2, 890, 891, 7, 74, 2, 2, 891, 892, 5, 194, 98, 2, 892, 121, 3, 2, 2, 2, 893, 896, 7, 78, 2, 2, 894, 896, 7, 79, 2, 2, 895, 893, 3, 2, 2, 2, 895, 894, 3, 2, 2, 2, 896, 897, 3, 2, 2, 2, 897, 902, 5, 124, 63, 2, 898, 899, 7, 15, 2, 2, 899, 901, 5, 124, 63, 2, 900, 898, 3, 2, 2, 2, 901, 904, 3, 2, 2, 2, 902, 900, 3, 2, 2, 2, 902, 903, 3, 2, 2, 2, 903, 905, 3, 2, 2, 2, 904, 902, 3, 2, 2, 2, 905, 906, 7, 80, 2, 2, 906, 907, 5, 96, 49, 2, 907, 123, 3, 2, 2, 2, 908, 911, 5, 194, 98, 2, 909, 910, 7, 70, 2, 2, 910, 912, 5, 304, 153, 2, 911, 909, 3, 2, 2, 2, 911, 912, 3, 2, 2, 2, 912, 913, 3, 2, 2, 2, 913, 914, 7, 69, 2, 2, 914, 915, 5, 96, 49, 2, 915, 125, 3, 2, 2, 2, 916, 917, 7, 84, 2, 2, 917, 918, 7, 10, 2, 2, 918, 919, 5, 94, 48, 2, 919, 921, 7, 11, 2, 2, 920, 922, 5, 128, 65, 2, 921, 920, 3, 2, 2, 2, 922, 923, 3, 2, 2, 2, 923, 921, 3, 2, 2, 2, 923, 924, 3, 2, 2, 2, 924, 925, 3, 2, 2, 2, 925, 926, 7, 88, 2, 2, 926, 927, 7, 67, 2, 2, 927, 928, 5, 96, 49, 2, 928, 127, 3, 2, 2, 2, 929, 930, 7, 85, 2, 2, 930, 932, 5, 96, 49, 2, 931, 929, 3, 2, 2, 2, 932, 933, 3, 2, 2, 2, 933, 931, 3, 2, 2, 2, 933, 934, 3, 2, 2, 2, 934, 935, 3, 2, 2, 2, 935, 936, 7, 67, 2, 2, 936, 937, 5, 96, 49, 2, 937, 129, 3, 2, 2, 2, 938, 939, 7, 91, 2, 2, 939, 940, 7, 10, 2, 2, 940, 941, 5, 94, 48, 2, 941, 943, 7, 11, 2, 2, 942, 944, 5, 132, 67, 2, 943, 942, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 943, 3, 2, 2, 2, 945, 946, 3, 2, 2, 2, 946, 947, 3, 2, 2, 2, 947, 949, 7, 88, 2, 2, 948, 950, 5, 194, 98, 2, 949, 948, 3, 2, 2, 2, 949, 950, 3, 2, 2, 2, 950, 951, 3, 2, 2, 2, 951, 952, 7, 67, 2, 2, 952, 953, 5, 96, 49, 2, 953, 131, 3, 2, 2, 2, 954, 958, 7, 85, 2, 2, 955, 956, 5, 194, 98, 2, 956, 957, 7, 70, 2, 2, 957, 959, 3, 2, 2, 2, 958, 955, 3, 2, 2, 2, 958, 959, 3, 2, 2, 2, 959, 960, 3, 2, 2, 2, 960, 965, 5, 304, 153, 2, 961, 962, 7, 13, 2, 2, 962, 964, 5, 304, 153, 2, 963, 961, 3, 2, 2, 2, 964, 967, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 968, 3, 2, 2, 2, 967, 965, 3, 2, 2, 2, 968, 969, 7, 67, 2, 2, 969, 970, 5, 96, 49, 2, 970, 133, 3, 2, 2, 2, 971, 972, 7, 68, 2, 2, 972, 973, 7, 10, 2, 2, 973, 974, 5, 94, 48, 2, 974, 975, 7, 11, 2, 2, 975, 976, 7, 89, 2, 2, 976, 977, 5, 96, 49, 2, 977, 978, 7, 90, 2, 2, 978, 979, 5, 96, 49, 2, 979, 135, 3, 2, 2, 2, 980, 981, 7, 86, 2, 2, 981, 982, 7, 8, 2, 2, 982, 983, 5, 94, 48, 2, 983, 985, 7, 9, 2, 2, 984, 986, 5, 138, 70, 2, 985, 984, 3, 2, 2, 2, 986, 987, 3, 2, 2, 2, 987, 985, 3, 2, 2, 2, 987, 988, 3, 2, 2, 2, 988, 137, 3, 2, 2, 2, 989, 992, 7, 87, 2, 2, 990, 993, 7, 12, 2, 2, 991, 993, 5, 74, 38, 2, 992, 990, 3, 2, 2, 2, 992, 991, 3, 2, 2, 2, 993, 1001, 3, 2, 2, 2, 994, 997, 7, 13, 2, 2, 995, 998, 7, 12, 2, 2, 996, 998, 5, 74, 38, 2, 997, 995, 3, 2, 2, 2, 997, 996, 3, 2, 2, 2, 998, 1000, 3, 2, 2, 2, 999, 994, 3, 2, 2, 2, 1000, 1003, 3, 2, 2, 2, 1001, 999, 3, 2, 2, 2, 1001, 1002, 3, 2, 2, 2, 1002, 1004, 3, 2, 2, 2, 1003, 1001, 3, 2, 2, 2, 1004, 1005, 7, 8, 2, 2, 1005, 1006, 5, 94, 48, 2, 1006, 1007, 7, 9, 2, 2, 1007, 139, 3, 2, 2, 2, 1008, 1013, 5, 142, 72, 2, 1009, 1010, 7, 92, 2, 2, 1010, 1012, 5, 142, 72, 2, 1011, 1009, 3, 2, 2, 2, 1012, 1015, 3, 2, 2, 2, 1013, 1011, 3, 2, 2, 2, 1013, 1014, 3, 2, 2, 2, 1014, 141, 3, 2, 2, 2, 1015, 1013, 3, 2, 2, 2, 1016, 1021, 5, 144, 73, 2, 1017, 1018, 7, 93, 2, 2, 1018, 1020, 5, 144, 73, 2, 1019, 1017, 3, 2, 2, 2, 1020, 1023, 3, 2, 2, 2, 1021, 1019, 3, 2, 2, 2, 1021, 1022, 3, 2, 2, 2, 1022, 143, 3, 2, 2, 2, 1023, 1021, 3, 2, 2, 2, 1024, 1026, 7, 94, 2, 2, 1025, 1024, 3, 2, 2, 2, 1025, 1026, 3, 2, 2, 2, 1026, 1027, 3, 2, 2, 2, 1027, 1028, 5, 146, 74, 2, 1028, 145, 3, 2, 2, 2, 1029, 1032, 5, 148, 75, 2, 1030, 1031, 9, 5, 2, 2, 1031, 1033, 5, 148, 75, 2, 1032, 1030, 3, 2, 2, 2, 1032, 1033, 3, 2, 2, 2, 1033, 147, 3, 2, 2, 2, 1034, 1039, 5, 150, 76, 2, 1035, 1036, 7, 46, 2, 2, 1036, 1038, 5, 150, 76, 2, 1037, 1035, 3, 2, 2, 2, 1038, 1041, 3, 2, 2, 2, 1039, 1037, 3, 2, 2, 2, 1039, 1040, 3, 2, 2, 2, 1040, 149, 3, 2, 2, 2, 1041, 1039, 3, 2, 2, 2, 1042, 1045, 5, 152, 77, 2, 1043, 1044, 7, 95, 2, 2, 1044, 1046, 5, 152, 77, 2, 1045, 1043, 3, 2, 2, 2, 1045, 1046, 3, 2, 2, 2, 1046, 151, 3, 2, 2, 2, 1047, 1052, 5, 154, 78, 2, 1048, 1049, 9, 6, 2, 2, 1049, 1051, 5, 154, 78, 2, 1050, 1048, 3, 2, 2, 2, 1051, 1054, 3, 2, 2, 2, 1052, 1050, 3, 2, 2, 2, 1052, 1053, 3, 2, 2, 2, 1053, 153, 3, 2, 2, 2, 1054, 1052, 3, 2, 2, 2, 1055, 1060, 5, 156, 79, 2, 1056, 1057, 9, 7, 2, 2, 1057, 1059, 5, 156, 79, 2, 1058, 1056, 3, 2, 2, 2, 1059, 1062, 3, 2, 2, 2, 1060, 1058, 3, 2, 2, 2, 1060, 1061, 3, 2, 2, 2, 1061, 155, 3, 2, 2, 2, 1062, 1060, 3, 2, 2, 2, 1063, 1067, 5, 158, 80, 2, 1064, 1065, 7, 96, 2, 2, 1065, 1066, 7, 97, 2, 2, 1066, 1068, 5, 304, 153, 2, 1067, 1064, 3, 2, 2, 2, 1067, 1068, 3, 2, 2, 2, 1068, 157, 3, 2, 2, 2, 1069, 1073, 5, 160, 81, 2, 1070, 1071, 7, 99, 2, 2, 1071, 1072, 7, 98, 2, 2, 1072, 1074, 5, 304, 153, 2, 1073, 1070, 3, 2, 2, 2, 1073, 1074, 3, 2, 2, 2, 1074, 159, 3, 2, 2, 2, 1075, 1079, 5, 162, 82, 2, 1076, 1077, 7, 100, 2, 2, 1077, 1078, 7, 70, 2, 2, 1078, 1080, 5, 304, 153, 2, 1079, 1076, 3, 2, 2, 2, 1079, 1080, 3, 2, 2, 2, 1080, 161, 3, 2, 2, 2, 1081, 1085, 5, 164, 83, 2, 1082, 1083, 7, 102, 2, 2, 1083, 1084, 7, 70, 2, 2, 1084, 1086, 5, 316, 159, 2, 1085, 1082, 3, 2, 2, 2, 1085, 1086, 3, 2, 2, 2, 1086, 163, 3, 2, 2, 2, 1087, 1091, 5, 166, 84, 2, 1088, 1089, 7, 101, 2, 2, 1089, 1090, 7, 70, 2, 2, 1090, 1092, 5, 316, 159, 2, 1091, 1088, 3, 2, 2, 2, 1091, 1092, 3, 2, 2, 2, 1092, 165, 3, 2, 2, 2, 1093, 1102, 5, 170, 86, 2, 1094, 1095, 7, 5, 2, 2, 1095, 1096, 7, 44, 2, 2, 1096, 1097, 3, 2, 2, 2, 1097, 1098, 5, 168, 85, 2, 1098, 1099, 5, 206, 104, 2, 1099, 1101, 3, 2, 2, 2, 1100, 1094, 3, 2, 2, 2, 1101, 1104, 3, 2, 2, 2, 1102, 1100, 3, 2, 2, 2, 1102, 1103, 3, 2, 2, 2, 1103, 167, 3, 2, 2, 2, 1104, 1102, 3, 2, 2, 2, 1105, 1109, 5, 74, 38, 2, 1106, 1109, 5, 194, 98, 2, 1107, 1109, 5, 196, 99, 2, 1108, 1105, 3, 2, 2, 2, 1108, 1106, 3, 2, 2, 2, 1108, 1107, 3, 2, 2, 2, 1109, 169, 3, 2, 2, 2, 1110, 1112, 9, 6, 2, 2, 1111, 1110, 3, 2, 2, 2, 1112, 1115, 3, 2, 2, 2, 1113, 1111, 3, 2, 2, 2, 1113, 1114, 3, 2, 2, 2, 1114, 1116, 3, 2, 2, 2, 1115, 1113, 3, 2, 2, 2, 1116, 1117, 5, 172, 87, 2, 1117, 171, 3, 2, 2, 2, 1118, 1122, 5, 178, 90, 2, 1119, 1122, 5, 174, 88, 2, 1120, 1122, 5, 176, 89, 2, 1121, 1118, 3, 2, 2, 2, 1121, 1119, 3, 2, 2, 2, 1121, 1120, 3, 2, 2, 2, 1122, 173, 3, 2, 2, 2, 1123, 1124, 7, 109, 2, 2, 1124, 1125, 7, 108, 2, 2, 1125, 1126, 5, 304, 153, 2, 1126, 1127, 7, 8, 2, 2, 1127, 1128, 5, 94, 48, 2, 1128, 1129, 7, 9, 2, 2, 1129, 175, 3, 2, 2, 2, 1130, 1131, 7, 110, 2, 2, 1131, 1132, 7, 108, 2, 2, 1132, 1133, 5, 304, 153, 2, 1133, 1134, 7, 8, 2, 2, 1134, 1135, 5, 94, 48, 2, 1135, 1136, 7, 9, 2, 2, 1136, 177, 3, 2, 2, 2, 1137, 1142, 5, 232, 117, 2, 1138, 1139, 7, 52, 2, 2, 1139, 1141, 5, 232, 117, 2, 1140, 1138, 3, 2, 2, 2, 1141, 1144, 3, 2, 2, 2, 1142, 1140, 3, 2, 2, 2, 1142, 1143, 3, 2, 2, 2, 1143, 179, 3, 2, 2, 2, 1144, 1142, 3, 2, 2, 2, 1145, 1153, 5, 190, 96, 2, 1146, 1152, 5, 182, 92, 2, 1147, 1152, 5, 186, 94, 2, 1148, 1152, 5, 188, 95, 2, 1149, 1152, 5, 184, 93, 2, 1150, 1152, 5, 206, 104, 2, 1151, 1146, 3, 2, 2, 2, 1151, 1147, 3, 2, 2, 2, 1151, 1148, 3, 2, 2, 2, 1151, 1149, 3, 2, 2, 2, 1151, 1150, 3, 2, 2, 2, 1152, 1155, 3, 2, 2, 2, 1153, 1151, 3, 2, 2, 2, 1153, 1154, 3, 2, 2, 2, 1154, 181, 3, 2, 2, 2, 1155, 1153, 3, 2, 2, 2, 1156, 1157, 7, 53, 2, 2, 1157, 1158, 7, 53, 2, 2, 1158, 1159, 5, 94, 48, 2, 1159, 1160, 7, 54, 2, 2, 1160, 1161, 7, 54, 2, 2, 1161, 183, 3, 2, 2, 2, 1162, 1163, 7, 53, 2, 2, 1163, 1164, 7, 54, 2, 2, 1164, 185, 3, 2, 2, 2, 1165, 1166, 7, 53, 2, 2, 1166, 1167, 5, 94, 48, 2, 1167, 1168, 7, 54, 2, 2, 1168, 187, 3, 2, 2, 2, 1169, 1176, 7, 55, 2, 2, 1170, 1177, 5, 326, 164, 2, 1171, 1177, 5, 324, 163, 2, 1172, 1177, 7, 176, 2, 2, 1173, 1177, 5, 196, 99, 2, 1174, 1177, 5, 194, 98, 2, 1175, 1177, 5, 198, 100, 2, 1176, 1170, 3, 2, 2, 2, 1176, 1171, 3, 2, 2, 2, 1176, 1172, 3, 2, 2, 2, 1176, 1173, 3, 2, 2, 2, 1176, 1174, 3, 2, 2, 2, 1176, 1175, 3, 2, 2, 2, 1177, 189, 3, 2, 2, 2, 1178, 1194, 7, 169, 2, 2, 1179, 1194, 7, 106, 2, 2, 1180, 1194, 7, 107, 2, 2, 1181, 1194, 7, 170, 2, 2, 1182, 1194, 5, 324, 163, 2, 1183, 1194, 5, 194, 98, 2, 1184, 1194, 5, 196, 99, 2, 1185, 1194, 5, 198, 100, 2, 1186, 1194, 5, 306, 154, 2, 1187, 1194, 5, 204, 103, 2, 1188, 1194, 5, 200, 101, 2, 1189, 1194, 5, 202, 102, 2, 1190, 1194, 5, 320, 161, 2, 1191, 1194, 5, 210, 106, 2, 1192, 1194, 5, 192, 97, 2, 1193, 1178, 3, 2, 2, 2, 1193, 1179, 3, 2, 2, 2, 1193, 1180, 3, 2, 2, 2, 1193, 1181, 3, 2, 2, 2, 1193, 1182, 3, 2, 2, 2, 1193, 1183, 3, 2, 2, 2, 1193, 1184, 3, 2, 2, 2, 1193, 1185, 3, 2, 2, 2, 1193, 1186, 3, 2, 2, 2, 1193, 1187, 3, 2, 2, 2, 1193, 1188, 3, 2, 2, 2, 1193, 1189, 3, 2, 2, 2, 1193, 1190, 3, 2, 2, 2, 1193, 1191, 3, 2, 2, 2, 1193, 1192, 3, 2, 2, 2, 1194, 191, 3, 2, 2, 2, 1195, 1196, 7, 8, 2, 2, 1196, 1197, 5, 16, 9, 2, 1197, 1198, 7, 9, 2, 2, 1198, 193, 3, 2, 2, 2, 1199, 1200, 7, 6, 2, 2, 1200, 1201, 5, 74, 38, 2, 1201, 195, 3, 2, 2, 2, 1202, 1204, 7, 10, 2, 2, 1203, 1205, 5, 94, 48, 2, 1204, 1203, 3, 2, 2, 2, 1204, 1205, 3, 2, 2, 2, 1205, 1206, 3, 2, 2, 2, 1206, 1207, 7, 11, 2, 2, 1207, 197, 3, 2, 2, 2, 1208, 1209, 7, 56, 2, 2, 1209, 199, 3, 2, 2, 2, 1210, 1211, 7, 17, 2, 2, 1211, 1212, 7, 8, 2, 2, 1212, 1213, 5, 94, 48, 2, 1213, 1214, 7, 9, 2, 2, 1214, 201, 3, 2, 2, 2, 1215, 1216, 7, 105, 2, 2, 1216, 1217, 7, 8, 2, 2, 1217, 1218, 5, 94, 48, 2, 1218, 1219, 7, 9, 2, 2, 1219, 203, 3, 2, 2, 2, 1220, 1221, 5, 74, 38, 2, 1221, 1222, 5, 206, 104, 2, 1222, 205, 3, 2, 2, 2, 1223, 1230, 7, 10, 2, 2, 1224, 1226, 5, 208, 105, 2, 1225, 1227, 7, 15, 2, 2, 1226, 1225, 3, 2, 2, 2, 1226, 1227, 3, 2, 2, 2, 1227, 1229, 3, 2, 2, 2, 1228, 1224, 3, 2, 2, 2, 1229, 1232, 3, 2, 2, 2, 1230, 1228, 3, 2, 2, 2, 1230, 1231, 3, 2, 2, 2, 1231, 1233, 3, 2, 2, 2, 1232, 1230, 3, 2, 2, 2, 1233, 1234, 7, 11, 2, 2, 1234, 207, 3, 2, 2, 2, 1235, 1238, 5, 96, 49, 2, 1236, 1238, 7, 168, 2, 2, 1237, 1235, 3, 2, 2, 2, 1237, 1236, 3, 2, 2, 2, 1238, 209, 3, 2, 2, 2, 1239, 1242, 5, 212, 107, 2, 1240, 1242, 5, 214, 108, 2, 1241, 1239, 3, 2, 2, 2, 1241, 1240, 3, 2, 2, 2, 1242, 211, 3, 2, 2, 2, 1243, 1244, 5, 74, 38, 2, 1244, 1245, 7, 57, 2, 2, 1245, 1246, 7, 170, 2, 2, 1246, 213, 3, 2, 2, 2, 1247, 1248, 5, 52, 27, 2, 1248, 1249, 7, 31, 2, 2, 1249, 1251, 7, 10, 2, 2, 1250, 1252, 5, 90, 46, 2, 1251, 1250, 3, 2, 2, 2, 1251, 1252, 3, 2, 2, 2, 1252, 1253, 3, 2, 2, 2, 1253, 1256, 7, 11, 2, 2, 1254, 1255, 7, 70, 2, 2, 1255, 1257, 5, 304, 153, 2, 1256, 1254, 3, 2, 2, 2, 1256, 1257, 3, 2, 2, 2, 1257, 1258, 3, 2, 2, 2, 1258, 1259, 7, 8, 2, 2, 1259, 1260, 5, 18, 10, 2, 1260, 1261, 7, 9, 2, 2, 1261, 215, 3, 2, 2, 2, 1262, 1263, 7, 115, 2, 2, 1263, 1264, 7, 124, 2, 2, 1264, 1265, 5, 96, 49, 2, 1265, 1266, 7, 122, 2, 2, 1266, 1270, 5, 96, 49, 2, 1267, 1268, 7, 71, 2, 2, 1268, 1269, 7, 126, 2, 2, 1269, 1271, 5, 96, 49, 2, 1270, 1267, 3, 2, 2, 2, 1270, 1271, 3, 2, 2, 2, 1271, 1286, 3, 2, 2, 2, 1272, 1273, 7, 115, 2, 2, 1273, 1274, 7, 124, 2, 2, 1274, 1279, 5, 318, 160, 2, 1275, 1276, 7, 15, 2, 2, 1276, 1278, 5, 318, 160, 2, 1277, 1275, 3, 2, 2, 2, 1278, 1281, 3, 2, 2, 2, 1279, 1277, 3, 2, 2, 2, 1279, 1280, 3, 2, 2, 2, 1280, 1282, 3, 2, 2, 2, 1281, 1279, 3, 2, 2, 2, 1282, 1283, 7, 122, 2, 2, 1283, 1284, 5, 96, 49, 2, 1284, 1286, 3, 2, 2, 2, 1285, 1262, 3, 2, 2, 2, 1285, 1272, 3, 2, 2, 2, 1286, 217, 3, 2, 2, 2, 1287, 1288, 7, 116, 2, 2, 1288, 1289, 7, 124, 2, 2, 1289, 1290, 5, 228, 115, 2, 1290, 219, 3, 2, 2, 2, 1291, 1292, 7, 117, 2, 2, 1292, 1293, 7, 124, 2, 2, 1293, 1294, 5, 228, 115, 2, 1294, 1295, 7, 70, 2, 2, 1295, 1296, 5, 96, 49, 2, 1296, 221, 3, 2, 2, 2, 1297, 1298, 7, 118, 2, 2, 1298, 1299, 7, 123, 2, 2, 1299, 1300, 7, 97, 2, 2, 1300, 1301, 7, 124, 2, 2, 1301, 1302, 5, 228, 115, 2, 1302, 1303, 7, 125, 2, 2, 1303, 1304, 5, 96, 49, 2, 1304, 223, 3, 2, 2, 2, 1305, 1306, 7, 119, 2, 2, 1306, 1311, 5, 230, 116, 2, 1307, 1308, 7, 15, 2, 2, 1308, 1310, 5, 230, 116, 2, 1309, 1307, 3, 2, 2, 2, 1310, 1313, 3, 2, 2, 2, 1311, 1309, 3, 2, 2, 2, 1311, 1312, 3, 2, 2, 2, 1312, 1314, 3, 2, 2, 2, 1313, 1311, 3, 2, 2, 2, 1314, 1315, 7, 120, 2, 2, 1315, 1316, 5, 96, 49, 2, 1316, 1317, 7, 67, 2, 2, 1317, 1318, 5, 96, 49, 2, 1318, 225, 3, 2, 2, 2, 1319, 1320, 7, 121, 2, 2, 1320, 1321, 7, 124, 2, 2, 1321, 1322, 5, 96, 49, 2, 1322, 1323, 7, 122, 2, 2, 1323, 1324, 5, 96, 49, 2, 1324, 227, 3, 2, 2, 2, 1325, 1328, 5, 190, 96, 2, 1326, 1329, 5, 182, 92, 2, 1327, 1329, 5, 188, 95, 2, 1328, 1326, 3, 2, 2, 2, 1328, 1327, 3, 2, 2, 2, 1329, 1330, 3, 2, 2, 2, 1330, 1328, 3, 2, 2, 2, 1330, 1331, 3, 2, 2, 2, 1331, 229, 3, 2, 2, 2, 1332, 1333, 5, 194, 98, 2, 1333, 1334, 7, 7, 2, 2, 1334, 1335, 5, 96, 49, 2, 1335, 231, 3, 2, 2, 2, 1336, 1338, 7, 131, 2, 2, 1337, 1339, 5, 234, 118, 2, 1338, 1337, 3, 2, 2, 2, 1338, 1339, 3, 2, 2, 2, 1339, 1344, 3, 2, 2, 2, 1340, 1341, 7, 132, 2, 2, 1341, 1344, 5, 234, 118, 2, 1342, 1344, 5, 234, 118, 2, 1343, 1336, 3, 2, 2, 2, 1343, 1340, 3, 2, 2, 2, 1343, 1342, 3, 2, 2, 2, 1344, 233, 3, 2, 2, 2, 1345, 1350, 5, 236, 119, 2, 1346, 1347, 9, 8, 2, 2, 1347, 1349, 5, 236, 119, 2, 1348, 1346, 3, 2, 2, 2, 1349, 1352, 3, 2, 2, 2, 1350, 1348, 3, 2, 2, 2, 1350, 1351, 3, 2, 2, 2, 1351, 235, 3, 2, 2, 2, 1352, 1350, 3, 2, 2, 2, 1353, 1356, 5, 180, 91, 2, 1354, 1356, 5, 238, 120, 2, 1355, 1353, 3, 2, 2, 2, 1355, 1354, 3, 2, 2, 2, 1356, 237, 3, 2, 2, 2, 1357, 1360, 5, 246, 124, 2, 1358, 1360, 5, 240, 121, 2, 1359, 1357, 3, 2, 2, 2, 1359, 1358, 3, 2, 2, 2, 1360, 1361, 3, 2, 2, 2, 1361, 1362, 5, 262, 132, 2, 1362, 239, 3, 2, 2, 2, 1363, 1364, 5, 242, 122, 2, 1364, 1365, 5, 252, 127, 2, 1365, 1368, 3, 2, 2, 2, 1366, 1368, 5, 244, 123, 2, 1367, 1363, 3, 2, 2, 2, 1367, 1366, 3, 2, 2, 2, 1368, 241, 3, 2, 2, 2, 1369, 1370, 9, 9, 2, 2, 1370, 1371, 7, 19, 2, 2, 1371, 1372, 7, 19, 2, 2, 1372, 243, 3, 2, 2, 2, 1373, 1374, 7, 133, 2, 2, 1374, 1375, 5, 252, 127, 2, 1375, 245, 3, 2, 2, 2, 1376, 1377, 5, 248, 125, 2, 1377, 1378, 5, 252, 127, 2, 1378, 1381, 3, 2, 2, 2, 1379, 1381, 5, 250, 126, 2, 1380, 1376, 3, 2, 2, 2, 1380, 1379, 3, 2, 2, 2, 1381, 247, 3, 2, 2, 2, 1382, 1383, 9, 10, 2, 2, 1383, 1384, 7, 19, 2, 2, 1384, 1385, 7, 19, 2, 2, 1385, 249, 3, 2, 2, 2, 1386, 1387, 7, 58, 2, 2, 1387, 251, 3, 2, 2, 2, 1388, 1391, 5, 254, 128, 2, 1389, 1391, 5, 264, 133, 2, 1390, 1388, 3, 2, 2, 2, 1390, 1389, 3, 2, 2, 2, 1391, 253, 3, 2, 2, 2, 1392, 1395, 5, 74, 38, 2, 1393, 1395, 5, 256, 129, 2, 1394, 1392, 3, 2, 2, 2, 1394, 1393, 3, 2, 2, 2, 1395, 255, 3, 2, 2, 2, 1396, 1400, 7, 12, 2, 2, 1397, 1400, 5, 258, 130, 2, 1398, 1400, 5, 260, 131, 2, 1399, 1396, 3, 2, 2, 2, 1399, 1397, 3, 2, 2, 2, 1399, 1398, 3, 2, 2, 2, 1400, 257, 3, 2, 2, 2, 1401, 1402, 7, 176, 2, 2, 1402, 1403, 7, 19, 2, 2, 1403, 1404, 7, 12, 2, 2, 1404, 259, 3, 2, 2, 2, 1405, 1406, 7, 12, 2, 2, 1406, 1407, 7, 19, 2, 2, 1407, 1408, 7, 176, 2, 2, 1408, 261, 3, 2, 2, 2, 1409, 1411, 5, 186, 94, 2, 1410, 1409, 3, 2, 2, 2, 1411, 1414, 3, 2, 2, 2, 1412, 1410, 3, 2, 2, 2, 1412, 1413, 3, 2, 2, 2, 1413, 263, 3, 2, 2, 2, 1414, 1412, 3, 2, 2, 2, 1415, 1427, 5, 270, 136, 2, 1416, 1427, 5, 288, 145, 2, 1417, 1427, 5, 280, 141, 2, 1418, 1427, 5, 292, 147, 2, 1419, 1427, 5, 284, 143, 2, 1420, 1427, 5, 278, 140, 2, 1421, 1427, 5, 274, 138, 2, 1422, 1427, 5, 272, 137, 2, 1423, 1427, 5, 276, 139, 2, 1424, 1427, 5, 268, 135, 2, 1425, 1427, 5, 266, 134, 2, 1426, 1415, 3, 2, 2, 2, 1426, 1416, 3, 2, 2, 2, 1426, 1417, 3, 2, 2, 2, 1426, 1418, 3, 2, 2, 2, 1426, 1419, 3, 2, 2, 2, 1426, 1420, 3, 2, 2, 2, 1426, 1421, 3, 2, 2, 2, 1426, 1422, 3, 2, 2, 2, 1426, 1423, 3, 2, 2, 2, 1426, 1424, 3, 2, 2, 2, 1426, 1425, 3, 2, 2, 2, 1427, 265, 3, 2, 2, 2, 1428, 1429, 7, 146, 2, 2, 1429, 1430, 7, 10, 2, 2, 1430, 1431, 7, 11, 2, 2, 1431, 267, 3, 2, 2, 2, 1432, 1433, 7, 147, 2, 2, 1433, 1434, 7, 10, 2, 2, 1434, 1435, 7, 11, 2, 2, 1435, 269, 3, 2, 2, 2, 1436, 1437, 7, 149, 2, 2, 1437, 1440, 7, 10, 2, 2, 1438, 1441, 5, 288, 145, 2, 1439, 1441, 5, 292, 147, 2, 1440, 1438, 3, 2, 2, 2, 1440, 1439, 3, 2, 2, 2, 1440, 1441, 3, 2, 2, 2, 1441, 1442, 3, 2, 2, 2, 1442, 1443, 7, 11, 2, 2, 1443, 271, 3, 2, 2, 2, 1444, 1445, 7, 150, 2, 2, 1445, 1446, 7, 10, 2, 2, 1446, 1447, 7, 11, 2, 2, 1447, 273, 3, 2, 2, 2, 1448, 1449, 7, 160, 2, 2, 1449, 1450, 7, 10, 2, 2, 1450, 1451, 7, 11, 2, 2, 1451, 275, 3, 2, 2, 2, 1452, 1453, 7, 152, 2, 2, 1453, 1454, 7, 10, 2, 2, 1454, 1455, 7, 11, 2, 2, 1455, 277, 3, 2, 2, 2, 1456, 1457, 7, 151, 2, 2, 1457, 1460, 7, 10, 2, 2, 1458, 1461, 7, 176, 2, 2, 1459, 1461, 5, 324, 163, 2, 1460, 1458, 3, 2, 2, 2, 1460, 1459, 3, 2, 2, 2, 1460, 1461, 3, 2, 2, 2, 1461, 1462, 3, 2, 2, 2, 1462, 1463, 7, 11, 2, 2, 1463, 279, 3, 2, 2, 2, 1464, 1465, 7, 136, 2, 2, 1465, 1471, 7, 10, 2, 2, 1466, 1469, 5, 282, 142, 2, 1467, 1468, 7, 15, 2, 2, 1468, 1470, 5, 302, 152, 2, 1469, 1467, 3, 2, 2, 2, 1469, 1470, 3, 2, 2, 2, 1470, 1472, 3, 2, 2, 2, 1471, 1466, 3, 2, 2, 2, 1471, 1472, 3, 2, 2, 2, 1472, 1473, 3, 2, 2, 2, 1473, 1474, 7, 11, 2, 2, 1474, 281, 3, 2, 2, 2, 1475, 1478, 5, 296, 149, 2, 1476, 1478, 7, 12, 2, 2, 1477, 1475, 3, 2, 2, 2, 1477, 1476, 3, 2, 2, 2, 1478, 283, 3, 2, 2, 2, 1479, 1480, 7, 153, 2, 2, 1480, 1481, 7, 10, 2, 2, 1481, 1482, 5, 286, 144, 2, 1482, 1483, 7, 11, 2, 2, 1483, 285, 3, 2, 2, 2, 1484, 1485, 5, 296, 149, 2, 1485, 287, 3, 2, 2, 2, 1486, 1487, 7, 130, 2, 2, 1487, 1496, 7, 10, 2, 2, 1488, 1494, 5, 290, 146, 2, 1489, 1490, 7, 15, 2, 2, 1490, 1492, 5, 302, 152, 2, 1491, 1493, 7, 168, 2, 2, 1492, 1491, 3, 2, 2, 2, 1492, 1493, 3, 2, 2, 2, 1493, 1495, 3, 2, 2, 2, 1494, 1489, 3, 2, 2, 2, 1494, 1495, 3, 2, 2, 2, 1495, 1497, 3, 2, 2, 2, 1496, 1488, 3, 2, 2, 2, 1496, 1497, 3, 2, 2, 2, 1497, 1498, 3, 2, 2, 2, 1498, 1499, 7, 11, 2, 2, 1499, 289, 3, 2, 2, 2, 1500, 1503, 5, 298, 150, 2, 1501, 1503, 7, 12, 2, 2, 1502, 1500, 3, 2, 2, 2, 1502, 1501, 3, 2, 2, 2, 1503, 291, 3, 2, 2, 2, 1504, 1505, 7, 154, 2, 2, 1505, 1506, 7, 10, 2, 2, 1506, 1507, 5, 294, 148, 2, 1507, 1508, 7, 11, 2, 2, 1508, 293, 3, 2, 2, 2, 1509, 1510, 5, 298, 150, 2, 1510, 295, 3, 2, 2, 2, 1511, 1512, 5, 74, 38, 2, 1512, 297, 3, 2, 2, 2, 1513, 1514, 5, 74, 38, 2, 1514, 299, 3, 2, 2, 2, 1515, 1516, 5, 302, 152, 2, 1516, 301, 3, 2, 2, 2, 1517, 1518, 5, 74, 38, 2, 1518, 303, 3, 2, 2, 2, 1519, 1520, 7, 10, 2, 2, 1520, 1528, 7, 11, 2, 2, 1521, 1525, 5, 308, 155, 2, 1522, 1526, 7, 168, 2, 2, 1523, 1526, 7, 12, 2, 2, 1524, 1526, 7, 47, 2, 2, 1525, 1522, 3, 2, 2, 2, 1525, 1523, 3, 2, 2, 2, 1525, 1524, 3, 2, 2, 2, 1525, 1526, 3, 2, 2, 2, 1526, 1528, 3, 2, 2, 2, 1527, 1519, 3, 2, 2, 2, 1527, 1521, 3, 2, 2, 2, 1528, 305, 3, 2, 2, 2, 1529, 1538, 7, 8, 2, 2, 1530, 1535, 5, 318, 160, 2, 1531, 1532, 7, 15, 2, 2, 1532, 1534, 5, 318, 160, 2, 1533, 1531, 3, 2, 2, 2, 1534, 1537, 3, 2, 2, 2, 1535, 1533, 3, 2, 2, 2, 1535, 1536, 3, 2, 2, 2, 1536, 1539, 3, 2, 2, 2, 1537, 1535, 3, 2, 2, 2, 1538, 1530, 3, 2, 2, 2, 1538, 1539, 3, 2, 2, 2, 1539, 1540, 3, 2, 2, 2, 1540, 1546, 7, 9, 2, 2, 1541, 1542, 7, 59, 2, 2, 1542, 1543, 5, 94, 48, 2, 1543, 1544, 7, 60, 2, 2, 1544, 1546, 3, 2, 2, 2, 1545, 1529, 3, 2, 2, 2, 1545, 1541, 3, 2, 2, 2, 1546, 307, 3, 2, 2, 2, 1547, 1551, 5, 74, 38, 2, 1548, 1551, 7, 169, 2, 2, 1549, 1551, 5, 310, 156, 2, 1550, 1547, 3, 2, 2, 2, 1550, 1548, 3, 2, 2, 2, 1550, 1549, 3, 2, 2, 2, 1551, 309, 3, 2, 2, 2, 1552, 1555, 5, 312, 157, 2, 1553, 1555, 5, 314, 158, 2, 1554, 1552, 3, 2, 2, 2, 1554, 1553, 3, 2, 2, 2, 1555, 311, 3, 2, 2, 2, 1556, 1557, 7, 31, 2, 2, 1557, 1558, 7, 10, 2, 2, 1558, 1559, 7, 12, 2, 2, 1559, 1560, 7, 11, 2, 2, 1560, 313, 3, 2, 2, 2, 1561, 1562, 7, 31, 2, 2, 1562, 1571, 7, 10, 2, 2, 1563, 1568, 5, 304, 153, 2, 1564, 1565, 7, 15, 2, 2, 1565, 1567, 5, 304, 153, 2, 1566, 1564, 3, 2, 2, 2, 1567, 1570, 3, 2, 2, 2, 1568, 1566, 3, 2, 2, 2, 1568, 1569, 3, 2, 2, 2, 1569, 1572, 3, 2, 2, 2, 1570, 1568, 3, 2, 2, 2, 1571, 1563, 3, 2, 2, 2, 1571, 1572, 3, 2, 2, 2, 1572, 1573, 3, 2, 2, 2, 1573, 1574, 7, 11, 2, 2, 1574, 1575, 7, 70, 2, 2, 1575, 1576, 5, 304, 153, 2, 1576, 315, 3, 2, 2, 2, 1577, 1579, 5, 308, 155, 2, 1578, 1580, 7, 168, 2, 2, 1579, 1578, 3, 2, 2, 2, 1579, 1580, 3, 2, 2, 2, 1580, 317, 3, 2, 2, 2, 1581, 1584, 5, 96, 49, 2, 1582, 1584, 7, 176, 2, 2, 1583, 1581, 3, 2, 2, 2, 1583, 1582, 3, 2, 2, 2, 1584, 1585, 3, 2, 2, 2, 1585, 1586, 9, 11, 2, 2, 1586, 1587, 5, 96, 49, 2, 1587, 319, 3, 2, 2, 2, 1588, 1590, 7, 53, 2, 2, 1589, 1591, 5, 94, 48, 2, 1590, 1589, 3, 2, 2, 2, 1590, 1591, 3, 2, 2, 2, 1591, 1592, 3, 2, 2, 2, 1592, 1593, 7, 54, 2, 2, 1593, 321, 3, 2, 2, 2, 1594, 1595, 5, 324, 163, 2, 1595, 323, 3, 2, 2, 2, 1596, 1597, 7, 167, 2, 2, 1597, 325, 3, 2, 2, 2, 1598, 1599, 9, 12, 2, 2, 1599, 327, 3, 2, 2, 2, 155, 336, 340, 356, 362, 370, 378, 386, 401, 431, 439, 441, 463, 473, 483, 488, 493, 497, 509, 513, 522, 529, 543, 547, 552, 562, 570, 574, 586, 598, 620, 628, 633, 636, 640, 649, 658, 661, 669, 676, 678, 685, 692, 694, 702, 707, 714, 721, 731, 738, 745, 752, 761, 771, 775, 783, 785, 797, 803, 807, 811, 822, 828, 843, 849, 853, 857, 864, 871, 877, 882, 884, 888, 895, 902, 911, 923, 933, 945, 949, 958, 965, 987, 992, 997, 1001, 1013, 1021, 1025, 1032, 1039, 1045, 1052, 1060, 1067, 1073, 1079, 1085, 1091, 1102, 1108, 1113, 1121, 1142, 1151, 1153, 1176, 1193, 1204, 1226, 1230, 1237, 1241, 1251, 1256, 1270, 1279, 1285, 1311, 1328, 1330, 1338, 1343, 1350, 1355, 1359, 1367, 1380, 1390, 1394, 1399, 1412, 1426, 1440, 1460, 1469, 1471, 1477, 1492, 1494, 1496, 1502, 1525, 1527, 1535, 1538, 1545, 1550, 1554, 1568, 1571, 1579, 1583, 1590]
\ No newline at end of file
diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.tokens b/src/main/java/org/rumbledb/parser/Jsoniq.tokens
index 74d3a280cf..488d2a2277 100644
--- a/src/main/java/org/rumbledb/parser/Jsoniq.tokens
+++ b/src/main/java/org/rumbledb/parser/Jsoniq.tokens
@@ -56,223 +56,287 @@ T__54=55
T__55=56
T__56=57
T__57=58
-T__58=59
-T__59=60
-Kfor=61
-Klet=62
-Kwhere=63
-Kgroup=64
-Kby=65
-Korder=66
-Kreturn=67
-Kif=68
-Kin=69
-Kas=70
-Kat=71
-Kallowing=72
-Kempty=73
-Kcount=74
-Kstable=75
-Kascending=76
-Kdescending=77
-Ksome=78
-Kevery=79
-Ksatisfies=80
-Kcollation=81
-Kgreatest=82
-Kleast=83
-Kswitch=84
-Kcase=85
-Ktry=86
-Kcatch=87
-Kdefault=88
-Kthen=89
-Kelse=90
-Ktypeswitch=91
-Kor=92
-Kand=93
-Knot=94
-Kto=95
-Kinstance=96
-Kof=97
-Kstatically=98
-Kis=99
-Ktreat=100
-Kcast=101
-Kcastable=102
-Kversion=103
-Kjsoniq=104
-Kunordered=105
-Ktrue=106
-Kfalse=107
-Ktype=108
-Kvalidate=109
-Kannotate=110
-Kdeclare=111
-Kcontext=112
-Kitem=113
-Kvariable=114
-Kinsert=115
-Kdelete=116
-Krename=117
-Kreplace=118
-Kcopy=119
-Kmodify=120
-Kappend=121
-Kinto=122
-Kvalue=123
-Kjson=124
-Kwith=125
-Kposition=126
-Kbreak=127
-Kloop=128
-Kcontinue=129
-Kexit=130
-Kreturning=131
-Kwhile=132
-STRING=133
-ArgumentPlaceholder=134
-NullLiteral=135
-Literal=136
-NumericLiteral=137
-IntegerLiteral=138
-DecimalLiteral=139
-DoubleLiteral=140
-WS=141
-NCName=142
-XQComment=143
-ContentChar=144
+Kfor=59
+Klet=60
+Kwhere=61
+Kgroup=62
+Kby=63
+Korder=64
+Kreturn=65
+Kif=66
+Kin=67
+Kas=68
+Kat=69
+Kallowing=70
+Kempty=71
+Kcount=72
+Kstable=73
+Kascending=74
+Kdescending=75
+Ksome=76
+Kevery=77
+Ksatisfies=78
+Kcollation=79
+Kgreatest=80
+Kleast=81
+Kswitch=82
+Kcase=83
+Ktry=84
+Kcatch=85
+Kdefault=86
+Kthen=87
+Kelse=88
+Ktypeswitch=89
+Kor=90
+Kand=91
+Knot=92
+Kto=93
+Kinstance=94
+Kof=95
+Kstatically=96
+Kis=97
+Ktreat=98
+Kcast=99
+Kcastable=100
+Kversion=101
+Kjsoniq=102
+Kunordered=103
+Ktrue=104
+Kfalse=105
+Ktype=106
+Kvalidate=107
+Kannotate=108
+Kdeclare=109
+Kcontext=110
+Kitem=111
+Kvariable=112
+Kinsert=113
+Kdelete=114
+Krename=115
+Kreplace=116
+Kcopy=117
+Kmodify=118
+Kappend=119
+Kinto=120
+Kvalue=121
+Kjson=122
+Kwith=123
+Kposition=124
+Kimport=125
+Kschema=126
+Knamespace=127
+Kelement=128
+Kslash=129
+Kdslash=130
+Kat_symbol=131
+Kchild=132
+Kdescendant=133
+Kattribute=134
+Kself=135
+Kdescendant_or_self=136
+Kfollowing_sibling=137
+Kfollowing=138
+Kparent=139
+Kancestor=140
+Kpreceding_sibling=141
+Kpreceding=142
+Kancestor_or_self=143
+Knode=144
+Kbinary=145
+Kdocument=146
+Kdocument_node=147
+Ktext=148
+Kpi=149
+Knamespace_node=150
+Kschema_attribute=151
+Kschema_element=152
+Karray_node=153
+Kboolean_node=154
+Knull_node=155
+Knumber_node=156
+Kobject_node=157
+Kcomment=158
+Kbreak=159
+Kloop=160
+Kcontinue=161
+Kexit=162
+Kreturning=163
+Kwhile=164
+STRING=165
+ArgumentPlaceholder=166
+NullLiteral=167
+Literal=168
+NumericLiteral=169
+IntegerLiteral=170
+DecimalLiteral=171
+DoubleLiteral=172
+WS=173
+NCName=174
+XQComment=175
+ContentChar=176
';'=1
'module'=2
-'namespace'=3
-'='=4
-'$'=5
-':='=6
-'{'=7
-'}'=8
-'('=9
-')'=10
-'*'=11
-'|'=12
-'%'=13
-','=14
-'ordering'=15
-'ordered'=16
-'decimal-format'=17
-':'=18
-'decimal-separator'=19
-'grouping-separator'=20
-'infinity'=21
-'minus-sign'=22
-'NaN'=23
-'percent'=24
-'per-mille'=25
-'zero-digit'=26
-'digit'=27
-'pattern-separator'=28
-'import'=29
-'external'=30
-'function'=31
-'jsound'=32
-'compact'=33
-'verbose'=34
-'schema'=35
-'eq'=36
-'ne'=37
-'lt'=38
-'le'=39
-'gt'=40
-'ge'=41
-'!='=42
-'<'=43
-'<='=44
-'>'=45
-'>='=46
-'||'=47
-'+'=48
-'-'=49
-'div'=50
-'idiv'=51
-'mod'=52
-'!'=53
-'['=54
-']'=55
-'.'=56
-'$$'=57
-'#'=58
-'{|'=59
-'|}'=60
-'for'=61
-'let'=62
-'where'=63
-'group'=64
-'by'=65
-'order'=66
-'return'=67
-'if'=68
-'in'=69
-'as'=70
-'at'=71
-'allowing'=72
-'empty'=73
-'count'=74
-'stable'=75
-'ascending'=76
-'descending'=77
-'some'=78
-'every'=79
-'satisfies'=80
-'collation'=81
-'greatest'=82
-'least'=83
-'switch'=84
-'case'=85
-'try'=86
-'catch'=87
-'default'=88
-'then'=89
-'else'=90
-'typeswitch'=91
-'or'=92
-'and'=93
-'not'=94
-'to'=95
-'instance'=96
-'of'=97
-'statically'=98
-'is'=99
-'treat'=100
-'cast'=101
-'castable'=102
-'version'=103
-'jsoniq'=104
-'unordered'=105
-'true'=106
-'false'=107
-'type'=108
-'validate'=109
-'annotate'=110
-'declare'=111
-'context'=112
-'item'=113
-'variable'=114
-'insert'=115
-'delete'=116
-'rename'=117
-'replace'=118
-'copy'=119
-'modify'=120
-'append'=121
-'into'=122
-'value'=123
-'json'=124
-'with'=125
-'position'=126
-'break'=127
-'loop'=128
-'continue'=129
-'exit'=130
-'returning'=131
-'while'=132
-'?'=134
-'null'=135
+'='=3
+'$'=4
+':='=5
+'{'=6
+'}'=7
+'('=8
+')'=9
+'*'=10
+'|'=11
+'%'=12
+','=13
+'ordering'=14
+'ordered'=15
+'decimal-format'=16
+':'=17
+'decimal-separator'=18
+'grouping-separator'=19
+'infinity'=20
+'minus-sign'=21
+'NaN'=22
+'percent'=23
+'per-mille'=24
+'zero-digit'=25
+'digit'=26
+'pattern-separator'=27
+'external'=28
+'function'=29
+'jsound'=30
+'compact'=31
+'verbose'=32
+'eq'=33
+'ne'=34
+'lt'=35
+'le'=36
+'gt'=37
+'ge'=38
+'!='=39
+'<'=40
+'<='=41
+'>'=42
+'>='=43
+'||'=44
+'+'=45
+'-'=46
+'div'=47
+'idiv'=48
+'mod'=49
+'!'=50
+'['=51
+']'=52
+'.'=53
+'$$'=54
+'#'=55
+'..'=56
+'{|'=57
+'|}'=58
+'for'=59
+'let'=60
+'where'=61
+'group'=62
+'by'=63
+'order'=64
+'return'=65
+'if'=66
+'in'=67
+'as'=68
+'at'=69
+'allowing'=70
+'empty'=71
+'count'=72
+'stable'=73
+'ascending'=74
+'descending'=75
+'some'=76
+'every'=77
+'satisfies'=78
+'collation'=79
+'greatest'=80
+'least'=81
+'switch'=82
+'case'=83
+'try'=84
+'catch'=85
+'default'=86
+'then'=87
+'else'=88
+'typeswitch'=89
+'or'=90
+'and'=91
+'not'=92
+'to'=93
+'instance'=94
+'of'=95
+'statically'=96
+'is'=97
+'treat'=98
+'cast'=99
+'castable'=100
+'version'=101
+'jsoniq'=102
+'unordered'=103
+'true'=104
+'false'=105
+'type'=106
+'validate'=107
+'annotate'=108
+'declare'=109
+'context'=110
+'item'=111
+'variable'=112
+'insert'=113
+'delete'=114
+'rename'=115
+'replace'=116
+'copy'=117
+'modify'=118
+'append'=119
+'into'=120
+'value'=121
+'json'=122
+'with'=123
+'position'=124
+'import'=125
+'schema'=126
+'namespace'=127
+'element'=128
+'/'=129
+'//'=130
+'@'=131
+'child'=132
+'descendant'=133
+'attribute'=134
+'self'=135
+'descendant-or-self'=136
+'following-sibling'=137
+'following'=138
+'parent'=139
+'ancestor'=140
+'preceding-sibling'=141
+'preceding'=142
+'ancestor-or-self'=143
+'node'=144
+'binary'=145
+'document'=146
+'document-node'=147
+'text'=148
+'processing-instruction'=149
+'namespace-node'=150
+'schema-attribute'=151
+'schema-element'=152
+'array-node'=153
+'boolean-node'=154
+'null-node'=155
+'number-node'=156
+'object-node'=157
+'comment'=158
+'break'=159
+'loop'=160
+'continue'=161
+'exit'=162
+'returning'=163
+'while'=164
+'?'=166
+'null'=167
diff --git a/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java b/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java
index 1b4a5e4167..ef10d488de 100644
--- a/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java
+++ b/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java
@@ -819,6 +819,272 @@ public class JsoniqBaseVisitor extends AbstractParseTreeVisitor implements
* {@link #visitChildren} on {@code ctx}.
*/
@Override public T visitCopyDecl(JsoniqParser.CopyDeclContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitPathExpr(JsoniqParser.PathExprContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitRelativePathExpr(JsoniqParser.RelativePathExprContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitStepExpr(JsoniqParser.StepExprContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitAxisStep(JsoniqParser.AxisStepContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitForwardStep(JsoniqParser.ForwardStepContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitForwardAxis(JsoniqParser.ForwardAxisContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitAbbrevForwardStep(JsoniqParser.AbbrevForwardStepContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitReverseStep(JsoniqParser.ReverseStepContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitReverseAxis(JsoniqParser.ReverseAxisContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitAbbrevReverseStep(JsoniqParser.AbbrevReverseStepContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitNodeTest(JsoniqParser.NodeTestContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitNameTest(JsoniqParser.NameTestContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitAllNames(JsoniqParser.AllNamesContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitAllWithNS(JsoniqParser.AllWithNSContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitAllWithLocal(JsoniqParser.AllWithLocalContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitNCNameWithLocalWildcard(JsoniqParser.NCNameWithLocalWildcardContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitNCNameWithPrefixWildcard(JsoniqParser.NCNameWithPrefixWildcardContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitPredicateList(JsoniqParser.PredicateListContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitKindTest(JsoniqParser.KindTestContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitAnyKindTest(JsoniqParser.AnyKindTestContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitBinaryNodeTest(JsoniqParser.BinaryNodeTestContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitDocumentTest(JsoniqParser.DocumentTestContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitTextTest(JsoniqParser.TextTestContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitCommentTest(JsoniqParser.CommentTestContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitNamespaceNodeTest(JsoniqParser.NamespaceNodeTestContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitPiTest(JsoniqParser.PiTestContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitAttributeTest(JsoniqParser.AttributeTestContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitAttributeNameOrWildcard(JsoniqParser.AttributeNameOrWildcardContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitSchemaAttributeTest(JsoniqParser.SchemaAttributeTestContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitAttributeDeclaration(JsoniqParser.AttributeDeclarationContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitElementTest(JsoniqParser.ElementTestContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitElementNameOrWildcard(JsoniqParser.ElementNameOrWildcardContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitSchemaElementTest(JsoniqParser.SchemaElementTestContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitElementDeclaration(JsoniqParser.ElementDeclarationContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitAttributeName(JsoniqParser.AttributeNameContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitElementName(JsoniqParser.ElementNameContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitSimpleTypeName(JsoniqParser.SimpleTypeNameContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitTypeName(JsoniqParser.TypeNameContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.interp b/src/main/java/org/rumbledb/parser/JsoniqLexer.interp
index 0d02ed8f1b..444f74a252 100644
--- a/src/main/java/org/rumbledb/parser/JsoniqLexer.interp
+++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.interp
@@ -2,7 +2,6 @@ token literal names:
null
';'
'module'
-'namespace'
'='
'$'
':='
@@ -28,13 +27,11 @@ null
'zero-digit'
'digit'
'pattern-separator'
-'import'
'external'
'function'
'jsound'
'compact'
'verbose'
-'schema'
'eq'
'ne'
'lt'
@@ -58,6 +55,7 @@ null
'.'
'$$'
'#'
+'..'
'{|'
'|}'
'for'
@@ -126,6 +124,40 @@ null
'json'
'with'
'position'
+'import'
+'schema'
+'namespace'
+'element'
+'/'
+'//'
+'@'
+'child'
+'descendant'
+'attribute'
+'self'
+'descendant-or-self'
+'following-sibling'
+'following'
+'parent'
+'ancestor'
+'preceding-sibling'
+'preceding'
+'ancestor-or-self'
+'node'
+'binary'
+'document'
+'document-node'
+'text'
+'processing-instruction'
+'namespace-node'
+'schema-attribute'
+'schema-element'
+'array-node'
+'boolean-node'
+'null-node'
+'number-node'
+'object-node'
+'comment'
'break'
'loop'
'continue'
@@ -205,8 +237,6 @@ null
null
null
null
-null
-null
Kfor
Klet
Kwhere
@@ -273,6 +303,40 @@ Kvalue
Kjson
Kwith
Kposition
+Kimport
+Kschema
+Knamespace
+Kelement
+Kslash
+Kdslash
+Kat_symbol
+Kchild
+Kdescendant
+Kattribute
+Kself
+Kdescendant_or_self
+Kfollowing_sibling
+Kfollowing
+Kparent
+Kancestor
+Kpreceding_sibling
+Kpreceding
+Kancestor_or_self
+Knode
+Kbinary
+Kdocument
+Kdocument_node
+Ktext
+Kpi
+Knamespace_node
+Kschema_attribute
+Kschema_element
+Karray_node
+Kboolean_node
+Knull_node
+Knumber_node
+Kobject_node
+Kcomment
Kbreak
Kloop
Kcontinue
@@ -351,8 +415,6 @@ T__54
T__55
T__56
T__57
-T__58
-T__59
Kfor
Klet
Kwhere
@@ -419,6 +481,40 @@ Kvalue
Kjson
Kwith
Kposition
+Kimport
+Kschema
+Knamespace
+Kelement
+Kslash
+Kdslash
+Kat_symbol
+Kchild
+Kdescendant
+Kattribute
+Kself
+Kdescendant_or_self
+Kfollowing_sibling
+Kfollowing
+Kparent
+Kancestor
+Kpreceding_sibling
+Kpreceding
+Kancestor_or_self
+Knode
+Kbinary
+Kdocument
+Kdocument_node
+Ktext
+Kpi
+Knamespace_node
+Kschema_attribute
+Kschema_element
+Karray_node
+Kboolean_node
+Knull_node
+Knumber_node
+Kobject_node
+Kcomment
Kbreak
Kloop
Kcontinue
@@ -452,4 +548,4 @@ mode names:
DEFAULT_MODE
atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 146, 1198, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 7, 134, 1084, 10, 134, 12, 134, 14, 134, 1087, 11, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 5, 135, 1094, 10, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 5, 141, 1116, 10, 141, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 7, 143, 1125, 10, 143, 12, 143, 14, 143, 1128, 11, 143, 5, 143, 1130, 10, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 7, 144, 1137, 10, 144, 12, 144, 14, 144, 1140, 11, 144, 5, 144, 1142, 10, 144, 5, 144, 1144, 10, 144, 3, 144, 3, 144, 5, 144, 1148, 10, 144, 3, 144, 3, 144, 3, 145, 6, 145, 1153, 10, 145, 13, 145, 14, 145, 1154, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 7, 147, 1163, 10, 147, 12, 147, 14, 147, 1166, 11, 147, 3, 148, 5, 148, 1169, 10, 148, 3, 149, 3, 149, 5, 149, 1173, 10, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 7, 150, 1183, 10, 150, 12, 150, 14, 150, 1186, 11, 150, 3, 150, 6, 150, 1189, 10, 150, 13, 150, 14, 150, 1190, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 2, 2, 152, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 110, 219, 111, 221, 112, 223, 113, 225, 114, 227, 115, 229, 116, 231, 117, 233, 118, 235, 119, 237, 120, 239, 121, 241, 122, 243, 123, 245, 124, 247, 125, 249, 126, 251, 127, 253, 128, 255, 129, 257, 130, 259, 131, 261, 132, 263, 133, 265, 134, 267, 135, 269, 2, 271, 2, 273, 2, 275, 136, 277, 137, 279, 138, 281, 139, 283, 140, 285, 141, 287, 142, 289, 2, 291, 143, 293, 144, 295, 2, 297, 2, 299, 145, 301, 146, 3, 2, 15, 4, 2, 36, 36, 94, 94, 10, 2, 36, 36, 49, 49, 94, 94, 100, 100, 104, 104, 112, 112, 116, 116, 118, 118, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 50, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 5, 2, 11, 12, 15, 15, 34, 34, 16, 2, 67, 92, 97, 97, 99, 124, 194, 216, 218, 248, 250, 769, 882, 895, 897, 8193, 8206, 8207, 8306, 8593, 11266, 12273, 12291, 55297, 63746, 64977, 65010, 65535, 7, 2, 47, 47, 50, 59, 185, 185, 770, 881, 8257, 8258, 3, 2, 60, 60, 3, 2, 43, 43, 4, 2, 42, 42, 60, 60, 7, 2, 36, 36, 40, 41, 62, 62, 125, 125, 127, 127, 2, 1210, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 2, 257, 3, 2, 2, 2, 2, 259, 3, 2, 2, 2, 2, 261, 3, 2, 2, 2, 2, 263, 3, 2, 2, 2, 2, 265, 3, 2, 2, 2, 2, 267, 3, 2, 2, 2, 2, 275, 3, 2, 2, 2, 2, 277, 3, 2, 2, 2, 2, 279, 3, 2, 2, 2, 2, 281, 3, 2, 2, 2, 2, 283, 3, 2, 2, 2, 2, 285, 3, 2, 2, 2, 2, 287, 3, 2, 2, 2, 2, 291, 3, 2, 2, 2, 2, 293, 3, 2, 2, 2, 2, 299, 3, 2, 2, 2, 2, 301, 3, 2, 2, 2, 3, 303, 3, 2, 2, 2, 5, 305, 3, 2, 2, 2, 7, 312, 3, 2, 2, 2, 9, 322, 3, 2, 2, 2, 11, 324, 3, 2, 2, 2, 13, 326, 3, 2, 2, 2, 15, 329, 3, 2, 2, 2, 17, 331, 3, 2, 2, 2, 19, 333, 3, 2, 2, 2, 21, 335, 3, 2, 2, 2, 23, 337, 3, 2, 2, 2, 25, 339, 3, 2, 2, 2, 27, 341, 3, 2, 2, 2, 29, 343, 3, 2, 2, 2, 31, 345, 3, 2, 2, 2, 33, 354, 3, 2, 2, 2, 35, 362, 3, 2, 2, 2, 37, 377, 3, 2, 2, 2, 39, 379, 3, 2, 2, 2, 41, 397, 3, 2, 2, 2, 43, 416, 3, 2, 2, 2, 45, 425, 3, 2, 2, 2, 47, 436, 3, 2, 2, 2, 49, 440, 3, 2, 2, 2, 51, 448, 3, 2, 2, 2, 53, 458, 3, 2, 2, 2, 55, 469, 3, 2, 2, 2, 57, 475, 3, 2, 2, 2, 59, 493, 3, 2, 2, 2, 61, 500, 3, 2, 2, 2, 63, 509, 3, 2, 2, 2, 65, 518, 3, 2, 2, 2, 67, 525, 3, 2, 2, 2, 69, 533, 3, 2, 2, 2, 71, 541, 3, 2, 2, 2, 73, 548, 3, 2, 2, 2, 75, 551, 3, 2, 2, 2, 77, 554, 3, 2, 2, 2, 79, 557, 3, 2, 2, 2, 81, 560, 3, 2, 2, 2, 83, 563, 3, 2, 2, 2, 85, 566, 3, 2, 2, 2, 87, 569, 3, 2, 2, 2, 89, 571, 3, 2, 2, 2, 91, 574, 3, 2, 2, 2, 93, 576, 3, 2, 2, 2, 95, 579, 3, 2, 2, 2, 97, 582, 3, 2, 2, 2, 99, 584, 3, 2, 2, 2, 101, 586, 3, 2, 2, 2, 103, 590, 3, 2, 2, 2, 105, 595, 3, 2, 2, 2, 107, 599, 3, 2, 2, 2, 109, 601, 3, 2, 2, 2, 111, 603, 3, 2, 2, 2, 113, 605, 3, 2, 2, 2, 115, 607, 3, 2, 2, 2, 117, 610, 3, 2, 2, 2, 119, 612, 3, 2, 2, 2, 121, 615, 3, 2, 2, 2, 123, 618, 3, 2, 2, 2, 125, 622, 3, 2, 2, 2, 127, 626, 3, 2, 2, 2, 129, 632, 3, 2, 2, 2, 131, 638, 3, 2, 2, 2, 133, 641, 3, 2, 2, 2, 135, 647, 3, 2, 2, 2, 137, 654, 3, 2, 2, 2, 139, 657, 3, 2, 2, 2, 141, 660, 3, 2, 2, 2, 143, 663, 3, 2, 2, 2, 145, 666, 3, 2, 2, 2, 147, 675, 3, 2, 2, 2, 149, 681, 3, 2, 2, 2, 151, 687, 3, 2, 2, 2, 153, 694, 3, 2, 2, 2, 155, 704, 3, 2, 2, 2, 157, 715, 3, 2, 2, 2, 159, 720, 3, 2, 2, 2, 161, 726, 3, 2, 2, 2, 163, 736, 3, 2, 2, 2, 165, 746, 3, 2, 2, 2, 167, 755, 3, 2, 2, 2, 169, 761, 3, 2, 2, 2, 171, 768, 3, 2, 2, 2, 173, 773, 3, 2, 2, 2, 175, 777, 3, 2, 2, 2, 177, 783, 3, 2, 2, 2, 179, 791, 3, 2, 2, 2, 181, 796, 3, 2, 2, 2, 183, 801, 3, 2, 2, 2, 185, 812, 3, 2, 2, 2, 187, 815, 3, 2, 2, 2, 189, 819, 3, 2, 2, 2, 191, 823, 3, 2, 2, 2, 193, 826, 3, 2, 2, 2, 195, 835, 3, 2, 2, 2, 197, 838, 3, 2, 2, 2, 199, 849, 3, 2, 2, 2, 201, 852, 3, 2, 2, 2, 203, 858, 3, 2, 2, 2, 205, 863, 3, 2, 2, 2, 207, 872, 3, 2, 2, 2, 209, 880, 3, 2, 2, 2, 211, 887, 3, 2, 2, 2, 213, 897, 3, 2, 2, 2, 215, 902, 3, 2, 2, 2, 217, 908, 3, 2, 2, 2, 219, 913, 3, 2, 2, 2, 221, 922, 3, 2, 2, 2, 223, 931, 3, 2, 2, 2, 225, 939, 3, 2, 2, 2, 227, 947, 3, 2, 2, 2, 229, 952, 3, 2, 2, 2, 231, 961, 3, 2, 2, 2, 233, 968, 3, 2, 2, 2, 235, 975, 3, 2, 2, 2, 237, 982, 3, 2, 2, 2, 239, 990, 3, 2, 2, 2, 241, 995, 3, 2, 2, 2, 243, 1002, 3, 2, 2, 2, 245, 1009, 3, 2, 2, 2, 247, 1014, 3, 2, 2, 2, 249, 1020, 3, 2, 2, 2, 251, 1025, 3, 2, 2, 2, 253, 1030, 3, 2, 2, 2, 255, 1039, 3, 2, 2, 2, 257, 1045, 3, 2, 2, 2, 259, 1050, 3, 2, 2, 2, 261, 1059, 3, 2, 2, 2, 263, 1064, 3, 2, 2, 2, 265, 1074, 3, 2, 2, 2, 267, 1080, 3, 2, 2, 2, 269, 1090, 3, 2, 2, 2, 271, 1095, 3, 2, 2, 2, 273, 1101, 3, 2, 2, 2, 275, 1103, 3, 2, 2, 2, 277, 1105, 3, 2, 2, 2, 279, 1110, 3, 2, 2, 2, 281, 1115, 3, 2, 2, 2, 283, 1117, 3, 2, 2, 2, 285, 1129, 3, 2, 2, 2, 287, 1143, 3, 2, 2, 2, 289, 1152, 3, 2, 2, 2, 291, 1156, 3, 2, 2, 2, 293, 1160, 3, 2, 2, 2, 295, 1168, 3, 2, 2, 2, 297, 1172, 3, 2, 2, 2, 299, 1174, 3, 2, 2, 2, 301, 1196, 3, 2, 2, 2, 303, 304, 7, 61, 2, 2, 304, 4, 3, 2, 2, 2, 305, 306, 7, 111, 2, 2, 306, 307, 7, 113, 2, 2, 307, 308, 7, 102, 2, 2, 308, 309, 7, 119, 2, 2, 309, 310, 7, 110, 2, 2, 310, 311, 7, 103, 2, 2, 311, 6, 3, 2, 2, 2, 312, 313, 7, 112, 2, 2, 313, 314, 7, 99, 2, 2, 314, 315, 7, 111, 2, 2, 315, 316, 7, 103, 2, 2, 316, 317, 7, 117, 2, 2, 317, 318, 7, 114, 2, 2, 318, 319, 7, 99, 2, 2, 319, 320, 7, 101, 2, 2, 320, 321, 7, 103, 2, 2, 321, 8, 3, 2, 2, 2, 322, 323, 7, 63, 2, 2, 323, 10, 3, 2, 2, 2, 324, 325, 7, 38, 2, 2, 325, 12, 3, 2, 2, 2, 326, 327, 7, 60, 2, 2, 327, 328, 7, 63, 2, 2, 328, 14, 3, 2, 2, 2, 329, 330, 7, 125, 2, 2, 330, 16, 3, 2, 2, 2, 331, 332, 7, 127, 2, 2, 332, 18, 3, 2, 2, 2, 333, 334, 7, 42, 2, 2, 334, 20, 3, 2, 2, 2, 335, 336, 7, 43, 2, 2, 336, 22, 3, 2, 2, 2, 337, 338, 7, 44, 2, 2, 338, 24, 3, 2, 2, 2, 339, 340, 7, 126, 2, 2, 340, 26, 3, 2, 2, 2, 341, 342, 7, 39, 2, 2, 342, 28, 3, 2, 2, 2, 343, 344, 7, 46, 2, 2, 344, 30, 3, 2, 2, 2, 345, 346, 7, 113, 2, 2, 346, 347, 7, 116, 2, 2, 347, 348, 7, 102, 2, 2, 348, 349, 7, 103, 2, 2, 349, 350, 7, 116, 2, 2, 350, 351, 7, 107, 2, 2, 351, 352, 7, 112, 2, 2, 352, 353, 7, 105, 2, 2, 353, 32, 3, 2, 2, 2, 354, 355, 7, 113, 2, 2, 355, 356, 7, 116, 2, 2, 356, 357, 7, 102, 2, 2, 357, 358, 7, 103, 2, 2, 358, 359, 7, 116, 2, 2, 359, 360, 7, 103, 2, 2, 360, 361, 7, 102, 2, 2, 361, 34, 3, 2, 2, 2, 362, 363, 7, 102, 2, 2, 363, 364, 7, 103, 2, 2, 364, 365, 7, 101, 2, 2, 365, 366, 7, 107, 2, 2, 366, 367, 7, 111, 2, 2, 367, 368, 7, 99, 2, 2, 368, 369, 7, 110, 2, 2, 369, 370, 7, 47, 2, 2, 370, 371, 7, 104, 2, 2, 371, 372, 7, 113, 2, 2, 372, 373, 7, 116, 2, 2, 373, 374, 7, 111, 2, 2, 374, 375, 7, 99, 2, 2, 375, 376, 7, 118, 2, 2, 376, 36, 3, 2, 2, 2, 377, 378, 7, 60, 2, 2, 378, 38, 3, 2, 2, 2, 379, 380, 7, 102, 2, 2, 380, 381, 7, 103, 2, 2, 381, 382, 7, 101, 2, 2, 382, 383, 7, 107, 2, 2, 383, 384, 7, 111, 2, 2, 384, 385, 7, 99, 2, 2, 385, 386, 7, 110, 2, 2, 386, 387, 7, 47, 2, 2, 387, 388, 7, 117, 2, 2, 388, 389, 7, 103, 2, 2, 389, 390, 7, 114, 2, 2, 390, 391, 7, 99, 2, 2, 391, 392, 7, 116, 2, 2, 392, 393, 7, 99, 2, 2, 393, 394, 7, 118, 2, 2, 394, 395, 7, 113, 2, 2, 395, 396, 7, 116, 2, 2, 396, 40, 3, 2, 2, 2, 397, 398, 7, 105, 2, 2, 398, 399, 7, 116, 2, 2, 399, 400, 7, 113, 2, 2, 400, 401, 7, 119, 2, 2, 401, 402, 7, 114, 2, 2, 402, 403, 7, 107, 2, 2, 403, 404, 7, 112, 2, 2, 404, 405, 7, 105, 2, 2, 405, 406, 7, 47, 2, 2, 406, 407, 7, 117, 2, 2, 407, 408, 7, 103, 2, 2, 408, 409, 7, 114, 2, 2, 409, 410, 7, 99, 2, 2, 410, 411, 7, 116, 2, 2, 411, 412, 7, 99, 2, 2, 412, 413, 7, 118, 2, 2, 413, 414, 7, 113, 2, 2, 414, 415, 7, 116, 2, 2, 415, 42, 3, 2, 2, 2, 416, 417, 7, 107, 2, 2, 417, 418, 7, 112, 2, 2, 418, 419, 7, 104, 2, 2, 419, 420, 7, 107, 2, 2, 420, 421, 7, 112, 2, 2, 421, 422, 7, 107, 2, 2, 422, 423, 7, 118, 2, 2, 423, 424, 7, 123, 2, 2, 424, 44, 3, 2, 2, 2, 425, 426, 7, 111, 2, 2, 426, 427, 7, 107, 2, 2, 427, 428, 7, 112, 2, 2, 428, 429, 7, 119, 2, 2, 429, 430, 7, 117, 2, 2, 430, 431, 7, 47, 2, 2, 431, 432, 7, 117, 2, 2, 432, 433, 7, 107, 2, 2, 433, 434, 7, 105, 2, 2, 434, 435, 7, 112, 2, 2, 435, 46, 3, 2, 2, 2, 436, 437, 7, 80, 2, 2, 437, 438, 7, 99, 2, 2, 438, 439, 7, 80, 2, 2, 439, 48, 3, 2, 2, 2, 440, 441, 7, 114, 2, 2, 441, 442, 7, 103, 2, 2, 442, 443, 7, 116, 2, 2, 443, 444, 7, 101, 2, 2, 444, 445, 7, 103, 2, 2, 445, 446, 7, 112, 2, 2, 446, 447, 7, 118, 2, 2, 447, 50, 3, 2, 2, 2, 448, 449, 7, 114, 2, 2, 449, 450, 7, 103, 2, 2, 450, 451, 7, 116, 2, 2, 451, 452, 7, 47, 2, 2, 452, 453, 7, 111, 2, 2, 453, 454, 7, 107, 2, 2, 454, 455, 7, 110, 2, 2, 455, 456, 7, 110, 2, 2, 456, 457, 7, 103, 2, 2, 457, 52, 3, 2, 2, 2, 458, 459, 7, 124, 2, 2, 459, 460, 7, 103, 2, 2, 460, 461, 7, 116, 2, 2, 461, 462, 7, 113, 2, 2, 462, 463, 7, 47, 2, 2, 463, 464, 7, 102, 2, 2, 464, 465, 7, 107, 2, 2, 465, 466, 7, 105, 2, 2, 466, 467, 7, 107, 2, 2, 467, 468, 7, 118, 2, 2, 468, 54, 3, 2, 2, 2, 469, 470, 7, 102, 2, 2, 470, 471, 7, 107, 2, 2, 471, 472, 7, 105, 2, 2, 472, 473, 7, 107, 2, 2, 473, 474, 7, 118, 2, 2, 474, 56, 3, 2, 2, 2, 475, 476, 7, 114, 2, 2, 476, 477, 7, 99, 2, 2, 477, 478, 7, 118, 2, 2, 478, 479, 7, 118, 2, 2, 479, 480, 7, 103, 2, 2, 480, 481, 7, 116, 2, 2, 481, 482, 7, 112, 2, 2, 482, 483, 7, 47, 2, 2, 483, 484, 7, 117, 2, 2, 484, 485, 7, 103, 2, 2, 485, 486, 7, 114, 2, 2, 486, 487, 7, 99, 2, 2, 487, 488, 7, 116, 2, 2, 488, 489, 7, 99, 2, 2, 489, 490, 7, 118, 2, 2, 490, 491, 7, 113, 2, 2, 491, 492, 7, 116, 2, 2, 492, 58, 3, 2, 2, 2, 493, 494, 7, 107, 2, 2, 494, 495, 7, 111, 2, 2, 495, 496, 7, 114, 2, 2, 496, 497, 7, 113, 2, 2, 497, 498, 7, 116, 2, 2, 498, 499, 7, 118, 2, 2, 499, 60, 3, 2, 2, 2, 500, 501, 7, 103, 2, 2, 501, 502, 7, 122, 2, 2, 502, 503, 7, 118, 2, 2, 503, 504, 7, 103, 2, 2, 504, 505, 7, 116, 2, 2, 505, 506, 7, 112, 2, 2, 506, 507, 7, 99, 2, 2, 507, 508, 7, 110, 2, 2, 508, 62, 3, 2, 2, 2, 509, 510, 7, 104, 2, 2, 510, 511, 7, 119, 2, 2, 511, 512, 7, 112, 2, 2, 512, 513, 7, 101, 2, 2, 513, 514, 7, 118, 2, 2, 514, 515, 7, 107, 2, 2, 515, 516, 7, 113, 2, 2, 516, 517, 7, 112, 2, 2, 517, 64, 3, 2, 2, 2, 518, 519, 7, 108, 2, 2, 519, 520, 7, 117, 2, 2, 520, 521, 7, 113, 2, 2, 521, 522, 7, 119, 2, 2, 522, 523, 7, 112, 2, 2, 523, 524, 7, 102, 2, 2, 524, 66, 3, 2, 2, 2, 525, 526, 7, 101, 2, 2, 526, 527, 7, 113, 2, 2, 527, 528, 7, 111, 2, 2, 528, 529, 7, 114, 2, 2, 529, 530, 7, 99, 2, 2, 530, 531, 7, 101, 2, 2, 531, 532, 7, 118, 2, 2, 532, 68, 3, 2, 2, 2, 533, 534, 7, 120, 2, 2, 534, 535, 7, 103, 2, 2, 535, 536, 7, 116, 2, 2, 536, 537, 7, 100, 2, 2, 537, 538, 7, 113, 2, 2, 538, 539, 7, 117, 2, 2, 539, 540, 7, 103, 2, 2, 540, 70, 3, 2, 2, 2, 541, 542, 7, 117, 2, 2, 542, 543, 7, 101, 2, 2, 543, 544, 7, 106, 2, 2, 544, 545, 7, 103, 2, 2, 545, 546, 7, 111, 2, 2, 546, 547, 7, 99, 2, 2, 547, 72, 3, 2, 2, 2, 548, 549, 7, 103, 2, 2, 549, 550, 7, 115, 2, 2, 550, 74, 3, 2, 2, 2, 551, 552, 7, 112, 2, 2, 552, 553, 7, 103, 2, 2, 553, 76, 3, 2, 2, 2, 554, 555, 7, 110, 2, 2, 555, 556, 7, 118, 2, 2, 556, 78, 3, 2, 2, 2, 557, 558, 7, 110, 2, 2, 558, 559, 7, 103, 2, 2, 559, 80, 3, 2, 2, 2, 560, 561, 7, 105, 2, 2, 561, 562, 7, 118, 2, 2, 562, 82, 3, 2, 2, 2, 563, 564, 7, 105, 2, 2, 564, 565, 7, 103, 2, 2, 565, 84, 3, 2, 2, 2, 566, 567, 7, 35, 2, 2, 567, 568, 7, 63, 2, 2, 568, 86, 3, 2, 2, 2, 569, 570, 7, 62, 2, 2, 570, 88, 3, 2, 2, 2, 571, 572, 7, 62, 2, 2, 572, 573, 7, 63, 2, 2, 573, 90, 3, 2, 2, 2, 574, 575, 7, 64, 2, 2, 575, 92, 3, 2, 2, 2, 576, 577, 7, 64, 2, 2, 577, 578, 7, 63, 2, 2, 578, 94, 3, 2, 2, 2, 579, 580, 7, 126, 2, 2, 580, 581, 7, 126, 2, 2, 581, 96, 3, 2, 2, 2, 582, 583, 7, 45, 2, 2, 583, 98, 3, 2, 2, 2, 584, 585, 7, 47, 2, 2, 585, 100, 3, 2, 2, 2, 586, 587, 7, 102, 2, 2, 587, 588, 7, 107, 2, 2, 588, 589, 7, 120, 2, 2, 589, 102, 3, 2, 2, 2, 590, 591, 7, 107, 2, 2, 591, 592, 7, 102, 2, 2, 592, 593, 7, 107, 2, 2, 593, 594, 7, 120, 2, 2, 594, 104, 3, 2, 2, 2, 595, 596, 7, 111, 2, 2, 596, 597, 7, 113, 2, 2, 597, 598, 7, 102, 2, 2, 598, 106, 3, 2, 2, 2, 599, 600, 7, 35, 2, 2, 600, 108, 3, 2, 2, 2, 601, 602, 7, 93, 2, 2, 602, 110, 3, 2, 2, 2, 603, 604, 7, 95, 2, 2, 604, 112, 3, 2, 2, 2, 605, 606, 7, 48, 2, 2, 606, 114, 3, 2, 2, 2, 607, 608, 7, 38, 2, 2, 608, 609, 7, 38, 2, 2, 609, 116, 3, 2, 2, 2, 610, 611, 7, 37, 2, 2, 611, 118, 3, 2, 2, 2, 612, 613, 7, 125, 2, 2, 613, 614, 7, 126, 2, 2, 614, 120, 3, 2, 2, 2, 615, 616, 7, 126, 2, 2, 616, 617, 7, 127, 2, 2, 617, 122, 3, 2, 2, 2, 618, 619, 7, 104, 2, 2, 619, 620, 7, 113, 2, 2, 620, 621, 7, 116, 2, 2, 621, 124, 3, 2, 2, 2, 622, 623, 7, 110, 2, 2, 623, 624, 7, 103, 2, 2, 624, 625, 7, 118, 2, 2, 625, 126, 3, 2, 2, 2, 626, 627, 7, 121, 2, 2, 627, 628, 7, 106, 2, 2, 628, 629, 7, 103, 2, 2, 629, 630, 7, 116, 2, 2, 630, 631, 7, 103, 2, 2, 631, 128, 3, 2, 2, 2, 632, 633, 7, 105, 2, 2, 633, 634, 7, 116, 2, 2, 634, 635, 7, 113, 2, 2, 635, 636, 7, 119, 2, 2, 636, 637, 7, 114, 2, 2, 637, 130, 3, 2, 2, 2, 638, 639, 7, 100, 2, 2, 639, 640, 7, 123, 2, 2, 640, 132, 3, 2, 2, 2, 641, 642, 7, 113, 2, 2, 642, 643, 7, 116, 2, 2, 643, 644, 7, 102, 2, 2, 644, 645, 7, 103, 2, 2, 645, 646, 7, 116, 2, 2, 646, 134, 3, 2, 2, 2, 647, 648, 7, 116, 2, 2, 648, 649, 7, 103, 2, 2, 649, 650, 7, 118, 2, 2, 650, 651, 7, 119, 2, 2, 651, 652, 7, 116, 2, 2, 652, 653, 7, 112, 2, 2, 653, 136, 3, 2, 2, 2, 654, 655, 7, 107, 2, 2, 655, 656, 7, 104, 2, 2, 656, 138, 3, 2, 2, 2, 657, 658, 7, 107, 2, 2, 658, 659, 7, 112, 2, 2, 659, 140, 3, 2, 2, 2, 660, 661, 7, 99, 2, 2, 661, 662, 7, 117, 2, 2, 662, 142, 3, 2, 2, 2, 663, 664, 7, 99, 2, 2, 664, 665, 7, 118, 2, 2, 665, 144, 3, 2, 2, 2, 666, 667, 7, 99, 2, 2, 667, 668, 7, 110, 2, 2, 668, 669, 7, 110, 2, 2, 669, 670, 7, 113, 2, 2, 670, 671, 7, 121, 2, 2, 671, 672, 7, 107, 2, 2, 672, 673, 7, 112, 2, 2, 673, 674, 7, 105, 2, 2, 674, 146, 3, 2, 2, 2, 675, 676, 7, 103, 2, 2, 676, 677, 7, 111, 2, 2, 677, 678, 7, 114, 2, 2, 678, 679, 7, 118, 2, 2, 679, 680, 7, 123, 2, 2, 680, 148, 3, 2, 2, 2, 681, 682, 7, 101, 2, 2, 682, 683, 7, 113, 2, 2, 683, 684, 7, 119, 2, 2, 684, 685, 7, 112, 2, 2, 685, 686, 7, 118, 2, 2, 686, 150, 3, 2, 2, 2, 687, 688, 7, 117, 2, 2, 688, 689, 7, 118, 2, 2, 689, 690, 7, 99, 2, 2, 690, 691, 7, 100, 2, 2, 691, 692, 7, 110, 2, 2, 692, 693, 7, 103, 2, 2, 693, 152, 3, 2, 2, 2, 694, 695, 7, 99, 2, 2, 695, 696, 7, 117, 2, 2, 696, 697, 7, 101, 2, 2, 697, 698, 7, 103, 2, 2, 698, 699, 7, 112, 2, 2, 699, 700, 7, 102, 2, 2, 700, 701, 7, 107, 2, 2, 701, 702, 7, 112, 2, 2, 702, 703, 7, 105, 2, 2, 703, 154, 3, 2, 2, 2, 704, 705, 7, 102, 2, 2, 705, 706, 7, 103, 2, 2, 706, 707, 7, 117, 2, 2, 707, 708, 7, 101, 2, 2, 708, 709, 7, 103, 2, 2, 709, 710, 7, 112, 2, 2, 710, 711, 7, 102, 2, 2, 711, 712, 7, 107, 2, 2, 712, 713, 7, 112, 2, 2, 713, 714, 7, 105, 2, 2, 714, 156, 3, 2, 2, 2, 715, 716, 7, 117, 2, 2, 716, 717, 7, 113, 2, 2, 717, 718, 7, 111, 2, 2, 718, 719, 7, 103, 2, 2, 719, 158, 3, 2, 2, 2, 720, 721, 7, 103, 2, 2, 721, 722, 7, 120, 2, 2, 722, 723, 7, 103, 2, 2, 723, 724, 7, 116, 2, 2, 724, 725, 7, 123, 2, 2, 725, 160, 3, 2, 2, 2, 726, 727, 7, 117, 2, 2, 727, 728, 7, 99, 2, 2, 728, 729, 7, 118, 2, 2, 729, 730, 7, 107, 2, 2, 730, 731, 7, 117, 2, 2, 731, 732, 7, 104, 2, 2, 732, 733, 7, 107, 2, 2, 733, 734, 7, 103, 2, 2, 734, 735, 7, 117, 2, 2, 735, 162, 3, 2, 2, 2, 736, 737, 7, 101, 2, 2, 737, 738, 7, 113, 2, 2, 738, 739, 7, 110, 2, 2, 739, 740, 7, 110, 2, 2, 740, 741, 7, 99, 2, 2, 741, 742, 7, 118, 2, 2, 742, 743, 7, 107, 2, 2, 743, 744, 7, 113, 2, 2, 744, 745, 7, 112, 2, 2, 745, 164, 3, 2, 2, 2, 746, 747, 7, 105, 2, 2, 747, 748, 7, 116, 2, 2, 748, 749, 7, 103, 2, 2, 749, 750, 7, 99, 2, 2, 750, 751, 7, 118, 2, 2, 751, 752, 7, 103, 2, 2, 752, 753, 7, 117, 2, 2, 753, 754, 7, 118, 2, 2, 754, 166, 3, 2, 2, 2, 755, 756, 7, 110, 2, 2, 756, 757, 7, 103, 2, 2, 757, 758, 7, 99, 2, 2, 758, 759, 7, 117, 2, 2, 759, 760, 7, 118, 2, 2, 760, 168, 3, 2, 2, 2, 761, 762, 7, 117, 2, 2, 762, 763, 7, 121, 2, 2, 763, 764, 7, 107, 2, 2, 764, 765, 7, 118, 2, 2, 765, 766, 7, 101, 2, 2, 766, 767, 7, 106, 2, 2, 767, 170, 3, 2, 2, 2, 768, 769, 7, 101, 2, 2, 769, 770, 7, 99, 2, 2, 770, 771, 7, 117, 2, 2, 771, 772, 7, 103, 2, 2, 772, 172, 3, 2, 2, 2, 773, 774, 7, 118, 2, 2, 774, 775, 7, 116, 2, 2, 775, 776, 7, 123, 2, 2, 776, 174, 3, 2, 2, 2, 777, 778, 7, 101, 2, 2, 778, 779, 7, 99, 2, 2, 779, 780, 7, 118, 2, 2, 780, 781, 7, 101, 2, 2, 781, 782, 7, 106, 2, 2, 782, 176, 3, 2, 2, 2, 783, 784, 7, 102, 2, 2, 784, 785, 7, 103, 2, 2, 785, 786, 7, 104, 2, 2, 786, 787, 7, 99, 2, 2, 787, 788, 7, 119, 2, 2, 788, 789, 7, 110, 2, 2, 789, 790, 7, 118, 2, 2, 790, 178, 3, 2, 2, 2, 791, 792, 7, 118, 2, 2, 792, 793, 7, 106, 2, 2, 793, 794, 7, 103, 2, 2, 794, 795, 7, 112, 2, 2, 795, 180, 3, 2, 2, 2, 796, 797, 7, 103, 2, 2, 797, 798, 7, 110, 2, 2, 798, 799, 7, 117, 2, 2, 799, 800, 7, 103, 2, 2, 800, 182, 3, 2, 2, 2, 801, 802, 7, 118, 2, 2, 802, 803, 7, 123, 2, 2, 803, 804, 7, 114, 2, 2, 804, 805, 7, 103, 2, 2, 805, 806, 7, 117, 2, 2, 806, 807, 7, 121, 2, 2, 807, 808, 7, 107, 2, 2, 808, 809, 7, 118, 2, 2, 809, 810, 7, 101, 2, 2, 810, 811, 7, 106, 2, 2, 811, 184, 3, 2, 2, 2, 812, 813, 7, 113, 2, 2, 813, 814, 7, 116, 2, 2, 814, 186, 3, 2, 2, 2, 815, 816, 7, 99, 2, 2, 816, 817, 7, 112, 2, 2, 817, 818, 7, 102, 2, 2, 818, 188, 3, 2, 2, 2, 819, 820, 7, 112, 2, 2, 820, 821, 7, 113, 2, 2, 821, 822, 7, 118, 2, 2, 822, 190, 3, 2, 2, 2, 823, 824, 7, 118, 2, 2, 824, 825, 7, 113, 2, 2, 825, 192, 3, 2, 2, 2, 826, 827, 7, 107, 2, 2, 827, 828, 7, 112, 2, 2, 828, 829, 7, 117, 2, 2, 829, 830, 7, 118, 2, 2, 830, 831, 7, 99, 2, 2, 831, 832, 7, 112, 2, 2, 832, 833, 7, 101, 2, 2, 833, 834, 7, 103, 2, 2, 834, 194, 3, 2, 2, 2, 835, 836, 7, 113, 2, 2, 836, 837, 7, 104, 2, 2, 837, 196, 3, 2, 2, 2, 838, 839, 7, 117, 2, 2, 839, 840, 7, 118, 2, 2, 840, 841, 7, 99, 2, 2, 841, 842, 7, 118, 2, 2, 842, 843, 7, 107, 2, 2, 843, 844, 7, 101, 2, 2, 844, 845, 7, 99, 2, 2, 845, 846, 7, 110, 2, 2, 846, 847, 7, 110, 2, 2, 847, 848, 7, 123, 2, 2, 848, 198, 3, 2, 2, 2, 849, 850, 7, 107, 2, 2, 850, 851, 7, 117, 2, 2, 851, 200, 3, 2, 2, 2, 852, 853, 7, 118, 2, 2, 853, 854, 7, 116, 2, 2, 854, 855, 7, 103, 2, 2, 855, 856, 7, 99, 2, 2, 856, 857, 7, 118, 2, 2, 857, 202, 3, 2, 2, 2, 858, 859, 7, 101, 2, 2, 859, 860, 7, 99, 2, 2, 860, 861, 7, 117, 2, 2, 861, 862, 7, 118, 2, 2, 862, 204, 3, 2, 2, 2, 863, 864, 7, 101, 2, 2, 864, 865, 7, 99, 2, 2, 865, 866, 7, 117, 2, 2, 866, 867, 7, 118, 2, 2, 867, 868, 7, 99, 2, 2, 868, 869, 7, 100, 2, 2, 869, 870, 7, 110, 2, 2, 870, 871, 7, 103, 2, 2, 871, 206, 3, 2, 2, 2, 872, 873, 7, 120, 2, 2, 873, 874, 7, 103, 2, 2, 874, 875, 7, 116, 2, 2, 875, 876, 7, 117, 2, 2, 876, 877, 7, 107, 2, 2, 877, 878, 7, 113, 2, 2, 878, 879, 7, 112, 2, 2, 879, 208, 3, 2, 2, 2, 880, 881, 7, 108, 2, 2, 881, 882, 7, 117, 2, 2, 882, 883, 7, 113, 2, 2, 883, 884, 7, 112, 2, 2, 884, 885, 7, 107, 2, 2, 885, 886, 7, 115, 2, 2, 886, 210, 3, 2, 2, 2, 887, 888, 7, 119, 2, 2, 888, 889, 7, 112, 2, 2, 889, 890, 7, 113, 2, 2, 890, 891, 7, 116, 2, 2, 891, 892, 7, 102, 2, 2, 892, 893, 7, 103, 2, 2, 893, 894, 7, 116, 2, 2, 894, 895, 7, 103, 2, 2, 895, 896, 7, 102, 2, 2, 896, 212, 3, 2, 2, 2, 897, 898, 7, 118, 2, 2, 898, 899, 7, 116, 2, 2, 899, 900, 7, 119, 2, 2, 900, 901, 7, 103, 2, 2, 901, 214, 3, 2, 2, 2, 902, 903, 7, 104, 2, 2, 903, 904, 7, 99, 2, 2, 904, 905, 7, 110, 2, 2, 905, 906, 7, 117, 2, 2, 906, 907, 7, 103, 2, 2, 907, 216, 3, 2, 2, 2, 908, 909, 7, 118, 2, 2, 909, 910, 7, 123, 2, 2, 910, 911, 7, 114, 2, 2, 911, 912, 7, 103, 2, 2, 912, 218, 3, 2, 2, 2, 913, 914, 7, 120, 2, 2, 914, 915, 7, 99, 2, 2, 915, 916, 7, 110, 2, 2, 916, 917, 7, 107, 2, 2, 917, 918, 7, 102, 2, 2, 918, 919, 7, 99, 2, 2, 919, 920, 7, 118, 2, 2, 920, 921, 7, 103, 2, 2, 921, 220, 3, 2, 2, 2, 922, 923, 7, 99, 2, 2, 923, 924, 7, 112, 2, 2, 924, 925, 7, 112, 2, 2, 925, 926, 7, 113, 2, 2, 926, 927, 7, 118, 2, 2, 927, 928, 7, 99, 2, 2, 928, 929, 7, 118, 2, 2, 929, 930, 7, 103, 2, 2, 930, 222, 3, 2, 2, 2, 931, 932, 7, 102, 2, 2, 932, 933, 7, 103, 2, 2, 933, 934, 7, 101, 2, 2, 934, 935, 7, 110, 2, 2, 935, 936, 7, 99, 2, 2, 936, 937, 7, 116, 2, 2, 937, 938, 7, 103, 2, 2, 938, 224, 3, 2, 2, 2, 939, 940, 7, 101, 2, 2, 940, 941, 7, 113, 2, 2, 941, 942, 7, 112, 2, 2, 942, 943, 7, 118, 2, 2, 943, 944, 7, 103, 2, 2, 944, 945, 7, 122, 2, 2, 945, 946, 7, 118, 2, 2, 946, 226, 3, 2, 2, 2, 947, 948, 7, 107, 2, 2, 948, 949, 7, 118, 2, 2, 949, 950, 7, 103, 2, 2, 950, 951, 7, 111, 2, 2, 951, 228, 3, 2, 2, 2, 952, 953, 7, 120, 2, 2, 953, 954, 7, 99, 2, 2, 954, 955, 7, 116, 2, 2, 955, 956, 7, 107, 2, 2, 956, 957, 7, 99, 2, 2, 957, 958, 7, 100, 2, 2, 958, 959, 7, 110, 2, 2, 959, 960, 7, 103, 2, 2, 960, 230, 3, 2, 2, 2, 961, 962, 7, 107, 2, 2, 962, 963, 7, 112, 2, 2, 963, 964, 7, 117, 2, 2, 964, 965, 7, 103, 2, 2, 965, 966, 7, 116, 2, 2, 966, 967, 7, 118, 2, 2, 967, 232, 3, 2, 2, 2, 968, 969, 7, 102, 2, 2, 969, 970, 7, 103, 2, 2, 970, 971, 7, 110, 2, 2, 971, 972, 7, 103, 2, 2, 972, 973, 7, 118, 2, 2, 973, 974, 7, 103, 2, 2, 974, 234, 3, 2, 2, 2, 975, 976, 7, 116, 2, 2, 976, 977, 7, 103, 2, 2, 977, 978, 7, 112, 2, 2, 978, 979, 7, 99, 2, 2, 979, 980, 7, 111, 2, 2, 980, 981, 7, 103, 2, 2, 981, 236, 3, 2, 2, 2, 982, 983, 7, 116, 2, 2, 983, 984, 7, 103, 2, 2, 984, 985, 7, 114, 2, 2, 985, 986, 7, 110, 2, 2, 986, 987, 7, 99, 2, 2, 987, 988, 7, 101, 2, 2, 988, 989, 7, 103, 2, 2, 989, 238, 3, 2, 2, 2, 990, 991, 7, 101, 2, 2, 991, 992, 7, 113, 2, 2, 992, 993, 7, 114, 2, 2, 993, 994, 7, 123, 2, 2, 994, 240, 3, 2, 2, 2, 995, 996, 7, 111, 2, 2, 996, 997, 7, 113, 2, 2, 997, 998, 7, 102, 2, 2, 998, 999, 7, 107, 2, 2, 999, 1000, 7, 104, 2, 2, 1000, 1001, 7, 123, 2, 2, 1001, 242, 3, 2, 2, 2, 1002, 1003, 7, 99, 2, 2, 1003, 1004, 7, 114, 2, 2, 1004, 1005, 7, 114, 2, 2, 1005, 1006, 7, 103, 2, 2, 1006, 1007, 7, 112, 2, 2, 1007, 1008, 7, 102, 2, 2, 1008, 244, 3, 2, 2, 2, 1009, 1010, 7, 107, 2, 2, 1010, 1011, 7, 112, 2, 2, 1011, 1012, 7, 118, 2, 2, 1012, 1013, 7, 113, 2, 2, 1013, 246, 3, 2, 2, 2, 1014, 1015, 7, 120, 2, 2, 1015, 1016, 7, 99, 2, 2, 1016, 1017, 7, 110, 2, 2, 1017, 1018, 7, 119, 2, 2, 1018, 1019, 7, 103, 2, 2, 1019, 248, 3, 2, 2, 2, 1020, 1021, 7, 108, 2, 2, 1021, 1022, 7, 117, 2, 2, 1022, 1023, 7, 113, 2, 2, 1023, 1024, 7, 112, 2, 2, 1024, 250, 3, 2, 2, 2, 1025, 1026, 7, 121, 2, 2, 1026, 1027, 7, 107, 2, 2, 1027, 1028, 7, 118, 2, 2, 1028, 1029, 7, 106, 2, 2, 1029, 252, 3, 2, 2, 2, 1030, 1031, 7, 114, 2, 2, 1031, 1032, 7, 113, 2, 2, 1032, 1033, 7, 117, 2, 2, 1033, 1034, 7, 107, 2, 2, 1034, 1035, 7, 118, 2, 2, 1035, 1036, 7, 107, 2, 2, 1036, 1037, 7, 113, 2, 2, 1037, 1038, 7, 112, 2, 2, 1038, 254, 3, 2, 2, 2, 1039, 1040, 7, 100, 2, 2, 1040, 1041, 7, 116, 2, 2, 1041, 1042, 7, 103, 2, 2, 1042, 1043, 7, 99, 2, 2, 1043, 1044, 7, 109, 2, 2, 1044, 256, 3, 2, 2, 2, 1045, 1046, 7, 110, 2, 2, 1046, 1047, 7, 113, 2, 2, 1047, 1048, 7, 113, 2, 2, 1048, 1049, 7, 114, 2, 2, 1049, 258, 3, 2, 2, 2, 1050, 1051, 7, 101, 2, 2, 1051, 1052, 7, 113, 2, 2, 1052, 1053, 7, 112, 2, 2, 1053, 1054, 7, 118, 2, 2, 1054, 1055, 7, 107, 2, 2, 1055, 1056, 7, 112, 2, 2, 1056, 1057, 7, 119, 2, 2, 1057, 1058, 7, 103, 2, 2, 1058, 260, 3, 2, 2, 2, 1059, 1060, 7, 103, 2, 2, 1060, 1061, 7, 122, 2, 2, 1061, 1062, 7, 107, 2, 2, 1062, 1063, 7, 118, 2, 2, 1063, 262, 3, 2, 2, 2, 1064, 1065, 7, 116, 2, 2, 1065, 1066, 7, 103, 2, 2, 1066, 1067, 7, 118, 2, 2, 1067, 1068, 7, 119, 2, 2, 1068, 1069, 7, 116, 2, 2, 1069, 1070, 7, 112, 2, 2, 1070, 1071, 7, 107, 2, 2, 1071, 1072, 7, 112, 2, 2, 1072, 1073, 7, 105, 2, 2, 1073, 264, 3, 2, 2, 2, 1074, 1075, 7, 121, 2, 2, 1075, 1076, 7, 106, 2, 2, 1076, 1077, 7, 107, 2, 2, 1077, 1078, 7, 110, 2, 2, 1078, 1079, 7, 103, 2, 2, 1079, 266, 3, 2, 2, 2, 1080, 1085, 7, 36, 2, 2, 1081, 1084, 5, 269, 135, 2, 1082, 1084, 10, 2, 2, 2, 1083, 1081, 3, 2, 2, 2, 1083, 1082, 3, 2, 2, 2, 1084, 1087, 3, 2, 2, 2, 1085, 1083, 3, 2, 2, 2, 1085, 1086, 3, 2, 2, 2, 1086, 1088, 3, 2, 2, 2, 1087, 1085, 3, 2, 2, 2, 1088, 1089, 7, 36, 2, 2, 1089, 268, 3, 2, 2, 2, 1090, 1093, 7, 94, 2, 2, 1091, 1094, 9, 3, 2, 2, 1092, 1094, 5, 271, 136, 2, 1093, 1091, 3, 2, 2, 2, 1093, 1092, 3, 2, 2, 2, 1094, 270, 3, 2, 2, 2, 1095, 1096, 7, 119, 2, 2, 1096, 1097, 5, 273, 137, 2, 1097, 1098, 5, 273, 137, 2, 1098, 1099, 5, 273, 137, 2, 1099, 1100, 5, 273, 137, 2, 1100, 272, 3, 2, 2, 2, 1101, 1102, 9, 4, 2, 2, 1102, 274, 3, 2, 2, 2, 1103, 1104, 7, 65, 2, 2, 1104, 276, 3, 2, 2, 2, 1105, 1106, 7, 112, 2, 2, 1106, 1107, 7, 119, 2, 2, 1107, 1108, 7, 110, 2, 2, 1108, 1109, 7, 110, 2, 2, 1109, 278, 3, 2, 2, 2, 1110, 1111, 5, 281, 141, 2, 1111, 280, 3, 2, 2, 2, 1112, 1116, 5, 283, 142, 2, 1113, 1116, 5, 285, 143, 2, 1114, 1116, 5, 287, 144, 2, 1115, 1112, 3, 2, 2, 2, 1115, 1113, 3, 2, 2, 2, 1115, 1114, 3, 2, 2, 2, 1116, 282, 3, 2, 2, 2, 1117, 1118, 5, 289, 145, 2, 1118, 284, 3, 2, 2, 2, 1119, 1120, 7, 48, 2, 2, 1120, 1130, 5, 289, 145, 2, 1121, 1122, 5, 289, 145, 2, 1122, 1126, 7, 48, 2, 2, 1123, 1125, 9, 5, 2, 2, 1124, 1123, 3, 2, 2, 2, 1125, 1128, 3, 2, 2, 2, 1126, 1124, 3, 2, 2, 2, 1126, 1127, 3, 2, 2, 2, 1127, 1130, 3, 2, 2, 2, 1128, 1126, 3, 2, 2, 2, 1129, 1119, 3, 2, 2, 2, 1129, 1121, 3, 2, 2, 2, 1130, 286, 3, 2, 2, 2, 1131, 1132, 7, 48, 2, 2, 1132, 1144, 5, 289, 145, 2, 1133, 1141, 5, 289, 145, 2, 1134, 1138, 7, 48, 2, 2, 1135, 1137, 9, 5, 2, 2, 1136, 1135, 3, 2, 2, 2, 1137, 1140, 3, 2, 2, 2, 1138, 1136, 3, 2, 2, 2, 1138, 1139, 3, 2, 2, 2, 1139, 1142, 3, 2, 2, 2, 1140, 1138, 3, 2, 2, 2, 1141, 1134, 3, 2, 2, 2, 1141, 1142, 3, 2, 2, 2, 1142, 1144, 3, 2, 2, 2, 1143, 1131, 3, 2, 2, 2, 1143, 1133, 3, 2, 2, 2, 1144, 1145, 3, 2, 2, 2, 1145, 1147, 9, 6, 2, 2, 1146, 1148, 9, 7, 2, 2, 1147, 1146, 3, 2, 2, 2, 1147, 1148, 3, 2, 2, 2, 1148, 1149, 3, 2, 2, 2, 1149, 1150, 5, 289, 145, 2, 1150, 288, 3, 2, 2, 2, 1151, 1153, 9, 5, 2, 2, 1152, 1151, 3, 2, 2, 2, 1153, 1154, 3, 2, 2, 2, 1154, 1152, 3, 2, 2, 2, 1154, 1155, 3, 2, 2, 2, 1155, 290, 3, 2, 2, 2, 1156, 1157, 9, 8, 2, 2, 1157, 1158, 3, 2, 2, 2, 1158, 1159, 8, 146, 2, 2, 1159, 292, 3, 2, 2, 2, 1160, 1164, 5, 295, 148, 2, 1161, 1163, 5, 297, 149, 2, 1162, 1161, 3, 2, 2, 2, 1163, 1166, 3, 2, 2, 2, 1164, 1162, 3, 2, 2, 2, 1164, 1165, 3, 2, 2, 2, 1165, 294, 3, 2, 2, 2, 1166, 1164, 3, 2, 2, 2, 1167, 1169, 9, 9, 2, 2, 1168, 1167, 3, 2, 2, 2, 1169, 296, 3, 2, 2, 2, 1170, 1173, 5, 295, 148, 2, 1171, 1173, 9, 10, 2, 2, 1172, 1170, 3, 2, 2, 2, 1172, 1171, 3, 2, 2, 2, 1173, 298, 3, 2, 2, 2, 1174, 1175, 7, 42, 2, 2, 1175, 1184, 7, 60, 2, 2, 1176, 1183, 5, 299, 150, 2, 1177, 1178, 7, 42, 2, 2, 1178, 1183, 10, 11, 2, 2, 1179, 1180, 7, 60, 2, 2, 1180, 1183, 10, 12, 2, 2, 1181, 1183, 10, 13, 2, 2, 1182, 1176, 3, 2, 2, 2, 1182, 1177, 3, 2, 2, 2, 1182, 1179, 3, 2, 2, 2, 1182, 1181, 3, 2, 2, 2, 1183, 1186, 3, 2, 2, 2, 1184, 1182, 3, 2, 2, 2, 1184, 1185, 3, 2, 2, 2, 1185, 1188, 3, 2, 2, 2, 1186, 1184, 3, 2, 2, 2, 1187, 1189, 7, 60, 2, 2, 1188, 1187, 3, 2, 2, 2, 1189, 1190, 3, 2, 2, 2, 1190, 1188, 3, 2, 2, 2, 1190, 1191, 3, 2, 2, 2, 1191, 1192, 3, 2, 2, 2, 1192, 1193, 7, 43, 2, 2, 1193, 1194, 3, 2, 2, 2, 1194, 1195, 8, 150, 2, 2, 1195, 300, 3, 2, 2, 2, 1196, 1197, 10, 14, 2, 2, 1197, 302, 3, 2, 2, 2, 20, 2, 1083, 1085, 1093, 1115, 1126, 1129, 1138, 1141, 1143, 1147, 1154, 1164, 1168, 1172, 1182, 1184, 1190, 3, 2, 3, 2]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 178, 1596, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 4, 181, 9, 181, 4, 182, 9, 182, 4, 183, 9, 183, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 7, 166, 1482, 10, 166, 12, 166, 14, 166, 1485, 11, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 5, 167, 1492, 10, 167, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 170, 3, 170, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 172, 3, 172, 3, 173, 3, 173, 3, 173, 5, 173, 1514, 10, 173, 3, 174, 3, 174, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 7, 175, 1523, 10, 175, 12, 175, 14, 175, 1526, 11, 175, 5, 175, 1528, 10, 175, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 7, 176, 1535, 10, 176, 12, 176, 14, 176, 1538, 11, 176, 5, 176, 1540, 10, 176, 5, 176, 1542, 10, 176, 3, 176, 3, 176, 5, 176, 1546, 10, 176, 3, 176, 3, 176, 3, 177, 6, 177, 1551, 10, 177, 13, 177, 14, 177, 1552, 3, 178, 3, 178, 3, 178, 3, 178, 3, 179, 3, 179, 7, 179, 1561, 10, 179, 12, 179, 14, 179, 1564, 11, 179, 3, 180, 5, 180, 1567, 10, 180, 3, 181, 3, 181, 5, 181, 1571, 10, 181, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 7, 182, 1581, 10, 182, 12, 182, 14, 182, 1584, 11, 182, 3, 182, 6, 182, 1587, 10, 182, 13, 182, 14, 182, 1588, 3, 182, 3, 182, 3, 182, 3, 182, 3, 183, 3, 183, 2, 2, 184, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 110, 219, 111, 221, 112, 223, 113, 225, 114, 227, 115, 229, 116, 231, 117, 233, 118, 235, 119, 237, 120, 239, 121, 241, 122, 243, 123, 245, 124, 247, 125, 249, 126, 251, 127, 253, 128, 255, 129, 257, 130, 259, 131, 261, 132, 263, 133, 265, 134, 267, 135, 269, 136, 271, 137, 273, 138, 275, 139, 277, 140, 279, 141, 281, 142, 283, 143, 285, 144, 287, 145, 289, 146, 291, 147, 293, 148, 295, 149, 297, 150, 299, 151, 301, 152, 303, 153, 305, 154, 307, 155, 309, 156, 311, 157, 313, 158, 315, 159, 317, 160, 319, 161, 321, 162, 323, 163, 325, 164, 327, 165, 329, 166, 331, 167, 333, 2, 335, 2, 337, 2, 339, 168, 341, 169, 343, 170, 345, 171, 347, 172, 349, 173, 351, 174, 353, 2, 355, 175, 357, 176, 359, 2, 361, 2, 363, 177, 365, 178, 3, 2, 15, 4, 2, 36, 36, 94, 94, 10, 2, 36, 36, 49, 49, 94, 94, 100, 100, 104, 104, 112, 112, 116, 116, 118, 118, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 50, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 5, 2, 11, 12, 15, 15, 34, 34, 16, 2, 67, 92, 97, 97, 99, 124, 194, 216, 218, 248, 250, 769, 882, 895, 897, 8193, 8206, 8207, 8306, 8593, 11266, 12273, 12291, 55297, 63746, 64977, 65010, 65535, 7, 2, 47, 47, 50, 59, 185, 185, 770, 881, 8257, 8258, 3, 2, 60, 60, 3, 2, 43, 43, 4, 2, 42, 42, 60, 60, 7, 2, 36, 36, 40, 41, 62, 62, 125, 125, 127, 127, 2, 1608, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 2, 257, 3, 2, 2, 2, 2, 259, 3, 2, 2, 2, 2, 261, 3, 2, 2, 2, 2, 263, 3, 2, 2, 2, 2, 265, 3, 2, 2, 2, 2, 267, 3, 2, 2, 2, 2, 269, 3, 2, 2, 2, 2, 271, 3, 2, 2, 2, 2, 273, 3, 2, 2, 2, 2, 275, 3, 2, 2, 2, 2, 277, 3, 2, 2, 2, 2, 279, 3, 2, 2, 2, 2, 281, 3, 2, 2, 2, 2, 283, 3, 2, 2, 2, 2, 285, 3, 2, 2, 2, 2, 287, 3, 2, 2, 2, 2, 289, 3, 2, 2, 2, 2, 291, 3, 2, 2, 2, 2, 293, 3, 2, 2, 2, 2, 295, 3, 2, 2, 2, 2, 297, 3, 2, 2, 2, 2, 299, 3, 2, 2, 2, 2, 301, 3, 2, 2, 2, 2, 303, 3, 2, 2, 2, 2, 305, 3, 2, 2, 2, 2, 307, 3, 2, 2, 2, 2, 309, 3, 2, 2, 2, 2, 311, 3, 2, 2, 2, 2, 313, 3, 2, 2, 2, 2, 315, 3, 2, 2, 2, 2, 317, 3, 2, 2, 2, 2, 319, 3, 2, 2, 2, 2, 321, 3, 2, 2, 2, 2, 323, 3, 2, 2, 2, 2, 325, 3, 2, 2, 2, 2, 327, 3, 2, 2, 2, 2, 329, 3, 2, 2, 2, 2, 331, 3, 2, 2, 2, 2, 339, 3, 2, 2, 2, 2, 341, 3, 2, 2, 2, 2, 343, 3, 2, 2, 2, 2, 345, 3, 2, 2, 2, 2, 347, 3, 2, 2, 2, 2, 349, 3, 2, 2, 2, 2, 351, 3, 2, 2, 2, 2, 355, 3, 2, 2, 2, 2, 357, 3, 2, 2, 2, 2, 363, 3, 2, 2, 2, 2, 365, 3, 2, 2, 2, 3, 367, 3, 2, 2, 2, 5, 369, 3, 2, 2, 2, 7, 376, 3, 2, 2, 2, 9, 378, 3, 2, 2, 2, 11, 380, 3, 2, 2, 2, 13, 383, 3, 2, 2, 2, 15, 385, 3, 2, 2, 2, 17, 387, 3, 2, 2, 2, 19, 389, 3, 2, 2, 2, 21, 391, 3, 2, 2, 2, 23, 393, 3, 2, 2, 2, 25, 395, 3, 2, 2, 2, 27, 397, 3, 2, 2, 2, 29, 399, 3, 2, 2, 2, 31, 408, 3, 2, 2, 2, 33, 416, 3, 2, 2, 2, 35, 431, 3, 2, 2, 2, 37, 433, 3, 2, 2, 2, 39, 451, 3, 2, 2, 2, 41, 470, 3, 2, 2, 2, 43, 479, 3, 2, 2, 2, 45, 490, 3, 2, 2, 2, 47, 494, 3, 2, 2, 2, 49, 502, 3, 2, 2, 2, 51, 512, 3, 2, 2, 2, 53, 523, 3, 2, 2, 2, 55, 529, 3, 2, 2, 2, 57, 547, 3, 2, 2, 2, 59, 556, 3, 2, 2, 2, 61, 565, 3, 2, 2, 2, 63, 572, 3, 2, 2, 2, 65, 580, 3, 2, 2, 2, 67, 588, 3, 2, 2, 2, 69, 591, 3, 2, 2, 2, 71, 594, 3, 2, 2, 2, 73, 597, 3, 2, 2, 2, 75, 600, 3, 2, 2, 2, 77, 603, 3, 2, 2, 2, 79, 606, 3, 2, 2, 2, 81, 609, 3, 2, 2, 2, 83, 611, 3, 2, 2, 2, 85, 614, 3, 2, 2, 2, 87, 616, 3, 2, 2, 2, 89, 619, 3, 2, 2, 2, 91, 622, 3, 2, 2, 2, 93, 624, 3, 2, 2, 2, 95, 626, 3, 2, 2, 2, 97, 630, 3, 2, 2, 2, 99, 635, 3, 2, 2, 2, 101, 639, 3, 2, 2, 2, 103, 641, 3, 2, 2, 2, 105, 643, 3, 2, 2, 2, 107, 645, 3, 2, 2, 2, 109, 647, 3, 2, 2, 2, 111, 650, 3, 2, 2, 2, 113, 652, 3, 2, 2, 2, 115, 655, 3, 2, 2, 2, 117, 658, 3, 2, 2, 2, 119, 661, 3, 2, 2, 2, 121, 665, 3, 2, 2, 2, 123, 669, 3, 2, 2, 2, 125, 675, 3, 2, 2, 2, 127, 681, 3, 2, 2, 2, 129, 684, 3, 2, 2, 2, 131, 690, 3, 2, 2, 2, 133, 697, 3, 2, 2, 2, 135, 700, 3, 2, 2, 2, 137, 703, 3, 2, 2, 2, 139, 706, 3, 2, 2, 2, 141, 709, 3, 2, 2, 2, 143, 718, 3, 2, 2, 2, 145, 724, 3, 2, 2, 2, 147, 730, 3, 2, 2, 2, 149, 737, 3, 2, 2, 2, 151, 747, 3, 2, 2, 2, 153, 758, 3, 2, 2, 2, 155, 763, 3, 2, 2, 2, 157, 769, 3, 2, 2, 2, 159, 779, 3, 2, 2, 2, 161, 789, 3, 2, 2, 2, 163, 798, 3, 2, 2, 2, 165, 804, 3, 2, 2, 2, 167, 811, 3, 2, 2, 2, 169, 816, 3, 2, 2, 2, 171, 820, 3, 2, 2, 2, 173, 826, 3, 2, 2, 2, 175, 834, 3, 2, 2, 2, 177, 839, 3, 2, 2, 2, 179, 844, 3, 2, 2, 2, 181, 855, 3, 2, 2, 2, 183, 858, 3, 2, 2, 2, 185, 862, 3, 2, 2, 2, 187, 866, 3, 2, 2, 2, 189, 869, 3, 2, 2, 2, 191, 878, 3, 2, 2, 2, 193, 881, 3, 2, 2, 2, 195, 892, 3, 2, 2, 2, 197, 895, 3, 2, 2, 2, 199, 901, 3, 2, 2, 2, 201, 906, 3, 2, 2, 2, 203, 915, 3, 2, 2, 2, 205, 923, 3, 2, 2, 2, 207, 930, 3, 2, 2, 2, 209, 940, 3, 2, 2, 2, 211, 945, 3, 2, 2, 2, 213, 951, 3, 2, 2, 2, 215, 956, 3, 2, 2, 2, 217, 965, 3, 2, 2, 2, 219, 974, 3, 2, 2, 2, 221, 982, 3, 2, 2, 2, 223, 990, 3, 2, 2, 2, 225, 995, 3, 2, 2, 2, 227, 1004, 3, 2, 2, 2, 229, 1011, 3, 2, 2, 2, 231, 1018, 3, 2, 2, 2, 233, 1025, 3, 2, 2, 2, 235, 1033, 3, 2, 2, 2, 237, 1038, 3, 2, 2, 2, 239, 1045, 3, 2, 2, 2, 241, 1052, 3, 2, 2, 2, 243, 1057, 3, 2, 2, 2, 245, 1063, 3, 2, 2, 2, 247, 1068, 3, 2, 2, 2, 249, 1073, 3, 2, 2, 2, 251, 1082, 3, 2, 2, 2, 253, 1089, 3, 2, 2, 2, 255, 1096, 3, 2, 2, 2, 257, 1106, 3, 2, 2, 2, 259, 1114, 3, 2, 2, 2, 261, 1116, 3, 2, 2, 2, 263, 1119, 3, 2, 2, 2, 265, 1121, 3, 2, 2, 2, 267, 1127, 3, 2, 2, 2, 269, 1138, 3, 2, 2, 2, 271, 1148, 3, 2, 2, 2, 273, 1153, 3, 2, 2, 2, 275, 1172, 3, 2, 2, 2, 277, 1190, 3, 2, 2, 2, 279, 1200, 3, 2, 2, 2, 281, 1207, 3, 2, 2, 2, 283, 1216, 3, 2, 2, 2, 285, 1234, 3, 2, 2, 2, 287, 1244, 3, 2, 2, 2, 289, 1261, 3, 2, 2, 2, 291, 1266, 3, 2, 2, 2, 293, 1273, 3, 2, 2, 2, 295, 1282, 3, 2, 2, 2, 297, 1296, 3, 2, 2, 2, 299, 1301, 3, 2, 2, 2, 301, 1324, 3, 2, 2, 2, 303, 1339, 3, 2, 2, 2, 305, 1356, 3, 2, 2, 2, 307, 1371, 3, 2, 2, 2, 309, 1382, 3, 2, 2, 2, 311, 1395, 3, 2, 2, 2, 313, 1405, 3, 2, 2, 2, 315, 1417, 3, 2, 2, 2, 317, 1429, 3, 2, 2, 2, 319, 1437, 3, 2, 2, 2, 321, 1443, 3, 2, 2, 2, 323, 1448, 3, 2, 2, 2, 325, 1457, 3, 2, 2, 2, 327, 1462, 3, 2, 2, 2, 329, 1472, 3, 2, 2, 2, 331, 1478, 3, 2, 2, 2, 333, 1488, 3, 2, 2, 2, 335, 1493, 3, 2, 2, 2, 337, 1499, 3, 2, 2, 2, 339, 1501, 3, 2, 2, 2, 341, 1503, 3, 2, 2, 2, 343, 1508, 3, 2, 2, 2, 345, 1513, 3, 2, 2, 2, 347, 1515, 3, 2, 2, 2, 349, 1527, 3, 2, 2, 2, 351, 1541, 3, 2, 2, 2, 353, 1550, 3, 2, 2, 2, 355, 1554, 3, 2, 2, 2, 357, 1558, 3, 2, 2, 2, 359, 1566, 3, 2, 2, 2, 361, 1570, 3, 2, 2, 2, 363, 1572, 3, 2, 2, 2, 365, 1594, 3, 2, 2, 2, 367, 368, 7, 61, 2, 2, 368, 4, 3, 2, 2, 2, 369, 370, 7, 111, 2, 2, 370, 371, 7, 113, 2, 2, 371, 372, 7, 102, 2, 2, 372, 373, 7, 119, 2, 2, 373, 374, 7, 110, 2, 2, 374, 375, 7, 103, 2, 2, 375, 6, 3, 2, 2, 2, 376, 377, 7, 63, 2, 2, 377, 8, 3, 2, 2, 2, 378, 379, 7, 38, 2, 2, 379, 10, 3, 2, 2, 2, 380, 381, 7, 60, 2, 2, 381, 382, 7, 63, 2, 2, 382, 12, 3, 2, 2, 2, 383, 384, 7, 125, 2, 2, 384, 14, 3, 2, 2, 2, 385, 386, 7, 127, 2, 2, 386, 16, 3, 2, 2, 2, 387, 388, 7, 42, 2, 2, 388, 18, 3, 2, 2, 2, 389, 390, 7, 43, 2, 2, 390, 20, 3, 2, 2, 2, 391, 392, 7, 44, 2, 2, 392, 22, 3, 2, 2, 2, 393, 394, 7, 126, 2, 2, 394, 24, 3, 2, 2, 2, 395, 396, 7, 39, 2, 2, 396, 26, 3, 2, 2, 2, 397, 398, 7, 46, 2, 2, 398, 28, 3, 2, 2, 2, 399, 400, 7, 113, 2, 2, 400, 401, 7, 116, 2, 2, 401, 402, 7, 102, 2, 2, 402, 403, 7, 103, 2, 2, 403, 404, 7, 116, 2, 2, 404, 405, 7, 107, 2, 2, 405, 406, 7, 112, 2, 2, 406, 407, 7, 105, 2, 2, 407, 30, 3, 2, 2, 2, 408, 409, 7, 113, 2, 2, 409, 410, 7, 116, 2, 2, 410, 411, 7, 102, 2, 2, 411, 412, 7, 103, 2, 2, 412, 413, 7, 116, 2, 2, 413, 414, 7, 103, 2, 2, 414, 415, 7, 102, 2, 2, 415, 32, 3, 2, 2, 2, 416, 417, 7, 102, 2, 2, 417, 418, 7, 103, 2, 2, 418, 419, 7, 101, 2, 2, 419, 420, 7, 107, 2, 2, 420, 421, 7, 111, 2, 2, 421, 422, 7, 99, 2, 2, 422, 423, 7, 110, 2, 2, 423, 424, 7, 47, 2, 2, 424, 425, 7, 104, 2, 2, 425, 426, 7, 113, 2, 2, 426, 427, 7, 116, 2, 2, 427, 428, 7, 111, 2, 2, 428, 429, 7, 99, 2, 2, 429, 430, 7, 118, 2, 2, 430, 34, 3, 2, 2, 2, 431, 432, 7, 60, 2, 2, 432, 36, 3, 2, 2, 2, 433, 434, 7, 102, 2, 2, 434, 435, 7, 103, 2, 2, 435, 436, 7, 101, 2, 2, 436, 437, 7, 107, 2, 2, 437, 438, 7, 111, 2, 2, 438, 439, 7, 99, 2, 2, 439, 440, 7, 110, 2, 2, 440, 441, 7, 47, 2, 2, 441, 442, 7, 117, 2, 2, 442, 443, 7, 103, 2, 2, 443, 444, 7, 114, 2, 2, 444, 445, 7, 99, 2, 2, 445, 446, 7, 116, 2, 2, 446, 447, 7, 99, 2, 2, 447, 448, 7, 118, 2, 2, 448, 449, 7, 113, 2, 2, 449, 450, 7, 116, 2, 2, 450, 38, 3, 2, 2, 2, 451, 452, 7, 105, 2, 2, 452, 453, 7, 116, 2, 2, 453, 454, 7, 113, 2, 2, 454, 455, 7, 119, 2, 2, 455, 456, 7, 114, 2, 2, 456, 457, 7, 107, 2, 2, 457, 458, 7, 112, 2, 2, 458, 459, 7, 105, 2, 2, 459, 460, 7, 47, 2, 2, 460, 461, 7, 117, 2, 2, 461, 462, 7, 103, 2, 2, 462, 463, 7, 114, 2, 2, 463, 464, 7, 99, 2, 2, 464, 465, 7, 116, 2, 2, 465, 466, 7, 99, 2, 2, 466, 467, 7, 118, 2, 2, 467, 468, 7, 113, 2, 2, 468, 469, 7, 116, 2, 2, 469, 40, 3, 2, 2, 2, 470, 471, 7, 107, 2, 2, 471, 472, 7, 112, 2, 2, 472, 473, 7, 104, 2, 2, 473, 474, 7, 107, 2, 2, 474, 475, 7, 112, 2, 2, 475, 476, 7, 107, 2, 2, 476, 477, 7, 118, 2, 2, 477, 478, 7, 123, 2, 2, 478, 42, 3, 2, 2, 2, 479, 480, 7, 111, 2, 2, 480, 481, 7, 107, 2, 2, 481, 482, 7, 112, 2, 2, 482, 483, 7, 119, 2, 2, 483, 484, 7, 117, 2, 2, 484, 485, 7, 47, 2, 2, 485, 486, 7, 117, 2, 2, 486, 487, 7, 107, 2, 2, 487, 488, 7, 105, 2, 2, 488, 489, 7, 112, 2, 2, 489, 44, 3, 2, 2, 2, 490, 491, 7, 80, 2, 2, 491, 492, 7, 99, 2, 2, 492, 493, 7, 80, 2, 2, 493, 46, 3, 2, 2, 2, 494, 495, 7, 114, 2, 2, 495, 496, 7, 103, 2, 2, 496, 497, 7, 116, 2, 2, 497, 498, 7, 101, 2, 2, 498, 499, 7, 103, 2, 2, 499, 500, 7, 112, 2, 2, 500, 501, 7, 118, 2, 2, 501, 48, 3, 2, 2, 2, 502, 503, 7, 114, 2, 2, 503, 504, 7, 103, 2, 2, 504, 505, 7, 116, 2, 2, 505, 506, 7, 47, 2, 2, 506, 507, 7, 111, 2, 2, 507, 508, 7, 107, 2, 2, 508, 509, 7, 110, 2, 2, 509, 510, 7, 110, 2, 2, 510, 511, 7, 103, 2, 2, 511, 50, 3, 2, 2, 2, 512, 513, 7, 124, 2, 2, 513, 514, 7, 103, 2, 2, 514, 515, 7, 116, 2, 2, 515, 516, 7, 113, 2, 2, 516, 517, 7, 47, 2, 2, 517, 518, 7, 102, 2, 2, 518, 519, 7, 107, 2, 2, 519, 520, 7, 105, 2, 2, 520, 521, 7, 107, 2, 2, 521, 522, 7, 118, 2, 2, 522, 52, 3, 2, 2, 2, 523, 524, 7, 102, 2, 2, 524, 525, 7, 107, 2, 2, 525, 526, 7, 105, 2, 2, 526, 527, 7, 107, 2, 2, 527, 528, 7, 118, 2, 2, 528, 54, 3, 2, 2, 2, 529, 530, 7, 114, 2, 2, 530, 531, 7, 99, 2, 2, 531, 532, 7, 118, 2, 2, 532, 533, 7, 118, 2, 2, 533, 534, 7, 103, 2, 2, 534, 535, 7, 116, 2, 2, 535, 536, 7, 112, 2, 2, 536, 537, 7, 47, 2, 2, 537, 538, 7, 117, 2, 2, 538, 539, 7, 103, 2, 2, 539, 540, 7, 114, 2, 2, 540, 541, 7, 99, 2, 2, 541, 542, 7, 116, 2, 2, 542, 543, 7, 99, 2, 2, 543, 544, 7, 118, 2, 2, 544, 545, 7, 113, 2, 2, 545, 546, 7, 116, 2, 2, 546, 56, 3, 2, 2, 2, 547, 548, 7, 103, 2, 2, 548, 549, 7, 122, 2, 2, 549, 550, 7, 118, 2, 2, 550, 551, 7, 103, 2, 2, 551, 552, 7, 116, 2, 2, 552, 553, 7, 112, 2, 2, 553, 554, 7, 99, 2, 2, 554, 555, 7, 110, 2, 2, 555, 58, 3, 2, 2, 2, 556, 557, 7, 104, 2, 2, 557, 558, 7, 119, 2, 2, 558, 559, 7, 112, 2, 2, 559, 560, 7, 101, 2, 2, 560, 561, 7, 118, 2, 2, 561, 562, 7, 107, 2, 2, 562, 563, 7, 113, 2, 2, 563, 564, 7, 112, 2, 2, 564, 60, 3, 2, 2, 2, 565, 566, 7, 108, 2, 2, 566, 567, 7, 117, 2, 2, 567, 568, 7, 113, 2, 2, 568, 569, 7, 119, 2, 2, 569, 570, 7, 112, 2, 2, 570, 571, 7, 102, 2, 2, 571, 62, 3, 2, 2, 2, 572, 573, 7, 101, 2, 2, 573, 574, 7, 113, 2, 2, 574, 575, 7, 111, 2, 2, 575, 576, 7, 114, 2, 2, 576, 577, 7, 99, 2, 2, 577, 578, 7, 101, 2, 2, 578, 579, 7, 118, 2, 2, 579, 64, 3, 2, 2, 2, 580, 581, 7, 120, 2, 2, 581, 582, 7, 103, 2, 2, 582, 583, 7, 116, 2, 2, 583, 584, 7, 100, 2, 2, 584, 585, 7, 113, 2, 2, 585, 586, 7, 117, 2, 2, 586, 587, 7, 103, 2, 2, 587, 66, 3, 2, 2, 2, 588, 589, 7, 103, 2, 2, 589, 590, 7, 115, 2, 2, 590, 68, 3, 2, 2, 2, 591, 592, 7, 112, 2, 2, 592, 593, 7, 103, 2, 2, 593, 70, 3, 2, 2, 2, 594, 595, 7, 110, 2, 2, 595, 596, 7, 118, 2, 2, 596, 72, 3, 2, 2, 2, 597, 598, 7, 110, 2, 2, 598, 599, 7, 103, 2, 2, 599, 74, 3, 2, 2, 2, 600, 601, 7, 105, 2, 2, 601, 602, 7, 118, 2, 2, 602, 76, 3, 2, 2, 2, 603, 604, 7, 105, 2, 2, 604, 605, 7, 103, 2, 2, 605, 78, 3, 2, 2, 2, 606, 607, 7, 35, 2, 2, 607, 608, 7, 63, 2, 2, 608, 80, 3, 2, 2, 2, 609, 610, 7, 62, 2, 2, 610, 82, 3, 2, 2, 2, 611, 612, 7, 62, 2, 2, 612, 613, 7, 63, 2, 2, 613, 84, 3, 2, 2, 2, 614, 615, 7, 64, 2, 2, 615, 86, 3, 2, 2, 2, 616, 617, 7, 64, 2, 2, 617, 618, 7, 63, 2, 2, 618, 88, 3, 2, 2, 2, 619, 620, 7, 126, 2, 2, 620, 621, 7, 126, 2, 2, 621, 90, 3, 2, 2, 2, 622, 623, 7, 45, 2, 2, 623, 92, 3, 2, 2, 2, 624, 625, 7, 47, 2, 2, 625, 94, 3, 2, 2, 2, 626, 627, 7, 102, 2, 2, 627, 628, 7, 107, 2, 2, 628, 629, 7, 120, 2, 2, 629, 96, 3, 2, 2, 2, 630, 631, 7, 107, 2, 2, 631, 632, 7, 102, 2, 2, 632, 633, 7, 107, 2, 2, 633, 634, 7, 120, 2, 2, 634, 98, 3, 2, 2, 2, 635, 636, 7, 111, 2, 2, 636, 637, 7, 113, 2, 2, 637, 638, 7, 102, 2, 2, 638, 100, 3, 2, 2, 2, 639, 640, 7, 35, 2, 2, 640, 102, 3, 2, 2, 2, 641, 642, 7, 93, 2, 2, 642, 104, 3, 2, 2, 2, 643, 644, 7, 95, 2, 2, 644, 106, 3, 2, 2, 2, 645, 646, 7, 48, 2, 2, 646, 108, 3, 2, 2, 2, 647, 648, 7, 38, 2, 2, 648, 649, 7, 38, 2, 2, 649, 110, 3, 2, 2, 2, 650, 651, 7, 37, 2, 2, 651, 112, 3, 2, 2, 2, 652, 653, 7, 48, 2, 2, 653, 654, 7, 48, 2, 2, 654, 114, 3, 2, 2, 2, 655, 656, 7, 125, 2, 2, 656, 657, 7, 126, 2, 2, 657, 116, 3, 2, 2, 2, 658, 659, 7, 126, 2, 2, 659, 660, 7, 127, 2, 2, 660, 118, 3, 2, 2, 2, 661, 662, 7, 104, 2, 2, 662, 663, 7, 113, 2, 2, 663, 664, 7, 116, 2, 2, 664, 120, 3, 2, 2, 2, 665, 666, 7, 110, 2, 2, 666, 667, 7, 103, 2, 2, 667, 668, 7, 118, 2, 2, 668, 122, 3, 2, 2, 2, 669, 670, 7, 121, 2, 2, 670, 671, 7, 106, 2, 2, 671, 672, 7, 103, 2, 2, 672, 673, 7, 116, 2, 2, 673, 674, 7, 103, 2, 2, 674, 124, 3, 2, 2, 2, 675, 676, 7, 105, 2, 2, 676, 677, 7, 116, 2, 2, 677, 678, 7, 113, 2, 2, 678, 679, 7, 119, 2, 2, 679, 680, 7, 114, 2, 2, 680, 126, 3, 2, 2, 2, 681, 682, 7, 100, 2, 2, 682, 683, 7, 123, 2, 2, 683, 128, 3, 2, 2, 2, 684, 685, 7, 113, 2, 2, 685, 686, 7, 116, 2, 2, 686, 687, 7, 102, 2, 2, 687, 688, 7, 103, 2, 2, 688, 689, 7, 116, 2, 2, 689, 130, 3, 2, 2, 2, 690, 691, 7, 116, 2, 2, 691, 692, 7, 103, 2, 2, 692, 693, 7, 118, 2, 2, 693, 694, 7, 119, 2, 2, 694, 695, 7, 116, 2, 2, 695, 696, 7, 112, 2, 2, 696, 132, 3, 2, 2, 2, 697, 698, 7, 107, 2, 2, 698, 699, 7, 104, 2, 2, 699, 134, 3, 2, 2, 2, 700, 701, 7, 107, 2, 2, 701, 702, 7, 112, 2, 2, 702, 136, 3, 2, 2, 2, 703, 704, 7, 99, 2, 2, 704, 705, 7, 117, 2, 2, 705, 138, 3, 2, 2, 2, 706, 707, 7, 99, 2, 2, 707, 708, 7, 118, 2, 2, 708, 140, 3, 2, 2, 2, 709, 710, 7, 99, 2, 2, 710, 711, 7, 110, 2, 2, 711, 712, 7, 110, 2, 2, 712, 713, 7, 113, 2, 2, 713, 714, 7, 121, 2, 2, 714, 715, 7, 107, 2, 2, 715, 716, 7, 112, 2, 2, 716, 717, 7, 105, 2, 2, 717, 142, 3, 2, 2, 2, 718, 719, 7, 103, 2, 2, 719, 720, 7, 111, 2, 2, 720, 721, 7, 114, 2, 2, 721, 722, 7, 118, 2, 2, 722, 723, 7, 123, 2, 2, 723, 144, 3, 2, 2, 2, 724, 725, 7, 101, 2, 2, 725, 726, 7, 113, 2, 2, 726, 727, 7, 119, 2, 2, 727, 728, 7, 112, 2, 2, 728, 729, 7, 118, 2, 2, 729, 146, 3, 2, 2, 2, 730, 731, 7, 117, 2, 2, 731, 732, 7, 118, 2, 2, 732, 733, 7, 99, 2, 2, 733, 734, 7, 100, 2, 2, 734, 735, 7, 110, 2, 2, 735, 736, 7, 103, 2, 2, 736, 148, 3, 2, 2, 2, 737, 738, 7, 99, 2, 2, 738, 739, 7, 117, 2, 2, 739, 740, 7, 101, 2, 2, 740, 741, 7, 103, 2, 2, 741, 742, 7, 112, 2, 2, 742, 743, 7, 102, 2, 2, 743, 744, 7, 107, 2, 2, 744, 745, 7, 112, 2, 2, 745, 746, 7, 105, 2, 2, 746, 150, 3, 2, 2, 2, 747, 748, 7, 102, 2, 2, 748, 749, 7, 103, 2, 2, 749, 750, 7, 117, 2, 2, 750, 751, 7, 101, 2, 2, 751, 752, 7, 103, 2, 2, 752, 753, 7, 112, 2, 2, 753, 754, 7, 102, 2, 2, 754, 755, 7, 107, 2, 2, 755, 756, 7, 112, 2, 2, 756, 757, 7, 105, 2, 2, 757, 152, 3, 2, 2, 2, 758, 759, 7, 117, 2, 2, 759, 760, 7, 113, 2, 2, 760, 761, 7, 111, 2, 2, 761, 762, 7, 103, 2, 2, 762, 154, 3, 2, 2, 2, 763, 764, 7, 103, 2, 2, 764, 765, 7, 120, 2, 2, 765, 766, 7, 103, 2, 2, 766, 767, 7, 116, 2, 2, 767, 768, 7, 123, 2, 2, 768, 156, 3, 2, 2, 2, 769, 770, 7, 117, 2, 2, 770, 771, 7, 99, 2, 2, 771, 772, 7, 118, 2, 2, 772, 773, 7, 107, 2, 2, 773, 774, 7, 117, 2, 2, 774, 775, 7, 104, 2, 2, 775, 776, 7, 107, 2, 2, 776, 777, 7, 103, 2, 2, 777, 778, 7, 117, 2, 2, 778, 158, 3, 2, 2, 2, 779, 780, 7, 101, 2, 2, 780, 781, 7, 113, 2, 2, 781, 782, 7, 110, 2, 2, 782, 783, 7, 110, 2, 2, 783, 784, 7, 99, 2, 2, 784, 785, 7, 118, 2, 2, 785, 786, 7, 107, 2, 2, 786, 787, 7, 113, 2, 2, 787, 788, 7, 112, 2, 2, 788, 160, 3, 2, 2, 2, 789, 790, 7, 105, 2, 2, 790, 791, 7, 116, 2, 2, 791, 792, 7, 103, 2, 2, 792, 793, 7, 99, 2, 2, 793, 794, 7, 118, 2, 2, 794, 795, 7, 103, 2, 2, 795, 796, 7, 117, 2, 2, 796, 797, 7, 118, 2, 2, 797, 162, 3, 2, 2, 2, 798, 799, 7, 110, 2, 2, 799, 800, 7, 103, 2, 2, 800, 801, 7, 99, 2, 2, 801, 802, 7, 117, 2, 2, 802, 803, 7, 118, 2, 2, 803, 164, 3, 2, 2, 2, 804, 805, 7, 117, 2, 2, 805, 806, 7, 121, 2, 2, 806, 807, 7, 107, 2, 2, 807, 808, 7, 118, 2, 2, 808, 809, 7, 101, 2, 2, 809, 810, 7, 106, 2, 2, 810, 166, 3, 2, 2, 2, 811, 812, 7, 101, 2, 2, 812, 813, 7, 99, 2, 2, 813, 814, 7, 117, 2, 2, 814, 815, 7, 103, 2, 2, 815, 168, 3, 2, 2, 2, 816, 817, 7, 118, 2, 2, 817, 818, 7, 116, 2, 2, 818, 819, 7, 123, 2, 2, 819, 170, 3, 2, 2, 2, 820, 821, 7, 101, 2, 2, 821, 822, 7, 99, 2, 2, 822, 823, 7, 118, 2, 2, 823, 824, 7, 101, 2, 2, 824, 825, 7, 106, 2, 2, 825, 172, 3, 2, 2, 2, 826, 827, 7, 102, 2, 2, 827, 828, 7, 103, 2, 2, 828, 829, 7, 104, 2, 2, 829, 830, 7, 99, 2, 2, 830, 831, 7, 119, 2, 2, 831, 832, 7, 110, 2, 2, 832, 833, 7, 118, 2, 2, 833, 174, 3, 2, 2, 2, 834, 835, 7, 118, 2, 2, 835, 836, 7, 106, 2, 2, 836, 837, 7, 103, 2, 2, 837, 838, 7, 112, 2, 2, 838, 176, 3, 2, 2, 2, 839, 840, 7, 103, 2, 2, 840, 841, 7, 110, 2, 2, 841, 842, 7, 117, 2, 2, 842, 843, 7, 103, 2, 2, 843, 178, 3, 2, 2, 2, 844, 845, 7, 118, 2, 2, 845, 846, 7, 123, 2, 2, 846, 847, 7, 114, 2, 2, 847, 848, 7, 103, 2, 2, 848, 849, 7, 117, 2, 2, 849, 850, 7, 121, 2, 2, 850, 851, 7, 107, 2, 2, 851, 852, 7, 118, 2, 2, 852, 853, 7, 101, 2, 2, 853, 854, 7, 106, 2, 2, 854, 180, 3, 2, 2, 2, 855, 856, 7, 113, 2, 2, 856, 857, 7, 116, 2, 2, 857, 182, 3, 2, 2, 2, 858, 859, 7, 99, 2, 2, 859, 860, 7, 112, 2, 2, 860, 861, 7, 102, 2, 2, 861, 184, 3, 2, 2, 2, 862, 863, 7, 112, 2, 2, 863, 864, 7, 113, 2, 2, 864, 865, 7, 118, 2, 2, 865, 186, 3, 2, 2, 2, 866, 867, 7, 118, 2, 2, 867, 868, 7, 113, 2, 2, 868, 188, 3, 2, 2, 2, 869, 870, 7, 107, 2, 2, 870, 871, 7, 112, 2, 2, 871, 872, 7, 117, 2, 2, 872, 873, 7, 118, 2, 2, 873, 874, 7, 99, 2, 2, 874, 875, 7, 112, 2, 2, 875, 876, 7, 101, 2, 2, 876, 877, 7, 103, 2, 2, 877, 190, 3, 2, 2, 2, 878, 879, 7, 113, 2, 2, 879, 880, 7, 104, 2, 2, 880, 192, 3, 2, 2, 2, 881, 882, 7, 117, 2, 2, 882, 883, 7, 118, 2, 2, 883, 884, 7, 99, 2, 2, 884, 885, 7, 118, 2, 2, 885, 886, 7, 107, 2, 2, 886, 887, 7, 101, 2, 2, 887, 888, 7, 99, 2, 2, 888, 889, 7, 110, 2, 2, 889, 890, 7, 110, 2, 2, 890, 891, 7, 123, 2, 2, 891, 194, 3, 2, 2, 2, 892, 893, 7, 107, 2, 2, 893, 894, 7, 117, 2, 2, 894, 196, 3, 2, 2, 2, 895, 896, 7, 118, 2, 2, 896, 897, 7, 116, 2, 2, 897, 898, 7, 103, 2, 2, 898, 899, 7, 99, 2, 2, 899, 900, 7, 118, 2, 2, 900, 198, 3, 2, 2, 2, 901, 902, 7, 101, 2, 2, 902, 903, 7, 99, 2, 2, 903, 904, 7, 117, 2, 2, 904, 905, 7, 118, 2, 2, 905, 200, 3, 2, 2, 2, 906, 907, 7, 101, 2, 2, 907, 908, 7, 99, 2, 2, 908, 909, 7, 117, 2, 2, 909, 910, 7, 118, 2, 2, 910, 911, 7, 99, 2, 2, 911, 912, 7, 100, 2, 2, 912, 913, 7, 110, 2, 2, 913, 914, 7, 103, 2, 2, 914, 202, 3, 2, 2, 2, 915, 916, 7, 120, 2, 2, 916, 917, 7, 103, 2, 2, 917, 918, 7, 116, 2, 2, 918, 919, 7, 117, 2, 2, 919, 920, 7, 107, 2, 2, 920, 921, 7, 113, 2, 2, 921, 922, 7, 112, 2, 2, 922, 204, 3, 2, 2, 2, 923, 924, 7, 108, 2, 2, 924, 925, 7, 117, 2, 2, 925, 926, 7, 113, 2, 2, 926, 927, 7, 112, 2, 2, 927, 928, 7, 107, 2, 2, 928, 929, 7, 115, 2, 2, 929, 206, 3, 2, 2, 2, 930, 931, 7, 119, 2, 2, 931, 932, 7, 112, 2, 2, 932, 933, 7, 113, 2, 2, 933, 934, 7, 116, 2, 2, 934, 935, 7, 102, 2, 2, 935, 936, 7, 103, 2, 2, 936, 937, 7, 116, 2, 2, 937, 938, 7, 103, 2, 2, 938, 939, 7, 102, 2, 2, 939, 208, 3, 2, 2, 2, 940, 941, 7, 118, 2, 2, 941, 942, 7, 116, 2, 2, 942, 943, 7, 119, 2, 2, 943, 944, 7, 103, 2, 2, 944, 210, 3, 2, 2, 2, 945, 946, 7, 104, 2, 2, 946, 947, 7, 99, 2, 2, 947, 948, 7, 110, 2, 2, 948, 949, 7, 117, 2, 2, 949, 950, 7, 103, 2, 2, 950, 212, 3, 2, 2, 2, 951, 952, 7, 118, 2, 2, 952, 953, 7, 123, 2, 2, 953, 954, 7, 114, 2, 2, 954, 955, 7, 103, 2, 2, 955, 214, 3, 2, 2, 2, 956, 957, 7, 120, 2, 2, 957, 958, 7, 99, 2, 2, 958, 959, 7, 110, 2, 2, 959, 960, 7, 107, 2, 2, 960, 961, 7, 102, 2, 2, 961, 962, 7, 99, 2, 2, 962, 963, 7, 118, 2, 2, 963, 964, 7, 103, 2, 2, 964, 216, 3, 2, 2, 2, 965, 966, 7, 99, 2, 2, 966, 967, 7, 112, 2, 2, 967, 968, 7, 112, 2, 2, 968, 969, 7, 113, 2, 2, 969, 970, 7, 118, 2, 2, 970, 971, 7, 99, 2, 2, 971, 972, 7, 118, 2, 2, 972, 973, 7, 103, 2, 2, 973, 218, 3, 2, 2, 2, 974, 975, 7, 102, 2, 2, 975, 976, 7, 103, 2, 2, 976, 977, 7, 101, 2, 2, 977, 978, 7, 110, 2, 2, 978, 979, 7, 99, 2, 2, 979, 980, 7, 116, 2, 2, 980, 981, 7, 103, 2, 2, 981, 220, 3, 2, 2, 2, 982, 983, 7, 101, 2, 2, 983, 984, 7, 113, 2, 2, 984, 985, 7, 112, 2, 2, 985, 986, 7, 118, 2, 2, 986, 987, 7, 103, 2, 2, 987, 988, 7, 122, 2, 2, 988, 989, 7, 118, 2, 2, 989, 222, 3, 2, 2, 2, 990, 991, 7, 107, 2, 2, 991, 992, 7, 118, 2, 2, 992, 993, 7, 103, 2, 2, 993, 994, 7, 111, 2, 2, 994, 224, 3, 2, 2, 2, 995, 996, 7, 120, 2, 2, 996, 997, 7, 99, 2, 2, 997, 998, 7, 116, 2, 2, 998, 999, 7, 107, 2, 2, 999, 1000, 7, 99, 2, 2, 1000, 1001, 7, 100, 2, 2, 1001, 1002, 7, 110, 2, 2, 1002, 1003, 7, 103, 2, 2, 1003, 226, 3, 2, 2, 2, 1004, 1005, 7, 107, 2, 2, 1005, 1006, 7, 112, 2, 2, 1006, 1007, 7, 117, 2, 2, 1007, 1008, 7, 103, 2, 2, 1008, 1009, 7, 116, 2, 2, 1009, 1010, 7, 118, 2, 2, 1010, 228, 3, 2, 2, 2, 1011, 1012, 7, 102, 2, 2, 1012, 1013, 7, 103, 2, 2, 1013, 1014, 7, 110, 2, 2, 1014, 1015, 7, 103, 2, 2, 1015, 1016, 7, 118, 2, 2, 1016, 1017, 7, 103, 2, 2, 1017, 230, 3, 2, 2, 2, 1018, 1019, 7, 116, 2, 2, 1019, 1020, 7, 103, 2, 2, 1020, 1021, 7, 112, 2, 2, 1021, 1022, 7, 99, 2, 2, 1022, 1023, 7, 111, 2, 2, 1023, 1024, 7, 103, 2, 2, 1024, 232, 3, 2, 2, 2, 1025, 1026, 7, 116, 2, 2, 1026, 1027, 7, 103, 2, 2, 1027, 1028, 7, 114, 2, 2, 1028, 1029, 7, 110, 2, 2, 1029, 1030, 7, 99, 2, 2, 1030, 1031, 7, 101, 2, 2, 1031, 1032, 7, 103, 2, 2, 1032, 234, 3, 2, 2, 2, 1033, 1034, 7, 101, 2, 2, 1034, 1035, 7, 113, 2, 2, 1035, 1036, 7, 114, 2, 2, 1036, 1037, 7, 123, 2, 2, 1037, 236, 3, 2, 2, 2, 1038, 1039, 7, 111, 2, 2, 1039, 1040, 7, 113, 2, 2, 1040, 1041, 7, 102, 2, 2, 1041, 1042, 7, 107, 2, 2, 1042, 1043, 7, 104, 2, 2, 1043, 1044, 7, 123, 2, 2, 1044, 238, 3, 2, 2, 2, 1045, 1046, 7, 99, 2, 2, 1046, 1047, 7, 114, 2, 2, 1047, 1048, 7, 114, 2, 2, 1048, 1049, 7, 103, 2, 2, 1049, 1050, 7, 112, 2, 2, 1050, 1051, 7, 102, 2, 2, 1051, 240, 3, 2, 2, 2, 1052, 1053, 7, 107, 2, 2, 1053, 1054, 7, 112, 2, 2, 1054, 1055, 7, 118, 2, 2, 1055, 1056, 7, 113, 2, 2, 1056, 242, 3, 2, 2, 2, 1057, 1058, 7, 120, 2, 2, 1058, 1059, 7, 99, 2, 2, 1059, 1060, 7, 110, 2, 2, 1060, 1061, 7, 119, 2, 2, 1061, 1062, 7, 103, 2, 2, 1062, 244, 3, 2, 2, 2, 1063, 1064, 7, 108, 2, 2, 1064, 1065, 7, 117, 2, 2, 1065, 1066, 7, 113, 2, 2, 1066, 1067, 7, 112, 2, 2, 1067, 246, 3, 2, 2, 2, 1068, 1069, 7, 121, 2, 2, 1069, 1070, 7, 107, 2, 2, 1070, 1071, 7, 118, 2, 2, 1071, 1072, 7, 106, 2, 2, 1072, 248, 3, 2, 2, 2, 1073, 1074, 7, 114, 2, 2, 1074, 1075, 7, 113, 2, 2, 1075, 1076, 7, 117, 2, 2, 1076, 1077, 7, 107, 2, 2, 1077, 1078, 7, 118, 2, 2, 1078, 1079, 7, 107, 2, 2, 1079, 1080, 7, 113, 2, 2, 1080, 1081, 7, 112, 2, 2, 1081, 250, 3, 2, 2, 2, 1082, 1083, 7, 107, 2, 2, 1083, 1084, 7, 111, 2, 2, 1084, 1085, 7, 114, 2, 2, 1085, 1086, 7, 113, 2, 2, 1086, 1087, 7, 116, 2, 2, 1087, 1088, 7, 118, 2, 2, 1088, 252, 3, 2, 2, 2, 1089, 1090, 7, 117, 2, 2, 1090, 1091, 7, 101, 2, 2, 1091, 1092, 7, 106, 2, 2, 1092, 1093, 7, 103, 2, 2, 1093, 1094, 7, 111, 2, 2, 1094, 1095, 7, 99, 2, 2, 1095, 254, 3, 2, 2, 2, 1096, 1097, 7, 112, 2, 2, 1097, 1098, 7, 99, 2, 2, 1098, 1099, 7, 111, 2, 2, 1099, 1100, 7, 103, 2, 2, 1100, 1101, 7, 117, 2, 2, 1101, 1102, 7, 114, 2, 2, 1102, 1103, 7, 99, 2, 2, 1103, 1104, 7, 101, 2, 2, 1104, 1105, 7, 103, 2, 2, 1105, 256, 3, 2, 2, 2, 1106, 1107, 7, 103, 2, 2, 1107, 1108, 7, 110, 2, 2, 1108, 1109, 7, 103, 2, 2, 1109, 1110, 7, 111, 2, 2, 1110, 1111, 7, 103, 2, 2, 1111, 1112, 7, 112, 2, 2, 1112, 1113, 7, 118, 2, 2, 1113, 258, 3, 2, 2, 2, 1114, 1115, 7, 49, 2, 2, 1115, 260, 3, 2, 2, 2, 1116, 1117, 7, 49, 2, 2, 1117, 1118, 7, 49, 2, 2, 1118, 262, 3, 2, 2, 2, 1119, 1120, 7, 66, 2, 2, 1120, 264, 3, 2, 2, 2, 1121, 1122, 7, 101, 2, 2, 1122, 1123, 7, 106, 2, 2, 1123, 1124, 7, 107, 2, 2, 1124, 1125, 7, 110, 2, 2, 1125, 1126, 7, 102, 2, 2, 1126, 266, 3, 2, 2, 2, 1127, 1128, 7, 102, 2, 2, 1128, 1129, 7, 103, 2, 2, 1129, 1130, 7, 117, 2, 2, 1130, 1131, 7, 101, 2, 2, 1131, 1132, 7, 103, 2, 2, 1132, 1133, 7, 112, 2, 2, 1133, 1134, 7, 102, 2, 2, 1134, 1135, 7, 99, 2, 2, 1135, 1136, 7, 112, 2, 2, 1136, 1137, 7, 118, 2, 2, 1137, 268, 3, 2, 2, 2, 1138, 1139, 7, 99, 2, 2, 1139, 1140, 7, 118, 2, 2, 1140, 1141, 7, 118, 2, 2, 1141, 1142, 7, 116, 2, 2, 1142, 1143, 7, 107, 2, 2, 1143, 1144, 7, 100, 2, 2, 1144, 1145, 7, 119, 2, 2, 1145, 1146, 7, 118, 2, 2, 1146, 1147, 7, 103, 2, 2, 1147, 270, 3, 2, 2, 2, 1148, 1149, 7, 117, 2, 2, 1149, 1150, 7, 103, 2, 2, 1150, 1151, 7, 110, 2, 2, 1151, 1152, 7, 104, 2, 2, 1152, 272, 3, 2, 2, 2, 1153, 1154, 7, 102, 2, 2, 1154, 1155, 7, 103, 2, 2, 1155, 1156, 7, 117, 2, 2, 1156, 1157, 7, 101, 2, 2, 1157, 1158, 7, 103, 2, 2, 1158, 1159, 7, 112, 2, 2, 1159, 1160, 7, 102, 2, 2, 1160, 1161, 7, 99, 2, 2, 1161, 1162, 7, 112, 2, 2, 1162, 1163, 7, 118, 2, 2, 1163, 1164, 7, 47, 2, 2, 1164, 1165, 7, 113, 2, 2, 1165, 1166, 7, 116, 2, 2, 1166, 1167, 7, 47, 2, 2, 1167, 1168, 7, 117, 2, 2, 1168, 1169, 7, 103, 2, 2, 1169, 1170, 7, 110, 2, 2, 1170, 1171, 7, 104, 2, 2, 1171, 274, 3, 2, 2, 2, 1172, 1173, 7, 104, 2, 2, 1173, 1174, 7, 113, 2, 2, 1174, 1175, 7, 110, 2, 2, 1175, 1176, 7, 110, 2, 2, 1176, 1177, 7, 113, 2, 2, 1177, 1178, 7, 121, 2, 2, 1178, 1179, 7, 107, 2, 2, 1179, 1180, 7, 112, 2, 2, 1180, 1181, 7, 105, 2, 2, 1181, 1182, 7, 47, 2, 2, 1182, 1183, 7, 117, 2, 2, 1183, 1184, 7, 107, 2, 2, 1184, 1185, 7, 100, 2, 2, 1185, 1186, 7, 110, 2, 2, 1186, 1187, 7, 107, 2, 2, 1187, 1188, 7, 112, 2, 2, 1188, 1189, 7, 105, 2, 2, 1189, 276, 3, 2, 2, 2, 1190, 1191, 7, 104, 2, 2, 1191, 1192, 7, 113, 2, 2, 1192, 1193, 7, 110, 2, 2, 1193, 1194, 7, 110, 2, 2, 1194, 1195, 7, 113, 2, 2, 1195, 1196, 7, 121, 2, 2, 1196, 1197, 7, 107, 2, 2, 1197, 1198, 7, 112, 2, 2, 1198, 1199, 7, 105, 2, 2, 1199, 278, 3, 2, 2, 2, 1200, 1201, 7, 114, 2, 2, 1201, 1202, 7, 99, 2, 2, 1202, 1203, 7, 116, 2, 2, 1203, 1204, 7, 103, 2, 2, 1204, 1205, 7, 112, 2, 2, 1205, 1206, 7, 118, 2, 2, 1206, 280, 3, 2, 2, 2, 1207, 1208, 7, 99, 2, 2, 1208, 1209, 7, 112, 2, 2, 1209, 1210, 7, 101, 2, 2, 1210, 1211, 7, 103, 2, 2, 1211, 1212, 7, 117, 2, 2, 1212, 1213, 7, 118, 2, 2, 1213, 1214, 7, 113, 2, 2, 1214, 1215, 7, 116, 2, 2, 1215, 282, 3, 2, 2, 2, 1216, 1217, 7, 114, 2, 2, 1217, 1218, 7, 116, 2, 2, 1218, 1219, 7, 103, 2, 2, 1219, 1220, 7, 101, 2, 2, 1220, 1221, 7, 103, 2, 2, 1221, 1222, 7, 102, 2, 2, 1222, 1223, 7, 107, 2, 2, 1223, 1224, 7, 112, 2, 2, 1224, 1225, 7, 105, 2, 2, 1225, 1226, 7, 47, 2, 2, 1226, 1227, 7, 117, 2, 2, 1227, 1228, 7, 107, 2, 2, 1228, 1229, 7, 100, 2, 2, 1229, 1230, 7, 110, 2, 2, 1230, 1231, 7, 107, 2, 2, 1231, 1232, 7, 112, 2, 2, 1232, 1233, 7, 105, 2, 2, 1233, 284, 3, 2, 2, 2, 1234, 1235, 7, 114, 2, 2, 1235, 1236, 7, 116, 2, 2, 1236, 1237, 7, 103, 2, 2, 1237, 1238, 7, 101, 2, 2, 1238, 1239, 7, 103, 2, 2, 1239, 1240, 7, 102, 2, 2, 1240, 1241, 7, 107, 2, 2, 1241, 1242, 7, 112, 2, 2, 1242, 1243, 7, 105, 2, 2, 1243, 286, 3, 2, 2, 2, 1244, 1245, 7, 99, 2, 2, 1245, 1246, 7, 112, 2, 2, 1246, 1247, 7, 101, 2, 2, 1247, 1248, 7, 103, 2, 2, 1248, 1249, 7, 117, 2, 2, 1249, 1250, 7, 118, 2, 2, 1250, 1251, 7, 113, 2, 2, 1251, 1252, 7, 116, 2, 2, 1252, 1253, 7, 47, 2, 2, 1253, 1254, 7, 113, 2, 2, 1254, 1255, 7, 116, 2, 2, 1255, 1256, 7, 47, 2, 2, 1256, 1257, 7, 117, 2, 2, 1257, 1258, 7, 103, 2, 2, 1258, 1259, 7, 110, 2, 2, 1259, 1260, 7, 104, 2, 2, 1260, 288, 3, 2, 2, 2, 1261, 1262, 7, 112, 2, 2, 1262, 1263, 7, 113, 2, 2, 1263, 1264, 7, 102, 2, 2, 1264, 1265, 7, 103, 2, 2, 1265, 290, 3, 2, 2, 2, 1266, 1267, 7, 100, 2, 2, 1267, 1268, 7, 107, 2, 2, 1268, 1269, 7, 112, 2, 2, 1269, 1270, 7, 99, 2, 2, 1270, 1271, 7, 116, 2, 2, 1271, 1272, 7, 123, 2, 2, 1272, 292, 3, 2, 2, 2, 1273, 1274, 7, 102, 2, 2, 1274, 1275, 7, 113, 2, 2, 1275, 1276, 7, 101, 2, 2, 1276, 1277, 7, 119, 2, 2, 1277, 1278, 7, 111, 2, 2, 1278, 1279, 7, 103, 2, 2, 1279, 1280, 7, 112, 2, 2, 1280, 1281, 7, 118, 2, 2, 1281, 294, 3, 2, 2, 2, 1282, 1283, 7, 102, 2, 2, 1283, 1284, 7, 113, 2, 2, 1284, 1285, 7, 101, 2, 2, 1285, 1286, 7, 119, 2, 2, 1286, 1287, 7, 111, 2, 2, 1287, 1288, 7, 103, 2, 2, 1288, 1289, 7, 112, 2, 2, 1289, 1290, 7, 118, 2, 2, 1290, 1291, 7, 47, 2, 2, 1291, 1292, 7, 112, 2, 2, 1292, 1293, 7, 113, 2, 2, 1293, 1294, 7, 102, 2, 2, 1294, 1295, 7, 103, 2, 2, 1295, 296, 3, 2, 2, 2, 1296, 1297, 7, 118, 2, 2, 1297, 1298, 7, 103, 2, 2, 1298, 1299, 7, 122, 2, 2, 1299, 1300, 7, 118, 2, 2, 1300, 298, 3, 2, 2, 2, 1301, 1302, 7, 114, 2, 2, 1302, 1303, 7, 116, 2, 2, 1303, 1304, 7, 113, 2, 2, 1304, 1305, 7, 101, 2, 2, 1305, 1306, 7, 103, 2, 2, 1306, 1307, 7, 117, 2, 2, 1307, 1308, 7, 117, 2, 2, 1308, 1309, 7, 107, 2, 2, 1309, 1310, 7, 112, 2, 2, 1310, 1311, 7, 105, 2, 2, 1311, 1312, 7, 47, 2, 2, 1312, 1313, 7, 107, 2, 2, 1313, 1314, 7, 112, 2, 2, 1314, 1315, 7, 117, 2, 2, 1315, 1316, 7, 118, 2, 2, 1316, 1317, 7, 116, 2, 2, 1317, 1318, 7, 119, 2, 2, 1318, 1319, 7, 101, 2, 2, 1319, 1320, 7, 118, 2, 2, 1320, 1321, 7, 107, 2, 2, 1321, 1322, 7, 113, 2, 2, 1322, 1323, 7, 112, 2, 2, 1323, 300, 3, 2, 2, 2, 1324, 1325, 7, 112, 2, 2, 1325, 1326, 7, 99, 2, 2, 1326, 1327, 7, 111, 2, 2, 1327, 1328, 7, 103, 2, 2, 1328, 1329, 7, 117, 2, 2, 1329, 1330, 7, 114, 2, 2, 1330, 1331, 7, 99, 2, 2, 1331, 1332, 7, 101, 2, 2, 1332, 1333, 7, 103, 2, 2, 1333, 1334, 7, 47, 2, 2, 1334, 1335, 7, 112, 2, 2, 1335, 1336, 7, 113, 2, 2, 1336, 1337, 7, 102, 2, 2, 1337, 1338, 7, 103, 2, 2, 1338, 302, 3, 2, 2, 2, 1339, 1340, 7, 117, 2, 2, 1340, 1341, 7, 101, 2, 2, 1341, 1342, 7, 106, 2, 2, 1342, 1343, 7, 103, 2, 2, 1343, 1344, 7, 111, 2, 2, 1344, 1345, 7, 99, 2, 2, 1345, 1346, 7, 47, 2, 2, 1346, 1347, 7, 99, 2, 2, 1347, 1348, 7, 118, 2, 2, 1348, 1349, 7, 118, 2, 2, 1349, 1350, 7, 116, 2, 2, 1350, 1351, 7, 107, 2, 2, 1351, 1352, 7, 100, 2, 2, 1352, 1353, 7, 119, 2, 2, 1353, 1354, 7, 118, 2, 2, 1354, 1355, 7, 103, 2, 2, 1355, 304, 3, 2, 2, 2, 1356, 1357, 7, 117, 2, 2, 1357, 1358, 7, 101, 2, 2, 1358, 1359, 7, 106, 2, 2, 1359, 1360, 7, 103, 2, 2, 1360, 1361, 7, 111, 2, 2, 1361, 1362, 7, 99, 2, 2, 1362, 1363, 7, 47, 2, 2, 1363, 1364, 7, 103, 2, 2, 1364, 1365, 7, 110, 2, 2, 1365, 1366, 7, 103, 2, 2, 1366, 1367, 7, 111, 2, 2, 1367, 1368, 7, 103, 2, 2, 1368, 1369, 7, 112, 2, 2, 1369, 1370, 7, 118, 2, 2, 1370, 306, 3, 2, 2, 2, 1371, 1372, 7, 99, 2, 2, 1372, 1373, 7, 116, 2, 2, 1373, 1374, 7, 116, 2, 2, 1374, 1375, 7, 99, 2, 2, 1375, 1376, 7, 123, 2, 2, 1376, 1377, 7, 47, 2, 2, 1377, 1378, 7, 112, 2, 2, 1378, 1379, 7, 113, 2, 2, 1379, 1380, 7, 102, 2, 2, 1380, 1381, 7, 103, 2, 2, 1381, 308, 3, 2, 2, 2, 1382, 1383, 7, 100, 2, 2, 1383, 1384, 7, 113, 2, 2, 1384, 1385, 7, 113, 2, 2, 1385, 1386, 7, 110, 2, 2, 1386, 1387, 7, 103, 2, 2, 1387, 1388, 7, 99, 2, 2, 1388, 1389, 7, 112, 2, 2, 1389, 1390, 7, 47, 2, 2, 1390, 1391, 7, 112, 2, 2, 1391, 1392, 7, 113, 2, 2, 1392, 1393, 7, 102, 2, 2, 1393, 1394, 7, 103, 2, 2, 1394, 310, 3, 2, 2, 2, 1395, 1396, 7, 112, 2, 2, 1396, 1397, 7, 119, 2, 2, 1397, 1398, 7, 110, 2, 2, 1398, 1399, 7, 110, 2, 2, 1399, 1400, 7, 47, 2, 2, 1400, 1401, 7, 112, 2, 2, 1401, 1402, 7, 113, 2, 2, 1402, 1403, 7, 102, 2, 2, 1403, 1404, 7, 103, 2, 2, 1404, 312, 3, 2, 2, 2, 1405, 1406, 7, 112, 2, 2, 1406, 1407, 7, 119, 2, 2, 1407, 1408, 7, 111, 2, 2, 1408, 1409, 7, 100, 2, 2, 1409, 1410, 7, 103, 2, 2, 1410, 1411, 7, 116, 2, 2, 1411, 1412, 7, 47, 2, 2, 1412, 1413, 7, 112, 2, 2, 1413, 1414, 7, 113, 2, 2, 1414, 1415, 7, 102, 2, 2, 1415, 1416, 7, 103, 2, 2, 1416, 314, 3, 2, 2, 2, 1417, 1418, 7, 113, 2, 2, 1418, 1419, 7, 100, 2, 2, 1419, 1420, 7, 108, 2, 2, 1420, 1421, 7, 103, 2, 2, 1421, 1422, 7, 101, 2, 2, 1422, 1423, 7, 118, 2, 2, 1423, 1424, 7, 47, 2, 2, 1424, 1425, 7, 112, 2, 2, 1425, 1426, 7, 113, 2, 2, 1426, 1427, 7, 102, 2, 2, 1427, 1428, 7, 103, 2, 2, 1428, 316, 3, 2, 2, 2, 1429, 1430, 7, 101, 2, 2, 1430, 1431, 7, 113, 2, 2, 1431, 1432, 7, 111, 2, 2, 1432, 1433, 7, 111, 2, 2, 1433, 1434, 7, 103, 2, 2, 1434, 1435, 7, 112, 2, 2, 1435, 1436, 7, 118, 2, 2, 1436, 318, 3, 2, 2, 2, 1437, 1438, 7, 100, 2, 2, 1438, 1439, 7, 116, 2, 2, 1439, 1440, 7, 103, 2, 2, 1440, 1441, 7, 99, 2, 2, 1441, 1442, 7, 109, 2, 2, 1442, 320, 3, 2, 2, 2, 1443, 1444, 7, 110, 2, 2, 1444, 1445, 7, 113, 2, 2, 1445, 1446, 7, 113, 2, 2, 1446, 1447, 7, 114, 2, 2, 1447, 322, 3, 2, 2, 2, 1448, 1449, 7, 101, 2, 2, 1449, 1450, 7, 113, 2, 2, 1450, 1451, 7, 112, 2, 2, 1451, 1452, 7, 118, 2, 2, 1452, 1453, 7, 107, 2, 2, 1453, 1454, 7, 112, 2, 2, 1454, 1455, 7, 119, 2, 2, 1455, 1456, 7, 103, 2, 2, 1456, 324, 3, 2, 2, 2, 1457, 1458, 7, 103, 2, 2, 1458, 1459, 7, 122, 2, 2, 1459, 1460, 7, 107, 2, 2, 1460, 1461, 7, 118, 2, 2, 1461, 326, 3, 2, 2, 2, 1462, 1463, 7, 116, 2, 2, 1463, 1464, 7, 103, 2, 2, 1464, 1465, 7, 118, 2, 2, 1465, 1466, 7, 119, 2, 2, 1466, 1467, 7, 116, 2, 2, 1467, 1468, 7, 112, 2, 2, 1468, 1469, 7, 107, 2, 2, 1469, 1470, 7, 112, 2, 2, 1470, 1471, 7, 105, 2, 2, 1471, 328, 3, 2, 2, 2, 1472, 1473, 7, 121, 2, 2, 1473, 1474, 7, 106, 2, 2, 1474, 1475, 7, 107, 2, 2, 1475, 1476, 7, 110, 2, 2, 1476, 1477, 7, 103, 2, 2, 1477, 330, 3, 2, 2, 2, 1478, 1483, 7, 36, 2, 2, 1479, 1482, 5, 333, 167, 2, 1480, 1482, 10, 2, 2, 2, 1481, 1479, 3, 2, 2, 2, 1481, 1480, 3, 2, 2, 2, 1482, 1485, 3, 2, 2, 2, 1483, 1481, 3, 2, 2, 2, 1483, 1484, 3, 2, 2, 2, 1484, 1486, 3, 2, 2, 2, 1485, 1483, 3, 2, 2, 2, 1486, 1487, 7, 36, 2, 2, 1487, 332, 3, 2, 2, 2, 1488, 1491, 7, 94, 2, 2, 1489, 1492, 9, 3, 2, 2, 1490, 1492, 5, 335, 168, 2, 1491, 1489, 3, 2, 2, 2, 1491, 1490, 3, 2, 2, 2, 1492, 334, 3, 2, 2, 2, 1493, 1494, 7, 119, 2, 2, 1494, 1495, 5, 337, 169, 2, 1495, 1496, 5, 337, 169, 2, 1496, 1497, 5, 337, 169, 2, 1497, 1498, 5, 337, 169, 2, 1498, 336, 3, 2, 2, 2, 1499, 1500, 9, 4, 2, 2, 1500, 338, 3, 2, 2, 2, 1501, 1502, 7, 65, 2, 2, 1502, 340, 3, 2, 2, 2, 1503, 1504, 7, 112, 2, 2, 1504, 1505, 7, 119, 2, 2, 1505, 1506, 7, 110, 2, 2, 1506, 1507, 7, 110, 2, 2, 1507, 342, 3, 2, 2, 2, 1508, 1509, 5, 345, 173, 2, 1509, 344, 3, 2, 2, 2, 1510, 1514, 5, 347, 174, 2, 1511, 1514, 5, 349, 175, 2, 1512, 1514, 5, 351, 176, 2, 1513, 1510, 3, 2, 2, 2, 1513, 1511, 3, 2, 2, 2, 1513, 1512, 3, 2, 2, 2, 1514, 346, 3, 2, 2, 2, 1515, 1516, 5, 353, 177, 2, 1516, 348, 3, 2, 2, 2, 1517, 1518, 7, 48, 2, 2, 1518, 1528, 5, 353, 177, 2, 1519, 1520, 5, 353, 177, 2, 1520, 1524, 7, 48, 2, 2, 1521, 1523, 9, 5, 2, 2, 1522, 1521, 3, 2, 2, 2, 1523, 1526, 3, 2, 2, 2, 1524, 1522, 3, 2, 2, 2, 1524, 1525, 3, 2, 2, 2, 1525, 1528, 3, 2, 2, 2, 1526, 1524, 3, 2, 2, 2, 1527, 1517, 3, 2, 2, 2, 1527, 1519, 3, 2, 2, 2, 1528, 350, 3, 2, 2, 2, 1529, 1530, 7, 48, 2, 2, 1530, 1542, 5, 353, 177, 2, 1531, 1539, 5, 353, 177, 2, 1532, 1536, 7, 48, 2, 2, 1533, 1535, 9, 5, 2, 2, 1534, 1533, 3, 2, 2, 2, 1535, 1538, 3, 2, 2, 2, 1536, 1534, 3, 2, 2, 2, 1536, 1537, 3, 2, 2, 2, 1537, 1540, 3, 2, 2, 2, 1538, 1536, 3, 2, 2, 2, 1539, 1532, 3, 2, 2, 2, 1539, 1540, 3, 2, 2, 2, 1540, 1542, 3, 2, 2, 2, 1541, 1529, 3, 2, 2, 2, 1541, 1531, 3, 2, 2, 2, 1542, 1543, 3, 2, 2, 2, 1543, 1545, 9, 6, 2, 2, 1544, 1546, 9, 7, 2, 2, 1545, 1544, 3, 2, 2, 2, 1545, 1546, 3, 2, 2, 2, 1546, 1547, 3, 2, 2, 2, 1547, 1548, 5, 353, 177, 2, 1548, 352, 3, 2, 2, 2, 1549, 1551, 9, 5, 2, 2, 1550, 1549, 3, 2, 2, 2, 1551, 1552, 3, 2, 2, 2, 1552, 1550, 3, 2, 2, 2, 1552, 1553, 3, 2, 2, 2, 1553, 354, 3, 2, 2, 2, 1554, 1555, 9, 8, 2, 2, 1555, 1556, 3, 2, 2, 2, 1556, 1557, 8, 178, 2, 2, 1557, 356, 3, 2, 2, 2, 1558, 1562, 5, 359, 180, 2, 1559, 1561, 5, 361, 181, 2, 1560, 1559, 3, 2, 2, 2, 1561, 1564, 3, 2, 2, 2, 1562, 1560, 3, 2, 2, 2, 1562, 1563, 3, 2, 2, 2, 1563, 358, 3, 2, 2, 2, 1564, 1562, 3, 2, 2, 2, 1565, 1567, 9, 9, 2, 2, 1566, 1565, 3, 2, 2, 2, 1567, 360, 3, 2, 2, 2, 1568, 1571, 5, 359, 180, 2, 1569, 1571, 9, 10, 2, 2, 1570, 1568, 3, 2, 2, 2, 1570, 1569, 3, 2, 2, 2, 1571, 362, 3, 2, 2, 2, 1572, 1573, 7, 42, 2, 2, 1573, 1582, 7, 60, 2, 2, 1574, 1581, 5, 363, 182, 2, 1575, 1576, 7, 42, 2, 2, 1576, 1581, 10, 11, 2, 2, 1577, 1578, 7, 60, 2, 2, 1578, 1581, 10, 12, 2, 2, 1579, 1581, 10, 13, 2, 2, 1580, 1574, 3, 2, 2, 2, 1580, 1575, 3, 2, 2, 2, 1580, 1577, 3, 2, 2, 2, 1580, 1579, 3, 2, 2, 2, 1581, 1584, 3, 2, 2, 2, 1582, 1580, 3, 2, 2, 2, 1582, 1583, 3, 2, 2, 2, 1583, 1586, 3, 2, 2, 2, 1584, 1582, 3, 2, 2, 2, 1585, 1587, 7, 60, 2, 2, 1586, 1585, 3, 2, 2, 2, 1587, 1588, 3, 2, 2, 2, 1588, 1586, 3, 2, 2, 2, 1588, 1589, 3, 2, 2, 2, 1589, 1590, 3, 2, 2, 2, 1590, 1591, 7, 43, 2, 2, 1591, 1592, 3, 2, 2, 2, 1592, 1593, 8, 182, 2, 2, 1593, 364, 3, 2, 2, 2, 1594, 1595, 10, 14, 2, 2, 1595, 366, 3, 2, 2, 2, 20, 2, 1481, 1483, 1491, 1513, 1524, 1527, 1536, 1539, 1541, 1545, 1552, 1562, 1566, 1570, 1580, 1582, 1588, 3, 2, 3, 2]
\ No newline at end of file
diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.java b/src/main/java/org/rumbledb/parser/JsoniqLexer.java
index 1b99efc9dc..3c8a2743db 100644
--- a/src/main/java/org/rumbledb/parser/JsoniqLexer.java
+++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.java
@@ -3,16 +3,14 @@
// Java header
package org.rumbledb.parser;
-import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.Lexer;
-import org.antlr.v4.runtime.RuntimeMetaData;
-import org.antlr.v4.runtime.Vocabulary;
-import org.antlr.v4.runtime.VocabularyImpl;
-import org.antlr.v4.runtime.atn.ATN;
-import org.antlr.v4.runtime.atn.ATNDeserializer;
-import org.antlr.v4.runtime.atn.LexerATNSimulator;
-import org.antlr.v4.runtime.atn.PredictionContextCache;
+import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.TokenStream;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.misc.*;
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class JsoniqLexer extends Lexer {
@@ -29,21 +27,28 @@ public class JsoniqLexer extends Lexer {
T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38,
T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45,
T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52,
- T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
- T__59=60, Kfor=61, Klet=62, Kwhere=63, Kgroup=64, Kby=65, Korder=66, Kreturn=67,
- Kif=68, Kin=69, Kas=70, Kat=71, Kallowing=72, Kempty=73, Kcount=74, Kstable=75,
- Kascending=76, Kdescending=77, Ksome=78, Kevery=79, Ksatisfies=80, Kcollation=81,
- Kgreatest=82, Kleast=83, Kswitch=84, Kcase=85, Ktry=86, Kcatch=87, Kdefault=88,
- Kthen=89, Kelse=90, Ktypeswitch=91, Kor=92, Kand=93, Knot=94, Kto=95,
- Kinstance=96, Kof=97, Kstatically=98, Kis=99, Ktreat=100, Kcast=101, Kcastable=102,
- Kversion=103, Kjsoniq=104, Kunordered=105, Ktrue=106, Kfalse=107, Ktype=108,
- Kvalidate=109, Kannotate=110, Kdeclare=111, Kcontext=112, Kitem=113, Kvariable=114,
- Kinsert=115, Kdelete=116, Krename=117, Kreplace=118, Kcopy=119, Kmodify=120,
- Kappend=121, Kinto=122, Kvalue=123, Kjson=124, Kwith=125, Kposition=126,
- Kbreak=127, Kloop=128, Kcontinue=129, Kexit=130, Kreturning=131, Kwhile=132,
- STRING=133, ArgumentPlaceholder=134, NullLiteral=135, Literal=136, NumericLiteral=137,
- IntegerLiteral=138, DecimalLiteral=139, DoubleLiteral=140, WS=141, NCName=142,
- XQComment=143, ContentChar=144;
+ T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, Kfor=59, Klet=60,
+ Kwhere=61, Kgroup=62, Kby=63, Korder=64, Kreturn=65, Kif=66, Kin=67, Kas=68,
+ Kat=69, Kallowing=70, Kempty=71, Kcount=72, Kstable=73, Kascending=74,
+ Kdescending=75, Ksome=76, Kevery=77, Ksatisfies=78, Kcollation=79, Kgreatest=80,
+ Kleast=81, Kswitch=82, Kcase=83, Ktry=84, Kcatch=85, Kdefault=86, Kthen=87,
+ Kelse=88, Ktypeswitch=89, Kor=90, Kand=91, Knot=92, Kto=93, Kinstance=94,
+ Kof=95, Kstatically=96, Kis=97, Ktreat=98, Kcast=99, Kcastable=100, Kversion=101,
+ Kjsoniq=102, Kunordered=103, Ktrue=104, Kfalse=105, Ktype=106, Kvalidate=107,
+ Kannotate=108, Kdeclare=109, Kcontext=110, Kitem=111, Kvariable=112, Kinsert=113,
+ Kdelete=114, Krename=115, Kreplace=116, Kcopy=117, Kmodify=118, Kappend=119,
+ Kinto=120, Kvalue=121, Kjson=122, Kwith=123, Kposition=124, Kimport=125,
+ Kschema=126, Knamespace=127, Kelement=128, Kslash=129, Kdslash=130, Kat_symbol=131,
+ Kchild=132, Kdescendant=133, Kattribute=134, Kself=135, Kdescendant_or_self=136,
+ Kfollowing_sibling=137, Kfollowing=138, Kparent=139, Kancestor=140, Kpreceding_sibling=141,
+ Kpreceding=142, Kancestor_or_self=143, Knode=144, Kbinary=145, Kdocument=146,
+ Kdocument_node=147, Ktext=148, Kpi=149, Knamespace_node=150, Kschema_attribute=151,
+ Kschema_element=152, Karray_node=153, Kboolean_node=154, Knull_node=155,
+ Knumber_node=156, Kobject_node=157, Kcomment=158, Kbreak=159, Kloop=160,
+ Kcontinue=161, Kexit=162, Kreturning=163, Kwhile=164, STRING=165, ArgumentPlaceholder=166,
+ NullLiteral=167, Literal=168, NumericLiteral=169, IntegerLiteral=170,
+ DecimalLiteral=171, DoubleLiteral=172, WS=173, NCName=174, XQComment=175,
+ ContentChar=176;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
@@ -61,16 +66,22 @@ private static String[] makeRuleNames() {
"T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40",
"T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48",
"T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56",
- "T__57", "T__58", "T__59", "Kfor", "Klet", "Kwhere", "Kgroup", "Kby",
- "Korder", "Kreturn", "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty",
- "Kcount", "Kstable", "Kascending", "Kdescending", "Ksome", "Kevery",
- "Ksatisfies", "Kcollation", "Kgreatest", "Kleast", "Kswitch", "Kcase",
- "Ktry", "Kcatch", "Kdefault", "Kthen", "Kelse", "Ktypeswitch", "Kor",
- "Kand", "Knot", "Kto", "Kinstance", "Kof", "Kstatically", "Kis", "Ktreat",
- "Kcast", "Kcastable", "Kversion", "Kjsoniq", "Kunordered", "Ktrue", "Kfalse",
- "Ktype", "Kvalidate", "Kannotate", "Kdeclare", "Kcontext", "Kitem", "Kvariable",
- "Kinsert", "Kdelete", "Krename", "Kreplace", "Kcopy", "Kmodify", "Kappend",
- "Kinto", "Kvalue", "Kjson", "Kwith", "Kposition", "Kbreak", "Kloop",
+ "T__57", "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn",
+ "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable",
+ "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation",
+ "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault",
+ "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance",
+ "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion",
+ "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate",
+ "Kdeclare", "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename",
+ "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson",
+ "Kwith", "Kposition", "Kimport", "Kschema", "Knamespace", "Kelement",
+ "Kslash", "Kdslash", "Kat_symbol", "Kchild", "Kdescendant", "Kattribute",
+ "Kself", "Kdescendant_or_self", "Kfollowing_sibling", "Kfollowing", "Kparent",
+ "Kancestor", "Kpreceding_sibling", "Kpreceding", "Kancestor_or_self",
+ "Knode", "Kbinary", "Kdocument", "Kdocument_node", "Ktext", "Kpi", "Knamespace_node",
+ "Kschema_attribute", "Kschema_element", "Karray_node", "Kboolean_node",
+ "Knull_node", "Knumber_node", "Kobject_node", "Kcomment", "Kbreak", "Kloop",
"Kcontinue", "Kexit", "Kreturning", "Kwhile", "STRING", "ESC", "UNICODE",
"HEX", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral",
"IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "Digits", "WS",
@@ -81,26 +92,32 @@ private static String[] makeRuleNames() {
private static String[] makeLiteralNames() {
return new String[] {
- null, "';'", "'module'", "'namespace'", "'='", "'$'", "':='", "'{'",
- "'}'", "'('", "')'", "'*'", "'|'", "'%'", "','", "'ordering'", "'ordered'",
- "'decimal-format'", "':'", "'decimal-separator'", "'grouping-separator'",
- "'infinity'", "'minus-sign'", "'NaN'", "'percent'", "'per-mille'", "'zero-digit'",
- "'digit'", "'pattern-separator'", "'import'", "'external'", "'function'",
- "'jsound'", "'compact'", "'verbose'", "'schema'", "'eq'", "'ne'", "'lt'",
- "'le'", "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'", "'>='", "'||'",
- "'+'", "'-'", "'div'", "'idiv'", "'mod'", "'!'", "'['", "']'", "'.'",
- "'$$'", "'#'", "'{|'", "'|}'", "'for'", "'let'", "'where'", "'group'",
- "'by'", "'order'", "'return'", "'if'", "'in'", "'as'", "'at'", "'allowing'",
- "'empty'", "'count'", "'stable'", "'ascending'", "'descending'", "'some'",
- "'every'", "'satisfies'", "'collation'", "'greatest'", "'least'", "'switch'",
- "'case'", "'try'", "'catch'", "'default'", "'then'", "'else'", "'typeswitch'",
- "'or'", "'and'", "'not'", "'to'", "'instance'", "'of'", "'statically'",
- "'is'", "'treat'", "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'",
- "'true'", "'false'", "'type'", "'validate'", "'annotate'", "'declare'",
- "'context'", "'item'", "'variable'", "'insert'", "'delete'", "'rename'",
- "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'json'",
- "'with'", "'position'", "'break'", "'loop'", "'continue'", "'exit'",
- "'returning'", "'while'", null, "'?'", "'null'"
+ null, "';'", "'module'", "'='", "'$'", "':='", "'{'", "'}'", "'('", "')'",
+ "'*'", "'|'", "'%'", "','", "'ordering'", "'ordered'", "'decimal-format'",
+ "':'", "'decimal-separator'", "'grouping-separator'", "'infinity'", "'minus-sign'",
+ "'NaN'", "'percent'", "'per-mille'", "'zero-digit'", "'digit'", "'pattern-separator'",
+ "'external'", "'function'", "'jsound'", "'compact'", "'verbose'", "'eq'",
+ "'ne'", "'lt'", "'le'", "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'",
+ "'>='", "'||'", "'+'", "'-'", "'div'", "'idiv'", "'mod'", "'!'", "'['",
+ "']'", "'.'", "'$$'", "'#'", "'..'", "'{|'", "'|}'", "'for'", "'let'",
+ "'where'", "'group'", "'by'", "'order'", "'return'", "'if'", "'in'",
+ "'as'", "'at'", "'allowing'", "'empty'", "'count'", "'stable'", "'ascending'",
+ "'descending'", "'some'", "'every'", "'satisfies'", "'collation'", "'greatest'",
+ "'least'", "'switch'", "'case'", "'try'", "'catch'", "'default'", "'then'",
+ "'else'", "'typeswitch'", "'or'", "'and'", "'not'", "'to'", "'instance'",
+ "'of'", "'statically'", "'is'", "'treat'", "'cast'", "'castable'", "'version'",
+ "'jsoniq'", "'unordered'", "'true'", "'false'", "'type'", "'validate'",
+ "'annotate'", "'declare'", "'context'", "'item'", "'variable'", "'insert'",
+ "'delete'", "'rename'", "'replace'", "'copy'", "'modify'", "'append'",
+ "'into'", "'value'", "'json'", "'with'", "'position'", "'import'", "'schema'",
+ "'namespace'", "'element'", "'/'", "'//'", "'@'", "'child'", "'descendant'",
+ "'attribute'", "'self'", "'descendant-or-self'", "'following-sibling'",
+ "'following'", "'parent'", "'ancestor'", "'preceding-sibling'", "'preceding'",
+ "'ancestor-or-self'", "'node'", "'binary'", "'document'", "'document-node'",
+ "'text'", "'processing-instruction'", "'namespace-node'", "'schema-attribute'",
+ "'schema-element'", "'array-node'", "'boolean-node'", "'null-node'",
+ "'number-node'", "'object-node'", "'comment'", "'break'", "'loop'", "'continue'",
+ "'exit'", "'returning'", "'while'", null, "'?'", "'null'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -110,20 +127,26 @@ private static String[] makeSymbolicNames() {
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, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn",
- "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable",
- "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation",
- "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault",
- "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance",
- "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion",
- "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate",
- "Kdeclare", "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename",
- "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson",
- "Kwith", "Kposition", "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning",
- "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral", "Literal",
- "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral",
- "WS", "NCName", "XQComment", "ContentChar"
+ null, null, null, null, null, null, null, null, null, null, null, "Kfor",
+ "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn", "Kif", "Kin",
+ "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable", "Kascending",
+ "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation", "Kgreatest",
+ "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault", "Kthen",
+ "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance", "Kof",
+ "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", "Kjsoniq",
+ "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", "Kdeclare",
+ "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename", "Kreplace",
+ "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson", "Kwith", "Kposition",
+ "Kimport", "Kschema", "Knamespace", "Kelement", "Kslash", "Kdslash",
+ "Kat_symbol", "Kchild", "Kdescendant", "Kattribute", "Kself", "Kdescendant_or_self",
+ "Kfollowing_sibling", "Kfollowing", "Kparent", "Kancestor", "Kpreceding_sibling",
+ "Kpreceding", "Kancestor_or_self", "Knode", "Kbinary", "Kdocument", "Kdocument_node",
+ "Ktext", "Kpi", "Knamespace_node", "Kschema_attribute", "Kschema_element",
+ "Karray_node", "Kboolean_node", "Knull_node", "Knumber_node", "Kobject_node",
+ "Kcomment", "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning", "Kwhile",
+ "STRING", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral",
+ "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "WS", "NCName",
+ "XQComment", "ContentChar"
};
}
private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -185,7 +208,7 @@ public JsoniqLexer(CharStream input) {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u0092\u04ae\b\1\4"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00b2\u063c\b\1\4"+
"\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n"+
"\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+
"\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+
@@ -204,401 +227,558 @@ public JsoniqLexer(CharStream input) {
"\t\u0089\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d"+
"\4\u008e\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092"+
"\t\u0092\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096"+
- "\4\u0097\t\u0097\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3"+
- "\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\7\3\b\3\b\3\t\3\t\3\n"+
- "\3\n\3\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16\3\17\3\17\3\20\3\20\3\20\3\20"+
- "\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22"+
- "\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+
- "\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+
- "\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+
- "\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26"+
- "\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27"+
- "\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31"+
- "\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33"+
- "\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34"+
- "\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+
- "\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37"+
- "\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!"+
- "\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3$\3"+
- "$\3$\3$\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3)\3*\3"+
- "*\3*\3+\3+\3+\3,\3,\3-\3-\3-\3.\3.\3/\3/\3/\3\60\3\60\3\60\3\61\3\61\3"+
- "\62\3\62\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3"+
- "\65\3\66\3\66\3\67\3\67\38\38\39\39\3:\3:\3:\3;\3;\3<\3<\3<\3=\3=\3=\3"+
- ">\3>\3>\3>\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3B\3B\3B\3"+
- "C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3H\3"+
- "H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3"+
- "L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3"+
- "N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3"+
- "Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3S\3T\3"+
- "T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3X\3X\3"+
- "X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3\\\3"+
- "\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^\3^\3^\3_\3_\3_\3"+
- "_\3`\3`\3`\3a\3a\3a\3a\3a\3a\3a\3a\3a\3b\3b\3b\3c\3c\3c\3c\3c\3c\3c\3"+
- "c\3c\3c\3c\3d\3d\3d\3e\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3"+
- "g\3g\3g\3g\3h\3h\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3i\3i\3i\3j\3j\3j\3j\3"+
- "j\3j\3j\3j\3j\3j\3k\3k\3k\3k\3k\3l\3l\3l\3l\3l\3l\3m\3m\3m\3m\3m\3n\3"+
- "n\3n\3n\3n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3o\3o\3o\3p\3p\3p\3p\3p\3p\3"+
- "p\3p\3q\3q\3q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3r\3s\3s\3s\3s\3s\3s\3s\3s\3"+
- "s\3t\3t\3t\3t\3t\3t\3t\3u\3u\3u\3u\3u\3u\3u\3v\3v\3v\3v\3v\3v\3v\3w\3"+
- "w\3w\3w\3w\3w\3w\3w\3x\3x\3x\3x\3x\3y\3y\3y\3y\3y\3y\3y\3z\3z\3z\3z\3"+
- "z\3z\3z\3{\3{\3{\3{\3{\3|\3|\3|\3|\3|\3|\3}\3}\3}\3}\3}\3~\3~\3~\3~\3"+
- "~\3\177\3\177\3\177\3\177\3\177\3\177\3\177\3\177\3\177\3\u0080\3\u0080"+
- "\3\u0080\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081"+
- "\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082"+
- "\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0084\3\u0084"+
- "\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0085"+
- "\3\u0085\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086\7\u0086\u043c\n\u0086"+
- "\f\u0086\16\u0086\u043f\13\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087"+
- "\5\u0087\u0446\n\u0087\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088"+
- "\3\u0089\3\u0089\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b"+
- "\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\5\u008d\u045c\n\u008d\3\u008e"+
- "\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\7\u008f\u0465\n\u008f"+
- "\f\u008f\16\u008f\u0468\13\u008f\5\u008f\u046a\n\u008f\3\u0090\3\u0090"+
- "\3\u0090\3\u0090\3\u0090\7\u0090\u0471\n\u0090\f\u0090\16\u0090\u0474"+
- "\13\u0090\5\u0090\u0476\n\u0090\5\u0090\u0478\n\u0090\3\u0090\3\u0090"+
- "\5\u0090\u047c\n\u0090\3\u0090\3\u0090\3\u0091\6\u0091\u0481\n\u0091\r"+
- "\u0091\16\u0091\u0482\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093"+
- "\7\u0093\u048b\n\u0093\f\u0093\16\u0093\u048e\13\u0093\3\u0094\5\u0094"+
- "\u0491\n\u0094\3\u0095\3\u0095\5\u0095\u0495\n\u0095\3\u0096\3\u0096\3"+
- "\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\7\u0096\u049f\n\u0096\f"+
- "\u0096\16\u0096\u04a2\13\u0096\3\u0096\6\u0096\u04a5\n\u0096\r\u0096\16"+
- "\u0096\u04a6\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\2\2\u0098"+
- "\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20"+
- "\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37"+
- "= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o"+
- "9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH"+
- "\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1"+
- "R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5"+
- "\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9"+
- "f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00dd"+
- "p\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00ebw\u00edx\u00efy\u00f1"+
- "z\u00f3{\u00f5|\u00f7}\u00f9~\u00fb\177\u00fd\u0080\u00ff\u0081\u0101"+
- "\u0082\u0103\u0083\u0105\u0084\u0107\u0085\u0109\u0086\u010b\u0087\u010d"+
- "\2\u010f\2\u0111\2\u0113\u0088\u0115\u0089\u0117\u008a\u0119\u008b\u011b"+
- "\u008c\u011d\u008d\u011f\u008e\u0121\2\u0123\u008f\u0125\u0090\u0127\2"+
- "\u0129\2\u012b\u0091\u012d\u0092\3\2\17\4\2$$^^\n\2$$\61\61^^ddhhpptt"+
- "vv\5\2\62;CHch\3\2\62;\4\2GGgg\4\2--//\5\2\13\f\17\17\"\"\20\2C\\aac|"+
- "\u00c2\u00d8\u00da\u00f8\u00fa\u0301\u0372\u037f\u0381\u2001\u200e\u200f"+
- "\u2072\u2191\u2c02\u2ff1\u3003\ud801\uf902\ufdd1\ufdf2\uffff\7\2//\62"+
- ";\u00b9\u00b9\u0302\u0371\u2041\u2042\3\2<<\3\2++\4\2**<<\7\2$$()>>}}"+
- "\177\177\2\u04ba\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13"+
- "\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2"+
- "\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2"+
- "!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3"+
- "\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2"+
- "\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E"+
- "\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2"+
- "\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2"+
- "\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k"+
- "\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2"+
- "\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2"+
- "\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b"+
- "\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2"+
- "\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d"+
- "\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2"+
- "\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af"+
- "\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2"+
- "\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1"+
- "\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2"+
- "\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3"+
- "\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2"+
- "\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5"+
- "\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2"+
- "\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7"+
- "\3\2\2\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff\3\2\2"+
- "\2\2\u0101\3\2\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\2\u0109"+
- "\3\2\2\2\2\u010b\3\2\2\2\2\u0113\3\2\2\2\2\u0115\3\2\2\2\2\u0117\3\2\2"+
- "\2\2\u0119\3\2\2\2\2\u011b\3\2\2\2\2\u011d\3\2\2\2\2\u011f\3\2\2\2\2\u0123"+
- "\3\2\2\2\2\u0125\3\2\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2\2\3\u012f\3\2\2"+
- "\2\5\u0131\3\2\2\2\7\u0138\3\2\2\2\t\u0142\3\2\2\2\13\u0144\3\2\2\2\r"+
- "\u0146\3\2\2\2\17\u0149\3\2\2\2\21\u014b\3\2\2\2\23\u014d\3\2\2\2\25\u014f"+
- "\3\2\2\2\27\u0151\3\2\2\2\31\u0153\3\2\2\2\33\u0155\3\2\2\2\35\u0157\3"+
- "\2\2\2\37\u0159\3\2\2\2!\u0162\3\2\2\2#\u016a\3\2\2\2%\u0179\3\2\2\2\'"+
- "\u017b\3\2\2\2)\u018d\3\2\2\2+\u01a0\3\2\2\2-\u01a9\3\2\2\2/\u01b4\3\2"+
- "\2\2\61\u01b8\3\2\2\2\63\u01c0\3\2\2\2\65\u01ca\3\2\2\2\67\u01d5\3\2\2"+
- "\29\u01db\3\2\2\2;\u01ed\3\2\2\2=\u01f4\3\2\2\2?\u01fd\3\2\2\2A\u0206"+
- "\3\2\2\2C\u020d\3\2\2\2E\u0215\3\2\2\2G\u021d\3\2\2\2I\u0224\3\2\2\2K"+
- "\u0227\3\2\2\2M\u022a\3\2\2\2O\u022d\3\2\2\2Q\u0230\3\2\2\2S\u0233\3\2"+
- "\2\2U\u0236\3\2\2\2W\u0239\3\2\2\2Y\u023b\3\2\2\2[\u023e\3\2\2\2]\u0240"+
- "\3\2\2\2_\u0243\3\2\2\2a\u0246\3\2\2\2c\u0248\3\2\2\2e\u024a\3\2\2\2g"+
- "\u024e\3\2\2\2i\u0253\3\2\2\2k\u0257\3\2\2\2m\u0259\3\2\2\2o\u025b\3\2"+
- "\2\2q\u025d\3\2\2\2s\u025f\3\2\2\2u\u0262\3\2\2\2w\u0264\3\2\2\2y\u0267"+
- "\3\2\2\2{\u026a\3\2\2\2}\u026e\3\2\2\2\177\u0272\3\2\2\2\u0081\u0278\3"+
- "\2\2\2\u0083\u027e\3\2\2\2\u0085\u0281\3\2\2\2\u0087\u0287\3\2\2\2\u0089"+
- "\u028e\3\2\2\2\u008b\u0291\3\2\2\2\u008d\u0294\3\2\2\2\u008f\u0297\3\2"+
- "\2\2\u0091\u029a\3\2\2\2\u0093\u02a3\3\2\2\2\u0095\u02a9\3\2\2\2\u0097"+
- "\u02af\3\2\2\2\u0099\u02b6\3\2\2\2\u009b\u02c0\3\2\2\2\u009d\u02cb\3\2"+
- "\2\2\u009f\u02d0\3\2\2\2\u00a1\u02d6\3\2\2\2\u00a3\u02e0\3\2\2\2\u00a5"+
- "\u02ea\3\2\2\2\u00a7\u02f3\3\2\2\2\u00a9\u02f9\3\2\2\2\u00ab\u0300\3\2"+
- "\2\2\u00ad\u0305\3\2\2\2\u00af\u0309\3\2\2\2\u00b1\u030f\3\2\2\2\u00b3"+
- "\u0317\3\2\2\2\u00b5\u031c\3\2\2\2\u00b7\u0321\3\2\2\2\u00b9\u032c\3\2"+
- "\2\2\u00bb\u032f\3\2\2\2\u00bd\u0333\3\2\2\2\u00bf\u0337\3\2\2\2\u00c1"+
- "\u033a\3\2\2\2\u00c3\u0343\3\2\2\2\u00c5\u0346\3\2\2\2\u00c7\u0351\3\2"+
- "\2\2\u00c9\u0354\3\2\2\2\u00cb\u035a\3\2\2\2\u00cd\u035f\3\2\2\2\u00cf"+
- "\u0368\3\2\2\2\u00d1\u0370\3\2\2\2\u00d3\u0377\3\2\2\2\u00d5\u0381\3\2"+
- "\2\2\u00d7\u0386\3\2\2\2\u00d9\u038c\3\2\2\2\u00db\u0391\3\2\2\2\u00dd"+
- "\u039a\3\2\2\2\u00df\u03a3\3\2\2\2\u00e1\u03ab\3\2\2\2\u00e3\u03b3\3\2"+
- "\2\2\u00e5\u03b8\3\2\2\2\u00e7\u03c1\3\2\2\2\u00e9\u03c8\3\2\2\2\u00eb"+
- "\u03cf\3\2\2\2\u00ed\u03d6\3\2\2\2\u00ef\u03de\3\2\2\2\u00f1\u03e3\3\2"+
- "\2\2\u00f3\u03ea\3\2\2\2\u00f5\u03f1\3\2\2\2\u00f7\u03f6\3\2\2\2\u00f9"+
- "\u03fc\3\2\2\2\u00fb\u0401\3\2\2\2\u00fd\u0406\3\2\2\2\u00ff\u040f\3\2"+
- "\2\2\u0101\u0415\3\2\2\2\u0103\u041a\3\2\2\2\u0105\u0423\3\2\2\2\u0107"+
- "\u0428\3\2\2\2\u0109\u0432\3\2\2\2\u010b\u0438\3\2\2\2\u010d\u0442\3\2"+
- "\2\2\u010f\u0447\3\2\2\2\u0111\u044d\3\2\2\2\u0113\u044f\3\2\2\2\u0115"+
- "\u0451\3\2\2\2\u0117\u0456\3\2\2\2\u0119\u045b\3\2\2\2\u011b\u045d\3\2"+
- "\2\2\u011d\u0469\3\2\2\2\u011f\u0477\3\2\2\2\u0121\u0480\3\2\2\2\u0123"+
- "\u0484\3\2\2\2\u0125\u0488\3\2\2\2\u0127\u0490\3\2\2\2\u0129\u0494\3\2"+
- "\2\2\u012b\u0496\3\2\2\2\u012d\u04ac\3\2\2\2\u012f\u0130\7=\2\2\u0130"+
- "\4\3\2\2\2\u0131\u0132\7o\2\2\u0132\u0133\7q\2\2\u0133\u0134\7f\2\2\u0134"+
- "\u0135\7w\2\2\u0135\u0136\7n\2\2\u0136\u0137\7g\2\2\u0137\6\3\2\2\2\u0138"+
- "\u0139\7p\2\2\u0139\u013a\7c\2\2\u013a\u013b\7o\2\2\u013b\u013c\7g\2\2"+
- "\u013c\u013d\7u\2\2\u013d\u013e\7r\2\2\u013e\u013f\7c\2\2\u013f\u0140"+
- "\7e\2\2\u0140\u0141\7g\2\2\u0141\b\3\2\2\2\u0142\u0143\7?\2\2\u0143\n"+
- "\3\2\2\2\u0144\u0145\7&\2\2\u0145\f\3\2\2\2\u0146\u0147\7<\2\2\u0147\u0148"+
- "\7?\2\2\u0148\16\3\2\2\2\u0149\u014a\7}\2\2\u014a\20\3\2\2\2\u014b\u014c"+
- "\7\177\2\2\u014c\22\3\2\2\2\u014d\u014e\7*\2\2\u014e\24\3\2\2\2\u014f"+
- "\u0150\7+\2\2\u0150\26\3\2\2\2\u0151\u0152\7,\2\2\u0152\30\3\2\2\2\u0153"+
- "\u0154\7~\2\2\u0154\32\3\2\2\2\u0155\u0156\7\'\2\2\u0156\34\3\2\2\2\u0157"+
- "\u0158\7.\2\2\u0158\36\3\2\2\2\u0159\u015a\7q\2\2\u015a\u015b\7t\2\2\u015b"+
- "\u015c\7f\2\2\u015c\u015d\7g\2\2\u015d\u015e\7t\2\2\u015e\u015f\7k\2\2"+
- "\u015f\u0160\7p\2\2\u0160\u0161\7i\2\2\u0161 \3\2\2\2\u0162\u0163\7q\2"+
- "\2\u0163\u0164\7t\2\2\u0164\u0165\7f\2\2\u0165\u0166\7g\2\2\u0166\u0167"+
- "\7t\2\2\u0167\u0168\7g\2\2\u0168\u0169\7f\2\2\u0169\"\3\2\2\2\u016a\u016b"+
- "\7f\2\2\u016b\u016c\7g\2\2\u016c\u016d\7e\2\2\u016d\u016e\7k\2\2\u016e"+
- "\u016f\7o\2\2\u016f\u0170\7c\2\2\u0170\u0171\7n\2\2\u0171\u0172\7/\2\2"+
- "\u0172\u0173\7h\2\2\u0173\u0174\7q\2\2\u0174\u0175\7t\2\2\u0175\u0176"+
- "\7o\2\2\u0176\u0177\7c\2\2\u0177\u0178\7v\2\2\u0178$\3\2\2\2\u0179\u017a"+
- "\7<\2\2\u017a&\3\2\2\2\u017b\u017c\7f\2\2\u017c\u017d\7g\2\2\u017d\u017e"+
- "\7e\2\2\u017e\u017f\7k\2\2\u017f\u0180\7o\2\2\u0180\u0181\7c\2\2\u0181"+
- "\u0182\7n\2\2\u0182\u0183\7/\2\2\u0183\u0184\7u\2\2\u0184\u0185\7g\2\2"+
- "\u0185\u0186\7r\2\2\u0186\u0187\7c\2\2\u0187\u0188\7t\2\2\u0188\u0189"+
- "\7c\2\2\u0189\u018a\7v\2\2\u018a\u018b\7q\2\2\u018b\u018c\7t\2\2\u018c"+
- "(\3\2\2\2\u018d\u018e\7i\2\2\u018e\u018f\7t\2\2\u018f\u0190\7q\2\2\u0190"+
- "\u0191\7w\2\2\u0191\u0192\7r\2\2\u0192\u0193\7k\2\2\u0193\u0194\7p\2\2"+
- "\u0194\u0195\7i\2\2\u0195\u0196\7/\2\2\u0196\u0197\7u\2\2\u0197\u0198"+
- "\7g\2\2\u0198\u0199\7r\2\2\u0199\u019a\7c\2\2\u019a\u019b\7t\2\2\u019b"+
- "\u019c\7c\2\2\u019c\u019d\7v\2\2\u019d\u019e\7q\2\2\u019e\u019f\7t\2\2"+
- "\u019f*\3\2\2\2\u01a0\u01a1\7k\2\2\u01a1\u01a2\7p\2\2\u01a2\u01a3\7h\2"+
- "\2\u01a3\u01a4\7k\2\2\u01a4\u01a5\7p\2\2\u01a5\u01a6\7k\2\2\u01a6\u01a7"+
- "\7v\2\2\u01a7\u01a8\7{\2\2\u01a8,\3\2\2\2\u01a9\u01aa\7o\2\2\u01aa\u01ab"+
- "\7k\2\2\u01ab\u01ac\7p\2\2\u01ac\u01ad\7w\2\2\u01ad\u01ae\7u\2\2\u01ae"+
- "\u01af\7/\2\2\u01af\u01b0\7u\2\2\u01b0\u01b1\7k\2\2\u01b1\u01b2\7i\2\2"+
- "\u01b2\u01b3\7p\2\2\u01b3.\3\2\2\2\u01b4\u01b5\7P\2\2\u01b5\u01b6\7c\2"+
- "\2\u01b6\u01b7\7P\2\2\u01b7\60\3\2\2\2\u01b8\u01b9\7r\2\2\u01b9\u01ba"+
- "\7g\2\2\u01ba\u01bb\7t\2\2\u01bb\u01bc\7e\2\2\u01bc\u01bd\7g\2\2\u01bd"+
- "\u01be\7p\2\2\u01be\u01bf\7v\2\2\u01bf\62\3\2\2\2\u01c0\u01c1\7r\2\2\u01c1"+
- "\u01c2\7g\2\2\u01c2\u01c3\7t\2\2\u01c3\u01c4\7/\2\2\u01c4\u01c5\7o\2\2"+
- "\u01c5\u01c6\7k\2\2\u01c6\u01c7\7n\2\2\u01c7\u01c8\7n\2\2\u01c8\u01c9"+
- "\7g\2\2\u01c9\64\3\2\2\2\u01ca\u01cb\7|\2\2\u01cb\u01cc\7g\2\2\u01cc\u01cd"+
- "\7t\2\2\u01cd\u01ce\7q\2\2\u01ce\u01cf\7/\2\2\u01cf\u01d0\7f\2\2\u01d0"+
- "\u01d1\7k\2\2\u01d1\u01d2\7i\2\2\u01d2\u01d3\7k\2\2\u01d3\u01d4\7v\2\2"+
- "\u01d4\66\3\2\2\2\u01d5\u01d6\7f\2\2\u01d6\u01d7\7k\2\2\u01d7\u01d8\7"+
- "i\2\2\u01d8\u01d9\7k\2\2\u01d9\u01da\7v\2\2\u01da8\3\2\2\2\u01db\u01dc"+
- "\7r\2\2\u01dc\u01dd\7c\2\2\u01dd\u01de\7v\2\2\u01de\u01df\7v\2\2\u01df"+
- "\u01e0\7g\2\2\u01e0\u01e1\7t\2\2\u01e1\u01e2\7p\2\2\u01e2\u01e3\7/\2\2"+
- "\u01e3\u01e4\7u\2\2\u01e4\u01e5\7g\2\2\u01e5\u01e6\7r\2\2\u01e6\u01e7"+
- "\7c\2\2\u01e7\u01e8\7t\2\2\u01e8\u01e9\7c\2\2\u01e9\u01ea\7v\2\2\u01ea"+
- "\u01eb\7q\2\2\u01eb\u01ec\7t\2\2\u01ec:\3\2\2\2\u01ed\u01ee\7k\2\2\u01ee"+
- "\u01ef\7o\2\2\u01ef\u01f0\7r\2\2\u01f0\u01f1\7q\2\2\u01f1\u01f2\7t\2\2"+
- "\u01f2\u01f3\7v\2\2\u01f3<\3\2\2\2\u01f4\u01f5\7g\2\2\u01f5\u01f6\7z\2"+
- "\2\u01f6\u01f7\7v\2\2\u01f7\u01f8\7g\2\2\u01f8\u01f9\7t\2\2\u01f9\u01fa"+
- "\7p\2\2\u01fa\u01fb\7c\2\2\u01fb\u01fc\7n\2\2\u01fc>\3\2\2\2\u01fd\u01fe"+
- "\7h\2\2\u01fe\u01ff\7w\2\2\u01ff\u0200\7p\2\2\u0200\u0201\7e\2\2\u0201"+
- "\u0202\7v\2\2\u0202\u0203\7k\2\2\u0203\u0204\7q\2\2\u0204\u0205\7p\2\2"+
- "\u0205@\3\2\2\2\u0206\u0207\7l\2\2\u0207\u0208\7u\2\2\u0208\u0209\7q\2"+
- "\2\u0209\u020a\7w\2\2\u020a\u020b\7p\2\2\u020b\u020c\7f\2\2\u020cB\3\2"+
- "\2\2\u020d\u020e\7e\2\2\u020e\u020f\7q\2\2\u020f\u0210\7o\2\2\u0210\u0211"+
- "\7r\2\2\u0211\u0212\7c\2\2\u0212\u0213\7e\2\2\u0213\u0214\7v\2\2\u0214"+
- "D\3\2\2\2\u0215\u0216\7x\2\2\u0216\u0217\7g\2\2\u0217\u0218\7t\2\2\u0218"+
- "\u0219\7d\2\2\u0219\u021a\7q\2\2\u021a\u021b\7u\2\2\u021b\u021c\7g\2\2"+
- "\u021cF\3\2\2\2\u021d\u021e\7u\2\2\u021e\u021f\7e\2\2\u021f\u0220\7j\2"+
- "\2\u0220\u0221\7g\2\2\u0221\u0222\7o\2\2\u0222\u0223\7c\2\2\u0223H\3\2"+
- "\2\2\u0224\u0225\7g\2\2\u0225\u0226\7s\2\2\u0226J\3\2\2\2\u0227\u0228"+
- "\7p\2\2\u0228\u0229\7g\2\2\u0229L\3\2\2\2\u022a\u022b\7n\2\2\u022b\u022c"+
- "\7v\2\2\u022cN\3\2\2\2\u022d\u022e\7n\2\2\u022e\u022f\7g\2\2\u022fP\3"+
- "\2\2\2\u0230\u0231\7i\2\2\u0231\u0232\7v\2\2\u0232R\3\2\2\2\u0233\u0234"+
- "\7i\2\2\u0234\u0235\7g\2\2\u0235T\3\2\2\2\u0236\u0237\7#\2\2\u0237\u0238"+
- "\7?\2\2\u0238V\3\2\2\2\u0239\u023a\7>\2\2\u023aX\3\2\2\2\u023b\u023c\7"+
- ">\2\2\u023c\u023d\7?\2\2\u023dZ\3\2\2\2\u023e\u023f\7@\2\2\u023f\\\3\2"+
- "\2\2\u0240\u0241\7@\2\2\u0241\u0242\7?\2\2\u0242^\3\2\2\2\u0243\u0244"+
- "\7~\2\2\u0244\u0245\7~\2\2\u0245`\3\2\2\2\u0246\u0247\7-\2\2\u0247b\3"+
- "\2\2\2\u0248\u0249\7/\2\2\u0249d\3\2\2\2\u024a\u024b\7f\2\2\u024b\u024c"+
- "\7k\2\2\u024c\u024d\7x\2\2\u024df\3\2\2\2\u024e\u024f\7k\2\2\u024f\u0250"+
- "\7f\2\2\u0250\u0251\7k\2\2\u0251\u0252\7x\2\2\u0252h\3\2\2\2\u0253\u0254"+
- "\7o\2\2\u0254\u0255\7q\2\2\u0255\u0256\7f\2\2\u0256j\3\2\2\2\u0257\u0258"+
- "\7#\2\2\u0258l\3\2\2\2\u0259\u025a\7]\2\2\u025an\3\2\2\2\u025b\u025c\7"+
- "_\2\2\u025cp\3\2\2\2\u025d\u025e\7\60\2\2\u025er\3\2\2\2\u025f\u0260\7"+
- "&\2\2\u0260\u0261\7&\2\2\u0261t\3\2\2\2\u0262\u0263\7%\2\2\u0263v\3\2"+
- "\2\2\u0264\u0265\7}\2\2\u0265\u0266\7~\2\2\u0266x\3\2\2\2\u0267\u0268"+
- "\7~\2\2\u0268\u0269\7\177\2\2\u0269z\3\2\2\2\u026a\u026b\7h\2\2\u026b"+
- "\u026c\7q\2\2\u026c\u026d\7t\2\2\u026d|\3\2\2\2\u026e\u026f\7n\2\2\u026f"+
- "\u0270\7g\2\2\u0270\u0271\7v\2\2\u0271~\3\2\2\2\u0272\u0273\7y\2\2\u0273"+
- "\u0274\7j\2\2\u0274\u0275\7g\2\2\u0275\u0276\7t\2\2\u0276\u0277\7g\2\2"+
- "\u0277\u0080\3\2\2\2\u0278\u0279\7i\2\2\u0279\u027a\7t\2\2\u027a\u027b"+
- "\7q\2\2\u027b\u027c\7w\2\2\u027c\u027d\7r\2\2\u027d\u0082\3\2\2\2\u027e"+
- "\u027f\7d\2\2\u027f\u0280\7{\2\2\u0280\u0084\3\2\2\2\u0281\u0282\7q\2"+
- "\2\u0282\u0283\7t\2\2\u0283\u0284\7f\2\2\u0284\u0285\7g\2\2\u0285\u0286"+
- "\7t\2\2\u0286\u0086\3\2\2\2\u0287\u0288\7t\2\2\u0288\u0289\7g\2\2\u0289"+
- "\u028a\7v\2\2\u028a\u028b\7w\2\2\u028b\u028c\7t\2\2\u028c\u028d\7p\2\2"+
- "\u028d\u0088\3\2\2\2\u028e\u028f\7k\2\2\u028f\u0290\7h\2\2\u0290\u008a"+
- "\3\2\2\2\u0291\u0292\7k\2\2\u0292\u0293\7p\2\2\u0293\u008c\3\2\2\2\u0294"+
- "\u0295\7c\2\2\u0295\u0296\7u\2\2\u0296\u008e\3\2\2\2\u0297\u0298\7c\2"+
- "\2\u0298\u0299\7v\2\2\u0299\u0090\3\2\2\2\u029a\u029b\7c\2\2\u029b\u029c"+
- "\7n\2\2\u029c\u029d\7n\2\2\u029d\u029e\7q\2\2\u029e\u029f\7y\2\2\u029f"+
- "\u02a0\7k\2\2\u02a0\u02a1\7p\2\2\u02a1\u02a2\7i\2\2\u02a2\u0092\3\2\2"+
- "\2\u02a3\u02a4\7g\2\2\u02a4\u02a5\7o\2\2\u02a5\u02a6\7r\2\2\u02a6\u02a7"+
- "\7v\2\2\u02a7\u02a8\7{\2\2\u02a8\u0094\3\2\2\2\u02a9\u02aa\7e\2\2\u02aa"+
- "\u02ab\7q\2\2\u02ab\u02ac\7w\2\2\u02ac\u02ad\7p\2\2\u02ad\u02ae\7v\2\2"+
- "\u02ae\u0096\3\2\2\2\u02af\u02b0\7u\2\2\u02b0\u02b1\7v\2\2\u02b1\u02b2"+
- "\7c\2\2\u02b2\u02b3\7d\2\2\u02b3\u02b4\7n\2\2\u02b4\u02b5\7g\2\2\u02b5"+
- "\u0098\3\2\2\2\u02b6\u02b7\7c\2\2\u02b7\u02b8\7u\2\2\u02b8\u02b9\7e\2"+
- "\2\u02b9\u02ba\7g\2\2\u02ba\u02bb\7p\2\2\u02bb\u02bc\7f\2\2\u02bc\u02bd"+
- "\7k\2\2\u02bd\u02be\7p\2\2\u02be\u02bf\7i\2\2\u02bf\u009a\3\2\2\2\u02c0"+
- "\u02c1\7f\2\2\u02c1\u02c2\7g\2\2\u02c2\u02c3\7u\2\2\u02c3\u02c4\7e\2\2"+
- "\u02c4\u02c5\7g\2\2\u02c5\u02c6\7p\2\2\u02c6\u02c7\7f\2\2\u02c7\u02c8"+
- "\7k\2\2\u02c8\u02c9\7p\2\2\u02c9\u02ca\7i\2\2\u02ca\u009c\3\2\2\2\u02cb"+
- "\u02cc\7u\2\2\u02cc\u02cd\7q\2\2\u02cd\u02ce\7o\2\2\u02ce\u02cf\7g\2\2"+
- "\u02cf\u009e\3\2\2\2\u02d0\u02d1\7g\2\2\u02d1\u02d2\7x\2\2\u02d2\u02d3"+
- "\7g\2\2\u02d3\u02d4\7t\2\2\u02d4\u02d5\7{\2\2\u02d5\u00a0\3\2\2\2\u02d6"+
- "\u02d7\7u\2\2\u02d7\u02d8\7c\2\2\u02d8\u02d9\7v\2\2\u02d9\u02da\7k\2\2"+
- "\u02da\u02db\7u\2\2\u02db\u02dc\7h\2\2\u02dc\u02dd\7k\2\2\u02dd\u02de"+
- "\7g\2\2\u02de\u02df\7u\2\2\u02df\u00a2\3\2\2\2\u02e0\u02e1\7e\2\2\u02e1"+
- "\u02e2\7q\2\2\u02e2\u02e3\7n\2\2\u02e3\u02e4\7n\2\2\u02e4\u02e5\7c\2\2"+
- "\u02e5\u02e6\7v\2\2\u02e6\u02e7\7k\2\2\u02e7\u02e8\7q\2\2\u02e8\u02e9"+
- "\7p\2\2\u02e9\u00a4\3\2\2\2\u02ea\u02eb\7i\2\2\u02eb\u02ec\7t\2\2\u02ec"+
- "\u02ed\7g\2\2\u02ed\u02ee\7c\2\2\u02ee\u02ef\7v\2\2\u02ef\u02f0\7g\2\2"+
- "\u02f0\u02f1\7u\2\2\u02f1\u02f2\7v\2\2\u02f2\u00a6\3\2\2\2\u02f3\u02f4"+
- "\7n\2\2\u02f4\u02f5\7g\2\2\u02f5\u02f6\7c\2\2\u02f6\u02f7\7u\2\2\u02f7"+
- "\u02f8\7v\2\2\u02f8\u00a8\3\2\2\2\u02f9\u02fa\7u\2\2\u02fa\u02fb\7y\2"+
- "\2\u02fb\u02fc\7k\2\2\u02fc\u02fd\7v\2\2\u02fd\u02fe\7e\2\2\u02fe\u02ff"+
- "\7j\2\2\u02ff\u00aa\3\2\2\2\u0300\u0301\7e\2\2\u0301\u0302\7c\2\2\u0302"+
- "\u0303\7u\2\2\u0303\u0304\7g\2\2\u0304\u00ac\3\2\2\2\u0305\u0306\7v\2"+
- "\2\u0306\u0307\7t\2\2\u0307\u0308\7{\2\2\u0308\u00ae\3\2\2\2\u0309\u030a"+
- "\7e\2\2\u030a\u030b\7c\2\2\u030b\u030c\7v\2\2\u030c\u030d\7e\2\2\u030d"+
- "\u030e\7j\2\2\u030e\u00b0\3\2\2\2\u030f\u0310\7f\2\2\u0310\u0311\7g\2"+
- "\2\u0311\u0312\7h\2\2\u0312\u0313\7c\2\2\u0313\u0314\7w\2\2\u0314\u0315"+
- "\7n\2\2\u0315\u0316\7v\2\2\u0316\u00b2\3\2\2\2\u0317\u0318\7v\2\2\u0318"+
- "\u0319\7j\2\2\u0319\u031a\7g\2\2\u031a\u031b\7p\2\2\u031b\u00b4\3\2\2"+
- "\2\u031c\u031d\7g\2\2\u031d\u031e\7n\2\2\u031e\u031f\7u\2\2\u031f\u0320"+
- "\7g\2\2\u0320\u00b6\3\2\2\2\u0321\u0322\7v\2\2\u0322\u0323\7{\2\2\u0323"+
- "\u0324\7r\2\2\u0324\u0325\7g\2\2\u0325\u0326\7u\2\2\u0326\u0327\7y\2\2"+
- "\u0327\u0328\7k\2\2\u0328\u0329\7v\2\2\u0329\u032a\7e\2\2\u032a\u032b"+
- "\7j\2\2\u032b\u00b8\3\2\2\2\u032c\u032d\7q\2\2\u032d\u032e\7t\2\2\u032e"+
- "\u00ba\3\2\2\2\u032f\u0330\7c\2\2\u0330\u0331\7p\2\2\u0331\u0332\7f\2"+
- "\2\u0332\u00bc\3\2\2\2\u0333\u0334\7p\2\2\u0334\u0335\7q\2\2\u0335\u0336"+
- "\7v\2\2\u0336\u00be\3\2\2\2\u0337\u0338\7v\2\2\u0338\u0339\7q\2\2\u0339"+
- "\u00c0\3\2\2\2\u033a\u033b\7k\2\2\u033b\u033c\7p\2\2\u033c\u033d\7u\2"+
- "\2\u033d\u033e\7v\2\2\u033e\u033f\7c\2\2\u033f\u0340\7p\2\2\u0340\u0341"+
- "\7e\2\2\u0341\u0342\7g\2\2\u0342\u00c2\3\2\2\2\u0343\u0344\7q\2\2\u0344"+
- "\u0345\7h\2\2\u0345\u00c4\3\2\2\2\u0346\u0347\7u\2\2\u0347\u0348\7v\2"+
- "\2\u0348\u0349\7c\2\2\u0349\u034a\7v\2\2\u034a\u034b\7k\2\2\u034b\u034c"+
- "\7e\2\2\u034c\u034d\7c\2\2\u034d\u034e\7n\2\2\u034e\u034f\7n\2\2\u034f"+
- "\u0350\7{\2\2\u0350\u00c6\3\2\2\2\u0351\u0352\7k\2\2\u0352\u0353\7u\2"+
- "\2\u0353\u00c8\3\2\2\2\u0354\u0355\7v\2\2\u0355\u0356\7t\2\2\u0356\u0357"+
- "\7g\2\2\u0357\u0358\7c\2\2\u0358\u0359\7v\2\2\u0359\u00ca\3\2\2\2\u035a"+
- "\u035b\7e\2\2\u035b\u035c\7c\2\2\u035c\u035d\7u\2\2\u035d\u035e\7v\2\2"+
- "\u035e\u00cc\3\2\2\2\u035f\u0360\7e\2\2\u0360\u0361\7c\2\2\u0361\u0362"+
- "\7u\2\2\u0362\u0363\7v\2\2\u0363\u0364\7c\2\2\u0364\u0365\7d\2\2\u0365"+
- "\u0366\7n\2\2\u0366\u0367\7g\2\2\u0367\u00ce\3\2\2\2\u0368\u0369\7x\2"+
- "\2\u0369\u036a\7g\2\2\u036a\u036b\7t\2\2\u036b\u036c\7u\2\2\u036c\u036d"+
- "\7k\2\2\u036d\u036e\7q\2\2\u036e\u036f\7p\2\2\u036f\u00d0\3\2\2\2\u0370"+
- "\u0371\7l\2\2\u0371\u0372\7u\2\2\u0372\u0373\7q\2\2\u0373\u0374\7p\2\2"+
- "\u0374\u0375\7k\2\2\u0375\u0376\7s\2\2\u0376\u00d2\3\2\2\2\u0377\u0378"+
- "\7w\2\2\u0378\u0379\7p\2\2\u0379\u037a\7q\2\2\u037a\u037b\7t\2\2\u037b"+
- "\u037c\7f\2\2\u037c\u037d\7g\2\2\u037d\u037e\7t\2\2\u037e\u037f\7g\2\2"+
- "\u037f\u0380\7f\2\2\u0380\u00d4\3\2\2\2\u0381\u0382\7v\2\2\u0382\u0383"+
- "\7t\2\2\u0383\u0384\7w\2\2\u0384\u0385\7g\2\2\u0385\u00d6\3\2\2\2\u0386"+
- "\u0387\7h\2\2\u0387\u0388\7c\2\2\u0388\u0389\7n\2\2\u0389\u038a\7u\2\2"+
- "\u038a\u038b\7g\2\2\u038b\u00d8\3\2\2\2\u038c\u038d\7v\2\2\u038d\u038e"+
- "\7{\2\2\u038e\u038f\7r\2\2\u038f\u0390\7g\2\2\u0390\u00da\3\2\2\2\u0391"+
- "\u0392\7x\2\2\u0392\u0393\7c\2\2\u0393\u0394\7n\2\2\u0394\u0395\7k\2\2"+
- "\u0395\u0396\7f\2\2\u0396\u0397\7c\2\2\u0397\u0398\7v\2\2\u0398\u0399"+
- "\7g\2\2\u0399\u00dc\3\2\2\2\u039a\u039b\7c\2\2\u039b\u039c\7p\2\2\u039c"+
- "\u039d\7p\2\2\u039d\u039e\7q\2\2\u039e\u039f\7v\2\2\u039f\u03a0\7c\2\2"+
- "\u03a0\u03a1\7v\2\2\u03a1\u03a2\7g\2\2\u03a2\u00de\3\2\2\2\u03a3\u03a4"+
- "\7f\2\2\u03a4\u03a5\7g\2\2\u03a5\u03a6\7e\2\2\u03a6\u03a7\7n\2\2\u03a7"+
- "\u03a8\7c\2\2\u03a8\u03a9\7t\2\2\u03a9\u03aa\7g\2\2\u03aa\u00e0\3\2\2"+
- "\2\u03ab\u03ac\7e\2\2\u03ac\u03ad\7q\2\2\u03ad\u03ae\7p\2\2\u03ae\u03af"+
- "\7v\2\2\u03af\u03b0\7g\2\2\u03b0\u03b1\7z\2\2\u03b1\u03b2\7v\2\2\u03b2"+
- "\u00e2\3\2\2\2\u03b3\u03b4\7k\2\2\u03b4\u03b5\7v\2\2\u03b5\u03b6\7g\2"+
- "\2\u03b6\u03b7\7o\2\2\u03b7\u00e4\3\2\2\2\u03b8\u03b9\7x\2\2\u03b9\u03ba"+
- "\7c\2\2\u03ba\u03bb\7t\2\2\u03bb\u03bc\7k\2\2\u03bc\u03bd\7c\2\2\u03bd"+
- "\u03be\7d\2\2\u03be\u03bf\7n\2\2\u03bf\u03c0\7g\2\2\u03c0\u00e6\3\2\2"+
- "\2\u03c1\u03c2\7k\2\2\u03c2\u03c3\7p\2\2\u03c3\u03c4\7u\2\2\u03c4\u03c5"+
- "\7g\2\2\u03c5\u03c6\7t\2\2\u03c6\u03c7\7v\2\2\u03c7\u00e8\3\2\2\2\u03c8"+
- "\u03c9\7f\2\2\u03c9\u03ca\7g\2\2\u03ca\u03cb\7n\2\2\u03cb\u03cc\7g\2\2"+
- "\u03cc\u03cd\7v\2\2\u03cd\u03ce\7g\2\2\u03ce\u00ea\3\2\2\2\u03cf\u03d0"+
- "\7t\2\2\u03d0\u03d1\7g\2\2\u03d1\u03d2\7p\2\2\u03d2\u03d3\7c\2\2\u03d3"+
- "\u03d4\7o\2\2\u03d4\u03d5\7g\2\2\u03d5\u00ec\3\2\2\2\u03d6\u03d7\7t\2"+
- "\2\u03d7\u03d8\7g\2\2\u03d8\u03d9\7r\2\2\u03d9\u03da\7n\2\2\u03da\u03db"+
- "\7c\2\2\u03db\u03dc\7e\2\2\u03dc\u03dd\7g\2\2\u03dd\u00ee\3\2\2\2\u03de"+
- "\u03df\7e\2\2\u03df\u03e0\7q\2\2\u03e0\u03e1\7r\2\2\u03e1\u03e2\7{\2\2"+
- "\u03e2\u00f0\3\2\2\2\u03e3\u03e4\7o\2\2\u03e4\u03e5\7q\2\2\u03e5\u03e6"+
- "\7f\2\2\u03e6\u03e7\7k\2\2\u03e7\u03e8\7h\2\2\u03e8\u03e9\7{\2\2\u03e9"+
- "\u00f2\3\2\2\2\u03ea\u03eb\7c\2\2\u03eb\u03ec\7r\2\2\u03ec\u03ed\7r\2"+
- "\2\u03ed\u03ee\7g\2\2\u03ee\u03ef\7p\2\2\u03ef\u03f0\7f\2\2\u03f0\u00f4"+
- "\3\2\2\2\u03f1\u03f2\7k\2\2\u03f2\u03f3\7p\2\2\u03f3\u03f4\7v\2\2\u03f4"+
- "\u03f5\7q\2\2\u03f5\u00f6\3\2\2\2\u03f6\u03f7\7x\2\2\u03f7\u03f8\7c\2"+
- "\2\u03f8\u03f9\7n\2\2\u03f9\u03fa\7w\2\2\u03fa\u03fb\7g\2\2\u03fb\u00f8"+
- "\3\2\2\2\u03fc\u03fd\7l\2\2\u03fd\u03fe\7u\2\2\u03fe\u03ff\7q\2\2\u03ff"+
- "\u0400\7p\2\2\u0400\u00fa\3\2\2\2\u0401\u0402\7y\2\2\u0402\u0403\7k\2"+
- "\2\u0403\u0404\7v\2\2\u0404\u0405\7j\2\2\u0405\u00fc\3\2\2\2\u0406\u0407"+
- "\7r\2\2\u0407\u0408\7q\2\2\u0408\u0409\7u\2\2\u0409\u040a\7k\2\2\u040a"+
- "\u040b\7v\2\2\u040b\u040c\7k\2\2\u040c\u040d\7q\2\2\u040d\u040e\7p\2\2"+
- "\u040e\u00fe\3\2\2\2\u040f\u0410\7d\2\2\u0410\u0411\7t\2\2\u0411\u0412"+
- "\7g\2\2\u0412\u0413\7c\2\2\u0413\u0414\7m\2\2\u0414\u0100\3\2\2\2\u0415"+
- "\u0416\7n\2\2\u0416\u0417\7q\2\2\u0417\u0418\7q\2\2\u0418\u0419\7r\2\2"+
- "\u0419\u0102\3\2\2\2\u041a\u041b\7e\2\2\u041b\u041c\7q\2\2\u041c\u041d"+
- "\7p\2\2\u041d\u041e\7v\2\2\u041e\u041f\7k\2\2\u041f\u0420\7p\2\2\u0420"+
- "\u0421\7w\2\2\u0421\u0422\7g\2\2\u0422\u0104\3\2\2\2\u0423\u0424\7g\2"+
- "\2\u0424\u0425\7z\2\2\u0425\u0426\7k\2\2\u0426\u0427\7v\2\2\u0427\u0106"+
- "\3\2\2\2\u0428\u0429\7t\2\2\u0429\u042a\7g\2\2\u042a\u042b\7v\2\2\u042b"+
- "\u042c\7w\2\2\u042c\u042d\7t\2\2\u042d\u042e\7p\2\2\u042e\u042f\7k\2\2"+
- "\u042f\u0430\7p\2\2\u0430\u0431\7i\2\2\u0431\u0108\3\2\2\2\u0432\u0433"+
- "\7y\2\2\u0433\u0434\7j\2\2\u0434\u0435\7k\2\2\u0435\u0436\7n\2\2\u0436"+
- "\u0437\7g\2\2\u0437\u010a\3\2\2\2\u0438\u043d\7$\2\2\u0439\u043c\5\u010d"+
- "\u0087\2\u043a\u043c\n\2\2\2\u043b\u0439\3\2\2\2\u043b\u043a\3\2\2\2\u043c"+
- "\u043f\3\2\2\2\u043d\u043b\3\2\2\2\u043d\u043e\3\2\2\2\u043e\u0440\3\2"+
- "\2\2\u043f\u043d\3\2\2\2\u0440\u0441\7$\2\2\u0441\u010c\3\2\2\2\u0442"+
- "\u0445\7^\2\2\u0443\u0446\t\3\2\2\u0444\u0446\5\u010f\u0088\2\u0445\u0443"+
- "\3\2\2\2\u0445\u0444\3\2\2\2\u0446\u010e\3\2\2\2\u0447\u0448\7w\2\2\u0448"+
- "\u0449\5\u0111\u0089\2\u0449\u044a\5\u0111\u0089\2\u044a\u044b\5\u0111"+
- "\u0089\2\u044b\u044c\5\u0111\u0089\2\u044c\u0110\3\2\2\2\u044d\u044e\t"+
- "\4\2\2\u044e\u0112\3\2\2\2\u044f\u0450\7A\2\2\u0450\u0114\3\2\2\2\u0451"+
- "\u0452\7p\2\2\u0452\u0453\7w\2\2\u0453\u0454\7n\2\2\u0454\u0455\7n\2\2"+
- "\u0455\u0116\3\2\2\2\u0456\u0457\5\u0119\u008d\2\u0457\u0118\3\2\2\2\u0458"+
- "\u045c\5\u011b\u008e\2\u0459\u045c\5\u011d\u008f\2\u045a\u045c\5\u011f"+
- "\u0090\2\u045b\u0458\3\2\2\2\u045b\u0459\3\2\2\2\u045b\u045a\3\2\2\2\u045c"+
- "\u011a\3\2\2\2\u045d\u045e\5\u0121\u0091\2\u045e\u011c\3\2\2\2\u045f\u0460"+
- "\7\60\2\2\u0460\u046a\5\u0121\u0091\2\u0461\u0462\5\u0121\u0091\2\u0462"+
- "\u0466\7\60\2\2\u0463\u0465\t\5\2\2\u0464\u0463\3\2\2\2\u0465\u0468\3"+
- "\2\2\2\u0466\u0464\3\2\2\2\u0466\u0467\3\2\2\2\u0467\u046a\3\2\2\2\u0468"+
- "\u0466\3\2\2\2\u0469\u045f\3\2\2\2\u0469\u0461\3\2\2\2\u046a\u011e\3\2"+
- "\2\2\u046b\u046c\7\60\2\2\u046c\u0478\5\u0121\u0091\2\u046d\u0475\5\u0121"+
- "\u0091\2\u046e\u0472\7\60\2\2\u046f\u0471\t\5\2\2\u0470\u046f\3\2\2\2"+
- "\u0471\u0474\3\2\2\2\u0472\u0470\3\2\2\2\u0472\u0473\3\2\2\2\u0473\u0476"+
- "\3\2\2\2\u0474\u0472\3\2\2\2\u0475\u046e\3\2\2\2\u0475\u0476\3\2\2\2\u0476"+
- "\u0478\3\2\2\2\u0477\u046b\3\2\2\2\u0477\u046d\3\2\2\2\u0478\u0479\3\2"+
- "\2\2\u0479\u047b\t\6\2\2\u047a\u047c\t\7\2\2\u047b\u047a\3\2\2\2\u047b"+
- "\u047c\3\2\2\2\u047c\u047d\3\2\2\2\u047d\u047e\5\u0121\u0091\2\u047e\u0120"+
- "\3\2\2\2\u047f\u0481\t\5\2\2\u0480\u047f\3\2\2\2\u0481\u0482\3\2\2\2\u0482"+
- "\u0480\3\2\2\2\u0482\u0483\3\2\2\2\u0483\u0122\3\2\2\2\u0484\u0485\t\b"+
- "\2\2\u0485\u0486\3\2\2\2\u0486\u0487\b\u0092\2\2\u0487\u0124\3\2\2\2\u0488"+
- "\u048c\5\u0127\u0094\2\u0489\u048b\5\u0129\u0095\2\u048a\u0489\3\2\2\2"+
- "\u048b\u048e\3\2\2\2\u048c\u048a\3\2\2\2\u048c\u048d\3\2\2\2\u048d\u0126"+
- "\3\2\2\2\u048e\u048c\3\2\2\2\u048f\u0491\t\t\2\2\u0490\u048f\3\2\2\2\u0491"+
- "\u0128\3\2\2\2\u0492\u0495\5\u0127\u0094\2\u0493\u0495\t\n\2\2\u0494\u0492"+
- "\3\2\2\2\u0494\u0493\3\2\2\2\u0495\u012a\3\2\2\2\u0496\u0497\7*\2\2\u0497"+
- "\u04a0\7<\2\2\u0498\u049f\5\u012b\u0096\2\u0499\u049a\7*\2\2\u049a\u049f"+
- "\n\13\2\2\u049b\u049c\7<\2\2\u049c\u049f\n\f\2\2\u049d\u049f\n\r\2\2\u049e"+
- "\u0498\3\2\2\2\u049e\u0499\3\2\2\2\u049e\u049b\3\2\2\2\u049e\u049d\3\2"+
- "\2\2\u049f\u04a2\3\2\2\2\u04a0\u049e\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1"+
- "\u04a4\3\2\2\2\u04a2\u04a0\3\2\2\2\u04a3\u04a5\7<\2\2\u04a4\u04a3\3\2"+
- "\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a4\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7"+
- "\u04a8\3\2\2\2\u04a8\u04a9\7+\2\2\u04a9\u04aa\3\2\2\2\u04aa\u04ab\b\u0096"+
- "\2\2\u04ab\u012c\3\2\2\2\u04ac\u04ad\n\16\2\2\u04ad\u012e\3\2\2\2\24\2"+
- "\u043b\u043d\u0445\u045b\u0466\u0469\u0472\u0475\u0477\u047b\u0482\u048c"+
- "\u0490\u0494\u049e\u04a0\u04a6\3\2\3\2";
+ "\4\u0097\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b"+
+ "\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f"+
+ "\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+
+ "\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+
+ "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad"+
+ "\t\u00ad\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\4\u00b1\t\u00b1"+
+ "\4\u00b2\t\u00b2\4\u00b3\t\u00b3\4\u00b4\t\u00b4\4\u00b5\t\u00b5\4\u00b6"+
+ "\t\u00b6\4\u00b7\t\u00b7\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3"+
+ "\5\3\5\3\6\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\3\13\3\13\3\f\3\f\3"+
+ "\r\3\r\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20"+
+ "\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+
+ "\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\23\3\23\3\23\3\23\3\23"+
+ "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24"+
+ "\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+
+ "\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26"+
+ "\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27"+
+ "\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31"+
+ "\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32"+
+ "\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
+ "\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35"+
+ "\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36"+
+ "\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3!\3"+
+ "!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3#\3#\3#\3$\3$\3$\3%\3%\3%\3&\3&\3&\3"+
+ "\'\3\'\3\'\3(\3(\3(\3)\3)\3*\3*\3*\3+\3+\3,\3,\3,\3-\3-\3-\3.\3.\3/\3"+
+ "/\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\63"+
+ "\3\63\3\64\3\64\3\65\3\65\3\66\3\66\3\67\3\67\3\67\38\38\39\39\39\3:\3"+
+ ":\3:\3;\3;\3;\3<\3<\3<\3<\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3"+
+ "?\3?\3@\3@\3@\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3D\3D\3"+
+ "D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3I\3"+
+ "I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3"+
+ "L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3O\3O\3"+
+ "O\3O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3"+
+ "Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3"+
+ "U\3U\3U\3V\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3Y\3"+
+ "Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3\\\3\\\3\\\3\\\3"+
+ "]\3]\3]\3]\3^\3^\3^\3_\3_\3_\3_\3_\3_\3_\3_\3_\3`\3`\3`\3a\3a\3a\3a\3"+
+ "a\3a\3a\3a\3a\3a\3a\3b\3b\3b\3c\3c\3c\3c\3c\3c\3d\3d\3d\3d\3d\3e\3e\3"+
+ "e\3e\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3g\3g\3h\3"+
+ "h\3h\3h\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3i\3j\3j\3j\3j\3j\3j\3k\3k\3k\3"+
+ "k\3k\3l\3l\3l\3l\3l\3l\3l\3l\3l\3m\3m\3m\3m\3m\3m\3m\3m\3m\3n\3n\3n\3"+
+ "n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3o\3o\3p\3p\3p\3p\3p\3q\3q\3q\3q\3q\3"+
+ "q\3q\3q\3q\3r\3r\3r\3r\3r\3r\3r\3s\3s\3s\3s\3s\3s\3s\3t\3t\3t\3t\3t\3"+
+ "t\3t\3u\3u\3u\3u\3u\3u\3u\3u\3v\3v\3v\3v\3v\3w\3w\3w\3w\3w\3w\3w\3x\3"+
+ "x\3x\3x\3x\3x\3x\3y\3y\3y\3y\3y\3z\3z\3z\3z\3z\3z\3{\3{\3{\3{\3{\3|\3"+
+ "|\3|\3|\3|\3}\3}\3}\3}\3}\3}\3}\3}\3}\3~\3~\3~\3~\3~\3~\3~\3\177\3\177"+
+ "\3\177\3\177\3\177\3\177\3\177\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080"+
+ "\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081\3\u0081"+
+ "\3\u0081\3\u0081\3\u0081\3\u0081\3\u0082\3\u0082\3\u0083\3\u0083\3\u0083"+
+ "\3\u0084\3\u0084\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0086"+
+ "\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086"+
+ "\3\u0086\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087"+
+ "\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0089\3\u0089"+
+ "\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089"+
+ "\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u008a"+
+ "\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a"+
+ "\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008b"+
+ "\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b"+
+ "\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008d\3\u008d"+
+ "\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e\3\u008e"+
+ "\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e"+
+ "\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008f\3\u008f"+
+ "\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090"+
+ "\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090"+
+ "\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0091\3\u0091"+
+ "\3\u0091\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092"+
+ "\3\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093"+
+ "\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094"+
+ "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095"+
+ "\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+
+ "\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+
+ "\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097"+
+ "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097"+
+ "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098"+
+ "\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098"+
+ "\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099"+
+ "\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099"+
+ "\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a"+
+ "\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b"+
+ "\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c"+
+ "\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009d\3\u009d"+
+ "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d"+
+ "\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+
+ "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+
+ "\3\u009f\3\u009f\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0"+
+ "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a2\3\u00a2"+
+ "\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\3\u00a3"+
+ "\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4"+
+ "\3\u00a4\3\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a6"+
+ "\3\u00a6\3\u00a6\7\u00a6\u05ca\n\u00a6\f\u00a6\16\u00a6\u05cd\13\u00a6"+
+ "\3\u00a6\3\u00a6\3\u00a7\3\u00a7\3\u00a7\5\u00a7\u05d4\n\u00a7\3\u00a8"+
+ "\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00aa\3\u00aa"+
+ "\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ad\3\u00ad"+
+ "\3\u00ad\5\u00ad\u05ea\n\u00ad\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00af"+
+ "\3\u00af\3\u00af\7\u00af\u05f3\n\u00af\f\u00af\16\u00af\u05f6\13\u00af"+
+ "\5\u00af\u05f8\n\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b0\7\u00b0"+
+ "\u05ff\n\u00b0\f\u00b0\16\u00b0\u0602\13\u00b0\5\u00b0\u0604\n\u00b0\5"+
+ "\u00b0\u0606\n\u00b0\3\u00b0\3\u00b0\5\u00b0\u060a\n\u00b0\3\u00b0\3\u00b0"+
+ "\3\u00b1\6\u00b1\u060f\n\u00b1\r\u00b1\16\u00b1\u0610\3\u00b2\3\u00b2"+
+ "\3\u00b2\3\u00b2\3\u00b3\3\u00b3\7\u00b3\u0619\n\u00b3\f\u00b3\16\u00b3"+
+ "\u061c\13\u00b3\3\u00b4\5\u00b4\u061f\n\u00b4\3\u00b5\3\u00b5\5\u00b5"+
+ "\u0623\n\u00b5\3\u00b6\3\u00b6\3\u00b6\3\u00b6\3\u00b6\3\u00b6\3\u00b6"+
+ "\3\u00b6\7\u00b6\u062d\n\u00b6\f\u00b6\16\u00b6\u0630\13\u00b6\3\u00b6"+
+ "\6\u00b6\u0633\n\u00b6\r\u00b6\16\u00b6\u0634\3\u00b6\3\u00b6\3\u00b6"+
+ "\3\u00b6\3\u00b7\3\u00b7\2\2\u00b8\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n"+
+ "\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30"+
+ "/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.["+
+ "/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083"+
+ "C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097"+
+ "M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00ab"+
+ "W\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bf"+
+ "a\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3"+
+ "k\u00d5l\u00d7m\u00d9n\u00dbo\u00ddp\u00dfq\u00e1r\u00e3s\u00e5t\u00e7"+
+ "u\u00e9v\u00ebw\u00edx\u00efy\u00f1z\u00f3{\u00f5|\u00f7}\u00f9~\u00fb"+
+ "\177\u00fd\u0080\u00ff\u0081\u0101\u0082\u0103\u0083\u0105\u0084\u0107"+
+ "\u0085\u0109\u0086\u010b\u0087\u010d\u0088\u010f\u0089\u0111\u008a\u0113"+
+ "\u008b\u0115\u008c\u0117\u008d\u0119\u008e\u011b\u008f\u011d\u0090\u011f"+
+ "\u0091\u0121\u0092\u0123\u0093\u0125\u0094\u0127\u0095\u0129\u0096\u012b"+
+ "\u0097\u012d\u0098\u012f\u0099\u0131\u009a\u0133\u009b\u0135\u009c\u0137"+
+ "\u009d\u0139\u009e\u013b\u009f\u013d\u00a0\u013f\u00a1\u0141\u00a2\u0143"+
+ "\u00a3\u0145\u00a4\u0147\u00a5\u0149\u00a6\u014b\u00a7\u014d\2\u014f\2"+
+ "\u0151\2\u0153\u00a8\u0155\u00a9\u0157\u00aa\u0159\u00ab\u015b\u00ac\u015d"+
+ "\u00ad\u015f\u00ae\u0161\2\u0163\u00af\u0165\u00b0\u0167\2\u0169\2\u016b"+
+ "\u00b1\u016d\u00b2\3\2\17\4\2$$^^\n\2$$\61\61^^ddhhppttvv\5\2\62;CHch"+
+ "\3\2\62;\4\2GGgg\4\2--//\5\2\13\f\17\17\"\"\20\2C\\aac|\u00c2\u00d8\u00da"+
+ "\u00f8\u00fa\u0301\u0372\u037f\u0381\u2001\u200e\u200f\u2072\u2191\u2c02"+
+ "\u2ff1\u3003\ud801\uf902\ufdd1\ufdf2\uffff\7\2//\62;\u00b9\u00b9\u0302"+
+ "\u0371\u2041\u2042\3\2<<\3\2++\4\2**<<\7\2$$()>>}}\177\177\2\u0648\2\3"+
+ "\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2"+
+ "\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31"+
+ "\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2"+
+ "\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2"+
+ "\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2"+
+ "\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2"+
+ "I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3"+
+ "\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2"+
+ "\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2"+
+ "o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3"+
+ "\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085"+
+ "\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2"+
+ "\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097"+
+ "\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2"+
+ "\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9"+
+ "\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2"+
+ "\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb"+
+ "\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2"+
+ "\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd"+
+ "\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2"+
+ "\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df"+
+ "\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2"+
+ "\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1"+
+ "\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2"+
+ "\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff\3\2\2\2\2\u0101\3\2\2\2\2\u0103"+
+ "\3\2\2\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\2\u0109\3\2\2\2\2\u010b\3\2\2"+
+ "\2\2\u010d\3\2\2\2\2\u010f\3\2\2\2\2\u0111\3\2\2\2\2\u0113\3\2\2\2\2\u0115"+
+ "\3\2\2\2\2\u0117\3\2\2\2\2\u0119\3\2\2\2\2\u011b\3\2\2\2\2\u011d\3\2\2"+
+ "\2\2\u011f\3\2\2\2\2\u0121\3\2\2\2\2\u0123\3\2\2\2\2\u0125\3\2\2\2\2\u0127"+
+ "\3\2\2\2\2\u0129\3\2\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2\2\2\u012f\3\2\2"+
+ "\2\2\u0131\3\2\2\2\2\u0133\3\2\2\2\2\u0135\3\2\2\2\2\u0137\3\2\2\2\2\u0139"+
+ "\3\2\2\2\2\u013b\3\2\2\2\2\u013d\3\2\2\2\2\u013f\3\2\2\2\2\u0141\3\2\2"+
+ "\2\2\u0143\3\2\2\2\2\u0145\3\2\2\2\2\u0147\3\2\2\2\2\u0149\3\2\2\2\2\u014b"+
+ "\3\2\2\2\2\u0153\3\2\2\2\2\u0155\3\2\2\2\2\u0157\3\2\2\2\2\u0159\3\2\2"+
+ "\2\2\u015b\3\2\2\2\2\u015d\3\2\2\2\2\u015f\3\2\2\2\2\u0163\3\2\2\2\2\u0165"+
+ "\3\2\2\2\2\u016b\3\2\2\2\2\u016d\3\2\2\2\3\u016f\3\2\2\2\5\u0171\3\2\2"+
+ "\2\7\u0178\3\2\2\2\t\u017a\3\2\2\2\13\u017c\3\2\2\2\r\u017f\3\2\2\2\17"+
+ "\u0181\3\2\2\2\21\u0183\3\2\2\2\23\u0185\3\2\2\2\25\u0187\3\2\2\2\27\u0189"+
+ "\3\2\2\2\31\u018b\3\2\2\2\33\u018d\3\2\2\2\35\u018f\3\2\2\2\37\u0198\3"+
+ "\2\2\2!\u01a0\3\2\2\2#\u01af\3\2\2\2%\u01b1\3\2\2\2\'\u01c3\3\2\2\2)\u01d6"+
+ "\3\2\2\2+\u01df\3\2\2\2-\u01ea\3\2\2\2/\u01ee\3\2\2\2\61\u01f6\3\2\2\2"+
+ "\63\u0200\3\2\2\2\65\u020b\3\2\2\2\67\u0211\3\2\2\29\u0223\3\2\2\2;\u022c"+
+ "\3\2\2\2=\u0235\3\2\2\2?\u023c\3\2\2\2A\u0244\3\2\2\2C\u024c\3\2\2\2E"+
+ "\u024f\3\2\2\2G\u0252\3\2\2\2I\u0255\3\2\2\2K\u0258\3\2\2\2M\u025b\3\2"+
+ "\2\2O\u025e\3\2\2\2Q\u0261\3\2\2\2S\u0263\3\2\2\2U\u0266\3\2\2\2W\u0268"+
+ "\3\2\2\2Y\u026b\3\2\2\2[\u026e\3\2\2\2]\u0270\3\2\2\2_\u0272\3\2\2\2a"+
+ "\u0276\3\2\2\2c\u027b\3\2\2\2e\u027f\3\2\2\2g\u0281\3\2\2\2i\u0283\3\2"+
+ "\2\2k\u0285\3\2\2\2m\u0287\3\2\2\2o\u028a\3\2\2\2q\u028c\3\2\2\2s\u028f"+
+ "\3\2\2\2u\u0292\3\2\2\2w\u0295\3\2\2\2y\u0299\3\2\2\2{\u029d\3\2\2\2}"+
+ "\u02a3\3\2\2\2\177\u02a9\3\2\2\2\u0081\u02ac\3\2\2\2\u0083\u02b2\3\2\2"+
+ "\2\u0085\u02b9\3\2\2\2\u0087\u02bc\3\2\2\2\u0089\u02bf\3\2\2\2\u008b\u02c2"+
+ "\3\2\2\2\u008d\u02c5\3\2\2\2\u008f\u02ce\3\2\2\2\u0091\u02d4\3\2\2\2\u0093"+
+ "\u02da\3\2\2\2\u0095\u02e1\3\2\2\2\u0097\u02eb\3\2\2\2\u0099\u02f6\3\2"+
+ "\2\2\u009b\u02fb\3\2\2\2\u009d\u0301\3\2\2\2\u009f\u030b\3\2\2\2\u00a1"+
+ "\u0315\3\2\2\2\u00a3\u031e\3\2\2\2\u00a5\u0324\3\2\2\2\u00a7\u032b\3\2"+
+ "\2\2\u00a9\u0330\3\2\2\2\u00ab\u0334\3\2\2\2\u00ad\u033a\3\2\2\2\u00af"+
+ "\u0342\3\2\2\2\u00b1\u0347\3\2\2\2\u00b3\u034c\3\2\2\2\u00b5\u0357\3\2"+
+ "\2\2\u00b7\u035a\3\2\2\2\u00b9\u035e\3\2\2\2\u00bb\u0362\3\2\2\2\u00bd"+
+ "\u0365\3\2\2\2\u00bf\u036e\3\2\2\2\u00c1\u0371\3\2\2\2\u00c3\u037c\3\2"+
+ "\2\2\u00c5\u037f\3\2\2\2\u00c7\u0385\3\2\2\2\u00c9\u038a\3\2\2\2\u00cb"+
+ "\u0393\3\2\2\2\u00cd\u039b\3\2\2\2\u00cf\u03a2\3\2\2\2\u00d1\u03ac\3\2"+
+ "\2\2\u00d3\u03b1\3\2\2\2\u00d5\u03b7\3\2\2\2\u00d7\u03bc\3\2\2\2\u00d9"+
+ "\u03c5\3\2\2\2\u00db\u03ce\3\2\2\2\u00dd\u03d6\3\2\2\2\u00df\u03de\3\2"+
+ "\2\2\u00e1\u03e3\3\2\2\2\u00e3\u03ec\3\2\2\2\u00e5\u03f3\3\2\2\2\u00e7"+
+ "\u03fa\3\2\2\2\u00e9\u0401\3\2\2\2\u00eb\u0409\3\2\2\2\u00ed\u040e\3\2"+
+ "\2\2\u00ef\u0415\3\2\2\2\u00f1\u041c\3\2\2\2\u00f3\u0421\3\2\2\2\u00f5"+
+ "\u0427\3\2\2\2\u00f7\u042c\3\2\2\2\u00f9\u0431\3\2\2\2\u00fb\u043a\3\2"+
+ "\2\2\u00fd\u0441\3\2\2\2\u00ff\u0448\3\2\2\2\u0101\u0452\3\2\2\2\u0103"+
+ "\u045a\3\2\2\2\u0105\u045c\3\2\2\2\u0107\u045f\3\2\2\2\u0109\u0461\3\2"+
+ "\2\2\u010b\u0467\3\2\2\2\u010d\u0472\3\2\2\2\u010f\u047c\3\2\2\2\u0111"+
+ "\u0481\3\2\2\2\u0113\u0494\3\2\2\2\u0115\u04a6\3\2\2\2\u0117\u04b0\3\2"+
+ "\2\2\u0119\u04b7\3\2\2\2\u011b\u04c0\3\2\2\2\u011d\u04d2\3\2\2\2\u011f"+
+ "\u04dc\3\2\2\2\u0121\u04ed\3\2\2\2\u0123\u04f2\3\2\2\2\u0125\u04f9\3\2"+
+ "\2\2\u0127\u0502\3\2\2\2\u0129\u0510\3\2\2\2\u012b\u0515\3\2\2\2\u012d"+
+ "\u052c\3\2\2\2\u012f\u053b\3\2\2\2\u0131\u054c\3\2\2\2\u0133\u055b\3\2"+
+ "\2\2\u0135\u0566\3\2\2\2\u0137\u0573\3\2\2\2\u0139\u057d\3\2\2\2\u013b"+
+ "\u0589\3\2\2\2\u013d\u0595\3\2\2\2\u013f\u059d\3\2\2\2\u0141\u05a3\3\2"+
+ "\2\2\u0143\u05a8\3\2\2\2\u0145\u05b1\3\2\2\2\u0147\u05b6\3\2\2\2\u0149"+
+ "\u05c0\3\2\2\2\u014b\u05c6\3\2\2\2\u014d\u05d0\3\2\2\2\u014f\u05d5\3\2"+
+ "\2\2\u0151\u05db\3\2\2\2\u0153\u05dd\3\2\2\2\u0155\u05df\3\2\2\2\u0157"+
+ "\u05e4\3\2\2\2\u0159\u05e9\3\2\2\2\u015b\u05eb\3\2\2\2\u015d\u05f7\3\2"+
+ "\2\2\u015f\u0605\3\2\2\2\u0161\u060e\3\2\2\2\u0163\u0612\3\2\2\2\u0165"+
+ "\u0616\3\2\2\2\u0167\u061e\3\2\2\2\u0169\u0622\3\2\2\2\u016b\u0624\3\2"+
+ "\2\2\u016d\u063a\3\2\2\2\u016f\u0170\7=\2\2\u0170\4\3\2\2\2\u0171\u0172"+
+ "\7o\2\2\u0172\u0173\7q\2\2\u0173\u0174\7f\2\2\u0174\u0175\7w\2\2\u0175"+
+ "\u0176\7n\2\2\u0176\u0177\7g\2\2\u0177\6\3\2\2\2\u0178\u0179\7?\2\2\u0179"+
+ "\b\3\2\2\2\u017a\u017b\7&\2\2\u017b\n\3\2\2\2\u017c\u017d\7<\2\2\u017d"+
+ "\u017e\7?\2\2\u017e\f\3\2\2\2\u017f\u0180\7}\2\2\u0180\16\3\2\2\2\u0181"+
+ "\u0182\7\177\2\2\u0182\20\3\2\2\2\u0183\u0184\7*\2\2\u0184\22\3\2\2\2"+
+ "\u0185\u0186\7+\2\2\u0186\24\3\2\2\2\u0187\u0188\7,\2\2\u0188\26\3\2\2"+
+ "\2\u0189\u018a\7~\2\2\u018a\30\3\2\2\2\u018b\u018c\7\'\2\2\u018c\32\3"+
+ "\2\2\2\u018d\u018e\7.\2\2\u018e\34\3\2\2\2\u018f\u0190\7q\2\2\u0190\u0191"+
+ "\7t\2\2\u0191\u0192\7f\2\2\u0192\u0193\7g\2\2\u0193\u0194\7t\2\2\u0194"+
+ "\u0195\7k\2\2\u0195\u0196\7p\2\2\u0196\u0197\7i\2\2\u0197\36\3\2\2\2\u0198"+
+ "\u0199\7q\2\2\u0199\u019a\7t\2\2\u019a\u019b\7f\2\2\u019b\u019c\7g\2\2"+
+ "\u019c\u019d\7t\2\2\u019d\u019e\7g\2\2\u019e\u019f\7f\2\2\u019f \3\2\2"+
+ "\2\u01a0\u01a1\7f\2\2\u01a1\u01a2\7g\2\2\u01a2\u01a3\7e\2\2\u01a3\u01a4"+
+ "\7k\2\2\u01a4\u01a5\7o\2\2\u01a5\u01a6\7c\2\2\u01a6\u01a7\7n\2\2\u01a7"+
+ "\u01a8\7/\2\2\u01a8\u01a9\7h\2\2\u01a9\u01aa\7q\2\2\u01aa\u01ab\7t\2\2"+
+ "\u01ab\u01ac\7o\2\2\u01ac\u01ad\7c\2\2\u01ad\u01ae\7v\2\2\u01ae\"\3\2"+
+ "\2\2\u01af\u01b0\7<\2\2\u01b0$\3\2\2\2\u01b1\u01b2\7f\2\2\u01b2\u01b3"+
+ "\7g\2\2\u01b3\u01b4\7e\2\2\u01b4\u01b5\7k\2\2\u01b5\u01b6\7o\2\2\u01b6"+
+ "\u01b7\7c\2\2\u01b7\u01b8\7n\2\2\u01b8\u01b9\7/\2\2\u01b9\u01ba\7u\2\2"+
+ "\u01ba\u01bb\7g\2\2\u01bb\u01bc\7r\2\2\u01bc\u01bd\7c\2\2\u01bd\u01be"+
+ "\7t\2\2\u01be\u01bf\7c\2\2\u01bf\u01c0\7v\2\2\u01c0\u01c1\7q\2\2\u01c1"+
+ "\u01c2\7t\2\2\u01c2&\3\2\2\2\u01c3\u01c4\7i\2\2\u01c4\u01c5\7t\2\2\u01c5"+
+ "\u01c6\7q\2\2\u01c6\u01c7\7w\2\2\u01c7\u01c8\7r\2\2\u01c8\u01c9\7k\2\2"+
+ "\u01c9\u01ca\7p\2\2\u01ca\u01cb\7i\2\2\u01cb\u01cc\7/\2\2\u01cc\u01cd"+
+ "\7u\2\2\u01cd\u01ce\7g\2\2\u01ce\u01cf\7r\2\2\u01cf\u01d0\7c\2\2\u01d0"+
+ "\u01d1\7t\2\2\u01d1\u01d2\7c\2\2\u01d2\u01d3\7v\2\2\u01d3\u01d4\7q\2\2"+
+ "\u01d4\u01d5\7t\2\2\u01d5(\3\2\2\2\u01d6\u01d7\7k\2\2\u01d7\u01d8\7p\2"+
+ "\2\u01d8\u01d9\7h\2\2\u01d9\u01da\7k\2\2\u01da\u01db\7p\2\2\u01db\u01dc"+
+ "\7k\2\2\u01dc\u01dd\7v\2\2\u01dd\u01de\7{\2\2\u01de*\3\2\2\2\u01df\u01e0"+
+ "\7o\2\2\u01e0\u01e1\7k\2\2\u01e1\u01e2\7p\2\2\u01e2\u01e3\7w\2\2\u01e3"+
+ "\u01e4\7u\2\2\u01e4\u01e5\7/\2\2\u01e5\u01e6\7u\2\2\u01e6\u01e7\7k\2\2"+
+ "\u01e7\u01e8\7i\2\2\u01e8\u01e9\7p\2\2\u01e9,\3\2\2\2\u01ea\u01eb\7P\2"+
+ "\2\u01eb\u01ec\7c\2\2\u01ec\u01ed\7P\2\2\u01ed.\3\2\2\2\u01ee\u01ef\7"+
+ "r\2\2\u01ef\u01f0\7g\2\2\u01f0\u01f1\7t\2\2\u01f1\u01f2\7e\2\2\u01f2\u01f3"+
+ "\7g\2\2\u01f3\u01f4\7p\2\2\u01f4\u01f5\7v\2\2\u01f5\60\3\2\2\2\u01f6\u01f7"+
+ "\7r\2\2\u01f7\u01f8\7g\2\2\u01f8\u01f9\7t\2\2\u01f9\u01fa\7/\2\2\u01fa"+
+ "\u01fb\7o\2\2\u01fb\u01fc\7k\2\2\u01fc\u01fd\7n\2\2\u01fd\u01fe\7n\2\2"+
+ "\u01fe\u01ff\7g\2\2\u01ff\62\3\2\2\2\u0200\u0201\7|\2\2\u0201\u0202\7"+
+ "g\2\2\u0202\u0203\7t\2\2\u0203\u0204\7q\2\2\u0204\u0205\7/\2\2\u0205\u0206"+
+ "\7f\2\2\u0206\u0207\7k\2\2\u0207\u0208\7i\2\2\u0208\u0209\7k\2\2\u0209"+
+ "\u020a\7v\2\2\u020a\64\3\2\2\2\u020b\u020c\7f\2\2\u020c\u020d\7k\2\2\u020d"+
+ "\u020e\7i\2\2\u020e\u020f\7k\2\2\u020f\u0210\7v\2\2\u0210\66\3\2\2\2\u0211"+
+ "\u0212\7r\2\2\u0212\u0213\7c\2\2\u0213\u0214\7v\2\2\u0214\u0215\7v\2\2"+
+ "\u0215\u0216\7g\2\2\u0216\u0217\7t\2\2\u0217\u0218\7p\2\2\u0218\u0219"+
+ "\7/\2\2\u0219\u021a\7u\2\2\u021a\u021b\7g\2\2\u021b\u021c\7r\2\2\u021c"+
+ "\u021d\7c\2\2\u021d\u021e\7t\2\2\u021e\u021f\7c\2\2\u021f\u0220\7v\2\2"+
+ "\u0220\u0221\7q\2\2\u0221\u0222\7t\2\2\u02228\3\2\2\2\u0223\u0224\7g\2"+
+ "\2\u0224\u0225\7z\2\2\u0225\u0226\7v\2\2\u0226\u0227\7g\2\2\u0227\u0228"+
+ "\7t\2\2\u0228\u0229\7p\2\2\u0229\u022a\7c\2\2\u022a\u022b\7n\2\2\u022b"+
+ ":\3\2\2\2\u022c\u022d\7h\2\2\u022d\u022e\7w\2\2\u022e\u022f\7p\2\2\u022f"+
+ "\u0230\7e\2\2\u0230\u0231\7v\2\2\u0231\u0232\7k\2\2\u0232\u0233\7q\2\2"+
+ "\u0233\u0234\7p\2\2\u0234<\3\2\2\2\u0235\u0236\7l\2\2\u0236\u0237\7u\2"+
+ "\2\u0237\u0238\7q\2\2\u0238\u0239\7w\2\2\u0239\u023a\7p\2\2\u023a\u023b"+
+ "\7f\2\2\u023b>\3\2\2\2\u023c\u023d\7e\2\2\u023d\u023e\7q\2\2\u023e\u023f"+
+ "\7o\2\2\u023f\u0240\7r\2\2\u0240\u0241\7c\2\2\u0241\u0242\7e\2\2\u0242"+
+ "\u0243\7v\2\2\u0243@\3\2\2\2\u0244\u0245\7x\2\2\u0245\u0246\7g\2\2\u0246"+
+ "\u0247\7t\2\2\u0247\u0248\7d\2\2\u0248\u0249\7q\2\2\u0249\u024a\7u\2\2"+
+ "\u024a\u024b\7g\2\2\u024bB\3\2\2\2\u024c\u024d\7g\2\2\u024d\u024e\7s\2"+
+ "\2\u024eD\3\2\2\2\u024f\u0250\7p\2\2\u0250\u0251\7g\2\2\u0251F\3\2\2\2"+
+ "\u0252\u0253\7n\2\2\u0253\u0254\7v\2\2\u0254H\3\2\2\2\u0255\u0256\7n\2"+
+ "\2\u0256\u0257\7g\2\2\u0257J\3\2\2\2\u0258\u0259\7i\2\2\u0259\u025a\7"+
+ "v\2\2\u025aL\3\2\2\2\u025b\u025c\7i\2\2\u025c\u025d\7g\2\2\u025dN\3\2"+
+ "\2\2\u025e\u025f\7#\2\2\u025f\u0260\7?\2\2\u0260P\3\2\2\2\u0261\u0262"+
+ "\7>\2\2\u0262R\3\2\2\2\u0263\u0264\7>\2\2\u0264\u0265\7?\2\2\u0265T\3"+
+ "\2\2\2\u0266\u0267\7@\2\2\u0267V\3\2\2\2\u0268\u0269\7@\2\2\u0269\u026a"+
+ "\7?\2\2\u026aX\3\2\2\2\u026b\u026c\7~\2\2\u026c\u026d\7~\2\2\u026dZ\3"+
+ "\2\2\2\u026e\u026f\7-\2\2\u026f\\\3\2\2\2\u0270\u0271\7/\2\2\u0271^\3"+
+ "\2\2\2\u0272\u0273\7f\2\2\u0273\u0274\7k\2\2\u0274\u0275\7x\2\2\u0275"+
+ "`\3\2\2\2\u0276\u0277\7k\2\2\u0277\u0278\7f\2\2\u0278\u0279\7k\2\2\u0279"+
+ "\u027a\7x\2\2\u027ab\3\2\2\2\u027b\u027c\7o\2\2\u027c\u027d\7q\2\2\u027d"+
+ "\u027e\7f\2\2\u027ed\3\2\2\2\u027f\u0280\7#\2\2\u0280f\3\2\2\2\u0281\u0282"+
+ "\7]\2\2\u0282h\3\2\2\2\u0283\u0284\7_\2\2\u0284j\3\2\2\2\u0285\u0286\7"+
+ "\60\2\2\u0286l\3\2\2\2\u0287\u0288\7&\2\2\u0288\u0289\7&\2\2\u0289n\3"+
+ "\2\2\2\u028a\u028b\7%\2\2\u028bp\3\2\2\2\u028c\u028d\7\60\2\2\u028d\u028e"+
+ "\7\60\2\2\u028er\3\2\2\2\u028f\u0290\7}\2\2\u0290\u0291\7~\2\2\u0291t"+
+ "\3\2\2\2\u0292\u0293\7~\2\2\u0293\u0294\7\177\2\2\u0294v\3\2\2\2\u0295"+
+ "\u0296\7h\2\2\u0296\u0297\7q\2\2\u0297\u0298\7t\2\2\u0298x\3\2\2\2\u0299"+
+ "\u029a\7n\2\2\u029a\u029b\7g\2\2\u029b\u029c\7v\2\2\u029cz\3\2\2\2\u029d"+
+ "\u029e\7y\2\2\u029e\u029f\7j\2\2\u029f\u02a0\7g\2\2\u02a0\u02a1\7t\2\2"+
+ "\u02a1\u02a2\7g\2\2\u02a2|\3\2\2\2\u02a3\u02a4\7i\2\2\u02a4\u02a5\7t\2"+
+ "\2\u02a5\u02a6\7q\2\2\u02a6\u02a7\7w\2\2\u02a7\u02a8\7r\2\2\u02a8~\3\2"+
+ "\2\2\u02a9\u02aa\7d\2\2\u02aa\u02ab\7{\2\2\u02ab\u0080\3\2\2\2\u02ac\u02ad"+
+ "\7q\2\2\u02ad\u02ae\7t\2\2\u02ae\u02af\7f\2\2\u02af\u02b0\7g\2\2\u02b0"+
+ "\u02b1\7t\2\2\u02b1\u0082\3\2\2\2\u02b2\u02b3\7t\2\2\u02b3\u02b4\7g\2"+
+ "\2\u02b4\u02b5\7v\2\2\u02b5\u02b6\7w\2\2\u02b6\u02b7\7t\2\2\u02b7\u02b8"+
+ "\7p\2\2\u02b8\u0084\3\2\2\2\u02b9\u02ba\7k\2\2\u02ba\u02bb\7h\2\2\u02bb"+
+ "\u0086\3\2\2\2\u02bc\u02bd\7k\2\2\u02bd\u02be\7p\2\2\u02be\u0088\3\2\2"+
+ "\2\u02bf\u02c0\7c\2\2\u02c0\u02c1\7u\2\2\u02c1\u008a\3\2\2\2\u02c2\u02c3"+
+ "\7c\2\2\u02c3\u02c4\7v\2\2\u02c4\u008c\3\2\2\2\u02c5\u02c6\7c\2\2\u02c6"+
+ "\u02c7\7n\2\2\u02c7\u02c8\7n\2\2\u02c8\u02c9\7q\2\2\u02c9\u02ca\7y\2\2"+
+ "\u02ca\u02cb\7k\2\2\u02cb\u02cc\7p\2\2\u02cc\u02cd\7i\2\2\u02cd\u008e"+
+ "\3\2\2\2\u02ce\u02cf\7g\2\2\u02cf\u02d0\7o\2\2\u02d0\u02d1\7r\2\2\u02d1"+
+ "\u02d2\7v\2\2\u02d2\u02d3\7{\2\2\u02d3\u0090\3\2\2\2\u02d4\u02d5\7e\2"+
+ "\2\u02d5\u02d6\7q\2\2\u02d6\u02d7\7w\2\2\u02d7\u02d8\7p\2\2\u02d8\u02d9"+
+ "\7v\2\2\u02d9\u0092\3\2\2\2\u02da\u02db\7u\2\2\u02db\u02dc\7v\2\2\u02dc"+
+ "\u02dd\7c\2\2\u02dd\u02de\7d\2\2\u02de\u02df\7n\2\2\u02df\u02e0\7g\2\2"+
+ "\u02e0\u0094\3\2\2\2\u02e1\u02e2\7c\2\2\u02e2\u02e3\7u\2\2\u02e3\u02e4"+
+ "\7e\2\2\u02e4\u02e5\7g\2\2\u02e5\u02e6\7p\2\2\u02e6\u02e7\7f\2\2\u02e7"+
+ "\u02e8\7k\2\2\u02e8\u02e9\7p\2\2\u02e9\u02ea\7i\2\2\u02ea\u0096\3\2\2"+
+ "\2\u02eb\u02ec\7f\2\2\u02ec\u02ed\7g\2\2\u02ed\u02ee\7u\2\2\u02ee\u02ef"+
+ "\7e\2\2\u02ef\u02f0\7g\2\2\u02f0\u02f1\7p\2\2\u02f1\u02f2\7f\2\2\u02f2"+
+ "\u02f3\7k\2\2\u02f3\u02f4\7p\2\2\u02f4\u02f5\7i\2\2\u02f5\u0098\3\2\2"+
+ "\2\u02f6\u02f7\7u\2\2\u02f7\u02f8\7q\2\2\u02f8\u02f9\7o\2\2\u02f9\u02fa"+
+ "\7g\2\2\u02fa\u009a\3\2\2\2\u02fb\u02fc\7g\2\2\u02fc\u02fd\7x\2\2\u02fd"+
+ "\u02fe\7g\2\2\u02fe\u02ff\7t\2\2\u02ff\u0300\7{\2\2\u0300\u009c\3\2\2"+
+ "\2\u0301\u0302\7u\2\2\u0302\u0303\7c\2\2\u0303\u0304\7v\2\2\u0304\u0305"+
+ "\7k\2\2\u0305\u0306\7u\2\2\u0306\u0307\7h\2\2\u0307\u0308\7k\2\2\u0308"+
+ "\u0309\7g\2\2\u0309\u030a\7u\2\2\u030a\u009e\3\2\2\2\u030b\u030c\7e\2"+
+ "\2\u030c\u030d\7q\2\2\u030d\u030e\7n\2\2\u030e\u030f\7n\2\2\u030f\u0310"+
+ "\7c\2\2\u0310\u0311\7v\2\2\u0311\u0312\7k\2\2\u0312\u0313\7q\2\2\u0313"+
+ "\u0314\7p\2\2\u0314\u00a0\3\2\2\2\u0315\u0316\7i\2\2\u0316\u0317\7t\2"+
+ "\2\u0317\u0318\7g\2\2\u0318\u0319\7c\2\2\u0319\u031a\7v\2\2\u031a\u031b"+
+ "\7g\2\2\u031b\u031c\7u\2\2\u031c\u031d\7v\2\2\u031d\u00a2\3\2\2\2\u031e"+
+ "\u031f\7n\2\2\u031f\u0320\7g\2\2\u0320\u0321\7c\2\2\u0321\u0322\7u\2\2"+
+ "\u0322\u0323\7v\2\2\u0323\u00a4\3\2\2\2\u0324\u0325\7u\2\2\u0325\u0326"+
+ "\7y\2\2\u0326\u0327\7k\2\2\u0327\u0328\7v\2\2\u0328\u0329\7e\2\2\u0329"+
+ "\u032a\7j\2\2\u032a\u00a6\3\2\2\2\u032b\u032c\7e\2\2\u032c\u032d\7c\2"+
+ "\2\u032d\u032e\7u\2\2\u032e\u032f\7g\2\2\u032f\u00a8\3\2\2\2\u0330\u0331"+
+ "\7v\2\2\u0331\u0332\7t\2\2\u0332\u0333\7{\2\2\u0333\u00aa\3\2\2\2\u0334"+
+ "\u0335\7e\2\2\u0335\u0336\7c\2\2\u0336\u0337\7v\2\2\u0337\u0338\7e\2\2"+
+ "\u0338\u0339\7j\2\2\u0339\u00ac\3\2\2\2\u033a\u033b\7f\2\2\u033b\u033c"+
+ "\7g\2\2\u033c\u033d\7h\2\2\u033d\u033e\7c\2\2\u033e\u033f\7w\2\2\u033f"+
+ "\u0340\7n\2\2\u0340\u0341\7v\2\2\u0341\u00ae\3\2\2\2\u0342\u0343\7v\2"+
+ "\2\u0343\u0344\7j\2\2\u0344\u0345\7g\2\2\u0345\u0346\7p\2\2\u0346\u00b0"+
+ "\3\2\2\2\u0347\u0348\7g\2\2\u0348\u0349\7n\2\2\u0349\u034a\7u\2\2\u034a"+
+ "\u034b\7g\2\2\u034b\u00b2\3\2\2\2\u034c\u034d\7v\2\2\u034d\u034e\7{\2"+
+ "\2\u034e\u034f\7r\2\2\u034f\u0350\7g\2\2\u0350\u0351\7u\2\2\u0351\u0352"+
+ "\7y\2\2\u0352\u0353\7k\2\2\u0353\u0354\7v\2\2\u0354\u0355\7e\2\2\u0355"+
+ "\u0356\7j\2\2\u0356\u00b4\3\2\2\2\u0357\u0358\7q\2\2\u0358\u0359\7t\2"+
+ "\2\u0359\u00b6\3\2\2\2\u035a\u035b\7c\2\2\u035b\u035c\7p\2\2\u035c\u035d"+
+ "\7f\2\2\u035d\u00b8\3\2\2\2\u035e\u035f\7p\2\2\u035f\u0360\7q\2\2\u0360"+
+ "\u0361\7v\2\2\u0361\u00ba\3\2\2\2\u0362\u0363\7v\2\2\u0363\u0364\7q\2"+
+ "\2\u0364\u00bc\3\2\2\2\u0365\u0366\7k\2\2\u0366\u0367\7p\2\2\u0367\u0368"+
+ "\7u\2\2\u0368\u0369\7v\2\2\u0369\u036a\7c\2\2\u036a\u036b\7p\2\2\u036b"+
+ "\u036c\7e\2\2\u036c\u036d\7g\2\2\u036d\u00be\3\2\2\2\u036e\u036f\7q\2"+
+ "\2\u036f\u0370\7h\2\2\u0370\u00c0\3\2\2\2\u0371\u0372\7u\2\2\u0372\u0373"+
+ "\7v\2\2\u0373\u0374\7c\2\2\u0374\u0375\7v\2\2\u0375\u0376\7k\2\2\u0376"+
+ "\u0377\7e\2\2\u0377\u0378\7c\2\2\u0378\u0379\7n\2\2\u0379\u037a\7n\2\2"+
+ "\u037a\u037b\7{\2\2\u037b\u00c2\3\2\2\2\u037c\u037d\7k\2\2\u037d\u037e"+
+ "\7u\2\2\u037e\u00c4\3\2\2\2\u037f\u0380\7v\2\2\u0380\u0381\7t\2\2\u0381"+
+ "\u0382\7g\2\2\u0382\u0383\7c\2\2\u0383\u0384\7v\2\2\u0384\u00c6\3\2\2"+
+ "\2\u0385\u0386\7e\2\2\u0386\u0387\7c\2\2\u0387\u0388\7u\2\2\u0388\u0389"+
+ "\7v\2\2\u0389\u00c8\3\2\2\2\u038a\u038b\7e\2\2\u038b\u038c\7c\2\2\u038c"+
+ "\u038d\7u\2\2\u038d\u038e\7v\2\2\u038e\u038f\7c\2\2\u038f\u0390\7d\2\2"+
+ "\u0390\u0391\7n\2\2\u0391\u0392\7g\2\2\u0392\u00ca\3\2\2\2\u0393\u0394"+
+ "\7x\2\2\u0394\u0395\7g\2\2\u0395\u0396\7t\2\2\u0396\u0397\7u\2\2\u0397"+
+ "\u0398\7k\2\2\u0398\u0399\7q\2\2\u0399\u039a\7p\2\2\u039a\u00cc\3\2\2"+
+ "\2\u039b\u039c\7l\2\2\u039c\u039d\7u\2\2\u039d\u039e\7q\2\2\u039e\u039f"+
+ "\7p\2\2\u039f\u03a0\7k\2\2\u03a0\u03a1\7s\2\2\u03a1\u00ce\3\2\2\2\u03a2"+
+ "\u03a3\7w\2\2\u03a3\u03a4\7p\2\2\u03a4\u03a5\7q\2\2\u03a5\u03a6\7t\2\2"+
+ "\u03a6\u03a7\7f\2\2\u03a7\u03a8\7g\2\2\u03a8\u03a9\7t\2\2\u03a9\u03aa"+
+ "\7g\2\2\u03aa\u03ab\7f\2\2\u03ab\u00d0\3\2\2\2\u03ac\u03ad\7v\2\2\u03ad"+
+ "\u03ae\7t\2\2\u03ae\u03af\7w\2\2\u03af\u03b0\7g\2\2\u03b0\u00d2\3\2\2"+
+ "\2\u03b1\u03b2\7h\2\2\u03b2\u03b3\7c\2\2\u03b3\u03b4\7n\2\2\u03b4\u03b5"+
+ "\7u\2\2\u03b5\u03b6\7g\2\2\u03b6\u00d4\3\2\2\2\u03b7\u03b8\7v\2\2\u03b8"+
+ "\u03b9\7{\2\2\u03b9\u03ba\7r\2\2\u03ba\u03bb\7g\2\2\u03bb\u00d6\3\2\2"+
+ "\2\u03bc\u03bd\7x\2\2\u03bd\u03be\7c\2\2\u03be\u03bf\7n\2\2\u03bf\u03c0"+
+ "\7k\2\2\u03c0\u03c1\7f\2\2\u03c1\u03c2\7c\2\2\u03c2\u03c3\7v\2\2\u03c3"+
+ "\u03c4\7g\2\2\u03c4\u00d8\3\2\2\2\u03c5\u03c6\7c\2\2\u03c6\u03c7\7p\2"+
+ "\2\u03c7\u03c8\7p\2\2\u03c8\u03c9\7q\2\2\u03c9\u03ca\7v\2\2\u03ca\u03cb"+
+ "\7c\2\2\u03cb\u03cc\7v\2\2\u03cc\u03cd\7g\2\2\u03cd\u00da\3\2\2\2\u03ce"+
+ "\u03cf\7f\2\2\u03cf\u03d0\7g\2\2\u03d0\u03d1\7e\2\2\u03d1\u03d2\7n\2\2"+
+ "\u03d2\u03d3\7c\2\2\u03d3\u03d4\7t\2\2\u03d4\u03d5\7g\2\2\u03d5\u00dc"+
+ "\3\2\2\2\u03d6\u03d7\7e\2\2\u03d7\u03d8\7q\2\2\u03d8\u03d9\7p\2\2\u03d9"+
+ "\u03da\7v\2\2\u03da\u03db\7g\2\2\u03db\u03dc\7z\2\2\u03dc\u03dd\7v\2\2"+
+ "\u03dd\u00de\3\2\2\2\u03de\u03df\7k\2\2\u03df\u03e0\7v\2\2\u03e0\u03e1"+
+ "\7g\2\2\u03e1\u03e2\7o\2\2\u03e2\u00e0\3\2\2\2\u03e3\u03e4\7x\2\2\u03e4"+
+ "\u03e5\7c\2\2\u03e5\u03e6\7t\2\2\u03e6\u03e7\7k\2\2\u03e7\u03e8\7c\2\2"+
+ "\u03e8\u03e9\7d\2\2\u03e9\u03ea\7n\2\2\u03ea\u03eb\7g\2\2\u03eb\u00e2"+
+ "\3\2\2\2\u03ec\u03ed\7k\2\2\u03ed\u03ee\7p\2\2\u03ee\u03ef\7u\2\2\u03ef"+
+ "\u03f0\7g\2\2\u03f0\u03f1\7t\2\2\u03f1\u03f2\7v\2\2\u03f2\u00e4\3\2\2"+
+ "\2\u03f3\u03f4\7f\2\2\u03f4\u03f5\7g\2\2\u03f5\u03f6\7n\2\2\u03f6\u03f7"+
+ "\7g\2\2\u03f7\u03f8\7v\2\2\u03f8\u03f9\7g\2\2\u03f9\u00e6\3\2\2\2\u03fa"+
+ "\u03fb\7t\2\2\u03fb\u03fc\7g\2\2\u03fc\u03fd\7p\2\2\u03fd\u03fe\7c\2\2"+
+ "\u03fe\u03ff\7o\2\2\u03ff\u0400\7g\2\2\u0400\u00e8\3\2\2\2\u0401\u0402"+
+ "\7t\2\2\u0402\u0403\7g\2\2\u0403\u0404\7r\2\2\u0404\u0405\7n\2\2\u0405"+
+ "\u0406\7c\2\2\u0406\u0407\7e\2\2\u0407\u0408\7g\2\2\u0408\u00ea\3\2\2"+
+ "\2\u0409\u040a\7e\2\2\u040a\u040b\7q\2\2\u040b\u040c\7r\2\2\u040c\u040d"+
+ "\7{\2\2\u040d\u00ec\3\2\2\2\u040e\u040f\7o\2\2\u040f\u0410\7q\2\2\u0410"+
+ "\u0411\7f\2\2\u0411\u0412\7k\2\2\u0412\u0413\7h\2\2\u0413\u0414\7{\2\2"+
+ "\u0414\u00ee\3\2\2\2\u0415\u0416\7c\2\2\u0416\u0417\7r\2\2\u0417\u0418"+
+ "\7r\2\2\u0418\u0419\7g\2\2\u0419\u041a\7p\2\2\u041a\u041b\7f\2\2\u041b"+
+ "\u00f0\3\2\2\2\u041c\u041d\7k\2\2\u041d\u041e\7p\2\2\u041e\u041f\7v\2"+
+ "\2\u041f\u0420\7q\2\2\u0420\u00f2\3\2\2\2\u0421\u0422\7x\2\2\u0422\u0423"+
+ "\7c\2\2\u0423\u0424\7n\2\2\u0424\u0425\7w\2\2\u0425\u0426\7g\2\2\u0426"+
+ "\u00f4\3\2\2\2\u0427\u0428\7l\2\2\u0428\u0429\7u\2\2\u0429\u042a\7q\2"+
+ "\2\u042a\u042b\7p\2\2\u042b\u00f6\3\2\2\2\u042c\u042d\7y\2\2\u042d\u042e"+
+ "\7k\2\2\u042e\u042f\7v\2\2\u042f\u0430\7j\2\2\u0430\u00f8\3\2\2\2\u0431"+
+ "\u0432\7r\2\2\u0432\u0433\7q\2\2\u0433\u0434\7u\2\2\u0434\u0435\7k\2\2"+
+ "\u0435\u0436\7v\2\2\u0436\u0437\7k\2\2\u0437\u0438\7q\2\2\u0438\u0439"+
+ "\7p\2\2\u0439\u00fa\3\2\2\2\u043a\u043b\7k\2\2\u043b\u043c\7o\2\2\u043c"+
+ "\u043d\7r\2\2\u043d\u043e\7q\2\2\u043e\u043f\7t\2\2\u043f\u0440\7v\2\2"+
+ "\u0440\u00fc\3\2\2\2\u0441\u0442\7u\2\2\u0442\u0443\7e\2\2\u0443\u0444"+
+ "\7j\2\2\u0444\u0445\7g\2\2\u0445\u0446\7o\2\2\u0446\u0447\7c\2\2\u0447"+
+ "\u00fe\3\2\2\2\u0448\u0449\7p\2\2\u0449\u044a\7c\2\2\u044a\u044b\7o\2"+
+ "\2\u044b\u044c\7g\2\2\u044c\u044d\7u\2\2\u044d\u044e\7r\2\2\u044e\u044f"+
+ "\7c\2\2\u044f\u0450\7e\2\2\u0450\u0451\7g\2\2\u0451\u0100\3\2\2\2\u0452"+
+ "\u0453\7g\2\2\u0453\u0454\7n\2\2\u0454\u0455\7g\2\2\u0455\u0456\7o\2\2"+
+ "\u0456\u0457\7g\2\2\u0457\u0458\7p\2\2\u0458\u0459\7v\2\2\u0459\u0102"+
+ "\3\2\2\2\u045a\u045b\7\61\2\2\u045b\u0104\3\2\2\2\u045c\u045d\7\61\2\2"+
+ "\u045d\u045e\7\61\2\2\u045e\u0106\3\2\2\2\u045f\u0460\7B\2\2\u0460\u0108"+
+ "\3\2\2\2\u0461\u0462\7e\2\2\u0462\u0463\7j\2\2\u0463\u0464\7k\2\2\u0464"+
+ "\u0465\7n\2\2\u0465\u0466\7f\2\2\u0466\u010a\3\2\2\2\u0467\u0468\7f\2"+
+ "\2\u0468\u0469\7g\2\2\u0469\u046a\7u\2\2\u046a\u046b\7e\2\2\u046b\u046c"+
+ "\7g\2\2\u046c\u046d\7p\2\2\u046d\u046e\7f\2\2\u046e\u046f\7c\2\2\u046f"+
+ "\u0470\7p\2\2\u0470\u0471\7v\2\2\u0471\u010c\3\2\2\2\u0472\u0473\7c\2"+
+ "\2\u0473\u0474\7v\2\2\u0474\u0475\7v\2\2\u0475\u0476\7t\2\2\u0476\u0477"+
+ "\7k\2\2\u0477\u0478\7d\2\2\u0478\u0479\7w\2\2\u0479\u047a\7v\2\2\u047a"+
+ "\u047b\7g\2\2\u047b\u010e\3\2\2\2\u047c\u047d\7u\2\2\u047d\u047e\7g\2"+
+ "\2\u047e\u047f\7n\2\2\u047f\u0480\7h\2\2\u0480\u0110\3\2\2\2\u0481\u0482"+
+ "\7f\2\2\u0482\u0483\7g\2\2\u0483\u0484\7u\2\2\u0484\u0485\7e\2\2\u0485"+
+ "\u0486\7g\2\2\u0486\u0487\7p\2\2\u0487\u0488\7f\2\2\u0488\u0489\7c\2\2"+
+ "\u0489\u048a\7p\2\2\u048a\u048b\7v\2\2\u048b\u048c\7/\2\2\u048c\u048d"+
+ "\7q\2\2\u048d\u048e\7t\2\2\u048e\u048f\7/\2\2\u048f\u0490\7u\2\2\u0490"+
+ "\u0491\7g\2\2\u0491\u0492\7n\2\2\u0492\u0493\7h\2\2\u0493\u0112\3\2\2"+
+ "\2\u0494\u0495\7h\2\2\u0495\u0496\7q\2\2\u0496\u0497\7n\2\2\u0497\u0498"+
+ "\7n\2\2\u0498\u0499\7q\2\2\u0499\u049a\7y\2\2\u049a\u049b\7k\2\2\u049b"+
+ "\u049c\7p\2\2\u049c\u049d\7i\2\2\u049d\u049e\7/\2\2\u049e\u049f\7u\2\2"+
+ "\u049f\u04a0\7k\2\2\u04a0\u04a1\7d\2\2\u04a1\u04a2\7n\2\2\u04a2\u04a3"+
+ "\7k\2\2\u04a3\u04a4\7p\2\2\u04a4\u04a5\7i\2\2\u04a5\u0114\3\2\2\2\u04a6"+
+ "\u04a7\7h\2\2\u04a7\u04a8\7q\2\2\u04a8\u04a9\7n\2\2\u04a9\u04aa\7n\2\2"+
+ "\u04aa\u04ab\7q\2\2\u04ab\u04ac\7y\2\2\u04ac\u04ad\7k\2\2\u04ad\u04ae"+
+ "\7p\2\2\u04ae\u04af\7i\2\2\u04af\u0116\3\2\2\2\u04b0\u04b1\7r\2\2\u04b1"+
+ "\u04b2\7c\2\2\u04b2\u04b3\7t\2\2\u04b3\u04b4\7g\2\2\u04b4\u04b5\7p\2\2"+
+ "\u04b5\u04b6\7v\2\2\u04b6\u0118\3\2\2\2\u04b7\u04b8\7c\2\2\u04b8\u04b9"+
+ "\7p\2\2\u04b9\u04ba\7e\2\2\u04ba\u04bb\7g\2\2\u04bb\u04bc\7u\2\2\u04bc"+
+ "\u04bd\7v\2\2\u04bd\u04be\7q\2\2\u04be\u04bf\7t\2\2\u04bf\u011a\3\2\2"+
+ "\2\u04c0\u04c1\7r\2\2\u04c1\u04c2\7t\2\2\u04c2\u04c3\7g\2\2\u04c3\u04c4"+
+ "\7e\2\2\u04c4\u04c5\7g\2\2\u04c5\u04c6\7f\2\2\u04c6\u04c7\7k\2\2\u04c7"+
+ "\u04c8\7p\2\2\u04c8\u04c9\7i\2\2\u04c9\u04ca\7/\2\2\u04ca\u04cb\7u\2\2"+
+ "\u04cb\u04cc\7k\2\2\u04cc\u04cd\7d\2\2\u04cd\u04ce\7n\2\2\u04ce\u04cf"+
+ "\7k\2\2\u04cf\u04d0\7p\2\2\u04d0\u04d1\7i\2\2\u04d1\u011c\3\2\2\2\u04d2"+
+ "\u04d3\7r\2\2\u04d3\u04d4\7t\2\2\u04d4\u04d5\7g\2\2\u04d5\u04d6\7e\2\2"+
+ "\u04d6\u04d7\7g\2\2\u04d7\u04d8\7f\2\2\u04d8\u04d9\7k\2\2\u04d9\u04da"+
+ "\7p\2\2\u04da\u04db\7i\2\2\u04db\u011e\3\2\2\2\u04dc\u04dd\7c\2\2\u04dd"+
+ "\u04de\7p\2\2\u04de\u04df\7e\2\2\u04df\u04e0\7g\2\2\u04e0\u04e1\7u\2\2"+
+ "\u04e1\u04e2\7v\2\2\u04e2\u04e3\7q\2\2\u04e3\u04e4\7t\2\2\u04e4\u04e5"+
+ "\7/\2\2\u04e5\u04e6\7q\2\2\u04e6\u04e7\7t\2\2\u04e7\u04e8\7/\2\2\u04e8"+
+ "\u04e9\7u\2\2\u04e9\u04ea\7g\2\2\u04ea\u04eb\7n\2\2\u04eb\u04ec\7h\2\2"+
+ "\u04ec\u0120\3\2\2\2\u04ed\u04ee\7p\2\2\u04ee\u04ef\7q\2\2\u04ef\u04f0"+
+ "\7f\2\2\u04f0\u04f1\7g\2\2\u04f1\u0122\3\2\2\2\u04f2\u04f3\7d\2\2\u04f3"+
+ "\u04f4\7k\2\2\u04f4\u04f5\7p\2\2\u04f5\u04f6\7c\2\2\u04f6\u04f7\7t\2\2"+
+ "\u04f7\u04f8\7{\2\2\u04f8\u0124\3\2\2\2\u04f9\u04fa\7f\2\2\u04fa\u04fb"+
+ "\7q\2\2\u04fb\u04fc\7e\2\2\u04fc\u04fd\7w\2\2\u04fd\u04fe\7o\2\2\u04fe"+
+ "\u04ff\7g\2\2\u04ff\u0500\7p\2\2\u0500\u0501\7v\2\2\u0501\u0126\3\2\2"+
+ "\2\u0502\u0503\7f\2\2\u0503\u0504\7q\2\2\u0504\u0505\7e\2\2\u0505\u0506"+
+ "\7w\2\2\u0506\u0507\7o\2\2\u0507\u0508\7g\2\2\u0508\u0509\7p\2\2\u0509"+
+ "\u050a\7v\2\2\u050a\u050b\7/\2\2\u050b\u050c\7p\2\2\u050c\u050d\7q\2\2"+
+ "\u050d\u050e\7f\2\2\u050e\u050f\7g\2\2\u050f\u0128\3\2\2\2\u0510\u0511"+
+ "\7v\2\2\u0511\u0512\7g\2\2\u0512\u0513\7z\2\2\u0513\u0514\7v\2\2\u0514"+
+ "\u012a\3\2\2\2\u0515\u0516\7r\2\2\u0516\u0517\7t\2\2\u0517\u0518\7q\2"+
+ "\2\u0518\u0519\7e\2\2\u0519\u051a\7g\2\2\u051a\u051b\7u\2\2\u051b\u051c"+
+ "\7u\2\2\u051c\u051d\7k\2\2\u051d\u051e\7p\2\2\u051e\u051f\7i\2\2\u051f"+
+ "\u0520\7/\2\2\u0520\u0521\7k\2\2\u0521\u0522\7p\2\2\u0522\u0523\7u\2\2"+
+ "\u0523\u0524\7v\2\2\u0524\u0525\7t\2\2\u0525\u0526\7w\2\2\u0526\u0527"+
+ "\7e\2\2\u0527\u0528\7v\2\2\u0528\u0529\7k\2\2\u0529\u052a\7q\2\2\u052a"+
+ "\u052b\7p\2\2\u052b\u012c\3\2\2\2\u052c\u052d\7p\2\2\u052d\u052e\7c\2"+
+ "\2\u052e\u052f\7o\2\2\u052f\u0530\7g\2\2\u0530\u0531\7u\2\2\u0531\u0532"+
+ "\7r\2\2\u0532\u0533\7c\2\2\u0533\u0534\7e\2\2\u0534\u0535\7g\2\2\u0535"+
+ "\u0536\7/\2\2\u0536\u0537\7p\2\2\u0537\u0538\7q\2\2\u0538\u0539\7f\2\2"+
+ "\u0539\u053a\7g\2\2\u053a\u012e\3\2\2\2\u053b\u053c\7u\2\2\u053c\u053d"+
+ "\7e\2\2\u053d\u053e\7j\2\2\u053e\u053f\7g\2\2\u053f\u0540\7o\2\2\u0540"+
+ "\u0541\7c\2\2\u0541\u0542\7/\2\2\u0542\u0543\7c\2\2\u0543\u0544\7v\2\2"+
+ "\u0544\u0545\7v\2\2\u0545\u0546\7t\2\2\u0546\u0547\7k\2\2\u0547\u0548"+
+ "\7d\2\2\u0548\u0549\7w\2\2\u0549\u054a\7v\2\2\u054a\u054b\7g\2\2\u054b"+
+ "\u0130\3\2\2\2\u054c\u054d\7u\2\2\u054d\u054e\7e\2\2\u054e\u054f\7j\2"+
+ "\2\u054f\u0550\7g\2\2\u0550\u0551\7o\2\2\u0551\u0552\7c\2\2\u0552\u0553"+
+ "\7/\2\2\u0553\u0554\7g\2\2\u0554\u0555\7n\2\2\u0555\u0556\7g\2\2\u0556"+
+ "\u0557\7o\2\2\u0557\u0558\7g\2\2\u0558\u0559\7p\2\2\u0559\u055a\7v\2\2"+
+ "\u055a\u0132\3\2\2\2\u055b\u055c\7c\2\2\u055c\u055d\7t\2\2\u055d\u055e"+
+ "\7t\2\2\u055e\u055f\7c\2\2\u055f\u0560\7{\2\2\u0560\u0561\7/\2\2\u0561"+
+ "\u0562\7p\2\2\u0562\u0563\7q\2\2\u0563\u0564\7f\2\2\u0564\u0565\7g\2\2"+
+ "\u0565\u0134\3\2\2\2\u0566\u0567\7d\2\2\u0567\u0568\7q\2\2\u0568\u0569"+
+ "\7q\2\2\u0569\u056a\7n\2\2\u056a\u056b\7g\2\2\u056b\u056c\7c\2\2\u056c"+
+ "\u056d\7p\2\2\u056d\u056e\7/\2\2\u056e\u056f\7p\2\2\u056f\u0570\7q\2\2"+
+ "\u0570\u0571\7f\2\2\u0571\u0572\7g\2\2\u0572\u0136\3\2\2\2\u0573\u0574"+
+ "\7p\2\2\u0574\u0575\7w\2\2\u0575\u0576\7n\2\2\u0576\u0577\7n\2\2\u0577"+
+ "\u0578\7/\2\2\u0578\u0579\7p\2\2\u0579\u057a\7q\2\2\u057a\u057b\7f\2\2"+
+ "\u057b\u057c\7g\2\2\u057c\u0138\3\2\2\2\u057d\u057e\7p\2\2\u057e\u057f"+
+ "\7w\2\2\u057f\u0580\7o\2\2\u0580\u0581\7d\2\2\u0581\u0582\7g\2\2\u0582"+
+ "\u0583\7t\2\2\u0583\u0584\7/\2\2\u0584\u0585\7p\2\2\u0585\u0586\7q\2\2"+
+ "\u0586\u0587\7f\2\2\u0587\u0588\7g\2\2\u0588\u013a\3\2\2\2\u0589\u058a"+
+ "\7q\2\2\u058a\u058b\7d\2\2\u058b\u058c\7l\2\2\u058c\u058d\7g\2\2\u058d"+
+ "\u058e\7e\2\2\u058e\u058f\7v\2\2\u058f\u0590\7/\2\2\u0590\u0591\7p\2\2"+
+ "\u0591\u0592\7q\2\2\u0592\u0593\7f\2\2\u0593\u0594\7g\2\2\u0594\u013c"+
+ "\3\2\2\2\u0595\u0596\7e\2\2\u0596\u0597\7q\2\2\u0597\u0598\7o\2\2\u0598"+
+ "\u0599\7o\2\2\u0599\u059a\7g\2\2\u059a\u059b\7p\2\2\u059b\u059c\7v\2\2"+
+ "\u059c\u013e\3\2\2\2\u059d\u059e\7d\2\2\u059e\u059f\7t\2\2\u059f\u05a0"+
+ "\7g\2\2\u05a0\u05a1\7c\2\2\u05a1\u05a2\7m\2\2\u05a2\u0140\3\2\2\2\u05a3"+
+ "\u05a4\7n\2\2\u05a4\u05a5\7q\2\2\u05a5\u05a6\7q\2\2\u05a6\u05a7\7r\2\2"+
+ "\u05a7\u0142\3\2\2\2\u05a8\u05a9\7e\2\2\u05a9\u05aa\7q\2\2\u05aa\u05ab"+
+ "\7p\2\2\u05ab\u05ac\7v\2\2\u05ac\u05ad\7k\2\2\u05ad\u05ae\7p\2\2\u05ae"+
+ "\u05af\7w\2\2\u05af\u05b0\7g\2\2\u05b0\u0144\3\2\2\2\u05b1\u05b2\7g\2"+
+ "\2\u05b2\u05b3\7z\2\2\u05b3\u05b4\7k\2\2\u05b4\u05b5\7v\2\2\u05b5\u0146"+
+ "\3\2\2\2\u05b6\u05b7\7t\2\2\u05b7\u05b8\7g\2\2\u05b8\u05b9\7v\2\2\u05b9"+
+ "\u05ba\7w\2\2\u05ba\u05bb\7t\2\2\u05bb\u05bc\7p\2\2\u05bc\u05bd\7k\2\2"+
+ "\u05bd\u05be\7p\2\2\u05be\u05bf\7i\2\2\u05bf\u0148\3\2\2\2\u05c0\u05c1"+
+ "\7y\2\2\u05c1\u05c2\7j\2\2\u05c2\u05c3\7k\2\2\u05c3\u05c4\7n\2\2\u05c4"+
+ "\u05c5\7g\2\2\u05c5\u014a\3\2\2\2\u05c6\u05cb\7$\2\2\u05c7\u05ca\5\u014d"+
+ "\u00a7\2\u05c8\u05ca\n\2\2\2\u05c9\u05c7\3\2\2\2\u05c9\u05c8\3\2\2\2\u05ca"+
+ "\u05cd\3\2\2\2\u05cb\u05c9\3\2\2\2\u05cb\u05cc\3\2\2\2\u05cc\u05ce\3\2"+
+ "\2\2\u05cd\u05cb\3\2\2\2\u05ce\u05cf\7$\2\2\u05cf\u014c\3\2\2\2\u05d0"+
+ "\u05d3\7^\2\2\u05d1\u05d4\t\3\2\2\u05d2\u05d4\5\u014f\u00a8\2\u05d3\u05d1"+
+ "\3\2\2\2\u05d3\u05d2\3\2\2\2\u05d4\u014e\3\2\2\2\u05d5\u05d6\7w\2\2\u05d6"+
+ "\u05d7\5\u0151\u00a9\2\u05d7\u05d8\5\u0151\u00a9\2\u05d8\u05d9\5\u0151"+
+ "\u00a9\2\u05d9\u05da\5\u0151\u00a9\2\u05da\u0150\3\2\2\2\u05db\u05dc\t"+
+ "\4\2\2\u05dc\u0152\3\2\2\2\u05dd\u05de\7A\2\2\u05de\u0154\3\2\2\2\u05df"+
+ "\u05e0\7p\2\2\u05e0\u05e1\7w\2\2\u05e1\u05e2\7n\2\2\u05e2\u05e3\7n\2\2"+
+ "\u05e3\u0156\3\2\2\2\u05e4\u05e5\5\u0159\u00ad\2\u05e5\u0158\3\2\2\2\u05e6"+
+ "\u05ea\5\u015b\u00ae\2\u05e7\u05ea\5\u015d\u00af\2\u05e8\u05ea\5\u015f"+
+ "\u00b0\2\u05e9\u05e6\3\2\2\2\u05e9\u05e7\3\2\2\2\u05e9\u05e8\3\2\2\2\u05ea"+
+ "\u015a\3\2\2\2\u05eb\u05ec\5\u0161\u00b1\2\u05ec\u015c\3\2\2\2\u05ed\u05ee"+
+ "\7\60\2\2\u05ee\u05f8\5\u0161\u00b1\2\u05ef\u05f0\5\u0161\u00b1\2\u05f0"+
+ "\u05f4\7\60\2\2\u05f1\u05f3\t\5\2\2\u05f2\u05f1\3\2\2\2\u05f3\u05f6\3"+
+ "\2\2\2\u05f4\u05f2\3\2\2\2\u05f4\u05f5\3\2\2\2\u05f5\u05f8\3\2\2\2\u05f6"+
+ "\u05f4\3\2\2\2\u05f7\u05ed\3\2\2\2\u05f7\u05ef\3\2\2\2\u05f8\u015e\3\2"+
+ "\2\2\u05f9\u05fa\7\60\2\2\u05fa\u0606\5\u0161\u00b1\2\u05fb\u0603\5\u0161"+
+ "\u00b1\2\u05fc\u0600\7\60\2\2\u05fd\u05ff\t\5\2\2\u05fe\u05fd\3\2\2\2"+
+ "\u05ff\u0602\3\2\2\2\u0600\u05fe\3\2\2\2\u0600\u0601\3\2\2\2\u0601\u0604"+
+ "\3\2\2\2\u0602\u0600\3\2\2\2\u0603\u05fc\3\2\2\2\u0603\u0604\3\2\2\2\u0604"+
+ "\u0606\3\2\2\2\u0605\u05f9\3\2\2\2\u0605\u05fb\3\2\2\2\u0606\u0607\3\2"+
+ "\2\2\u0607\u0609\t\6\2\2\u0608\u060a\t\7\2\2\u0609\u0608\3\2\2\2\u0609"+
+ "\u060a\3\2\2\2\u060a\u060b\3\2\2\2\u060b\u060c\5\u0161\u00b1\2\u060c\u0160"+
+ "\3\2\2\2\u060d\u060f\t\5\2\2\u060e\u060d\3\2\2\2\u060f\u0610\3\2\2\2\u0610"+
+ "\u060e\3\2\2\2\u0610\u0611\3\2\2\2\u0611\u0162\3\2\2\2\u0612\u0613\t\b"+
+ "\2\2\u0613\u0614\3\2\2\2\u0614\u0615\b\u00b2\2\2\u0615\u0164\3\2\2\2\u0616"+
+ "\u061a\5\u0167\u00b4\2\u0617\u0619\5\u0169\u00b5\2\u0618\u0617\3\2\2\2"+
+ "\u0619\u061c\3\2\2\2\u061a\u0618\3\2\2\2\u061a\u061b\3\2\2\2\u061b\u0166"+
+ "\3\2\2\2\u061c\u061a\3\2\2\2\u061d\u061f\t\t\2\2\u061e\u061d\3\2\2\2\u061f"+
+ "\u0168\3\2\2\2\u0620\u0623\5\u0167\u00b4\2\u0621\u0623\t\n\2\2\u0622\u0620"+
+ "\3\2\2\2\u0622\u0621\3\2\2\2\u0623\u016a\3\2\2\2\u0624\u0625\7*\2\2\u0625"+
+ "\u062e\7<\2\2\u0626\u062d\5\u016b\u00b6\2\u0627\u0628\7*\2\2\u0628\u062d"+
+ "\n\13\2\2\u0629\u062a\7<\2\2\u062a\u062d\n\f\2\2\u062b\u062d\n\r\2\2\u062c"+
+ "\u0626\3\2\2\2\u062c\u0627\3\2\2\2\u062c\u0629\3\2\2\2\u062c\u062b\3\2"+
+ "\2\2\u062d\u0630\3\2\2\2\u062e\u062c\3\2\2\2\u062e\u062f\3\2\2\2\u062f"+
+ "\u0632\3\2\2\2\u0630\u062e\3\2\2\2\u0631\u0633\7<\2\2\u0632\u0631\3\2"+
+ "\2\2\u0633\u0634\3\2\2\2\u0634\u0632\3\2\2\2\u0634\u0635\3\2\2\2\u0635"+
+ "\u0636\3\2\2\2\u0636\u0637\7+\2\2\u0637\u0638\3\2\2\2\u0638\u0639\b\u00b6"+
+ "\2\2\u0639\u016c\3\2\2\2\u063a\u063b\n\16\2\2\u063b\u016e\3\2\2\2\24\2"+
+ "\u05c9\u05cb\u05d3\u05e9\u05f4\u05f7\u0600\u0603\u0605\u0609\u0610\u061a"+
+ "\u061e\u0622\u062c\u062e\u0634\3\2\3\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens b/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens
index 74d3a280cf..488d2a2277 100644
--- a/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens
+++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens
@@ -56,223 +56,287 @@ T__54=55
T__55=56
T__56=57
T__57=58
-T__58=59
-T__59=60
-Kfor=61
-Klet=62
-Kwhere=63
-Kgroup=64
-Kby=65
-Korder=66
-Kreturn=67
-Kif=68
-Kin=69
-Kas=70
-Kat=71
-Kallowing=72
-Kempty=73
-Kcount=74
-Kstable=75
-Kascending=76
-Kdescending=77
-Ksome=78
-Kevery=79
-Ksatisfies=80
-Kcollation=81
-Kgreatest=82
-Kleast=83
-Kswitch=84
-Kcase=85
-Ktry=86
-Kcatch=87
-Kdefault=88
-Kthen=89
-Kelse=90
-Ktypeswitch=91
-Kor=92
-Kand=93
-Knot=94
-Kto=95
-Kinstance=96
-Kof=97
-Kstatically=98
-Kis=99
-Ktreat=100
-Kcast=101
-Kcastable=102
-Kversion=103
-Kjsoniq=104
-Kunordered=105
-Ktrue=106
-Kfalse=107
-Ktype=108
-Kvalidate=109
-Kannotate=110
-Kdeclare=111
-Kcontext=112
-Kitem=113
-Kvariable=114
-Kinsert=115
-Kdelete=116
-Krename=117
-Kreplace=118
-Kcopy=119
-Kmodify=120
-Kappend=121
-Kinto=122
-Kvalue=123
-Kjson=124
-Kwith=125
-Kposition=126
-Kbreak=127
-Kloop=128
-Kcontinue=129
-Kexit=130
-Kreturning=131
-Kwhile=132
-STRING=133
-ArgumentPlaceholder=134
-NullLiteral=135
-Literal=136
-NumericLiteral=137
-IntegerLiteral=138
-DecimalLiteral=139
-DoubleLiteral=140
-WS=141
-NCName=142
-XQComment=143
-ContentChar=144
+Kfor=59
+Klet=60
+Kwhere=61
+Kgroup=62
+Kby=63
+Korder=64
+Kreturn=65
+Kif=66
+Kin=67
+Kas=68
+Kat=69
+Kallowing=70
+Kempty=71
+Kcount=72
+Kstable=73
+Kascending=74
+Kdescending=75
+Ksome=76
+Kevery=77
+Ksatisfies=78
+Kcollation=79
+Kgreatest=80
+Kleast=81
+Kswitch=82
+Kcase=83
+Ktry=84
+Kcatch=85
+Kdefault=86
+Kthen=87
+Kelse=88
+Ktypeswitch=89
+Kor=90
+Kand=91
+Knot=92
+Kto=93
+Kinstance=94
+Kof=95
+Kstatically=96
+Kis=97
+Ktreat=98
+Kcast=99
+Kcastable=100
+Kversion=101
+Kjsoniq=102
+Kunordered=103
+Ktrue=104
+Kfalse=105
+Ktype=106
+Kvalidate=107
+Kannotate=108
+Kdeclare=109
+Kcontext=110
+Kitem=111
+Kvariable=112
+Kinsert=113
+Kdelete=114
+Krename=115
+Kreplace=116
+Kcopy=117
+Kmodify=118
+Kappend=119
+Kinto=120
+Kvalue=121
+Kjson=122
+Kwith=123
+Kposition=124
+Kimport=125
+Kschema=126
+Knamespace=127
+Kelement=128
+Kslash=129
+Kdslash=130
+Kat_symbol=131
+Kchild=132
+Kdescendant=133
+Kattribute=134
+Kself=135
+Kdescendant_or_self=136
+Kfollowing_sibling=137
+Kfollowing=138
+Kparent=139
+Kancestor=140
+Kpreceding_sibling=141
+Kpreceding=142
+Kancestor_or_self=143
+Knode=144
+Kbinary=145
+Kdocument=146
+Kdocument_node=147
+Ktext=148
+Kpi=149
+Knamespace_node=150
+Kschema_attribute=151
+Kschema_element=152
+Karray_node=153
+Kboolean_node=154
+Knull_node=155
+Knumber_node=156
+Kobject_node=157
+Kcomment=158
+Kbreak=159
+Kloop=160
+Kcontinue=161
+Kexit=162
+Kreturning=163
+Kwhile=164
+STRING=165
+ArgumentPlaceholder=166
+NullLiteral=167
+Literal=168
+NumericLiteral=169
+IntegerLiteral=170
+DecimalLiteral=171
+DoubleLiteral=172
+WS=173
+NCName=174
+XQComment=175
+ContentChar=176
';'=1
'module'=2
-'namespace'=3
-'='=4
-'$'=5
-':='=6
-'{'=7
-'}'=8
-'('=9
-')'=10
-'*'=11
-'|'=12
-'%'=13
-','=14
-'ordering'=15
-'ordered'=16
-'decimal-format'=17
-':'=18
-'decimal-separator'=19
-'grouping-separator'=20
-'infinity'=21
-'minus-sign'=22
-'NaN'=23
-'percent'=24
-'per-mille'=25
-'zero-digit'=26
-'digit'=27
-'pattern-separator'=28
-'import'=29
-'external'=30
-'function'=31
-'jsound'=32
-'compact'=33
-'verbose'=34
-'schema'=35
-'eq'=36
-'ne'=37
-'lt'=38
-'le'=39
-'gt'=40
-'ge'=41
-'!='=42
-'<'=43
-'<='=44
-'>'=45
-'>='=46
-'||'=47
-'+'=48
-'-'=49
-'div'=50
-'idiv'=51
-'mod'=52
-'!'=53
-'['=54
-']'=55
-'.'=56
-'$$'=57
-'#'=58
-'{|'=59
-'|}'=60
-'for'=61
-'let'=62
-'where'=63
-'group'=64
-'by'=65
-'order'=66
-'return'=67
-'if'=68
-'in'=69
-'as'=70
-'at'=71
-'allowing'=72
-'empty'=73
-'count'=74
-'stable'=75
-'ascending'=76
-'descending'=77
-'some'=78
-'every'=79
-'satisfies'=80
-'collation'=81
-'greatest'=82
-'least'=83
-'switch'=84
-'case'=85
-'try'=86
-'catch'=87
-'default'=88
-'then'=89
-'else'=90
-'typeswitch'=91
-'or'=92
-'and'=93
-'not'=94
-'to'=95
-'instance'=96
-'of'=97
-'statically'=98
-'is'=99
-'treat'=100
-'cast'=101
-'castable'=102
-'version'=103
-'jsoniq'=104
-'unordered'=105
-'true'=106
-'false'=107
-'type'=108
-'validate'=109
-'annotate'=110
-'declare'=111
-'context'=112
-'item'=113
-'variable'=114
-'insert'=115
-'delete'=116
-'rename'=117
-'replace'=118
-'copy'=119
-'modify'=120
-'append'=121
-'into'=122
-'value'=123
-'json'=124
-'with'=125
-'position'=126
-'break'=127
-'loop'=128
-'continue'=129
-'exit'=130
-'returning'=131
-'while'=132
-'?'=134
-'null'=135
+'='=3
+'$'=4
+':='=5
+'{'=6
+'}'=7
+'('=8
+')'=9
+'*'=10
+'|'=11
+'%'=12
+','=13
+'ordering'=14
+'ordered'=15
+'decimal-format'=16
+':'=17
+'decimal-separator'=18
+'grouping-separator'=19
+'infinity'=20
+'minus-sign'=21
+'NaN'=22
+'percent'=23
+'per-mille'=24
+'zero-digit'=25
+'digit'=26
+'pattern-separator'=27
+'external'=28
+'function'=29
+'jsound'=30
+'compact'=31
+'verbose'=32
+'eq'=33
+'ne'=34
+'lt'=35
+'le'=36
+'gt'=37
+'ge'=38
+'!='=39
+'<'=40
+'<='=41
+'>'=42
+'>='=43
+'||'=44
+'+'=45
+'-'=46
+'div'=47
+'idiv'=48
+'mod'=49
+'!'=50
+'['=51
+']'=52
+'.'=53
+'$$'=54
+'#'=55
+'..'=56
+'{|'=57
+'|}'=58
+'for'=59
+'let'=60
+'where'=61
+'group'=62
+'by'=63
+'order'=64
+'return'=65
+'if'=66
+'in'=67
+'as'=68
+'at'=69
+'allowing'=70
+'empty'=71
+'count'=72
+'stable'=73
+'ascending'=74
+'descending'=75
+'some'=76
+'every'=77
+'satisfies'=78
+'collation'=79
+'greatest'=80
+'least'=81
+'switch'=82
+'case'=83
+'try'=84
+'catch'=85
+'default'=86
+'then'=87
+'else'=88
+'typeswitch'=89
+'or'=90
+'and'=91
+'not'=92
+'to'=93
+'instance'=94
+'of'=95
+'statically'=96
+'is'=97
+'treat'=98
+'cast'=99
+'castable'=100
+'version'=101
+'jsoniq'=102
+'unordered'=103
+'true'=104
+'false'=105
+'type'=106
+'validate'=107
+'annotate'=108
+'declare'=109
+'context'=110
+'item'=111
+'variable'=112
+'insert'=113
+'delete'=114
+'rename'=115
+'replace'=116
+'copy'=117
+'modify'=118
+'append'=119
+'into'=120
+'value'=121
+'json'=122
+'with'=123
+'position'=124
+'import'=125
+'schema'=126
+'namespace'=127
+'element'=128
+'/'=129
+'//'=130
+'@'=131
+'child'=132
+'descendant'=133
+'attribute'=134
+'self'=135
+'descendant-or-self'=136
+'following-sibling'=137
+'following'=138
+'parent'=139
+'ancestor'=140
+'preceding-sibling'=141
+'preceding'=142
+'ancestor-or-self'=143
+'node'=144
+'binary'=145
+'document'=146
+'document-node'=147
+'text'=148
+'processing-instruction'=149
+'namespace-node'=150
+'schema-attribute'=151
+'schema-element'=152
+'array-node'=153
+'boolean-node'=154
+'null-node'=155
+'number-node'=156
+'object-node'=157
+'comment'=158
+'break'=159
+'loop'=160
+'continue'=161
+'exit'=162
+'returning'=163
+'while'=164
+'?'=166
+'null'=167
diff --git a/src/main/java/org/rumbledb/parser/JsoniqParser.java b/src/main/java/org/rumbledb/parser/JsoniqParser.java
index f29c09bf46..68d965cd75 100644
--- a/src/main/java/org/rumbledb/parser/JsoniqParser.java
+++ b/src/main/java/org/rumbledb/parser/JsoniqParser.java
@@ -3,25 +3,14 @@
// Java header
package org.rumbledb.parser;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.antlr.v4.runtime.NoViableAltException;
-import org.antlr.v4.runtime.Parser;
-import org.antlr.v4.runtime.ParserRuleContext;
-import org.antlr.v4.runtime.RecognitionException;
-import org.antlr.v4.runtime.RuntimeMetaData;
-import org.antlr.v4.runtime.Token;
-import org.antlr.v4.runtime.TokenStream;
-import org.antlr.v4.runtime.Vocabulary;
-import org.antlr.v4.runtime.VocabularyImpl;
-import org.antlr.v4.runtime.atn.ATN;
-import org.antlr.v4.runtime.atn.ATNDeserializer;
-import org.antlr.v4.runtime.atn.ParserATNSimulator;
-import org.antlr.v4.runtime.atn.PredictionContextCache;
+import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
-import org.antlr.v4.runtime.tree.ParseTreeVisitor;
-import org.antlr.v4.runtime.tree.TerminalNode;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.misc.*;
+import org.antlr.v4.runtime.tree.*;
+import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class JsoniqParser extends Parser {
@@ -38,21 +27,28 @@ public class JsoniqParser extends Parser {
T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38,
T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45,
T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52,
- T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
- T__59=60, Kfor=61, Klet=62, Kwhere=63, Kgroup=64, Kby=65, Korder=66, Kreturn=67,
- Kif=68, Kin=69, Kas=70, Kat=71, Kallowing=72, Kempty=73, Kcount=74, Kstable=75,
- Kascending=76, Kdescending=77, Ksome=78, Kevery=79, Ksatisfies=80, Kcollation=81,
- Kgreatest=82, Kleast=83, Kswitch=84, Kcase=85, Ktry=86, Kcatch=87, Kdefault=88,
- Kthen=89, Kelse=90, Ktypeswitch=91, Kor=92, Kand=93, Knot=94, Kto=95,
- Kinstance=96, Kof=97, Kstatically=98, Kis=99, Ktreat=100, Kcast=101, Kcastable=102,
- Kversion=103, Kjsoniq=104, Kunordered=105, Ktrue=106, Kfalse=107, Ktype=108,
- Kvalidate=109, Kannotate=110, Kdeclare=111, Kcontext=112, Kitem=113, Kvariable=114,
- Kinsert=115, Kdelete=116, Krename=117, Kreplace=118, Kcopy=119, Kmodify=120,
- Kappend=121, Kinto=122, Kvalue=123, Kjson=124, Kwith=125, Kposition=126,
- Kbreak=127, Kloop=128, Kcontinue=129, Kexit=130, Kreturning=131, Kwhile=132,
- STRING=133, ArgumentPlaceholder=134, NullLiteral=135, Literal=136, NumericLiteral=137,
- IntegerLiteral=138, DecimalLiteral=139, DoubleLiteral=140, WS=141, NCName=142,
- XQComment=143, ContentChar=144;
+ T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, Kfor=59, Klet=60,
+ Kwhere=61, Kgroup=62, Kby=63, Korder=64, Kreturn=65, Kif=66, Kin=67, Kas=68,
+ Kat=69, Kallowing=70, Kempty=71, Kcount=72, Kstable=73, Kascending=74,
+ Kdescending=75, Ksome=76, Kevery=77, Ksatisfies=78, Kcollation=79, Kgreatest=80,
+ Kleast=81, Kswitch=82, Kcase=83, Ktry=84, Kcatch=85, Kdefault=86, Kthen=87,
+ Kelse=88, Ktypeswitch=89, Kor=90, Kand=91, Knot=92, Kto=93, Kinstance=94,
+ Kof=95, Kstatically=96, Kis=97, Ktreat=98, Kcast=99, Kcastable=100, Kversion=101,
+ Kjsoniq=102, Kunordered=103, Ktrue=104, Kfalse=105, Ktype=106, Kvalidate=107,
+ Kannotate=108, Kdeclare=109, Kcontext=110, Kitem=111, Kvariable=112, Kinsert=113,
+ Kdelete=114, Krename=115, Kreplace=116, Kcopy=117, Kmodify=118, Kappend=119,
+ Kinto=120, Kvalue=121, Kjson=122, Kwith=123, Kposition=124, Kimport=125,
+ Kschema=126, Knamespace=127, Kelement=128, Kslash=129, Kdslash=130, Kat_symbol=131,
+ Kchild=132, Kdescendant=133, Kattribute=134, Kself=135, Kdescendant_or_self=136,
+ Kfollowing_sibling=137, Kfollowing=138, Kparent=139, Kancestor=140, Kpreceding_sibling=141,
+ Kpreceding=142, Kancestor_or_self=143, Knode=144, Kbinary=145, Kdocument=146,
+ Kdocument_node=147, Ktext=148, Kpi=149, Knamespace_node=150, Kschema_attribute=151,
+ Kschema_element=152, Karray_node=153, Kboolean_node=154, Knull_node=155,
+ Knumber_node=156, Kobject_node=157, Kcomment=158, Kbreak=159, Kloop=160,
+ Kcontinue=161, Kexit=162, Kreturning=163, Kwhile=164, STRING=165, ArgumentPlaceholder=166,
+ NullLiteral=167, Literal=168, NumericLiteral=169, IntegerLiteral=170,
+ DecimalLiteral=171, DoubleLiteral=172, WS=173, NCName=174, XQComment=175,
+ ContentChar=176;
public static final int
RULE_moduleAndThisIsIt = 0, RULE_module = 1, RULE_mainModule = 2, RULE_libraryModule = 3,
RULE_prolog = 4, RULE_program = 5, RULE_statements = 6, RULE_statementsAndExpr = 7,
@@ -88,11 +84,22 @@ public class JsoniqParser extends Parser {
RULE_functionItemExpr = 104, RULE_namedFunctionRef = 105, RULE_inlineFunctionExpr = 106,
RULE_insertExpr = 107, RULE_deleteExpr = 108, RULE_renameExpr = 109, RULE_replaceExpr = 110,
RULE_transformExpr = 111, RULE_appendExpr = 112, RULE_updateLocator = 113,
- RULE_copyDecl = 114, RULE_sequenceType = 115, RULE_objectConstructor = 116,
- RULE_itemType = 117, RULE_functionTest = 118, RULE_anyFunctionTest = 119,
- RULE_typedFunctionTest = 120, RULE_singleType = 121, RULE_pairConstructor = 122,
- RULE_arrayConstructor = 123, RULE_uriLiteral = 124, RULE_stringLiteral = 125,
- RULE_keyWords = 126;
+ RULE_copyDecl = 114, RULE_pathExpr = 115, RULE_relativePathExpr = 116,
+ RULE_stepExpr = 117, RULE_axisStep = 118, RULE_forwardStep = 119, RULE_forwardAxis = 120,
+ RULE_abbrevForwardStep = 121, RULE_reverseStep = 122, RULE_reverseAxis = 123,
+ RULE_abbrevReverseStep = 124, RULE_nodeTest = 125, RULE_nameTest = 126,
+ RULE_wildcard = 127, RULE_nCNameWithLocalWildcard = 128, RULE_nCNameWithPrefixWildcard = 129,
+ RULE_predicateList = 130, RULE_kindTest = 131, RULE_anyKindTest = 132,
+ RULE_binaryNodeTest = 133, RULE_documentTest = 134, RULE_textTest = 135,
+ RULE_commentTest = 136, RULE_namespaceNodeTest = 137, RULE_piTest = 138,
+ RULE_attributeTest = 139, RULE_attributeNameOrWildcard = 140, RULE_schemaAttributeTest = 141,
+ RULE_attributeDeclaration = 142, RULE_elementTest = 143, RULE_elementNameOrWildcard = 144,
+ RULE_schemaElementTest = 145, RULE_elementDeclaration = 146, RULE_attributeName = 147,
+ RULE_elementName = 148, RULE_simpleTypeName = 149, RULE_typeName = 150,
+ RULE_sequenceType = 151, RULE_objectConstructor = 152, RULE_itemType = 153,
+ RULE_functionTest = 154, RULE_anyFunctionTest = 155, RULE_typedFunctionTest = 156,
+ RULE_singleType = 157, RULE_pairConstructor = 158, RULE_arrayConstructor = 159,
+ RULE_uriLiteral = 160, RULE_stringLiteral = 161, RULE_keyWords = 162;
private static String[] makeRuleNames() {
return new String[] {
"moduleAndThisIsIt", "module", "mainModule", "libraryModule", "prolog",
@@ -119,35 +126,49 @@ private static String[] makeRuleNames() {
"unorderedExpr", "functionCall", "argumentList", "argument", "functionItemExpr",
"namedFunctionRef", "inlineFunctionExpr", "insertExpr", "deleteExpr",
"renameExpr", "replaceExpr", "transformExpr", "appendExpr", "updateLocator",
- "copyDecl", "sequenceType", "objectConstructor", "itemType", "functionTest",
- "anyFunctionTest", "typedFunctionTest", "singleType", "pairConstructor",
- "arrayConstructor", "uriLiteral", "stringLiteral", "keyWords"
+ "copyDecl", "pathExpr", "relativePathExpr", "stepExpr", "axisStep", "forwardStep",
+ "forwardAxis", "abbrevForwardStep", "reverseStep", "reverseAxis", "abbrevReverseStep",
+ "nodeTest", "nameTest", "wildcard", "nCNameWithLocalWildcard", "nCNameWithPrefixWildcard",
+ "predicateList", "kindTest", "anyKindTest", "binaryNodeTest", "documentTest",
+ "textTest", "commentTest", "namespaceNodeTest", "piTest", "attributeTest",
+ "attributeNameOrWildcard", "schemaAttributeTest", "attributeDeclaration",
+ "elementTest", "elementNameOrWildcard", "schemaElementTest", "elementDeclaration",
+ "attributeName", "elementName", "simpleTypeName", "typeName", "sequenceType",
+ "objectConstructor", "itemType", "functionTest", "anyFunctionTest", "typedFunctionTest",
+ "singleType", "pairConstructor", "arrayConstructor", "uriLiteral", "stringLiteral",
+ "keyWords"
};
}
public static final String[] ruleNames = makeRuleNames();
private static String[] makeLiteralNames() {
return new String[] {
- null, "';'", "'module'", "'namespace'", "'='", "'$'", "':='", "'{'",
- "'}'", "'('", "')'", "'*'", "'|'", "'%'", "','", "'ordering'", "'ordered'",
- "'decimal-format'", "':'", "'decimal-separator'", "'grouping-separator'",
- "'infinity'", "'minus-sign'", "'NaN'", "'percent'", "'per-mille'", "'zero-digit'",
- "'digit'", "'pattern-separator'", "'import'", "'external'", "'function'",
- "'jsound'", "'compact'", "'verbose'", "'schema'", "'eq'", "'ne'", "'lt'",
- "'le'", "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'", "'>='", "'||'",
- "'+'", "'-'", "'div'", "'idiv'", "'mod'", "'!'", "'['", "']'", "'.'",
- "'$$'", "'#'", "'{|'", "'|}'", "'for'", "'let'", "'where'", "'group'",
- "'by'", "'order'", "'return'", "'if'", "'in'", "'as'", "'at'", "'allowing'",
- "'empty'", "'count'", "'stable'", "'ascending'", "'descending'", "'some'",
- "'every'", "'satisfies'", "'collation'", "'greatest'", "'least'", "'switch'",
- "'case'", "'try'", "'catch'", "'default'", "'then'", "'else'", "'typeswitch'",
- "'or'", "'and'", "'not'", "'to'", "'instance'", "'of'", "'statically'",
- "'is'", "'treat'", "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'",
- "'true'", "'false'", "'type'", "'validate'", "'annotate'", "'declare'",
- "'context'", "'item'", "'variable'", "'insert'", "'delete'", "'rename'",
- "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'json'",
- "'with'", "'position'", "'break'", "'loop'", "'continue'", "'exit'",
- "'returning'", "'while'", null, "'?'", "'null'"
+ null, "';'", "'module'", "'='", "'$'", "':='", "'{'", "'}'", "'('", "')'",
+ "'*'", "'|'", "'%'", "','", "'ordering'", "'ordered'", "'decimal-format'",
+ "':'", "'decimal-separator'", "'grouping-separator'", "'infinity'", "'minus-sign'",
+ "'NaN'", "'percent'", "'per-mille'", "'zero-digit'", "'digit'", "'pattern-separator'",
+ "'external'", "'function'", "'jsound'", "'compact'", "'verbose'", "'eq'",
+ "'ne'", "'lt'", "'le'", "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'",
+ "'>='", "'||'", "'+'", "'-'", "'div'", "'idiv'", "'mod'", "'!'", "'['",
+ "']'", "'.'", "'$$'", "'#'", "'..'", "'{|'", "'|}'", "'for'", "'let'",
+ "'where'", "'group'", "'by'", "'order'", "'return'", "'if'", "'in'",
+ "'as'", "'at'", "'allowing'", "'empty'", "'count'", "'stable'", "'ascending'",
+ "'descending'", "'some'", "'every'", "'satisfies'", "'collation'", "'greatest'",
+ "'least'", "'switch'", "'case'", "'try'", "'catch'", "'default'", "'then'",
+ "'else'", "'typeswitch'", "'or'", "'and'", "'not'", "'to'", "'instance'",
+ "'of'", "'statically'", "'is'", "'treat'", "'cast'", "'castable'", "'version'",
+ "'jsoniq'", "'unordered'", "'true'", "'false'", "'type'", "'validate'",
+ "'annotate'", "'declare'", "'context'", "'item'", "'variable'", "'insert'",
+ "'delete'", "'rename'", "'replace'", "'copy'", "'modify'", "'append'",
+ "'into'", "'value'", "'json'", "'with'", "'position'", "'import'", "'schema'",
+ "'namespace'", "'element'", "'/'", "'//'", "'@'", "'child'", "'descendant'",
+ "'attribute'", "'self'", "'descendant-or-self'", "'following-sibling'",
+ "'following'", "'parent'", "'ancestor'", "'preceding-sibling'", "'preceding'",
+ "'ancestor-or-self'", "'node'", "'binary'", "'document'", "'document-node'",
+ "'text'", "'processing-instruction'", "'namespace-node'", "'schema-attribute'",
+ "'schema-element'", "'array-node'", "'boolean-node'", "'null-node'",
+ "'number-node'", "'object-node'", "'comment'", "'break'", "'loop'", "'continue'",
+ "'exit'", "'returning'", "'while'", null, "'?'", "'null'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -157,20 +178,26 @@ private static String[] makeSymbolicNames() {
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, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn",
- "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable",
- "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation",
- "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault",
- "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance",
- "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion",
- "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate",
- "Kdeclare", "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename",
- "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson",
- "Kwith", "Kposition", "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning",
- "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral", "Literal",
- "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral",
- "WS", "NCName", "XQComment", "ContentChar"
+ null, null, null, null, null, null, null, null, null, null, null, "Kfor",
+ "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn", "Kif", "Kin",
+ "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable", "Kascending",
+ "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation", "Kgreatest",
+ "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault", "Kthen",
+ "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance", "Kof",
+ "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", "Kjsoniq",
+ "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", "Kdeclare",
+ "Kcontext", "Kitem", "Kvariable", "Kinsert", "Kdelete", "Krename", "Kreplace",
+ "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kjson", "Kwith", "Kposition",
+ "Kimport", "Kschema", "Knamespace", "Kelement", "Kslash", "Kdslash",
+ "Kat_symbol", "Kchild", "Kdescendant", "Kattribute", "Kself", "Kdescendant_or_self",
+ "Kfollowing_sibling", "Kfollowing", "Kparent", "Kancestor", "Kpreceding_sibling",
+ "Kpreceding", "Kancestor_or_self", "Knode", "Kbinary", "Kdocument", "Kdocument_node",
+ "Ktext", "Kpi", "Knamespace_node", "Kschema_attribute", "Kschema_element",
+ "Karray_node", "Kboolean_node", "Knull_node", "Knumber_node", "Kobject_node",
+ "Kcomment", "Kbreak", "Kloop", "Kcontinue", "Kexit", "Kreturning", "Kwhile",
+ "STRING", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral",
+ "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "WS", "NCName",
+ "XQComment", "ContentChar"
};
}
private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -246,9 +273,9 @@ public final ModuleAndThisIsItContext moduleAndThisIsIt() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(254);
+ setState(326);
module();
- setState(255);
+ setState(327);
match(EOF);
}
}
@@ -294,44 +321,44 @@ public final ModuleContext module() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(262);
+ setState(334);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,0,_ctx) ) {
case 1:
{
- setState(257);
+ setState(329);
match(Kjsoniq);
- setState(258);
+ setState(330);
match(Kversion);
- setState(259);
+ setState(331);
((ModuleContext)_localctx).vers = stringLiteral();
- setState(260);
+ setState(332);
match(T__0);
}
break;
}
- setState(266);
+ setState(338);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__1:
{
- setState(264);
+ setState(336);
libraryModule();
}
break;
case EOF:
- case T__4:
- case T__6:
- case T__8:
- case T__12:
- case T__15:
+ case T__3:
+ case T__5:
+ case T__7:
+ case T__11:
+ case T__14:
case T__28:
- case T__30:
- case T__47:
- case T__48:
+ case T__44:
+ case T__45:
+ case T__50:
case T__53:
+ case T__55:
case T__56:
- case T__58:
case Kfor:
case Klet:
case Kwhere:
@@ -398,6 +425,22 @@ public final ModuleContext module() throws RecognitionException {
case Kjson:
case Kwith:
case Kposition:
+ case Kimport:
+ case Kslash:
+ case Kdslash:
+ case Kat_symbol:
+ case Kchild:
+ case Kdescendant:
+ case Kattribute:
+ case Kself:
+ case Kdescendant_or_self:
+ case Kfollowing_sibling:
+ case Kfollowing:
+ case Kparent:
+ case Kancestor:
+ case Kpreceding_sibling:
+ case Kpreceding:
+ case Kancestor_or_self:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -409,7 +452,7 @@ public final ModuleContext module() throws RecognitionException {
case Literal:
case NCName:
{
- setState(265);
+ setState(337);
((ModuleContext)_localctx).main = mainModule();
}
break;
@@ -453,9 +496,9 @@ public final MainModuleContext mainModule() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(268);
+ setState(340);
prolog();
- setState(269);
+ setState(341);
program();
}
}
@@ -471,6 +514,7 @@ public final MainModuleContext mainModule() throws RecognitionException {
}
public static class LibraryModuleContext extends ParserRuleContext {
+ public TerminalNode Knamespace() { return getToken(JsoniqParser.Knamespace, 0); }
public TerminalNode NCName() { return getToken(JsoniqParser.NCName, 0); }
public UriLiteralContext uriLiteral() {
return getRuleContext(UriLiteralContext.class,0);
@@ -495,19 +539,19 @@ public final LibraryModuleContext libraryModule() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(271);
+ setState(343);
match(T__1);
- setState(272);
- match(T__2);
- setState(273);
+ setState(344);
+ match(Knamespace);
+ setState(345);
match(NCName);
- setState(274);
- match(T__3);
- setState(275);
+ setState(346);
+ match(T__2);
+ setState(347);
uriLiteral();
- setState(276);
+ setState(348);
match(T__0);
- setState(277);
+ setState(349);
prolog();
}
}
@@ -565,59 +609,59 @@ public final PrologContext prolog() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(288);
+ setState(360);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,3,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(282);
+ setState(354);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) {
case 1:
{
- setState(279);
+ setState(351);
setter();
}
break;
case 2:
{
- setState(280);
+ setState(352);
namespaceDecl();
}
break;
case 3:
{
- setState(281);
+ setState(353);
moduleImport();
}
break;
}
- setState(284);
+ setState(356);
match(T__0);
}
}
}
- setState(290);
+ setState(362);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,3,_ctx);
}
- setState(296);
+ setState(368);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,4,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(291);
+ setState(363);
annotatedDecl();
- setState(292);
+ setState(364);
match(T__0);
}
}
}
- setState(298);
+ setState(370);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,4,_ctx);
}
@@ -655,7 +699,7 @@ public final ProgramContext program() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(299);
+ setState(371);
statementsAndOptionalExpr();
}
}
@@ -695,19 +739,19 @@ public final StatementsContext statements() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(304);
+ setState(376);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,5,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(301);
+ setState(373);
statement();
}
}
}
- setState(306);
+ setState(378);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,5,_ctx);
}
@@ -748,9 +792,9 @@ public final StatementsAndExprContext statementsAndExpr() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(307);
+ setState(379);
statements();
- setState(308);
+ setState(380);
expr();
}
}
@@ -790,14 +834,14 @@ public final StatementsAndOptionalExprContext statementsAndOptionalExpr() throws
try {
enterOuterAlt(_localctx, 1);
{
- setState(310);
+ setState(382);
statements();
- setState(312);
+ setState(384);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) {
{
- setState(311);
+ setState(383);
expr();
}
}
@@ -870,97 +914,97 @@ public final StatementContext statement() throws RecognitionException {
StatementContext _localctx = new StatementContext(_ctx, getState());
enterRule(_localctx, 18, RULE_statement);
try {
- setState(327);
+ setState(399);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(314);
+ setState(386);
applyStatement();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(315);
+ setState(387);
assignStatement();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(316);
+ setState(388);
blockStatement();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(317);
+ setState(389);
breakStatement();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(318);
+ setState(390);
continueStatement();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(319);
+ setState(391);
exitStatement();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(320);
+ setState(392);
flowrStatement();
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(321);
+ setState(393);
ifStatement();
}
break;
case 9:
enterOuterAlt(_localctx, 9);
{
- setState(322);
+ setState(394);
switchStatement();
}
break;
case 10:
enterOuterAlt(_localctx, 10);
{
- setState(323);
+ setState(395);
tryCatchStatement();
}
break;
case 11:
enterOuterAlt(_localctx, 11);
{
- setState(324);
+ setState(396);
typeSwitchStatement();
}
break;
case 12:
enterOuterAlt(_localctx, 12);
{
- setState(325);
+ setState(397);
varDeclStatement();
}
break;
case 13:
enterOuterAlt(_localctx, 13);
{
- setState(326);
+ setState(398);
whileStatement();
}
break;
@@ -998,9 +1042,9 @@ public final ApplyStatementContext applyStatement() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(329);
+ setState(401);
exprSimple();
- setState(330);
+ setState(402);
match(T__0);
}
}
@@ -1039,15 +1083,15 @@ public final AssignStatementContext assignStatement() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(332);
- match(T__4);
- setState(333);
+ setState(404);
+ match(T__3);
+ setState(405);
qname();
- setState(334);
- match(T__5);
- setState(335);
+ setState(406);
+ match(T__4);
+ setState(407);
exprSingle();
- setState(336);
+ setState(408);
match(T__0);
}
}
@@ -1083,12 +1127,12 @@ public final BlockStatementContext blockStatement() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(338);
- match(T__6);
- setState(339);
+ setState(410);
+ match(T__5);
+ setState(411);
statements();
- setState(340);
- match(T__7);
+ setState(412);
+ match(T__6);
}
}
catch (RecognitionException re) {
@@ -1122,11 +1166,11 @@ public final BreakStatementContext breakStatement() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(342);
+ setState(414);
match(Kbreak);
- setState(343);
+ setState(415);
match(Kloop);
- setState(344);
+ setState(416);
match(T__0);
}
}
@@ -1161,11 +1205,11 @@ public final ContinueStatementContext continueStatement() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(346);
+ setState(418);
match(Kcontinue);
- setState(347);
+ setState(419);
match(Kloop);
- setState(348);
+ setState(420);
match(T__0);
}
}
@@ -1203,13 +1247,13 @@ public final ExitStatementContext exitStatement() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(350);
+ setState(422);
match(Kexit);
- setState(351);
+ setState(423);
match(Kreturning);
- setState(352);
+ setState(424);
exprSingle();
- setState(353);
+ setState(425);
match(T__0);
}
}
@@ -1286,66 +1330,66 @@ public final FlowrStatementContext flowrStatement() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(357);
+ setState(429);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kfor:
{
- setState(355);
+ setState(427);
((FlowrStatementContext)_localctx).start_for = forClause();
}
break;
case Klet:
{
- setState(356);
+ setState(428);
((FlowrStatementContext)_localctx).start_let = letClause();
}
break;
default:
throw new NoViableAltException(this);
}
- setState(367);
+ setState(439);
_errHandler.sync(this);
_la = _input.LA(1);
- while (((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & ((1L << (Kfor - 61)) | (1L << (Klet - 61)) | (1L << (Kwhere - 61)) | (1L << (Kgroup - 61)) | (1L << (Korder - 61)) | (1L << (Kcount - 61)) | (1L << (Kstable - 61)))) != 0)) {
+ while (((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & ((1L << (Kfor - 59)) | (1L << (Klet - 59)) | (1L << (Kwhere - 59)) | (1L << (Kgroup - 59)) | (1L << (Korder - 59)) | (1L << (Kcount - 59)) | (1L << (Kstable - 59)))) != 0)) {
{
- setState(365);
+ setState(437);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kfor:
{
- setState(359);
+ setState(431);
forClause();
}
break;
case Klet:
{
- setState(360);
+ setState(432);
letClause();
}
break;
case Kwhere:
{
- setState(361);
+ setState(433);
whereClause();
}
break;
case Kgroup:
{
- setState(362);
+ setState(434);
groupByClause();
}
break;
case Korder:
case Kstable:
{
- setState(363);
+ setState(435);
orderByClause();
}
break;
case Kcount:
{
- setState(364);
+ setState(436);
countClause();
}
break;
@@ -1353,13 +1397,13 @@ public final FlowrStatementContext flowrStatement() throws RecognitionException
throw new NoViableAltException(this);
}
}
- setState(369);
+ setState(441);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(370);
+ setState(442);
match(Kreturn);
- setState(371);
+ setState(443);
((FlowrStatementContext)_localctx).returnStmt = statement();
}
}
@@ -1407,21 +1451,21 @@ public final IfStatementContext ifStatement() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(373);
+ setState(445);
match(Kif);
- setState(374);
- match(T__8);
- setState(375);
+ setState(446);
+ match(T__7);
+ setState(447);
((IfStatementContext)_localctx).test_expr = expr();
- setState(376);
- match(T__9);
- setState(377);
+ setState(448);
+ match(T__8);
+ setState(449);
match(Kthen);
- setState(378);
+ setState(450);
((IfStatementContext)_localctx).branch = statement();
- setState(379);
+ setState(451);
match(Kelse);
- setState(380);
+ setState(452);
((IfStatementContext)_localctx).else_branch = statement();
}
}
@@ -1474,34 +1518,34 @@ public final SwitchStatementContext switchStatement() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(382);
+ setState(454);
match(Kswitch);
- setState(383);
- match(T__8);
- setState(384);
+ setState(455);
+ match(T__7);
+ setState(456);
((SwitchStatementContext)_localctx).condExpr = expr();
- setState(385);
- match(T__9);
- setState(387);
+ setState(457);
+ match(T__8);
+ setState(459);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(386);
+ setState(458);
((SwitchStatementContext)_localctx).switchCaseStatement = switchCaseStatement();
((SwitchStatementContext)_localctx).cases.add(((SwitchStatementContext)_localctx).switchCaseStatement);
}
}
- setState(389);
+ setState(461);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( _la==Kcase );
- setState(391);
+ setState(463);
match(Kdefault);
- setState(392);
+ setState(464);
match(Kreturn);
- setState(393);
+ setState(465);
((SwitchStatementContext)_localctx).def = statement();
}
}
@@ -1552,26 +1596,26 @@ public final SwitchCaseStatementContext switchCaseStatement() throws Recognition
try {
enterOuterAlt(_localctx, 1);
{
- setState(397);
+ setState(469);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(395);
+ setState(467);
match(Kcase);
- setState(396);
+ setState(468);
((SwitchCaseStatementContext)_localctx).exprSingle = exprSingle();
((SwitchCaseStatementContext)_localctx).cond.add(((SwitchCaseStatementContext)_localctx).exprSingle);
}
}
- setState(399);
+ setState(471);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( _la==Kcase );
- setState(401);
+ setState(473);
match(Kreturn);
- setState(402);
+ setState(474);
((SwitchCaseStatementContext)_localctx).ret = statement();
}
}
@@ -1618,11 +1662,11 @@ public final TryCatchStatementContext tryCatchStatement() throws RecognitionExce
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(404);
+ setState(476);
match(Ktry);
- setState(405);
+ setState(477);
((TryCatchStatementContext)_localctx).try_block = blockStatement();
- setState(407);
+ setState(479);
_errHandler.sync(this);
_alt = 1;
do {
@@ -1630,7 +1674,7 @@ public final TryCatchStatementContext tryCatchStatement() throws RecognitionExce
case 1:
{
{
- setState(406);
+ setState(478);
((TryCatchStatementContext)_localctx).catchCaseStatement = catchCaseStatement();
((TryCatchStatementContext)_localctx).catches.add(((TryCatchStatementContext)_localctx).catchCaseStatement);
}
@@ -1639,7 +1683,7 @@ public final TryCatchStatementContext tryCatchStatement() throws RecognitionExce
default:
throw new NoViableAltException(this);
}
- setState(409);
+ setState(481);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,13,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
@@ -1657,7 +1701,7 @@ public final TryCatchStatementContext tryCatchStatement() throws RecognitionExce
}
public static class CatchCaseStatementContext extends ParserRuleContext {
- public Token s11;
+ public Token s10;
public List jokers = new ArrayList();
public QnameContext qname;
public List errors = new ArrayList();
@@ -1690,16 +1734,16 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx
try {
enterOuterAlt(_localctx, 1);
{
- setState(411);
+ setState(483);
match(Kcatch);
- setState(414);
+ setState(486);
_errHandler.sync(this);
switch (_input.LA(1)) {
- case T__10:
+ case T__9:
{
- setState(412);
- ((CatchCaseStatementContext)_localctx).s11 = match(T__10);
- ((CatchCaseStatementContext)_localctx).jokers.add(((CatchCaseStatementContext)_localctx).s11);
+ setState(484);
+ ((CatchCaseStatementContext)_localctx).s10 = match(T__9);
+ ((CatchCaseStatementContext)_localctx).jokers.add(((CatchCaseStatementContext)_localctx).s10);
}
break;
case Kfor:
@@ -1777,7 +1821,7 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx
case NullLiteral:
case NCName:
{
- setState(413);
+ setState(485);
((CatchCaseStatementContext)_localctx).qname = qname();
((CatchCaseStatementContext)_localctx).errors.add(((CatchCaseStatementContext)_localctx).qname);
}
@@ -1785,22 +1829,22 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx
default:
throw new NoViableAltException(this);
}
- setState(423);
+ setState(495);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__11) {
+ while (_la==T__10) {
{
{
- setState(416);
- match(T__11);
- setState(419);
+ setState(488);
+ match(T__10);
+ setState(491);
_errHandler.sync(this);
switch (_input.LA(1)) {
- case T__10:
+ case T__9:
{
- setState(417);
- ((CatchCaseStatementContext)_localctx).s11 = match(T__10);
- ((CatchCaseStatementContext)_localctx).jokers.add(((CatchCaseStatementContext)_localctx).s11);
+ setState(489);
+ ((CatchCaseStatementContext)_localctx).s10 = match(T__9);
+ ((CatchCaseStatementContext)_localctx).jokers.add(((CatchCaseStatementContext)_localctx).s10);
}
break;
case Kfor:
@@ -1878,7 +1922,7 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx
case NullLiteral:
case NCName:
{
- setState(418);
+ setState(490);
((CatchCaseStatementContext)_localctx).qname = qname();
((CatchCaseStatementContext)_localctx).errors.add(((CatchCaseStatementContext)_localctx).qname);
}
@@ -1888,11 +1932,11 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx
}
}
}
- setState(425);
+ setState(497);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(426);
+ setState(498);
((CatchCaseStatementContext)_localctx).catch_block = blockStatement();
}
}
@@ -1949,44 +1993,44 @@ public final TypeSwitchStatementContext typeSwitchStatement() throws Recognition
try {
enterOuterAlt(_localctx, 1);
{
- setState(428);
+ setState(500);
match(Ktypeswitch);
- setState(429);
- match(T__8);
- setState(430);
+ setState(501);
+ match(T__7);
+ setState(502);
((TypeSwitchStatementContext)_localctx).cond = expr();
- setState(431);
- match(T__9);
- setState(433);
+ setState(503);
+ match(T__8);
+ setState(505);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(432);
+ setState(504);
((TypeSwitchStatementContext)_localctx).caseStatement = caseStatement();
((TypeSwitchStatementContext)_localctx).cases.add(((TypeSwitchStatementContext)_localctx).caseStatement);
}
}
- setState(435);
+ setState(507);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( _la==Kcase );
- setState(437);
+ setState(509);
match(Kdefault);
- setState(439);
+ setState(511);
_errHandler.sync(this);
_la = _input.LA(1);
- if (_la==T__4) {
+ if (_la==T__3) {
{
- setState(438);
+ setState(510);
((TypeSwitchStatementContext)_localctx).var_ref = varRef();
}
}
- setState(441);
+ setState(513);
match(Kreturn);
- setState(442);
+ setState(514);
((TypeSwitchStatementContext)_localctx).def = statement();
}
}
@@ -2039,43 +2083,43 @@ public final CaseStatementContext caseStatement() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(444);
+ setState(516);
match(Kcase);
- setState(448);
+ setState(520);
_errHandler.sync(this);
_la = _input.LA(1);
- if (_la==T__4) {
+ if (_la==T__3) {
{
- setState(445);
+ setState(517);
((CaseStatementContext)_localctx).var_ref = varRef();
- setState(446);
+ setState(518);
match(Kas);
}
}
- setState(450);
+ setState(522);
((CaseStatementContext)_localctx).sequenceType = sequenceType();
((CaseStatementContext)_localctx).union.add(((CaseStatementContext)_localctx).sequenceType);
- setState(455);
+ setState(527);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__11) {
+ while (_la==T__10) {
{
{
- setState(451);
- match(T__11);
- setState(452);
+ setState(523);
+ match(T__10);
+ setState(524);
((CaseStatementContext)_localctx).sequenceType = sequenceType();
((CaseStatementContext)_localctx).union.add(((CaseStatementContext)_localctx).sequenceType);
}
}
- setState(457);
+ setState(529);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(458);
+ setState(530);
match(Kreturn);
- setState(459);
+ setState(531);
((CaseStatementContext)_localctx).ret = statement();
}
}
@@ -2117,37 +2161,37 @@ public final AnnotationContext annotation() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(461);
- match(T__12);
- setState(462);
+ setState(533);
+ match(T__11);
+ setState(534);
((AnnotationContext)_localctx).name = qname();
- setState(473);
+ setState(545);
_errHandler.sync(this);
_la = _input.LA(1);
- if (_la==T__8) {
+ if (_la==T__7) {
{
- setState(463);
- match(T__8);
- setState(464);
+ setState(535);
+ match(T__7);
+ setState(536);
match(Literal);
- setState(469);
+ setState(541);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__13) {
+ while (_la==T__12) {
{
{
- setState(465);
- match(T__13);
- setState(466);
+ setState(537);
+ match(T__12);
+ setState(538);
match(Literal);
}
}
- setState(471);
+ setState(543);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(472);
- match(T__9);
+ setState(544);
+ match(T__8);
}
}
@@ -2189,17 +2233,17 @@ public final AnnotationsContext annotations() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(478);
+ setState(550);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__12) {
+ while (_la==T__11) {
{
{
- setState(475);
+ setState(547);
annotation();
}
}
- setState(480);
+ setState(552);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -2245,29 +2289,29 @@ public final VarDeclStatementContext varDeclStatement() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(481);
+ setState(553);
annotations();
- setState(482);
+ setState(554);
match(Kvariable);
- setState(483);
+ setState(555);
varDeclForStatement();
- setState(488);
+ setState(560);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__13) {
+ while (_la==T__12) {
{
{
- setState(484);
- match(T__13);
- setState(485);
+ setState(556);
+ match(T__12);
+ setState(557);
varDeclForStatement();
}
}
- setState(490);
+ setState(562);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(491);
+ setState(563);
match(T__0);
}
}
@@ -2314,28 +2358,28 @@ public final VarDeclForStatementContext varDeclForStatement() throws Recognition
try {
enterOuterAlt(_localctx, 1);
{
- setState(493);
+ setState(565);
((VarDeclForStatementContext)_localctx).var_ref = varRef();
- setState(496);
+ setState(568);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(494);
+ setState(566);
match(Kas);
- setState(495);
+ setState(567);
sequenceType();
}
}
- setState(500);
+ setState(572);
_errHandler.sync(this);
_la = _input.LA(1);
- if (_la==T__5) {
+ if (_la==T__4) {
{
- setState(498);
- match(T__5);
- setState(499);
+ setState(570);
+ match(T__4);
+ setState(571);
((VarDeclForStatementContext)_localctx).exprSingle = exprSingle();
((VarDeclForStatementContext)_localctx).expr_vals.add(((VarDeclForStatementContext)_localctx).exprSingle);
}
@@ -2381,15 +2425,15 @@ public final WhileStatementContext whileStatement() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(502);
+ setState(574);
match(Kwhile);
- setState(503);
- match(T__8);
- setState(504);
+ setState(575);
+ match(T__7);
+ setState(576);
((WhileStatementContext)_localctx).test_expr = expr();
- setState(505);
- match(T__9);
- setState(506);
+ setState(577);
+ match(T__8);
+ setState(578);
((WhileStatementContext)_localctx).stmt = statement();
}
}
@@ -2432,34 +2476,34 @@ public final SetterContext setter() throws RecognitionException {
SetterContext _localctx = new SetterContext(_ctx, getState());
enterRule(_localctx, 58, RULE_setter);
try {
- setState(512);
+ setState(584);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(508);
+ setState(580);
defaultCollationDecl();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(509);
+ setState(581);
orderingModeDecl();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(510);
+ setState(582);
emptyOrderDecl();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(511);
+ setState(583);
decimalFormatDecl();
}
break;
@@ -2478,6 +2522,7 @@ public final SetterContext setter() throws RecognitionException {
public static class NamespaceDeclContext extends ParserRuleContext {
public TerminalNode Kdeclare() { return getToken(JsoniqParser.Kdeclare, 0); }
+ public TerminalNode Knamespace() { return getToken(JsoniqParser.Knamespace, 0); }
public TerminalNode NCName() { return getToken(JsoniqParser.NCName, 0); }
public UriLiteralContext uriLiteral() {
return getRuleContext(UriLiteralContext.class,0);
@@ -2499,15 +2544,15 @@ public final NamespaceDeclContext namespaceDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(514);
+ setState(586);
match(Kdeclare);
- setState(515);
- match(T__2);
- setState(516);
+ setState(587);
+ match(Knamespace);
+ setState(588);
match(NCName);
- setState(517);
- match(T__3);
- setState(518);
+ setState(589);
+ match(T__2);
+ setState(590);
uriLiteral();
}
}
@@ -2550,34 +2595,34 @@ public final AnnotatedDeclContext annotatedDecl() throws RecognitionException {
AnnotatedDeclContext _localctx = new AnnotatedDeclContext(_ctx, getState());
enterRule(_localctx, 62, RULE_annotatedDecl);
try {
- setState(524);
+ setState(596);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(520);
+ setState(592);
functionDecl();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(521);
+ setState(593);
varDecl();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(522);
+ setState(594);
typeDecl();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(523);
+ setState(595);
contextItemDecl();
}
break;
@@ -2618,13 +2663,13 @@ public final DefaultCollationDeclContext defaultCollationDecl() throws Recogniti
try {
enterOuterAlt(_localctx, 1);
{
- setState(526);
+ setState(598);
match(Kdeclare);
- setState(527);
+ setState(599);
match(Kdefault);
- setState(528);
+ setState(600);
match(Kcollation);
- setState(529);
+ setState(601);
uriLiteral();
}
}
@@ -2660,13 +2705,13 @@ public final OrderingModeDeclContext orderingModeDecl() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(531);
+ setState(603);
match(Kdeclare);
- setState(532);
- match(T__14);
- setState(533);
+ setState(604);
+ match(T__13);
+ setState(605);
_la = _input.LA(1);
- if ( !(_la==T__15 || _la==Kunordered) ) {
+ if ( !(_la==T__14 || _la==Kunordered) ) {
_errHandler.recoverInline(this);
}
else {
@@ -2713,16 +2758,16 @@ public final EmptyOrderDeclContext emptyOrderDecl() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(535);
+ setState(607);
match(Kdeclare);
- setState(536);
+ setState(608);
match(Kdefault);
- setState(537);
+ setState(609);
match(Korder);
- setState(538);
+ setState(610);
match(Kempty);
{
- setState(539);
+ setState(611);
((EmptyOrderDeclContext)_localctx).emptySequenceOrder = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==Kgreatest || _la==Kleast) ) {
@@ -2783,17 +2828,17 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(541);
+ setState(613);
match(Kdeclare);
- setState(546);
+ setState(618);
_errHandler.sync(this);
switch (_input.LA(1)) {
- case T__16:
+ case T__15:
{
{
- setState(542);
- match(T__16);
- setState(543);
+ setState(614);
+ match(T__15);
+ setState(615);
qname();
}
}
@@ -2801,31 +2846,31 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce
case Kdefault:
{
{
- setState(544);
+ setState(616);
match(Kdefault);
- setState(545);
- match(T__16);
+ setState(617);
+ match(T__15);
}
}
break;
default:
throw new NoViableAltException(this);
}
- setState(554);
+ setState(626);
_errHandler.sync(this);
_la = _input.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27))) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26))) != 0)) {
{
{
- setState(548);
+ setState(620);
dfPropertyName();
- setState(549);
- match(T__3);
- setState(550);
+ setState(621);
+ match(T__2);
+ setState(622);
stringLiteral();
}
}
- setState(556);
+ setState(628);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -2874,17 +2919,17 @@ public final QnameContext qname() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(562);
+ setState(634);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) {
case 1:
{
- setState(559);
+ setState(631);
_errHandler.sync(this);
switch (_input.LA(1)) {
case NCName:
{
- setState(557);
+ setState(629);
((QnameContext)_localctx).ns = match(NCName);
}
break;
@@ -2962,24 +3007,24 @@ public final QnameContext qname() throws RecognitionException {
case Kwhile:
case NullLiteral:
{
- setState(558);
+ setState(630);
((QnameContext)_localctx).nskw = keyWords();
}
break;
default:
throw new NoViableAltException(this);
}
- setState(561);
- match(T__17);
+ setState(633);
+ match(T__16);
}
break;
}
- setState(566);
+ setState(638);
_errHandler.sync(this);
switch (_input.LA(1)) {
case NCName:
{
- setState(564);
+ setState(636);
((QnameContext)_localctx).local_name = match(NCName);
}
break;
@@ -3057,7 +3102,7 @@ public final QnameContext qname() throws RecognitionException {
case Kwhile:
case NullLiteral:
{
- setState(565);
+ setState(637);
((QnameContext)_localctx).local_namekw = keyWords();
}
break;
@@ -3096,9 +3141,9 @@ public final DfPropertyNameContext dfPropertyName() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(568);
+ setState(640);
_la = _input.LA(1);
- if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27))) != 0)) ) {
+ if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@@ -3122,12 +3167,14 @@ public final DfPropertyNameContext dfPropertyName() throws RecognitionException
public static class ModuleImportContext extends ParserRuleContext {
public Token prefix;
public UriLiteralContext targetNamespace;
+ public TerminalNode Kimport() { return getToken(JsoniqParser.Kimport, 0); }
public List uriLiteral() {
return getRuleContexts(UriLiteralContext.class);
}
public UriLiteralContext uriLiteral(int i) {
return getRuleContext(UriLiteralContext.class,i);
}
+ public TerminalNode Knamespace() { return getToken(JsoniqParser.Knamespace, 0); }
public TerminalNode Kat() { return getToken(JsoniqParser.Kat, 0); }
public TerminalNode NCName() { return getToken(JsoniqParser.NCName, 0); }
public ModuleImportContext(ParserRuleContext parent, int invokingState) {
@@ -3148,48 +3195,48 @@ public final ModuleImportContext moduleImport() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(570);
- match(T__28);
- setState(571);
+ setState(642);
+ match(Kimport);
+ setState(643);
match(T__1);
- setState(575);
+ setState(647);
_errHandler.sync(this);
_la = _input.LA(1);
- if (_la==T__2) {
+ if (_la==Knamespace) {
{
- setState(572);
- match(T__2);
- setState(573);
+ setState(644);
+ match(Knamespace);
+ setState(645);
((ModuleImportContext)_localctx).prefix = match(NCName);
- setState(574);
- match(T__3);
+ setState(646);
+ match(T__2);
}
}
- setState(577);
+ setState(649);
((ModuleImportContext)_localctx).targetNamespace = uriLiteral();
- setState(587);
+ setState(659);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kat) {
{
- setState(578);
+ setState(650);
match(Kat);
- setState(579);
+ setState(651);
uriLiteral();
- setState(584);
+ setState(656);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__13) {
+ while (_la==T__12) {
{
{
- setState(580);
- match(T__13);
- setState(581);
+ setState(652);
+ match(T__12);
+ setState(653);
uriLiteral();
}
}
- setState(586);
+ setState(658);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -3244,52 +3291,52 @@ public final VarDeclContext varDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(589);
+ setState(661);
match(Kdeclare);
- setState(590);
+ setState(662);
annotations();
- setState(591);
+ setState(663);
match(Kvariable);
- setState(592);
+ setState(664);
varRef();
- setState(595);
+ setState(667);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(593);
+ setState(665);
match(Kas);
- setState(594);
+ setState(666);
sequenceType();
}
}
- setState(604);
+ setState(676);
_errHandler.sync(this);
switch (_input.LA(1)) {
- case T__5:
+ case T__4:
{
{
- setState(597);
- match(T__5);
- setState(598);
+ setState(669);
+ match(T__4);
+ setState(670);
exprSingle();
}
}
break;
- case T__29:
+ case T__27:
{
{
- setState(599);
- ((VarDeclContext)_localctx).external = match(T__29);
- setState(602);
+ setState(671);
+ ((VarDeclContext)_localctx).external = match(T__27);
+ setState(674);
_errHandler.sync(this);
_la = _input.LA(1);
- if (_la==T__5) {
+ if (_la==T__4) {
{
- setState(600);
- match(T__5);
- setState(601);
+ setState(672);
+ match(T__4);
+ setState(673);
exprSingle();
}
}
@@ -3343,50 +3390,50 @@ public final ContextItemDeclContext contextItemDecl() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(606);
+ setState(678);
match(Kdeclare);
- setState(607);
+ setState(679);
match(Kcontext);
- setState(608);
+ setState(680);
match(Kitem);
- setState(611);
+ setState(683);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(609);
+ setState(681);
match(Kas);
- setState(610);
+ setState(682);
sequenceType();
}
}
- setState(620);
+ setState(692);
_errHandler.sync(this);
switch (_input.LA(1)) {
- case T__5:
+ case T__4:
{
{
- setState(613);
- match(T__5);
- setState(614);
+ setState(685);
+ match(T__4);
+ setState(686);
exprSingle();
}
}
break;
- case T__29:
+ case T__27:
{
{
- setState(615);
- ((ContextItemDeclContext)_localctx).external = match(T__29);
- setState(618);
+ setState(687);
+ ((ContextItemDeclContext)_localctx).external = match(T__27);
+ setState(690);
_errHandler.sync(this);
_la = _input.LA(1);
- if (_la==T__5) {
+ if (_la==T__4) {
{
- setState(616);
- match(T__5);
- setState(617);
+ setState(688);
+ match(T__4);
+ setState(689);
exprSingle();
}
}
@@ -3449,59 +3496,59 @@ public final FunctionDeclContext functionDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(622);
+ setState(694);
match(Kdeclare);
- setState(623);
+ setState(695);
annotations();
- setState(624);
- match(T__30);
- setState(625);
+ setState(696);
+ match(T__28);
+ setState(697);
((FunctionDeclContext)_localctx).fn_name = qname();
- setState(626);
- match(T__8);
- setState(628);
+ setState(698);
+ match(T__7);
+ setState(700);
_errHandler.sync(this);
_la = _input.LA(1);
- if (_la==T__4) {
+ if (_la==T__3) {
{
- setState(627);
+ setState(699);
paramList();
}
}
- setState(630);
- match(T__9);
- setState(633);
+ setState(702);
+ match(T__8);
+ setState(705);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(631);
+ setState(703);
match(Kas);
- setState(632);
+ setState(704);
((FunctionDeclContext)_localctx).return_type = sequenceType();
}
}
- setState(640);
+ setState(712);
_errHandler.sync(this);
switch (_input.LA(1)) {
- case T__6:
+ case T__5:
{
- setState(635);
- match(T__6);
+ setState(707);
+ match(T__5);
{
- setState(636);
+ setState(708);
((FunctionDeclContext)_localctx).fn_body = statementsAndOptionalExpr();
}
- setState(637);
- match(T__7);
+ setState(709);
+ match(T__6);
}
break;
- case T__29:
+ case T__27:
{
- setState(639);
- match(T__29);
+ setState(711);
+ match(T__27);
}
break;
default:
@@ -3553,25 +3600,25 @@ public final TypeDeclContext typeDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(642);
+ setState(714);
match(Kdeclare);
- setState(643);
+ setState(715);
match(Ktype);
- setState(644);
+ setState(716);
((TypeDeclContext)_localctx).type_name = qname();
- setState(645);
+ setState(717);
match(Kas);
- setState(647);
+ setState(719);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) {
case 1:
{
- setState(646);
+ setState(718);
((TypeDeclContext)_localctx).schema = schemaLanguage();
}
break;
}
- setState(649);
+ setState(721);
((TypeDeclContext)_localctx).type_definition = exprSingle();
}
}
@@ -3588,6 +3635,7 @@ public final TypeDeclContext typeDecl() throws RecognitionException {
public static class SchemaLanguageContext extends ParserRuleContext {
public TerminalNode Kjson() { return getToken(JsoniqParser.Kjson, 0); }
+ public TerminalNode Kschema() { return getToken(JsoniqParser.Kschema, 0); }
public SchemaLanguageContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@@ -3603,34 +3651,34 @@ public final SchemaLanguageContext schemaLanguage() throws RecognitionException
SchemaLanguageContext _localctx = new SchemaLanguageContext(_ctx, getState());
enterRule(_localctx, 86, RULE_schemaLanguage);
try {
- setState(657);
+ setState(729);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(651);
- match(T__31);
- setState(652);
- match(T__32);
+ setState(723);
+ match(T__29);
+ setState(724);
+ match(T__30);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(653);
+ setState(725);
+ match(T__29);
+ setState(726);
match(T__31);
- setState(654);
- match(T__33);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(655);
+ setState(727);
match(Kjson);
- setState(656);
- match(T__34);
+ setState(728);
+ match(Kschema);
}
break;
}
@@ -3671,21 +3719,21 @@ public final ParamListContext paramList() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(659);
+ setState(731);
param();
- setState(664);
+ setState(736);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__13) {
+ while (_la==T__12) {
{
{
- setState(660);
- match(T__13);
- setState(661);
+ setState(732);
+ match(T__12);
+ setState(733);
param();
}
}
- setState(666);
+ setState(738);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -3728,18 +3776,18 @@ public final ParamContext param() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(667);
- match(T__4);
- setState(668);
+ setState(739);
+ match(T__3);
+ setState(740);
qname();
- setState(671);
+ setState(743);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(669);
+ setState(741);
match(Kas);
- setState(670);
+ setState(742);
sequenceType();
}
}
@@ -3782,21 +3830,21 @@ public final ExprContext expr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(673);
+ setState(745);
exprSingle();
- setState(678);
+ setState(750);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__13) {
+ while (_la==T__12) {
{
{
- setState(674);
- match(T__13);
- setState(675);
+ setState(746);
+ match(T__12);
+ setState(747);
exprSingle();
}
}
- setState(680);
+ setState(752);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -3847,48 +3895,48 @@ public final ExprSingleContext exprSingle() throws RecognitionException {
ExprSingleContext _localctx = new ExprSingleContext(_ctx, getState());
enterRule(_localctx, 94, RULE_exprSingle);
try {
- setState(687);
+ setState(759);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(681);
+ setState(753);
exprSimple();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(682);
+ setState(754);
flowrExpr();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(683);
+ setState(755);
switchExpr();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(684);
+ setState(756);
typeSwitchExpr();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(685);
+ setState(757);
ifExpr();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(686);
+ setState(758);
tryCatchExpr();
}
break;
@@ -3945,62 +3993,62 @@ public final ExprSimpleContext exprSimple() throws RecognitionException {
ExprSimpleContext _localctx = new ExprSimpleContext(_ctx, getState());
enterRule(_localctx, 96, RULE_exprSimple);
try {
- setState(697);
+ setState(769);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(689);
+ setState(761);
quantifiedExpr();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(690);
+ setState(762);
orExpr();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(691);
+ setState(763);
insertExpr();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(692);
+ setState(764);
deleteExpr();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(693);
+ setState(765);
renameExpr();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(694);
+ setState(766);
replaceExpr();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(695);
+ setState(767);
transformExpr();
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(696);
+ setState(768);
appendExpr();
}
break;
@@ -4079,66 +4127,66 @@ public final FlowrExprContext flowrExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(701);
+ setState(773);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kfor:
{
- setState(699);
+ setState(771);
((FlowrExprContext)_localctx).start_for = forClause();
}
break;
case Klet:
{
- setState(700);
+ setState(772);
((FlowrExprContext)_localctx).start_let = letClause();
}
break;
default:
throw new NoViableAltException(this);
}
- setState(711);
+ setState(783);
_errHandler.sync(this);
_la = _input.LA(1);
- while (((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & ((1L << (Kfor - 61)) | (1L << (Klet - 61)) | (1L << (Kwhere - 61)) | (1L << (Kgroup - 61)) | (1L << (Korder - 61)) | (1L << (Kcount - 61)) | (1L << (Kstable - 61)))) != 0)) {
+ while (((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & ((1L << (Kfor - 59)) | (1L << (Klet - 59)) | (1L << (Kwhere - 59)) | (1L << (Kgroup - 59)) | (1L << (Korder - 59)) | (1L << (Kcount - 59)) | (1L << (Kstable - 59)))) != 0)) {
{
- setState(709);
+ setState(781);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kfor:
{
- setState(703);
+ setState(775);
forClause();
}
break;
case Klet:
{
- setState(704);
+ setState(776);
letClause();
}
break;
case Kwhere:
{
- setState(705);
+ setState(777);
whereClause();
}
break;
case Kgroup:
{
- setState(706);
+ setState(778);
groupByClause();
}
break;
case Korder:
case Kstable:
{
- setState(707);
+ setState(779);
orderByClause();
}
break;
case Kcount:
{
- setState(708);
+ setState(780);
countClause();
}
break;
@@ -4146,13 +4194,13 @@ public final FlowrExprContext flowrExpr() throws RecognitionException {
throw new NoViableAltException(this);
}
}
- setState(713);
+ setState(785);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(714);
+ setState(786);
match(Kreturn);
- setState(715);
+ setState(787);
((FlowrExprContext)_localctx).return_expr = exprSingle();
}
}
@@ -4195,25 +4243,25 @@ public final ForClauseContext forClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(717);
+ setState(789);
match(Kfor);
- setState(718);
+ setState(790);
((ForClauseContext)_localctx).forVar = forVar();
((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar);
- setState(723);
+ setState(795);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__13) {
+ while (_la==T__12) {
{
{
- setState(719);
- match(T__13);
- setState(720);
+ setState(791);
+ match(T__12);
+ setState(792);
((ForClauseContext)_localctx).forVar = forVar();
((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar);
}
}
- setState(725);
+ setState(797);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -4271,47 +4319,47 @@ public final ForVarContext forVar() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(726);
+ setState(798);
((ForVarContext)_localctx).var_ref = varRef();
- setState(729);
+ setState(801);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(727);
+ setState(799);
match(Kas);
- setState(728);
+ setState(800);
((ForVarContext)_localctx).seq = sequenceType();
}
}
- setState(733);
+ setState(805);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kallowing) {
{
- setState(731);
+ setState(803);
((ForVarContext)_localctx).flag = match(Kallowing);
- setState(732);
+ setState(804);
match(Kempty);
}
}
- setState(737);
+ setState(809);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kat) {
{
- setState(735);
+ setState(807);
match(Kat);
- setState(736);
+ setState(808);
((ForVarContext)_localctx).at = varRef();
}
}
- setState(739);
+ setState(811);
match(Kin);
- setState(740);
+ setState(812);
((ForVarContext)_localctx).ex = exprSingle();
}
}
@@ -4354,25 +4402,25 @@ public final LetClauseContext letClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(742);
+ setState(814);
match(Klet);
- setState(743);
+ setState(815);
((LetClauseContext)_localctx).letVar = letVar();
((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar);
- setState(748);
+ setState(820);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__13) {
+ while (_la==T__12) {
{
{
- setState(744);
- match(T__13);
- setState(745);
+ setState(816);
+ match(T__12);
+ setState(817);
((LetClauseContext)_localctx).letVar = letVar();
((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar);
}
}
- setState(750);
+ setState(822);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -4421,23 +4469,23 @@ public final LetVarContext letVar() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(751);
+ setState(823);
((LetVarContext)_localctx).var_ref = varRef();
- setState(754);
+ setState(826);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(752);
+ setState(824);
match(Kas);
- setState(753);
+ setState(825);
((LetVarContext)_localctx).seq = sequenceType();
}
}
- setState(756);
- match(T__5);
- setState(757);
+ setState(828);
+ match(T__4);
+ setState(829);
((LetVarContext)_localctx).ex = exprSingle();
}
}
@@ -4474,9 +4522,9 @@ public final WhereClauseContext whereClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(759);
+ setState(831);
match(Kwhere);
- setState(760);
+ setState(832);
exprSingle();
}
}
@@ -4520,27 +4568,27 @@ public final GroupByClauseContext groupByClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(762);
+ setState(834);
match(Kgroup);
- setState(763);
+ setState(835);
match(Kby);
- setState(764);
+ setState(836);
((GroupByClauseContext)_localctx).groupByVar = groupByVar();
((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar);
- setState(769);
+ setState(841);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__13) {
+ while (_la==T__12) {
{
{
- setState(765);
- match(T__13);
- setState(766);
+ setState(837);
+ match(T__12);
+ setState(838);
((GroupByClauseContext)_localctx).groupByVar = groupByVar();
((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar);
}
}
- setState(771);
+ setState(843);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -4595,40 +4643,40 @@ public final GroupByVarContext groupByVar() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(772);
+ setState(844);
((GroupByVarContext)_localctx).var_ref = varRef();
- setState(779);
+ setState(851);
_errHandler.sync(this);
_la = _input.LA(1);
- if (_la==T__5 || _la==Kas) {
+ if (_la==T__4 || _la==Kas) {
{
- setState(775);
+ setState(847);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(773);
+ setState(845);
match(Kas);
- setState(774);
+ setState(846);
((GroupByVarContext)_localctx).seq = sequenceType();
}
}
- setState(777);
- ((GroupByVarContext)_localctx).decl = match(T__5);
- setState(778);
+ setState(849);
+ ((GroupByVarContext)_localctx).decl = match(T__4);
+ setState(850);
((GroupByVarContext)_localctx).ex = exprSingle();
}
}
- setState(783);
+ setState(855);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kcollation) {
{
- setState(781);
+ setState(853);
match(Kcollation);
- setState(782);
+ setState(854);
((GroupByVarContext)_localctx).uri = uriLiteral();
}
}
@@ -4675,15 +4723,15 @@ public final OrderByClauseContext orderByClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(790);
+ setState(862);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Korder:
{
{
- setState(785);
+ setState(857);
match(Korder);
- setState(786);
+ setState(858);
match(Kby);
}
}
@@ -4691,11 +4739,11 @@ public final OrderByClauseContext orderByClause() throws RecognitionException {
case Kstable:
{
{
- setState(787);
+ setState(859);
((OrderByClauseContext)_localctx).stb = match(Kstable);
- setState(788);
+ setState(860);
match(Korder);
- setState(789);
+ setState(861);
match(Kby);
}
}
@@ -4703,21 +4751,21 @@ public final OrderByClauseContext orderByClause() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(792);
+ setState(864);
orderByExpr();
- setState(797);
+ setState(869);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__13) {
+ while (_la==T__12) {
{
{
- setState(793);
- match(T__13);
- setState(794);
+ setState(865);
+ match(T__12);
+ setState(866);
orderByExpr();
}
}
- setState(799);
+ setState(871);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -4770,24 +4818,24 @@ public final OrderByExprContext orderByExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(800);
+ setState(872);
((OrderByExprContext)_localctx).ex = exprSingle();
- setState(803);
+ setState(875);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kascending:
{
- setState(801);
+ setState(873);
match(Kascending);
}
break;
case Kdescending:
{
- setState(802);
+ setState(874);
((OrderByExprContext)_localctx).desc = match(Kdescending);
}
break;
- case T__13:
+ case T__12:
case Kfor:
case Klet:
case Kwhere:
@@ -4802,25 +4850,25 @@ public final OrderByExprContext orderByExpr() throws RecognitionException {
default:
break;
}
- setState(810);
+ setState(882);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kempty) {
{
- setState(805);
+ setState(877);
match(Kempty);
- setState(808);
+ setState(880);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kgreatest:
{
- setState(806);
+ setState(878);
((OrderByExprContext)_localctx).gr = match(Kgreatest);
}
break;
case Kleast:
{
- setState(807);
+ setState(879);
((OrderByExprContext)_localctx).ls = match(Kleast);
}
break;
@@ -4830,14 +4878,14 @@ public final OrderByExprContext orderByExpr() throws RecognitionException {
}
}
- setState(814);
+ setState(886);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kcollation) {
{
- setState(812);
+ setState(884);
match(Kcollation);
- setState(813);
+ setState(885);
((OrderByExprContext)_localctx).uril = uriLiteral();
}
}
@@ -4877,9 +4925,9 @@ public final CountClauseContext countClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(816);
+ setState(888);
match(Kcount);
- setState(817);
+ setState(889);
varRef();
}
}
@@ -4929,47 +4977,47 @@ public final QuantifiedExprContext quantifiedExpr() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(821);
+ setState(893);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Ksome:
{
- setState(819);
+ setState(891);
((QuantifiedExprContext)_localctx).so = match(Ksome);
}
break;
case Kevery:
{
- setState(820);
+ setState(892);
((QuantifiedExprContext)_localctx).ev = match(Kevery);
}
break;
default:
throw new NoViableAltException(this);
}
- setState(823);
+ setState(895);
((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar();
((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar);
- setState(828);
+ setState(900);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__13) {
+ while (_la==T__12) {
{
{
- setState(824);
- match(T__13);
- setState(825);
+ setState(896);
+ match(T__12);
+ setState(897);
((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar();
((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar);
}
}
- setState(830);
+ setState(902);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(831);
+ setState(903);
match(Ksatisfies);
- setState(832);
+ setState(904);
exprSingle();
}
}
@@ -5014,23 +5062,23 @@ public final QuantifiedExprVarContext quantifiedExprVar() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(834);
+ setState(906);
varRef();
- setState(837);
+ setState(909);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(835);
+ setState(907);
match(Kas);
- setState(836);
+ setState(908);
sequenceType();
}
}
- setState(839);
+ setState(911);
match(Kin);
- setState(840);
+ setState(912);
exprSingle();
}
}
@@ -5083,34 +5131,34 @@ public final SwitchExprContext switchExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(842);
+ setState(914);
match(Kswitch);
- setState(843);
- match(T__8);
- setState(844);
+ setState(915);
+ match(T__7);
+ setState(916);
((SwitchExprContext)_localctx).cond = expr();
- setState(845);
- match(T__9);
- setState(847);
+ setState(917);
+ match(T__8);
+ setState(919);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(846);
+ setState(918);
((SwitchExprContext)_localctx).switchCaseClause = switchCaseClause();
((SwitchExprContext)_localctx).cases.add(((SwitchExprContext)_localctx).switchCaseClause);
}
}
- setState(849);
+ setState(921);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( _la==Kcase );
- setState(851);
+ setState(923);
match(Kdefault);
- setState(852);
+ setState(924);
match(Kreturn);
- setState(853);
+ setState(925);
((SwitchExprContext)_localctx).def = exprSingle();
}
}
@@ -5158,26 +5206,26 @@ public final SwitchCaseClauseContext switchCaseClause() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(857);
+ setState(929);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(855);
+ setState(927);
match(Kcase);
- setState(856);
+ setState(928);
((SwitchCaseClauseContext)_localctx).exprSingle = exprSingle();
((SwitchCaseClauseContext)_localctx).cond.add(((SwitchCaseClauseContext)_localctx).exprSingle);
}
}
- setState(859);
+ setState(931);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( _la==Kcase );
- setState(861);
+ setState(933);
match(Kreturn);
- setState(862);
+ setState(934);
((SwitchCaseClauseContext)_localctx).ret = exprSingle();
}
}
@@ -5234,44 +5282,44 @@ public final TypeSwitchExprContext typeSwitchExpr() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(864);
+ setState(936);
match(Ktypeswitch);
- setState(865);
- match(T__8);
- setState(866);
+ setState(937);
+ match(T__7);
+ setState(938);
((TypeSwitchExprContext)_localctx).cond = expr();
- setState(867);
- match(T__9);
- setState(869);
+ setState(939);
+ match(T__8);
+ setState(941);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(868);
+ setState(940);
((TypeSwitchExprContext)_localctx).caseClause = caseClause();
((TypeSwitchExprContext)_localctx).cses.add(((TypeSwitchExprContext)_localctx).caseClause);
}
}
- setState(871);
+ setState(943);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( _la==Kcase );
- setState(873);
+ setState(945);
match(Kdefault);
- setState(875);
+ setState(947);
_errHandler.sync(this);
_la = _input.LA(1);
- if (_la==T__4) {
+ if (_la==T__3) {
{
- setState(874);
+ setState(946);
((TypeSwitchExprContext)_localctx).var_ref = varRef();
}
}
- setState(877);
+ setState(949);
match(Kreturn);
- setState(878);
+ setState(950);
((TypeSwitchExprContext)_localctx).def = exprSingle();
}
}
@@ -5324,43 +5372,43 @@ public final CaseClauseContext caseClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(880);
+ setState(952);
match(Kcase);
- setState(884);
+ setState(956);
_errHandler.sync(this);
_la = _input.LA(1);
- if (_la==T__4) {
+ if (_la==T__3) {
{
- setState(881);
+ setState(953);
((CaseClauseContext)_localctx).var_ref = varRef();
- setState(882);
+ setState(954);
match(Kas);
}
}
- setState(886);
+ setState(958);
((CaseClauseContext)_localctx).sequenceType = sequenceType();
((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType);
- setState(891);
+ setState(963);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__11) {
+ while (_la==T__10) {
{
{
- setState(887);
- match(T__11);
- setState(888);
+ setState(959);
+ match(T__10);
+ setState(960);
((CaseClauseContext)_localctx).sequenceType = sequenceType();
((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType);
}
}
- setState(893);
+ setState(965);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(894);
+ setState(966);
match(Kreturn);
- setState(895);
+ setState(967);
((CaseClauseContext)_localctx).ret = exprSingle();
}
}
@@ -5408,21 +5456,21 @@ public final IfExprContext ifExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(897);
+ setState(969);
match(Kif);
- setState(898);
- match(T__8);
- setState(899);
+ setState(970);
+ match(T__7);
+ setState(971);
((IfExprContext)_localctx).test_condition = expr();
- setState(900);
- match(T__9);
- setState(901);
+ setState(972);
+ match(T__8);
+ setState(973);
match(Kthen);
- setState(902);
+ setState(974);
((IfExprContext)_localctx).branch = exprSingle();
- setState(903);
+ setState(975);
match(Kelse);
- setState(904);
+ setState(976);
((IfExprContext)_localctx).else_branch = exprSingle();
}
}
@@ -5469,15 +5517,15 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(906);
+ setState(978);
match(Ktry);
- setState(907);
- match(T__6);
- setState(908);
+ setState(979);
+ match(T__5);
+ setState(980);
((TryCatchExprContext)_localctx).try_expression = expr();
- setState(909);
- match(T__7);
- setState(911);
+ setState(981);
+ match(T__6);
+ setState(983);
_errHandler.sync(this);
_alt = 1;
do {
@@ -5485,7 +5533,7 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException {
case 1:
{
{
- setState(910);
+ setState(982);
((TryCatchExprContext)_localctx).catchClause = catchClause();
((TryCatchExprContext)_localctx).catches.add(((TryCatchExprContext)_localctx).catchClause);
}
@@ -5494,7 +5542,7 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(913);
+ setState(985);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,81,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
@@ -5512,7 +5560,7 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException {
}
public static class CatchClauseContext extends ParserRuleContext {
- public Token s11;
+ public Token s10;
public List jokers = new ArrayList();
public QnameContext qname;
public List errors = new ArrayList();
@@ -5545,16 +5593,16 @@ public final CatchClauseContext catchClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(915);
+ setState(987);
match(Kcatch);
- setState(918);
+ setState(990);
_errHandler.sync(this);
switch (_input.LA(1)) {
- case T__10:
+ case T__9:
{
- setState(916);
- ((CatchClauseContext)_localctx).s11 = match(T__10);
- ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s11);
+ setState(988);
+ ((CatchClauseContext)_localctx).s10 = match(T__9);
+ ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s10);
}
break;
case Kfor:
@@ -5632,7 +5680,7 @@ public final CatchClauseContext catchClause() throws RecognitionException {
case NullLiteral:
case NCName:
{
- setState(917);
+ setState(989);
((CatchClauseContext)_localctx).qname = qname();
((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname);
}
@@ -5640,22 +5688,22 @@ public final CatchClauseContext catchClause() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(927);
+ setState(999);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__11) {
+ while (_la==T__10) {
{
{
- setState(920);
- match(T__11);
- setState(923);
+ setState(992);
+ match(T__10);
+ setState(995);
_errHandler.sync(this);
switch (_input.LA(1)) {
- case T__10:
+ case T__9:
{
- setState(921);
- ((CatchClauseContext)_localctx).s11 = match(T__10);
- ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s11);
+ setState(993);
+ ((CatchClauseContext)_localctx).s10 = match(T__9);
+ ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s10);
}
break;
case Kfor:
@@ -5733,7 +5781,7 @@ public final CatchClauseContext catchClause() throws RecognitionException {
case NullLiteral:
case NCName:
{
- setState(922);
+ setState(994);
((CatchClauseContext)_localctx).qname = qname();
((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname);
}
@@ -5743,16 +5791,16 @@ public final CatchClauseContext catchClause() throws RecognitionException {
}
}
}
- setState(929);
+ setState(1001);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(930);
- match(T__6);
- setState(931);
+ setState(1002);
+ match(T__5);
+ setState(1003);
((CatchClauseContext)_localctx).catch_expression = expr();
- setState(932);
- match(T__7);
+ setState(1004);
+ match(T__6);
}
}
catch (RecognitionException re) {
@@ -5798,24 +5846,24 @@ public final OrExprContext orExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(934);
+ setState(1006);
((OrExprContext)_localctx).main_expr = andExpr();
- setState(939);
+ setState(1011);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,85,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(935);
+ setState(1007);
match(Kor);
- setState(936);
+ setState(1008);
((OrExprContext)_localctx).andExpr = andExpr();
((OrExprContext)_localctx).rhs.add(((OrExprContext)_localctx).andExpr);
}
}
}
- setState(941);
+ setState(1013);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,85,_ctx);
}
@@ -5864,24 +5912,24 @@ public final AndExprContext andExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(942);
+ setState(1014);
((AndExprContext)_localctx).main_expr = notExpr();
- setState(947);
+ setState(1019);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,86,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(943);
+ setState(1015);
match(Kand);
- setState(944);
+ setState(1016);
((AndExprContext)_localctx).notExpr = notExpr();
((AndExprContext)_localctx).rhs.add(((AndExprContext)_localctx).notExpr);
}
}
}
- setState(949);
+ setState(1021);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,86,_ctx);
}
@@ -5923,18 +5971,18 @@ public final NotExprContext notExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(951);
+ setState(1023);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) {
case 1:
{
- setState(950);
+ setState(1022);
((NotExprContext)_localctx).Knot = match(Knot);
((NotExprContext)_localctx).op.add(((NotExprContext)_localctx).Knot);
}
break;
}
- setState(953);
+ setState(1025);
((NotExprContext)_localctx).main_expr = comparisonExpr();
}
}
@@ -5951,19 +5999,19 @@ public final NotExprContext notExpr() throws RecognitionException {
public static class ComparisonExprContext extends ParserRuleContext {
public StringConcatExprContext main_expr;
- public Token s36;
+ public Token s33;
public List op = new ArrayList();
+ public Token s34;
+ public Token s35;
+ public Token s36;
public Token s37;
public Token s38;
+ public Token s3;
public Token s39;
public Token s40;
public Token s41;
- public Token s4;
public Token s42;
public Token s43;
- public Token s44;
- public Token s45;
- public Token s46;
public Token _tset1828;
public StringConcatExprContext stringConcatExpr;
public List rhs = new ArrayList();
@@ -5991,17 +6039,17 @@ public final ComparisonExprContext comparisonExpr() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(955);
+ setState(1027);
((ComparisonExprContext)_localctx).main_expr = stringConcatExpr();
- setState(958);
+ setState(1030);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42))) != 0)) {
{
- setState(956);
+ setState(1028);
((ComparisonExprContext)_localctx)._tset1828 = _input.LT(1);
_la = _input.LA(1);
- if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45))) != 0)) ) {
+ if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42))) != 0)) ) {
((ComparisonExprContext)_localctx)._tset1828 = (Token)_errHandler.recoverInline(this);
}
else {
@@ -6010,7 +6058,7 @@ public final ComparisonExprContext comparisonExpr() throws RecognitionException
consume();
}
((ComparisonExprContext)_localctx).op.add(((ComparisonExprContext)_localctx)._tset1828);
- setState(957);
+ setState(1029);
((ComparisonExprContext)_localctx).stringConcatExpr = stringConcatExpr();
((ComparisonExprContext)_localctx).rhs.add(((ComparisonExprContext)_localctx).stringConcatExpr);
}
@@ -6057,22 +6105,22 @@ public final StringConcatExprContext stringConcatExpr() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(960);
+ setState(1032);
((StringConcatExprContext)_localctx).main_expr = rangeExpr();
- setState(965);
+ setState(1037);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__46) {
+ while (_la==T__43) {
{
{
- setState(961);
- match(T__46);
- setState(962);
+ setState(1033);
+ match(T__43);
+ setState(1034);
((StringConcatExprContext)_localctx).rangeExpr = rangeExpr();
((StringConcatExprContext)_localctx).rhs.add(((StringConcatExprContext)_localctx).rangeExpr);
}
}
- setState(967);
+ setState(1039);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -6117,16 +6165,16 @@ public final RangeExprContext rangeExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(968);
+ setState(1040);
((RangeExprContext)_localctx).main_expr = additiveExpr();
- setState(971);
+ setState(1043);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) {
case 1:
{
- setState(969);
+ setState(1041);
match(Kto);
- setState(970);
+ setState(1042);
((RangeExprContext)_localctx).additiveExpr = additiveExpr();
((RangeExprContext)_localctx).rhs.add(((RangeExprContext)_localctx).additiveExpr);
}
@@ -6147,9 +6195,9 @@ public final RangeExprContext rangeExpr() throws RecognitionException {
public static class AdditiveExprContext extends ParserRuleContext {
public MultiplicativeExprContext main_expr;
- public Token s48;
+ public Token s45;
public List op = new ArrayList();
- public Token s49;
+ public Token s46;
public Token _tset1937;
public MultiplicativeExprContext multiplicativeExpr;
public List rhs = new ArrayList();
@@ -6178,19 +6226,19 @@ public final AdditiveExprContext additiveExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(973);
+ setState(1045);
((AdditiveExprContext)_localctx).main_expr = multiplicativeExpr();
- setState(978);
+ setState(1050);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,91,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(974);
+ setState(1046);
((AdditiveExprContext)_localctx)._tset1937 = _input.LT(1);
_la = _input.LA(1);
- if ( !(_la==T__47 || _la==T__48) ) {
+ if ( !(_la==T__44 || _la==T__45) ) {
((AdditiveExprContext)_localctx)._tset1937 = (Token)_errHandler.recoverInline(this);
}
else {
@@ -6199,13 +6247,13 @@ public final AdditiveExprContext additiveExpr() throws RecognitionException {
consume();
}
((AdditiveExprContext)_localctx).op.add(((AdditiveExprContext)_localctx)._tset1937);
- setState(975);
+ setState(1047);
((AdditiveExprContext)_localctx).multiplicativeExpr = multiplicativeExpr();
((AdditiveExprContext)_localctx).rhs.add(((AdditiveExprContext)_localctx).multiplicativeExpr);
}
}
}
- setState(980);
+ setState(1052);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,91,_ctx);
}
@@ -6224,11 +6272,11 @@ public final AdditiveExprContext additiveExpr() throws RecognitionException {
public static class MultiplicativeExprContext extends ParserRuleContext {
public InstanceOfExprContext main_expr;
- public Token s11;
+ public Token s10;
public List op = new ArrayList();
- public Token s50;
- public Token s51;
- public Token s52;
+ public Token s47;
+ public Token s48;
+ public Token s49;
public Token _tset1965;
public InstanceOfExprContext instanceOfExpr;
public List rhs = new ArrayList();
@@ -6256,18 +6304,18 @@ public final MultiplicativeExprContext multiplicativeExpr() throws RecognitionEx
try {
enterOuterAlt(_localctx, 1);
{
- setState(981);
+ setState(1053);
((MultiplicativeExprContext)_localctx).main_expr = instanceOfExpr();
- setState(986);
+ setState(1058);
_errHandler.sync(this);
_la = _input.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__10) | (1L << T__49) | (1L << T__50) | (1L << T__51))) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) {
{
{
- setState(982);
+ setState(1054);
((MultiplicativeExprContext)_localctx)._tset1965 = _input.LT(1);
_la = _input.LA(1);
- if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__10) | (1L << T__49) | (1L << T__50) | (1L << T__51))) != 0)) ) {
+ if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) ) {
((MultiplicativeExprContext)_localctx)._tset1965 = (Token)_errHandler.recoverInline(this);
}
else {
@@ -6276,12 +6324,12 @@ public final MultiplicativeExprContext multiplicativeExpr() throws RecognitionEx
consume();
}
((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1965);
- setState(983);
+ setState(1055);
((MultiplicativeExprContext)_localctx).instanceOfExpr = instanceOfExpr();
((MultiplicativeExprContext)_localctx).rhs.add(((MultiplicativeExprContext)_localctx).instanceOfExpr);
}
}
- setState(988);
+ setState(1060);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -6326,18 +6374,18 @@ public final InstanceOfExprContext instanceOfExpr() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(989);
+ setState(1061);
((InstanceOfExprContext)_localctx).main_expr = isStaticallyExpr();
- setState(993);
+ setState(1065);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) {
case 1:
{
- setState(990);
+ setState(1062);
match(Kinstance);
- setState(991);
+ setState(1063);
match(Kof);
- setState(992);
+ setState(1064);
((InstanceOfExprContext)_localctx).seq = sequenceType();
}
break;
@@ -6383,18 +6431,18 @@ public final IsStaticallyExprContext isStaticallyExpr() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(995);
+ setState(1067);
((IsStaticallyExprContext)_localctx).main_expr = treatExpr();
- setState(999);
+ setState(1071);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) {
case 1:
{
- setState(996);
+ setState(1068);
match(Kis);
- setState(997);
+ setState(1069);
match(Kstatically);
- setState(998);
+ setState(1070);
((IsStaticallyExprContext)_localctx).seq = sequenceType();
}
break;
@@ -6440,18 +6488,18 @@ public final TreatExprContext treatExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1001);
+ setState(1073);
((TreatExprContext)_localctx).main_expr = castableExpr();
- setState(1005);
+ setState(1077);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) {
case 1:
{
- setState(1002);
+ setState(1074);
match(Ktreat);
- setState(1003);
+ setState(1075);
match(Kas);
- setState(1004);
+ setState(1076);
((TreatExprContext)_localctx).seq = sequenceType();
}
break;
@@ -6497,18 +6545,18 @@ public final CastableExprContext castableExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1007);
+ setState(1079);
((CastableExprContext)_localctx).main_expr = castExpr();
- setState(1011);
+ setState(1083);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) {
case 1:
{
- setState(1008);
+ setState(1080);
match(Kcastable);
- setState(1009);
+ setState(1081);
match(Kas);
- setState(1010);
+ setState(1082);
((CastableExprContext)_localctx).single = singleType();
}
break;
@@ -6554,18 +6602,18 @@ public final CastExprContext castExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1013);
+ setState(1085);
((CastExprContext)_localctx).main_expr = arrowExpr();
- setState(1017);
+ setState(1089);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) {
case 1:
{
- setState(1014);
+ setState(1086);
match(Kcast);
- setState(1015);
+ setState(1087);
match(Kas);
- setState(1016);
+ setState(1088);
((CastExprContext)_localctx).single = singleType();
}
break;
@@ -6622,9 +6670,9 @@ public final ArrowExprContext arrowExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1019);
+ setState(1091);
((ArrowExprContext)_localctx).main_expr = unaryExpr();
- setState(1028);
+ setState(1100);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,98,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
@@ -6632,21 +6680,21 @@ public final ArrowExprContext arrowExpr() throws RecognitionException {
{
{
{
- setState(1020);
- match(T__3);
- setState(1021);
- match(T__44);
+ setState(1092);
+ match(T__2);
+ setState(1093);
+ match(T__41);
}
- setState(1023);
+ setState(1095);
((ArrowExprContext)_localctx).arrowFunctionSpecifier = arrowFunctionSpecifier();
((ArrowExprContext)_localctx).function.add(((ArrowExprContext)_localctx).arrowFunctionSpecifier);
- setState(1024);
+ setState(1096);
((ArrowExprContext)_localctx).argumentList = argumentList();
((ArrowExprContext)_localctx).arguments.add(((ArrowExprContext)_localctx).argumentList);
}
}
}
- setState(1030);
+ setState(1102);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,98,_ctx);
}
@@ -6688,7 +6736,7 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog
ArrowFunctionSpecifierContext _localctx = new ArrowFunctionSpecifierContext(_ctx, getState());
enterRule(_localctx, 166, RULE_arrowFunctionSpecifier);
try {
- setState(1034);
+ setState(1106);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kfor:
@@ -6767,21 +6815,21 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog
case NCName:
enterOuterAlt(_localctx, 1);
{
- setState(1031);
+ setState(1103);
qname();
}
break;
- case T__4:
+ case T__3:
enterOuterAlt(_localctx, 2);
{
- setState(1032);
+ setState(1104);
varRef();
}
break;
- case T__8:
+ case T__7:
enterOuterAlt(_localctx, 3);
{
- setState(1033);
+ setState(1105);
parenthesizedExpr();
}
break;
@@ -6801,9 +6849,9 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog
}
public static class UnaryExprContext extends ParserRuleContext {
- public Token s49;
+ public Token s46;
public List op = new ArrayList();
- public Token s48;
+ public Token s45;
public Token _tset2144;
public ValueExprContext main_expr;
public ValueExprContext valueExpr() {
@@ -6827,16 +6875,16 @@ public final UnaryExprContext unaryExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1039);
+ setState(1111);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__47 || _la==T__48) {
+ while (_la==T__44 || _la==T__45) {
{
{
- setState(1036);
+ setState(1108);
((UnaryExprContext)_localctx)._tset2144 = _input.LT(1);
_la = _input.LA(1);
- if ( !(_la==T__47 || _la==T__48) ) {
+ if ( !(_la==T__44 || _la==T__45) ) {
((UnaryExprContext)_localctx)._tset2144 = (Token)_errHandler.recoverInline(this);
}
else {
@@ -6847,11 +6895,11 @@ public final UnaryExprContext unaryExpr() throws RecognitionException {
((UnaryExprContext)_localctx).op.add(((UnaryExprContext)_localctx)._tset2144);
}
}
- setState(1041);
+ setState(1113);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1042);
+ setState(1114);
((UnaryExprContext)_localctx).main_expr = valueExpr();
}
}
@@ -6894,27 +6942,27 @@ public final ValueExprContext valueExpr() throws RecognitionException {
ValueExprContext _localctx = new ValueExprContext(_ctx, getState());
enterRule(_localctx, 170, RULE_valueExpr);
try {
- setState(1047);
+ setState(1119);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1044);
+ setState(1116);
((ValueExprContext)_localctx).simpleMap_expr = simpleMapExpr();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1045);
+ setState(1117);
((ValueExprContext)_localctx).validate_expr = validateExpr();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1046);
+ setState(1118);
((ValueExprContext)_localctx).annotate_expr = annotateExpr();
}
break;
@@ -6957,18 +7005,18 @@ public final ValidateExprContext validateExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1049);
+ setState(1121);
match(Kvalidate);
- setState(1050);
+ setState(1122);
match(Ktype);
- setState(1051);
+ setState(1123);
sequenceType();
- setState(1052);
- match(T__6);
- setState(1053);
+ setState(1124);
+ match(T__5);
+ setState(1125);
expr();
- setState(1054);
- match(T__7);
+ setState(1126);
+ match(T__6);
}
}
catch (RecognitionException re) {
@@ -7008,18 +7056,18 @@ public final AnnotateExprContext annotateExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1056);
+ setState(1128);
match(Kannotate);
- setState(1057);
+ setState(1129);
match(Ktype);
- setState(1058);
+ setState(1130);
sequenceType();
- setState(1059);
- match(T__6);
- setState(1060);
+ setState(1131);
+ match(T__5);
+ setState(1132);
expr();
- setState(1061);
- match(T__7);
+ setState(1133);
+ match(T__6);
}
}
catch (RecognitionException re) {
@@ -7034,14 +7082,14 @@ public final AnnotateExprContext annotateExpr() throws RecognitionException {
}
public static class SimpleMapExprContext extends ParserRuleContext {
- public PostFixExprContext main_expr;
- public PostFixExprContext postFixExpr;
- public List map_expr = new ArrayList();
- public List postFixExpr() {
- return getRuleContexts(PostFixExprContext.class);
+ public PathExprContext main_expr;
+ public PathExprContext pathExpr;
+ public List map_expr = new ArrayList();
+ public List pathExpr() {
+ return getRuleContexts(PathExprContext.class);
}
- public PostFixExprContext postFixExpr(int i) {
- return getRuleContext(PostFixExprContext.class,i);
+ public PathExprContext pathExpr(int i) {
+ return getRuleContext(PathExprContext.class,i);
}
public SimpleMapExprContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
@@ -7061,22 +7109,22 @@ public final SimpleMapExprContext simpleMapExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1063);
- ((SimpleMapExprContext)_localctx).main_expr = postFixExpr();
- setState(1068);
+ setState(1135);
+ ((SimpleMapExprContext)_localctx).main_expr = pathExpr();
+ setState(1140);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__52) {
+ while (_la==T__49) {
{
{
- setState(1064);
- match(T__52);
- setState(1065);
- ((SimpleMapExprContext)_localctx).postFixExpr = postFixExpr();
- ((SimpleMapExprContext)_localctx).map_expr.add(((SimpleMapExprContext)_localctx).postFixExpr);
+ setState(1136);
+ match(T__49);
+ setState(1137);
+ ((SimpleMapExprContext)_localctx).pathExpr = pathExpr();
+ ((SimpleMapExprContext)_localctx).map_expr.add(((SimpleMapExprContext)_localctx).pathExpr);
}
}
- setState(1070);
+ setState(1142);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -7146,51 +7194,51 @@ public final PostFixExprContext postFixExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1071);
+ setState(1143);
((PostFixExprContext)_localctx).main_expr = primaryExpr();
- setState(1079);
+ setState(1151);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,104,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
- setState(1077);
+ setState(1149);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) {
case 1:
{
- setState(1072);
+ setState(1144);
arrayLookup();
}
break;
case 2:
{
- setState(1073);
+ setState(1145);
predicate();
}
break;
case 3:
{
- setState(1074);
+ setState(1146);
objectLookup();
}
break;
case 4:
{
- setState(1075);
+ setState(1147);
arrayUnboxing();
}
break;
case 5:
{
- setState(1076);
+ setState(1148);
argumentList();
}
break;
}
}
}
- setState(1081);
+ setState(1153);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,104,_ctx);
}
@@ -7228,16 +7276,16 @@ public final ArrayLookupContext arrayLookup() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1082);
- match(T__53);
- setState(1083);
- match(T__53);
- setState(1084);
+ setState(1154);
+ match(T__50);
+ setState(1155);
+ match(T__50);
+ setState(1156);
expr();
- setState(1085);
- match(T__54);
- setState(1086);
- match(T__54);
+ setState(1157);
+ match(T__51);
+ setState(1158);
+ match(T__51);
}
}
catch (RecognitionException re) {
@@ -7269,10 +7317,10 @@ public final ArrayUnboxingContext arrayUnboxing() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1088);
- match(T__53);
- setState(1089);
- match(T__54);
+ setState(1160);
+ match(T__50);
+ setState(1161);
+ match(T__51);
}
}
catch (RecognitionException re) {
@@ -7307,12 +7355,12 @@ public final PredicateContext predicate() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1091);
- match(T__53);
- setState(1092);
+ setState(1163);
+ match(T__50);
+ setState(1164);
expr();
- setState(1093);
- match(T__54);
+ setState(1165);
+ match(T__51);
}
}
catch (RecognitionException re) {
@@ -7366,9 +7414,9 @@ public final ObjectLookupContext objectLookup() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1095);
- match(T__55);
- setState(1102);
+ setState(1167);
+ match(T__52);
+ setState(1174);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kfor:
@@ -7445,37 +7493,37 @@ public final ObjectLookupContext objectLookup() throws RecognitionException {
case Kwhile:
case NullLiteral:
{
- setState(1096);
+ setState(1168);
((ObjectLookupContext)_localctx).kw = keyWords();
}
break;
case STRING:
{
- setState(1097);
+ setState(1169);
((ObjectLookupContext)_localctx).lt = stringLiteral();
}
break;
case NCName:
{
- setState(1098);
+ setState(1170);
((ObjectLookupContext)_localctx).nc = match(NCName);
}
break;
- case T__8:
+ case T__7:
{
- setState(1099);
+ setState(1171);
((ObjectLookupContext)_localctx).pe = parenthesizedExpr();
}
break;
- case T__4:
+ case T__3:
{
- setState(1100);
+ setState(1172);
((ObjectLookupContext)_localctx).vr = varRef();
}
break;
- case T__56:
+ case T__53:
{
- setState(1101);
+ setState(1173);
((ObjectLookupContext)_localctx).ci = contextItemExpr();
}
break;
@@ -7548,111 +7596,111 @@ public final PrimaryExprContext primaryExpr() throws RecognitionException {
PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, getState());
enterRule(_localctx, 188, RULE_primaryExpr);
try {
- setState(1119);
+ setState(1191);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1104);
+ setState(1176);
match(NullLiteral);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1105);
+ setState(1177);
match(Ktrue);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1106);
+ setState(1178);
match(Kfalse);
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1107);
+ setState(1179);
match(Literal);
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(1108);
+ setState(1180);
stringLiteral();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(1109);
+ setState(1181);
varRef();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(1110);
+ setState(1182);
parenthesizedExpr();
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(1111);
+ setState(1183);
contextItemExpr();
}
break;
case 9:
enterOuterAlt(_localctx, 9);
{
- setState(1112);
+ setState(1184);
objectConstructor();
}
break;
case 10:
enterOuterAlt(_localctx, 10);
{
- setState(1113);
+ setState(1185);
functionCall();
}
break;
case 11:
enterOuterAlt(_localctx, 11);
{
- setState(1114);
+ setState(1186);
orderedExpr();
}
break;
case 12:
enterOuterAlt(_localctx, 12);
{
- setState(1115);
+ setState(1187);
unorderedExpr();
}
break;
case 13:
enterOuterAlt(_localctx, 13);
{
- setState(1116);
+ setState(1188);
arrayConstructor();
}
break;
case 14:
enterOuterAlt(_localctx, 14);
{
- setState(1117);
+ setState(1189);
functionItemExpr();
}
break;
case 15:
enterOuterAlt(_localctx, 15);
{
- setState(1118);
+ setState(1190);
blockExpr();
}
break;
@@ -7690,12 +7738,12 @@ public final BlockExprContext blockExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1121);
- match(T__6);
- setState(1122);
+ setState(1193);
+ match(T__5);
+ setState(1194);
statementsAndExpr();
- setState(1123);
- match(T__7);
+ setState(1195);
+ match(T__6);
}
}
catch (RecognitionException re) {
@@ -7731,9 +7779,9 @@ public final VarRefContext varRef() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1125);
- match(T__4);
- setState(1126);
+ setState(1197);
+ match(T__3);
+ setState(1198);
((VarRefContext)_localctx).var_name = qname();
}
}
@@ -7770,20 +7818,20 @@ public final ParenthesizedExprContext parenthesizedExpr() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(1128);
- match(T__8);
- setState(1130);
+ setState(1200);
+ match(T__7);
+ setState(1202);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) {
{
- setState(1129);
+ setState(1201);
expr();
}
}
- setState(1132);
- match(T__9);
+ setState(1204);
+ match(T__8);
}
}
catch (RecognitionException re) {
@@ -7815,8 +7863,8 @@ public final ContextItemExprContext contextItemExpr() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(1134);
- match(T__56);
+ setState(1206);
+ match(T__53);
}
}
catch (RecognitionException re) {
@@ -7851,14 +7899,14 @@ public final OrderedExprContext orderedExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1136);
- match(T__15);
- setState(1137);
- match(T__6);
- setState(1138);
+ setState(1208);
+ match(T__14);
+ setState(1209);
+ match(T__5);
+ setState(1210);
expr();
- setState(1139);
- match(T__7);
+ setState(1211);
+ match(T__6);
}
}
catch (RecognitionException re) {
@@ -7894,14 +7942,14 @@ public final UnorderedExprContext unorderedExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1141);
+ setState(1213);
match(Kunordered);
- setState(1142);
- match(T__6);
- setState(1143);
+ setState(1214);
+ match(T__5);
+ setState(1215);
expr();
- setState(1144);
- match(T__7);
+ setState(1216);
+ match(T__6);
}
}
catch (RecognitionException re) {
@@ -7940,9 +7988,9 @@ public final FunctionCallContext functionCall() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1146);
+ setState(1218);
((FunctionCallContext)_localctx).fn_name = qname();
- setState(1147);
+ setState(1219);
argumentList();
}
}
@@ -7984,35 +8032,35 @@ public final ArgumentListContext argumentList() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1149);
- match(T__8);
- setState(1156);
+ setState(1221);
+ match(T__7);
+ setState(1228);
_errHandler.sync(this);
_la = _input.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (ArgumentPlaceholder - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (ArgumentPlaceholder - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) {
{
{
- setState(1150);
+ setState(1222);
((ArgumentListContext)_localctx).argument = argument();
((ArgumentListContext)_localctx).args.add(((ArgumentListContext)_localctx).argument);
- setState(1152);
+ setState(1224);
_errHandler.sync(this);
_la = _input.LA(1);
- if (_la==T__13) {
+ if (_la==T__12) {
{
- setState(1151);
- match(T__13);
+ setState(1223);
+ match(T__12);
}
}
}
}
- setState(1158);
+ setState(1230);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1159);
- match(T__9);
+ setState(1231);
+ match(T__8);
}
}
catch (RecognitionException re) {
@@ -8046,20 +8094,21 @@ public final ArgumentContext argument() throws RecognitionException {
ArgumentContext _localctx = new ArgumentContext(_ctx, getState());
enterRule(_localctx, 206, RULE_argument);
try {
- setState(1163);
+ setState(1235);
_errHandler.sync(this);
switch (_input.LA(1)) {
- case T__4:
- case T__6:
- case T__8:
- case T__12:
- case T__15:
- case T__30:
- case T__47:
- case T__48:
+ case T__3:
+ case T__5:
+ case T__7:
+ case T__11:
+ case T__14:
+ case T__28:
+ case T__44:
+ case T__45:
+ case T__50:
case T__53:
+ case T__55:
case T__56:
- case T__58:
case Kfor:
case Klet:
case Kwhere:
@@ -8126,6 +8175,21 @@ public final ArgumentContext argument() throws RecognitionException {
case Kjson:
case Kwith:
case Kposition:
+ case Kslash:
+ case Kdslash:
+ case Kat_symbol:
+ case Kchild:
+ case Kdescendant:
+ case Kattribute:
+ case Kself:
+ case Kdescendant_or_self:
+ case Kfollowing_sibling:
+ case Kfollowing:
+ case Kparent:
+ case Kancestor:
+ case Kpreceding_sibling:
+ case Kpreceding:
+ case Kancestor_or_self:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -8138,14 +8202,14 @@ public final ArgumentContext argument() throws RecognitionException {
case NCName:
enterOuterAlt(_localctx, 1);
{
- setState(1161);
+ setState(1233);
exprSingle();
}
break;
case ArgumentPlaceholder:
enterOuterAlt(_localctx, 2);
{
- setState(1162);
+ setState(1234);
match(ArgumentPlaceholder);
}
break;
@@ -8186,7 +8250,7 @@ public final FunctionItemExprContext functionItemExpr() throws RecognitionExcept
FunctionItemExprContext _localctx = new FunctionItemExprContext(_ctx, getState());
enterRule(_localctx, 208, RULE_functionItemExpr);
try {
- setState(1167);
+ setState(1239);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kfor:
@@ -8265,15 +8329,15 @@ public final FunctionItemExprContext functionItemExpr() throws RecognitionExcept
case NCName:
enterOuterAlt(_localctx, 1);
{
- setState(1165);
+ setState(1237);
namedFunctionRef();
}
break;
- case T__12:
- case T__30:
+ case T__11:
+ case T__28:
enterOuterAlt(_localctx, 2);
{
- setState(1166);
+ setState(1238);
inlineFunctionExpr();
}
break;
@@ -8316,11 +8380,11 @@ public final NamedFunctionRefContext namedFunctionRef() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(1169);
+ setState(1241);
((NamedFunctionRefContext)_localctx).fn_name = qname();
- setState(1170);
- match(T__57);
- setState(1171);
+ setState(1242);
+ match(T__54);
+ setState(1243);
((NamedFunctionRefContext)_localctx).arity = match(Literal);
}
}
@@ -8369,45 +8433,45 @@ public final InlineFunctionExprContext inlineFunctionExpr() throws RecognitionEx
try {
enterOuterAlt(_localctx, 1);
{
- setState(1173);
+ setState(1245);
annotations();
- setState(1174);
- match(T__30);
- setState(1175);
- match(T__8);
- setState(1177);
+ setState(1246);
+ match(T__28);
+ setState(1247);
+ match(T__7);
+ setState(1249);
_errHandler.sync(this);
_la = _input.LA(1);
- if (_la==T__4) {
+ if (_la==T__3) {
{
- setState(1176);
+ setState(1248);
paramList();
}
}
- setState(1179);
- match(T__9);
- setState(1182);
+ setState(1251);
+ match(T__8);
+ setState(1254);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(1180);
+ setState(1252);
match(Kas);
- setState(1181);
+ setState(1253);
((InlineFunctionExprContext)_localctx).return_type = sequenceType();
}
}
{
- setState(1184);
- match(T__6);
+ setState(1256);
+ match(T__5);
{
- setState(1185);
+ setState(1257);
((InlineFunctionExprContext)_localctx).fn_body = statementsAndOptionalExpr();
}
- setState(1186);
- match(T__7);
+ setState(1258);
+ match(T__6);
}
}
}
@@ -8459,32 +8523,32 @@ public final InsertExprContext insertExpr() throws RecognitionException {
enterRule(_localctx, 214, RULE_insertExpr);
int _la;
try {
- setState(1211);
+ setState(1283);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1188);
+ setState(1260);
match(Kinsert);
- setState(1189);
+ setState(1261);
match(Kjson);
- setState(1190);
+ setState(1262);
((InsertExprContext)_localctx).to_insert_expr = exprSingle();
- setState(1191);
+ setState(1263);
match(Kinto);
- setState(1192);
+ setState(1264);
((InsertExprContext)_localctx).main_expr = exprSingle();
- setState(1196);
+ setState(1268);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) {
case 1:
{
- setState(1193);
+ setState(1265);
match(Kat);
- setState(1194);
+ setState(1266);
match(Kposition);
- setState(1195);
+ setState(1267);
((InsertExprContext)_localctx).pos_expr = exprSingle();
}
break;
@@ -8494,31 +8558,31 @@ public final InsertExprContext insertExpr() throws RecognitionException {
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1198);
+ setState(1270);
match(Kinsert);
- setState(1199);
+ setState(1271);
match(Kjson);
- setState(1200);
+ setState(1272);
pairConstructor();
- setState(1205);
+ setState(1277);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__13) {
+ while (_la==T__12) {
{
{
- setState(1201);
- match(T__13);
- setState(1202);
+ setState(1273);
+ match(T__12);
+ setState(1274);
pairConstructor();
}
}
- setState(1207);
+ setState(1279);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1208);
+ setState(1280);
match(Kinto);
- setState(1209);
+ setState(1281);
((InsertExprContext)_localctx).main_expr = exprSingle();
}
break;
@@ -8558,11 +8622,11 @@ public final DeleteExprContext deleteExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1213);
+ setState(1285);
match(Kdelete);
- setState(1214);
+ setState(1286);
match(Kjson);
- setState(1215);
+ setState(1287);
updateLocator();
}
}
@@ -8605,15 +8669,15 @@ public final RenameExprContext renameExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1217);
+ setState(1289);
match(Krename);
- setState(1218);
+ setState(1290);
match(Kjson);
- setState(1219);
+ setState(1291);
updateLocator();
- setState(1220);
+ setState(1292);
match(Kas);
- setState(1221);
+ setState(1293);
((RenameExprContext)_localctx).name_expr = exprSingle();
}
}
@@ -8658,19 +8722,19 @@ public final ReplaceExprContext replaceExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1223);
+ setState(1295);
match(Kreplace);
- setState(1224);
+ setState(1296);
match(Kvalue);
- setState(1225);
+ setState(1297);
match(Kof);
- setState(1226);
+ setState(1298);
match(Kjson);
- setState(1227);
+ setState(1299);
updateLocator();
- setState(1228);
+ setState(1300);
match(Kwith);
- setState(1229);
+ setState(1301);
((ReplaceExprContext)_localctx).replacer_expr = exprSingle();
}
}
@@ -8721,33 +8785,33 @@ public final TransformExprContext transformExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1231);
+ setState(1303);
match(Kcopy);
- setState(1232);
+ setState(1304);
copyDecl();
- setState(1237);
+ setState(1309);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__13) {
+ while (_la==T__12) {
{
{
- setState(1233);
- match(T__13);
- setState(1234);
+ setState(1305);
+ match(T__12);
+ setState(1306);
copyDecl();
}
}
- setState(1239);
+ setState(1311);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1240);
+ setState(1312);
match(Kmodify);
- setState(1241);
+ setState(1313);
((TransformExprContext)_localctx).mod_expr = exprSingle();
- setState(1242);
+ setState(1314);
match(Kreturn);
- setState(1243);
+ setState(1315);
((TransformExprContext)_localctx).ret_expr = exprSingle();
}
}
@@ -8791,15 +8855,15 @@ public final AppendExprContext appendExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1245);
+ setState(1317);
match(Kappend);
- setState(1246);
+ setState(1318);
match(Kjson);
- setState(1247);
+ setState(1319);
((AppendExprContext)_localctx).to_append_expr = exprSingle();
- setState(1248);
+ setState(1320);
match(Kinto);
- setState(1249);
+ setState(1321);
((AppendExprContext)_localctx).array_expr = exprSingle();
}
}
@@ -8849,27 +8913,27 @@ public final UpdateLocatorContext updateLocator() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1251);
+ setState(1323);
((UpdateLocatorContext)_localctx).main_expr = primaryExpr();
- setState(1254);
+ setState(1326);
_errHandler.sync(this);
_alt = 1;
do {
switch (_alt) {
case 1:
{
- setState(1254);
+ setState(1326);
_errHandler.sync(this);
switch (_input.LA(1)) {
- case T__53:
+ case T__50:
{
- setState(1252);
+ setState(1324);
arrayLookup();
}
break;
- case T__55:
+ case T__52:
{
- setState(1253);
+ setState(1325);
objectLookup();
}
break;
@@ -8881,7 +8945,7 @@ public final UpdateLocatorContext updateLocator() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(1256);
+ setState(1328);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,119,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
@@ -8924,11 +8988,11 @@ public final CopyDeclContext copyDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1258);
+ setState(1330);
((CopyDeclContext)_localctx).var_ref = varRef();
- setState(1259);
- match(T__5);
- setState(1260);
+ setState(1331);
+ match(T__4);
+ setState(1332);
((CopyDeclContext)_localctx).src_expr = exprSingle();
}
}
@@ -8943,46 +9007,73 @@ public final CopyDeclContext copyDecl() throws RecognitionException {
return _localctx;
}
- public static class SequenceTypeContext extends ParserRuleContext {
- public ItemTypeContext item;
- public Token s134;
- public List question = new ArrayList();
- public Token s11;
- public List star = new ArrayList();
- public Token s48;
- public List plus = new ArrayList();
- public ItemTypeContext itemType() {
- return getRuleContext(ItemTypeContext.class,0);
+ public static class PathExprContext extends ParserRuleContext {
+ public RelativePathExprContext singleslash;
+ public RelativePathExprContext doubleslash;
+ public RelativePathExprContext relative;
+ public TerminalNode Kslash() { return getToken(JsoniqParser.Kslash, 0); }
+ public RelativePathExprContext relativePathExpr() {
+ return getRuleContext(RelativePathExprContext.class,0);
}
- public TerminalNode ArgumentPlaceholder() { return getToken(JsoniqParser.ArgumentPlaceholder, 0); }
- public SequenceTypeContext(ParserRuleContext parent, int invokingState) {
+ public TerminalNode Kdslash() { return getToken(JsoniqParser.Kdslash, 0); }
+ public PathExprContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
- @Override public int getRuleIndex() { return RULE_sequenceType; }
+ @Override public int getRuleIndex() { return RULE_pathExpr; }
@Override
public T accept(ParseTreeVisitor extends T> visitor) {
- if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitSequenceType(this);
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitPathExpr(this);
else return visitor.visitChildren(this);
}
}
- public final SequenceTypeContext sequenceType() throws RecognitionException {
- SequenceTypeContext _localctx = new SequenceTypeContext(_ctx, getState());
- enterRule(_localctx, 230, RULE_sequenceType);
+ public final PathExprContext pathExpr() throws RecognitionException {
+ PathExprContext _localctx = new PathExprContext(_ctx, getState());
+ enterRule(_localctx, 230, RULE_pathExpr);
try {
- setState(1270);
+ setState(1341);
_errHandler.sync(this);
switch (_input.LA(1)) {
- case T__8:
+ case Kslash:
enterOuterAlt(_localctx, 1);
{
- setState(1262);
- match(T__8);
- setState(1263);
- match(T__9);
+ {
+ setState(1334);
+ match(Kslash);
+ setState(1336);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) {
+ case 1:
+ {
+ setState(1335);
+ ((PathExprContext)_localctx).singleslash = relativePathExpr();
+ }
+ break;
+ }
+ }
+ }
+ break;
+ case Kdslash:
+ enterOuterAlt(_localctx, 2);
+ {
+ {
+ setState(1338);
+ match(Kdslash);
+ setState(1339);
+ ((PathExprContext)_localctx).doubleslash = relativePathExpr();
+ }
}
break;
- case T__30:
+ case T__3:
+ case T__5:
+ case T__7:
+ case T__11:
+ case T__14:
+ case T__28:
+ case T__50:
+ case T__53:
+ case T__55:
+ case T__56:
case Kfor:
case Klet:
case Kwhere:
@@ -9049,43 +9140,33 @@ public final SequenceTypeContext sequenceType() throws RecognitionException {
case Kjson:
case Kwith:
case Kposition:
+ case Kat_symbol:
+ case Kchild:
+ case Kdescendant:
+ case Kattribute:
+ case Kself:
+ case Kdescendant_or_self:
+ case Kfollowing_sibling:
+ case Kfollowing:
+ case Kparent:
+ case Kancestor:
+ case Kpreceding_sibling:
+ case Kpreceding:
+ case Kancestor_or_self:
case Kbreak:
case Kloop:
case Kcontinue:
case Kexit:
case Kreturning:
case Kwhile:
+ case STRING:
case NullLiteral:
+ case Literal:
case NCName:
- enterOuterAlt(_localctx, 2);
+ enterOuterAlt(_localctx, 3);
{
- setState(1264);
- ((SequenceTypeContext)_localctx).item = itemType();
- setState(1268);
- _errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) {
- case 1:
- {
- setState(1265);
- ((SequenceTypeContext)_localctx).s134 = match(ArgumentPlaceholder);
- ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s134);
- }
- break;
- case 2:
- {
- setState(1266);
- ((SequenceTypeContext)_localctx).s11 = match(T__10);
- ((SequenceTypeContext)_localctx).star.add(((SequenceTypeContext)_localctx).s11);
- }
- break;
- case 3:
- {
- setState(1267);
- ((SequenceTypeContext)_localctx).s48 = match(T__47);
- ((SequenceTypeContext)_localctx).plus.add(((SequenceTypeContext)_localctx).s48);
- }
- break;
- }
+ setState(1340);
+ ((PathExprContext)_localctx).relative = relativePathExpr();
}
break;
default:
@@ -9103,83 +9184,2419 @@ public final SequenceTypeContext sequenceType() throws RecognitionException {
return _localctx;
}
- public static class ObjectConstructorContext extends ParserRuleContext {
- public Token s59;
- public List merge_operator = new ArrayList();
- public List pairConstructor() {
- return getRuleContexts(PairConstructorContext.class);
+ public static class RelativePathExprContext extends ParserRuleContext {
+ public Token Kslash;
+ public List sep = new ArrayList();
+ public Token Kdslash;
+ public Token _tset2808;
+ public List stepExpr() {
+ return getRuleContexts(StepExprContext.class);
}
- public PairConstructorContext pairConstructor(int i) {
- return getRuleContext(PairConstructorContext.class,i);
+ public StepExprContext stepExpr(int i) {
+ return getRuleContext(StepExprContext.class,i);
}
- public ExprContext expr() {
- return getRuleContext(ExprContext.class,0);
+ public List Kslash() { return getTokens(JsoniqParser.Kslash); }
+ public TerminalNode Kslash(int i) {
+ return getToken(JsoniqParser.Kslash, i);
}
- public ObjectConstructorContext(ParserRuleContext parent, int invokingState) {
+ public List Kdslash() { return getTokens(JsoniqParser.Kdslash); }
+ public TerminalNode Kdslash(int i) {
+ return getToken(JsoniqParser.Kdslash, i);
+ }
+ public RelativePathExprContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
- @Override public int getRuleIndex() { return RULE_objectConstructor; }
+ @Override public int getRuleIndex() { return RULE_relativePathExpr; }
@Override
public T accept(ParseTreeVisitor extends T> visitor) {
- if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitObjectConstructor(this);
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitRelativePathExpr(this);
else return visitor.visitChildren(this);
}
}
- public final ObjectConstructorContext objectConstructor() throws RecognitionException {
- ObjectConstructorContext _localctx = new ObjectConstructorContext(_ctx, getState());
- enterRule(_localctx, 232, RULE_objectConstructor);
+ public final RelativePathExprContext relativePathExpr() throws RecognitionException {
+ RelativePathExprContext _localctx = new RelativePathExprContext(_ctx, getState());
+ enterRule(_localctx, 232, RULE_relativePathExpr);
int _la;
try {
- setState(1288);
+ int _alt;
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1343);
+ stepExpr();
+ setState(1348);
_errHandler.sync(this);
- switch (_input.LA(1)) {
- case T__6:
- enterOuterAlt(_localctx, 1);
- {
- setState(1272);
- match(T__6);
- setState(1281);
- _errHandler.sync(this);
- _la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) {
+ _alt = getInterpreter().adaptivePredict(_input,122,_ctx);
+ while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+ if ( _alt==1 ) {
{
- setState(1273);
- pairConstructor();
- setState(1278);
- _errHandler.sync(this);
+ {
+ setState(1344);
+ ((RelativePathExprContext)_localctx)._tset2808 = _input.LT(1);
_la = _input.LA(1);
- while (_la==T__13) {
- {
- {
- setState(1274);
- match(T__13);
- setState(1275);
- pairConstructor();
- }
- }
- setState(1280);
- _errHandler.sync(this);
- _la = _input.LA(1);
+ if ( !(_la==Kslash || _la==Kdslash) ) {
+ ((RelativePathExprContext)_localctx)._tset2808 = (Token)_errHandler.recoverInline(this);
}
+ else {
+ if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+ _errHandler.reportMatch(this);
+ consume();
}
+ ((RelativePathExprContext)_localctx).sep.add(((RelativePathExprContext)_localctx)._tset2808);
+ setState(1345);
+ stepExpr();
+ }
+ }
+ }
+ setState(1350);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,122,_ctx);
+ }
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class StepExprContext extends ParserRuleContext {
+ public PostFixExprContext postFixExpr() {
+ return getRuleContext(PostFixExprContext.class,0);
+ }
+ public AxisStepContext axisStep() {
+ return getRuleContext(AxisStepContext.class,0);
+ }
+ public StepExprContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_stepExpr; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitStepExpr(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final StepExprContext stepExpr() throws RecognitionException {
+ StepExprContext _localctx = new StepExprContext(_ctx, getState());
+ enterRule(_localctx, 234, RULE_stepExpr);
+ try {
+ setState(1353);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case T__3:
+ case T__5:
+ case T__7:
+ case T__11:
+ case T__14:
+ case T__28:
+ case T__50:
+ case T__53:
+ case T__56:
+ case Kfor:
+ case Klet:
+ case Kwhere:
+ case Kgroup:
+ case Kby:
+ case Korder:
+ case Kreturn:
+ case Kif:
+ case Kin:
+ case Kas:
+ case Kat:
+ case Kallowing:
+ case Kempty:
+ case Kcount:
+ case Kstable:
+ case Kascending:
+ case Kdescending:
+ case Ksome:
+ case Kevery:
+ case Ksatisfies:
+ case Kcollation:
+ case Kgreatest:
+ case Kleast:
+ case Kswitch:
+ case Kcase:
+ case Ktry:
+ case Kcatch:
+ case Kdefault:
+ case Kthen:
+ case Kelse:
+ case Ktypeswitch:
+ case Kor:
+ case Kand:
+ case Knot:
+ case Kto:
+ case Kinstance:
+ case Kof:
+ case Kstatically:
+ case Kis:
+ case Ktreat:
+ case Kcast:
+ case Kcastable:
+ case Kversion:
+ case Kjsoniq:
+ case Kunordered:
+ case Ktrue:
+ case Kfalse:
+ case Ktype:
+ case Kvalidate:
+ case Kannotate:
+ case Kdeclare:
+ case Kcontext:
+ case Kitem:
+ case Kvariable:
+ case Kinsert:
+ case Kdelete:
+ case Krename:
+ case Kreplace:
+ case Kcopy:
+ case Kmodify:
+ case Kappend:
+ case Kinto:
+ case Kvalue:
+ case Kjson:
+ case Kwith:
+ case Kposition:
+ case Kbreak:
+ case Kloop:
+ case Kcontinue:
+ case Kexit:
+ case Kreturning:
+ case Kwhile:
+ case STRING:
+ case NullLiteral:
+ case Literal:
+ case NCName:
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1351);
+ postFixExpr();
+ }
+ break;
+ case T__55:
+ case Kat_symbol:
+ case Kchild:
+ case Kdescendant:
+ case Kattribute:
+ case Kself:
+ case Kdescendant_or_self:
+ case Kfollowing_sibling:
+ case Kfollowing:
+ case Kparent:
+ case Kancestor:
+ case Kpreceding_sibling:
+ case Kpreceding:
+ case Kancestor_or_self:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(1352);
+ axisStep();
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class AxisStepContext extends ParserRuleContext {
+ public PredicateListContext predicateList() {
+ return getRuleContext(PredicateListContext.class,0);
+ }
+ public ReverseStepContext reverseStep() {
+ return getRuleContext(ReverseStepContext.class,0);
+ }
+ public ForwardStepContext forwardStep() {
+ return getRuleContext(ForwardStepContext.class,0);
+ }
+ public AxisStepContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_axisStep; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitAxisStep(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final AxisStepContext axisStep() throws RecognitionException {
+ AxisStepContext _localctx = new AxisStepContext(_ctx, getState());
+ enterRule(_localctx, 236, RULE_axisStep);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1357);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case T__55:
+ case Kparent:
+ case Kancestor:
+ case Kpreceding_sibling:
+ case Kpreceding:
+ case Kancestor_or_self:
+ {
+ setState(1355);
+ reverseStep();
+ }
+ break;
+ case Kat_symbol:
+ case Kchild:
+ case Kdescendant:
+ case Kattribute:
+ case Kself:
+ case Kdescendant_or_self:
+ case Kfollowing_sibling:
+ case Kfollowing:
+ {
+ setState(1356);
+ forwardStep();
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ setState(1359);
+ predicateList();
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class ForwardStepContext extends ParserRuleContext {
+ public ForwardAxisContext forwardAxis() {
+ return getRuleContext(ForwardAxisContext.class,0);
+ }
+ public NodeTestContext nodeTest() {
+ return getRuleContext(NodeTestContext.class,0);
+ }
+ public AbbrevForwardStepContext abbrevForwardStep() {
+ return getRuleContext(AbbrevForwardStepContext.class,0);
+ }
+ public ForwardStepContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_forwardStep; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitForwardStep(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final ForwardStepContext forwardStep() throws RecognitionException {
+ ForwardStepContext _localctx = new ForwardStepContext(_ctx, getState());
+ enterRule(_localctx, 238, RULE_forwardStep);
+ try {
+ setState(1365);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case Kchild:
+ case Kdescendant:
+ case Kattribute:
+ case Kself:
+ case Kdescendant_or_self:
+ case Kfollowing_sibling:
+ case Kfollowing:
+ enterOuterAlt(_localctx, 1);
+ {
+ {
+ setState(1361);
+ forwardAxis();
+ setState(1362);
+ nodeTest();
+ }
+ }
+ break;
+ case Kat_symbol:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(1364);
+ abbrevForwardStep();
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class ForwardAxisContext extends ParserRuleContext {
+ public TerminalNode Kchild() { return getToken(JsoniqParser.Kchild, 0); }
+ public TerminalNode Kdescendant() { return getToken(JsoniqParser.Kdescendant, 0); }
+ public TerminalNode Kattribute() { return getToken(JsoniqParser.Kattribute, 0); }
+ public TerminalNode Kself() { return getToken(JsoniqParser.Kself, 0); }
+ public TerminalNode Kdescendant_or_self() { return getToken(JsoniqParser.Kdescendant_or_self, 0); }
+ public TerminalNode Kfollowing_sibling() { return getToken(JsoniqParser.Kfollowing_sibling, 0); }
+ public TerminalNode Kfollowing() { return getToken(JsoniqParser.Kfollowing, 0); }
+ public ForwardAxisContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_forwardAxis; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitForwardAxis(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final ForwardAxisContext forwardAxis() throws RecognitionException {
+ ForwardAxisContext _localctx = new ForwardAxisContext(_ctx, getState());
+ enterRule(_localctx, 240, RULE_forwardAxis);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1367);
+ _la = _input.LA(1);
+ if ( !(((((_la - 132)) & ~0x3f) == 0 && ((1L << (_la - 132)) & ((1L << (Kchild - 132)) | (1L << (Kdescendant - 132)) | (1L << (Kattribute - 132)) | (1L << (Kself - 132)) | (1L << (Kdescendant_or_self - 132)) | (1L << (Kfollowing_sibling - 132)) | (1L << (Kfollowing - 132)))) != 0)) ) {
+ _errHandler.recoverInline(this);
+ }
+ else {
+ if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+ _errHandler.reportMatch(this);
+ consume();
+ }
+ setState(1368);
+ match(T__16);
+ setState(1369);
+ match(T__16);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class AbbrevForwardStepContext extends ParserRuleContext {
+ public TerminalNode Kat_symbol() { return getToken(JsoniqParser.Kat_symbol, 0); }
+ public NodeTestContext nodeTest() {
+ return getRuleContext(NodeTestContext.class,0);
+ }
+ public AbbrevForwardStepContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_abbrevForwardStep; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitAbbrevForwardStep(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final AbbrevForwardStepContext abbrevForwardStep() throws RecognitionException {
+ AbbrevForwardStepContext _localctx = new AbbrevForwardStepContext(_ctx, getState());
+ enterRule(_localctx, 242, RULE_abbrevForwardStep);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1371);
+ match(Kat_symbol);
+ setState(1372);
+ nodeTest();
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class ReverseStepContext extends ParserRuleContext {
+ public ReverseAxisContext reverseAxis() {
+ return getRuleContext(ReverseAxisContext.class,0);
+ }
+ public NodeTestContext nodeTest() {
+ return getRuleContext(NodeTestContext.class,0);
+ }
+ public AbbrevReverseStepContext abbrevReverseStep() {
+ return getRuleContext(AbbrevReverseStepContext.class,0);
+ }
+ public ReverseStepContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_reverseStep; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitReverseStep(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final ReverseStepContext reverseStep() throws RecognitionException {
+ ReverseStepContext _localctx = new ReverseStepContext(_ctx, getState());
+ enterRule(_localctx, 244, RULE_reverseStep);
+ try {
+ setState(1378);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case Kparent:
+ case Kancestor:
+ case Kpreceding_sibling:
+ case Kpreceding:
+ case Kancestor_or_self:
+ enterOuterAlt(_localctx, 1);
+ {
+ {
+ setState(1374);
+ reverseAxis();
+ setState(1375);
+ nodeTest();
+ }
+ }
+ break;
+ case T__55:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(1377);
+ abbrevReverseStep();
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class ReverseAxisContext extends ParserRuleContext {
+ public TerminalNode Kparent() { return getToken(JsoniqParser.Kparent, 0); }
+ public TerminalNode Kancestor() { return getToken(JsoniqParser.Kancestor, 0); }
+ public TerminalNode Kpreceding_sibling() { return getToken(JsoniqParser.Kpreceding_sibling, 0); }
+ public TerminalNode Kpreceding() { return getToken(JsoniqParser.Kpreceding, 0); }
+ public TerminalNode Kancestor_or_self() { return getToken(JsoniqParser.Kancestor_or_self, 0); }
+ public ReverseAxisContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_reverseAxis; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitReverseAxis(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final ReverseAxisContext reverseAxis() throws RecognitionException {
+ ReverseAxisContext _localctx = new ReverseAxisContext(_ctx, getState());
+ enterRule(_localctx, 246, RULE_reverseAxis);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1380);
+ _la = _input.LA(1);
+ if ( !(((((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & ((1L << (Kparent - 139)) | (1L << (Kancestor - 139)) | (1L << (Kpreceding_sibling - 139)) | (1L << (Kpreceding - 139)) | (1L << (Kancestor_or_self - 139)))) != 0)) ) {
+ _errHandler.recoverInline(this);
+ }
+ else {
+ if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+ _errHandler.reportMatch(this);
+ consume();
+ }
+ setState(1381);
+ match(T__16);
+ setState(1382);
+ match(T__16);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class AbbrevReverseStepContext extends ParserRuleContext {
+ public AbbrevReverseStepContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_abbrevReverseStep; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitAbbrevReverseStep(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final AbbrevReverseStepContext abbrevReverseStep() throws RecognitionException {
+ AbbrevReverseStepContext _localctx = new AbbrevReverseStepContext(_ctx, getState());
+ enterRule(_localctx, 248, RULE_abbrevReverseStep);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1384);
+ match(T__55);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class NodeTestContext extends ParserRuleContext {
+ public NameTestContext nameTest() {
+ return getRuleContext(NameTestContext.class,0);
+ }
+ public KindTestContext kindTest() {
+ return getRuleContext(KindTestContext.class,0);
+ }
+ public NodeTestContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_nodeTest; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitNodeTest(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final NodeTestContext nodeTest() throws RecognitionException {
+ NodeTestContext _localctx = new NodeTestContext(_ctx, getState());
+ enterRule(_localctx, 250, RULE_nodeTest);
+ try {
+ setState(1388);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case T__9:
+ case Kfor:
+ case Klet:
+ case Kwhere:
+ case Kgroup:
+ case Kby:
+ case Korder:
+ case Kreturn:
+ case Kif:
+ case Kin:
+ case Kas:
+ case Kat:
+ case Kallowing:
+ case Kempty:
+ case Kcount:
+ case Kstable:
+ case Kascending:
+ case Kdescending:
+ case Ksome:
+ case Kevery:
+ case Ksatisfies:
+ case Kcollation:
+ case Kgreatest:
+ case Kleast:
+ case Kswitch:
+ case Kcase:
+ case Ktry:
+ case Kcatch:
+ case Kdefault:
+ case Kthen:
+ case Kelse:
+ case Ktypeswitch:
+ case Kor:
+ case Kand:
+ case Knot:
+ case Kto:
+ case Kinstance:
+ case Kof:
+ case Kstatically:
+ case Kis:
+ case Ktreat:
+ case Kcast:
+ case Kcastable:
+ case Kversion:
+ case Kjsoniq:
+ case Kunordered:
+ case Ktrue:
+ case Kfalse:
+ case Ktype:
+ case Kvalidate:
+ case Kannotate:
+ case Kdeclare:
+ case Kcontext:
+ case Kitem:
+ case Kvariable:
+ case Kinsert:
+ case Kdelete:
+ case Krename:
+ case Kreplace:
+ case Kcopy:
+ case Kmodify:
+ case Kappend:
+ case Kinto:
+ case Kvalue:
+ case Kjson:
+ case Kwith:
+ case Kposition:
+ case Kbreak:
+ case Kloop:
+ case Kcontinue:
+ case Kexit:
+ case Kreturning:
+ case Kwhile:
+ case NullLiteral:
+ case NCName:
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1386);
+ nameTest();
+ }
+ break;
+ case Kelement:
+ case Kattribute:
+ case Knode:
+ case Kbinary:
+ case Kdocument_node:
+ case Ktext:
+ case Kpi:
+ case Knamespace_node:
+ case Kschema_attribute:
+ case Kschema_element:
+ case Kcomment:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(1387);
+ kindTest();
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class NameTestContext extends ParserRuleContext {
+ public QnameContext qname() {
+ return getRuleContext(QnameContext.class,0);
+ }
+ public WildcardContext wildcard() {
+ return getRuleContext(WildcardContext.class,0);
+ }
+ public NameTestContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_nameTest; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitNameTest(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final NameTestContext nameTest() throws RecognitionException {
+ NameTestContext _localctx = new NameTestContext(_ctx, getState());
+ enterRule(_localctx, 252, RULE_nameTest);
+ try {
+ setState(1392);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) {
+ case 1:
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1390);
+ qname();
+ }
+ break;
+ case 2:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(1391);
+ wildcard();
+ }
+ break;
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class WildcardContext extends ParserRuleContext {
+ public WildcardContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_wildcard; }
+
+ public WildcardContext() { }
+ public void copyFrom(WildcardContext ctx) {
+ super.copyFrom(ctx);
+ }
+ }
+ public static class AllNamesContext extends WildcardContext {
+ public AllNamesContext(WildcardContext ctx) { copyFrom(ctx); }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitAllNames(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+ public static class AllWithLocalContext extends WildcardContext {
+ public NCNameWithPrefixWildcardContext nCNameWithPrefixWildcard() {
+ return getRuleContext(NCNameWithPrefixWildcardContext.class,0);
+ }
+ public AllWithLocalContext(WildcardContext ctx) { copyFrom(ctx); }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitAllWithLocal(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+ public static class AllWithNSContext extends WildcardContext {
+ public NCNameWithLocalWildcardContext nCNameWithLocalWildcard() {
+ return getRuleContext(NCNameWithLocalWildcardContext.class,0);
+ }
+ public AllWithNSContext(WildcardContext ctx) { copyFrom(ctx); }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitAllWithNS(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final WildcardContext wildcard() throws RecognitionException {
+ WildcardContext _localctx = new WildcardContext(_ctx, getState());
+ enterRule(_localctx, 254, RULE_wildcard);
+ try {
+ setState(1397);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) {
+ case 1:
+ _localctx = new AllNamesContext(_localctx);
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1394);
+ match(T__9);
+ }
+ break;
+ case 2:
+ _localctx = new AllWithNSContext(_localctx);
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(1395);
+ nCNameWithLocalWildcard();
+ }
+ break;
+ case 3:
+ _localctx = new AllWithLocalContext(_localctx);
+ enterOuterAlt(_localctx, 3);
+ {
+ setState(1396);
+ nCNameWithPrefixWildcard();
+ }
+ break;
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class NCNameWithLocalWildcardContext extends ParserRuleContext {
+ public TerminalNode NCName() { return getToken(JsoniqParser.NCName, 0); }
+ public NCNameWithLocalWildcardContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_nCNameWithLocalWildcard; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitNCNameWithLocalWildcard(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final NCNameWithLocalWildcardContext nCNameWithLocalWildcard() throws RecognitionException {
+ NCNameWithLocalWildcardContext _localctx = new NCNameWithLocalWildcardContext(_ctx, getState());
+ enterRule(_localctx, 256, RULE_nCNameWithLocalWildcard);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1399);
+ match(NCName);
+ setState(1400);
+ match(T__16);
+ setState(1401);
+ match(T__9);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class NCNameWithPrefixWildcardContext extends ParserRuleContext {
+ public TerminalNode NCName() { return getToken(JsoniqParser.NCName, 0); }
+ public NCNameWithPrefixWildcardContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_nCNameWithPrefixWildcard; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitNCNameWithPrefixWildcard(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final NCNameWithPrefixWildcardContext nCNameWithPrefixWildcard() throws RecognitionException {
+ NCNameWithPrefixWildcardContext _localctx = new NCNameWithPrefixWildcardContext(_ctx, getState());
+ enterRule(_localctx, 258, RULE_nCNameWithPrefixWildcard);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1403);
+ match(T__9);
+ setState(1404);
+ match(T__16);
+ setState(1405);
+ match(NCName);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class PredicateListContext extends ParserRuleContext {
+ public List predicate() {
+ return getRuleContexts(PredicateContext.class);
+ }
+ public PredicateContext predicate(int i) {
+ return getRuleContext(PredicateContext.class,i);
+ }
+ public PredicateListContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_predicateList; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitPredicateList(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final PredicateListContext predicateList() throws RecognitionException {
+ PredicateListContext _localctx = new PredicateListContext(_ctx, getState());
+ enterRule(_localctx, 260, RULE_predicateList);
+ try {
+ int _alt;
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1410);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,130,_ctx);
+ while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+ if ( _alt==1 ) {
+ {
+ {
+ setState(1407);
+ predicate();
+ }
+ }
+ }
+ setState(1412);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,130,_ctx);
+ }
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class KindTestContext extends ParserRuleContext {
+ public DocumentTestContext documentTest() {
+ return getRuleContext(DocumentTestContext.class,0);
+ }
+ public ElementTestContext elementTest() {
+ return getRuleContext(ElementTestContext.class,0);
+ }
+ public AttributeTestContext attributeTest() {
+ return getRuleContext(AttributeTestContext.class,0);
+ }
+ public SchemaElementTestContext schemaElementTest() {
+ return getRuleContext(SchemaElementTestContext.class,0);
+ }
+ public SchemaAttributeTestContext schemaAttributeTest() {
+ return getRuleContext(SchemaAttributeTestContext.class,0);
+ }
+ public PiTestContext piTest() {
+ return getRuleContext(PiTestContext.class,0);
+ }
+ public CommentTestContext commentTest() {
+ return getRuleContext(CommentTestContext.class,0);
+ }
+ public TextTestContext textTest() {
+ return getRuleContext(TextTestContext.class,0);
+ }
+ public NamespaceNodeTestContext namespaceNodeTest() {
+ return getRuleContext(NamespaceNodeTestContext.class,0);
+ }
+ public BinaryNodeTestContext binaryNodeTest() {
+ return getRuleContext(BinaryNodeTestContext.class,0);
+ }
+ public AnyKindTestContext anyKindTest() {
+ return getRuleContext(AnyKindTestContext.class,0);
+ }
+ public KindTestContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_kindTest; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitKindTest(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final KindTestContext kindTest() throws RecognitionException {
+ KindTestContext _localctx = new KindTestContext(_ctx, getState());
+ enterRule(_localctx, 262, RULE_kindTest);
+ try {
+ setState(1424);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case Kdocument_node:
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1413);
+ documentTest();
+ }
+ break;
+ case Kelement:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(1414);
+ elementTest();
+ }
+ break;
+ case Kattribute:
+ enterOuterAlt(_localctx, 3);
+ {
+ setState(1415);
+ attributeTest();
+ }
+ break;
+ case Kschema_element:
+ enterOuterAlt(_localctx, 4);
+ {
+ setState(1416);
+ schemaElementTest();
+ }
+ break;
+ case Kschema_attribute:
+ enterOuterAlt(_localctx, 5);
+ {
+ setState(1417);
+ schemaAttributeTest();
+ }
+ break;
+ case Kpi:
+ enterOuterAlt(_localctx, 6);
+ {
+ setState(1418);
+ piTest();
+ }
+ break;
+ case Kcomment:
+ enterOuterAlt(_localctx, 7);
+ {
+ setState(1419);
+ commentTest();
+ }
+ break;
+ case Ktext:
+ enterOuterAlt(_localctx, 8);
+ {
+ setState(1420);
+ textTest();
+ }
+ break;
+ case Knamespace_node:
+ enterOuterAlt(_localctx, 9);
+ {
+ setState(1421);
+ namespaceNodeTest();
+ }
+ break;
+ case Kbinary:
+ enterOuterAlt(_localctx, 10);
+ {
+ setState(1422);
+ binaryNodeTest();
+ }
+ break;
+ case Knode:
+ enterOuterAlt(_localctx, 11);
+ {
+ setState(1423);
+ anyKindTest();
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class AnyKindTestContext extends ParserRuleContext {
+ public TerminalNode Knode() { return getToken(JsoniqParser.Knode, 0); }
+ public AnyKindTestContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_anyKindTest; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitAnyKindTest(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final AnyKindTestContext anyKindTest() throws RecognitionException {
+ AnyKindTestContext _localctx = new AnyKindTestContext(_ctx, getState());
+ enterRule(_localctx, 264, RULE_anyKindTest);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1426);
+ match(Knode);
+ setState(1427);
+ match(T__7);
+ setState(1428);
+ match(T__8);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class BinaryNodeTestContext extends ParserRuleContext {
+ public TerminalNode Kbinary() { return getToken(JsoniqParser.Kbinary, 0); }
+ public BinaryNodeTestContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_binaryNodeTest; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitBinaryNodeTest(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final BinaryNodeTestContext binaryNodeTest() throws RecognitionException {
+ BinaryNodeTestContext _localctx = new BinaryNodeTestContext(_ctx, getState());
+ enterRule(_localctx, 266, RULE_binaryNodeTest);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1430);
+ match(Kbinary);
+ setState(1431);
+ match(T__7);
+ setState(1432);
+ match(T__8);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class DocumentTestContext extends ParserRuleContext {
+ public TerminalNode Kdocument_node() { return getToken(JsoniqParser.Kdocument_node, 0); }
+ public ElementTestContext elementTest() {
+ return getRuleContext(ElementTestContext.class,0);
+ }
+ public SchemaElementTestContext schemaElementTest() {
+ return getRuleContext(SchemaElementTestContext.class,0);
+ }
+ public DocumentTestContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_documentTest; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitDocumentTest(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final DocumentTestContext documentTest() throws RecognitionException {
+ DocumentTestContext _localctx = new DocumentTestContext(_ctx, getState());
+ enterRule(_localctx, 268, RULE_documentTest);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1434);
+ match(Kdocument_node);
+ setState(1435);
+ match(T__7);
+ setState(1438);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case Kelement:
+ {
+ setState(1436);
+ elementTest();
+ }
+ break;
+ case Kschema_element:
+ {
+ setState(1437);
+ schemaElementTest();
+ }
+ break;
+ case T__8:
+ break;
+ default:
+ break;
+ }
+ setState(1440);
+ match(T__8);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class TextTestContext extends ParserRuleContext {
+ public TerminalNode Ktext() { return getToken(JsoniqParser.Ktext, 0); }
+ public TextTestContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_textTest; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitTextTest(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final TextTestContext textTest() throws RecognitionException {
+ TextTestContext _localctx = new TextTestContext(_ctx, getState());
+ enterRule(_localctx, 270, RULE_textTest);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1442);
+ match(Ktext);
+ setState(1443);
+ match(T__7);
+ setState(1444);
+ match(T__8);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class CommentTestContext extends ParserRuleContext {
+ public TerminalNode Kcomment() { return getToken(JsoniqParser.Kcomment, 0); }
+ public CommentTestContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_commentTest; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitCommentTest(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final CommentTestContext commentTest() throws RecognitionException {
+ CommentTestContext _localctx = new CommentTestContext(_ctx, getState());
+ enterRule(_localctx, 272, RULE_commentTest);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1446);
+ match(Kcomment);
+ setState(1447);
+ match(T__7);
+ setState(1448);
+ match(T__8);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class NamespaceNodeTestContext extends ParserRuleContext {
+ public TerminalNode Knamespace_node() { return getToken(JsoniqParser.Knamespace_node, 0); }
+ public NamespaceNodeTestContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_namespaceNodeTest; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitNamespaceNodeTest(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final NamespaceNodeTestContext namespaceNodeTest() throws RecognitionException {
+ NamespaceNodeTestContext _localctx = new NamespaceNodeTestContext(_ctx, getState());
+ enterRule(_localctx, 274, RULE_namespaceNodeTest);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1450);
+ match(Knamespace_node);
+ setState(1451);
+ match(T__7);
+ setState(1452);
+ match(T__8);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class PiTestContext extends ParserRuleContext {
+ public TerminalNode Kpi() { return getToken(JsoniqParser.Kpi, 0); }
+ public TerminalNode NCName() { return getToken(JsoniqParser.NCName, 0); }
+ public StringLiteralContext stringLiteral() {
+ return getRuleContext(StringLiteralContext.class,0);
+ }
+ public PiTestContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_piTest; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitPiTest(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final PiTestContext piTest() throws RecognitionException {
+ PiTestContext _localctx = new PiTestContext(_ctx, getState());
+ enterRule(_localctx, 276, RULE_piTest);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1454);
+ match(Kpi);
+ setState(1455);
+ match(T__7);
+ setState(1458);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case NCName:
+ {
+ setState(1456);
+ match(NCName);
+ }
+ break;
+ case STRING:
+ {
+ setState(1457);
+ stringLiteral();
+ }
+ break;
+ case T__8:
+ break;
+ default:
+ break;
+ }
+ setState(1460);
+ match(T__8);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class AttributeTestContext extends ParserRuleContext {
+ public TypeNameContext type;
+ public TerminalNode Kattribute() { return getToken(JsoniqParser.Kattribute, 0); }
+ public AttributeNameOrWildcardContext attributeNameOrWildcard() {
+ return getRuleContext(AttributeNameOrWildcardContext.class,0);
+ }
+ public TypeNameContext typeName() {
+ return getRuleContext(TypeNameContext.class,0);
+ }
+ public AttributeTestContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_attributeTest; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitAttributeTest(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final AttributeTestContext attributeTest() throws RecognitionException {
+ AttributeTestContext _localctx = new AttributeTestContext(_ctx, getState());
+ enterRule(_localctx, 278, RULE_attributeTest);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1462);
+ match(Kattribute);
+ setState(1463);
+ match(T__7);
+ setState(1469);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 159)) & ~0x3f) == 0 && ((1L << (_la - 159)) & ((1L << (Kbreak - 159)) | (1L << (Kloop - 159)) | (1L << (Kcontinue - 159)) | (1L << (Kexit - 159)) | (1L << (Kreturning - 159)) | (1L << (Kwhile - 159)) | (1L << (NullLiteral - 159)) | (1L << (NCName - 159)))) != 0)) {
+ {
+ setState(1464);
+ attributeNameOrWildcard();
+ setState(1467);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==T__12) {
+ {
+ setState(1465);
+ match(T__12);
+ setState(1466);
+ ((AttributeTestContext)_localctx).type = typeName();
+ }
+ }
+
+ }
+ }
+
+ setState(1471);
+ match(T__8);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class AttributeNameOrWildcardContext extends ParserRuleContext {
+ public AttributeNameContext attributeName() {
+ return getRuleContext(AttributeNameContext.class,0);
+ }
+ public AttributeNameOrWildcardContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_attributeNameOrWildcard; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitAttributeNameOrWildcard(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final AttributeNameOrWildcardContext attributeNameOrWildcard() throws RecognitionException {
+ AttributeNameOrWildcardContext _localctx = new AttributeNameOrWildcardContext(_ctx, getState());
+ enterRule(_localctx, 280, RULE_attributeNameOrWildcard);
+ try {
+ setState(1475);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case Kfor:
+ case Klet:
+ case Kwhere:
+ case Kgroup:
+ case Kby:
+ case Korder:
+ case Kreturn:
+ case Kif:
+ case Kin:
+ case Kas:
+ case Kat:
+ case Kallowing:
+ case Kempty:
+ case Kcount:
+ case Kstable:
+ case Kascending:
+ case Kdescending:
+ case Ksome:
+ case Kevery:
+ case Ksatisfies:
+ case Kcollation:
+ case Kgreatest:
+ case Kleast:
+ case Kswitch:
+ case Kcase:
+ case Ktry:
+ case Kcatch:
+ case Kdefault:
+ case Kthen:
+ case Kelse:
+ case Ktypeswitch:
+ case Kor:
+ case Kand:
+ case Knot:
+ case Kto:
+ case Kinstance:
+ case Kof:
+ case Kstatically:
+ case Kis:
+ case Ktreat:
+ case Kcast:
+ case Kcastable:
+ case Kversion:
+ case Kjsoniq:
+ case Kunordered:
+ case Ktrue:
+ case Kfalse:
+ case Ktype:
+ case Kvalidate:
+ case Kannotate:
+ case Kdeclare:
+ case Kcontext:
+ case Kitem:
+ case Kvariable:
+ case Kinsert:
+ case Kdelete:
+ case Krename:
+ case Kreplace:
+ case Kcopy:
+ case Kmodify:
+ case Kappend:
+ case Kinto:
+ case Kvalue:
+ case Kjson:
+ case Kwith:
+ case Kposition:
+ case Kbreak:
+ case Kloop:
+ case Kcontinue:
+ case Kexit:
+ case Kreturning:
+ case Kwhile:
+ case NullLiteral:
+ case NCName:
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1473);
+ attributeName();
+ }
+ break;
+ case T__9:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(1474);
+ match(T__9);
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class SchemaAttributeTestContext extends ParserRuleContext {
+ public TerminalNode Kschema_attribute() { return getToken(JsoniqParser.Kschema_attribute, 0); }
+ public AttributeDeclarationContext attributeDeclaration() {
+ return getRuleContext(AttributeDeclarationContext.class,0);
+ }
+ public SchemaAttributeTestContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_schemaAttributeTest; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitSchemaAttributeTest(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final SchemaAttributeTestContext schemaAttributeTest() throws RecognitionException {
+ SchemaAttributeTestContext _localctx = new SchemaAttributeTestContext(_ctx, getState());
+ enterRule(_localctx, 282, RULE_schemaAttributeTest);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1477);
+ match(Kschema_attribute);
+ setState(1478);
+ match(T__7);
+ setState(1479);
+ attributeDeclaration();
+ setState(1480);
+ match(T__8);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class AttributeDeclarationContext extends ParserRuleContext {
+ public AttributeNameContext attributeName() {
+ return getRuleContext(AttributeNameContext.class,0);
+ }
+ public AttributeDeclarationContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_attributeDeclaration; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitAttributeDeclaration(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final AttributeDeclarationContext attributeDeclaration() throws RecognitionException {
+ AttributeDeclarationContext _localctx = new AttributeDeclarationContext(_ctx, getState());
+ enterRule(_localctx, 284, RULE_attributeDeclaration);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1482);
+ attributeName();
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class ElementTestContext extends ParserRuleContext {
+ public TypeNameContext type;
+ public Token optional;
+ public TerminalNode Kelement() { return getToken(JsoniqParser.Kelement, 0); }
+ public ElementNameOrWildcardContext elementNameOrWildcard() {
+ return getRuleContext(ElementNameOrWildcardContext.class,0);
+ }
+ public TypeNameContext typeName() {
+ return getRuleContext(TypeNameContext.class,0);
+ }
+ public TerminalNode ArgumentPlaceholder() { return getToken(JsoniqParser.ArgumentPlaceholder, 0); }
+ public ElementTestContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_elementTest; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitElementTest(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final ElementTestContext elementTest() throws RecognitionException {
+ ElementTestContext _localctx = new ElementTestContext(_ctx, getState());
+ enterRule(_localctx, 286, RULE_elementTest);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1484);
+ match(Kelement);
+ setState(1485);
+ match(T__7);
+ setState(1494);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 159)) & ~0x3f) == 0 && ((1L << (_la - 159)) & ((1L << (Kbreak - 159)) | (1L << (Kloop - 159)) | (1L << (Kcontinue - 159)) | (1L << (Kexit - 159)) | (1L << (Kreturning - 159)) | (1L << (Kwhile - 159)) | (1L << (NullLiteral - 159)) | (1L << (NCName - 159)))) != 0)) {
+ {
+ setState(1486);
+ elementNameOrWildcard();
+ setState(1492);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==T__12) {
+ {
+ setState(1487);
+ match(T__12);
+ setState(1488);
+ ((ElementTestContext)_localctx).type = typeName();
+ setState(1490);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==ArgumentPlaceholder) {
+ {
+ setState(1489);
+ ((ElementTestContext)_localctx).optional = match(ArgumentPlaceholder);
+ }
+ }
+
+ }
+ }
+
+ }
+ }
+
+ setState(1496);
+ match(T__8);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class ElementNameOrWildcardContext extends ParserRuleContext {
+ public ElementNameContext elementName() {
+ return getRuleContext(ElementNameContext.class,0);
+ }
+ public ElementNameOrWildcardContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_elementNameOrWildcard; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitElementNameOrWildcard(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final ElementNameOrWildcardContext elementNameOrWildcard() throws RecognitionException {
+ ElementNameOrWildcardContext _localctx = new ElementNameOrWildcardContext(_ctx, getState());
+ enterRule(_localctx, 288, RULE_elementNameOrWildcard);
+ try {
+ setState(1500);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case Kfor:
+ case Klet:
+ case Kwhere:
+ case Kgroup:
+ case Kby:
+ case Korder:
+ case Kreturn:
+ case Kif:
+ case Kin:
+ case Kas:
+ case Kat:
+ case Kallowing:
+ case Kempty:
+ case Kcount:
+ case Kstable:
+ case Kascending:
+ case Kdescending:
+ case Ksome:
+ case Kevery:
+ case Ksatisfies:
+ case Kcollation:
+ case Kgreatest:
+ case Kleast:
+ case Kswitch:
+ case Kcase:
+ case Ktry:
+ case Kcatch:
+ case Kdefault:
+ case Kthen:
+ case Kelse:
+ case Ktypeswitch:
+ case Kor:
+ case Kand:
+ case Knot:
+ case Kto:
+ case Kinstance:
+ case Kof:
+ case Kstatically:
+ case Kis:
+ case Ktreat:
+ case Kcast:
+ case Kcastable:
+ case Kversion:
+ case Kjsoniq:
+ case Kunordered:
+ case Ktrue:
+ case Kfalse:
+ case Ktype:
+ case Kvalidate:
+ case Kannotate:
+ case Kdeclare:
+ case Kcontext:
+ case Kitem:
+ case Kvariable:
+ case Kinsert:
+ case Kdelete:
+ case Krename:
+ case Kreplace:
+ case Kcopy:
+ case Kmodify:
+ case Kappend:
+ case Kinto:
+ case Kvalue:
+ case Kjson:
+ case Kwith:
+ case Kposition:
+ case Kbreak:
+ case Kloop:
+ case Kcontinue:
+ case Kexit:
+ case Kreturning:
+ case Kwhile:
+ case NullLiteral:
+ case NCName:
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1498);
+ elementName();
+ }
+ break;
+ case T__9:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(1499);
+ match(T__9);
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class SchemaElementTestContext extends ParserRuleContext {
+ public TerminalNode Kschema_element() { return getToken(JsoniqParser.Kschema_element, 0); }
+ public ElementDeclarationContext elementDeclaration() {
+ return getRuleContext(ElementDeclarationContext.class,0);
+ }
+ public SchemaElementTestContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_schemaElementTest; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitSchemaElementTest(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final SchemaElementTestContext schemaElementTest() throws RecognitionException {
+ SchemaElementTestContext _localctx = new SchemaElementTestContext(_ctx, getState());
+ enterRule(_localctx, 290, RULE_schemaElementTest);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1502);
+ match(Kschema_element);
+ setState(1503);
+ match(T__7);
+ setState(1504);
+ elementDeclaration();
+ setState(1505);
+ match(T__8);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class ElementDeclarationContext extends ParserRuleContext {
+ public ElementNameContext elementName() {
+ return getRuleContext(ElementNameContext.class,0);
+ }
+ public ElementDeclarationContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_elementDeclaration; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitElementDeclaration(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final ElementDeclarationContext elementDeclaration() throws RecognitionException {
+ ElementDeclarationContext _localctx = new ElementDeclarationContext(_ctx, getState());
+ enterRule(_localctx, 292, RULE_elementDeclaration);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1507);
+ elementName();
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class AttributeNameContext extends ParserRuleContext {
+ public QnameContext qname() {
+ return getRuleContext(QnameContext.class,0);
+ }
+ public AttributeNameContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_attributeName; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitAttributeName(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final AttributeNameContext attributeName() throws RecognitionException {
+ AttributeNameContext _localctx = new AttributeNameContext(_ctx, getState());
+ enterRule(_localctx, 294, RULE_attributeName);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1509);
+ qname();
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class ElementNameContext extends ParserRuleContext {
+ public QnameContext qname() {
+ return getRuleContext(QnameContext.class,0);
+ }
+ public ElementNameContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_elementName; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitElementName(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final ElementNameContext elementName() throws RecognitionException {
+ ElementNameContext _localctx = new ElementNameContext(_ctx, getState());
+ enterRule(_localctx, 296, RULE_elementName);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1511);
+ qname();
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class SimpleTypeNameContext extends ParserRuleContext {
+ public TypeNameContext typeName() {
+ return getRuleContext(TypeNameContext.class,0);
+ }
+ public SimpleTypeNameContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_simpleTypeName; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitSimpleTypeName(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final SimpleTypeNameContext simpleTypeName() throws RecognitionException {
+ SimpleTypeNameContext _localctx = new SimpleTypeNameContext(_ctx, getState());
+ enterRule(_localctx, 298, RULE_simpleTypeName);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1513);
+ typeName();
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class TypeNameContext extends ParserRuleContext {
+ public QnameContext qname() {
+ return getRuleContext(QnameContext.class,0);
+ }
+ public TypeNameContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_typeName; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitTypeName(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final TypeNameContext typeName() throws RecognitionException {
+ TypeNameContext _localctx = new TypeNameContext(_ctx, getState());
+ enterRule(_localctx, 300, RULE_typeName);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1515);
+ qname();
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class SequenceTypeContext extends ParserRuleContext {
+ public ItemTypeContext item;
+ public Token s166;
+ public List question = new ArrayList();
+ public Token s10;
+ public List star = new ArrayList();
+ public Token s45;
+ public List plus = new ArrayList();
+ public ItemTypeContext itemType() {
+ return getRuleContext(ItemTypeContext.class,0);
+ }
+ public TerminalNode ArgumentPlaceholder() { return getToken(JsoniqParser.ArgumentPlaceholder, 0); }
+ public SequenceTypeContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_sequenceType; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitSequenceType(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final SequenceTypeContext sequenceType() throws RecognitionException {
+ SequenceTypeContext _localctx = new SequenceTypeContext(_ctx, getState());
+ enterRule(_localctx, 302, RULE_sequenceType);
+ try {
+ setState(1525);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case T__7:
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1517);
+ match(T__7);
+ setState(1518);
+ match(T__8);
+ }
+ break;
+ case T__28:
+ case Kfor:
+ case Klet:
+ case Kwhere:
+ case Kgroup:
+ case Kby:
+ case Korder:
+ case Kreturn:
+ case Kif:
+ case Kin:
+ case Kas:
+ case Kat:
+ case Kallowing:
+ case Kempty:
+ case Kcount:
+ case Kstable:
+ case Kascending:
+ case Kdescending:
+ case Ksome:
+ case Kevery:
+ case Ksatisfies:
+ case Kcollation:
+ case Kgreatest:
+ case Kleast:
+ case Kswitch:
+ case Kcase:
+ case Ktry:
+ case Kcatch:
+ case Kdefault:
+ case Kthen:
+ case Kelse:
+ case Ktypeswitch:
+ case Kor:
+ case Kand:
+ case Knot:
+ case Kto:
+ case Kinstance:
+ case Kof:
+ case Kstatically:
+ case Kis:
+ case Ktreat:
+ case Kcast:
+ case Kcastable:
+ case Kversion:
+ case Kjsoniq:
+ case Kunordered:
+ case Ktrue:
+ case Kfalse:
+ case Ktype:
+ case Kvalidate:
+ case Kannotate:
+ case Kdeclare:
+ case Kcontext:
+ case Kitem:
+ case Kvariable:
+ case Kinsert:
+ case Kdelete:
+ case Krename:
+ case Kreplace:
+ case Kcopy:
+ case Kmodify:
+ case Kappend:
+ case Kinto:
+ case Kvalue:
+ case Kjson:
+ case Kwith:
+ case Kposition:
+ case Kbreak:
+ case Kloop:
+ case Kcontinue:
+ case Kexit:
+ case Kreturning:
+ case Kwhile:
+ case NullLiteral:
+ case NCName:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(1519);
+ ((SequenceTypeContext)_localctx).item = itemType();
+ setState(1523);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) {
+ case 1:
+ {
+ setState(1520);
+ ((SequenceTypeContext)_localctx).s166 = match(ArgumentPlaceholder);
+ ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s166);
+ }
+ break;
+ case 2:
+ {
+ setState(1521);
+ ((SequenceTypeContext)_localctx).s10 = match(T__9);
+ ((SequenceTypeContext)_localctx).star.add(((SequenceTypeContext)_localctx).s10);
+ }
+ break;
+ case 3:
+ {
+ setState(1522);
+ ((SequenceTypeContext)_localctx).s45 = match(T__44);
+ ((SequenceTypeContext)_localctx).plus.add(((SequenceTypeContext)_localctx).s45);
+ }
+ break;
+ }
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class ObjectConstructorContext extends ParserRuleContext {
+ public Token s57;
+ public List merge_operator = new ArrayList();
+ public List pairConstructor() {
+ return getRuleContexts(PairConstructorContext.class);
+ }
+ public PairConstructorContext pairConstructor(int i) {
+ return getRuleContext(PairConstructorContext.class,i);
+ }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public ObjectConstructorContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_objectConstructor; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor extends T>)visitor).visitObjectConstructor(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final ObjectConstructorContext objectConstructor() throws RecognitionException {
+ ObjectConstructorContext _localctx = new ObjectConstructorContext(_ctx, getState());
+ enterRule(_localctx, 304, RULE_objectConstructor);
+ int _la;
+ try {
+ setState(1543);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case T__5:
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1527);
+ match(T__5);
+ setState(1536);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) {
+ {
+ setState(1528);
+ pairConstructor();
+ setState(1533);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while (_la==T__12) {
+ {
+ {
+ setState(1529);
+ match(T__12);
+ setState(1530);
+ pairConstructor();
+ }
+ }
+ setState(1535);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ }
+ }
+
+ setState(1538);
+ match(T__6);
+ }
+ break;
+ case T__56:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(1539);
+ ((ObjectConstructorContext)_localctx).s57 = match(T__56);
+ ((ObjectConstructorContext)_localctx).merge_operator.add(((ObjectConstructorContext)_localctx).s57);
+ setState(1540);
+ expr();
+ setState(1541);
+ match(T__57);
}
-
- setState(1283);
- match(T__7);
- }
- break;
- case T__58:
- enterOuterAlt(_localctx, 2);
- {
- setState(1284);
- ((ObjectConstructorContext)_localctx).s59 = match(T__58);
- ((ObjectConstructorContext)_localctx).merge_operator.add(((ObjectConstructorContext)_localctx).s59);
- setState(1285);
- expr();
- setState(1286);
- match(T__59);
- }
break;
default:
throw new NoViableAltException(this);
@@ -9217,29 +11634,29 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ItemTypeContext itemType() throws RecognitionException {
ItemTypeContext _localctx = new ItemTypeContext(_ctx, getState());
- enterRule(_localctx, 234, RULE_itemType);
+ enterRule(_localctx, 306, RULE_itemType);
try {
- setState(1293);
+ setState(1548);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1290);
+ setState(1545);
qname();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1291);
+ setState(1546);
match(NullLiteral);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1292);
+ setState(1547);
functionTest();
}
break;
@@ -9276,22 +11693,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final FunctionTestContext functionTest() throws RecognitionException {
FunctionTestContext _localctx = new FunctionTestContext(_ctx, getState());
- enterRule(_localctx, 236, RULE_functionTest);
+ enterRule(_localctx, 308, RULE_functionTest);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1297);
+ setState(1552);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) {
case 1:
{
- setState(1295);
+ setState(1550);
anyFunctionTest();
}
break;
case 2:
{
- setState(1296);
+ setState(1551);
typedFunctionTest();
}
break;
@@ -9323,18 +11740,18 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final AnyFunctionTestContext anyFunctionTest() throws RecognitionException {
AnyFunctionTestContext _localctx = new AnyFunctionTestContext(_ctx, getState());
- enterRule(_localctx, 238, RULE_anyFunctionTest);
+ enterRule(_localctx, 310, RULE_anyFunctionTest);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1299);
- match(T__30);
- setState(1300);
- match(T__8);
- setState(1301);
- match(T__10);
- setState(1302);
+ setState(1554);
+ match(T__28);
+ setState(1555);
+ match(T__7);
+ setState(1556);
match(T__9);
+ setState(1557);
+ match(T__8);
}
}
catch (RecognitionException re) {
@@ -9372,48 +11789,48 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypedFunctionTestContext typedFunctionTest() throws RecognitionException {
TypedFunctionTestContext _localctx = new TypedFunctionTestContext(_ctx, getState());
- enterRule(_localctx, 240, RULE_typedFunctionTest);
+ enterRule(_localctx, 312, RULE_typedFunctionTest);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1304);
- match(T__30);
- setState(1305);
- match(T__8);
- setState(1314);
+ setState(1559);
+ match(T__28);
+ setState(1560);
+ match(T__7);
+ setState(1569);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__8) | (1L << T__30) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__7) | (1L << T__28) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 159)) & ~0x3f) == 0 && ((1L << (_la - 159)) & ((1L << (Kbreak - 159)) | (1L << (Kloop - 159)) | (1L << (Kcontinue - 159)) | (1L << (Kexit - 159)) | (1L << (Kreturning - 159)) | (1L << (Kwhile - 159)) | (1L << (NullLiteral - 159)) | (1L << (NCName - 159)))) != 0)) {
{
- setState(1306);
+ setState(1561);
((TypedFunctionTestContext)_localctx).sequenceType = sequenceType();
((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType);
- setState(1311);
+ setState(1566);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__13) {
+ while (_la==T__12) {
{
{
- setState(1307);
- match(T__13);
- setState(1308);
+ setState(1562);
+ match(T__12);
+ setState(1563);
((TypedFunctionTestContext)_localctx).sequenceType = sequenceType();
((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType);
}
}
- setState(1313);
+ setState(1568);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
- setState(1316);
- match(T__9);
- setState(1317);
+ setState(1571);
+ match(T__8);
+ setState(1572);
match(Kas);
- setState(1318);
+ setState(1573);
((TypedFunctionTestContext)_localctx).rt = sequenceType();
}
}
@@ -9430,7 +11847,7 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce
public static class SingleTypeContext extends ParserRuleContext {
public ItemTypeContext item;
- public Token s134;
+ public Token s166;
public List question = new ArrayList();
public ItemTypeContext itemType() {
return getRuleContext(ItemTypeContext.class,0);
@@ -9449,20 +11866,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SingleTypeContext singleType() throws RecognitionException {
SingleTypeContext _localctx = new SingleTypeContext(_ctx, getState());
- enterRule(_localctx, 242, RULE_singleType);
+ enterRule(_localctx, 314, RULE_singleType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1320);
+ setState(1575);
((SingleTypeContext)_localctx).item = itemType();
- setState(1322);
+ setState(1577);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) {
case 1:
{
- setState(1321);
- ((SingleTypeContext)_localctx).s134 = match(ArgumentPlaceholder);
- ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s134);
+ setState(1576);
+ ((SingleTypeContext)_localctx).s166 = match(ArgumentPlaceholder);
+ ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s166);
}
break;
}
@@ -9504,30 +11921,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PairConstructorContext pairConstructor() throws RecognitionException {
PairConstructorContext _localctx = new PairConstructorContext(_ctx, getState());
- enterRule(_localctx, 244, RULE_pairConstructor);
+ enterRule(_localctx, 316, RULE_pairConstructor);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1326);
+ setState(1581);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) {
case 1:
{
- setState(1324);
+ setState(1579);
((PairConstructorContext)_localctx).lhs = exprSingle();
}
break;
case 2:
{
- setState(1325);
+ setState(1580);
((PairConstructorContext)_localctx).name = match(NCName);
}
break;
}
- setState(1328);
+ setState(1583);
_la = _input.LA(1);
- if ( !(_la==T__17 || _la==ArgumentPlaceholder) ) {
+ if ( !(_la==T__16 || _la==ArgumentPlaceholder) ) {
_errHandler.recoverInline(this);
}
else {
@@ -9535,7 +11952,7 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio
_errHandler.reportMatch(this);
consume();
}
- setState(1329);
+ setState(1584);
((PairConstructorContext)_localctx).rhs = exprSingle();
}
}
@@ -9567,25 +11984,25 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ArrayConstructorContext arrayConstructor() throws RecognitionException {
ArrayConstructorContext _localctx = new ArrayConstructorContext(_ctx, getState());
- enterRule(_localctx, 246, RULE_arrayConstructor);
+ enterRule(_localctx, 318, RULE_arrayConstructor);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1331);
- match(T__53);
- setState(1333);
+ setState(1586);
+ match(T__50);
+ setState(1588);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__12) | (1L << T__15) | (1L << T__30) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kbreak - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (STRING - 128)) | (1L << (NullLiteral - 128)) | (1L << (Literal - 128)) | (1L << (NCName - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__7) | (1L << T__11) | (1L << T__14) | (1L << T__28) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__53) | (1L << T__55) | (1L << T__56) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere) | (1L << Kgroup) | (1L << Kby))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (Kinsert - 64)) | (1L << (Kdelete - 64)) | (1L << (Krename - 64)) | (1L << (Kreplace - 64)) | (1L << (Kcopy - 64)) | (1L << (Kmodify - 64)) | (1L << (Kappend - 64)) | (1L << (Kinto - 64)) | (1L << (Kvalue - 64)) | (1L << (Kjson - 64)) | (1L << (Kwith - 64)) | (1L << (Kposition - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (Kslash - 129)) | (1L << (Kdslash - 129)) | (1L << (Kat_symbol - 129)) | (1L << (Kchild - 129)) | (1L << (Kdescendant - 129)) | (1L << (Kattribute - 129)) | (1L << (Kself - 129)) | (1L << (Kdescendant_or_self - 129)) | (1L << (Kfollowing_sibling - 129)) | (1L << (Kfollowing - 129)) | (1L << (Kparent - 129)) | (1L << (Kancestor - 129)) | (1L << (Kpreceding_sibling - 129)) | (1L << (Kpreceding - 129)) | (1L << (Kancestor_or_self - 129)) | (1L << (Kbreak - 129)) | (1L << (Kloop - 129)) | (1L << (Kcontinue - 129)) | (1L << (Kexit - 129)) | (1L << (Kreturning - 129)) | (1L << (Kwhile - 129)) | (1L << (STRING - 129)) | (1L << (NullLiteral - 129)) | (1L << (Literal - 129)) | (1L << (NCName - 129)))) != 0)) {
{
- setState(1332);
+ setState(1587);
expr();
}
}
- setState(1335);
- match(T__54);
+ setState(1590);
+ match(T__51);
}
}
catch (RecognitionException re) {
@@ -9616,11 +12033,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final UriLiteralContext uriLiteral() throws RecognitionException {
UriLiteralContext _localctx = new UriLiteralContext(_ctx, getState());
- enterRule(_localctx, 248, RULE_uriLiteral);
+ enterRule(_localctx, 320, RULE_uriLiteral);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1337);
+ setState(1592);
stringLiteral();
}
}
@@ -9650,11 +12067,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final StringLiteralContext stringLiteral() throws RecognitionException {
StringLiteralContext _localctx = new StringLiteralContext(_ctx, getState());
- enterRule(_localctx, 250, RULE_stringLiteral);
+ enterRule(_localctx, 322, RULE_stringLiteral);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1339);
+ setState(1594);
match(STRING);
}
}
@@ -9756,14 +12173,14 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final KeyWordsContext keyWords() throws RecognitionException {
KeyWordsContext _localctx = new KeyWordsContext(_ctx, getState());
- enterRule(_localctx, 252, RULE_keyWords);
+ enterRule(_localctx, 324, RULE_keyWords);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1341);
+ setState(1596);
_la = _input.LA(1);
- if ( !(((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & ((1L << (Kfor - 61)) | (1L << (Klet - 61)) | (1L << (Kwhere - 61)) | (1L << (Kgroup - 61)) | (1L << (Kby - 61)) | (1L << (Korder - 61)) | (1L << (Kreturn - 61)) | (1L << (Kif - 61)) | (1L << (Kin - 61)) | (1L << (Kas - 61)) | (1L << (Kat - 61)) | (1L << (Kallowing - 61)) | (1L << (Kempty - 61)) | (1L << (Kcount - 61)) | (1L << (Kstable - 61)) | (1L << (Kascending - 61)) | (1L << (Kdescending - 61)) | (1L << (Ksome - 61)) | (1L << (Kevery - 61)) | (1L << (Ksatisfies - 61)) | (1L << (Kcollation - 61)) | (1L << (Kgreatest - 61)) | (1L << (Kleast - 61)) | (1L << (Kswitch - 61)) | (1L << (Kcase - 61)) | (1L << (Ktry - 61)) | (1L << (Kcatch - 61)) | (1L << (Kdefault - 61)) | (1L << (Kthen - 61)) | (1L << (Kelse - 61)) | (1L << (Ktypeswitch - 61)) | (1L << (Kor - 61)) | (1L << (Kand - 61)) | (1L << (Knot - 61)) | (1L << (Kto - 61)) | (1L << (Kinstance - 61)) | (1L << (Kof - 61)) | (1L << (Kstatically - 61)) | (1L << (Kis - 61)) | (1L << (Ktreat - 61)) | (1L << (Kcast - 61)) | (1L << (Kcastable - 61)) | (1L << (Kversion - 61)) | (1L << (Kjsoniq - 61)) | (1L << (Kunordered - 61)) | (1L << (Ktrue - 61)) | (1L << (Kfalse - 61)) | (1L << (Ktype - 61)) | (1L << (Kvalidate - 61)) | (1L << (Kannotate - 61)) | (1L << (Kdeclare - 61)) | (1L << (Kcontext - 61)) | (1L << (Kitem - 61)) | (1L << (Kvariable - 61)) | (1L << (Kinsert - 61)) | (1L << (Kdelete - 61)) | (1L << (Krename - 61)) | (1L << (Kreplace - 61)) | (1L << (Kcopy - 61)) | (1L << (Kmodify - 61)) | (1L << (Kappend - 61)) | (1L << (Kinto - 61)) | (1L << (Kvalue - 61)) | (1L << (Kjson - 61)))) != 0) || ((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (Kwith - 125)) | (1L << (Kposition - 125)) | (1L << (Kbreak - 125)) | (1L << (Kloop - 125)) | (1L << (Kcontinue - 125)) | (1L << (Kexit - 125)) | (1L << (Kreturning - 125)) | (1L << (Kwhile - 125)) | (1L << (NullLiteral - 125)))) != 0)) ) {
+ if ( !(((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & ((1L << (Kfor - 59)) | (1L << (Klet - 59)) | (1L << (Kwhere - 59)) | (1L << (Kgroup - 59)) | (1L << (Kby - 59)) | (1L << (Korder - 59)) | (1L << (Kreturn - 59)) | (1L << (Kif - 59)) | (1L << (Kin - 59)) | (1L << (Kas - 59)) | (1L << (Kat - 59)) | (1L << (Kallowing - 59)) | (1L << (Kempty - 59)) | (1L << (Kcount - 59)) | (1L << (Kstable - 59)) | (1L << (Kascending - 59)) | (1L << (Kdescending - 59)) | (1L << (Ksome - 59)) | (1L << (Kevery - 59)) | (1L << (Ksatisfies - 59)) | (1L << (Kcollation - 59)) | (1L << (Kgreatest - 59)) | (1L << (Kleast - 59)) | (1L << (Kswitch - 59)) | (1L << (Kcase - 59)) | (1L << (Ktry - 59)) | (1L << (Kcatch - 59)) | (1L << (Kdefault - 59)) | (1L << (Kthen - 59)) | (1L << (Kelse - 59)) | (1L << (Ktypeswitch - 59)) | (1L << (Kor - 59)) | (1L << (Kand - 59)) | (1L << (Knot - 59)) | (1L << (Kto - 59)) | (1L << (Kinstance - 59)) | (1L << (Kof - 59)) | (1L << (Kstatically - 59)) | (1L << (Kis - 59)) | (1L << (Ktreat - 59)) | (1L << (Kcast - 59)) | (1L << (Kcastable - 59)) | (1L << (Kversion - 59)) | (1L << (Kjsoniq - 59)) | (1L << (Kunordered - 59)) | (1L << (Ktrue - 59)) | (1L << (Kfalse - 59)) | (1L << (Ktype - 59)) | (1L << (Kvalidate - 59)) | (1L << (Kannotate - 59)) | (1L << (Kdeclare - 59)) | (1L << (Kcontext - 59)) | (1L << (Kitem - 59)) | (1L << (Kvariable - 59)) | (1L << (Kinsert - 59)) | (1L << (Kdelete - 59)) | (1L << (Krename - 59)) | (1L << (Kreplace - 59)) | (1L << (Kcopy - 59)) | (1L << (Kmodify - 59)) | (1L << (Kappend - 59)) | (1L << (Kinto - 59)) | (1L << (Kvalue - 59)) | (1L << (Kjson - 59)))) != 0) || ((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (Kwith - 123)) | (1L << (Kposition - 123)) | (1L << (Kbreak - 123)) | (1L << (Kloop - 123)) | (1L << (Kcontinue - 123)) | (1L << (Kexit - 123)) | (1L << (Kreturning - 123)) | (1L << (Kwhile - 123)) | (1L << (NullLiteral - 123)))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@@ -9785,7 +12202,7 @@ public final KeyWordsContext keyWords() throws RecognitionException {
}
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0092\u0542\4\2\t"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00b2\u0641\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@@ -9799,494 +12216,611 @@ public final KeyWordsContext keyWords() throws RecognitionException {
"`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k\t"+
"k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4"+
"w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080\t\u0080"+
- "\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\5\3\u0109\n\3\3\3\3\3\5\3\u010d\n\3\3"+
- "\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\5\6\u011d\n\6\3"+
- "\6\3\6\7\6\u0121\n\6\f\6\16\6\u0124\13\6\3\6\3\6\3\6\7\6\u0129\n\6\f\6"+
- "\16\6\u012c\13\6\3\7\3\7\3\b\7\b\u0131\n\b\f\b\16\b\u0134\13\b\3\t\3\t"+
- "\3\t\3\n\3\n\5\n\u013b\n\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+
- "\3\13\3\13\3\13\3\13\5\13\u014a\n\13\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3"+
+ "\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084\4\u0085"+
+ "\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088\t\u0088\4\u0089\t\u0089"+
+ "\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d\4\u008e"+
+ "\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092\t\u0092"+
+ "\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096\4\u0097"+
+ "\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b\t\u009b"+
+ "\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f\4\u00a0"+
+ "\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4\t\u00a4"+
+ "\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\5\3\u0151\n\3\3\3\3\3\5\3\u0155\n\3\3"+
+ "\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\5\6\u0165\n\6\3"+
+ "\6\3\6\7\6\u0169\n\6\f\6\16\6\u016c\13\6\3\6\3\6\3\6\7\6\u0171\n\6\f\6"+
+ "\16\6\u0174\13\6\3\7\3\7\3\b\7\b\u0179\n\b\f\b\16\b\u017c\13\b\3\t\3\t"+
+ "\3\t\3\n\3\n\5\n\u0183\n\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+
+ "\3\13\3\13\3\13\3\13\5\13\u0192\n\13\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3"+
"\r\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\21\3"+
- "\21\3\21\3\21\3\21\3\22\3\22\5\22\u0168\n\22\3\22\3\22\3\22\3\22\3\22"+
- "\3\22\7\22\u0170\n\22\f\22\16\22\u0173\13\22\3\22\3\22\3\22\3\23\3\23"+
- "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\6\24\u0186"+
- "\n\24\r\24\16\24\u0187\3\24\3\24\3\24\3\24\3\25\3\25\6\25\u0190\n\25\r"+
- "\25\16\25\u0191\3\25\3\25\3\25\3\26\3\26\3\26\6\26\u019a\n\26\r\26\16"+
- "\26\u019b\3\27\3\27\3\27\5\27\u01a1\n\27\3\27\3\27\3\27\5\27\u01a6\n\27"+
- "\7\27\u01a8\n\27\f\27\16\27\u01ab\13\27\3\27\3\27\3\30\3\30\3\30\3\30"+
- "\3\30\6\30\u01b4\n\30\r\30\16\30\u01b5\3\30\3\30\5\30\u01ba\n\30\3\30"+
- "\3\30\3\30\3\31\3\31\3\31\3\31\5\31\u01c3\n\31\3\31\3\31\3\31\7\31\u01c8"+
- "\n\31\f\31\16\31\u01cb\13\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3"+
- "\32\7\32\u01d6\n\32\f\32\16\32\u01d9\13\32\3\32\5\32\u01dc\n\32\3\33\7"+
- "\33\u01df\n\33\f\33\16\33\u01e2\13\33\3\34\3\34\3\34\3\34\3\34\7\34\u01e9"+
- "\n\34\f\34\16\34\u01ec\13\34\3\34\3\34\3\35\3\35\3\35\5\35\u01f3\n\35"+
- "\3\35\3\35\5\35\u01f7\n\35\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37"+
- "\3\37\5\37\u0203\n\37\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\5!\u020f\n!\3\"\3"+
- "\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\5%\u0225\n"+
- "%\3%\3%\3%\3%\7%\u022b\n%\f%\16%\u022e\13%\3&\3&\5&\u0232\n&\3&\5&\u0235"+
- "\n&\3&\3&\5&\u0239\n&\3\'\3\'\3(\3(\3(\3(\3(\5(\u0242\n(\3(\3(\3(\3(\3"+
- "(\7(\u0249\n(\f(\16(\u024c\13(\5(\u024e\n(\3)\3)\3)\3)\3)\3)\5)\u0256"+
- "\n)\3)\3)\3)\3)\3)\5)\u025d\n)\5)\u025f\n)\3*\3*\3*\3*\3*\5*\u0266\n*"+
- "\3*\3*\3*\3*\3*\5*\u026d\n*\5*\u026f\n*\3+\3+\3+\3+\3+\3+\5+\u0277\n+"+
- "\3+\3+\3+\5+\u027c\n+\3+\3+\3+\3+\3+\5+\u0283\n+\3,\3,\3,\3,\3,\5,\u028a"+
- "\n,\3,\3,\3-\3-\3-\3-\3-\3-\5-\u0294\n-\3.\3.\3.\7.\u0299\n.\f.\16.\u029c"+
- "\13.\3/\3/\3/\3/\5/\u02a2\n/\3\60\3\60\3\60\7\60\u02a7\n\60\f\60\16\60"+
- "\u02aa\13\60\3\61\3\61\3\61\3\61\3\61\3\61\5\61\u02b2\n\61\3\62\3\62\3"+
- "\62\3\62\3\62\3\62\3\62\3\62\5\62\u02bc\n\62\3\63\3\63\5\63\u02c0\n\63"+
- "\3\63\3\63\3\63\3\63\3\63\3\63\7\63\u02c8\n\63\f\63\16\63\u02cb\13\63"+
- "\3\63\3\63\3\63\3\64\3\64\3\64\3\64\7\64\u02d4\n\64\f\64\16\64\u02d7\13"+
- "\64\3\65\3\65\3\65\5\65\u02dc\n\65\3\65\3\65\5\65\u02e0\n\65\3\65\3\65"+
- "\5\65\u02e4\n\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\7\66\u02ed\n\66\f"+
- "\66\16\66\u02f0\13\66\3\67\3\67\3\67\5\67\u02f5\n\67\3\67\3\67\3\67\3"+
- "8\38\38\39\39\39\39\39\79\u0302\n9\f9\169\u0305\139\3:\3:\3:\5:\u030a"+
- "\n:\3:\3:\5:\u030e\n:\3:\3:\5:\u0312\n:\3;\3;\3;\3;\3;\5;\u0319\n;\3;"+
- "\3;\3;\7;\u031e\n;\f;\16;\u0321\13;\3<\3<\3<\5<\u0326\n<\3<\3<\3<\5<\u032b"+
- "\n<\5<\u032d\n<\3<\3<\5<\u0331\n<\3=\3=\3=\3>\3>\5>\u0338\n>\3>\3>\3>"+
- "\7>\u033d\n>\f>\16>\u0340\13>\3>\3>\3>\3?\3?\3?\5?\u0348\n?\3?\3?\3?\3"+
- "@\3@\3@\3@\3@\6@\u0352\n@\r@\16@\u0353\3@\3@\3@\3@\3A\3A\6A\u035c\nA\r"+
- "A\16A\u035d\3A\3A\3A\3B\3B\3B\3B\3B\6B\u0368\nB\rB\16B\u0369\3B\3B\5B"+
- "\u036e\nB\3B\3B\3B\3C\3C\3C\3C\5C\u0377\nC\3C\3C\3C\7C\u037c\nC\fC\16"+
- "C\u037f\13C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\6E\u0392"+
- "\nE\rE\16E\u0393\3F\3F\3F\5F\u0399\nF\3F\3F\3F\5F\u039e\nF\7F\u03a0\n"+
- "F\fF\16F\u03a3\13F\3F\3F\3F\3F\3G\3G\3G\7G\u03ac\nG\fG\16G\u03af\13G\3"+
- "H\3H\3H\7H\u03b4\nH\fH\16H\u03b7\13H\3I\5I\u03ba\nI\3I\3I\3J\3J\3J\5J"+
- "\u03c1\nJ\3K\3K\3K\7K\u03c6\nK\fK\16K\u03c9\13K\3L\3L\3L\5L\u03ce\nL\3"+
- "M\3M\3M\7M\u03d3\nM\fM\16M\u03d6\13M\3N\3N\3N\7N\u03db\nN\fN\16N\u03de"+
- "\13N\3O\3O\3O\3O\5O\u03e4\nO\3P\3P\3P\3P\5P\u03ea\nP\3Q\3Q\3Q\3Q\5Q\u03f0"+
- "\nQ\3R\3R\3R\3R\5R\u03f6\nR\3S\3S\3S\3S\5S\u03fc\nS\3T\3T\3T\3T\3T\3T"+
- "\3T\7T\u0405\nT\fT\16T\u0408\13T\3U\3U\3U\5U\u040d\nU\3V\7V\u0410\nV\f"+
- "V\16V\u0413\13V\3V\3V\3W\3W\3W\5W\u041a\nW\3X\3X\3X\3X\3X\3X\3X\3Y\3Y"+
- "\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\7Z\u042d\nZ\fZ\16Z\u0430\13Z\3[\3[\3[\3[\3[\3"+
- "[\7[\u0438\n[\f[\16[\u043b\13[\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^"+
- "\3^\3^\3_\3_\3_\3_\3_\3_\3_\5_\u0451\n_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`"+
- "\3`\3`\3`\3`\3`\5`\u0462\n`\3a\3a\3a\3a\3b\3b\3b\3c\3c\5c\u046d\nc\3c"+
- "\3c\3d\3d\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3g\3g\3g\3h\3h\3h\5h\u0483\nh"+
- "\7h\u0485\nh\fh\16h\u0488\13h\3h\3h\3i\3i\5i\u048e\ni\3j\3j\5j\u0492\n"+
- "j\3k\3k\3k\3k\3l\3l\3l\3l\5l\u049c\nl\3l\3l\3l\5l\u04a1\nl\3l\3l\3l\3"+
- "l\3m\3m\3m\3m\3m\3m\3m\3m\5m\u04af\nm\3m\3m\3m\3m\3m\7m\u04b6\nm\fm\16"+
- "m\u04b9\13m\3m\3m\3m\5m\u04be\nm\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3p\3p\3"+
- "p\3p\3p\3p\3p\3p\3q\3q\3q\3q\7q\u04d6\nq\fq\16q\u04d9\13q\3q\3q\3q\3q"+
- "\3q\3r\3r\3r\3r\3r\3r\3s\3s\3s\6s\u04e9\ns\rs\16s\u04ea\3t\3t\3t\3t\3"+
- "u\3u\3u\3u\3u\3u\5u\u04f7\nu\5u\u04f9\nu\3v\3v\3v\3v\7v\u04ff\nv\fv\16"+
- "v\u0502\13v\5v\u0504\nv\3v\3v\3v\3v\3v\5v\u050b\nv\3w\3w\3w\5w\u0510\n"+
- "w\3x\3x\5x\u0514\nx\3y\3y\3y\3y\3y\3z\3z\3z\3z\3z\7z\u0520\nz\fz\16z\u0523"+
- "\13z\5z\u0525\nz\3z\3z\3z\3z\3{\3{\5{\u052d\n{\3|\3|\5|\u0531\n|\3|\3"+
- "|\3|\3}\3}\5}\u0538\n}\3}\3}\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0080"+
- "\2\2\u0081\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\66"+
- "8:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a"+
- "\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2"+
- "\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba"+
- "\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2"+
- "\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea"+
- "\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\2\n\4\2\22"+
- "\22kk\3\2TU\3\2\25\36\4\2\6\6&\60\3\2\62\63\4\2\r\r\64\66\4\2\24\24\u0088"+
- "\u0088\4\2?\u0086\u0089\u0089\2\u0583\2\u0100\3\2\2\2\4\u0108\3\2\2\2"+
- "\6\u010e\3\2\2\2\b\u0111\3\2\2\2\n\u0122\3\2\2\2\f\u012d\3\2\2\2\16\u0132"+
- "\3\2\2\2\20\u0135\3\2\2\2\22\u0138\3\2\2\2\24\u0149\3\2\2\2\26\u014b\3"+
- "\2\2\2\30\u014e\3\2\2\2\32\u0154\3\2\2\2\34\u0158\3\2\2\2\36\u015c\3\2"+
- "\2\2 \u0160\3\2\2\2\"\u0167\3\2\2\2$\u0177\3\2\2\2&\u0180\3\2\2\2(\u018f"+
- "\3\2\2\2*\u0196\3\2\2\2,\u019d\3\2\2\2.\u01ae\3\2\2\2\60\u01be\3\2\2\2"+
- "\62\u01cf\3\2\2\2\64\u01e0\3\2\2\2\66\u01e3\3\2\2\28\u01ef\3\2\2\2:\u01f8"+
- "\3\2\2\2<\u0202\3\2\2\2>\u0204\3\2\2\2@\u020e\3\2\2\2B\u0210\3\2\2\2D"+
- "\u0215\3\2\2\2F\u0219\3\2\2\2H\u021f\3\2\2\2J\u0234\3\2\2\2L\u023a\3\2"+
- "\2\2N\u023c\3\2\2\2P\u024f\3\2\2\2R\u0260\3\2\2\2T\u0270\3\2\2\2V\u0284"+
- "\3\2\2\2X\u0293\3\2\2\2Z\u0295\3\2\2\2\\\u029d\3\2\2\2^\u02a3\3\2\2\2"+
- "`\u02b1\3\2\2\2b\u02bb\3\2\2\2d\u02bf\3\2\2\2f\u02cf\3\2\2\2h\u02d8\3"+
- "\2\2\2j\u02e8\3\2\2\2l\u02f1\3\2\2\2n\u02f9\3\2\2\2p\u02fc\3\2\2\2r\u0306"+
- "\3\2\2\2t\u0318\3\2\2\2v\u0322\3\2\2\2x\u0332\3\2\2\2z\u0337\3\2\2\2|"+
- "\u0344\3\2\2\2~\u034c\3\2\2\2\u0080\u035b\3\2\2\2\u0082\u0362\3\2\2\2"+
- "\u0084\u0372\3\2\2\2\u0086\u0383\3\2\2\2\u0088\u038c\3\2\2\2\u008a\u0395"+
- "\3\2\2\2\u008c\u03a8\3\2\2\2\u008e\u03b0\3\2\2\2\u0090\u03b9\3\2\2\2\u0092"+
- "\u03bd\3\2\2\2\u0094\u03c2\3\2\2\2\u0096\u03ca\3\2\2\2\u0098\u03cf\3\2"+
- "\2\2\u009a\u03d7\3\2\2\2\u009c\u03df\3\2\2\2\u009e\u03e5\3\2\2\2\u00a0"+
- "\u03eb\3\2\2\2\u00a2\u03f1\3\2\2\2\u00a4\u03f7\3\2\2\2\u00a6\u03fd\3\2"+
- "\2\2\u00a8\u040c\3\2\2\2\u00aa\u0411\3\2\2\2\u00ac\u0419\3\2\2\2\u00ae"+
- "\u041b\3\2\2\2\u00b0\u0422\3\2\2\2\u00b2\u0429\3\2\2\2\u00b4\u0431\3\2"+
- "\2\2\u00b6\u043c\3\2\2\2\u00b8\u0442\3\2\2\2\u00ba\u0445\3\2\2\2\u00bc"+
- "\u0449\3\2\2\2\u00be\u0461\3\2\2\2\u00c0\u0463\3\2\2\2\u00c2\u0467\3\2"+
- "\2\2\u00c4\u046a\3\2\2\2\u00c6\u0470\3\2\2\2\u00c8\u0472\3\2\2\2\u00ca"+
- "\u0477\3\2\2\2\u00cc\u047c\3\2\2\2\u00ce\u047f\3\2\2\2\u00d0\u048d\3\2"+
- "\2\2\u00d2\u0491\3\2\2\2\u00d4\u0493\3\2\2\2\u00d6\u0497\3\2\2\2\u00d8"+
- "\u04bd\3\2\2\2\u00da\u04bf\3\2\2\2\u00dc\u04c3\3\2\2\2\u00de\u04c9\3\2"+
- "\2\2\u00e0\u04d1\3\2\2\2\u00e2\u04df\3\2\2\2\u00e4\u04e5\3\2\2\2\u00e6"+
- "\u04ec\3\2\2\2\u00e8\u04f8\3\2\2\2\u00ea\u050a\3\2\2\2\u00ec\u050f\3\2"+
- "\2\2\u00ee\u0513\3\2\2\2\u00f0\u0515\3\2\2\2\u00f2\u051a\3\2\2\2\u00f4"+
- "\u052a\3\2\2\2\u00f6\u0530\3\2\2\2\u00f8\u0535\3\2\2\2\u00fa\u053b\3\2"+
- "\2\2\u00fc\u053d\3\2\2\2\u00fe\u053f\3\2\2\2\u0100\u0101\5\4\3\2\u0101"+
- "\u0102\7\2\2\3\u0102\3\3\2\2\2\u0103\u0104\7j\2\2\u0104\u0105\7i\2\2\u0105"+
- "\u0106\5\u00fc\177\2\u0106\u0107\7\3\2\2\u0107\u0109\3\2\2\2\u0108\u0103"+
- "\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010c\3\2\2\2\u010a\u010d\5\b\5\2\u010b"+
- "\u010d\5\6\4\2\u010c\u010a\3\2\2\2\u010c\u010b\3\2\2\2\u010d\5\3\2\2\2"+
- "\u010e\u010f\5\n\6\2\u010f\u0110\5\f\7\2\u0110\7\3\2\2\2\u0111\u0112\7"+
- "\4\2\2\u0112\u0113\7\5\2\2\u0113\u0114\7\u0090\2\2\u0114\u0115\7\6\2\2"+
- "\u0115\u0116\5\u00fa~\2\u0116\u0117\7\3\2\2\u0117\u0118\5\n\6\2\u0118"+
- "\t\3\2\2\2\u0119\u011d\5<\37\2\u011a\u011d\5> \2\u011b\u011d\5N(\2\u011c"+
- "\u0119\3\2\2\2\u011c\u011a\3\2\2\2\u011c\u011b\3\2\2\2\u011d\u011e\3\2"+
- "\2\2\u011e\u011f\7\3\2\2\u011f\u0121\3\2\2\2\u0120\u011c\3\2\2\2\u0121"+
- "\u0124\3\2\2\2\u0122\u0120\3\2\2\2\u0122\u0123\3\2\2\2\u0123\u012a\3\2"+
- "\2\2\u0124\u0122\3\2\2\2\u0125\u0126\5@!\2\u0126\u0127\7\3\2\2\u0127\u0129"+
- "\3\2\2\2\u0128\u0125\3\2\2\2\u0129\u012c\3\2\2\2\u012a\u0128\3\2\2\2\u012a"+
- "\u012b\3\2\2\2\u012b\13\3\2\2\2\u012c\u012a\3\2\2\2\u012d\u012e\5\22\n"+
- "\2\u012e\r\3\2\2\2\u012f\u0131\5\24\13\2\u0130\u012f\3\2\2\2\u0131\u0134"+
- "\3\2\2\2\u0132\u0130\3\2\2\2\u0132\u0133\3\2\2\2\u0133\17\3\2\2\2\u0134"+
- "\u0132\3\2\2\2\u0135\u0136\5\16\b\2\u0136\u0137\5^\60\2\u0137\21\3\2\2"+
- "\2\u0138\u013a\5\16\b\2\u0139\u013b\5^\60\2\u013a\u0139\3\2\2\2\u013a"+
- "\u013b\3\2\2\2\u013b\23\3\2\2\2\u013c\u014a\5\26\f\2\u013d\u014a\5\30"+
- "\r\2\u013e\u014a\5\32\16\2\u013f\u014a\5\34\17\2\u0140\u014a\5\36\20\2"+
- "\u0141\u014a\5 \21\2\u0142\u014a\5\"\22\2\u0143\u014a\5$\23\2\u0144\u014a"+
- "\5&\24\2\u0145\u014a\5*\26\2\u0146\u014a\5.\30\2\u0147\u014a\5\66\34\2"+
- "\u0148\u014a\5:\36\2\u0149\u013c\3\2\2\2\u0149\u013d\3\2\2\2\u0149\u013e"+
- "\3\2\2\2\u0149\u013f\3\2\2\2\u0149\u0140\3\2\2\2\u0149\u0141\3\2\2\2\u0149"+
- "\u0142\3\2\2\2\u0149\u0143\3\2\2\2\u0149\u0144\3\2\2\2\u0149\u0145\3\2"+
- "\2\2\u0149\u0146\3\2\2\2\u0149\u0147\3\2\2\2\u0149\u0148\3\2\2\2\u014a"+
- "\25\3\2\2\2\u014b\u014c\5b\62\2\u014c\u014d\7\3\2\2\u014d\27\3\2\2\2\u014e"+
- "\u014f\7\7\2\2\u014f\u0150\5J&\2\u0150\u0151\7\b\2\2\u0151\u0152\5`\61"+
- "\2\u0152\u0153\7\3\2\2\u0153\31\3\2\2\2\u0154\u0155\7\t\2\2\u0155\u0156"+
- "\5\16\b\2\u0156\u0157\7\n\2\2\u0157\33\3\2\2\2\u0158\u0159\7\u0081\2\2"+
- "\u0159\u015a\7\u0082\2\2\u015a\u015b\7\3\2\2\u015b\35\3\2\2\2\u015c\u015d"+
- "\7\u0083\2\2\u015d\u015e\7\u0082\2\2\u015e\u015f\7\3\2\2\u015f\37\3\2"+
- "\2\2\u0160\u0161\7\u0084\2\2\u0161\u0162\7\u0085\2\2\u0162\u0163\5`\61"+
- "\2\u0163\u0164\7\3\2\2\u0164!\3\2\2\2\u0165\u0168\5f\64\2\u0166\u0168"+
- "\5j\66\2\u0167\u0165\3\2\2\2\u0167\u0166\3\2\2\2\u0168\u0171\3\2\2\2\u0169"+
- "\u0170\5f\64\2\u016a\u0170\5j\66\2\u016b\u0170\5n8\2\u016c\u0170\5p9\2"+
- "\u016d\u0170\5t;\2\u016e\u0170\5x=\2\u016f\u0169\3\2\2\2\u016f\u016a\3"+
- "\2\2\2\u016f\u016b\3\2\2\2\u016f\u016c\3\2\2\2\u016f\u016d\3\2\2\2\u016f"+
- "\u016e\3\2\2\2\u0170\u0173\3\2\2\2\u0171\u016f\3\2\2\2\u0171\u0172\3\2"+
- "\2\2\u0172\u0174\3\2\2\2\u0173\u0171\3\2\2\2\u0174\u0175\7E\2\2\u0175"+
- "\u0176\5\24\13\2\u0176#\3\2\2\2\u0177\u0178\7F\2\2\u0178\u0179\7\13\2"+
- "\2\u0179\u017a\5^\60\2\u017a\u017b\7\f\2\2\u017b\u017c\7[\2\2\u017c\u017d"+
- "\5\24\13\2\u017d\u017e\7\\\2\2\u017e\u017f\5\24\13\2\u017f%\3\2\2\2\u0180"+
- "\u0181\7V\2\2\u0181\u0182\7\13\2\2\u0182\u0183\5^\60\2\u0183\u0185\7\f"+
- "\2\2\u0184\u0186\5(\25\2\u0185\u0184\3\2\2\2\u0186\u0187\3\2\2\2\u0187"+
- "\u0185\3\2\2\2\u0187\u0188\3\2\2\2\u0188\u0189\3\2\2\2\u0189\u018a\7Z"+
- "\2\2\u018a\u018b\7E\2\2\u018b\u018c\5\24\13\2\u018c\'\3\2\2\2\u018d\u018e"+
- "\7W\2\2\u018e\u0190\5`\61\2\u018f\u018d\3\2\2\2\u0190\u0191\3\2\2\2\u0191"+
- "\u018f\3\2\2\2\u0191\u0192\3\2\2\2\u0192\u0193\3\2\2\2\u0193\u0194\7E"+
- "\2\2\u0194\u0195\5\24\13\2\u0195)\3\2\2\2\u0196\u0197\7X\2\2\u0197\u0199"+
- "\5\32\16\2\u0198\u019a\5,\27\2\u0199\u0198\3\2\2\2\u019a\u019b\3\2\2\2"+
- "\u019b\u0199\3\2\2\2\u019b\u019c\3\2\2\2\u019c+\3\2\2\2\u019d\u01a0\7"+
- "Y\2\2\u019e\u01a1\7\r\2\2\u019f\u01a1\5J&\2\u01a0\u019e\3\2\2\2\u01a0"+
- "\u019f\3\2\2\2\u01a1\u01a9\3\2\2\2\u01a2\u01a5\7\16\2\2\u01a3\u01a6\7"+
- "\r\2\2\u01a4\u01a6\5J&\2\u01a5\u01a3\3\2\2\2\u01a5\u01a4\3\2\2\2\u01a6"+
- "\u01a8\3\2\2\2\u01a7\u01a2\3\2\2\2\u01a8\u01ab\3\2\2\2\u01a9\u01a7\3\2"+
- "\2\2\u01a9\u01aa\3\2\2\2\u01aa\u01ac\3\2\2\2\u01ab\u01a9\3\2\2\2\u01ac"+
- "\u01ad\5\32\16\2\u01ad-\3\2\2\2\u01ae\u01af\7]\2\2\u01af\u01b0\7\13\2"+
- "\2\u01b0\u01b1\5^\60\2\u01b1\u01b3\7\f\2\2\u01b2\u01b4\5\60\31\2\u01b3"+
- "\u01b2\3\2\2\2\u01b4\u01b5\3\2\2\2\u01b5\u01b3\3\2\2\2\u01b5\u01b6\3\2"+
- "\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01b9\7Z\2\2\u01b8\u01ba\5\u00c2b\2\u01b9"+
- "\u01b8\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bb\3\2\2\2\u01bb\u01bc\7E"+
- "\2\2\u01bc\u01bd\5\24\13\2\u01bd/\3\2\2\2\u01be\u01c2\7W\2\2\u01bf\u01c0"+
- "\5\u00c2b\2\u01c0\u01c1\7H\2\2\u01c1\u01c3\3\2\2\2\u01c2\u01bf\3\2\2\2"+
- "\u01c2\u01c3\3\2\2\2\u01c3\u01c4\3\2\2\2\u01c4\u01c9\5\u00e8u\2\u01c5"+
- "\u01c6\7\16\2\2\u01c6\u01c8\5\u00e8u\2\u01c7\u01c5\3\2\2\2\u01c8\u01cb"+
- "\3\2\2\2\u01c9\u01c7\3\2\2\2\u01c9\u01ca\3\2\2\2\u01ca\u01cc\3\2\2\2\u01cb"+
- "\u01c9\3\2\2\2\u01cc\u01cd\7E\2\2\u01cd\u01ce\5\24\13\2\u01ce\61\3\2\2"+
- "\2\u01cf\u01d0\7\17\2\2\u01d0\u01db\5J&\2\u01d1\u01d2\7\13\2\2\u01d2\u01d7"+
- "\7\u008a\2\2\u01d3\u01d4\7\20\2\2\u01d4\u01d6\7\u008a\2\2\u01d5\u01d3"+
- "\3\2\2\2\u01d6\u01d9\3\2\2\2\u01d7\u01d5\3\2\2\2\u01d7\u01d8\3\2\2\2\u01d8"+
- "\u01da\3\2\2\2\u01d9\u01d7\3\2\2\2\u01da\u01dc\7\f\2\2\u01db\u01d1\3\2"+
- "\2\2\u01db\u01dc\3\2\2\2\u01dc\63\3\2\2\2\u01dd\u01df\5\62\32\2\u01de"+
- "\u01dd\3\2\2\2\u01df\u01e2\3\2\2\2\u01e0\u01de\3\2\2\2\u01e0\u01e1\3\2"+
- "\2\2\u01e1\65\3\2\2\2\u01e2\u01e0\3\2\2\2\u01e3\u01e4\5\64\33\2\u01e4"+
- "\u01e5\7t\2\2\u01e5\u01ea\58\35\2\u01e6\u01e7\7\20\2\2\u01e7\u01e9\58"+
- "\35\2\u01e8\u01e6\3\2\2\2\u01e9\u01ec\3\2\2\2\u01ea\u01e8\3\2\2\2\u01ea"+
- "\u01eb\3\2\2\2\u01eb\u01ed\3\2\2\2\u01ec\u01ea\3\2\2\2\u01ed\u01ee\7\3"+
- "\2\2\u01ee\67\3\2\2\2\u01ef\u01f2\5\u00c2b\2\u01f0\u01f1\7H\2\2\u01f1"+
- "\u01f3\5\u00e8u\2\u01f2\u01f0\3\2\2\2\u01f2\u01f3\3\2\2\2\u01f3\u01f6"+
- "\3\2\2\2\u01f4\u01f5\7\b\2\2\u01f5\u01f7\5`\61\2\u01f6\u01f4\3\2\2\2\u01f6"+
- "\u01f7\3\2\2\2\u01f79\3\2\2\2\u01f8\u01f9\7\u0086\2\2\u01f9\u01fa\7\13"+
- "\2\2\u01fa\u01fb\5^\60\2\u01fb\u01fc\7\f\2\2\u01fc\u01fd\5\24\13\2\u01fd"+
- ";\3\2\2\2\u01fe\u0203\5B\"\2\u01ff\u0203\5D#\2\u0200\u0203\5F$\2\u0201"+
- "\u0203\5H%\2\u0202\u01fe\3\2\2\2\u0202\u01ff\3\2\2\2\u0202\u0200\3\2\2"+
- "\2\u0202\u0201\3\2\2\2\u0203=\3\2\2\2\u0204\u0205\7q\2\2\u0205\u0206\7"+
- "\5\2\2\u0206\u0207\7\u0090\2\2\u0207\u0208\7\6\2\2\u0208\u0209\5\u00fa"+
- "~\2\u0209?\3\2\2\2\u020a\u020f\5T+\2\u020b\u020f\5P)\2\u020c\u020f\5V"+
- ",\2\u020d\u020f\5R*\2\u020e\u020a\3\2\2\2\u020e\u020b\3\2\2\2\u020e\u020c"+
- "\3\2\2\2\u020e\u020d\3\2\2\2\u020fA\3\2\2\2\u0210\u0211\7q\2\2\u0211\u0212"+
- "\7Z\2\2\u0212\u0213\7S\2\2\u0213\u0214\5\u00fa~\2\u0214C\3\2\2\2\u0215"+
- "\u0216\7q\2\2\u0216\u0217\7\21\2\2\u0217\u0218\t\2\2\2\u0218E\3\2\2\2"+
- "\u0219\u021a\7q\2\2\u021a\u021b\7Z\2\2\u021b\u021c\7D\2\2\u021c\u021d"+
- "\7K\2\2\u021d\u021e\t\3\2\2\u021eG\3\2\2\2\u021f\u0224\7q\2\2\u0220\u0221"+
- "\7\23\2\2\u0221\u0225\5J&\2\u0222\u0223\7Z\2\2\u0223\u0225\7\23\2\2\u0224"+
- "\u0220\3\2\2\2\u0224\u0222\3\2\2\2\u0225\u022c\3\2\2\2\u0226\u0227\5L"+
- "\'\2\u0227\u0228\7\6\2\2\u0228\u0229\5\u00fc\177\2\u0229\u022b\3\2\2\2"+
- "\u022a\u0226\3\2\2\2\u022b\u022e\3\2\2\2\u022c\u022a\3\2\2\2\u022c\u022d"+
- "\3\2\2\2\u022dI\3\2\2\2\u022e\u022c\3\2\2\2\u022f\u0232\7\u0090\2\2\u0230"+
- "\u0232\5\u00fe\u0080\2\u0231\u022f\3\2\2\2\u0231\u0230\3\2\2\2\u0232\u0233"+
- "\3\2\2\2\u0233\u0235\7\24\2\2\u0234\u0231\3\2\2\2\u0234\u0235\3\2\2\2"+
- "\u0235\u0238\3\2\2\2\u0236\u0239\7\u0090\2\2\u0237\u0239\5\u00fe\u0080"+
- "\2\u0238\u0236\3\2\2\2\u0238\u0237\3\2\2\2\u0239K\3\2\2\2\u023a\u023b"+
- "\t\4\2\2\u023bM\3\2\2\2\u023c\u023d\7\37\2\2\u023d\u0241\7\4\2\2\u023e"+
- "\u023f\7\5\2\2\u023f\u0240\7\u0090\2\2\u0240\u0242\7\6\2\2\u0241\u023e"+
- "\3\2\2\2\u0241\u0242\3\2\2\2\u0242\u0243\3\2\2\2\u0243\u024d\5\u00fa~"+
- "\2\u0244\u0245\7I\2\2\u0245\u024a\5\u00fa~\2\u0246\u0247\7\20\2\2\u0247"+
- "\u0249\5\u00fa~\2\u0248\u0246\3\2\2\2\u0249\u024c\3\2\2\2\u024a\u0248"+
- "\3\2\2\2\u024a\u024b\3\2\2\2\u024b\u024e\3\2\2\2\u024c\u024a\3\2\2\2\u024d"+
- "\u0244\3\2\2\2\u024d\u024e\3\2\2\2\u024eO\3\2\2\2\u024f\u0250\7q\2\2\u0250"+
- "\u0251\5\64\33\2\u0251\u0252\7t\2\2\u0252\u0255\5\u00c2b\2\u0253\u0254"+
- "\7H\2\2\u0254\u0256\5\u00e8u\2\u0255\u0253\3\2\2\2\u0255\u0256\3\2\2\2"+
- "\u0256\u025e\3\2\2\2\u0257\u0258\7\b\2\2\u0258\u025f\5`\61\2\u0259\u025c"+
- "\7 \2\2\u025a\u025b\7\b\2\2\u025b\u025d\5`\61\2\u025c\u025a\3\2\2\2\u025c"+
- "\u025d\3\2\2\2\u025d\u025f\3\2\2\2\u025e\u0257\3\2\2\2\u025e\u0259\3\2"+
- "\2\2\u025fQ\3\2\2\2\u0260\u0261\7q\2\2\u0261\u0262\7r\2\2\u0262\u0265"+
- "\7s\2\2\u0263\u0264\7H\2\2\u0264\u0266\5\u00e8u\2\u0265\u0263\3\2\2\2"+
- "\u0265\u0266\3\2\2\2\u0266\u026e\3\2\2\2\u0267\u0268\7\b\2\2\u0268\u026f"+
- "\5`\61\2\u0269\u026c\7 \2\2\u026a\u026b\7\b\2\2\u026b\u026d\5`\61\2\u026c"+
- "\u026a\3\2\2\2\u026c\u026d\3\2\2\2\u026d\u026f\3\2\2\2\u026e\u0267\3\2"+
- "\2\2\u026e\u0269\3\2\2\2\u026fS\3\2\2\2\u0270\u0271\7q\2\2\u0271\u0272"+
- "\5\64\33\2\u0272\u0273\7!\2\2\u0273\u0274\5J&\2\u0274\u0276\7\13\2\2\u0275"+
- "\u0277\5Z.\2\u0276\u0275\3\2\2\2\u0276\u0277\3\2\2\2\u0277\u0278\3\2\2"+
- "\2\u0278\u027b\7\f\2\2\u0279\u027a\7H\2\2\u027a\u027c\5\u00e8u\2\u027b"+
- "\u0279\3\2\2\2\u027b\u027c\3\2\2\2\u027c\u0282\3\2\2\2\u027d\u027e\7\t"+
- "\2\2\u027e\u027f\5\22\n\2\u027f\u0280\7\n\2\2\u0280\u0283\3\2\2\2\u0281"+
- "\u0283\7 \2\2\u0282\u027d\3\2\2\2\u0282\u0281\3\2\2\2\u0283U\3\2\2\2\u0284"+
- "\u0285\7q\2\2\u0285\u0286\7n\2\2\u0286\u0287\5J&\2\u0287\u0289\7H\2\2"+
- "\u0288\u028a\5X-\2\u0289\u0288\3\2\2\2\u0289\u028a\3\2\2\2\u028a\u028b"+
- "\3\2\2\2\u028b\u028c\5`\61\2\u028cW\3\2\2\2\u028d\u028e\7\"\2\2\u028e"+
- "\u0294\7#\2\2\u028f\u0290\7\"\2\2\u0290\u0294\7$\2\2\u0291\u0292\7~\2"+
- "\2\u0292\u0294\7%\2\2\u0293\u028d\3\2\2\2\u0293\u028f\3\2\2\2\u0293\u0291"+
- "\3\2\2\2\u0294Y\3\2\2\2\u0295\u029a\5\\/\2\u0296\u0297\7\20\2\2\u0297"+
- "\u0299\5\\/\2\u0298\u0296\3\2\2\2\u0299\u029c\3\2\2\2\u029a\u0298\3\2"+
- "\2\2\u029a\u029b\3\2\2\2\u029b[\3\2\2\2\u029c\u029a\3\2\2\2\u029d\u029e"+
- "\7\7\2\2\u029e\u02a1\5J&\2\u029f\u02a0\7H\2\2\u02a0\u02a2\5\u00e8u\2\u02a1"+
- "\u029f\3\2\2\2\u02a1\u02a2\3\2\2\2\u02a2]\3\2\2\2\u02a3\u02a8\5`\61\2"+
- "\u02a4\u02a5\7\20\2\2\u02a5\u02a7\5`\61\2\u02a6\u02a4\3\2\2\2\u02a7\u02aa"+
- "\3\2\2\2\u02a8\u02a6\3\2\2\2\u02a8\u02a9\3\2\2\2\u02a9_\3\2\2\2\u02aa"+
- "\u02a8\3\2\2\2\u02ab\u02b2\5b\62\2\u02ac\u02b2\5d\63\2\u02ad\u02b2\5~"+
- "@\2\u02ae\u02b2\5\u0082B\2\u02af\u02b2\5\u0086D\2\u02b0\u02b2\5\u0088"+
- "E\2\u02b1\u02ab\3\2\2\2\u02b1\u02ac\3\2\2\2\u02b1\u02ad\3\2\2\2\u02b1"+
- "\u02ae\3\2\2\2\u02b1\u02af\3\2\2\2\u02b1\u02b0\3\2\2\2\u02b2a\3\2\2\2"+
- "\u02b3\u02bc\5z>\2\u02b4\u02bc\5\u008cG\2\u02b5\u02bc\5\u00d8m\2\u02b6"+
- "\u02bc\5\u00dan\2\u02b7\u02bc\5\u00dco\2\u02b8\u02bc\5\u00dep\2\u02b9"+
- "\u02bc\5\u00e0q\2\u02ba\u02bc\5\u00e2r\2\u02bb\u02b3\3\2\2\2\u02bb\u02b4"+
- "\3\2\2\2\u02bb\u02b5\3\2\2\2\u02bb\u02b6\3\2\2\2\u02bb\u02b7\3\2\2\2\u02bb"+
- "\u02b8\3\2\2\2\u02bb\u02b9\3\2\2\2\u02bb\u02ba\3\2\2\2\u02bcc\3\2\2\2"+
- "\u02bd\u02c0\5f\64\2\u02be\u02c0\5j\66\2\u02bf\u02bd\3\2\2\2\u02bf\u02be"+
- "\3\2\2\2\u02c0\u02c9\3\2\2\2\u02c1\u02c8\5f\64\2\u02c2\u02c8\5j\66\2\u02c3"+
- "\u02c8\5n8\2\u02c4\u02c8\5p9\2\u02c5\u02c8\5t;\2\u02c6\u02c8\5x=\2\u02c7"+
- "\u02c1\3\2\2\2\u02c7\u02c2\3\2\2\2\u02c7\u02c3\3\2\2\2\u02c7\u02c4\3\2"+
- "\2\2\u02c7\u02c5\3\2\2\2\u02c7\u02c6\3\2\2\2\u02c8\u02cb\3\2\2\2\u02c9"+
- "\u02c7\3\2\2\2\u02c9\u02ca\3\2\2\2\u02ca\u02cc\3\2\2\2\u02cb\u02c9\3\2"+
- "\2\2\u02cc\u02cd\7E\2\2\u02cd\u02ce\5`\61\2\u02cee\3\2\2\2\u02cf\u02d0"+
- "\7?\2\2\u02d0\u02d5\5h\65\2\u02d1\u02d2\7\20\2\2\u02d2\u02d4\5h\65\2\u02d3"+
- "\u02d1\3\2\2\2\u02d4\u02d7\3\2\2\2\u02d5\u02d3\3\2\2\2\u02d5\u02d6\3\2"+
- "\2\2\u02d6g\3\2\2\2\u02d7\u02d5\3\2\2\2\u02d8\u02db\5\u00c2b\2\u02d9\u02da"+
- "\7H\2\2\u02da\u02dc\5\u00e8u\2\u02db\u02d9\3\2\2\2\u02db\u02dc\3\2\2\2"+
- "\u02dc\u02df\3\2\2\2\u02dd\u02de\7J\2\2\u02de\u02e0\7K\2\2\u02df\u02dd"+
- "\3\2\2\2\u02df\u02e0\3\2\2\2\u02e0\u02e3\3\2\2\2\u02e1\u02e2\7I\2\2\u02e2"+
- "\u02e4\5\u00c2b\2\u02e3\u02e1\3\2\2\2\u02e3\u02e4\3\2\2\2\u02e4\u02e5"+
- "\3\2\2\2\u02e5\u02e6\7G\2\2\u02e6\u02e7\5`\61\2\u02e7i\3\2\2\2\u02e8\u02e9"+
- "\7@\2\2\u02e9\u02ee\5l\67\2\u02ea\u02eb\7\20\2\2\u02eb\u02ed\5l\67\2\u02ec"+
- "\u02ea\3\2\2\2\u02ed\u02f0\3\2\2\2\u02ee\u02ec\3\2\2\2\u02ee\u02ef\3\2"+
- "\2\2\u02efk\3\2\2\2\u02f0\u02ee\3\2\2\2\u02f1\u02f4\5\u00c2b\2\u02f2\u02f3"+
- "\7H\2\2\u02f3\u02f5\5\u00e8u\2\u02f4\u02f2\3\2\2\2\u02f4\u02f5\3\2\2\2"+
- "\u02f5\u02f6\3\2\2\2\u02f6\u02f7\7\b\2\2\u02f7\u02f8\5`\61\2\u02f8m\3"+
- "\2\2\2\u02f9\u02fa\7A\2\2\u02fa\u02fb\5`\61\2\u02fbo\3\2\2\2\u02fc\u02fd"+
- "\7B\2\2\u02fd\u02fe\7C\2\2\u02fe\u0303\5r:\2\u02ff\u0300\7\20\2\2\u0300"+
- "\u0302\5r:\2\u0301\u02ff\3\2\2\2\u0302\u0305\3\2\2\2\u0303\u0301\3\2\2"+
- "\2\u0303\u0304\3\2\2\2\u0304q\3\2\2\2\u0305\u0303\3\2\2\2\u0306\u030d"+
- "\5\u00c2b\2\u0307\u0308\7H\2\2\u0308\u030a\5\u00e8u\2\u0309\u0307\3\2"+
- "\2\2\u0309\u030a\3\2\2\2\u030a\u030b\3\2\2\2\u030b\u030c\7\b\2\2\u030c"+
- "\u030e\5`\61\2\u030d\u0309\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u0311\3\2"+
- "\2\2\u030f\u0310\7S\2\2\u0310\u0312\5\u00fa~\2\u0311\u030f\3\2\2\2\u0311"+
- "\u0312\3\2\2\2\u0312s\3\2\2\2\u0313\u0314\7D\2\2\u0314\u0319\7C\2\2\u0315"+
- "\u0316\7M\2\2\u0316\u0317\7D\2\2\u0317\u0319\7C\2\2\u0318\u0313\3\2\2"+
- "\2\u0318\u0315\3\2\2\2\u0319\u031a\3\2\2\2\u031a\u031f\5v<\2\u031b\u031c"+
- "\7\20\2\2\u031c\u031e\5v<\2\u031d\u031b\3\2\2\2\u031e\u0321\3\2\2\2\u031f"+
- "\u031d\3\2\2\2\u031f\u0320\3\2\2\2\u0320u\3\2\2\2\u0321\u031f\3\2\2\2"+
- "\u0322\u0325\5`\61\2\u0323\u0326\7N\2\2\u0324\u0326\7O\2\2\u0325\u0323"+
- "\3\2\2\2\u0325\u0324\3\2\2\2\u0325\u0326\3\2\2\2\u0326\u032c\3\2\2\2\u0327"+
- "\u032a\7K\2\2\u0328\u032b\7T\2\2\u0329\u032b\7U\2\2\u032a\u0328\3\2\2"+
- "\2\u032a\u0329\3\2\2\2\u032b\u032d\3\2\2\2\u032c\u0327\3\2\2\2\u032c\u032d"+
- "\3\2\2\2\u032d\u0330\3\2\2\2\u032e\u032f\7S\2\2\u032f\u0331\5\u00fa~\2"+
- "\u0330\u032e\3\2\2\2\u0330\u0331\3\2\2\2\u0331w\3\2\2\2\u0332\u0333\7"+
- "L\2\2\u0333\u0334\5\u00c2b\2\u0334y\3\2\2\2\u0335\u0338\7P\2\2\u0336\u0338"+
- "\7Q\2\2\u0337\u0335\3\2\2\2\u0337\u0336\3\2\2\2\u0338\u0339\3\2\2\2\u0339"+
- "\u033e\5|?\2\u033a\u033b\7\20\2\2\u033b\u033d\5|?\2\u033c\u033a\3\2\2"+
- "\2\u033d\u0340\3\2\2\2\u033e\u033c\3\2\2\2\u033e\u033f\3\2\2\2\u033f\u0341"+
- "\3\2\2\2\u0340\u033e\3\2\2\2\u0341\u0342\7R\2\2\u0342\u0343\5`\61\2\u0343"+
- "{\3\2\2\2\u0344\u0347\5\u00c2b\2\u0345\u0346\7H\2\2\u0346\u0348\5\u00e8"+
- "u\2\u0347\u0345\3\2\2\2\u0347\u0348\3\2\2\2\u0348\u0349\3\2\2\2\u0349"+
- "\u034a\7G\2\2\u034a\u034b\5`\61\2\u034b}\3\2\2\2\u034c\u034d\7V\2\2\u034d"+
- "\u034e\7\13\2\2\u034e\u034f\5^\60\2\u034f\u0351\7\f\2\2\u0350\u0352\5"+
- "\u0080A\2\u0351\u0350\3\2\2\2\u0352\u0353\3\2\2\2\u0353\u0351\3\2\2\2"+
- "\u0353\u0354\3\2\2\2\u0354\u0355\3\2\2\2\u0355\u0356\7Z\2\2\u0356\u0357"+
- "\7E\2\2\u0357\u0358\5`\61\2\u0358\177\3\2\2\2\u0359\u035a\7W\2\2\u035a"+
- "\u035c\5`\61\2\u035b\u0359\3\2\2\2\u035c\u035d\3\2\2\2\u035d\u035b\3\2"+
- "\2\2\u035d\u035e\3\2\2\2\u035e\u035f\3\2\2\2\u035f\u0360\7E\2\2\u0360"+
- "\u0361\5`\61\2\u0361\u0081\3\2\2\2\u0362\u0363\7]\2\2\u0363\u0364\7\13"+
- "\2\2\u0364\u0365\5^\60\2\u0365\u0367\7\f\2\2\u0366\u0368\5\u0084C\2\u0367"+
- "\u0366\3\2\2\2\u0368\u0369\3\2\2\2\u0369\u0367\3\2\2\2\u0369\u036a\3\2"+
- "\2\2\u036a\u036b\3\2\2\2\u036b\u036d\7Z\2\2\u036c\u036e\5\u00c2b\2\u036d"+
- "\u036c\3\2\2\2\u036d\u036e\3\2\2\2\u036e\u036f\3\2\2\2\u036f\u0370\7E"+
- "\2\2\u0370\u0371\5`\61\2\u0371\u0083\3\2\2\2\u0372\u0376\7W\2\2\u0373"+
- "\u0374\5\u00c2b\2\u0374\u0375\7H\2\2\u0375\u0377\3\2\2\2\u0376\u0373\3"+
- "\2\2\2\u0376\u0377\3\2\2\2\u0377\u0378\3\2\2\2\u0378\u037d\5\u00e8u\2"+
- "\u0379\u037a\7\16\2\2\u037a\u037c\5\u00e8u\2\u037b\u0379\3\2\2\2\u037c"+
- "\u037f\3\2\2\2\u037d\u037b\3\2\2\2\u037d\u037e\3\2\2\2\u037e\u0380\3\2"+
- "\2\2\u037f\u037d\3\2\2\2\u0380\u0381\7E\2\2\u0381\u0382\5`\61\2\u0382"+
- "\u0085\3\2\2\2\u0383\u0384\7F\2\2\u0384\u0385\7\13\2\2\u0385\u0386\5^"+
- "\60\2\u0386\u0387\7\f\2\2\u0387\u0388\7[\2\2\u0388\u0389\5`\61\2\u0389"+
- "\u038a\7\\\2\2\u038a\u038b\5`\61\2\u038b\u0087\3\2\2\2\u038c\u038d\7X"+
- "\2\2\u038d\u038e\7\t\2\2\u038e\u038f\5^\60\2\u038f\u0391\7\n\2\2\u0390"+
- "\u0392\5\u008aF\2\u0391\u0390\3\2\2\2\u0392\u0393\3\2\2\2\u0393\u0391"+
- "\3\2\2\2\u0393\u0394\3\2\2\2\u0394\u0089\3\2\2\2\u0395\u0398\7Y\2\2\u0396"+
- "\u0399\7\r\2\2\u0397\u0399\5J&\2\u0398\u0396\3\2\2\2\u0398\u0397\3\2\2"+
- "\2\u0399\u03a1\3\2\2\2\u039a\u039d\7\16\2\2\u039b\u039e\7\r\2\2\u039c"+
- "\u039e\5J&\2\u039d\u039b\3\2\2\2\u039d\u039c\3\2\2\2\u039e\u03a0\3\2\2"+
- "\2\u039f\u039a\3\2\2\2\u03a0\u03a3\3\2\2\2\u03a1\u039f\3\2\2\2\u03a1\u03a2"+
- "\3\2\2\2\u03a2\u03a4\3\2\2\2\u03a3\u03a1\3\2\2\2\u03a4\u03a5\7\t\2\2\u03a5"+
- "\u03a6\5^\60\2\u03a6\u03a7\7\n\2\2\u03a7\u008b\3\2\2\2\u03a8\u03ad\5\u008e"+
- "H\2\u03a9\u03aa\7^\2\2\u03aa\u03ac\5\u008eH\2\u03ab\u03a9\3\2\2\2\u03ac"+
- "\u03af\3\2\2\2\u03ad\u03ab\3\2\2\2\u03ad\u03ae\3\2\2\2\u03ae\u008d\3\2"+
- "\2\2\u03af\u03ad\3\2\2\2\u03b0\u03b5\5\u0090I\2\u03b1\u03b2\7_\2\2\u03b2"+
- "\u03b4\5\u0090I\2\u03b3\u03b1\3\2\2\2\u03b4\u03b7\3\2\2\2\u03b5\u03b3"+
- "\3\2\2\2\u03b5\u03b6\3\2\2\2\u03b6\u008f\3\2\2\2\u03b7\u03b5\3\2\2\2\u03b8"+
- "\u03ba\7`\2\2\u03b9\u03b8\3\2\2\2\u03b9\u03ba\3\2\2\2\u03ba\u03bb\3\2"+
- "\2\2\u03bb\u03bc\5\u0092J\2\u03bc\u0091\3\2\2\2\u03bd\u03c0\5\u0094K\2"+
- "\u03be\u03bf\t\5\2\2\u03bf\u03c1\5\u0094K\2\u03c0\u03be\3\2\2\2\u03c0"+
- "\u03c1\3\2\2\2\u03c1\u0093\3\2\2\2\u03c2\u03c7\5\u0096L\2\u03c3\u03c4"+
- "\7\61\2\2\u03c4\u03c6\5\u0096L\2\u03c5\u03c3\3\2\2\2\u03c6\u03c9\3\2\2"+
- "\2\u03c7\u03c5\3\2\2\2\u03c7\u03c8\3\2\2\2\u03c8\u0095\3\2\2\2\u03c9\u03c7"+
- "\3\2\2\2\u03ca\u03cd\5\u0098M\2\u03cb\u03cc\7a\2\2\u03cc\u03ce\5\u0098"+
- "M\2\u03cd\u03cb\3\2\2\2\u03cd\u03ce\3\2\2\2\u03ce\u0097\3\2\2\2\u03cf"+
- "\u03d4\5\u009aN\2\u03d0\u03d1\t\6\2\2\u03d1\u03d3\5\u009aN\2\u03d2\u03d0"+
- "\3\2\2\2\u03d3\u03d6\3\2\2\2\u03d4\u03d2\3\2\2\2\u03d4\u03d5\3\2\2\2\u03d5"+
- "\u0099\3\2\2\2\u03d6\u03d4\3\2\2\2\u03d7\u03dc\5\u009cO\2\u03d8\u03d9"+
- "\t\7\2\2\u03d9\u03db\5\u009cO\2\u03da\u03d8\3\2\2\2\u03db\u03de\3\2\2"+
- "\2\u03dc\u03da\3\2\2\2\u03dc\u03dd\3\2\2\2\u03dd\u009b\3\2\2\2\u03de\u03dc"+
- "\3\2\2\2\u03df\u03e3\5\u009eP\2\u03e0\u03e1\7b\2\2\u03e1\u03e2\7c\2\2"+
- "\u03e2\u03e4\5\u00e8u\2\u03e3\u03e0\3\2\2\2\u03e3\u03e4\3\2\2\2\u03e4"+
- "\u009d\3\2\2\2\u03e5\u03e9\5\u00a0Q\2\u03e6\u03e7\7e\2\2\u03e7\u03e8\7"+
- "d\2\2\u03e8\u03ea\5\u00e8u\2\u03e9\u03e6\3\2\2\2\u03e9\u03ea\3\2\2\2\u03ea"+
- "\u009f\3\2\2\2\u03eb\u03ef\5\u00a2R\2\u03ec\u03ed\7f\2\2\u03ed\u03ee\7"+
- "H\2\2\u03ee\u03f0\5\u00e8u\2\u03ef\u03ec\3\2\2\2\u03ef\u03f0\3\2\2\2\u03f0"+
- "\u00a1\3\2\2\2\u03f1\u03f5\5\u00a4S\2\u03f2\u03f3\7h\2\2\u03f3\u03f4\7"+
- "H\2\2\u03f4\u03f6\5\u00f4{\2\u03f5\u03f2\3\2\2\2\u03f5\u03f6\3\2\2\2\u03f6"+
- "\u00a3\3\2\2\2\u03f7\u03fb\5\u00a6T\2\u03f8\u03f9\7g\2\2\u03f9\u03fa\7"+
- "H\2\2\u03fa\u03fc\5\u00f4{\2\u03fb\u03f8\3\2\2\2\u03fb\u03fc\3\2\2\2\u03fc"+
- "\u00a5\3\2\2\2\u03fd\u0406\5\u00aaV\2\u03fe\u03ff\7\6\2\2\u03ff\u0400"+
- "\7/\2\2\u0400\u0401\3\2\2\2\u0401\u0402\5\u00a8U\2\u0402\u0403\5\u00ce"+
- "h\2\u0403\u0405\3\2\2\2\u0404\u03fe\3\2\2\2\u0405\u0408\3\2\2\2\u0406"+
- "\u0404\3\2\2\2\u0406\u0407\3\2\2\2\u0407\u00a7\3\2\2\2\u0408\u0406\3\2"+
- "\2\2\u0409\u040d\5J&\2\u040a\u040d\5\u00c2b\2\u040b\u040d\5\u00c4c\2\u040c"+
- "\u0409\3\2\2\2\u040c\u040a\3\2\2\2\u040c\u040b\3\2\2\2\u040d\u00a9\3\2"+
- "\2\2\u040e\u0410\t\6\2\2\u040f\u040e\3\2\2\2\u0410\u0413\3\2\2\2\u0411"+
- "\u040f\3\2\2\2\u0411\u0412\3\2\2\2\u0412\u0414\3\2\2\2\u0413\u0411\3\2"+
- "\2\2\u0414\u0415\5\u00acW\2\u0415\u00ab\3\2\2\2\u0416\u041a\5\u00b2Z\2"+
- "\u0417\u041a\5\u00aeX\2\u0418\u041a\5\u00b0Y\2\u0419\u0416\3\2\2\2\u0419"+
- "\u0417\3\2\2\2\u0419\u0418\3\2\2\2\u041a\u00ad\3\2\2\2\u041b\u041c\7o"+
- "\2\2\u041c\u041d\7n\2\2\u041d\u041e\5\u00e8u\2\u041e\u041f\7\t\2\2\u041f"+
- "\u0420\5^\60\2\u0420\u0421\7\n\2\2\u0421\u00af\3\2\2\2\u0422\u0423\7p"+
- "\2\2\u0423\u0424\7n\2\2\u0424\u0425\5\u00e8u\2\u0425\u0426\7\t\2\2\u0426"+
- "\u0427\5^\60\2\u0427\u0428\7\n\2\2\u0428\u00b1\3\2\2\2\u0429\u042e\5\u00b4"+
- "[\2\u042a\u042b\7\67\2\2\u042b\u042d\5\u00b4[\2\u042c\u042a\3\2\2\2\u042d"+
- "\u0430\3\2\2\2\u042e\u042c\3\2\2\2\u042e\u042f\3\2\2\2\u042f\u00b3\3\2"+
- "\2\2\u0430\u042e\3\2\2\2\u0431\u0439\5\u00be`\2\u0432\u0438\5\u00b6\\"+
- "\2\u0433\u0438\5\u00ba^\2\u0434\u0438\5\u00bc_\2\u0435\u0438\5\u00b8]"+
- "\2\u0436\u0438\5\u00ceh\2\u0437\u0432\3\2\2\2\u0437\u0433\3\2\2\2\u0437"+
- "\u0434\3\2\2\2\u0437\u0435\3\2\2\2\u0437\u0436\3\2\2\2\u0438\u043b\3\2"+
- "\2\2\u0439\u0437\3\2\2\2\u0439\u043a\3\2\2\2\u043a\u00b5\3\2\2\2\u043b"+
- "\u0439\3\2\2\2\u043c\u043d\78\2\2\u043d\u043e\78\2\2\u043e\u043f\5^\60"+
- "\2\u043f\u0440\79\2\2\u0440\u0441\79\2\2\u0441\u00b7\3\2\2\2\u0442\u0443"+
- "\78\2\2\u0443\u0444\79\2\2\u0444\u00b9\3\2\2\2\u0445\u0446\78\2\2\u0446"+
- "\u0447\5^\60\2\u0447\u0448\79\2\2\u0448\u00bb\3\2\2\2\u0449\u0450\7:\2"+
- "\2\u044a\u0451\5\u00fe\u0080\2\u044b\u0451\5\u00fc\177\2\u044c\u0451\7"+
- "\u0090\2\2\u044d\u0451\5\u00c4c\2\u044e\u0451\5\u00c2b\2\u044f\u0451\5"+
- "\u00c6d\2\u0450\u044a\3\2\2\2\u0450\u044b\3\2\2\2\u0450\u044c\3\2\2\2"+
- "\u0450\u044d\3\2\2\2\u0450\u044e\3\2\2\2\u0450\u044f\3\2\2\2\u0451\u00bd"+
- "\3\2\2\2\u0452\u0462\7\u0089\2\2\u0453\u0462\7l\2\2\u0454\u0462\7m\2\2"+
- "\u0455\u0462\7\u008a\2\2\u0456\u0462\5\u00fc\177\2\u0457\u0462\5\u00c2"+
- "b\2\u0458\u0462\5\u00c4c\2\u0459\u0462\5\u00c6d\2\u045a\u0462\5\u00ea"+
- "v\2\u045b\u0462\5\u00ccg\2\u045c\u0462\5\u00c8e\2\u045d\u0462\5\u00ca"+
- "f\2\u045e\u0462\5\u00f8}\2\u045f\u0462\5\u00d2j\2\u0460\u0462\5\u00c0"+
- "a\2\u0461\u0452\3\2\2\2\u0461\u0453\3\2\2\2\u0461\u0454\3\2\2\2\u0461"+
- "\u0455\3\2\2\2\u0461\u0456\3\2\2\2\u0461\u0457\3\2\2\2\u0461\u0458\3\2"+
- "\2\2\u0461\u0459\3\2\2\2\u0461\u045a\3\2\2\2\u0461\u045b\3\2\2\2\u0461"+
- "\u045c\3\2\2\2\u0461\u045d\3\2\2\2\u0461\u045e\3\2\2\2\u0461\u045f\3\2"+
- "\2\2\u0461\u0460\3\2\2\2\u0462\u00bf\3\2\2\2\u0463\u0464\7\t\2\2\u0464"+
- "\u0465\5\20\t\2\u0465\u0466\7\n\2\2\u0466\u00c1\3\2\2\2\u0467\u0468\7"+
- "\7\2\2\u0468\u0469\5J&\2\u0469\u00c3\3\2\2\2\u046a\u046c\7\13\2\2\u046b"+
- "\u046d\5^\60\2\u046c\u046b\3\2\2\2\u046c\u046d\3\2\2\2\u046d\u046e\3\2"+
- "\2\2\u046e\u046f\7\f\2\2\u046f\u00c5\3\2\2\2\u0470\u0471\7;\2\2\u0471"+
- "\u00c7\3\2\2\2\u0472\u0473\7\22\2\2\u0473\u0474\7\t\2\2\u0474\u0475\5"+
- "^\60\2\u0475\u0476\7\n\2\2\u0476\u00c9\3\2\2\2\u0477\u0478\7k\2\2\u0478"+
- "\u0479\7\t\2\2\u0479\u047a\5^\60\2\u047a\u047b\7\n\2\2\u047b\u00cb\3\2"+
- "\2\2\u047c\u047d\5J&\2\u047d\u047e\5\u00ceh\2\u047e\u00cd\3\2\2\2\u047f"+
- "\u0486\7\13\2\2\u0480\u0482\5\u00d0i\2\u0481\u0483\7\20\2\2\u0482\u0481"+
- "\3\2\2\2\u0482\u0483\3\2\2\2\u0483\u0485\3\2\2\2\u0484\u0480\3\2\2\2\u0485"+
- "\u0488\3\2\2\2\u0486\u0484\3\2\2\2\u0486\u0487\3\2\2\2\u0487\u0489\3\2"+
- "\2\2\u0488\u0486\3\2\2\2\u0489\u048a\7\f\2\2\u048a\u00cf\3\2\2\2\u048b"+
- "\u048e\5`\61\2\u048c\u048e\7\u0088\2\2\u048d\u048b\3\2\2\2\u048d\u048c"+
- "\3\2\2\2\u048e\u00d1\3\2\2\2\u048f\u0492\5\u00d4k\2\u0490\u0492\5\u00d6"+
- "l\2\u0491\u048f\3\2\2\2\u0491\u0490\3\2\2\2\u0492\u00d3\3\2\2\2\u0493"+
- "\u0494\5J&\2\u0494\u0495\7<\2\2\u0495\u0496\7\u008a\2\2\u0496\u00d5\3"+
- "\2\2\2\u0497\u0498\5\64\33\2\u0498\u0499\7!\2\2\u0499\u049b\7\13\2\2\u049a"+
- "\u049c\5Z.\2\u049b\u049a\3\2\2\2\u049b\u049c\3\2\2\2\u049c\u049d\3\2\2"+
- "\2\u049d\u04a0\7\f\2\2\u049e\u049f\7H\2\2\u049f\u04a1\5\u00e8u\2\u04a0"+
- "\u049e\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a3\7\t"+
- "\2\2\u04a3\u04a4\5\22\n\2\u04a4\u04a5\7\n\2\2\u04a5\u00d7\3\2\2\2\u04a6"+
- "\u04a7\7u\2\2\u04a7\u04a8\7~\2\2\u04a8\u04a9\5`\61\2\u04a9\u04aa\7|\2"+
- "\2\u04aa\u04ae\5`\61\2\u04ab\u04ac\7I\2\2\u04ac\u04ad\7\u0080\2\2\u04ad"+
- "\u04af\5`\61\2\u04ae\u04ab\3\2\2\2\u04ae\u04af\3\2\2\2\u04af\u04be\3\2"+
- "\2\2\u04b0\u04b1\7u\2\2\u04b1\u04b2\7~\2\2\u04b2\u04b7\5\u00f6|\2\u04b3"+
- "\u04b4\7\20\2\2\u04b4\u04b6\5\u00f6|\2\u04b5\u04b3\3\2\2\2\u04b6\u04b9"+
- "\3\2\2\2\u04b7\u04b5\3\2\2\2\u04b7\u04b8\3\2\2\2\u04b8\u04ba\3\2\2\2\u04b9"+
- "\u04b7\3\2\2\2\u04ba\u04bb\7|\2\2\u04bb\u04bc\5`\61\2\u04bc\u04be\3\2"+
- "\2\2\u04bd\u04a6\3\2\2\2\u04bd\u04b0\3\2\2\2\u04be\u00d9\3\2\2\2\u04bf"+
- "\u04c0\7v\2\2\u04c0\u04c1\7~\2\2\u04c1\u04c2\5\u00e4s\2\u04c2\u00db\3"+
- "\2\2\2\u04c3\u04c4\7w\2\2\u04c4\u04c5\7~\2\2\u04c5\u04c6\5\u00e4s\2\u04c6"+
- "\u04c7\7H\2\2\u04c7\u04c8\5`\61\2\u04c8\u00dd\3\2\2\2\u04c9\u04ca\7x\2"+
- "\2\u04ca\u04cb\7}\2\2\u04cb\u04cc\7c\2\2\u04cc\u04cd\7~\2\2\u04cd\u04ce"+
- "\5\u00e4s\2\u04ce\u04cf\7\177\2\2\u04cf\u04d0\5`\61\2\u04d0\u00df\3\2"+
- "\2\2\u04d1\u04d2\7y\2\2\u04d2\u04d7\5\u00e6t\2\u04d3\u04d4\7\20\2\2\u04d4"+
- "\u04d6\5\u00e6t\2\u04d5\u04d3\3\2\2\2\u04d6\u04d9\3\2\2\2\u04d7\u04d5"+
- "\3\2\2\2\u04d7\u04d8\3\2\2\2\u04d8\u04da\3\2\2\2\u04d9\u04d7\3\2\2\2\u04da"+
- "\u04db\7z\2\2\u04db\u04dc\5`\61\2\u04dc\u04dd\7E\2\2\u04dd\u04de\5`\61"+
- "\2\u04de\u00e1\3\2\2\2\u04df\u04e0\7{\2\2\u04e0\u04e1\7~\2\2\u04e1\u04e2"+
- "\5`\61\2\u04e2\u04e3\7|\2\2\u04e3\u04e4\5`\61\2\u04e4\u00e3\3\2\2\2\u04e5"+
- "\u04e8\5\u00be`\2\u04e6\u04e9\5\u00b6\\\2\u04e7\u04e9\5\u00bc_\2\u04e8"+
- "\u04e6\3\2\2\2\u04e8\u04e7\3\2\2\2\u04e9\u04ea\3\2\2\2\u04ea\u04e8\3\2"+
- "\2\2\u04ea\u04eb\3\2\2\2\u04eb\u00e5\3\2\2\2\u04ec\u04ed\5\u00c2b\2\u04ed"+
- "\u04ee\7\b\2\2\u04ee\u04ef\5`\61\2\u04ef\u00e7\3\2\2\2\u04f0\u04f1\7\13"+
- "\2\2\u04f1\u04f9\7\f\2\2\u04f2\u04f6\5\u00ecw\2\u04f3\u04f7\7\u0088\2"+
- "\2\u04f4\u04f7\7\r\2\2\u04f5\u04f7\7\62\2\2\u04f6\u04f3\3\2\2\2\u04f6"+
- "\u04f4\3\2\2\2\u04f6\u04f5\3\2\2\2\u04f6\u04f7\3\2\2\2\u04f7\u04f9\3\2"+
- "\2\2\u04f8\u04f0\3\2\2\2\u04f8\u04f2\3\2\2\2\u04f9\u00e9\3\2\2\2\u04fa"+
- "\u0503\7\t\2\2\u04fb\u0500\5\u00f6|\2\u04fc\u04fd\7\20\2\2\u04fd\u04ff"+
- "\5\u00f6|\2\u04fe\u04fc\3\2\2\2\u04ff\u0502\3\2\2\2\u0500\u04fe\3\2\2"+
- "\2\u0500\u0501\3\2\2\2\u0501\u0504\3\2\2\2\u0502\u0500\3\2\2\2\u0503\u04fb"+
- "\3\2\2\2\u0503\u0504\3\2\2\2\u0504\u0505\3\2\2\2\u0505\u050b\7\n\2\2\u0506"+
- "\u0507\7=\2\2\u0507\u0508\5^\60\2\u0508\u0509\7>\2\2\u0509\u050b\3\2\2"+
- "\2\u050a\u04fa\3\2\2\2\u050a\u0506\3\2\2\2\u050b\u00eb\3\2\2\2\u050c\u0510"+
- "\5J&\2\u050d\u0510\7\u0089\2\2\u050e\u0510\5\u00eex\2\u050f\u050c\3\2"+
- "\2\2\u050f\u050d\3\2\2\2\u050f\u050e\3\2\2\2\u0510\u00ed\3\2\2\2\u0511"+
- "\u0514\5\u00f0y\2\u0512\u0514\5\u00f2z\2\u0513\u0511\3\2\2\2\u0513\u0512"+
- "\3\2\2\2\u0514\u00ef\3\2\2\2\u0515\u0516\7!\2\2\u0516\u0517\7\13\2\2\u0517"+
- "\u0518\7\r\2\2\u0518\u0519\7\f\2\2\u0519\u00f1\3\2\2\2\u051a\u051b\7!"+
- "\2\2\u051b\u0524\7\13\2\2\u051c\u0521\5\u00e8u\2\u051d\u051e\7\20\2\2"+
- "\u051e\u0520\5\u00e8u\2\u051f\u051d\3\2\2\2\u0520\u0523\3\2\2\2\u0521"+
- "\u051f\3\2\2\2\u0521\u0522\3\2\2\2\u0522\u0525\3\2\2\2\u0523\u0521\3\2"+
- "\2\2\u0524\u051c\3\2\2\2\u0524\u0525\3\2\2\2\u0525\u0526\3\2\2\2\u0526"+
- "\u0527\7\f\2\2\u0527\u0528\7H\2\2\u0528\u0529\5\u00e8u\2\u0529\u00f3\3"+
- "\2\2\2\u052a\u052c\5\u00ecw\2\u052b\u052d\7\u0088\2\2\u052c\u052b\3\2"+
- "\2\2\u052c\u052d\3\2\2\2\u052d\u00f5\3\2\2\2\u052e\u0531\5`\61\2\u052f"+
- "\u0531\7\u0090\2\2\u0530\u052e\3\2\2\2\u0530\u052f\3\2\2\2\u0531\u0532"+
- "\3\2\2\2\u0532\u0533\t\b\2\2\u0533\u0534\5`\61\2\u0534\u00f7\3\2\2\2\u0535"+
- "\u0537\78\2\2\u0536\u0538\5^\60\2\u0537\u0536\3\2\2\2\u0537\u0538\3\2"+
- "\2\2\u0538\u0539\3\2\2\2\u0539\u053a\79\2\2\u053a\u00f9\3\2\2\2\u053b"+
- "\u053c\5\u00fc\177\2\u053c\u00fb\3\2\2\2\u053d\u053e\7\u0087\2\2\u053e"+
- "\u00fd\3\2\2\2\u053f\u0540\t\t\2\2\u0540\u00ff\3\2\2\2\u0086\u0108\u010c"+
- "\u011c\u0122\u012a\u0132\u013a\u0149\u0167\u016f\u0171\u0187\u0191\u019b"+
- "\u01a0\u01a5\u01a9\u01b5\u01b9\u01c2\u01c9\u01d7\u01db\u01e0\u01ea\u01f2"+
- "\u01f6\u0202\u020e\u0224\u022c\u0231\u0234\u0238\u0241\u024a\u024d\u0255"+
- "\u025c\u025e\u0265\u026c\u026e\u0276\u027b\u0282\u0289\u0293\u029a\u02a1"+
- "\u02a8\u02b1\u02bb\u02bf\u02c7\u02c9\u02d5\u02db\u02df\u02e3\u02ee\u02f4"+
- "\u0303\u0309\u030d\u0311\u0318\u031f\u0325\u032a\u032c\u0330\u0337\u033e"+
- "\u0347\u0353\u035d\u0369\u036d\u0376\u037d\u0393\u0398\u039d\u03a1\u03ad"+
- "\u03b5\u03b9\u03c0\u03c7\u03cd\u03d4\u03dc\u03e3\u03e9\u03ef\u03f5\u03fb"+
- "\u0406\u040c\u0411\u0419\u042e\u0437\u0439\u0450\u0461\u046c\u0482\u0486"+
- "\u048d\u0491\u049b\u04a0\u04ae\u04b7\u04bd\u04d7\u04e8\u04ea\u04f6\u04f8"+
- "\u0500\u0503\u050a\u050f\u0513\u0521\u0524\u052c\u0530\u0537";
+ "\21\3\21\3\21\3\21\3\22\3\22\5\22\u01b0\n\22\3\22\3\22\3\22\3\22\3\22"+
+ "\3\22\7\22\u01b8\n\22\f\22\16\22\u01bb\13\22\3\22\3\22\3\22\3\23\3\23"+
+ "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\6\24\u01ce"+
+ "\n\24\r\24\16\24\u01cf\3\24\3\24\3\24\3\24\3\25\3\25\6\25\u01d8\n\25\r"+
+ "\25\16\25\u01d9\3\25\3\25\3\25\3\26\3\26\3\26\6\26\u01e2\n\26\r\26\16"+
+ "\26\u01e3\3\27\3\27\3\27\5\27\u01e9\n\27\3\27\3\27\3\27\5\27\u01ee\n\27"+
+ "\7\27\u01f0\n\27\f\27\16\27\u01f3\13\27\3\27\3\27\3\30\3\30\3\30\3\30"+
+ "\3\30\6\30\u01fc\n\30\r\30\16\30\u01fd\3\30\3\30\5\30\u0202\n\30\3\30"+
+ "\3\30\3\30\3\31\3\31\3\31\3\31\5\31\u020b\n\31\3\31\3\31\3\31\7\31\u0210"+
+ "\n\31\f\31\16\31\u0213\13\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3"+
+ "\32\7\32\u021e\n\32\f\32\16\32\u0221\13\32\3\32\5\32\u0224\n\32\3\33\7"+
+ "\33\u0227\n\33\f\33\16\33\u022a\13\33\3\34\3\34\3\34\3\34\3\34\7\34\u0231"+
+ "\n\34\f\34\16\34\u0234\13\34\3\34\3\34\3\35\3\35\3\35\5\35\u023b\n\35"+
+ "\3\35\3\35\5\35\u023f\n\35\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37"+
+ "\3\37\5\37\u024b\n\37\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\5!\u0257\n!\3\"\3"+
+ "\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\5%\u026d\n"+
+ "%\3%\3%\3%\3%\7%\u0273\n%\f%\16%\u0276\13%\3&\3&\5&\u027a\n&\3&\5&\u027d"+
+ "\n&\3&\3&\5&\u0281\n&\3\'\3\'\3(\3(\3(\3(\3(\5(\u028a\n(\3(\3(\3(\3(\3"+
+ "(\7(\u0291\n(\f(\16(\u0294\13(\5(\u0296\n(\3)\3)\3)\3)\3)\3)\5)\u029e"+
+ "\n)\3)\3)\3)\3)\3)\5)\u02a5\n)\5)\u02a7\n)\3*\3*\3*\3*\3*\5*\u02ae\n*"+
+ "\3*\3*\3*\3*\3*\5*\u02b5\n*\5*\u02b7\n*\3+\3+\3+\3+\3+\3+\5+\u02bf\n+"+
+ "\3+\3+\3+\5+\u02c4\n+\3+\3+\3+\3+\3+\5+\u02cb\n+\3,\3,\3,\3,\3,\5,\u02d2"+
+ "\n,\3,\3,\3-\3-\3-\3-\3-\3-\5-\u02dc\n-\3.\3.\3.\7.\u02e1\n.\f.\16.\u02e4"+
+ "\13.\3/\3/\3/\3/\5/\u02ea\n/\3\60\3\60\3\60\7\60\u02ef\n\60\f\60\16\60"+
+ "\u02f2\13\60\3\61\3\61\3\61\3\61\3\61\3\61\5\61\u02fa\n\61\3\62\3\62\3"+
+ "\62\3\62\3\62\3\62\3\62\3\62\5\62\u0304\n\62\3\63\3\63\5\63\u0308\n\63"+
+ "\3\63\3\63\3\63\3\63\3\63\3\63\7\63\u0310\n\63\f\63\16\63\u0313\13\63"+
+ "\3\63\3\63\3\63\3\64\3\64\3\64\3\64\7\64\u031c\n\64\f\64\16\64\u031f\13"+
+ "\64\3\65\3\65\3\65\5\65\u0324\n\65\3\65\3\65\5\65\u0328\n\65\3\65\3\65"+
+ "\5\65\u032c\n\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\7\66\u0335\n\66\f"+
+ "\66\16\66\u0338\13\66\3\67\3\67\3\67\5\67\u033d\n\67\3\67\3\67\3\67\3"+
+ "8\38\38\39\39\39\39\39\79\u034a\n9\f9\169\u034d\139\3:\3:\3:\5:\u0352"+
+ "\n:\3:\3:\5:\u0356\n:\3:\3:\5:\u035a\n:\3;\3;\3;\3;\3;\5;\u0361\n;\3;"+
+ "\3;\3;\7;\u0366\n;\f;\16;\u0369\13;\3<\3<\3<\5<\u036e\n<\3<\3<\3<\5<\u0373"+
+ "\n<\5<\u0375\n<\3<\3<\5<\u0379\n<\3=\3=\3=\3>\3>\5>\u0380\n>\3>\3>\3>"+
+ "\7>\u0385\n>\f>\16>\u0388\13>\3>\3>\3>\3?\3?\3?\5?\u0390\n?\3?\3?\3?\3"+
+ "@\3@\3@\3@\3@\6@\u039a\n@\r@\16@\u039b\3@\3@\3@\3@\3A\3A\6A\u03a4\nA\r"+
+ "A\16A\u03a5\3A\3A\3A\3B\3B\3B\3B\3B\6B\u03b0\nB\rB\16B\u03b1\3B\3B\5B"+
+ "\u03b6\nB\3B\3B\3B\3C\3C\3C\3C\5C\u03bf\nC\3C\3C\3C\7C\u03c4\nC\fC\16"+
+ "C\u03c7\13C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\6E\u03da"+
+ "\nE\rE\16E\u03db\3F\3F\3F\5F\u03e1\nF\3F\3F\3F\5F\u03e6\nF\7F\u03e8\n"+
+ "F\fF\16F\u03eb\13F\3F\3F\3F\3F\3G\3G\3G\7G\u03f4\nG\fG\16G\u03f7\13G\3"+
+ "H\3H\3H\7H\u03fc\nH\fH\16H\u03ff\13H\3I\5I\u0402\nI\3I\3I\3J\3J\3J\5J"+
+ "\u0409\nJ\3K\3K\3K\7K\u040e\nK\fK\16K\u0411\13K\3L\3L\3L\5L\u0416\nL\3"+
+ "M\3M\3M\7M\u041b\nM\fM\16M\u041e\13M\3N\3N\3N\7N\u0423\nN\fN\16N\u0426"+
+ "\13N\3O\3O\3O\3O\5O\u042c\nO\3P\3P\3P\3P\5P\u0432\nP\3Q\3Q\3Q\3Q\5Q\u0438"+
+ "\nQ\3R\3R\3R\3R\5R\u043e\nR\3S\3S\3S\3S\5S\u0444\nS\3T\3T\3T\3T\3T\3T"+
+ "\3T\7T\u044d\nT\fT\16T\u0450\13T\3U\3U\3U\5U\u0455\nU\3V\7V\u0458\nV\f"+
+ "V\16V\u045b\13V\3V\3V\3W\3W\3W\5W\u0462\nW\3X\3X\3X\3X\3X\3X\3X\3Y\3Y"+
+ "\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\7Z\u0475\nZ\fZ\16Z\u0478\13Z\3[\3[\3[\3[\3[\3"+
+ "[\7[\u0480\n[\f[\16[\u0483\13[\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^"+
+ "\3^\3^\3_\3_\3_\3_\3_\3_\3_\5_\u0499\n_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`"+
+ "\3`\3`\3`\3`\3`\5`\u04aa\n`\3a\3a\3a\3a\3b\3b\3b\3c\3c\5c\u04b5\nc\3c"+
+ "\3c\3d\3d\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3g\3g\3g\3h\3h\3h\5h\u04cb\nh"+
+ "\7h\u04cd\nh\fh\16h\u04d0\13h\3h\3h\3i\3i\5i\u04d6\ni\3j\3j\5j\u04da\n"+
+ "j\3k\3k\3k\3k\3l\3l\3l\3l\5l\u04e4\nl\3l\3l\3l\5l\u04e9\nl\3l\3l\3l\3"+
+ "l\3m\3m\3m\3m\3m\3m\3m\3m\5m\u04f7\nm\3m\3m\3m\3m\3m\7m\u04fe\nm\fm\16"+
+ "m\u0501\13m\3m\3m\3m\5m\u0506\nm\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3p\3p\3"+
+ "p\3p\3p\3p\3p\3p\3q\3q\3q\3q\7q\u051e\nq\fq\16q\u0521\13q\3q\3q\3q\3q"+
+ "\3q\3r\3r\3r\3r\3r\3r\3s\3s\3s\6s\u0531\ns\rs\16s\u0532\3t\3t\3t\3t\3"+
+ "u\3u\5u\u053b\nu\3u\3u\3u\5u\u0540\nu\3v\3v\3v\7v\u0545\nv\fv\16v\u0548"+
+ "\13v\3w\3w\5w\u054c\nw\3x\3x\5x\u0550\nx\3x\3x\3y\3y\3y\3y\5y\u0558\n"+
+ "y\3z\3z\3z\3z\3{\3{\3{\3|\3|\3|\3|\5|\u0565\n|\3}\3}\3}\3}\3~\3~\3\177"+
+ "\3\177\5\177\u056f\n\177\3\u0080\3\u0080\5\u0080\u0573\n\u0080\3\u0081"+
+ "\3\u0081\3\u0081\5\u0081\u0578\n\u0081\3\u0082\3\u0082\3\u0082\3\u0082"+
+ "\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\7\u0084\u0583\n\u0084\f\u0084"+
+ "\16\u0084\u0586\13\u0084\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085"+
+ "\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\5\u0085\u0593\n\u0085\3\u0086"+
+ "\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\3\u0087\3\u0088\3\u0088"+
+ "\3\u0088\3\u0088\5\u0088\u05a1\n\u0088\3\u0088\3\u0088\3\u0089\3\u0089"+
+ "\3\u0089\3\u0089\3\u008a\3\u008a\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b"+
+ "\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\5\u008c\u05b5\n\u008c\3\u008c"+
+ "\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\5\u008d\u05be\n\u008d"+
+ "\5\u008d\u05c0\n\u008d\3\u008d\3\u008d\3\u008e\3\u008e\5\u008e\u05c6\n"+
+ "\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0091"+
+ "\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\5\u0091\u05d5\n\u0091\5\u0091"+
+ "\u05d7\n\u0091\5\u0091\u05d9\n\u0091\3\u0091\3\u0091\3\u0092\3\u0092\5"+
+ "\u0092\u05df\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094\3"+
+ "\u0094\3\u0095\3\u0095\3\u0096\3\u0096\3\u0097\3\u0097\3\u0098\3\u0098"+
+ "\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\5\u0099\u05f6\n\u0099"+
+ "\5\u0099\u05f8\n\u0099\3\u009a\3\u009a\3\u009a\3\u009a\7\u009a\u05fe\n"+
+ "\u009a\f\u009a\16\u009a\u0601\13\u009a\5\u009a\u0603\n\u009a\3\u009a\3"+
+ "\u009a\3\u009a\3\u009a\3\u009a\5\u009a\u060a\n\u009a\3\u009b\3\u009b\3"+
+ "\u009b\5\u009b\u060f\n\u009b\3\u009c\3\u009c\5\u009c\u0613\n\u009c\3\u009d"+
+ "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+
+ "\7\u009e\u061f\n\u009e\f\u009e\16\u009e\u0622\13\u009e\5\u009e\u0624\n"+
+ "\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009f\3\u009f\5\u009f\u062c\n"+
+ "\u009f\3\u00a0\3\u00a0\5\u00a0\u0630\n\u00a0\3\u00a0\3\u00a0\3\u00a0\3"+
+ "\u00a1\3\u00a1\5\u00a1\u0637\n\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3"+
+ "\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\2\2\u00a5\2\4\6\b\n\f\16\20\22"+
+ "\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnp"+
+ "rtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094"+
+ "\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac"+
+ "\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4"+
+ "\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc"+
+ "\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4"+
+ "\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c"+
+ "\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124"+
+ "\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c"+
+ "\u013e\u0140\u0142\u0144\u0146\2\r\4\2\21\21ii\3\2RS\3\2\24\35\4\2\5\5"+
+ "#-\3\2/\60\4\2\f\f\61\63\3\2\u0083\u0084\3\2\u0086\u008c\3\2\u008d\u0091"+
+ "\4\2\23\23\u00a8\u00a8\5\2=~\u00a1\u00a6\u00a9\u00a9\2\u0680\2\u0148\3"+
+ "\2\2\2\4\u0150\3\2\2\2\6\u0156\3\2\2\2\b\u0159\3\2\2\2\n\u016a\3\2\2\2"+
+ "\f\u0175\3\2\2\2\16\u017a\3\2\2\2\20\u017d\3\2\2\2\22\u0180\3\2\2\2\24"+
+ "\u0191\3\2\2\2\26\u0193\3\2\2\2\30\u0196\3\2\2\2\32\u019c\3\2\2\2\34\u01a0"+
+ "\3\2\2\2\36\u01a4\3\2\2\2 \u01a8\3\2\2\2\"\u01af\3\2\2\2$\u01bf\3\2\2"+
+ "\2&\u01c8\3\2\2\2(\u01d7\3\2\2\2*\u01de\3\2\2\2,\u01e5\3\2\2\2.\u01f6"+
+ "\3\2\2\2\60\u0206\3\2\2\2\62\u0217\3\2\2\2\64\u0228\3\2\2\2\66\u022b\3"+
+ "\2\2\28\u0237\3\2\2\2:\u0240\3\2\2\2<\u024a\3\2\2\2>\u024c\3\2\2\2@\u0256"+
+ "\3\2\2\2B\u0258\3\2\2\2D\u025d\3\2\2\2F\u0261\3\2\2\2H\u0267\3\2\2\2J"+
+ "\u027c\3\2\2\2L\u0282\3\2\2\2N\u0284\3\2\2\2P\u0297\3\2\2\2R\u02a8\3\2"+
+ "\2\2T\u02b8\3\2\2\2V\u02cc\3\2\2\2X\u02db\3\2\2\2Z\u02dd\3\2\2\2\\\u02e5"+
+ "\3\2\2\2^\u02eb\3\2\2\2`\u02f9\3\2\2\2b\u0303\3\2\2\2d\u0307\3\2\2\2f"+
+ "\u0317\3\2\2\2h\u0320\3\2\2\2j\u0330\3\2\2\2l\u0339\3\2\2\2n\u0341\3\2"+
+ "\2\2p\u0344\3\2\2\2r\u034e\3\2\2\2t\u0360\3\2\2\2v\u036a\3\2\2\2x\u037a"+
+ "\3\2\2\2z\u037f\3\2\2\2|\u038c\3\2\2\2~\u0394\3\2\2\2\u0080\u03a3\3\2"+
+ "\2\2\u0082\u03aa\3\2\2\2\u0084\u03ba\3\2\2\2\u0086\u03cb\3\2\2\2\u0088"+
+ "\u03d4\3\2\2\2\u008a\u03dd\3\2\2\2\u008c\u03f0\3\2\2\2\u008e\u03f8\3\2"+
+ "\2\2\u0090\u0401\3\2\2\2\u0092\u0405\3\2\2\2\u0094\u040a\3\2\2\2\u0096"+
+ "\u0412\3\2\2\2\u0098\u0417\3\2\2\2\u009a\u041f\3\2\2\2\u009c\u0427\3\2"+
+ "\2\2\u009e\u042d\3\2\2\2\u00a0\u0433\3\2\2\2\u00a2\u0439\3\2\2\2\u00a4"+
+ "\u043f\3\2\2\2\u00a6\u0445\3\2\2\2\u00a8\u0454\3\2\2\2\u00aa\u0459\3\2"+
+ "\2\2\u00ac\u0461\3\2\2\2\u00ae\u0463\3\2\2\2\u00b0\u046a\3\2\2\2\u00b2"+
+ "\u0471\3\2\2\2\u00b4\u0479\3\2\2\2\u00b6\u0484\3\2\2\2\u00b8\u048a\3\2"+
+ "\2\2\u00ba\u048d\3\2\2\2\u00bc\u0491\3\2\2\2\u00be\u04a9\3\2\2\2\u00c0"+
+ "\u04ab\3\2\2\2\u00c2\u04af\3\2\2\2\u00c4\u04b2\3\2\2\2\u00c6\u04b8\3\2"+
+ "\2\2\u00c8\u04ba\3\2\2\2\u00ca\u04bf\3\2\2\2\u00cc\u04c4\3\2\2\2\u00ce"+
+ "\u04c7\3\2\2\2\u00d0\u04d5\3\2\2\2\u00d2\u04d9\3\2\2\2\u00d4\u04db\3\2"+
+ "\2\2\u00d6\u04df\3\2\2\2\u00d8\u0505\3\2\2\2\u00da\u0507\3\2\2\2\u00dc"+
+ "\u050b\3\2\2\2\u00de\u0511\3\2\2\2\u00e0\u0519\3\2\2\2\u00e2\u0527\3\2"+
+ "\2\2\u00e4\u052d\3\2\2\2\u00e6\u0534\3\2\2\2\u00e8\u053f\3\2\2\2\u00ea"+
+ "\u0541\3\2\2\2\u00ec\u054b\3\2\2\2\u00ee\u054f\3\2\2\2\u00f0\u0557\3\2"+
+ "\2\2\u00f2\u0559\3\2\2\2\u00f4\u055d\3\2\2\2\u00f6\u0564\3\2\2\2\u00f8"+
+ "\u0566\3\2\2\2\u00fa\u056a\3\2\2\2\u00fc\u056e\3\2\2\2\u00fe\u0572\3\2"+
+ "\2\2\u0100\u0577\3\2\2\2\u0102\u0579\3\2\2\2\u0104\u057d\3\2\2\2\u0106"+
+ "\u0584\3\2\2\2\u0108\u0592\3\2\2\2\u010a\u0594\3\2\2\2\u010c\u0598\3\2"+
+ "\2\2\u010e\u059c\3\2\2\2\u0110\u05a4\3\2\2\2\u0112\u05a8\3\2\2\2\u0114"+
+ "\u05ac\3\2\2\2\u0116\u05b0\3\2\2\2\u0118\u05b8\3\2\2\2\u011a\u05c5\3\2"+
+ "\2\2\u011c\u05c7\3\2\2\2\u011e\u05cc\3\2\2\2\u0120\u05ce\3\2\2\2\u0122"+
+ "\u05de\3\2\2\2\u0124\u05e0\3\2\2\2\u0126\u05e5\3\2\2\2\u0128\u05e7\3\2"+
+ "\2\2\u012a\u05e9\3\2\2\2\u012c\u05eb\3\2\2\2\u012e\u05ed\3\2\2\2\u0130"+
+ "\u05f7\3\2\2\2\u0132\u0609\3\2\2\2\u0134\u060e\3\2\2\2\u0136\u0612\3\2"+
+ "\2\2\u0138\u0614\3\2\2\2\u013a\u0619\3\2\2\2\u013c\u0629\3\2\2\2\u013e"+
+ "\u062f\3\2\2\2\u0140\u0634\3\2\2\2\u0142\u063a\3\2\2\2\u0144\u063c\3\2"+
+ "\2\2\u0146\u063e\3\2\2\2\u0148\u0149\5\4\3\2\u0149\u014a\7\2\2\3\u014a"+
+ "\3\3\2\2\2\u014b\u014c\7h\2\2\u014c\u014d\7g\2\2\u014d\u014e\5\u0144\u00a3"+
+ "\2\u014e\u014f\7\3\2\2\u014f\u0151\3\2\2\2\u0150\u014b\3\2\2\2\u0150\u0151"+
+ "\3\2\2\2\u0151\u0154\3\2\2\2\u0152\u0155\5\b\5\2\u0153\u0155\5\6\4\2\u0154"+
+ "\u0152\3\2\2\2\u0154\u0153\3\2\2\2\u0155\5\3\2\2\2\u0156\u0157\5\n\6\2"+
+ "\u0157\u0158\5\f\7\2\u0158\7\3\2\2\2\u0159\u015a\7\4\2\2\u015a\u015b\7"+
+ "\u0081\2\2\u015b\u015c\7\u00b0\2\2\u015c\u015d\7\5\2\2\u015d\u015e\5\u0142"+
+ "\u00a2\2\u015e\u015f\7\3\2\2\u015f\u0160\5\n\6\2\u0160\t\3\2\2\2\u0161"+
+ "\u0165\5<\37\2\u0162\u0165\5> \2\u0163\u0165\5N(\2\u0164\u0161\3\2\2\2"+
+ "\u0164\u0162\3\2\2\2\u0164\u0163\3\2\2\2\u0165\u0166\3\2\2\2\u0166\u0167"+
+ "\7\3\2\2\u0167\u0169\3\2\2\2\u0168\u0164\3\2\2\2\u0169\u016c\3\2\2\2\u016a"+
+ "\u0168\3\2\2\2\u016a\u016b\3\2\2\2\u016b\u0172\3\2\2\2\u016c\u016a\3\2"+
+ "\2\2\u016d\u016e\5@!\2\u016e\u016f\7\3\2\2\u016f\u0171\3\2\2\2\u0170\u016d"+
+ "\3\2\2\2\u0171\u0174\3\2\2\2\u0172\u0170\3\2\2\2\u0172\u0173\3\2\2\2\u0173"+
+ "\13\3\2\2\2\u0174\u0172\3\2\2\2\u0175\u0176\5\22\n\2\u0176\r\3\2\2\2\u0177"+
+ "\u0179\5\24\13\2\u0178\u0177\3\2\2\2\u0179\u017c\3\2\2\2\u017a\u0178\3"+
+ "\2\2\2\u017a\u017b\3\2\2\2\u017b\17\3\2\2\2\u017c\u017a\3\2\2\2\u017d"+
+ "\u017e\5\16\b\2\u017e\u017f\5^\60\2\u017f\21\3\2\2\2\u0180\u0182\5\16"+
+ "\b\2\u0181\u0183\5^\60\2\u0182\u0181\3\2\2\2\u0182\u0183\3\2\2\2\u0183"+
+ "\23\3\2\2\2\u0184\u0192\5\26\f\2\u0185\u0192\5\30\r\2\u0186\u0192\5\32"+
+ "\16\2\u0187\u0192\5\34\17\2\u0188\u0192\5\36\20\2\u0189\u0192\5 \21\2"+
+ "\u018a\u0192\5\"\22\2\u018b\u0192\5$\23\2\u018c\u0192\5&\24\2\u018d\u0192"+
+ "\5*\26\2\u018e\u0192\5.\30\2\u018f\u0192\5\66\34\2\u0190\u0192\5:\36\2"+
+ "\u0191\u0184\3\2\2\2\u0191\u0185\3\2\2\2\u0191\u0186\3\2\2\2\u0191\u0187"+
+ "\3\2\2\2\u0191\u0188\3\2\2\2\u0191\u0189\3\2\2\2\u0191\u018a\3\2\2\2\u0191"+
+ "\u018b\3\2\2\2\u0191\u018c\3\2\2\2\u0191\u018d\3\2\2\2\u0191\u018e\3\2"+
+ "\2\2\u0191\u018f\3\2\2\2\u0191\u0190\3\2\2\2\u0192\25\3\2\2\2\u0193\u0194"+
+ "\5b\62\2\u0194\u0195\7\3\2\2\u0195\27\3\2\2\2\u0196\u0197\7\6\2\2\u0197"+
+ "\u0198\5J&\2\u0198\u0199\7\7\2\2\u0199\u019a\5`\61\2\u019a\u019b\7\3\2"+
+ "\2\u019b\31\3\2\2\2\u019c\u019d\7\b\2\2\u019d\u019e\5\16\b\2\u019e\u019f"+
+ "\7\t\2\2\u019f\33\3\2\2\2\u01a0\u01a1\7\u00a1\2\2\u01a1\u01a2\7\u00a2"+
+ "\2\2\u01a2\u01a3\7\3\2\2\u01a3\35\3\2\2\2\u01a4\u01a5\7\u00a3\2\2\u01a5"+
+ "\u01a6\7\u00a2\2\2\u01a6\u01a7\7\3\2\2\u01a7\37\3\2\2\2\u01a8\u01a9\7"+
+ "\u00a4\2\2\u01a9\u01aa\7\u00a5\2\2\u01aa\u01ab\5`\61\2\u01ab\u01ac\7\3"+
+ "\2\2\u01ac!\3\2\2\2\u01ad\u01b0\5f\64\2\u01ae\u01b0\5j\66\2\u01af\u01ad"+
+ "\3\2\2\2\u01af\u01ae\3\2\2\2\u01b0\u01b9\3\2\2\2\u01b1\u01b8\5f\64\2\u01b2"+
+ "\u01b8\5j\66\2\u01b3\u01b8\5n8\2\u01b4\u01b8\5p9\2\u01b5\u01b8\5t;\2\u01b6"+
+ "\u01b8\5x=\2\u01b7\u01b1\3\2\2\2\u01b7\u01b2\3\2\2\2\u01b7\u01b3\3\2\2"+
+ "\2\u01b7\u01b4\3\2\2\2\u01b7\u01b5\3\2\2\2\u01b7\u01b6\3\2\2\2\u01b8\u01bb"+
+ "\3\2\2\2\u01b9\u01b7\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bc\3\2\2\2\u01bb"+
+ "\u01b9\3\2\2\2\u01bc\u01bd\7C\2\2\u01bd\u01be\5\24\13\2\u01be#\3\2\2\2"+
+ "\u01bf\u01c0\7D\2\2\u01c0\u01c1\7\n\2\2\u01c1\u01c2\5^\60\2\u01c2\u01c3"+
+ "\7\13\2\2\u01c3\u01c4\7Y\2\2\u01c4\u01c5\5\24\13\2\u01c5\u01c6\7Z\2\2"+
+ "\u01c6\u01c7\5\24\13\2\u01c7%\3\2\2\2\u01c8\u01c9\7T\2\2\u01c9\u01ca\7"+
+ "\n\2\2\u01ca\u01cb\5^\60\2\u01cb\u01cd\7\13\2\2\u01cc\u01ce\5(\25\2\u01cd"+
+ "\u01cc\3\2\2\2\u01ce\u01cf\3\2\2\2\u01cf\u01cd\3\2\2\2\u01cf\u01d0\3\2"+
+ "\2\2\u01d0\u01d1\3\2\2\2\u01d1\u01d2\7X\2\2\u01d2\u01d3\7C\2\2\u01d3\u01d4"+
+ "\5\24\13\2\u01d4\'\3\2\2\2\u01d5\u01d6\7U\2\2\u01d6\u01d8\5`\61\2\u01d7"+
+ "\u01d5\3\2\2\2\u01d8\u01d9\3\2\2\2\u01d9\u01d7\3\2\2\2\u01d9\u01da\3\2"+
+ "\2\2\u01da\u01db\3\2\2\2\u01db\u01dc\7C\2\2\u01dc\u01dd\5\24\13\2\u01dd"+
+ ")\3\2\2\2\u01de\u01df\7V\2\2\u01df\u01e1\5\32\16\2\u01e0\u01e2\5,\27\2"+
+ "\u01e1\u01e0\3\2\2\2\u01e2\u01e3\3\2\2\2\u01e3\u01e1\3\2\2\2\u01e3\u01e4"+
+ "\3\2\2\2\u01e4+\3\2\2\2\u01e5\u01e8\7W\2\2\u01e6\u01e9\7\f\2\2\u01e7\u01e9"+
+ "\5J&\2\u01e8\u01e6\3\2\2\2\u01e8\u01e7\3\2\2\2\u01e9\u01f1\3\2\2\2\u01ea"+
+ "\u01ed\7\r\2\2\u01eb\u01ee\7\f\2\2\u01ec\u01ee\5J&\2\u01ed\u01eb\3\2\2"+
+ "\2\u01ed\u01ec\3\2\2\2\u01ee\u01f0\3\2\2\2\u01ef\u01ea\3\2\2\2\u01f0\u01f3"+
+ "\3\2\2\2\u01f1\u01ef\3\2\2\2\u01f1\u01f2\3\2\2\2\u01f2\u01f4\3\2\2\2\u01f3"+
+ "\u01f1\3\2\2\2\u01f4\u01f5\5\32\16\2\u01f5-\3\2\2\2\u01f6\u01f7\7[\2\2"+
+ "\u01f7\u01f8\7\n\2\2\u01f8\u01f9\5^\60\2\u01f9\u01fb\7\13\2\2\u01fa\u01fc"+
+ "\5\60\31\2\u01fb\u01fa\3\2\2\2\u01fc\u01fd\3\2\2\2\u01fd\u01fb\3\2\2\2"+
+ "\u01fd\u01fe\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ff\u0201\7X\2\2\u0200\u0202"+
+ "\5\u00c2b\2\u0201\u0200\3\2\2\2\u0201\u0202\3\2\2\2\u0202\u0203\3\2\2"+
+ "\2\u0203\u0204\7C\2\2\u0204\u0205\5\24\13\2\u0205/\3\2\2\2\u0206\u020a"+
+ "\7U\2\2\u0207\u0208\5\u00c2b\2\u0208\u0209\7F\2\2\u0209\u020b\3\2\2\2"+
+ "\u020a\u0207\3\2\2\2\u020a\u020b\3\2\2\2\u020b\u020c\3\2\2\2\u020c\u0211"+
+ "\5\u0130\u0099\2\u020d\u020e\7\r\2\2\u020e\u0210\5\u0130\u0099\2\u020f"+
+ "\u020d\3\2\2\2\u0210\u0213\3\2\2\2\u0211\u020f\3\2\2\2\u0211\u0212\3\2"+
+ "\2\2\u0212\u0214\3\2\2\2\u0213\u0211\3\2\2\2\u0214\u0215\7C\2\2\u0215"+
+ "\u0216\5\24\13\2\u0216\61\3\2\2\2\u0217\u0218\7\16\2\2\u0218\u0223\5J"+
+ "&\2\u0219\u021a\7\n\2\2\u021a\u021f\7\u00aa\2\2\u021b\u021c\7\17\2\2\u021c"+
+ "\u021e\7\u00aa\2\2\u021d\u021b\3\2\2\2\u021e\u0221\3\2\2\2\u021f\u021d"+
+ "\3\2\2\2\u021f\u0220\3\2\2\2\u0220\u0222\3\2\2\2\u0221\u021f\3\2\2\2\u0222"+
+ "\u0224\7\13\2\2\u0223\u0219\3\2\2\2\u0223\u0224\3\2\2\2\u0224\63\3\2\2"+
+ "\2\u0225\u0227\5\62\32\2\u0226\u0225\3\2\2\2\u0227\u022a\3\2\2\2\u0228"+
+ "\u0226\3\2\2\2\u0228\u0229\3\2\2\2\u0229\65\3\2\2\2\u022a\u0228\3\2\2"+
+ "\2\u022b\u022c\5\64\33\2\u022c\u022d\7r\2\2\u022d\u0232\58\35\2\u022e"+
+ "\u022f\7\17\2\2\u022f\u0231\58\35\2\u0230\u022e\3\2\2\2\u0231\u0234\3"+
+ "\2\2\2\u0232\u0230\3\2\2\2\u0232\u0233\3\2\2\2\u0233\u0235\3\2\2\2\u0234"+
+ "\u0232\3\2\2\2\u0235\u0236\7\3\2\2\u0236\67\3\2\2\2\u0237\u023a\5\u00c2"+
+ "b\2\u0238\u0239\7F\2\2\u0239\u023b\5\u0130\u0099\2\u023a\u0238\3\2\2\2"+
+ "\u023a\u023b\3\2\2\2\u023b\u023e\3\2\2\2\u023c\u023d\7\7\2\2\u023d\u023f"+
+ "\5`\61\2\u023e\u023c\3\2\2\2\u023e\u023f\3\2\2\2\u023f9\3\2\2\2\u0240"+
+ "\u0241\7\u00a6\2\2\u0241\u0242\7\n\2\2\u0242\u0243\5^\60\2\u0243\u0244"+
+ "\7\13\2\2\u0244\u0245\5\24\13\2\u0245;\3\2\2\2\u0246\u024b\5B\"\2\u0247"+
+ "\u024b\5D#\2\u0248\u024b\5F$\2\u0249\u024b\5H%\2\u024a\u0246\3\2\2\2\u024a"+
+ "\u0247\3\2\2\2\u024a\u0248\3\2\2\2\u024a\u0249\3\2\2\2\u024b=\3\2\2\2"+
+ "\u024c\u024d\7o\2\2\u024d\u024e\7\u0081\2\2\u024e\u024f\7\u00b0\2\2\u024f"+
+ "\u0250\7\5\2\2\u0250\u0251\5\u0142\u00a2\2\u0251?\3\2\2\2\u0252\u0257"+
+ "\5T+\2\u0253\u0257\5P)\2\u0254\u0257\5V,\2\u0255\u0257\5R*\2\u0256\u0252"+
+ "\3\2\2\2\u0256\u0253\3\2\2\2\u0256\u0254\3\2\2\2\u0256\u0255\3\2\2\2\u0257"+
+ "A\3\2\2\2\u0258\u0259\7o\2\2\u0259\u025a\7X\2\2\u025a\u025b\7Q\2\2\u025b"+
+ "\u025c\5\u0142\u00a2\2\u025cC\3\2\2\2\u025d\u025e\7o\2\2\u025e\u025f\7"+
+ "\20\2\2\u025f\u0260\t\2\2\2\u0260E\3\2\2\2\u0261\u0262\7o\2\2\u0262\u0263"+
+ "\7X\2\2\u0263\u0264\7B\2\2\u0264\u0265\7I\2\2\u0265\u0266\t\3\2\2\u0266"+
+ "G\3\2\2\2\u0267\u026c\7o\2\2\u0268\u0269\7\22\2\2\u0269\u026d\5J&\2\u026a"+
+ "\u026b\7X\2\2\u026b\u026d\7\22\2\2\u026c\u0268\3\2\2\2\u026c\u026a\3\2"+
+ "\2\2\u026d\u0274\3\2\2\2\u026e\u026f\5L\'\2\u026f\u0270\7\5\2\2\u0270"+
+ "\u0271\5\u0144\u00a3\2\u0271\u0273\3\2\2\2\u0272\u026e\3\2\2\2\u0273\u0276"+
+ "\3\2\2\2\u0274\u0272\3\2\2\2\u0274\u0275\3\2\2\2\u0275I\3\2\2\2\u0276"+
+ "\u0274\3\2\2\2\u0277\u027a\7\u00b0\2\2\u0278\u027a\5\u0146\u00a4\2\u0279"+
+ "\u0277\3\2\2\2\u0279\u0278\3\2\2\2\u027a\u027b\3\2\2\2\u027b\u027d\7\23"+
+ "\2\2\u027c\u0279\3\2\2\2\u027c\u027d\3\2\2\2\u027d\u0280\3\2\2\2\u027e"+
+ "\u0281\7\u00b0\2\2\u027f\u0281\5\u0146\u00a4\2\u0280\u027e\3\2\2\2\u0280"+
+ "\u027f\3\2\2\2\u0281K\3\2\2\2\u0282\u0283\t\4\2\2\u0283M\3\2\2\2\u0284"+
+ "\u0285\7\177\2\2\u0285\u0289\7\4\2\2\u0286\u0287\7\u0081\2\2\u0287\u0288"+
+ "\7\u00b0\2\2\u0288\u028a\7\5\2\2\u0289\u0286\3\2\2\2\u0289\u028a\3\2\2"+
+ "\2\u028a\u028b\3\2\2\2\u028b\u0295\5\u0142\u00a2\2\u028c\u028d\7G\2\2"+
+ "\u028d\u0292\5\u0142\u00a2\2\u028e\u028f\7\17\2\2\u028f\u0291\5\u0142"+
+ "\u00a2\2\u0290\u028e\3\2\2\2\u0291\u0294\3\2\2\2\u0292\u0290\3\2\2\2\u0292"+
+ "\u0293\3\2\2\2\u0293\u0296\3\2\2\2\u0294\u0292\3\2\2\2\u0295\u028c\3\2"+
+ "\2\2\u0295\u0296\3\2\2\2\u0296O\3\2\2\2\u0297\u0298\7o\2\2\u0298\u0299"+
+ "\5\64\33\2\u0299\u029a\7r\2\2\u029a\u029d\5\u00c2b\2\u029b\u029c\7F\2"+
+ "\2\u029c\u029e\5\u0130\u0099\2\u029d\u029b\3\2\2\2\u029d\u029e\3\2\2\2"+
+ "\u029e\u02a6\3\2\2\2\u029f\u02a0\7\7\2\2\u02a0\u02a7\5`\61\2\u02a1\u02a4"+
+ "\7\36\2\2\u02a2\u02a3\7\7\2\2\u02a3\u02a5\5`\61\2\u02a4\u02a2\3\2\2\2"+
+ "\u02a4\u02a5\3\2\2\2\u02a5\u02a7\3\2\2\2\u02a6\u029f\3\2\2\2\u02a6\u02a1"+
+ "\3\2\2\2\u02a7Q\3\2\2\2\u02a8\u02a9\7o\2\2\u02a9\u02aa\7p\2\2\u02aa\u02ad"+
+ "\7q\2\2\u02ab\u02ac\7F\2\2\u02ac\u02ae\5\u0130\u0099\2\u02ad\u02ab\3\2"+
+ "\2\2\u02ad\u02ae\3\2\2\2\u02ae\u02b6\3\2\2\2\u02af\u02b0\7\7\2\2\u02b0"+
+ "\u02b7\5`\61\2\u02b1\u02b4\7\36\2\2\u02b2\u02b3\7\7\2\2\u02b3\u02b5\5"+
+ "`\61\2\u02b4\u02b2\3\2\2\2\u02b4\u02b5\3\2\2\2\u02b5\u02b7\3\2\2\2\u02b6"+
+ "\u02af\3\2\2\2\u02b6\u02b1\3\2\2\2\u02b7S\3\2\2\2\u02b8\u02b9\7o\2\2\u02b9"+
+ "\u02ba\5\64\33\2\u02ba\u02bb\7\37\2\2\u02bb\u02bc\5J&\2\u02bc\u02be\7"+
+ "\n\2\2\u02bd\u02bf\5Z.\2\u02be\u02bd\3\2\2\2\u02be\u02bf\3\2\2\2\u02bf"+
+ "\u02c0\3\2\2\2\u02c0\u02c3\7\13\2\2\u02c1\u02c2\7F\2\2\u02c2\u02c4\5\u0130"+
+ "\u0099\2\u02c3\u02c1\3\2\2\2\u02c3\u02c4\3\2\2\2\u02c4\u02ca\3\2\2\2\u02c5"+
+ "\u02c6\7\b\2\2\u02c6\u02c7\5\22\n\2\u02c7\u02c8\7\t\2\2\u02c8\u02cb\3"+
+ "\2\2\2\u02c9\u02cb\7\36\2\2\u02ca\u02c5\3\2\2\2\u02ca\u02c9\3\2\2\2\u02cb"+
+ "U\3\2\2\2\u02cc\u02cd\7o\2\2\u02cd\u02ce\7l\2\2\u02ce\u02cf\5J&\2\u02cf"+
+ "\u02d1\7F\2\2\u02d0\u02d2\5X-\2\u02d1\u02d0\3\2\2\2\u02d1\u02d2\3\2\2"+
+ "\2\u02d2\u02d3\3\2\2\2\u02d3\u02d4\5`\61\2\u02d4W\3\2\2\2\u02d5\u02d6"+
+ "\7 \2\2\u02d6\u02dc\7!\2\2\u02d7\u02d8\7 \2\2\u02d8\u02dc\7\"\2\2\u02d9"+
+ "\u02da\7|\2\2\u02da\u02dc\7\u0080\2\2\u02db\u02d5\3\2\2\2\u02db\u02d7"+
+ "\3\2\2\2\u02db\u02d9\3\2\2\2\u02dcY\3\2\2\2\u02dd\u02e2\5\\/\2\u02de\u02df"+
+ "\7\17\2\2\u02df\u02e1\5\\/\2\u02e0\u02de\3\2\2\2\u02e1\u02e4\3\2\2\2\u02e2"+
+ "\u02e0\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3[\3\2\2\2\u02e4\u02e2\3\2\2\2"+
+ "\u02e5\u02e6\7\6\2\2\u02e6\u02e9\5J&\2\u02e7\u02e8\7F\2\2\u02e8\u02ea"+
+ "\5\u0130\u0099\2\u02e9\u02e7\3\2\2\2\u02e9\u02ea\3\2\2\2\u02ea]\3\2\2"+
+ "\2\u02eb\u02f0\5`\61\2\u02ec\u02ed\7\17\2\2\u02ed\u02ef\5`\61\2\u02ee"+
+ "\u02ec\3\2\2\2\u02ef\u02f2\3\2\2\2\u02f0\u02ee\3\2\2\2\u02f0\u02f1\3\2"+
+ "\2\2\u02f1_\3\2\2\2\u02f2\u02f0\3\2\2\2\u02f3\u02fa\5b\62\2\u02f4\u02fa"+
+ "\5d\63\2\u02f5\u02fa\5~@\2\u02f6\u02fa\5\u0082B\2\u02f7\u02fa\5\u0086"+
+ "D\2\u02f8\u02fa\5\u0088E\2\u02f9\u02f3\3\2\2\2\u02f9\u02f4\3\2\2\2\u02f9"+
+ "\u02f5\3\2\2\2\u02f9\u02f6\3\2\2\2\u02f9\u02f7\3\2\2\2\u02f9\u02f8\3\2"+
+ "\2\2\u02faa\3\2\2\2\u02fb\u0304\5z>\2\u02fc\u0304\5\u008cG\2\u02fd\u0304"+
+ "\5\u00d8m\2\u02fe\u0304\5\u00dan\2\u02ff\u0304\5\u00dco\2\u0300\u0304"+
+ "\5\u00dep\2\u0301\u0304\5\u00e0q\2\u0302\u0304\5\u00e2r\2\u0303\u02fb"+
+ "\3\2\2\2\u0303\u02fc\3\2\2\2\u0303\u02fd\3\2\2\2\u0303\u02fe\3\2\2\2\u0303"+
+ "\u02ff\3\2\2\2\u0303\u0300\3\2\2\2\u0303\u0301\3\2\2\2\u0303\u0302\3\2"+
+ "\2\2\u0304c\3\2\2\2\u0305\u0308\5f\64\2\u0306\u0308\5j\66\2\u0307\u0305"+
+ "\3\2\2\2\u0307\u0306\3\2\2\2\u0308\u0311\3\2\2\2\u0309\u0310\5f\64\2\u030a"+
+ "\u0310\5j\66\2\u030b\u0310\5n8\2\u030c\u0310\5p9\2\u030d\u0310\5t;\2\u030e"+
+ "\u0310\5x=\2\u030f\u0309\3\2\2\2\u030f\u030a\3\2\2\2\u030f\u030b\3\2\2"+
+ "\2\u030f\u030c\3\2\2\2\u030f\u030d\3\2\2\2\u030f\u030e\3\2\2\2\u0310\u0313"+
+ "\3\2\2\2\u0311\u030f\3\2\2\2\u0311\u0312\3\2\2\2\u0312\u0314\3\2\2\2\u0313"+
+ "\u0311\3\2\2\2\u0314\u0315\7C\2\2\u0315\u0316\5`\61\2\u0316e\3\2\2\2\u0317"+
+ "\u0318\7=\2\2\u0318\u031d\5h\65\2\u0319\u031a\7\17\2\2\u031a\u031c\5h"+
+ "\65\2\u031b\u0319\3\2\2\2\u031c\u031f\3\2\2\2\u031d\u031b\3\2\2\2\u031d"+
+ "\u031e\3\2\2\2\u031eg\3\2\2\2\u031f\u031d\3\2\2\2\u0320\u0323\5\u00c2"+
+ "b\2\u0321\u0322\7F\2\2\u0322\u0324\5\u0130\u0099\2\u0323\u0321\3\2\2\2"+
+ "\u0323\u0324\3\2\2\2\u0324\u0327\3\2\2\2\u0325\u0326\7H\2\2\u0326\u0328"+
+ "\7I\2\2\u0327\u0325\3\2\2\2\u0327\u0328\3\2\2\2\u0328\u032b\3\2\2\2\u0329"+
+ "\u032a\7G\2\2\u032a\u032c\5\u00c2b\2\u032b\u0329\3\2\2\2\u032b\u032c\3"+
+ "\2\2\2\u032c\u032d\3\2\2\2\u032d\u032e\7E\2\2\u032e\u032f\5`\61\2\u032f"+
+ "i\3\2\2\2\u0330\u0331\7>\2\2\u0331\u0336\5l\67\2\u0332\u0333\7\17\2\2"+
+ "\u0333\u0335\5l\67\2\u0334\u0332\3\2\2\2\u0335\u0338\3\2\2\2\u0336\u0334"+
+ "\3\2\2\2\u0336\u0337\3\2\2\2\u0337k\3\2\2\2\u0338\u0336\3\2\2\2\u0339"+
+ "\u033c\5\u00c2b\2\u033a\u033b\7F\2\2\u033b\u033d\5\u0130\u0099\2\u033c"+
+ "\u033a\3\2\2\2\u033c\u033d\3\2\2\2\u033d\u033e\3\2\2\2\u033e\u033f\7\7"+
+ "\2\2\u033f\u0340\5`\61\2\u0340m\3\2\2\2\u0341\u0342\7?\2\2\u0342\u0343"+
+ "\5`\61\2\u0343o\3\2\2\2\u0344\u0345\7@\2\2\u0345\u0346\7A\2\2\u0346\u034b"+
+ "\5r:\2\u0347\u0348\7\17\2\2\u0348\u034a\5r:\2\u0349\u0347\3\2\2\2\u034a"+
+ "\u034d\3\2\2\2\u034b\u0349\3\2\2\2\u034b\u034c\3\2\2\2\u034cq\3\2\2\2"+
+ "\u034d\u034b\3\2\2\2\u034e\u0355\5\u00c2b\2\u034f\u0350\7F\2\2\u0350\u0352"+
+ "\5\u0130\u0099\2\u0351\u034f\3\2\2\2\u0351\u0352\3\2\2\2\u0352\u0353\3"+
+ "\2\2\2\u0353\u0354\7\7\2\2\u0354\u0356\5`\61\2\u0355\u0351\3\2\2\2\u0355"+
+ "\u0356\3\2\2\2\u0356\u0359\3\2\2\2\u0357\u0358\7Q\2\2\u0358\u035a\5\u0142"+
+ "\u00a2\2\u0359\u0357\3\2\2\2\u0359\u035a\3\2\2\2\u035as\3\2\2\2\u035b"+
+ "\u035c\7B\2\2\u035c\u0361\7A\2\2\u035d\u035e\7K\2\2\u035e\u035f\7B\2\2"+
+ "\u035f\u0361\7A\2\2\u0360\u035b\3\2\2\2\u0360\u035d\3\2\2\2\u0361\u0362"+
+ "\3\2\2\2\u0362\u0367\5v<\2\u0363\u0364\7\17\2\2\u0364\u0366\5v<\2\u0365"+
+ "\u0363\3\2\2\2\u0366\u0369\3\2\2\2\u0367\u0365\3\2\2\2\u0367\u0368\3\2"+
+ "\2\2\u0368u\3\2\2\2\u0369\u0367\3\2\2\2\u036a\u036d\5`\61\2\u036b\u036e"+
+ "\7L\2\2\u036c\u036e\7M\2\2\u036d\u036b\3\2\2\2\u036d\u036c\3\2\2\2\u036d"+
+ "\u036e\3\2\2\2\u036e\u0374\3\2\2\2\u036f\u0372\7I\2\2\u0370\u0373\7R\2"+
+ "\2\u0371\u0373\7S\2\2\u0372\u0370\3\2\2\2\u0372\u0371\3\2\2\2\u0373\u0375"+
+ "\3\2\2\2\u0374\u036f\3\2\2\2\u0374\u0375\3\2\2\2\u0375\u0378\3\2\2\2\u0376"+
+ "\u0377\7Q\2\2\u0377\u0379\5\u0142\u00a2\2\u0378\u0376\3\2\2\2\u0378\u0379"+
+ "\3\2\2\2\u0379w\3\2\2\2\u037a\u037b\7J\2\2\u037b\u037c\5\u00c2b\2\u037c"+
+ "y\3\2\2\2\u037d\u0380\7N\2\2\u037e\u0380\7O\2\2\u037f\u037d\3\2\2\2\u037f"+
+ "\u037e\3\2\2\2\u0380\u0381\3\2\2\2\u0381\u0386\5|?\2\u0382\u0383\7\17"+
+ "\2\2\u0383\u0385\5|?\2\u0384\u0382\3\2\2\2\u0385\u0388\3\2\2\2\u0386\u0384"+
+ "\3\2\2\2\u0386\u0387\3\2\2\2\u0387\u0389\3\2\2\2\u0388\u0386\3\2\2\2\u0389"+
+ "\u038a\7P\2\2\u038a\u038b\5`\61\2\u038b{\3\2\2\2\u038c\u038f\5\u00c2b"+
+ "\2\u038d\u038e\7F\2\2\u038e\u0390\5\u0130\u0099\2\u038f\u038d\3\2\2\2"+
+ "\u038f\u0390\3\2\2\2\u0390\u0391\3\2\2\2\u0391\u0392\7E\2\2\u0392\u0393"+
+ "\5`\61\2\u0393}\3\2\2\2\u0394\u0395\7T\2\2\u0395\u0396\7\n\2\2\u0396\u0397"+
+ "\5^\60\2\u0397\u0399\7\13\2\2\u0398\u039a\5\u0080A\2\u0399\u0398\3\2\2"+
+ "\2\u039a\u039b\3\2\2\2\u039b\u0399\3\2\2\2\u039b\u039c\3\2\2\2\u039c\u039d"+
+ "\3\2\2\2\u039d\u039e\7X\2\2\u039e\u039f\7C\2\2\u039f\u03a0\5`\61\2\u03a0"+
+ "\177\3\2\2\2\u03a1\u03a2\7U\2\2\u03a2\u03a4\5`\61\2\u03a3\u03a1\3\2\2"+
+ "\2\u03a4\u03a5\3\2\2\2\u03a5\u03a3\3\2\2\2\u03a5\u03a6\3\2\2\2\u03a6\u03a7"+
+ "\3\2\2\2\u03a7\u03a8\7C\2\2\u03a8\u03a9\5`\61\2\u03a9\u0081\3\2\2\2\u03aa"+
+ "\u03ab\7[\2\2\u03ab\u03ac\7\n\2\2\u03ac\u03ad\5^\60\2\u03ad\u03af\7\13"+
+ "\2\2\u03ae\u03b0\5\u0084C\2\u03af\u03ae\3\2\2\2\u03b0\u03b1\3\2\2\2\u03b1"+
+ "\u03af\3\2\2\2\u03b1\u03b2\3\2\2\2\u03b2\u03b3\3\2\2\2\u03b3\u03b5\7X"+
+ "\2\2\u03b4\u03b6\5\u00c2b\2\u03b5\u03b4\3\2\2\2\u03b5\u03b6\3\2\2\2\u03b6"+
+ "\u03b7\3\2\2\2\u03b7\u03b8\7C\2\2\u03b8\u03b9\5`\61\2\u03b9\u0083\3\2"+
+ "\2\2\u03ba\u03be\7U\2\2\u03bb\u03bc\5\u00c2b\2\u03bc\u03bd\7F\2\2\u03bd"+
+ "\u03bf\3\2\2\2\u03be\u03bb\3\2\2\2\u03be\u03bf\3\2\2\2\u03bf\u03c0\3\2"+
+ "\2\2\u03c0\u03c5\5\u0130\u0099\2\u03c1\u03c2\7\r\2\2\u03c2\u03c4\5\u0130"+
+ "\u0099\2\u03c3\u03c1\3\2\2\2\u03c4\u03c7\3\2\2\2\u03c5\u03c3\3\2\2\2\u03c5"+
+ "\u03c6\3\2\2\2\u03c6\u03c8\3\2\2\2\u03c7\u03c5\3\2\2\2\u03c8\u03c9\7C"+
+ "\2\2\u03c9\u03ca\5`\61\2\u03ca\u0085\3\2\2\2\u03cb\u03cc\7D\2\2\u03cc"+
+ "\u03cd\7\n\2\2\u03cd\u03ce\5^\60\2\u03ce\u03cf\7\13\2\2\u03cf\u03d0\7"+
+ "Y\2\2\u03d0\u03d1\5`\61\2\u03d1\u03d2\7Z\2\2\u03d2\u03d3\5`\61\2\u03d3"+
+ "\u0087\3\2\2\2\u03d4\u03d5\7V\2\2\u03d5\u03d6\7\b\2\2\u03d6\u03d7\5^\60"+
+ "\2\u03d7\u03d9\7\t\2\2\u03d8\u03da\5\u008aF\2\u03d9\u03d8\3\2\2\2\u03da"+
+ "\u03db\3\2\2\2\u03db\u03d9\3\2\2\2\u03db\u03dc\3\2\2\2\u03dc\u0089\3\2"+
+ "\2\2\u03dd\u03e0\7W\2\2\u03de\u03e1\7\f\2\2\u03df\u03e1\5J&\2\u03e0\u03de"+
+ "\3\2\2\2\u03e0\u03df\3\2\2\2\u03e1\u03e9\3\2\2\2\u03e2\u03e5\7\r\2\2\u03e3"+
+ "\u03e6\7\f\2\2\u03e4\u03e6\5J&\2\u03e5\u03e3\3\2\2\2\u03e5\u03e4\3\2\2"+
+ "\2\u03e6\u03e8\3\2\2\2\u03e7\u03e2\3\2\2\2\u03e8\u03eb\3\2\2\2\u03e9\u03e7"+
+ "\3\2\2\2\u03e9\u03ea\3\2\2\2\u03ea\u03ec\3\2\2\2\u03eb\u03e9\3\2\2\2\u03ec"+
+ "\u03ed\7\b\2\2\u03ed\u03ee\5^\60\2\u03ee\u03ef\7\t\2\2\u03ef\u008b\3\2"+
+ "\2\2\u03f0\u03f5\5\u008eH\2\u03f1\u03f2\7\\\2\2\u03f2\u03f4\5\u008eH\2"+
+ "\u03f3\u03f1\3\2\2\2\u03f4\u03f7\3\2\2\2\u03f5\u03f3\3\2\2\2\u03f5\u03f6"+
+ "\3\2\2\2\u03f6\u008d\3\2\2\2\u03f7\u03f5\3\2\2\2\u03f8\u03fd\5\u0090I"+
+ "\2\u03f9\u03fa\7]\2\2\u03fa\u03fc\5\u0090I\2\u03fb\u03f9\3\2\2\2\u03fc"+
+ "\u03ff\3\2\2\2\u03fd\u03fb\3\2\2\2\u03fd\u03fe\3\2\2\2\u03fe\u008f\3\2"+
+ "\2\2\u03ff\u03fd\3\2\2\2\u0400\u0402\7^\2\2\u0401\u0400\3\2\2\2\u0401"+
+ "\u0402\3\2\2\2\u0402\u0403\3\2\2\2\u0403\u0404\5\u0092J\2\u0404\u0091"+
+ "\3\2\2\2\u0405\u0408\5\u0094K\2\u0406\u0407\t\5\2\2\u0407\u0409\5\u0094"+
+ "K\2\u0408\u0406\3\2\2\2\u0408\u0409\3\2\2\2\u0409\u0093\3\2\2\2\u040a"+
+ "\u040f\5\u0096L\2\u040b\u040c\7.\2\2\u040c\u040e\5\u0096L\2\u040d\u040b"+
+ "\3\2\2\2\u040e\u0411\3\2\2\2\u040f\u040d\3\2\2\2\u040f\u0410\3\2\2\2\u0410"+
+ "\u0095\3\2\2\2\u0411\u040f\3\2\2\2\u0412\u0415\5\u0098M\2\u0413\u0414"+
+ "\7_\2\2\u0414\u0416\5\u0098M\2\u0415\u0413\3\2\2\2\u0415\u0416\3\2\2\2"+
+ "\u0416\u0097\3\2\2\2\u0417\u041c\5\u009aN\2\u0418\u0419\t\6\2\2\u0419"+
+ "\u041b\5\u009aN\2\u041a\u0418\3\2\2\2\u041b\u041e\3\2\2\2\u041c\u041a"+
+ "\3\2\2\2\u041c\u041d\3\2\2\2\u041d\u0099\3\2\2\2\u041e\u041c\3\2\2\2\u041f"+
+ "\u0424\5\u009cO\2\u0420\u0421\t\7\2\2\u0421\u0423\5\u009cO\2\u0422\u0420"+
+ "\3\2\2\2\u0423\u0426\3\2\2\2\u0424\u0422\3\2\2\2\u0424\u0425\3\2\2\2\u0425"+
+ "\u009b\3\2\2\2\u0426\u0424\3\2\2\2\u0427\u042b\5\u009eP\2\u0428\u0429"+
+ "\7`\2\2\u0429\u042a\7a\2\2\u042a\u042c\5\u0130\u0099\2\u042b\u0428\3\2"+
+ "\2\2\u042b\u042c\3\2\2\2\u042c\u009d\3\2\2\2\u042d\u0431\5\u00a0Q\2\u042e"+
+ "\u042f\7c\2\2\u042f\u0430\7b\2\2\u0430\u0432\5\u0130\u0099\2\u0431\u042e"+
+ "\3\2\2\2\u0431\u0432\3\2\2\2\u0432\u009f\3\2\2\2\u0433\u0437\5\u00a2R"+
+ "\2\u0434\u0435\7d\2\2\u0435\u0436\7F\2\2\u0436\u0438\5\u0130\u0099\2\u0437"+
+ "\u0434\3\2\2\2\u0437\u0438\3\2\2\2\u0438\u00a1\3\2\2\2\u0439\u043d\5\u00a4"+
+ "S\2\u043a\u043b\7f\2\2\u043b\u043c\7F\2\2\u043c\u043e\5\u013c\u009f\2"+
+ "\u043d\u043a\3\2\2\2\u043d\u043e\3\2\2\2\u043e\u00a3\3\2\2\2\u043f\u0443"+
+ "\5\u00a6T\2\u0440\u0441\7e\2\2\u0441\u0442\7F\2\2\u0442\u0444\5\u013c"+
+ "\u009f\2\u0443\u0440\3\2\2\2\u0443\u0444\3\2\2\2\u0444\u00a5\3\2\2\2\u0445"+
+ "\u044e\5\u00aaV\2\u0446\u0447\7\5\2\2\u0447\u0448\7,\2\2\u0448\u0449\3"+
+ "\2\2\2\u0449\u044a\5\u00a8U\2\u044a\u044b\5\u00ceh\2\u044b\u044d\3\2\2"+
+ "\2\u044c\u0446\3\2\2\2\u044d\u0450\3\2\2\2\u044e\u044c\3\2\2\2\u044e\u044f"+
+ "\3\2\2\2\u044f\u00a7\3\2\2\2\u0450\u044e\3\2\2\2\u0451\u0455\5J&\2\u0452"+
+ "\u0455\5\u00c2b\2\u0453\u0455\5\u00c4c\2\u0454\u0451\3\2\2\2\u0454\u0452"+
+ "\3\2\2\2\u0454\u0453\3\2\2\2\u0455\u00a9\3\2\2\2\u0456\u0458\t\6\2\2\u0457"+
+ "\u0456\3\2\2\2\u0458\u045b\3\2\2\2\u0459\u0457\3\2\2\2\u0459\u045a\3\2"+
+ "\2\2\u045a\u045c\3\2\2\2\u045b\u0459\3\2\2\2\u045c\u045d\5\u00acW\2\u045d"+
+ "\u00ab\3\2\2\2\u045e\u0462\5\u00b2Z\2\u045f\u0462\5\u00aeX\2\u0460\u0462"+
+ "\5\u00b0Y\2\u0461\u045e\3\2\2\2\u0461\u045f\3\2\2\2\u0461\u0460\3\2\2"+
+ "\2\u0462\u00ad\3\2\2\2\u0463\u0464\7m\2\2\u0464\u0465\7l\2\2\u0465\u0466"+
+ "\5\u0130\u0099\2\u0466\u0467\7\b\2\2\u0467\u0468\5^\60\2\u0468\u0469\7"+
+ "\t\2\2\u0469\u00af\3\2\2\2\u046a\u046b\7n\2\2\u046b\u046c\7l\2\2\u046c"+
+ "\u046d\5\u0130\u0099\2\u046d\u046e\7\b\2\2\u046e\u046f\5^\60\2\u046f\u0470"+
+ "\7\t\2\2\u0470\u00b1\3\2\2\2\u0471\u0476\5\u00e8u\2\u0472\u0473\7\64\2"+
+ "\2\u0473\u0475\5\u00e8u\2\u0474\u0472\3\2\2\2\u0475\u0478\3\2\2\2\u0476"+
+ "\u0474\3\2\2\2\u0476\u0477\3\2\2\2\u0477\u00b3\3\2\2\2\u0478\u0476\3\2"+
+ "\2\2\u0479\u0481\5\u00be`\2\u047a\u0480\5\u00b6\\\2\u047b\u0480\5\u00ba"+
+ "^\2\u047c\u0480\5\u00bc_\2\u047d\u0480\5\u00b8]\2\u047e\u0480\5\u00ce"+
+ "h\2\u047f\u047a\3\2\2\2\u047f\u047b\3\2\2\2\u047f\u047c\3\2\2\2\u047f"+
+ "\u047d\3\2\2\2\u047f\u047e\3\2\2\2\u0480\u0483\3\2\2\2\u0481\u047f\3\2"+
+ "\2\2\u0481\u0482\3\2\2\2\u0482\u00b5\3\2\2\2\u0483\u0481\3\2\2\2\u0484"+
+ "\u0485\7\65\2\2\u0485\u0486\7\65\2\2\u0486\u0487\5^\60\2\u0487\u0488\7"+
+ "\66\2\2\u0488\u0489\7\66\2\2\u0489\u00b7\3\2\2\2\u048a\u048b\7\65\2\2"+
+ "\u048b\u048c\7\66\2\2\u048c\u00b9\3\2\2\2\u048d\u048e\7\65\2\2\u048e\u048f"+
+ "\5^\60\2\u048f\u0490\7\66\2\2\u0490\u00bb\3\2\2\2\u0491\u0498\7\67\2\2"+
+ "\u0492\u0499\5\u0146\u00a4\2\u0493\u0499\5\u0144\u00a3\2\u0494\u0499\7"+
+ "\u00b0\2\2\u0495\u0499\5\u00c4c\2\u0496\u0499\5\u00c2b\2\u0497\u0499\5"+
+ "\u00c6d\2\u0498\u0492\3\2\2\2\u0498\u0493\3\2\2\2\u0498\u0494\3\2\2\2"+
+ "\u0498\u0495\3\2\2\2\u0498\u0496\3\2\2\2\u0498\u0497\3\2\2\2\u0499\u00bd"+
+ "\3\2\2\2\u049a\u04aa\7\u00a9\2\2\u049b\u04aa\7j\2\2\u049c\u04aa\7k\2\2"+
+ "\u049d\u04aa\7\u00aa\2\2\u049e\u04aa\5\u0144\u00a3\2\u049f\u04aa\5\u00c2"+
+ "b\2\u04a0\u04aa\5\u00c4c\2\u04a1\u04aa\5\u00c6d\2\u04a2\u04aa\5\u0132"+
+ "\u009a\2\u04a3\u04aa\5\u00ccg\2\u04a4\u04aa\5\u00c8e\2\u04a5\u04aa\5\u00ca"+
+ "f\2\u04a6\u04aa\5\u0140\u00a1\2\u04a7\u04aa\5\u00d2j\2\u04a8\u04aa\5\u00c0"+
+ "a\2\u04a9\u049a\3\2\2\2\u04a9\u049b\3\2\2\2\u04a9\u049c\3\2\2\2\u04a9"+
+ "\u049d\3\2\2\2\u04a9\u049e\3\2\2\2\u04a9\u049f\3\2\2\2\u04a9\u04a0\3\2"+
+ "\2\2\u04a9\u04a1\3\2\2\2\u04a9\u04a2\3\2\2\2\u04a9\u04a3\3\2\2\2\u04a9"+
+ "\u04a4\3\2\2\2\u04a9\u04a5\3\2\2\2\u04a9\u04a6\3\2\2\2\u04a9\u04a7\3\2"+
+ "\2\2\u04a9\u04a8\3\2\2\2\u04aa\u00bf\3\2\2\2\u04ab\u04ac\7\b\2\2\u04ac"+
+ "\u04ad\5\20\t\2\u04ad\u04ae\7\t\2\2\u04ae\u00c1\3\2\2\2\u04af\u04b0\7"+
+ "\6\2\2\u04b0\u04b1\5J&\2\u04b1\u00c3\3\2\2\2\u04b2\u04b4\7\n\2\2\u04b3"+
+ "\u04b5\5^\60\2\u04b4\u04b3\3\2\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b6\3\2"+
+ "\2\2\u04b6\u04b7\7\13\2\2\u04b7\u00c5\3\2\2\2\u04b8\u04b9\78\2\2\u04b9"+
+ "\u00c7\3\2\2\2\u04ba\u04bb\7\21\2\2\u04bb\u04bc\7\b\2\2\u04bc\u04bd\5"+
+ "^\60\2\u04bd\u04be\7\t\2\2\u04be\u00c9\3\2\2\2\u04bf\u04c0\7i\2\2\u04c0"+
+ "\u04c1\7\b\2\2\u04c1\u04c2\5^\60\2\u04c2\u04c3\7\t\2\2\u04c3\u00cb\3\2"+
+ "\2\2\u04c4\u04c5\5J&\2\u04c5\u04c6\5\u00ceh\2\u04c6\u00cd\3\2\2\2\u04c7"+
+ "\u04ce\7\n\2\2\u04c8\u04ca\5\u00d0i\2\u04c9\u04cb\7\17\2\2\u04ca\u04c9"+
+ "\3\2\2\2\u04ca\u04cb\3\2\2\2\u04cb\u04cd\3\2\2\2\u04cc\u04c8\3\2\2\2\u04cd"+
+ "\u04d0\3\2\2\2\u04ce\u04cc\3\2\2\2\u04ce\u04cf\3\2\2\2\u04cf\u04d1\3\2"+
+ "\2\2\u04d0\u04ce\3\2\2\2\u04d1\u04d2\7\13\2\2\u04d2\u00cf\3\2\2\2\u04d3"+
+ "\u04d6\5`\61\2\u04d4\u04d6\7\u00a8\2\2\u04d5\u04d3\3\2\2\2\u04d5\u04d4"+
+ "\3\2\2\2\u04d6\u00d1\3\2\2\2\u04d7\u04da\5\u00d4k\2\u04d8\u04da\5\u00d6"+
+ "l\2\u04d9\u04d7\3\2\2\2\u04d9\u04d8\3\2\2\2\u04da\u00d3\3\2\2\2\u04db"+
+ "\u04dc\5J&\2\u04dc\u04dd\79\2\2\u04dd\u04de\7\u00aa\2\2\u04de\u00d5\3"+
+ "\2\2\2\u04df\u04e0\5\64\33\2\u04e0\u04e1\7\37\2\2\u04e1\u04e3\7\n\2\2"+
+ "\u04e2\u04e4\5Z.\2\u04e3\u04e2\3\2\2\2\u04e3\u04e4\3\2\2\2\u04e4\u04e5"+
+ "\3\2\2\2\u04e5\u04e8\7\13\2\2\u04e6\u04e7\7F\2\2\u04e7\u04e9\5\u0130\u0099"+
+ "\2\u04e8\u04e6\3\2\2\2\u04e8\u04e9\3\2\2\2\u04e9\u04ea\3\2\2\2\u04ea\u04eb"+
+ "\7\b\2\2\u04eb\u04ec\5\22\n\2\u04ec\u04ed\7\t\2\2\u04ed\u00d7\3\2\2\2"+
+ "\u04ee\u04ef\7s\2\2\u04ef\u04f0\7|\2\2\u04f0\u04f1\5`\61\2\u04f1\u04f2"+
+ "\7z\2\2\u04f2\u04f6\5`\61\2\u04f3\u04f4\7G\2\2\u04f4\u04f5\7~\2\2\u04f5"+
+ "\u04f7\5`\61\2\u04f6\u04f3\3\2\2\2\u04f6\u04f7\3\2\2\2\u04f7\u0506\3\2"+
+ "\2\2\u04f8\u04f9\7s\2\2\u04f9\u04fa\7|\2\2\u04fa\u04ff\5\u013e\u00a0\2"+
+ "\u04fb\u04fc\7\17\2\2\u04fc\u04fe\5\u013e\u00a0\2\u04fd\u04fb\3\2\2\2"+
+ "\u04fe\u0501\3\2\2\2\u04ff\u04fd\3\2\2\2\u04ff\u0500\3\2\2\2\u0500\u0502"+
+ "\3\2\2\2\u0501\u04ff\3\2\2\2\u0502\u0503\7z\2\2\u0503\u0504\5`\61\2\u0504"+
+ "\u0506\3\2\2\2\u0505\u04ee\3\2\2\2\u0505\u04f8\3\2\2\2\u0506\u00d9\3\2"+
+ "\2\2\u0507\u0508\7t\2\2\u0508\u0509\7|\2\2\u0509\u050a\5\u00e4s\2\u050a"+
+ "\u00db\3\2\2\2\u050b\u050c\7u\2\2\u050c\u050d\7|\2\2\u050d\u050e\5\u00e4"+
+ "s\2\u050e\u050f\7F\2\2\u050f\u0510\5`\61\2\u0510\u00dd\3\2\2\2\u0511\u0512"+
+ "\7v\2\2\u0512\u0513\7{\2\2\u0513\u0514\7a\2\2\u0514\u0515\7|\2\2\u0515"+
+ "\u0516\5\u00e4s\2\u0516\u0517\7}\2\2\u0517\u0518\5`\61\2\u0518\u00df\3"+
+ "\2\2\2\u0519\u051a\7w\2\2\u051a\u051f\5\u00e6t\2\u051b\u051c\7\17\2\2"+
+ "\u051c\u051e\5\u00e6t\2\u051d\u051b\3\2\2\2\u051e\u0521\3\2\2\2\u051f"+
+ "\u051d\3\2\2\2\u051f\u0520\3\2\2\2\u0520\u0522\3\2\2\2\u0521\u051f\3\2"+
+ "\2\2\u0522\u0523\7x\2\2\u0523\u0524\5`\61\2\u0524\u0525\7C\2\2\u0525\u0526"+
+ "\5`\61\2\u0526\u00e1\3\2\2\2\u0527\u0528\7y\2\2\u0528\u0529\7|\2\2\u0529"+
+ "\u052a\5`\61\2\u052a\u052b\7z\2\2\u052b\u052c\5`\61\2\u052c\u00e3\3\2"+
+ "\2\2\u052d\u0530\5\u00be`\2\u052e\u0531\5\u00b6\\\2\u052f\u0531\5\u00bc"+
+ "_\2\u0530\u052e\3\2\2\2\u0530\u052f\3\2\2\2\u0531\u0532\3\2\2\2\u0532"+
+ "\u0530\3\2\2\2\u0532\u0533\3\2\2\2\u0533\u00e5\3\2\2\2\u0534\u0535\5\u00c2"+
+ "b\2\u0535\u0536\7\7\2\2\u0536\u0537\5`\61\2\u0537\u00e7\3\2\2\2\u0538"+
+ "\u053a\7\u0083\2\2\u0539\u053b\5\u00eav\2\u053a\u0539\3\2\2\2\u053a\u053b"+
+ "\3\2\2\2\u053b\u0540\3\2\2\2\u053c\u053d\7\u0084\2\2\u053d\u0540\5\u00ea"+
+ "v\2\u053e\u0540\5\u00eav\2\u053f\u0538\3\2\2\2\u053f\u053c\3\2\2\2\u053f"+
+ "\u053e\3\2\2\2\u0540\u00e9\3\2\2\2\u0541\u0546\5\u00ecw\2\u0542\u0543"+
+ "\t\b\2\2\u0543\u0545\5\u00ecw\2\u0544\u0542\3\2\2\2\u0545\u0548\3\2\2"+
+ "\2\u0546\u0544\3\2\2\2\u0546\u0547\3\2\2\2\u0547\u00eb\3\2\2\2\u0548\u0546"+
+ "\3\2\2\2\u0549\u054c\5\u00b4[\2\u054a\u054c\5\u00eex\2\u054b\u0549\3\2"+
+ "\2\2\u054b\u054a\3\2\2\2\u054c\u00ed\3\2\2\2\u054d\u0550\5\u00f6|\2\u054e"+
+ "\u0550\5\u00f0y\2\u054f\u054d\3\2\2\2\u054f\u054e\3\2\2\2\u0550\u0551"+
+ "\3\2\2\2\u0551\u0552\5\u0106\u0084\2\u0552\u00ef\3\2\2\2\u0553\u0554\5"+
+ "\u00f2z\2\u0554\u0555\5\u00fc\177\2\u0555\u0558\3\2\2\2\u0556\u0558\5"+
+ "\u00f4{\2\u0557\u0553\3\2\2\2\u0557\u0556\3\2\2\2\u0558\u00f1\3\2\2\2"+
+ "\u0559\u055a\t\t\2\2\u055a\u055b\7\23\2\2\u055b\u055c\7\23\2\2\u055c\u00f3"+
+ "\3\2\2\2\u055d\u055e\7\u0085\2\2\u055e\u055f\5\u00fc\177\2\u055f\u00f5"+
+ "\3\2\2\2\u0560\u0561\5\u00f8}\2\u0561\u0562\5\u00fc\177\2\u0562\u0565"+
+ "\3\2\2\2\u0563\u0565\5\u00fa~\2\u0564\u0560\3\2\2\2\u0564\u0563\3\2\2"+
+ "\2\u0565\u00f7\3\2\2\2\u0566\u0567\t\n\2\2\u0567\u0568\7\23\2\2\u0568"+
+ "\u0569\7\23\2\2\u0569\u00f9\3\2\2\2\u056a\u056b\7:\2\2\u056b\u00fb\3\2"+
+ "\2\2\u056c\u056f\5\u00fe\u0080\2\u056d\u056f\5\u0108\u0085\2\u056e\u056c"+
+ "\3\2\2\2\u056e\u056d\3\2\2\2\u056f\u00fd\3\2\2\2\u0570\u0573\5J&\2\u0571"+
+ "\u0573\5\u0100\u0081\2\u0572\u0570\3\2\2\2\u0572\u0571\3\2\2\2\u0573\u00ff"+
+ "\3\2\2\2\u0574\u0578\7\f\2\2\u0575\u0578\5\u0102\u0082\2\u0576\u0578\5"+
+ "\u0104\u0083\2\u0577\u0574\3\2\2\2\u0577\u0575\3\2\2\2\u0577\u0576\3\2"+
+ "\2\2\u0578\u0101\3\2\2\2\u0579\u057a\7\u00b0\2\2\u057a\u057b\7\23\2\2"+
+ "\u057b\u057c\7\f\2\2\u057c\u0103\3\2\2\2\u057d\u057e\7\f\2\2\u057e\u057f"+
+ "\7\23\2\2\u057f\u0580\7\u00b0\2\2\u0580\u0105\3\2\2\2\u0581\u0583\5\u00ba"+
+ "^\2\u0582\u0581\3\2\2\2\u0583\u0586\3\2\2\2\u0584\u0582\3\2\2\2\u0584"+
+ "\u0585\3\2\2\2\u0585\u0107\3\2\2\2\u0586\u0584\3\2\2\2\u0587\u0593\5\u010e"+
+ "\u0088\2\u0588\u0593\5\u0120\u0091\2\u0589\u0593\5\u0118\u008d\2\u058a"+
+ "\u0593\5\u0124\u0093\2\u058b\u0593\5\u011c\u008f\2\u058c\u0593\5\u0116"+
+ "\u008c\2\u058d\u0593\5\u0112\u008a\2\u058e\u0593\5\u0110\u0089\2\u058f"+
+ "\u0593\5\u0114\u008b\2\u0590\u0593\5\u010c\u0087\2\u0591\u0593\5\u010a"+
+ "\u0086\2\u0592\u0587\3\2\2\2\u0592\u0588\3\2\2\2\u0592\u0589\3\2\2\2\u0592"+
+ "\u058a\3\2\2\2\u0592\u058b\3\2\2\2\u0592\u058c\3\2\2\2\u0592\u058d\3\2"+
+ "\2\2\u0592\u058e\3\2\2\2\u0592\u058f\3\2\2\2\u0592\u0590\3\2\2\2\u0592"+
+ "\u0591\3\2\2\2\u0593\u0109\3\2\2\2\u0594\u0595\7\u0092\2\2\u0595\u0596"+
+ "\7\n\2\2\u0596\u0597\7\13\2\2\u0597\u010b\3\2\2\2\u0598\u0599\7\u0093"+
+ "\2\2\u0599\u059a\7\n\2\2\u059a\u059b\7\13\2\2\u059b\u010d\3\2\2\2\u059c"+
+ "\u059d\7\u0095\2\2\u059d\u05a0\7\n\2\2\u059e\u05a1\5\u0120\u0091\2\u059f"+
+ "\u05a1\5\u0124\u0093\2\u05a0\u059e\3\2\2\2\u05a0\u059f\3\2\2\2\u05a0\u05a1"+
+ "\3\2\2\2\u05a1\u05a2\3\2\2\2\u05a2\u05a3\7\13\2\2\u05a3\u010f\3\2\2\2"+
+ "\u05a4\u05a5\7\u0096\2\2\u05a5\u05a6\7\n\2\2\u05a6\u05a7\7\13\2\2\u05a7"+
+ "\u0111\3\2\2\2\u05a8\u05a9\7\u00a0\2\2\u05a9\u05aa\7\n\2\2\u05aa\u05ab"+
+ "\7\13\2\2\u05ab\u0113\3\2\2\2\u05ac\u05ad\7\u0098\2\2\u05ad\u05ae\7\n"+
+ "\2\2\u05ae\u05af\7\13\2\2\u05af\u0115\3\2\2\2\u05b0\u05b1\7\u0097\2\2"+
+ "\u05b1\u05b4\7\n\2\2\u05b2\u05b5\7\u00b0\2\2\u05b3\u05b5\5\u0144\u00a3"+
+ "\2\u05b4\u05b2\3\2\2\2\u05b4\u05b3\3\2\2\2\u05b4\u05b5\3\2\2\2\u05b5\u05b6"+
+ "\3\2\2\2\u05b6\u05b7\7\13\2\2\u05b7\u0117\3\2\2\2\u05b8\u05b9\7\u0088"+
+ "\2\2\u05b9\u05bf\7\n\2\2\u05ba\u05bd\5\u011a\u008e\2\u05bb\u05bc\7\17"+
+ "\2\2\u05bc\u05be\5\u012e\u0098\2\u05bd\u05bb\3\2\2\2\u05bd\u05be\3\2\2"+
+ "\2\u05be\u05c0\3\2\2\2\u05bf\u05ba\3\2\2\2\u05bf\u05c0\3\2\2\2\u05c0\u05c1"+
+ "\3\2\2\2\u05c1\u05c2\7\13\2\2\u05c2\u0119\3\2\2\2\u05c3\u05c6\5\u0128"+
+ "\u0095\2\u05c4\u05c6\7\f\2\2\u05c5\u05c3\3\2\2\2\u05c5\u05c4\3\2\2\2\u05c6"+
+ "\u011b\3\2\2\2\u05c7\u05c8\7\u0099\2\2\u05c8\u05c9\7\n\2\2\u05c9\u05ca"+
+ "\5\u011e\u0090\2\u05ca\u05cb\7\13\2\2\u05cb\u011d\3\2\2\2\u05cc\u05cd"+
+ "\5\u0128\u0095\2\u05cd\u011f\3\2\2\2\u05ce\u05cf\7\u0082\2\2\u05cf\u05d8"+
+ "\7\n\2\2\u05d0\u05d6\5\u0122\u0092\2\u05d1\u05d2\7\17\2\2\u05d2\u05d4"+
+ "\5\u012e\u0098\2\u05d3\u05d5\7\u00a8\2\2\u05d4\u05d3\3\2\2\2\u05d4\u05d5"+
+ "\3\2\2\2\u05d5\u05d7\3\2\2\2\u05d6\u05d1\3\2\2\2\u05d6\u05d7\3\2\2\2\u05d7"+
+ "\u05d9\3\2\2\2\u05d8\u05d0\3\2\2\2\u05d8\u05d9\3\2\2\2\u05d9\u05da\3\2"+
+ "\2\2\u05da\u05db\7\13\2\2\u05db\u0121\3\2\2\2\u05dc\u05df\5\u012a\u0096"+
+ "\2\u05dd\u05df\7\f\2\2\u05de\u05dc\3\2\2\2\u05de\u05dd\3\2\2\2\u05df\u0123"+
+ "\3\2\2\2\u05e0\u05e1\7\u009a\2\2\u05e1\u05e2\7\n\2\2\u05e2\u05e3\5\u0126"+
+ "\u0094\2\u05e3\u05e4\7\13\2\2\u05e4\u0125\3\2\2\2\u05e5\u05e6\5\u012a"+
+ "\u0096\2\u05e6\u0127\3\2\2\2\u05e7\u05e8\5J&\2\u05e8\u0129\3\2\2\2\u05e9"+
+ "\u05ea\5J&\2\u05ea\u012b\3\2\2\2\u05eb\u05ec\5\u012e\u0098\2\u05ec\u012d"+
+ "\3\2\2\2\u05ed\u05ee\5J&\2\u05ee\u012f\3\2\2\2\u05ef\u05f0\7\n\2\2\u05f0"+
+ "\u05f8\7\13\2\2\u05f1\u05f5\5\u0134\u009b\2\u05f2\u05f6\7\u00a8\2\2\u05f3"+
+ "\u05f6\7\f\2\2\u05f4\u05f6\7/\2\2\u05f5\u05f2\3\2\2\2\u05f5\u05f3\3\2"+
+ "\2\2\u05f5\u05f4\3\2\2\2\u05f5\u05f6\3\2\2\2\u05f6\u05f8\3\2\2\2\u05f7"+
+ "\u05ef\3\2\2\2\u05f7\u05f1\3\2\2\2\u05f8\u0131\3\2\2\2\u05f9\u0602\7\b"+
+ "\2\2\u05fa\u05ff\5\u013e\u00a0\2\u05fb\u05fc\7\17\2\2\u05fc\u05fe\5\u013e"+
+ "\u00a0\2\u05fd\u05fb\3\2\2\2\u05fe\u0601\3\2\2\2\u05ff\u05fd\3\2\2\2\u05ff"+
+ "\u0600\3\2\2\2\u0600\u0603\3\2\2\2\u0601\u05ff\3\2\2\2\u0602\u05fa\3\2"+
+ "\2\2\u0602\u0603\3\2\2\2\u0603\u0604\3\2\2\2\u0604\u060a\7\t\2\2\u0605"+
+ "\u0606\7;\2\2\u0606\u0607\5^\60\2\u0607\u0608\7<\2\2\u0608\u060a\3\2\2"+
+ "\2\u0609\u05f9\3\2\2\2\u0609\u0605\3\2\2\2\u060a\u0133\3\2\2\2\u060b\u060f"+
+ "\5J&\2\u060c\u060f\7\u00a9\2\2\u060d\u060f\5\u0136\u009c\2\u060e\u060b"+
+ "\3\2\2\2\u060e\u060c\3\2\2\2\u060e\u060d\3\2\2\2\u060f\u0135\3\2\2\2\u0610"+
+ "\u0613\5\u0138\u009d\2\u0611\u0613\5\u013a\u009e\2\u0612\u0610\3\2\2\2"+
+ "\u0612\u0611\3\2\2\2\u0613\u0137\3\2\2\2\u0614\u0615\7\37\2\2\u0615\u0616"+
+ "\7\n\2\2\u0616\u0617\7\f\2\2\u0617\u0618\7\13\2\2\u0618\u0139\3\2\2\2"+
+ "\u0619\u061a\7\37\2\2\u061a\u0623\7\n\2\2\u061b\u0620\5\u0130\u0099\2"+
+ "\u061c\u061d\7\17\2\2\u061d\u061f\5\u0130\u0099\2\u061e\u061c\3\2\2\2"+
+ "\u061f\u0622\3\2\2\2\u0620\u061e\3\2\2\2\u0620\u0621\3\2\2\2\u0621\u0624"+
+ "\3\2\2\2\u0622\u0620\3\2\2\2\u0623\u061b\3\2\2\2\u0623\u0624\3\2\2\2\u0624"+
+ "\u0625\3\2\2\2\u0625\u0626\7\13\2\2\u0626\u0627\7F\2\2\u0627\u0628\5\u0130"+
+ "\u0099\2\u0628\u013b\3\2\2\2\u0629\u062b\5\u0134\u009b\2\u062a\u062c\7"+
+ "\u00a8\2\2\u062b\u062a\3\2\2\2\u062b\u062c\3\2\2\2\u062c\u013d\3\2\2\2"+
+ "\u062d\u0630\5`\61\2\u062e\u0630\7\u00b0\2\2\u062f\u062d\3\2\2\2\u062f"+
+ "\u062e\3\2\2\2\u0630\u0631\3\2\2\2\u0631\u0632\t\13\2\2\u0632\u0633\5"+
+ "`\61\2\u0633\u013f\3\2\2\2\u0634\u0636\7\65\2\2\u0635\u0637\5^\60\2\u0636"+
+ "\u0635\3\2\2\2\u0636\u0637\3\2\2\2\u0637\u0638\3\2\2\2\u0638\u0639\7\66"+
+ "\2\2\u0639\u0141\3\2\2\2\u063a\u063b\5\u0144\u00a3\2\u063b\u0143\3\2\2"+
+ "\2\u063c\u063d\7\u00a7\2\2\u063d\u0145\3\2\2\2\u063e\u063f\t\f\2\2\u063f"+
+ "\u0147\3\2\2\2\u009b\u0150\u0154\u0164\u016a\u0172\u017a\u0182\u0191\u01af"+
+ "\u01b7\u01b9\u01cf\u01d9\u01e3\u01e8\u01ed\u01f1\u01fd\u0201\u020a\u0211"+
+ "\u021f\u0223\u0228\u0232\u023a\u023e\u024a\u0256\u026c\u0274\u0279\u027c"+
+ "\u0280\u0289\u0292\u0295\u029d\u02a4\u02a6\u02ad\u02b4\u02b6\u02be\u02c3"+
+ "\u02ca\u02d1\u02db\u02e2\u02e9\u02f0\u02f9\u0303\u0307\u030f\u0311\u031d"+
+ "\u0323\u0327\u032b\u0336\u033c\u034b\u0351\u0355\u0359\u0360\u0367\u036d"+
+ "\u0372\u0374\u0378\u037f\u0386\u038f\u039b\u03a5\u03b1\u03b5\u03be\u03c5"+
+ "\u03db\u03e0\u03e5\u03e9\u03f5\u03fd\u0401\u0408\u040f\u0415\u041c\u0424"+
+ "\u042b\u0431\u0437\u043d\u0443\u044e\u0454\u0459\u0461\u0476\u047f\u0481"+
+ "\u0498\u04a9\u04b4\u04ca\u04ce\u04d5\u04d9\u04e3\u04e8\u04f6\u04ff\u0505"+
+ "\u051f\u0530\u0532\u053a\u053f\u0546\u054b\u054f\u0557\u0564\u056e\u0572"+
+ "\u0577\u0584\u0592\u05a0\u05b4\u05bd\u05bf\u05c5\u05d4\u05d6\u05d8\u05de"+
+ "\u05f5\u05f7\u05ff\u0602\u0609\u060e\u0612\u0620\u0623\u062b\u062f\u0636";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/org/rumbledb/parser/JsoniqVisitor.java b/src/main/java/org/rumbledb/parser/JsoniqVisitor.java
index 2cc8359d79..04f2afde12 100644
--- a/src/main/java/org/rumbledb/parser/JsoniqVisitor.java
+++ b/src/main/java/org/rumbledb/parser/JsoniqVisitor.java
@@ -703,6 +703,237 @@ public interface JsoniqVisitor extends ParseTreeVisitor {
* @return the visitor result
*/
T visitCopyDecl(JsoniqParser.CopyDeclContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#pathExpr}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitPathExpr(JsoniqParser.PathExprContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#relativePathExpr}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitRelativePathExpr(JsoniqParser.RelativePathExprContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#stepExpr}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitStepExpr(JsoniqParser.StepExprContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#axisStep}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitAxisStep(JsoniqParser.AxisStepContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#forwardStep}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitForwardStep(JsoniqParser.ForwardStepContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#forwardAxis}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitForwardAxis(JsoniqParser.ForwardAxisContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#abbrevForwardStep}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitAbbrevForwardStep(JsoniqParser.AbbrevForwardStepContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#reverseStep}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitReverseStep(JsoniqParser.ReverseStepContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#reverseAxis}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitReverseAxis(JsoniqParser.ReverseAxisContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#abbrevReverseStep}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitAbbrevReverseStep(JsoniqParser.AbbrevReverseStepContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#nodeTest}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitNodeTest(JsoniqParser.NodeTestContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#nameTest}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitNameTest(JsoniqParser.NameTestContext ctx);
+ /**
+ * Visit a parse tree produced by the {@code allNames}
+ * labeled alternative in {@link JsoniqParser#wildcard}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitAllNames(JsoniqParser.AllNamesContext ctx);
+ /**
+ * Visit a parse tree produced by the {@code allWithNS}
+ * labeled alternative in {@link JsoniqParser#wildcard}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitAllWithNS(JsoniqParser.AllWithNSContext ctx);
+ /**
+ * Visit a parse tree produced by the {@code allWithLocal}
+ * labeled alternative in {@link JsoniqParser#wildcard}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitAllWithLocal(JsoniqParser.AllWithLocalContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#nCNameWithLocalWildcard}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitNCNameWithLocalWildcard(JsoniqParser.NCNameWithLocalWildcardContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#nCNameWithPrefixWildcard}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitNCNameWithPrefixWildcard(JsoniqParser.NCNameWithPrefixWildcardContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#predicateList}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitPredicateList(JsoniqParser.PredicateListContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#kindTest}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitKindTest(JsoniqParser.KindTestContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#anyKindTest}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitAnyKindTest(JsoniqParser.AnyKindTestContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#binaryNodeTest}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitBinaryNodeTest(JsoniqParser.BinaryNodeTestContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#documentTest}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitDocumentTest(JsoniqParser.DocumentTestContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#textTest}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitTextTest(JsoniqParser.TextTestContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#commentTest}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitCommentTest(JsoniqParser.CommentTestContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#namespaceNodeTest}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitNamespaceNodeTest(JsoniqParser.NamespaceNodeTestContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#piTest}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitPiTest(JsoniqParser.PiTestContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#attributeTest}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitAttributeTest(JsoniqParser.AttributeTestContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#attributeNameOrWildcard}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitAttributeNameOrWildcard(JsoniqParser.AttributeNameOrWildcardContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#schemaAttributeTest}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitSchemaAttributeTest(JsoniqParser.SchemaAttributeTestContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#attributeDeclaration}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitAttributeDeclaration(JsoniqParser.AttributeDeclarationContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#elementTest}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitElementTest(JsoniqParser.ElementTestContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#elementNameOrWildcard}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitElementNameOrWildcard(JsoniqParser.ElementNameOrWildcardContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#schemaElementTest}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitSchemaElementTest(JsoniqParser.SchemaElementTestContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#elementDeclaration}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitElementDeclaration(JsoniqParser.ElementDeclarationContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#attributeName}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitAttributeName(JsoniqParser.AttributeNameContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#elementName}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitElementName(JsoniqParser.ElementNameContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#simpleTypeName}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitSimpleTypeName(JsoniqParser.SimpleTypeNameContext ctx);
+ /**
+ * Visit a parse tree produced by {@link JsoniqParser#typeName}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitTypeName(JsoniqParser.TypeNameContext ctx);
/**
* Visit a parse tree produced by {@link JsoniqParser#sequenceType}.
* @param ctx the parse tree
diff --git a/src/main/java/org/rumbledb/runtime/functions/dataframe/DropColumnsIterator.java b/src/main/java/org/rumbledb/runtime/functions/dataframe/DropColumnsIterator.java
new file mode 100644
index 0000000000..3064a555c7
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/dataframe/DropColumnsIterator.java
@@ -0,0 +1,70 @@
+package org.rumbledb.runtime.functions.dataframe;
+
+import org.apache.spark.api.java.JavaRDD;
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.InvalidSelectorException;
+import org.rumbledb.exceptions.UnexpectedTypeException;
+import org.rumbledb.items.structured.JSoundDataFrame;
+import org.rumbledb.runtime.HybridRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+
+import java.util.List;
+
+public class DropColumnsIterator extends HybridRuntimeIterator {
+ public DropColumnsIterator(List children, RuntimeStaticContext staticContext) {
+ super(children, staticContext);
+ }
+
+ @Override
+ public JavaRDD- getRDDAux(DynamicContext context) {
+ return null;
+ }
+
+ @Override
+ public void openLocal() {
+
+ }
+
+ @Override
+ public void closeLocal() {
+
+ }
+
+ @Override
+ public void resetLocal() {
+
+ }
+
+ @Override
+ public boolean hasNextLocal() {
+ return false;
+ }
+
+ @Override
+ public Item nextLocal() {
+ return null;
+ }
+
+ public JSoundDataFrame getDataFrame(DynamicContext context) {
+ JSoundDataFrame dataFrame = this.children.get(0).getDataFrame(context);
+ List
- columnsToDropItems = this.children.get(1).materialize(context);
+ if (columnsToDropItems.isEmpty()) {
+ throw new InvalidSelectorException(
+ "Invalid drop-columns parameter; drop-columns can't be performed without string columns to be removed.",
+ getMetadata()
+ );
+ }
+ String[] columnsToDrop = new String[columnsToDropItems.size()];
+ int i = 0;
+ for (Item columnItem : columnsToDropItems) {
+ if (!columnItem.isString()) {
+ throw new UnexpectedTypeException("drop-columns invoked with non-string columns", getMetadata());
+ }
+ columnsToDrop[i] = columnItem.getStringValue();
+ ++i;
+ }
+ return new JSoundDataFrame(dataFrame.getDataFrame().drop(columnsToDrop), dataFrame.getItemType());
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/TimeInMillis.java b/src/main/java/org/rumbledb/runtime/functions/datetime/TimeInMillis.java
new file mode 100644
index 0000000000..1d5855e196
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/datetime/TimeInMillis.java
@@ -0,0 +1,29 @@
+package org.rumbledb.runtime.functions.datetime;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.items.ItemFactory;
+import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+
+import java.util.List;
+
+public class TimeInMillis extends AtMostOneItemLocalRuntimeIterator {
+
+ private static final long serialVersionUID = 1L;
+
+ public TimeInMillis(
+ List arguments,
+ RuntimeStaticContext staticContext
+ ) {
+ super(arguments, staticContext);
+ }
+
+ @Override
+ public Item materializeFirstItemOrNull(DynamicContext context) {
+ long time = System.currentTimeMillis();
+ return ItemFactory.getInstance().createLongItem(time);
+ }
+
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/error/ThrowErrorIterator.java b/src/main/java/org/rumbledb/runtime/functions/error/ThrowErrorIterator.java
new file mode 100644
index 0000000000..c83e615342
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/error/ThrowErrorIterator.java
@@ -0,0 +1,41 @@
+package org.rumbledb.runtime.functions.error;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.errorcodes.ErrorCode;
+import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.exceptions.RumbleException;
+import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+
+import java.util.List;
+
+public class ThrowErrorIterator extends AtMostOneItemLocalRuntimeIterator {
+ public ThrowErrorIterator(List children, RuntimeStaticContext staticContext) {
+ super(children, staticContext);
+ }
+
+ @Override
+ public Item materializeFirstItemOrNull(DynamicContext context) {
+ if (this.children.isEmpty()) {
+ // No argument case.
+ throw new RumbleException(
+ "An error has been raised without an error description or code.",
+ ExceptionMetadata.EMPTY_METADATA
+ );
+ } else if (this.children.size() == 1) {
+ // Error code argument case.
+ Item errorCode = this.children.get(0).materializeFirstItemOrNull(context);
+ throw new RumbleException(
+ "An error has been raised without an error description.",
+ ErrorCode.valueOf(errorCode.getStringValue())
+ );
+ } else {
+ // Error code and description arguments case.
+ Item errorCode = this.children.get(0).materializeFirstItemOrNull(context);
+ Item description = this.children.get(1).materializeFirstItemOrNull(context);
+ throw new RumbleException(description.getStringValue(), ErrorCode.valueOf(errorCode.getStringValue()));
+ }
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/io/XmlDocFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/io/XmlDocFunctionIterator.java
new file mode 100644
index 0000000000..ff43df0c5c
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/io/XmlDocFunctionIterator.java
@@ -0,0 +1,67 @@
+package org.rumbledb.runtime.functions.io;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.IteratorFlowException;
+import org.rumbledb.exceptions.OurBadException;
+import org.rumbledb.items.parsing.ItemParser;
+import org.rumbledb.runtime.RuntimeIterator;
+import org.rumbledb.runtime.functions.base.LocalFunctionCallIterator;
+import org.rumbledb.runtime.functions.input.FileSystemUtil;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.List;
+
+public class XmlDocFunctionIterator extends LocalFunctionCallIterator {
+ private static final long serialVersionUID = 1L;
+ private RuntimeIterator pathIterator;
+
+ public XmlDocFunctionIterator(List parameters, RuntimeStaticContext staticContext) {
+ super(parameters, staticContext);
+ }
+
+ @Override
+ public void open(DynamicContext context) {
+ super.open(context);
+ this.pathIterator = this.children.get(0);
+ this.pathIterator.open(this.currentDynamicContextForLocalExecution);
+ this.hasNext = this.pathIterator.hasNext();
+ this.pathIterator.close();
+ }
+
+ @Override
+ public Item next() {
+ if (this.hasNext) {
+ this.hasNext = false;
+ Item path = this.pathIterator.materializeFirstItemOrNull(this.currentDynamicContextForLocalExecution);
+ try {
+ URI uri = FileSystemUtil.resolveURI(this.staticURI, path.getStringValue(), getMetadata());
+ DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+ InputStream xmlFileStream = FileSystemUtil.getDataInputStream(
+ uri,
+ this.currentDynamicContextForLocalExecution.getRumbleRuntimeConfiguration(),
+ getMetadata()
+ );
+ DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+ Document xmlDocument = documentBuilder.parse(xmlFileStream);
+ Item res = ItemParser.getItemFromXML(xmlDocument);
+ return res;
+ } catch (ParserConfigurationException e) {
+ throw new OurBadException("Document builder creation failed with: " + e);
+ } catch (IOException e) {
+ throw new RuntimeException("IOException while reading XML document." + e);
+ } catch (SAXException e) {
+ throw new RuntimeException("SAXException while reading XML document." + e);
+ }
+ }
+ throw new IteratorFlowException(RuntimeIterator.FLOW_EXCEPTION_MESSAGE + " xml-doc function", getMetadata());
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/nullable/IsNullIterator.java b/src/main/java/org/rumbledb/runtime/functions/nullable/IsNullIterator.java
new file mode 100644
index 0000000000..ddb2af01aa
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/nullable/IsNullIterator.java
@@ -0,0 +1,28 @@
+package org.rumbledb.runtime.functions.nullable;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.items.ItemFactory;
+import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+
+import java.util.List;
+
+public class IsNullIterator extends AtMostOneItemLocalRuntimeIterator {
+ public IsNullIterator(List children, RuntimeStaticContext staticContext) {
+ super(children, staticContext);
+ }
+
+ @Override
+ public Item materializeFirstItemOrNull(DynamicContext context) {
+ List
- materializedItems = this.children.get(0).materialize(context);
+ if (materializedItems == null || materializedItems.isEmpty()) {
+ return ItemFactory.getInstance().createBooleanItem(true);
+ }
+ if (materializedItems.size() > 1) {
+ return ItemFactory.getInstance().createBooleanItem(false);
+ }
+ return ItemFactory.getInstance().createBooleanItem(materializedItems.get(0).isNull());
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java
index 6b5dd20f0e..79ee559552 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java
@@ -29,6 +29,7 @@
import org.rumbledb.exceptions.IteratorFlowException;
import org.rumbledb.exceptions.UnexpectedTypeException;
import org.rumbledb.items.ItemFactory;
+import org.rumbledb.items.structured.JSoundDataFrame;
import org.rumbledb.runtime.HybridRuntimeIterator;
import org.rumbledb.runtime.RuntimeIterator;
@@ -163,4 +164,26 @@ public JavaRDD
- getRDDAux(DynamicContext context) {
);
return childRDD.flatMap(transformation);
}
+
+ @Override
+ public JSoundDataFrame getDataFrame(DynamicContext context) {
+ JSoundDataFrame dataFrame = this.iterator.getDataFrame(context);
+ List
- columnsToDropItems = this.children.get(1).materialize(context);
+ if (columnsToDropItems.isEmpty()) {
+ throw new InvalidSelectorException(
+ "Invalid drop-columns parameter; drop-columns can't be performed without string columns to be removed.",
+ getMetadata()
+ );
+ }
+ String[] columnsToDrop = new String[columnsToDropItems.size()];
+ int i = 0;
+ for (Item columnItem : columnsToDropItems) {
+ if (!columnItem.isString()) {
+ throw new UnexpectedTypeException("drop-columns invoked with non-string columns", getMetadata());
+ }
+ columnsToDrop[i] = columnItem.getStringValue();
+ ++i;
+ }
+ return new JSoundDataFrame(dataFrame.getDataFrame().drop(columnsToDrop), dataFrame.getItemType());
+ }
}
diff --git a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomDoublesIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomDoublesIterator.java
new file mode 100644
index 0000000000..6c3d617485
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomDoublesIterator.java
@@ -0,0 +1,40 @@
+package org.rumbledb.runtime.functions.random;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.items.ItemFactory;
+
+import java.util.PrimitiveIterator;
+
+public class GeneratedRandomDoublesIterator extends GeneratedRandomsIterator {
+ private final PrimitiveIterator.OfDouble iterator;
+
+ public GeneratedRandomDoublesIterator(int size, double low, double high) {
+ super();
+ this.iterator = this.random.doubles(size, low, high).iterator();
+ }
+
+ public GeneratedRandomDoublesIterator(int size, double low, double high, int seed) {
+ super(seed);
+ this.iterator = this.random.doubles(size, low, high).iterator();
+ }
+
+ public GeneratedRandomDoublesIterator(int size) {
+ super();
+ this.iterator = this.random.doubles(size).iterator();
+ }
+
+ public GeneratedRandomDoublesIterator(int size, int seed) {
+ super(seed);
+ this.iterator = this.random.doubles(size).iterator();
+ }
+
+ @Override
+ public Item getNextRandom() {
+ return ItemFactory.getInstance().createDoubleItem(iterator.next());
+ }
+
+ @Override
+ public boolean hasNext() {
+ return this.iterator.hasNext();
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomIntegersIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomIntegersIterator.java
new file mode 100644
index 0000000000..72f1352372
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomIntegersIterator.java
@@ -0,0 +1,30 @@
+package org.rumbledb.runtime.functions.random;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.items.ItemFactory;
+
+import java.util.PrimitiveIterator;
+
+public class GeneratedRandomIntegersIterator extends GeneratedRandomsIterator {
+ private final PrimitiveIterator.OfInt iterator;
+
+ public GeneratedRandomIntegersIterator(int size, int low, int high) {
+ super();
+ this.iterator = random.ints(size, low, high).iterator();
+ }
+
+ public GeneratedRandomIntegersIterator(int size, int low, int high, int seed) {
+ super(seed);
+ this.iterator = random.ints(size, low, high).iterator();
+ }
+
+ @Override
+ public Item getNextRandom() {
+ return ItemFactory.getInstance().createIntItem(iterator.next());
+ }
+
+ @Override
+ public boolean hasNext() {
+ return this.iterator.hasNext();
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomsIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomsIterator.java
new file mode 100644
index 0000000000..de111c4307
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/random/GeneratedRandomsIterator.java
@@ -0,0 +1,22 @@
+package org.rumbledb.runtime.functions.random;
+
+import org.rumbledb.api.Item;
+
+import java.util.Random;
+
+public abstract class GeneratedRandomsIterator {
+ protected Random random;
+
+ protected GeneratedRandomsIterator() {
+ this.random = new Random();
+ }
+
+ protected GeneratedRandomsIterator(int seed) {
+ this.random = new Random();
+ this.random.setSeed(seed);
+ }
+
+ public abstract Item getNextRandom();
+
+ public abstract boolean hasNext();
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomNumberGeneratorIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomNumberGeneratorIterator.java
new file mode 100644
index 0000000000..623ae8359d
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomNumberGeneratorIterator.java
@@ -0,0 +1,32 @@
+package org.rumbledb.runtime.functions.random;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.items.ItemFactory;
+import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+
+import java.util.List;
+import java.util.Random;
+
+/**
+ * Implementation based on W3C spec: ...
+ */
+public class RandomNumberGeneratorIterator extends AtMostOneItemLocalRuntimeIterator {
+
+ private static final long serialVersionUID = 1L;
+
+ public RandomNumberGeneratorIterator(
+ List arguments,
+ RuntimeStaticContext staticContext
+ ) {
+ super(arguments, staticContext);
+ }
+
+ @Override
+ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) {
+ Random random = new Random();
+ return ItemFactory.getInstance().createDoubleItem(random.nextDouble());
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java
new file mode 100644
index 0000000000..caf042642f
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceGeneratorIterator.java
@@ -0,0 +1,46 @@
+package org.rumbledb.runtime.functions.random;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.runtime.LocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+
+import java.util.List;
+
+public class RandomSequenceGeneratorIterator extends LocalRuntimeIterator {
+ private static final long serialVersionUID = 1L;
+ private GeneratedRandomsIterator generatedRandomsIterator;
+
+ public RandomSequenceGeneratorIterator(List arguments, RuntimeStaticContext staticContext) {
+ super(arguments, staticContext);
+ }
+
+ @Override
+ public Item next() {
+ return this.generatedRandomsIterator.getNextRandom();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return this.generatedRandomsIterator.hasNext();
+ }
+
+ @Override
+ public void open(DynamicContext context) {
+ if (this.children.size() == 2) {
+ // Seed is present as first argument
+ int seed = this.children.get(0).materializeFirstItemOrNull(context).castToIntValue();
+ int sequenceLength = this.children.get(1).materializeFirstItemOrNull(context).castToIntValue();
+ this.generatedRandomsIterator = new GeneratedRandomDoublesIterator(
+ sequenceLength,
+ seed
+ );
+ } else {
+ int sequenceLength = this.children.get(0).materializeFirstItemOrNull(context).castToIntValue();
+ this.generatedRandomsIterator = new GeneratedRandomDoublesIterator(
+ sequenceLength
+ );
+ }
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsAndSeedIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsAndSeedIterator.java
new file mode 100644
index 0000000000..a7ff948aa3
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsAndSeedIterator.java
@@ -0,0 +1,61 @@
+package org.rumbledb.runtime.functions.random;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.runtime.LocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+
+import java.util.List;
+
+public class RandomSequenceWithBoundsAndSeedIterator extends LocalRuntimeIterator {
+ private Item low;
+ private Item high;
+ private Item type;
+ private int seed;
+ private int size;
+ private GeneratedRandomsIterator generatedRandomsIterator;
+
+ public RandomSequenceWithBoundsAndSeedIterator(List children, RuntimeStaticContext staticContext) {
+ super(children, staticContext);
+ }
+
+ @Override
+ public void open(DynamicContext context) {
+ this.low = this.children.get(0).materializeFirstItemOrNull(context);
+ this.high = this.children.get(1).materializeFirstItemOrNull(context);
+ this.size = this.children.get(2).materializeFirstItemOrNull(context).castToIntValue();
+ this.type = this.children.get(3).materializeFirstItemOrNull(context);
+ this.seed = this.children.get(4).materializeFirstItemOrNull(context).castToIntValue();
+ this.generatedRandomsIterator = createRandomNumberStream();
+ }
+
+ private GeneratedRandomsIterator createRandomNumberStream() {
+ if (type.getStringValue().equals("integer")) {
+ return new GeneratedRandomIntegersIterator(
+ size,
+ low.castToIntValue(),
+ high.castToIntValue(),
+ seed
+ );
+ } else {
+ // Generate doubles otherwise
+ return new GeneratedRandomDoublesIterator(
+ size,
+ low.castToDoubleValue(),
+ high.castToDoubleValue(),
+ seed
+ );
+ }
+ }
+
+ @Override
+ public Item next() {
+ return this.generatedRandomsIterator.getNextRandom();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return this.generatedRandomsIterator.hasNext();
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsIterator.java b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsIterator.java
new file mode 100644
index 0000000000..dc64bc01a6
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/random/RandomSequenceWithBoundsIterator.java
@@ -0,0 +1,60 @@
+package org.rumbledb.runtime.functions.random;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.runtime.LocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+
+import java.util.List;
+import java.util.Random;
+
+public class RandomSequenceWithBoundsIterator extends LocalRuntimeIterator {
+ private Item low;
+ private Item high;
+ private int size;
+ private Item type;
+ private Random random;
+ private GeneratedRandomsIterator generatedRandomsIterator;
+
+ public RandomSequenceWithBoundsIterator(List children, RuntimeStaticContext staticContext) {
+ super(children, staticContext);
+ }
+
+ @Override
+ public void open(DynamicContext context) {
+ this.low = this.children.get(0).materializeFirstItemOrNull(context);
+ this.high = this.children.get(1).materializeFirstItemOrNull(context);
+ this.size = this.children.get(2).materializeFirstItemOrNull(context).castToIntValue();
+ this.type = this.children.get(3).materializeFirstItemOrNull(context);
+ this.random = new Random();
+ this.generatedRandomsIterator = createRandomNumberStream();
+ }
+
+ private GeneratedRandomsIterator createRandomNumberStream() {
+ if (type.getStringValue().equals("integer")) {
+ return new GeneratedRandomIntegersIterator(
+ size,
+ low.castToIntValue(),
+ high.castToIntValue()
+ );
+ } else {
+ // Generate doubles otherwise
+ return new GeneratedRandomDoublesIterator(
+ size,
+ low.castToDoubleValue(),
+ high.castToDoubleValue()
+ );
+ }
+ }
+
+ @Override
+ public Item next() {
+ return this.generatedRandomsIterator.getNextRandom();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return this.generatedRandomsIterator.hasNext();
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemTypeIterator.java b/src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemTypeIterator.java
new file mode 100644
index 0000000000..5cd463c792
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/typing/DynamicItemTypeIterator.java
@@ -0,0 +1,51 @@
+package org.rumbledb.runtime.functions.typing;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.items.ItemFactory;
+import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+import org.rumbledb.types.ItemType;
+
+import java.util.List;
+
+public class DynamicItemTypeIterator extends AtMostOneItemLocalRuntimeIterator {
+ private List
- materializedArgument;
+ private ItemType itemType;
+
+ public DynamicItemTypeIterator(List children, RuntimeStaticContext staticContext) {
+ super(children, staticContext);
+ }
+
+ @Override
+ public Item materializeFirstItemOrNull(DynamicContext context) {
+ materializeArgument(context);
+ setArgumentType();
+ return getLeastCommonSupertype();
+ }
+
+ private void materializeArgument(DynamicContext context) {
+ this.materializedArgument = this.children.get(0).materialize(context);
+ }
+
+ private void setArgumentType() {
+ this.itemType = this.materializedArgument.get(0).getDynamicType();
+ }
+
+ private Item getLeastCommonSupertype() {
+ List
- structureItems = getStructureItems();
+ ItemType structureCommonType = structureItems.get(0).getDynamicType();
+ for (Item item : structureItems) {
+ structureCommonType = structureCommonType.findLeastCommonSuperTypeWith(item.getDynamicType());
+ }
+ return ItemFactory.getInstance().createStringItem(structureCommonType.getIdentifierString());
+ }
+
+ private List
- getStructureItems() {
+ if (this.itemType.isArrayItemType()) {
+ return this.materializedArgument.get(0).getItems();
+ }
+ return this.materializedArgument;
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/xml/GetRootFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/xml/GetRootFunctionIterator.java
new file mode 100644
index 0000000000..637a55087e
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/xml/GetRootFunctionIterator.java
@@ -0,0 +1,63 @@
+package org.rumbledb.runtime.functions.xml;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.Name;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.IteratorFlowException;
+import org.rumbledb.exceptions.UnsupportedFeatureException;
+import org.rumbledb.items.xml.AttributeItem;
+import org.rumbledb.items.xml.DocumentItem;
+import org.rumbledb.items.xml.ElementItem;
+import org.rumbledb.items.xml.TextItem;
+import org.rumbledb.runtime.RuntimeIterator;
+import org.rumbledb.runtime.functions.base.LocalFunctionCallIterator;
+
+import java.util.List;
+
+public class GetRootFunctionIterator extends LocalFunctionCallIterator {
+ public GetRootFunctionIterator(List parameters, RuntimeStaticContext staticContext) {
+ super(parameters, staticContext);
+ }
+
+ @Override
+ public void open(DynamicContext context) {
+ super.open(context);
+ this.hasNext = true;
+ }
+
+ @Override
+ public Item next() {
+ if (this.hasNext) {
+ this.hasNext = false;
+ Item node = getContextNode();
+ // TODO: type check that node is XML node type.
+ if (
+ node instanceof DocumentItem
+ || node instanceof ElementItem
+ || node instanceof AttributeItem
+ || node instanceof TextItem
+ ) {
+ if (node.parent() == null) {
+ // Node is already the root.
+ return node;
+ }
+ return node.parent();
+ }
+ throw new UnsupportedFeatureException(
+ "The argument must be a reference to a supported XML node type",
+ getMetadata()
+ );
+ }
+ throw new IteratorFlowException(RuntimeIterator.FLOW_EXCEPTION_MESSAGE + " root function", getMetadata());
+ }
+
+ private Item getContextNode() {
+ if (this.children.isEmpty()) {
+ return this.currentDynamicContextForLocalExecution.getVariableValues()
+ .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata())
+ .get(0);
+ }
+ return this.children.get(0).materializeFirstItemOrNull(this.currentDynamicContextForLocalExecution);
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java b/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java
index b4bfd4578a..8dd71cde8f 100644
--- a/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java
+++ b/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java
@@ -364,6 +364,11 @@ public static long compareItems(
String r = right.getStringValue();
return processString(l, r);
}
+ if (left.getContent() && right.getContent()) {
+ String l = left.getTextValue();
+ String r = right.getTextValue();
+ return processString(l, r);
+ }
return Long.MIN_VALUE;
}
diff --git a/src/main/java/org/rumbledb/runtime/xml/AtomizationIterator.java b/src/main/java/org/rumbledb/runtime/xml/AtomizationIterator.java
new file mode 100644
index 0000000000..66f4012922
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/AtomizationIterator.java
@@ -0,0 +1,77 @@
+package org.rumbledb.runtime.xml;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.IteratorFlowException;
+import org.rumbledb.items.xml.AttributeItem;
+import org.rumbledb.items.xml.DocumentItem;
+import org.rumbledb.items.xml.ElementItem;
+import org.rumbledb.items.xml.TextItem;
+import org.rumbledb.runtime.LocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+
+import java.util.Collections;
+import java.util.List;
+
+public class AtomizationIterator extends LocalRuntimeIterator {
+ private RuntimeIterator pathExpr;
+ private List
- result;
+ private int currentResultCounter;
+ private Item nextResult;
+
+ public AtomizationIterator(RuntimeIterator pathExpr, RuntimeStaticContext staticContext) {
+ super(Collections.singletonList(pathExpr), staticContext);
+ this.pathExpr = pathExpr;
+ }
+
+ @Override
+ public void open(DynamicContext context) {
+ super.open(context);
+ this.currentResultCounter = 0;
+ setNextResult();
+ }
+
+ private void setNextResult() {
+ if (this.result == null) {
+ this.result = this.pathExpr.materialize(this.currentDynamicContextForLocalExecution);
+ for (int i = 0; i < this.result.size(); ++i) {
+ if (
+ this.result.get(i) instanceof AttributeItem
+ || this.result.get(i) instanceof ElementItem
+ || this.result.get(i) instanceof TextItem
+ || this.result.get(i) instanceof DocumentItem
+ ) {
+ this.result.set(i, this.result.get(i).typedValue());
+ }
+ }
+ }
+ if (this.currentResultCounter < this.result.size()) {
+ this.nextResult = this.result.get(this.currentResultCounter++);
+ } else {
+ this.hasNext = false;
+ }
+ }
+
+ @Override
+ public void close() {
+ super.close();
+ this.pathExpr.close();
+ this.result = null;
+ this.hasNext = false;
+ this.currentResultCounter = 0;
+ }
+
+ @Override
+ public Item next() {
+ if (this.hasNext) {
+ Item result = this.nextResult;
+ setNextResult();
+ return result;
+ }
+ throw new IteratorFlowException(
+ RuntimeIterator.FLOW_EXCEPTION_MESSAGE + " in AtomizationIterator",
+ getMetadata()
+ );
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java b/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java
new file mode 100644
index 0000000000..3397e3f818
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/PathExprIterator.java
@@ -0,0 +1,91 @@
+package org.rumbledb.runtime.xml;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.Name;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.IteratorFlowException;
+import org.rumbledb.runtime.LocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+
+import java.util.List;
+
+public class PathExprIterator extends LocalRuntimeIterator {
+ private final RuntimeIterator getRootIterator;
+ private final List stepIterators;
+ private List
- results = null;
+ private int nextResultCounter = 0;
+ private Item nextResult;
+
+ public PathExprIterator(
+ List stepIterators,
+ RuntimeIterator getRootIterator,
+ RuntimeStaticContext staticContext
+ ) {
+ super(null, staticContext);
+ this.children.addAll(stepIterators);
+ if (getRootIterator != null) {
+ this.children.add(getRootIterator);
+ }
+ this.stepIterators = stepIterators;
+ this.getRootIterator = getRootIterator;
+ }
+
+ @Override
+ public void open(DynamicContext context) {
+ super.open(context);
+ setNextResult();
+ }
+
+ @Override
+ public void close() {
+ super.close();
+ this.hasNext = false;
+ this.results = null;
+ this.nextResult = null;
+ this.nextResultCounter = 0;
+ this.stepIterators.forEach(RuntimeIterator::close);
+ }
+
+ private void setNextResult() {
+ if (this.results == null) {
+ RuntimeIterator finalIterator = this.stepIterators.get(this.stepIterators.size() - 1);
+ if (this.getRootIterator != null) {
+ List
- root = this.getRootIterator.materialize(this.currentDynamicContextForLocalExecution);
+ this.currentDynamicContextForLocalExecution.getVariableValues()
+ .addVariableValue(Name.CONTEXT_ITEM, root);
+ }
+ for (int i = 0; i < this.stepIterators.size() - 1; ++i) {
+ // TODO: Verify that the type of each item is node
+ List
- nextContext = this.stepIterators.get(i)
+ .materialize(this.currentDynamicContextForLocalExecution);
+ this.currentDynamicContextForLocalExecution.getVariableValues()
+ .addVariableValue(Name.CONTEXT_ITEM, nextContext);
+ }
+ results = finalIterator.materialize(this.currentDynamicContextForLocalExecution);
+ }
+ if (this.nextResultCounter < this.results.size()) {
+ this.nextResult = this.results.get(nextResultCounter++);
+ } else {
+ this.hasNext = false;
+ }
+ }
+
+ @Override
+ public Item next() {
+ if (this.hasNext) {
+ Item nextResult = this.nextResult;
+ setNextResult();
+ return nextResult;
+ }
+ throw new IteratorFlowException(
+ RuntimeIterator.FLOW_EXCEPTION_MESSAGE + " in Path Expression",
+ getMetadata()
+ );
+ }
+
+ @Override
+ public boolean hasNext() {
+ return super.hasNext();
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java b/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java
new file mode 100644
index 0000000000..c64a4f2611
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/StepExprIterator.java
@@ -0,0 +1,230 @@
+package org.rumbledb.runtime.xml;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.IteratorFlowException;
+import org.rumbledb.exceptions.UnsupportedFeatureException;
+import org.rumbledb.expressions.xml.node_test.AnyKindTest;
+import org.rumbledb.expressions.xml.node_test.AttributeTest;
+import org.rumbledb.expressions.xml.node_test.DocumentTest;
+import org.rumbledb.expressions.xml.node_test.ElementTest;
+import org.rumbledb.expressions.xml.node_test.NameTest;
+import org.rumbledb.expressions.xml.node_test.NodeTest;
+import org.rumbledb.expressions.xml.node_test.TextTest;
+import org.rumbledb.items.xml.AttributeItem;
+import org.rumbledb.items.xml.DocumentItem;
+import org.rumbledb.items.xml.ElementItem;
+import org.rumbledb.items.xml.TextItem;
+import org.rumbledb.runtime.LocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+import org.rumbledb.runtime.xml.axis.forward.AttributeAxisIterator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class StepExprIterator extends LocalRuntimeIterator {
+ private final RuntimeIterator axisIterator;
+ private NodeTest nodeTest;
+ private List
- results;
+ private Item nextResult;
+ private int resultCounter = 0;
+
+ public StepExprIterator(
+ RuntimeIterator axisIterator,
+ NodeTest nodeTest,
+ RuntimeStaticContext staticContext
+ ) {
+ super(null, staticContext);
+ this.children.add(axisIterator);
+ this.axisIterator = axisIterator;
+ this.nodeTest = nodeTest;
+ }
+
+ @Override
+ public void open(DynamicContext context) {
+ super.open(context);
+ setNextResult();
+ }
+
+ @Override
+ public void close() {
+ super.close();
+ this.results = null;
+ this.nextResult = null;
+ this.resultCounter = 0;
+ this.axisIterator.close();
+ }
+
+ private void setNextResult() {
+ if (this.results == null) {
+ List
- axisResult = applyAxis();
+ this.results = applyNodeTest(axisResult);
+ }
+ storeNextResult();
+ }
+
+ private List
- applyAxis() {
+ return this.axisIterator.materialize(this.currentDynamicContextForLocalExecution);
+ }
+
+ private void storeNextResult() {
+ if (this.resultCounter < this.results.size()) {
+ this.nextResult = this.results.get(this.resultCounter++);
+ } else {
+ this.hasNext = false;
+ }
+ }
+
+ private List
- applyNodeTest(List
- axisResult) {
+ List
- nodeTestResults = new ArrayList<>();
+ for (Item node : axisResult) {
+ Item nodeTestResult = nodeTestItem(node);
+ if (nodeTestResult != null) {
+ nodeTestResults.add(nodeTestResult);
+ }
+ }
+ return nodeTestResults;
+ }
+
+ private Item nodeTestItem(Item node) {
+ if (this.nodeTest instanceof AnyKindTest) {
+ return anyKindTest(node);
+ } else if (this.nodeTest instanceof TextTest) {
+ return textKindTest(node);
+ } else if (this.nodeTest instanceof AttributeTest) {
+ return attributeKindTest(node);
+ } else if (this.nodeTest instanceof ElementTest) {
+ return elementKindTest(node);
+ } else if (this.nodeTest instanceof NameTest) {
+ return nameKindTest(node);
+ } else if (this.nodeTest instanceof DocumentTest) {
+ return documentKindTest(node);
+ } else {
+ throw new UnsupportedFeatureException(
+ "Only node, text, attribute, element, document and name node tests are supported.",
+ getMetadata()
+ );
+ }
+ }
+
+ private Item documentKindTest(Item node) {
+ DocumentTest documentTest = (DocumentTest) this.nodeTest;
+ if (documentTest.isEmptyCheck()) {
+ if (node instanceof DocumentItem) {
+ return node;
+ }
+ return node;
+ }
+ this.nodeTest = documentTest.getNodeTest();
+ return nodeTestItem(node);
+ }
+
+ private Item nameKindTest(Item node) {
+ NameTest nameTest = (NameTest) this.nodeTest;
+ if (nameTest.hasQName()) {
+ if (!isPrincipalNodeKind(node)) {
+ return null;
+ }
+ if (node.nodeName().equals(nameTest.getQName())) {
+ return node;
+ }
+ return null;
+ }
+ if (nameTest.hasWildcardOnly()) {
+ if (!isPrincipalNodeKind(node)) {
+ return null;
+ }
+ return node;
+ }
+ if (nameTest.getWildcardQName().equals(node.nodeName())) {
+ return node;
+ }
+ return null;
+ }
+
+ // TODO: Add support for namespace nodes.
+ private boolean isPrincipalNodeKind(Item node) {
+ if (this.axisIterator instanceof AttributeAxisIterator) {
+ return node.isAttributeNode();
+ }
+ return node.isElementNode();
+ }
+
+ private Item elementKindTest(Item node) {
+ ElementTest elementTest = (ElementTest) this.nodeTest;
+ if (elementTest.isEmptyCheck()) {
+ if (node instanceof ElementItem) {
+ return node;
+ }
+ return null;
+ }
+ if (elementTest.isNameWithoutTypeCheck()) {
+ if (node instanceof ElementItem && node.nodeName().equals(elementTest.getElementName())) {
+ return node;
+ }
+ return null;
+ }
+ if (elementTest.isWildcardOnly()) {
+ if (node instanceof ElementItem) {
+ return node;
+ }
+ return null;
+ }
+ // TODO: add support for name and type
+ return null;
+ }
+
+ private Item attributeKindTest(Item node) {
+ AttributeTest attributeTest = (AttributeTest) this.nodeTest;
+ if (attributeTest.isEmptyCheck()) {
+ if (node instanceof AttributeItem) {
+ return node;
+ }
+ return null;
+ }
+ if (attributeTest.isNameWithoutTypeCheck()) {
+ if (node instanceof AttributeItem && node.nodeName().equals(attributeTest.getAttributeName())) {
+ return node;
+ }
+ return null;
+ }
+ if (attributeTest.isWildcardOnly()) {
+ if (node instanceof AttributeItem) {
+ return node;
+ }
+ return null;
+ }
+ // TODO: add support for name and type
+ return null;
+ }
+
+ private Item textKindTest(Item node) {
+ if (node instanceof TextItem) {
+ return node;
+ }
+ return null;
+ }
+
+ private Item anyKindTest(Item node) {
+ return node;
+ }
+
+ @Override
+ public Item next() {
+ if (this.hasNext) {
+ Item result = this.nextResult;
+ setNextResult();
+ return result;
+ }
+ throw new IteratorFlowException(
+ RuntimeIterator.FLOW_EXCEPTION_MESSAGE + " in step expr",
+ getMetadata()
+ );
+ }
+
+ @Override
+ public boolean hasNext() {
+ return super.hasNext();
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java
new file mode 100644
index 0000000000..377abf3e00
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIterator.java
@@ -0,0 +1,86 @@
+package org.rumbledb.runtime.xml.axis;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.IteratorFlowException;
+import org.rumbledb.runtime.LocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+
+public abstract class AxisIterator extends LocalRuntimeIterator {
+ protected List
- results;
+ protected int resultCounter = 0;
+ protected Item nextResult;
+
+ public AxisIterator(RuntimeStaticContext staticContext) {
+ super(null, staticContext);
+ }
+
+ @Override
+ public void open(DynamicContext context) {
+ super.open(context);
+ setNextResult();
+ }
+
+
+ protected abstract void setNextResult();
+
+ protected void storeNextResult() {
+ if (this.resultCounter == 0) {
+ // Remove duplicates
+ this.results = new ArrayList<>(new LinkedHashSet<>(this.results));
+ // Sort values in document order.
+ this.results.sort(Item::compareXmlNode);
+ }
+ if (this.resultCounter < this.results.size()) {
+ this.nextResult = this.results.get(this.resultCounter++);
+ } else {
+ this.hasNext = false;
+ }
+ }
+
+ protected List
- getDescendants(Item node) {
+ List
- descendants = new ArrayList<>();
+ for (Item child : node.children()) {
+ descendants.add(child);
+ descendants.addAll(getDescendants(child));
+ }
+ return descendants;
+ }
+
+ protected List
- getAncestors(Item node) {
+ List
- ancestors = new ArrayList<>();
+ Item parent = node.parent();
+ while (parent != null) {
+ ancestors.add(parent);
+ parent = parent.parent();
+ }
+ return ancestors;
+ }
+
+ @Override
+ public Item next() {
+ if (this.hasNext) {
+ Item nextResult = this.nextResult;
+ setNextResult();
+ return nextResult;
+ }
+ throw new IteratorFlowException(
+ RuntimeIterator.FLOW_EXCEPTION_MESSAGE + " in axis",
+ getMetadata()
+ );
+ }
+
+ @Override
+ public void close() {
+ super.close();
+ this.hasNext = false;
+ this.nextResult = null;
+ this.results = null;
+ this.resultCounter = 0;
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/AxisIteratorVisitor.java b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIteratorVisitor.java
new file mode 100644
index 0000000000..602fa9fd60
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/axis/AxisIteratorVisitor.java
@@ -0,0 +1,66 @@
+package org.rumbledb.runtime.xml.axis;
+
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.exceptions.UnsupportedFeatureException;
+import org.rumbledb.expressions.xml.axis.ForwardStepExpr;
+import org.rumbledb.expressions.xml.axis.ReverseStepExpr;
+import org.rumbledb.runtime.xml.axis.forward.AttributeAxisIterator;
+import org.rumbledb.runtime.xml.axis.forward.ChildAxisIterator;
+import org.rumbledb.runtime.xml.axis.forward.DescendantAxisIterator;
+import org.rumbledb.runtime.xml.axis.forward.DescendantOrSelfAxisIterator;
+import org.rumbledb.runtime.xml.axis.forward.FollowingAxisIterator;
+import org.rumbledb.runtime.xml.axis.forward.FollowingSiblingAxisIterator;
+import org.rumbledb.runtime.xml.axis.forward.SelfAxisIterator;
+import org.rumbledb.runtime.xml.axis.reverse.AncestorAxisIterator;
+import org.rumbledb.runtime.xml.axis.reverse.AncestorOrSelfAxisIterator;
+import org.rumbledb.runtime.xml.axis.reverse.ParentAxisIterator;
+import org.rumbledb.runtime.xml.axis.reverse.PrecedingAxisIterator;
+import org.rumbledb.runtime.xml.axis.reverse.PrecedingSiblingAxisIterator;
+
+public class AxisIteratorVisitor {
+
+ public AxisIterator visit(ForwardStepExpr forwardStep, RuntimeStaticContext staticContext) {
+ switch (forwardStep.getForwardAxis()) {
+ case SELF:
+ return new SelfAxisIterator(staticContext);
+ case CHILD:
+ return new ChildAxisIterator(staticContext);
+ case ATTRIBUTE:
+ return new AttributeAxisIterator(staticContext);
+ case FOLLOWING:
+ return new FollowingAxisIterator(staticContext);
+ case DESCENDANT:
+ return new DescendantAxisIterator(staticContext);
+ case FOLLOWING_SIBLING:
+ return new FollowingSiblingAxisIterator(staticContext);
+ case DESCENDANT_OR_SELF:
+ return new DescendantOrSelfAxisIterator(staticContext);
+ default:
+ throw new UnsupportedFeatureException(
+ "Axis " + forwardStep.getForwardAxis() + "unrecognized",
+ ExceptionMetadata.EMPTY_METADATA
+ );
+ }
+ }
+
+ public AxisIterator visit(ReverseStepExpr reverseStep, RuntimeStaticContext staticContext) {
+ switch (reverseStep.getReverseAxis()) {
+ case PARENT:
+ return new ParentAxisIterator(staticContext);
+ case ANCESTOR:
+ return new AncestorAxisIterator(staticContext);
+ case PRECEDING:
+ return new PrecedingAxisIterator(staticContext);
+ case ANCESTOR_OR_SELF:
+ return new AncestorOrSelfAxisIterator(staticContext);
+ case PRECEDING_SIBLING:
+ return new PrecedingSiblingAxisIterator(staticContext);
+ default:
+ throw new UnsupportedFeatureException(
+ "Axis " + reverseStep.getReverseAxis() + "unrecognized",
+ ExceptionMetadata.EMPTY_METADATA
+ );
+ }
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/AttributeAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/AttributeAxisIterator.java
new file mode 100644
index 0000000000..06375e359a
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/AttributeAxisIterator.java
@@ -0,0 +1,32 @@
+package org.rumbledb.runtime.xml.axis.forward;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.Name;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.UnexpectedNodeException;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AttributeAxisIterator extends AxisIterator {
+ public AttributeAxisIterator(RuntimeStaticContext staticContext) {
+ super(staticContext);
+ }
+
+ @Override
+ protected void setNextResult() {
+ if (this.results == null) {
+ this.results = new ArrayList<>();
+ List
- currentContext = this.currentDynamicContextForLocalExecution.getVariableValues()
+ .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata());
+ if (currentContext.isEmpty()) {
+ throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata());
+ }
+ for (Item node : currentContext) {
+ this.results.addAll(node.attributes());
+ }
+ }
+ storeNextResult();
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/ChildAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/ChildAxisIterator.java
new file mode 100644
index 0000000000..0826955240
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/ChildAxisIterator.java
@@ -0,0 +1,36 @@
+package org.rumbledb.runtime.xml.axis.forward;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.Name;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.UnexpectedNodeException;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ChildAxisIterator extends AxisIterator {
+
+ public ChildAxisIterator(RuntimeStaticContext staticContext) {
+ super(staticContext);
+ }
+
+ protected void setNextResult() {
+ if (this.results == null) {
+ this.results = new ArrayList<>();
+ List
- currentContext = this.currentDynamicContextForLocalExecution.getVariableValues()
+ .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata());
+ if (currentContext.isEmpty()) {
+ throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata());
+ }
+ for (Item node : currentContext) {
+ this.results.addAll(node.children());
+ }
+ }
+ if (this.resultCounter < this.results.size()) {
+ this.nextResult = this.results.get(this.resultCounter++);
+ } else {
+ this.hasNext = false;
+ }
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantAxisIterator.java
new file mode 100644
index 0000000000..f09eabe306
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantAxisIterator.java
@@ -0,0 +1,32 @@
+package org.rumbledb.runtime.xml.axis.forward;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.Name;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.UnexpectedNodeException;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DescendantAxisIterator extends AxisIterator {
+ public DescendantAxisIterator(RuntimeStaticContext staticContext) {
+ super(staticContext);
+ }
+
+ @Override
+ protected void setNextResult() {
+ if (this.results == null) {
+ this.results = new ArrayList<>();
+ List
- currentContext = this.currentDynamicContextForLocalExecution.getVariableValues()
+ .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata());
+ if (currentContext.isEmpty()) {
+ throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata());
+ }
+ for (Item node : currentContext) {
+ this.results.addAll(getDescendants(node));
+ }
+ }
+ storeNextResult();
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java
new file mode 100644
index 0000000000..977a4877ad
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/DescendantOrSelfAxisIterator.java
@@ -0,0 +1,33 @@
+package org.rumbledb.runtime.xml.axis.forward;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.Name;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.UnexpectedNodeException;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DescendantOrSelfAxisIterator extends AxisIterator {
+ public DescendantOrSelfAxisIterator(RuntimeStaticContext staticContext) {
+ super(staticContext);
+ }
+
+ @Override
+ protected void setNextResult() {
+ if (this.results == null) {
+ this.results = new ArrayList<>();
+ List
- currentContext = this.currentDynamicContextForLocalExecution.getVariableValues()
+ .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata());
+ if (currentContext.isEmpty()) {
+ throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata());
+ }
+ for (Item node : currentContext) {
+ this.results.addAll(getDescendants(node));
+ this.results.add(node);
+ }
+ }
+ storeNextResult();
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java
new file mode 100644
index 0000000000..559f63e556
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingAxisIterator.java
@@ -0,0 +1,57 @@
+package org.rumbledb.runtime.xml.axis.forward;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.Name;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.UnexpectedNodeException;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class FollowingAxisIterator extends AxisIterator {
+ public FollowingAxisIterator(RuntimeStaticContext staticContext) {
+ super(staticContext);
+ }
+
+ @Override
+ protected void setNextResult() {
+ if (this.results == null) {
+ this.results = new ArrayList<>();
+ List
- currentContext = this.currentDynamicContextForLocalExecution.getVariableValues()
+ .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata());
+ if (currentContext.isEmpty()) {
+ throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata());
+ }
+ for (Item node : currentContext) {
+ this.results.addAll(getFollowingNodes(node.parent(), node));
+ }
+ }
+ storeNextResult();
+ }
+
+ /*
+ * Method adds the rest of the parent's descendants following the current node. Afterward, it visits the parent's
+ * parent and adds its descendants following the parent.
+ */
+ private List
- getFollowingNodes(Item parent, Item node) {
+ if (parent == null) {
+ return Collections.emptyList();
+ }
+ List
- followingNodes = new ArrayList<>();
+ List
- parentChildren = parent.children();
+ int followingIndex = -1;
+ for (int i = 0; i < parentChildren.size(); ++i) {
+ if (parentChildren.get(i).equals(node)) {
+ followingIndex = i + 1;
+ break;
+ }
+ }
+ for (int i = followingIndex; i > 0 && i < parentChildren.size(); ++i) {
+ followingNodes.addAll(getDescendants(parentChildren.get(i)));
+ }
+ followingNodes.addAll(getFollowingNodes(parent.parent(), parent));
+ return followingNodes;
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java
new file mode 100644
index 0000000000..53b271d728
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/FollowingSiblingAxisIterator.java
@@ -0,0 +1,52 @@
+package org.rumbledb.runtime.xml.axis.forward;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.Name;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.UnexpectedNodeException;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class FollowingSiblingAxisIterator extends AxisIterator {
+ public FollowingSiblingAxisIterator(RuntimeStaticContext staticContext) {
+ super(staticContext);
+ }
+
+ @Override
+ protected void setNextResult() {
+ if (this.results == null) {
+ this.results = new ArrayList<>();
+ List
- currentContext = this.currentDynamicContextForLocalExecution.getVariableValues()
+ .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata());
+ if (currentContext.isEmpty()) {
+ throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata());
+ }
+ for (Item node : currentContext) {
+ this.results.addAll(getFollowingSiblings(node));
+ }
+ }
+ storeNextResult();
+ }
+
+ private List
- getFollowingSiblings(Item node) {
+ if (node.parent().isNull()) {
+ return Collections.emptyList();
+ }
+ List
- result = new ArrayList<>();
+ List
- parentChildren = node.parent().children();
+ int siblingsStartIndex = 0;
+ for (int i = 0; i < parentChildren.size(); ++i) {
+ if (parentChildren.get(i).equals(node)) {
+ siblingsStartIndex = i + 1;
+ break;
+ }
+ }
+ for (int i = siblingsStartIndex; i > 0 && i < parentChildren.size(); ++i) {
+ result.add(parentChildren.get(i));
+ }
+ return result;
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/forward/SelfAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/forward/SelfAxisIterator.java
new file mode 100644
index 0000000000..b17ca4175a
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/axis/forward/SelfAxisIterator.java
@@ -0,0 +1,30 @@
+package org.rumbledb.runtime.xml.axis.forward;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.Name;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.UnexpectedNodeException;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SelfAxisIterator extends AxisIterator {
+ public SelfAxisIterator(RuntimeStaticContext staticContext) {
+ super(staticContext);
+ }
+
+ @Override
+ protected void setNextResult() {
+ if (this.results == null) {
+ this.results = new ArrayList<>();
+ List
- currentContext = this.currentDynamicContextForLocalExecution.getVariableValues()
+ .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata());
+ if (currentContext.isEmpty()) {
+ throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata());
+ }
+ this.results.addAll(currentContext);
+ }
+ storeNextResult();
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorAxisIterator.java
new file mode 100644
index 0000000000..4bb7a2380c
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorAxisIterator.java
@@ -0,0 +1,32 @@
+package org.rumbledb.runtime.xml.axis.reverse;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.Name;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.UnexpectedNodeException;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AncestorAxisIterator extends AxisIterator {
+ public AncestorAxisIterator(RuntimeStaticContext staticContext) {
+ super(staticContext);
+ }
+
+ @Override
+ protected void setNextResult() {
+ if (this.results == null) {
+ this.results = new ArrayList<>();
+ List
- currentContext = this.currentDynamicContextForLocalExecution.getVariableValues()
+ .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata());
+ if (currentContext.isEmpty()) {
+ throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata());
+ }
+ for (Item node : currentContext) {
+ this.results.addAll(getAncestors(node));
+ }
+ }
+ storeNextResult();
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java
new file mode 100644
index 0000000000..13d2193dec
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/AncestorOrSelfAxisIterator.java
@@ -0,0 +1,33 @@
+package org.rumbledb.runtime.xml.axis.reverse;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.Name;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.UnexpectedNodeException;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AncestorOrSelfAxisIterator extends AxisIterator {
+ public AncestorOrSelfAxisIterator(RuntimeStaticContext staticContext) {
+ super(staticContext);
+ }
+
+ @Override
+ protected void setNextResult() {
+ if (this.results == null) {
+ this.results = new ArrayList<>();
+ List
- currentContext = this.currentDynamicContextForLocalExecution.getVariableValues()
+ .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata());
+ if (currentContext.isEmpty()) {
+ throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata());
+ }
+ for (Item node : currentContext) {
+ this.results.addAll(getAncestors(node));
+ this.results.add(node);
+ }
+ }
+ storeNextResult();
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/ParentAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/ParentAxisIterator.java
new file mode 100644
index 0000000000..79d2fbb931
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/ParentAxisIterator.java
@@ -0,0 +1,32 @@
+package org.rumbledb.runtime.xml.axis.reverse;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.Name;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.UnexpectedNodeException;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ParentAxisIterator extends AxisIterator {
+ public ParentAxisIterator(RuntimeStaticContext staticContext) {
+ super(staticContext);
+ }
+
+ @Override
+ protected void setNextResult() {
+ if (this.results == null) {
+ this.results = new ArrayList<>();
+ List
- currentContext = this.currentDynamicContextForLocalExecution.getVariableValues()
+ .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata());
+ if (currentContext.isEmpty()) {
+ throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata());
+ }
+ for (Item node : currentContext) {
+ this.results.add(node.parent());
+ }
+ }
+ storeNextResult();
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java
new file mode 100644
index 0000000000..eb1c37098e
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingAxisIterator.java
@@ -0,0 +1,58 @@
+package org.rumbledb.runtime.xml.axis.reverse;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.Name;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.UnexpectedNodeException;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class PrecedingAxisIterator extends AxisIterator {
+ public PrecedingAxisIterator(RuntimeStaticContext staticContext) {
+ super(staticContext);
+ }
+
+
+ @Override
+ protected void setNextResult() {
+ if (this.results == null) {
+ this.results = new ArrayList<>();
+ List
- currentContext = this.currentDynamicContextForLocalExecution.getVariableValues()
+ .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata());
+ if (currentContext.isEmpty()) {
+ throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata());
+ }
+ for (Item node : currentContext) {
+ this.results.addAll(getPrecedingNode(node.parent(), node));
+ }
+ }
+ storeNextResult();
+ }
+
+ /*
+ * Method adds the rest of the parent's descendants preceding the current node. Afterward, it visits the parent's
+ * parent and adds its descendants preceding the parent.
+ */
+ private List
- getPrecedingNode(Item parent, Item node) {
+ if (parent == null) {
+ return Collections.emptyList();
+ }
+ List
- precedingNodes = new ArrayList<>();
+ List
- parentChildren = parent.children();
+ int nodeIndex = parentChildren.size();
+ for (int i = 0; i < parentChildren.size(); ++i) {
+ if (parentChildren.get(i).equals(node)) {
+ nodeIndex = i;
+ break;
+ }
+ }
+ for (int i = 0; i < nodeIndex; ++i) {
+ precedingNodes.addAll(getDescendants(parentChildren.get(i)));
+ }
+ precedingNodes.addAll(getPrecedingNode(parent.parent(), parent));
+ return precedingNodes;
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java
new file mode 100644
index 0000000000..782e16d867
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/xml/axis/reverse/PrecedingSiblingAxisIterator.java
@@ -0,0 +1,52 @@
+package org.rumbledb.runtime.xml.axis.reverse;
+
+import org.rumbledb.api.Item;
+import org.rumbledb.context.Name;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.UnexpectedNodeException;
+import org.rumbledb.runtime.xml.axis.AxisIterator;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class PrecedingSiblingAxisIterator extends AxisIterator {
+ public PrecedingSiblingAxisIterator(RuntimeStaticContext staticContext) {
+ super(staticContext);
+ }
+
+ @Override
+ protected void setNextResult() {
+ if (this.results == null) {
+ this.results = new ArrayList<>();
+ List
- currentContext = this.currentDynamicContextForLocalExecution.getVariableValues()
+ .getLocalVariableValue(Name.CONTEXT_ITEM, getMetadata());
+ if (currentContext.isEmpty()) {
+ throw new UnexpectedNodeException("Expected at least a node type as context item", getMetadata());
+ }
+ for (Item node : currentContext) {
+ this.results.addAll(getPrecedingSibling(node));
+ }
+ }
+ storeNextResult();
+ }
+
+ private List
- getPrecedingSibling(Item node) {
+ if (node.parent().isNull()) {
+ return Collections.emptyList();
+ }
+ List
- result = new ArrayList<>();
+ List
- parentChildren = node.parent().children();
+ int siblingsEndIndex = 0;
+ for (int i = 0; i < parentChildren.size(); ++i) {
+ if (parentChildren.get(i).equals(node)) {
+ siblingsEndIndex = i;
+ break;
+ }
+ }
+ for (int i = 0; i < siblingsEndIndex; ++i) {
+ result.add(parentChildren.get(i));
+ }
+ return result;
+ }
+}
diff --git a/src/main/java/org/rumbledb/serialization/Serializer.java b/src/main/java/org/rumbledb/serialization/Serializer.java
index 55af51b68a..b504e1bea4 100644
--- a/src/main/java/org/rumbledb/serialization/Serializer.java
+++ b/src/main/java/org/rumbledb/serialization/Serializer.java
@@ -1,15 +1,14 @@
package org.rumbledb.serialization;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
import org.apache.commons.text.StringEscapeUtils;
import org.rumbledb.api.Item;
import org.rumbledb.exceptions.FunctionsNonSerializableException;
import org.rumbledb.exceptions.OurBadException;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
public class Serializer {
public enum Method {
@@ -164,6 +163,55 @@ public void serialize(Item item, StringBuffer sb, String indent, boolean isTopLe
}
sb.append("}");
}
+ if (item.isDocumentNode()) {
+ for (Item child : item.children()) {
+ sb.append("<");
+ sb.append(child.nodeName());
+ sb.append(">");
+ sb.append("\n");
+
+ for (Item descendant : child.children()) {
+ serialize(descendant, sb, indent + " ", isTopLevel);
+ }
+ sb.append("");
+ sb.append(child.nodeName());
+ sb.append(">");
+ }
+ }
+ if (item.isElementNode()) {
+ sb.append(indent);
+ sb.append("<");
+ sb.append(item.nodeName());
+ for (Item attribute : item.attributes()) {
+ serialize(attribute, sb, indent, isTopLevel);
+ }
+ sb.append(">");
+ sb.append("\n");
+
+ for (Item child : item.children()) {
+ serialize(child, sb, indent + " ", isTopLevel);
+ }
+ sb.append(indent);
+ sb.append("");
+ sb.append(item.nodeName());
+ sb.append(">");
+ sb.append("\n");
+ }
+
+ if (item.isAttributeNode()) {
+ sb.append(" ");
+ sb.append(item.nodeName());
+ sb.append("=");
+ sb.append("\"");
+ sb.append(item.stringValue());
+ sb.append("\"");
+ }
+
+ if (item.isTextNode()) {
+ sb.append(indent);
+ sb.append(item.stringValue());
+ sb.append("\n");
+ }
}
public void generateYAML(Item item, YAMLGenerator yamlGenerator) throws IOException {
diff --git a/src/test/java/iq/ReadXMLTests.java b/src/test/java/iq/ReadXMLTests.java
new file mode 100644
index 0000000000..6c3e9be3e0
--- /dev/null
+++ b/src/test/java/iq/ReadXMLTests.java
@@ -0,0 +1,283 @@
+package iq;
+
+import iq.base.AnnotationsTestsBase;
+import org.junit.Before;
+import org.junit.Test;
+import org.rumbledb.api.Item;
+import org.rumbledb.api.Rumble;
+import org.rumbledb.api.SequenceOfItems;
+import org.rumbledb.compiler.VisitorHelpers;
+import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.expressions.module.MainModule;
+import org.rumbledb.expressions.scripting.Program;
+import org.rumbledb.expressions.xml.PathExpr;
+import org.rumbledb.items.xml.DocumentItem;
+import org.rumbledb.runtime.functions.input.FileSystemUtil;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class ReadXMLTests extends AnnotationsTestsBase {
+ private Rumble rumble;
+
+ @Before
+ public void initializeRumble() {
+ this.rumble = new Rumble(getConfiguration());
+ }
+
+ private URI resolveUri(String path) {
+ return FileSystemUtil.resolveURIAgainstWorkingDirectory(
+ path,
+ getConfiguration(),
+ ExceptionMetadata.EMPTY_METADATA
+ );
+ }
+
+ private MainModule parseAndCompile(String filePath) throws IOException {
+ URI uri = FileSystemUtil.resolveURIAgainstWorkingDirectory(
+ filePath,
+ getConfiguration(),
+ ExceptionMetadata.EMPTY_METADATA
+ );
+ return VisitorHelpers.parseMainModuleFromLocation(
+ uri,
+ getConfiguration()
+ );
+ }
+
+ private PathExpr getPathExprFromMainModule(String filePath) throws IOException {
+ MainModule mainModule = parseAndCompile(filePath);
+ Program program = (Program) mainModule.getDescendantsMatching(stmt -> stmt instanceof Program).get(0);
+ return (PathExpr) program.getStatementsAndOptionalExpr().getExpression();
+ }
+
+ @Test(timeout = 100000)
+ public void testBlockStatementWithSequentialStatement() throws Throwable {
+ String filePath = System.getProperty("user.dir")
+ +
+ "/src/test/resources/test_files/xml/read-xml/FunctionXmlDoc1.jq";
+ URI uri = resolveUri(filePath);
+ SequenceOfItems sequence = this.rumble.runQuery(uri);
+ sequence.open();
+ Item documentNode = sequence.next();
+ List
- children = documentNode.children().get(0).children();
+ Item elementNode1 = children.get(0);
+ Item elementNode2 = children.get(1);
+ Item elementNode3 = children.get(2);
+ Item elementNode4 = children.get(3);
+ String content1 = elementNode1.stringValue().trim().replaceAll("(?<=\\n)\\s+", "");
+ String content2 = elementNode2.stringValue().trim().replaceAll("(?<=\\n)\\s+", "");;
+ String content3 = elementNode3.stringValue().trim().replaceAll("(?<=\\n)\\s+", "");;
+ String content4 = elementNode4.stringValue().trim().replaceAll("(?<=\\n)\\s+", "");;
+ Item attribute1 = elementNode1.attributes().get(0);
+ Item attribute2 = elementNode2.attributes().get(0);
+ Item attribute3 = elementNode3.attributes().get(0);
+ Item attribute4 = elementNode4.attributes().get(0);
+ assertFalse(sequence.hasNext());
+ assertTrue(documentNode instanceof DocumentItem);
+ assertEquals(4, children.size());
+ assertEquals(4, elementNode1.children().size());
+ assertEquals(4, elementNode2.children().size());
+ assertEquals(8, elementNode3.children().size());
+ assertEquals(4, elementNode4.children().size());
+ assertEquals("Everyday Italian\nGiada De Laurentiis\n2005\n30.00", content1);
+ assertEquals("Harry Potter\nJ K. Rowling\n2005\n29.99", content2);
+ assertEquals(
+ "XQuery Kick Start\nJames McGovern\nPer Bothner\nKurt Cagle\nJames Linn\nVaidyanathan Nagarajan\n2003\n49.99",
+ content3
+ );
+ assertEquals("Learning XML\nErik T. Ray\n2003\n39.95", content4);
+ assertEquals("category", attribute1.nodeName());
+ assertEquals("category", attribute2.nodeName());
+ assertEquals("category", attribute3.nodeName());
+ assertEquals("category", attribute4.nodeName());
+ assertEquals("cooking", attribute1.stringValue());
+ assertEquals("children", attribute2.stringValue());
+ assertEquals("web", attribute3.stringValue());
+ assertEquals("web", attribute4.stringValue());
+ }
+
+ @Test(timeout = 100000)
+ public void testPathConstructionWithStartingDash() throws Throwable {
+ String filePath = System.getProperty("user.dir")
+ +
+ "/src/test/resources/test_files/xml/compile-xpath/XPathExample1.jq";
+ PathExpr pathExpr = getPathExprFromMainModule(filePath);
+ StringBuffer sb = new StringBuffer();
+ pathExpr.serializeToJSONiq(sb, 0);
+ assertEquals("/child::div1/child::div2\n", sb.toString());
+ }
+
+ @Test(timeout = 100000)
+ public void testPathConstructionWithoutStartingDash() throws Throwable {
+ String filePath = System.getProperty("user.dir")
+ +
+ "/src/test/resources/test_files/xml/compile-xpath/XPathExample2.jq";
+ PathExpr pathExpr = getPathExprFromMainModule(filePath);
+ StringBuffer sb = new StringBuffer();
+ pathExpr.serializeToJSONiq(sb, 0);
+ assertEquals("parent::author/child::title\n", sb.toString());
+ }
+
+ @Test(timeout = 100000)
+ public void testPathConstructionWithPredicates() throws Throwable {
+ String filePath = System.getProperty("user.dir")
+ +
+ "/src/test/resources/test_files/xml/compile-xpath/XPathExample3.jq";
+ PathExpr pathExpr = getPathExprFromMainModule(filePath);
+ StringBuffer sb = new StringBuffer();
+ pathExpr.serializeToJSONiq(sb, 0);
+ String res = sb.toString().trim().replaceAll("\n", "");
+ res = res.replaceAll(" ", "");
+ res = res.replaceAll("[,#]", "");
+ assertEquals("/child::book/child::chapter[(fn:position0())=(5)]/child::section[(fn:position0())=(2)]", res);
+ }
+
+ @Test(timeout = 100000)
+ public void testPathConstructionWithDoubleSlashStart() throws Throwable {
+ String filePath = System.getProperty("user.dir")
+ +
+ "/src/test/resources/test_files/xml/compile-xpath/XPathExample4.jq";
+ PathExpr pathExpr = getPathExprFromMainModule(filePath);
+ StringBuffer sb = new StringBuffer();
+ pathExpr.serializeToJSONiq(sb, 0);
+ String res = sb.toString().trim().replaceAll("\n", "");
+ res = res.replaceAll(" ", "");
+ res = res.replaceAll("[,#]", "");
+ assertEquals("/descendant-or-self::node()/child::book/child::chapter[5]/child::section[2]", res);
+ }
+
+ @Test(timeout = 100000)
+ public void testPathConstructionWithOrOperation() throws Throwable {
+ String filePath = System.getProperty("user.dir")
+ +
+ "/src/test/resources/test_files/xml/compile-xpath/XPathExample5.jq";
+ PathExpr pathExpr = getPathExprFromMainModule(filePath);
+ StringBuffer sb = new StringBuffer();
+ pathExpr.serializeToJSONiq(sb, 0);
+ String res = sb.toString().trim().replaceAll("\n", "");
+ res = res.replaceAll(" ", "");
+ res = res.replaceAll("[,#]", "");
+ assertEquals("child::book/(child::chapter)or(child::appendix)/descendant-or-self::node()/child::section", res);
+ }
+
+ @Test(timeout = 100000)
+ public void testPathConstructionWithDoubleSlashes() throws Throwable {
+ String filePath = System.getProperty("user.dir")
+ +
+ "/src/test/resources/test_files/xml/compile-xpath/XPathExample6.jq";
+ PathExpr pathExpr = getPathExprFromMainModule(filePath);
+ StringBuffer sb = new StringBuffer();
+ pathExpr.serializeToJSONiq(sb, 0);
+ String res = sb.toString().trim().replaceAll("\n", "");
+ res = res.replaceAll(" ", "");
+ res = res.replaceAll("[,#]", "");
+ assertEquals(
+ "child::chapter/descendant-or-self::node()/child::para/descendant-or-self::node()/attribute::version",
+ res
+ );
+ }
+
+ @Test(timeout = 100000)
+ public void testPathConstructionWithWildcard() throws Throwable {
+ String filePath = System.getProperty("user.dir")
+ +
+ "/src/test/resources/test_files/xml/compile-xpath/XPathExample7.jq";
+ PathExpr pathExpr = getPathExprFromMainModule(filePath);
+ StringBuffer sb = new StringBuffer();
+ pathExpr.serializeToJSONiq(sb, 0);
+ String res = sb.toString().trim().replaceAll("\n", "");
+ res = res.replaceAll(" ", "");
+ res = res.replaceAll("[,#]", "");
+ assertEquals("attribute::*", res);
+ }
+
+ @Test(timeout = 100000)
+ public void testPathConstructionWithWildcardReverseAxis() throws Throwable {
+ String filePath = System.getProperty("user.dir")
+ +
+ "/src/test/resources/test_files/xml/compile-xpath/XPathExample8.jq";
+ PathExpr pathExpr = getPathExprFromMainModule(filePath);
+ StringBuffer sb = new StringBuffer();
+ pathExpr.serializeToJSONiq(sb, 0);
+ String res = sb.toString().trim().replaceAll("\n", "");
+ res = res.replaceAll(" ", "");
+ res = res.replaceAll("[,#]", "");
+ assertEquals("parent::*", res);
+ }
+
+ @Test(timeout = 100000)
+ public void testPathConstructionWithWildcardMultiPath() throws Throwable {
+ String filePath = System.getProperty("user.dir")
+ +
+ "/src/test/resources/test_files/xml/compile-xpath/XPathExample9.jq";
+ PathExpr pathExpr = getPathExprFromMainModule(filePath);
+ StringBuffer sb = new StringBuffer();
+ pathExpr.serializeToJSONiq(sb, 0);
+ String res = sb.toString().trim().replaceAll("\n", "");
+ res = res.replaceAll(" ", "");
+ res = res.replaceAll("[,#]", "");
+ assertEquals("child::*/child::para", res);
+ }
+
+ @Test(timeout = 100000)
+ public void testPathConstructionWithAttributeTest() throws Throwable {
+ String filePath = System.getProperty("user.dir")
+ +
+ "/src/test/resources/test_files/xml/compile-xpath/XPathExample10.jq";
+ PathExpr pathExpr = getPathExprFromMainModule(filePath);
+ StringBuffer sb = new StringBuffer();
+ pathExpr.serializeToJSONiq(sb, 0);
+ String res = sb.toString().trim().replaceAll("\n", "");
+ res = res.replaceAll(" ", "");
+ res = res.replaceAll("[,#]", "");
+ assertEquals("attribute::attribute(price)", res);
+ }
+
+ @Test(timeout = 100000)
+ public void testPathConstructionWithReverseAxis() throws Throwable {
+ String filePath = System.getProperty("user.dir")
+ +
+ "/src/test/resources/test_files/xml/compile-xpath/XPathExample11.jq";
+ PathExpr pathExpr = getPathExprFromMainModule(filePath);
+ StringBuffer sb = new StringBuffer();
+ pathExpr.serializeToJSONiq(sb, 0);
+ String res = sb.toString().trim().replaceAll("\n", "");
+ res = res.replaceAll(" ", "");
+ res = res.replaceAll("[,#]", "");
+ assertEquals("parent::node()", res);
+ }
+
+ @Test(timeout = 100000)
+ public void testPathConstructionWithReverseAxisAbbreviated() throws Throwable {
+ String filePath = System.getProperty("user.dir")
+ +
+ "/src/test/resources/test_files/xml/compile-xpath/XPathExample12.jq";
+ PathExpr pathExpr = getPathExprFromMainModule(filePath);
+ StringBuffer sb = new StringBuffer();
+ pathExpr.serializeToJSONiq(sb, 0);
+ String res = sb.toString().trim().replaceAll("\n", "");
+ res = res.replaceAll(" ", "");
+ res = res.replaceAll("[,#]", "");
+ assertEquals("parent::node()/parent::element(*)", res);
+ }
+
+ @Test(timeout = 100000)
+ public void testPathConstructionWithReverseAxisMultiPath() throws Throwable {
+ String filePath = System.getProperty("user.dir")
+ +
+ "/src/test/resources/test_files/xml/compile-xpath/XPathExample13.jq";
+ PathExpr pathExpr = getPathExprFromMainModule(filePath);
+ StringBuffer sb = new StringBuffer();
+ pathExpr.serializeToJSONiq(sb, 0);
+ String res = sb.toString().trim().replaceAll("\n", "");
+ res = res.replaceAll(" ", "");
+ res = res.replaceAll("[,#]", "");
+ assertEquals("ancestor-or-self::di/ancestor::p/parent::text()", res);
+ }
+}
diff --git a/src/test/resources/queries/sample-na-data-2.json b/src/test/resources/queries/sample-na-data-2.json
new file mode 100644
index 0000000000..91f36b945f
--- /dev/null
+++ b/src/test/resources/queries/sample-na-data-2.json
@@ -0,0 +1,6 @@
+{"label": 0, "binaryLabel": 0, "name": "a", "age": 20, "weight": 50.0, "booleanCol": false, "stringCol": "i am data entry 1", "stringArrayCol": ["i", "am", "data", "entry", "1"], "intArrayCol": [1,2,3], "doubleArrayCol": [1.0,2.0,3.0], "doubleArrayArrayCol": [[1.0,2.0,3.0]]}
+{"label": 1, "binaryLabel": 0, "name": "b", "age": 21, "weight": 55.3, "booleanCol": false, "stringCol": "i am data entry 2", "stringArrayCol": ["i", "am", "data", "entry", "2"], "intArrayCol": [4,5,6], "doubleArrayCol": [4.0,5.0,6.0], "doubleArrayArrayCol": [[4.0,5.0,6.0]]}
+{"label": 2, "binaryLabel": 0, "name": "c", "age": 22, "stringCol": "i am data entry 3", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [7,8,9], "doubleArrayCol": [7.0,8.0,9.0], "doubleArrayArrayCol": [[7.0,8.0,9.0]]}
+{"label": 3, "binaryLabel": 1, "name": "d", "age": 23, "stringCol": "i am data entry 4", "stringArrayCol": ["i", "am", "data", "entry", "4"], "intArrayCol": [1,4,7], "doubleArrayCol": [1.0,4.0,7.0], "doubleArrayArrayCol": [[1.0,4.0,7.0]]}
+{"label": 4, "binaryLabel": 1, "name": "e", "age": 24, "weight": 70.3, "booleanCol": true, "stringCol": "i am data entry 5", "stringArrayCol": ["i", "am", "data", "entry", "5"], "intArrayCol": [2,5,8], "doubleArrayCol": [2.0,5.0,8.0], "doubleArrayArrayCol": [[2.0,5.0,8.0]]}
+{"label": 5, "binaryLabel": 1, "name": "f", "age": 25, "weight": 75.6, "booleanCol": true, "stringCol": "i am data entry 6", "stringArrayCol": ["i", "am", "data", "entry", "6"], "intArrayCol": [3,6,9], "doubleArrayCol": [3.0,6.0,9.0], "doubleArrayArrayCol": [[3.0,6.0,9.0]]}
diff --git a/src/test/resources/queries/sample-na-data-3.json b/src/test/resources/queries/sample-na-data-3.json
new file mode 100644
index 0000000000..312fb3d007
--- /dev/null
+++ b/src/test/resources/queries/sample-na-data-3.json
@@ -0,0 +1,3 @@
+{ "name": [null, null], "type": "null", "other2": 1}
+{ "name": [null], "other": ["null"], "other2": 2, "anotherArray": [[2, 1, 2]]}
+{ "name": [null], "type": null, "anotherArray": [[23]]}
\ No newline at end of file
diff --git a/src/test/resources/queries/sample-na-data-4.json b/src/test/resources/queries/sample-na-data-4.json
new file mode 100644
index 0000000000..679a082faa
--- /dev/null
+++ b/src/test/resources/queries/sample-na-data-4.json
@@ -0,0 +1,6 @@
+{"label": 0, "binaryLabel": 0, "name": "a", "age": 20, "weight": 50.0, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 1", "stringArrayCol": ["i", "am", "data", "entry", "1"], "intArrayCol": [1,2,3], "doubleArrayCol": [1.0,2.0,3.0], "doubleArrayArrayCol": [[1.0,2.0,3.0]]}
+{"label": 1, "binaryLabel": 0, "name": "b", "age": 21, "weight": 55.3, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 2", "stringArrayCol": ["i", "am", "data", "entry", "2"], "intArrayCol": [4,5,6], "doubleArrayCol": [4.0,5.0,6.0], "doubleArrayArrayCol": [[4.0,5.0,6.0]]}
+{"label": 2, "binaryLabel": 0, "name": "c", "age": 22, "weight": 60.6, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 3", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [7,8,9], "doubleArrayCol": [7.0,8.0,9.0], "doubleArrayArrayCol": [[7.0,8.0,9.0]]}
+{"label": 3, "binaryLabel": 1, "name": "d", "age": 23, "weight": 65.9, "nullCol": null, "stringCol": "i am data entry 4", "stringArrayCol": ["i", "am", "data", "entry", "4"], "intArrayCol": [1,4,7], "doubleArrayCol": [1.0,4.0,7.0], "doubleArrayArrayCol": [[1.0,2.0,3.0]]}
+{"label": 4, "binaryLabel": 1, "name": "e", "age": 24, "weight": 70.3, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 5", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [2,5,8], "doubleArrayCol": [2.0,5.0,8.0], "doubleArrayArrayCol": [[2.0,5.0,8.0]]}
+{"label": 5, "binaryLabel": 1, "name": "f", "age": 25, "weight": 75.6, "nullCol": null, "stringCol": "i am data entry 6", "stringArrayCol": ["i", "am", "data", "entry", "6"], "intArrayCol": [3,6,9], "doubleArrayCol": [3.0,6.0,9.0], "doubleArrayArrayCol": [[3.0,6.0,9.0]]}
diff --git a/src/test/resources/queries/sample-na-data-without-arrays.json b/src/test/resources/queries/sample-na-data-without-arrays.json
new file mode 100644
index 0000000000..8748e405a9
--- /dev/null
+++ b/src/test/resources/queries/sample-na-data-without-arrays.json
@@ -0,0 +1,6 @@
+{"label": 0, "binaryLabel": 0, "name": "a", "age": 20, "weight": 50.0, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 1"}
+{"label": 1, "binaryLabel": 0, "name": "b", "age": 21, "weight": 55.3, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 2" }
+{"label": 2, "binaryLabel": 0, "name": "c", "age": 22, "weight": 60.6, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 3"}
+{"label": 3, "binaryLabel": 1, "name": "d", "age": 23, "weight": 65.9, "booleanCol": null, "nullCol": null, "stringCol": "i am data entry 4"}
+{"label": 4, "binaryLabel": 1, "name": "e", "age": 24, "weight": 70.3, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 5"}
+{"label": 5, "binaryLabel": 1, "name": "f", "age": 25, "weight": 75.6, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 6"}
diff --git a/src/test/resources/queries/sample-na-data.json b/src/test/resources/queries/sample-na-data.json
new file mode 100644
index 0000000000..99eca2db99
--- /dev/null
+++ b/src/test/resources/queries/sample-na-data.json
@@ -0,0 +1,6 @@
+{"label": 0, "binaryLabel": 0, "name": "a", "age": 20, "weight": 50.0, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 1", "stringArrayCol": ["i", "am", "data", "entry", "1"], "intArrayCol": [1,2,3], "doubleArrayCol": [1.0,2.0,3.0], "doubleArrayArrayCol": [[1.0,2.0,3.0]]}
+{"label": 1, "binaryLabel": 0, "name": "b", "age": 21, "weight": 55.3, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 2", "stringArrayCol": ["i", "am", "data", "entry", "2"], "intArrayCol": [4,5,6], "doubleArrayCol": [4.0,5.0,6.0], "doubleArrayArrayCol": [[4.0,5.0,6.0]]}
+{"label": 2, "binaryLabel": 0, "name": "c", "age": 22, "weight": 60.6, "booleanCol": false, "nullCol": null, "stringCol": "i am data entry 3", "stringArrayCol": ["i", "am", "data", "entry", "3"], "intArrayCol": [7,8,9], "doubleArrayCol": [7.0,8.0,9.0], "doubleArrayArrayCol": [[7.0,8.0,9.0]]}
+{"label": 3, "binaryLabel": 1, "name": "d", "age": 23, "weight": 65.9, "booleanCol": null, "nullCol": null, "stringCol": "i am data entry 4", "stringArrayCol": ["i", "am", "data", "entry", "4"], "intArrayCol": [1,4,7], "doubleArrayCol": [1.0,4.0,7.0], "doubleArrayArrayCol": [[1.0,4.0,7.0]]}
+{"label": 4, "binaryLabel": 1, "name": "e", "age": 24, "weight": 70.3, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 5", "stringArrayCol": ["i", "am", "data", "entry", "5"], "intArrayCol": [2,5,8], "doubleArrayCol": [2.0,5.0,8.0], "doubleArrayArrayCol": [[2.0,5.0,8.0]]}
+{"label": 5, "binaryLabel": 1, "name": "f", "age": 25, "weight": 75.6, "booleanCol": true, "nullCol": null, "stringCol": "i am data entry 6", "stringArrayCol": ["i", "am", "data", "entry", "6"], "intArrayCol": [3,6,9], "doubleArrayCol": [3.0,6.0,9.0], "doubleArrayArrayCol": [[3.0,6.0,9.0]]}
diff --git a/src/test/resources/queries/xml/books.xml b/src/test/resources/queries/xml/books.xml
new file mode 100644
index 0000000000..c2c39f9e15
--- /dev/null
+++ b/src/test/resources/queries/xml/books.xml
@@ -0,0 +1,36 @@
+
+
+
+
+ Everyday Italian
+ Giada De Laurentiis
+ 2005
+ 30.00
+
+
+
+ Harry Potter
+ J K. Rowling
+ 2005
+ 29.99
+
+
+
+ XQuery Kick Start
+ James McGovern
+ Per Bothner
+ Kurt Cagle
+ James Linn
+ Vaidyanathan Nagarajan
+ 2003
+ 49.99
+
+
+
+ Learning XML
+ Erik T. Ray
+ 2003
+ 39.95
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/FunctionGetRoot/GetRoot2.jq b/src/test/resources/test_files/runtime/FunctionGetRoot/GetRoot2.jq
new file mode 100644
index 0000000000..fc4ac79ba6
--- /dev/null
+++ b/src/test/resources/test_files/runtime/FunctionGetRoot/GetRoot2.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="\n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n" :)
+fn:root(xml-doc("../../../queries/xml/books.xml"))
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/FunctionRandom/RandomSequenceWithSeed.jq b/src/test/resources/test_files/runtime/FunctionRandom/RandomSequenceWithSeed.jq
new file mode 100644
index 0000000000..edca3bce96
--- /dev/null
+++ b/src/test/resources/test_files/runtime/FunctionRandom/RandomSequenceWithSeed.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="(0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316, 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316, 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316, 0.7304302967434272, 0.2578027905957804, 0.059201965811244595, 0.24411725056425315, 0.8188090228552316)":)
+fn:seeded_random(10, 5),fn:seeded_random(10, 5),fn:seeded_random(10, 5),fn:seeded_random(10, 5)
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/XPath/GetAncestors1.jq b/src/test/resources/test_files/runtime/XPath/GetAncestors1.jq
new file mode 100644
index 0000000000..abaf78ed2c
--- /dev/null
+++ b/src/test/resources/test_files/runtime/XPath/GetAncestors1.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="(\n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n, \n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n\n, \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n\n, \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n\n, \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n\n, \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n\n)":)
+xml-doc("../../../queries/xml/books.xml")/child::bookstore/child::book/child::title/ancestor::node()
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/XPath/GetDescendants1.jq b/src/test/resources/test_files/runtime/XPath/GetDescendants1.jq
new file mode 100644
index 0000000000..51193807e7
--- /dev/null
+++ b/src/test/resources/test_files/runtime/XPath/GetDescendants1.jq
@@ -0,0 +1,4 @@
+(:JIQS: ShouldRun; Output="(\n \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n \n \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n \n \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n \n \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n \n\n, \n \n Everyday Italian\n \n \n Giada De Laurentiis\n \n \n 2005\n \n \n 30.00\n \n\n, \n Everyday Italian\n\n, Everyday Italian\n, \n Giada De Laurentiis\n\n, Giada De Laurentiis\n, \n 2005\n\n, 2005\n, \n 30.00\n\n, 30.00\n, \n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n\n, \n Harry Potter\n\n, Harry Potter\n, \n J K. Rowling\n\n, J K. Rowling\n, \n 2005\n\n, 2005\n, \n 29.99\n\n, 29.99\n, \n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n\n, \n XQuery Kick Start\n\n, XQuery Kick Start\n, \n James McGovern\n\n, James McGovern\n, \n Per Bothner\n\n, Per Bothner\n, \n Kurt Cagle\n\n, Kurt Cagle\n, \n James Linn\n\n, James Linn\n, \n Vaidyanathan Nagarajan\n\n, Vaidyanathan Nagarajan\n, \n 2003\n\n, 2003\n, \n 49.99\n\n, 49.99\n, \n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n\n, \n Learning XML\n\n, Learning XML\n, \n Erik T. Ray\n\n, Erik T. Ray\n, \n 2003\n\n, 2003\n, \n 39.95\n\n, 39.95\n)":)
+xml-doc("../../../queries/xml/books.xml")/descendant::node()
+
+(: Takes descendants from the root :)
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/XPath/GetDescendants2.jq b/src/test/resources/test_files/runtime/XPath/GetDescendants2.jq
new file mode 100644
index 0000000000..5ab717a0cc
--- /dev/null
+++ b/src/test/resources/test_files/runtime/XPath/GetDescendants2.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="":)
+xml-doc("../../../queries/xml/books.xml")//descendant::attribute()
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq b/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq
new file mode 100644
index 0000000000..01e2cd5b32
--- /dev/null
+++ b/src/test/resources/test_files/runtime/XPath/GetDescendants3.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="(Giada De Laurentiis\n, 2005\n, 30.00\n, Harry Potter\n, J K. Rowling\n, 2005\n, 29.99\n, XQuery Kick Start\n, James McGovern\n, Per Bothner\n, Kurt Cagle\n, James Linn\n, Vaidyanathan Nagarajan\n, 2003\n, 49.99\n, Learning XML\n, Erik T. Ray\n, 2003\n, 39.95\n)":)
+xml-doc("../../../queries/xml/books.xml")/descendant::node()/following::text()
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/XPath/GetPreceding1.jq b/src/test/resources/test_files/runtime/XPath/GetPreceding1.jq
new file mode 100644
index 0000000000..e4ae464591
--- /dev/null
+++ b/src/test/resources/test_files/runtime/XPath/GetPreceding1.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="(Everyday Italian\n, Giada De Laurentiis\n, 2005\n, 30.00\n)":)
+xml-doc("../../../queries/xml/books.xml")/child::bookstore/child::book/child::title[2]/preceding::text()
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/XPath/SelectAnyNode.jq b/src/test/resources/test_files/runtime/XPath/SelectAnyNode.jq
new file mode 100644
index 0000000000..80ee3d4dcf
--- /dev/null
+++ b/src/test/resources/test_files/runtime/XPath/SelectAnyNode.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="(\n Everyday Italian\n\n, \n Giada De Laurentiis\n\n, \n 2005\n\n, \n 30.00\n\n, \n Harry Potter\n\n, \n J K. Rowling\n\n, \n 2005\n\n, \n 29.99\n\n, \n XQuery Kick Start\n\n, \n James McGovern\n\n, \n Per Bothner\n\n, \n Kurt Cagle\n\n, \n James Linn\n\n, \n Vaidyanathan Nagarajan\n\n, \n 2003\n\n, \n 49.99\n\n, \n Learning XML\n\n, \n Erik T. Ray\n\n, \n 2003\n\n, \n 39.95\n\n)":)
+xml-doc("../../../queries/xml/books.xml")//child::book//child::*
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/XPath/SelectChildWithAttribute.jq b/src/test/resources/test_files/runtime/XPath/SelectChildWithAttribute.jq
new file mode 100644
index 0000000000..a2695a4b25
--- /dev/null
+++ b/src/test/resources/test_files/runtime/XPath/SelectChildWithAttribute.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="\n \n Harry Potter\n \n \n J K. Rowling\n \n \n 2005\n \n \n 29.99\n \n\n":)
+xml-doc("../../../queries/xml/books.xml")//child::book[@category eq "children"]
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/XPath/SelectChildWithTitle.jq b/src/test/resources/test_files/runtime/XPath/SelectChildWithTitle.jq
new file mode 100644
index 0000000000..2941c7d7f2
--- /dev/null
+++ b/src/test/resources/test_files/runtime/XPath/SelectChildWithTitle.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="\n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n\n":)
+xml-doc("../../../queries/xml/books.xml")//child::book[child::title eq "XQuery Kick Start"]
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/XPath/SelectElementAttribute1.jq b/src/test/resources/test_files/runtime/XPath/SelectElementAttribute1.jq
new file mode 100644
index 0000000000..8e5f38fe75
--- /dev/null
+++ b/src/test/resources/test_files/runtime/XPath/SelectElementAttribute1.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="( lang="en", lang="en", lang="en", lang="en")":)
+xml-doc("../../../queries/xml/books.xml")/child::bookstore/child::book/child::title/@lang
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/XPath/SelectLastBookChild.jq b/src/test/resources/test_files/runtime/XPath/SelectLastBookChild.jq
new file mode 100644
index 0000000000..35c3559d31
--- /dev/null
+++ b/src/test/resources/test_files/runtime/XPath/SelectLastBookChild.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="\n \n Learning XML\n \n \n Erik T. Ray\n \n \n 2003\n \n \n 39.95\n \n\n":)
+xml-doc("../../../queries/xml/books.xml")/child::*/child::book[position() eq last()]
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/XPath/SelectParentInPath.jq b/src/test/resources/test_files/runtime/XPath/SelectParentInPath.jq
new file mode 100644
index 0000000000..850b9eb003
--- /dev/null
+++ b/src/test/resources/test_files/runtime/XPath/SelectParentInPath.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="( category="cooking", category="children", category="web", category="web")":)
+xml-doc("../../../queries/xml/books.xml")//child::book/child::title/../@category
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/XPath/SelectSecondChild.jq b/src/test/resources/test_files/runtime/XPath/SelectSecondChild.jq
new file mode 100644
index 0000000000..2cee972ae3
--- /dev/null
+++ b/src/test/resources/test_files/runtime/XPath/SelectSecondChild.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="\n \n XQuery Kick Start\n \n \n James McGovern\n \n \n Per Bothner\n \n \n Kurt Cagle\n \n \n James Linn\n \n \n Vaidyanathan Nagarajan\n \n \n 2003\n \n \n 49.99\n \n\n":)
+xml-doc("../../../queries/xml/books.xml")//child::book[fn:position() eq 3]
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/XPath/SelectTextElement1.jq b/src/test/resources/test_files/runtime/XPath/SelectTextElement1.jq
new file mode 100644
index 0000000000..00b406101a
--- /dev/null
+++ b/src/test/resources/test_files/runtime/XPath/SelectTextElement1.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="(\n Everyday Italian\n\n, \n Harry Potter\n\n, \n XQuery Kick Start\n\n, \n Learning XML\n\n)":)
+xml-doc("../../../queries/xml/books.xml")/child::bookstore/child::book/child::title
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/XPath/SelectTitleWithPredicates.jq b/src/test/resources/test_files/runtime/XPath/SelectTitleWithPredicates.jq
new file mode 100644
index 0000000000..7504851c03
--- /dev/null
+++ b/src/test/resources/test_files/runtime/XPath/SelectTitleWithPredicates.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="(\n XQuery Kick Start\n\n, \n Learning XML\n\n)":)
+xml-doc("../../../queries/xml/books.xml")//child::book[@category eq "web"]/child::title[@lang eq "en"]
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/functx.jq b/src/test/resources/test_files/runtime/numpy_lib/functx.jq
new file mode 100644
index 0000000000..f9c55569ba
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/functx.jq
@@ -0,0 +1,11 @@
+(:JIQS: ShouldNotParse; ErrorCode="XPST0003"; ErrorMetadata="LINE:1:COLUMN:0:" :)
+module namespace functx = "functx.jq";
+
+declare function functx:distinct-deep($items as item*) as item* {
+ for $seq in 1 to count($items)
+ return $items[$seq][not(functx:is-node-in-sequence-deep-equal($$, $items[position() lt $seq]))]
+};
+
+declare function functx:is-node-in-sequence-deep-equal($item as item?, $seq as item*) as xs:boolean {
+ some $itemInSeq in $seq satisfies deep-equal($itemInSeq, $item)
+};
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq
new file mode 100644
index 0000000000..6e59aa5b29
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_numpy.jq
@@ -0,0 +1,1135 @@
+(:JIQS: ShouldNotParse; ErrorCode="XPST0003"; ErrorMetadata="LINE:1:COLUMN:0:" :)
+module namespace jsoniq_numpy = "jsoniq_numpy.jq";
+import module namespace utils = "jsoniq_utils.jq";
+
+declare function jsoniq_numpy:zeros($shape as array, $zero, $current_dimensionension as integer) {
+ if ($current_dimensionension eq size($shape)) then
+ let $accumulated_result :=
+ for $j in 1 to $shape[[$current_dimensionension]]
+ return $zero
+ return [$accumulated_result]
+ else
+ let $accumulated_result :=
+ let $higher_dimension_result := jsoniq_numpy:zeros($shape, $zero, $current_dimensionension + 1)
+ for $j in 1 to $shape[[$current_dimensionension]]
+ return $higher_dimension_result
+ return [$accumulated_result]
+};
+
+declare type jsoniq_numpy:zeros_params as {
+ "type": "string=integer"
+};
+(: Zeros method creates an array filled with 0 values.
+Required parameters are:
+- shape (array): contains the size of each dimension of the resulting array. For one dimensional arrays, a single value within is array is expected - e.g., [7] results in a 1 dimensional array with 7 zeroed elements.
+Params is an object for optional arguments. These arguments are:
+- type (string): the enforced type of the resulting array.
+To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value:)
+declare function jsoniq_numpy:zeros($shape as array, $params as object) {
+ let $params := validate type jsoniq_numpy:zeros_params {$params}
+ return {
+ if (size($shape) eq 1) then
+ let $zero := utils:cast-as(0, $params.type)
+ let $accumulated_result := for $j in 1 to $shape[[1]]
+ return $zero
+ return [$accumulated_result]
+ else
+ let $current_dimensionension := 1
+ let $zero := utils:cast-as(0, $params.type)
+ let $accumulated_result :=
+ let $higher_dimension_result := jsoniq_numpy:zeros($shape, $zero, $current_dimensionension + 1)
+ for $j in 1 to $shape[[$current_dimensionension]]
+ return $higher_dimension_result
+ return [$accumulated_result]
+ }
+};
+
+declare function jsoniq_numpy:zeros($shape as array) {
+ jsoniq_numpy:zeros($shape, {})
+};
+
+declare function jsoniq_numpy:ones($shape as array, $one, $current_dimensionension as integer) {
+ if ($current_dimensionension eq size($shape)) then
+ let $accumulated_result :=
+ for $j in 1 to $shape[[$current_dimensionension]]
+ return $one
+ return [$accumulated_result]
+ else
+ let $accumulated_result :=
+ let $higher_dimension_result := jsoniq_numpy:ones($shape, $one, $current_dimensionension + 1)
+ for $j in 1 to $shape[[$current_dimensionension]]
+ return $higher_dimension_result
+ return [$accumulated_result]
+
+};
+declare type jsoniq_numpy:ones_params as {
+ "type": "string=integer"
+};
+(:
+Required parameters are:
+- shape (array): contains the size of each dimension of the resulting array. For one dimensional arrays, a single value within is array is expected - e.g., [7] results in a 1 dimensional array with 7 elements with value 1.
+Params is an object for optional arguments. These arguments are:
+- type (string): the enforced type of the resulting array.
+To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value
+:)
+declare function jsoniq_numpy:ones($shape as array, $params as object) {
+ let $params := validate type jsoniq_numpy:ones_params {$params}
+ return {
+ if (size($shape) eq 1) then
+ let $one := utils:cast-as(1, $params.type)
+ let $accumulated_result := for $j in 1 to $shape[[1]]
+ return $one
+ return [$accumulated_result]
+ else
+ let $current_dimensionension := 1
+ let $one := utils:cast-as(1, $params.type)
+ let $accumulated_result :=
+ let $higher_dimension_result := jsoniq_numpy:ones($shape, $one, $current_dimensionension + 1)
+ for $j in 1 to $shape[[$current_dimensionension]]
+ return $higher_dimension_result
+ return [$accumulated_result]
+ }
+};
+
+(: Ones method creates an integer array filled with 1 values. :)
+declare function jsoniq_numpy:ones($shape as array) {
+ jsoniq_numpy:ones($shape, {})
+};
+
+
+declare type jsoniq_numpy:linspace_params as {
+ "num": "integer=50",
+ "endpoint": "boolean=true",
+ "retstep": "boolean=false"
+};
+
+declare function jsoniq_numpy:compute_linspace($start as double, $end as double, $params as object, $step_unit as integer) {
+ let $range := $end - $start
+ let $step := $range div $step_unit
+ let $accumulated_result :=
+ for $i in 1 to $params.num
+ return
+ if ($i eq $params.num) then float($start + ($i - 1) * $step)
+ else $start + ($i - 1) * $step
+ return
+ if ($params.retstep eq true) then ([$accumulated_result], $step)
+ else [$accumulated_result]
+};
+
+(:
+Return evenly spaced numbers over a specified interval. Returns num evenly spaced samples, calculated over the interval [start, stop]. The endpoint of the interval can optionally be excluded.
+Note: we currently only support one-dimensional results.
+Required params are:
+- start (double) - the start value bounding the generated sequence
+- end (double) - the end value bounding the generated sequence
+Params is an object for optional arguments. These arguments are:
+- num (integer): number of samples to generate. Default is 50.
+- endpoint (bool): if true, stop is the last sample. Otherwise it is not included. Default is true.
+- retstep (bool): if true, returns the step used which denotes the spacing of values. Default is false.
+- dtype UNSUPPORTED: return is always double.
+- axis UNSUPPORTED.
+To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value:)
+declare function jsoniq_numpy:linspace($start as double, $end as double, $params as object) {
+ let $params := validate type jsoniq_numpy:linspace_params {$params}
+ return {
+ if ($params.num lt 0) then
+ error("InvalidFunctionCallErrorCode", "Function expects a num value to be greater than or equal to 0")
+ else
+ if ($params.endpoint eq true) then
+ jsoniq_numpy:compute_linspace($start, $end, $params, $params.num - 1)
+ else
+ jsoniq_numpy:compute_linspace($start, $end, $params, $params.num)
+ }
+};
+
+(:
+Return evenly spaced numbers over a specified interval. Returns num evenly spaced samples, calculated over the interval [start, stop]. The endpoint of the interval can optionally be excluded.
+Note: we currently only support one-dimensional results.
+The following returns num=50 elements if no params are specified.
+:)
+declare function jsoniq_numpy:linspace($start as double, $end as double) {
+ jsoniq_numpy:linspace($start, $end, {})
+};
+
+declare type jsoniq_numpy:arange_params as {
+ "start": "double=0",
+ "step": "double=1",
+ "type": "string=integer"
+};
+
+declare function jsoniq_numpy:arange_negative_range($stop as double, $params as object) {
+ if ($stop gt $params.start) then []
+ else
+ if ($params.start + $params.step lt $stop) then [$params.start]
+ else
+ let $range := $params.start - $stop
+ let $num_values := integer(ceiling($range div abs($params.step)))
+ let $accumulated_values_in_range := for $i in 1 to $num_values
+ return $params.start + ($i - 1) * $params.step
+ return [$accumulated_values_in_range]
+};
+
+declare function jsoniq_numpy:arange_positive_range($stop as double, $params as object) {
+ if ($params.start gt $stop) then []
+ else
+ if ($params.start + $params.step gt $stop or $params.step eq 0) then [$params.start]
+ else
+ let $range := $stop - $params.start
+ let $num_values := integer(ceiling($range div $params.step))
+ let $accumulated_values_in_range := for $i in 1 to $num_values
+ return $params.start + ($i - 1) * $params.step
+ return [$accumulated_values_in_range]
+};
+(:
+arange can be called with a combination of parameters:
+- arange(stop): Values are generated within the half-open interval [0, stop) (in other words, the interval including start but excluding stop).
+- arange(start, stop): Values are generated within the half-open interval [start, stop).
+- arange(start, stop, step) Values are generated within the half-open interval [start, stop), with spacing between values given by step.
+Required params are:
+- stop (double): marks the end of the interval
+Params is an object for optional arguments. These arguments are:
+- start (double): the start of the interval. Default value is 0.
+- step (double): the spacing of output values. Default value is 1.
+- dtype (string): type of the returned array. Default is integer.
+To submit optional parameters to this method, a JSON object must be passed, where the argument is the key and its value the pertaining value
+:)
+declare function jsoniq_numpy:arange($stop as double, $params as object) {
+ let $params := validate type jsoniq_numpy:arange_params {$params}
+ return {
+ if ($params.step lt 0) then
+ jsoniq_numpy:arange_negative_range($stop, $params)
+ else
+ jsoniq_numpy:arange_positive_range($stop, $params)
+ }
+};
+
+(:
+arange can be called with a combination of parameters:
+- arange(stop): Values are generated within the half-open interval [0, stop) (in other words, the interval including start but excluding stop).
+For other parameters, use the params argument.
+:)
+declare function jsoniq_numpy:arange($stop as double) {
+ jsoniq_numpy:arange($stop, {})
+};
+
+(: Function generates a single random value of type double :)
+declare function jsoniq_numpy:random() {
+ fn:random()
+};
+
+(: Function generates a sequence of random values of type double.
+Required params are:
+- length (integer): the length of the resulting sequence :)
+declare function jsoniq_numpy:random($size as array) {
+ if (size($size) eq 0) then []
+ else jsoniq_numpy:random_with_dimensions($size, 1)
+};
+
+declare function jsoniq_numpy:random_with_dimensions($current_dimensions as array, $current_dimension as integer) {
+ if ($current_dimension eq size($current_dimensions)) then fn:random($current_dimensions[[$current_dimension]])
+ else
+ let $accumulated_result :=
+ let $higher_dimension_result := jsoniq_numpy:random_with_dimensions($current_dimensions, $current_dimension + 1)
+ for $i in 1 to $current_dimensions[[$current_dimension]]
+ return $higher_dimension_result
+ return [$accumulated_result]
+};
+
+declare function jsoniq_numpy:random_between_with_dimensions($low as double, $high as double, $type as string, $current_dimensions as array, $current_dimension as integer) {
+ if ($current_dimension eq size($current_dimensions)) then fn:random-between($low, $high, $current_dimensions[[$current_dimension]], $type)
+ else
+ let $accumulated_result :=
+ let $higher_dimension_result := jsoniq_numpy:random_between_with_dimensions($low, $high, $type, $current_dimensions, $current_dimension + 1)
+ for $i in 1 to $current_dimensions[[$current_dimension]]
+ return $higher_dimension_result
+ return [$accumulated_result]
+};
+
+declare type jsoniq_numpy:random_uniform_params as {
+ "low": "double=0",
+ "high": "double=1",
+ "size": "array"
+};
+(: Function generates a random sample from a uniform distribution between a lower and higher limit (not inclusive). Params is an object for optional arguments. These arguments are:
+ - low (double): the lower bound for generated objects. Default value is 0.0
+ - high (double): the upper bound for generated objects. Default value is 1.0
+ - size (array): the size of the resulting array. Each value in the array represents the size for the specific dimension. :)
+declare function jsoniq_numpy:random_uniform($params as object) {
+ let $params := validate type jsoniq_numpy:random_uniform_params {$params}
+ let $low := $params.low
+ let $high := $params.high
+ let $current_dimensions := $params.size
+ return if (size($current_dimensions) eq 0) then []
+ else jsoniq_numpy:random_between_with_dimensions($low, $high, "double", $current_dimensions, 1)
+};
+
+declare type jsoniq_numpy:random_randint_params as {
+ "high": "double=1",
+ "size": "array"
+};
+(: Function generates a random sample from a uniform distribution between a lower and higher limit (not inclusive), but with type int.
+Required params are:
+ - low (integer): the lower bound for generated objects if high is also present. Otherwise, it determines the upperbound. Without high, it makes the sequence be bounded by [0, low), otherwise it makes it bound by [low, high).
+Params is an object for optional arguments. These arguments are:
+ - high (integer): the upper bound for generated objects. Default value is 1
+ - size (array): the size of the resulting array. Each value in the array represents the size for the specific dimension :)
+declare function jsoniq_numpy:random_randint($low as integer, $params as object) {
+ let $params := validate type jsoniq_numpy:random_randint_params {$params}
+ let $high := $params.high
+ let $current_dimensions := $params.size
+ return if (size($current_dimensions) eq 0) then []
+ else jsoniq_numpy:random_between_with_dimensions($low, $high, "integer", $current_dimensions, 1)
+};
+
+declare function jsoniq_numpy:random_randint($low as integer) {
+ jsoniq_numpy:random_randint($low, {})
+};
+
+declare type jsoniq_numpy:logspace_params as {
+ "num": "integer=50",
+ "endpoint": "boolean=true"
+};
+
+declare function jsoniq_numpy:compute_logspace($start as double, $end as double, $params as object) {
+ let $base := 10
+ let $linspace_vals := jsoniq_numpy:linspace($start, $end, {"num": $params.num, "endpoint": $params.endpoint, "retstep": false})
+ let $res :=
+ for $i in 1 to $params.num
+ return float(pow($base, $linspace_vals[[$i]]))
+ return [$res]
+};
+(: Generate evenly spaced numbers on a log scale in base 10.
+Required parameters are:
+ - start (double): 10 ** start is the starting value of the sequence.
+ - end (double): 10 ** end is the end value of the sequence.
+Params is an object for optional arguments. These arguments are:
+ - num (integer): number of samples to generate. Default is 50.
+ - endpoint (bool): if true, stop is the last sample. Otherwise it is not included. Default is true.
+ - base UNSUPPORTED: base 10 is always used.
+ - dtype UNSUPPORTED: return is always double.
+ - axis UNSUPPORTED.:)
+declare function jsoniq_numpy:logspace($start as double, $end as double, $params as object) {
+ let $params := validate type jsoniq_numpy:logspace_params {$params}
+ return {
+ if ($params.num lt 0) then
+ error("InvalidFunctionCallErrorCode", "Function expects a num value to be greater than or equal to 0")
+ else
+ jsoniq_numpy:compute_logspace($start, $end, $params)
+ }
+};
+
+(:
+Generate evenly spaced numbers on a log scale in base 10.
+Required parameters are:
+ - start (double): 10 ** start is the starting value of the sequence.
+ - end (double): 10 ** end is the end value of the sequence.
+The result is a sequence of 50 elements where the endpoint is also included. For refined versions, use the params argument.
+:)
+declare function jsoniq_numpy:logspace($start as double, $end as double) {
+ jsoniq_numpy:logspace($start, $end, {})
+};
+
+declare function jsoniq_numpy:compute_full_on_sub_dimensions($current_dimensions as array, $fill_value, $current_dimension as integer) {
+ let $current_dimensionension := size($current_dimensions)
+ let $accumulated_result :=
+ for $j in 1 to $current_dimensions[[$current_dimension]]
+ return
+ if ($current_dimension eq $current_dimensionension) then $fill_value
+ else jsoniq_numpy:compute_full_on_sub_dimensions($current_dimensions, $fill_value, $current_dimension + 1)
+ return [$accumulated_result]
+};
+
+declare type jsoniq_numpy:full_params as {
+ "type": "string=integer"
+};
+(: The full method returns a new array of given shape and type, filled with fill_value.
+Required arguments:
+- shape (array): the dimension of the new array
+- fill_value (atomic): the fill value
+Optional arguments include:
+- type (string): the type of the resulting array values. The default value is integer.
+Unsupported arguments:
+- order: ordering is implicitly done row-wise (C format)
+:)
+declare function jsoniq_numpy:full($shape as array, $fill_value, $params as object) {
+ let $params := validate type jsoniq_numpy:full_params {$params}
+ return {
+ let $num_dimensions := size($shape)
+ let $current_dimension := 1
+ let $fill := utils:cast-as($fill_value, $params.type)
+ let $sub_dimension_result :=
+ for $j in 1 to $shape[[$current_dimension]]
+ return
+ if ($num_dimensions eq 1) then
+ $fill
+ else
+ jsoniq_numpy:compute_full_on_sub_dimensions($shape, $fill, $current_dimension + 1)
+ return [$sub_dimension_result]
+ }
+};
+
+(:
+The full method returns a new array of given shape and type, filled with fill_value.
+Required arguments:
+- shape (array): the dimension of the new array
+- fill_value (atomic): the fill value
+The method returns an integer array by default. To change this, use the params argument.
+:)
+declare function jsoniq_numpy:full($shape as array, $fill_value) {
+ jsoniq_numpy:full($shape, $fill_value, {})
+};
+
+declare type jsoniq_numpy:identity_params as {
+ "type": "string=integer"
+};
+(:
+Return the identity array. The identity array is a square array with ones on the main diagonal.
+Required arguments:
+- n (integer): the number of rows (and columns) in N x N output.
+Optional arguments include:
+- type (string): the type of the resulting array values
+:)
+declare function jsoniq_numpy:identity($n as integer, $params as object) {
+ if ($n le 1) then []
+ else
+ let $params := validate type jsoniq_numpy:identity_params {$params}
+ return {
+ let $fill_one := utils:cast-as(1, $params.type)
+ let $fill_zero := utils:cast-as(0, $params.type)
+ let $accumulated_matrix :=
+ for $row in 1 to $n
+ let $accumulated_row :=
+ for $column in 1 to $n
+ return if ($row eq $column) then $fill_one
+ else $fill_zero
+ return [$accumulated_row]
+ return [$accumulated_matrix]
+ }
+};
+
+declare function jsoniq_numpy:identity($n as integer) {
+ jsoniq_numpy:identity($n, {})
+};
+
+(: Binary search method. It performs binary search over the given arr parameter looking for the value of searched_element for it. The current behavior is to return the first matching position for a given searched_element even if more values of it are present.
+Required params are:
+- arr (array): the array to search for searched_element
+- searched_element (any): the value to look for in the array arr
+The returned value is an integer such that:
+- if searched_element is present, the index where it first occurs is returned.
+- if searched_element is not found:
+ - if searched_element is smaller than all values, index 0 is returned.
+ - if searched_element is greater than all values, index size(arr) + 1 is returned.:)
+declare %an:sequential function jsoniq_numpy:binsearch($arr as array, $searched_element) {
+ variable $low := 1;
+ variable $high := size($arr) + 1;
+ while ($low lt $high) {
+ variable $mid_index := integer($low + ($high - $low) div 2);
+ if ($arr[[$mid_index]] eq $searched_element) then exit returning $mid_index;
+ else
+ if ($searched_element le $arr[[$mid_index]]) then $high := $mid_index;
+ else $low := $mid_index + 1;
+ }
+ exit returning if ($low eq 1) then 0 else $low;
+};
+
+(: returns i s.t. arr[i - 1] <= x < arr[i] :)
+declare %an:sequential function jsoniq_numpy:searchsorted_left($arr as array, $searched_element) {
+ variable $low := 1;
+ variable $high := size($arr) + 1;
+ while ($low lt $high) {
+ variable $mid_index := integer($low + ($high - $low) div 2);
+ if ($searched_element ge $arr[[$mid_index]]) then $low := $mid_index + 1;
+ else $high := $mid_index;
+ }
+ exit returning if ($low eq 1) then 0 else $low;
+};
+
+(: returns i s.t. arr[i - 1] < x <= arr[i] :)
+declare %an:sequential function jsoniq_numpy:searchsorted_right($arr as array, $searched_element) {
+ variable $low := 1;
+ variable $high := size($arr) + 1;
+ while ($low lt $high) {
+ variable $mid_index := integer($low + ($high - $low) div 2);
+ if ($searched_element le $arr[[$mid_index]]) then $high := $mid_index;
+ else $low := $mid_index + 1;
+ }
+ exit returning if ($low eq 1) then 0 else $low;
+};
+
+
+declare function jsoniq_numpy:digitize_monotonically_increasing_left($x as array, $bins as array) {
+ let $bin_indexes := for $i in 1 to size($x)
+ return jsoniq_numpy:searchsorted_left($bins, $x[[$i]])
+ return [$bin_indexes]
+};
+
+declare function jsoniq_numpy:digitize_monotonically_increasing_right($x as array, $bins as array) {
+ let $bin_indexes :=
+ for $i in 1 to size($x)
+ return jsoniq_numpy:searchsorted_right($bins, $x[[$i]])
+ return [$bin_indexes]
+};
+
+declare function jsoniq_numpy:digitize_in_reverse($x as array, $bins as array, $right as boolean) {
+ let $bins_rev := [fn:reverse($bins[])]
+ let $bin_indexes :=
+ for $i in 1 to size($x)
+ let $searchsorted_res :=
+ if ($right eq false) then jsoniq_numpy:searchsorted_left($bins_rev, $x[[$i]])
+ else jsoniq_numpy:searchsorted_right($bins_rev, $x[[$i]])
+ let $bin_index := jsoniq_numpy:compute_index($searchsorted_res, size($bins))
+ return $bin_index
+ return [$bin_indexes]
+};
+declare type jsoniq_numpy:digitize_params as {
+ "right": "boolean=false"
+};
+(:
+Return the indices of the bins to which each value in input array belongs.
+Required arguments:
+- x (array): input array to be binned (currently only 1 dimension is supported)
+- bins (array): one dimensional monotonic, array
+Optional arguments include:
+- right (boolean): indicates whether the intervals include the right or the left bin edge.
+Values outside of the bins bounds return position 1 or size(bins) + 1 according to their relation.
+:)
+declare function jsoniq_numpy:digitize($x as array, $bins as array, $params as object) {
+ let $monotonic := jsoniq_numpy:monotonic($bins)
+ let $params := validate type jsoniq_numpy:digitize_params {$params}
+ return {
+ if ($monotonic eq 0) then
+ fn:error("Bins must be monotonically increasing or decreasing!")
+ else
+ if ($monotonic eq 1) then
+ if ($params.right eq false) then jsoniq_numpy:digitize_monotonically_increasing_left($x, $bins)
+ else
+ jsoniq_numpy:digitize_monotonically_increasing_right($x, $bins)
+ else
+ jsoniq_numpy:digitize_in_reverse($x, $bins, $params.right)
+ }
+};
+
+declare function jsoniq_numpy:digitize($x as array, $bins as array) {
+ jsoniq_numpy:digitize($x, $bins, {})
+};
+
+declare function jsoniq_numpy:compute_index($result as integer, $size as integer) {
+ (: the value is out of the bounds on the left => size + 1:)
+ if ($result eq 0) then $size + 1
+ else
+ (: the value is out of bounds on the right => 1 :)
+ if ($result eq ($size + 1)) then 1
+ else
+ $size - $result + 2
+};
+
+declare function jsoniq_numpy:non_decreasing($arr as array) {
+ variable $i := 1;
+ while ($i lt (size($arr) - 1)) {
+ if ($arr[[$i]] gt $arr[[$i + 1]]) then {
+ exit returning 0;
+ } else {
+ $i := $i + 1;
+ continue loop;
+ }
+ }
+ 1
+};
+
+declare function jsoniq_numpy:non_increasing($arr as array) {
+ variable $i := 1;
+ while ($i lt (size($arr) - 1)) {
+ if ($arr[[$i]] lt $arr[[$i + 1]]) then {
+ exit returning 0;
+ } else {
+ $i := $i + 1;
+ continue loop;
+ }
+ }
+ -1
+};
+
+declare function jsoniq_numpy:monotonic($arr as array) {
+ if (jsoniq_numpy:non_decreasing($arr) eq 0) then
+ jsoniq_numpy:non_increasing($arr)
+ else
+ 1
+};
+
+declare function jsoniq_numpy:product_of_all_values($arr as array) {
+ variable $product := 1;
+ variable $i := 1;
+ while ($i lt size($arr)) {
+ $product := $product * $arr[[$i]];
+ $i := $i + 1;
+ }
+ $product
+};
+
+
+declare function jsoniq_numpy:reshape_sub_dimension($arr, $current_dimensions as array, $current_dimension as integer) {
+ if ($current_dimension gt size($current_dimensions)) then
+ $arr
+ else
+ if ($current_dimensions[[$current_dimension]] eq 1) then
+ [jsoniq_numpy:reshape_sub_dimension($arr, $current_dimensions, $current_dimension + 1)]
+ else
+ let $sub_dimension_result :=
+ let $size_arr := count($arr)
+ let $size_subarr := $size_arr div $current_dimensions[[$current_dimension]]
+ for $j in 0 to ($current_dimensions[[$current_dimension]] - 1)
+ return jsoniq_numpy:reshape_sub_dimension(subsequence($arr, $j * $size_subarr + 1, $size_subarr), $current_dimensions, $current_dimension + 1)
+ return [$sub_dimension_result]
+};
+(: Gives a new shape to an array. The shape argument should have the product of its dimension sizes equal to the number of elements found in arr.
+- arr (array): the array to reshape
+- shape (array): the dimension sizes to resize to. :)
+declare function jsoniq_numpy:reshape($arr as array, $shape as array) {
+ let $flattened_arr := flatten($arr)
+ let $number_of_elements := count($flattened_arr)
+ let $product_of_all_values := jsoniq_numpy:product_of_all_values($shape)
+ return
+ if (($number_of_elements mod $product_of_all_values) eq 0) then
+ jsoniq_numpy:reshape_sub_dimension($flattened_arr, $shape, 1)
+ else
+ error("InvalidFunctionCallErrorCode", "Invalid call to reshape. The shape array must result in a size equivalent to the size of the array.")
+
+};
+
+(: Helper method for argwhere :)
+declare function jsoniq_numpy:argwhere($current_dimension, $positions_at_each_dimension as array) {
+ typeswitch($current_dimension)
+ case array return {
+ for $i in 1 to size($current_dimension)
+ let $sub_dimension := $current_dimension[[$i]]
+ let $positions_at_each_dimension := [$positions_at_each_dimension[], $i]
+ return jsoniq_numpy:argwhere($sub_dimension, $positions_at_each_dimension)
+ }
+ case integer return if ($current_dimension gt 0) then $positions_at_each_dimension
+ else ()
+ default return ()
+};
+
+(: Returns the indexes of non-zero elements with respect to the dimension. The result is a [N, nr_dim] array, where N is the number of non-zero elements and nr_dim is the number of dimensions.
+Required params are:
+- arr (array): the array to look into :)
+declare function jsoniq_numpy:argwhere($arr as array) {
+ [jsoniq_numpy:argwhere($arr, [])]
+};
+
+(: Axis based methods :)
+
+(: Method expects array to be of the same size. :)
+declare function jsoniq_numpy:compute_min_values_of_arrays($array1, $array2) {
+ typeswitch($array1)
+ case array return let $accumulated_sub_dimensions :=
+ for $i in 1 to size($array1)
+ return jsoniq_numpy:compute_min_values_of_arrays($array1[[$i]], $array2[[$i]])
+ return [$accumulated_sub_dimensions]
+ default return if ($array1 lt $array2) then $array1
+ else $array2
+};
+(: Helper method to compute minimum of two arrays. The minimum is computed per index, so the minimum value for a specific index is taken. If the minimum is greater than initial, initial is returned instead as the minimum. :)
+declare function jsoniq_numpy:compute_min_values_of_arrays($array1, $array2, $initial) {
+ typeswitch($array1)
+ case array return let $accumulated_sub_dimensions :=
+ for $i in 1 to size($array1)
+ return jsoniq_numpy:compute_min_values_of_arrays($array1[[$i]], $array2[[$i]], $initial)
+ return [$accumulated_sub_dimensions]
+ default return if ($array1 lt $array2) then
+ if ($initial lt $array1) then $initial
+ else $array1
+ else
+ if ($initial lt $array2) then $initial
+ else $array2
+};
+
+(: Helper method to compute the minimum on the right axis. :)
+declare function jsoniq_numpy:compute_min_along_axis($array as array, $axis as integer, $current_dimension as integer, $max_dim as integer) {
+ if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array.");
+ else
+ if ($current_dimension eq $max_dim) then exit returning min(flatten($array));
+ else {
+ if ($current_dimension eq $axis) then {
+ (: Take the first array as minimum :)
+ variable $mini := $array[[1]];
+ variable $i := 2;
+ while ($i le size($array)) {
+ $mini := jsoniq_numpy:compute_min_values_of_arrays($mini, $array[[$i]]);
+ $i := $i + 1;
+ }
+ exit returning $mini;
+ } else {
+ let $accumulated_sub_dimensions :=
+ let $size := size($array)
+ for $i in 1 to $size
+ return jsoniq_numpy:compute_min_along_axis($array[[$i]], $axis, $current_dimension + 1, $max_dim)
+ return exit returning [$accumulated_sub_dimensions];
+ }
+ }
+};
+
+(: Helper method to compute the minimum on the right axis and using initial. :)
+declare function jsoniq_numpy:compute_min_along_axis($array as array, $axis as integer, $current_dimension as integer, $max_dim as integer, $initial as integer) {
+ if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array.");
+ else
+ if ($current_dimension eq $max_dim) then exit returning min((flatten($array), $initial));
+ else {
+ if ($current_dimension eq $axis) then {
+ (: Take the first array as minimum :)
+ variable $mini := $array[[1]];
+ variable $i := 2;
+ while ($i le size($array)) {
+ $mini := jsoniq_numpy:compute_min_values_of_arrays($mini, $array[[$i]], $initial);
+ $i := $i + 1;
+ }
+ exit returning $mini;
+ } else {
+ let $accumulated_sub_dimensions :=
+ let $size := size($array)
+ for $i in 1 to $size
+ return jsoniq_numpy:compute_min_along_axis($array[[$i]], $axis, $current_dimension + 1, $max_dim, $initial)
+ return exit returning [$accumulated_sub_dimensions];
+ }
+ }
+};
+
+declare function jsoniq_numpy:compute_min_along_axis_wrapper($array as array, $axis as integer) {
+ if ($axis eq -1) then min(flatten($array[]))
+ else
+ jsoniq_numpy:compute_min_along_axis($array, $axis, 0, size(utils:shape($array)) - 1)
+};
+
+declare function jsoniq_numpy:compute_min_along_axis_wrapper($array as array, $axis as integer, $initial as integer) {
+ if ($axis eq -1) then min((flatten($array[]), $initial))
+ else
+ jsoniq_numpy:compute_min_along_axis($array, $axis, 0, size(utils:shape($array)) - 1, $initial)
+
+};
+
+declare type jsoniq_numpy:min_params as {
+ "axis": "integer=-1",
+ "initial": "integer=-2147483648"
+};
+
+(: Min returns the minimum value of an array along an axis. Without an axis, it returns the minimum value in the array.
+Required params are:
+- array (array): The array to look into
+Params is an object for optional arguments. These arguments are:
+- axis (integer): The axis along which to compute the minimum. Only values greater than 0 are accepted.
+- initial (integer): The maximum value returned as output. If a minimum value is greater than initial, initial is returned. We reserve the value -2147483648 for the default, unset value of initial.:)
+declare function jsoniq_numpy:min($array as array, $params as object) {
+ let $params := validate type jsoniq_numpy:min_params {$params}
+ return {
+ if ($params.initial eq -2147483648) then
+ jsoniq_numpy:compute_min_along_axis_wrapper($array, $params.axis)
+ else
+ jsoniq_numpy:compute_min_along_axis_wrapper($array, $params.axis, $params.initial)
+ }
+};
+
+declare function jsoniq_numpy:min($array as array) {
+ jsoniq_numpy:min($array, {})
+};
+
+(: MAX :)
+
+(: Helper method to compute maximum of two arrays. The maximum is computed per index, so the maximum value for a specific index is taken. :)
+declare function jsoniq_numpy:compute_max_values_of_arrays($array1, $array2) {
+ typeswitch($array1)
+ case array return let $accumulated_sub_dimensions :=
+ for $i in 1 to size($array1)
+ return jsoniq_numpy:compute_max_values_of_arrays($array1[[$i]], $array2[[$i]])
+ return [$accumulated_sub_dimensions]
+ default return if ($array1 gt $array2) then $array1
+ else $array2
+};
+(: Helper method to compute maximum of two arrays. The maximum is computed per index, so the maximum value for a specific index is taken. If the maximum is greater than initial, initial is returned instead as the maximum. :)
+declare function jsoniq_numpy:compute_max_values_of_arrays($array1, $array2, $initial) {
+ typeswitch($array1)
+ case array return let $accumulated_sub_dimensions :=
+ for $i in 1 to size($array1)
+ return jsoniq_numpy:compute_max_values_of_arrays($array1[[$i]], $array2[[$i]], $initial)
+ return [$accumulated_sub_dimensions]
+ default return if ($array1 gt $array2) then
+ if ($initial gt $array1) then $initial
+ else $array1
+ else
+ if ($initial gt $array2) then $initial
+ else $array2
+};
+
+(: Helper method to compute the maximum on the right axis. :)
+declare function jsoniq_numpy:compute_max_along_axis($array as array, $axis as integer, $current_dimension as integer, $max_dim as integer) {
+ if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array.");
+ else
+ if ($current_dimension eq $max_dim) then exit returning max(flatten($array));
+ else {
+ if ($current_dimension eq $axis) then {
+ (: Take the first array as maximum :)
+ variable $max_arr := $array[[1]];
+ variable $i := 2;
+ while ($i le size($array)) {
+ $max_arr := jsoniq_numpy:compute_max_values_of_arrays($max_arr, $array[[$i]]);
+ $i := $i + 1;
+ }
+ exit returning $max_arr;
+ } else {
+ let $accumulated_sub_dimensions :=
+ let $size := size($array)
+ for $i in 1 to $size
+ return jsoniq_numpy:compute_max_along_axis($array[[$i]], $axis, $current_dimension + 1, $max_dim)
+ return exit returning [$accumulated_sub_dimensions];
+ }
+ }
+};
+
+(: Helper method to compute the maximum on the right axis and using initial. :)
+declare function jsoniq_numpy:compute_max_along_axis($array as array, $axis as integer, $current_dimension as integer, $max_dim as integer, $initial as integer) {
+ if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array.");
+ else
+ if ($current_dimension eq $max_dim) then exit returning max((flatten($array), $initial));
+ else {
+ if ($current_dimension eq $axis) then {
+ (: Take the first array as maximum :)
+ variable $max_arr := $array[[1]];
+ variable $i := 2;
+ while ($i le size($array)) {
+ $max_arr := jsoniq_numpy:compute_max_values_of_arrays($max_arr, $array[[$i]], $initial);
+ $i := $i + 1;
+ }
+ exit returning $max_arr;
+ } else {
+ let $accumulated_sub_dimensions :=
+ let $size := size($array)
+ for $i in 1 to $size
+ return jsoniq_numpy:compute_max_along_axis($array[[$i]], $axis, $current_dimension + 1, $max_dim, $initial)
+ return exit returning [$accumulated_sub_dimensions];
+ }
+ }
+};
+
+(: Helper method that invokes maximum with axis only :)
+declare function jsoniq_numpy:compute_max_along_axis_wrapper($array as array, $axis as integer) {
+ if ($axis eq -1) then max(flatten($array[]))
+ else
+ jsoniq_numpy:compute_max_along_axis($array, $axis, 0, size(utils:shape($array)) - 1)
+};
+
+(: Helper method that invokes maximum with axis and initial :)
+declare function jsoniq_numpy:compute_max_along_axis_wrapper($array as array, $axis as integer, $initial as integer) {
+ if ($axis eq -1) then max((flatten($array[]), $initial))
+ else
+ jsoniq_numpy:compute_max_along_axis($array, $axis, 0, size(utils:shape($array)) - 1, $initial)
+
+};
+
+declare type jsoniq_numpy:max_params as {
+ "axis": "integer=-1",
+ "initial": "integer=2147483647"
+};
+
+(: max returns the maximum value of an array along an axis. Without an axis, it returns the maximum value in the array.
+Required params are:
+- array (array): The array to look into
+Params is an object for optional arguments. These arguments are:
+- axis (integer): The axis along which to compute the maximum. Only values greater than 0 are accepted.
+- initial (integer): The maximum value returned as output. If a maximum value is smaller than initial, initial is returned. We reserve the value 2147483647 for the default, unset value of initial.:)
+declare function jsoniq_numpy:max($array as array, $params as object) {
+ let $params := validate type jsoniq_numpy:max_params {$params}
+ return {
+ if ($params.initial eq 2147483647) then
+ jsoniq_numpy:compute_max_along_axis_wrapper($array, $params.axis)
+ else
+ jsoniq_numpy:compute_max_along_axis_wrapper($array, $params.axis, $params.initial)
+ }
+};
+
+declare function jsoniq_numpy:max($array as array) {
+ jsoniq_numpy:max($array, {})
+};
+
+
+(: MEAN :)
+
+declare function jsoniq_numpy:sum_arrays($array1, $array2) {
+ typeswitch($array1)
+ case array return let $accumulated_sub_dimensions :=
+ for $i in 1 to size($array1)
+ return jsoniq_numpy:sum_arrays($array1[[$i]], $array2[[$i]])
+ return [$accumulated_sub_dimensions]
+ default return $array1 + $array2
+};
+
+(: Helper method to compute average on an array given the number of values. :)
+declare function jsoniq_numpy:compute_mean_of_array($array1, $count) {
+ typeswitch($array1)
+ case array return let $accumulated_sub_dimensions :=
+ for $i in 1 to size($array1)
+ return jsoniq_numpy:compute_mean_of_array($array1[[$i]], $count)
+ return [$accumulated_sub_dimensions]
+ default return $array1 div $count
+};
+
+(: Helper method to compute the mean on the right axis. :)
+declare function jsoniq_numpy:compute_mean_along_axis($array as array, $axis as integer, $current_dimension as integer, $max_dim as integer) {
+ if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array.");
+ else
+ if ($current_dimension eq $max_dim) then exit returning avg(flatten($array));
+ else {
+ if ($current_dimension eq $axis) then {
+ (: Take the first array as sum :)
+ variable $mean := $array[[1]];
+ variable $i := 2;
+ while ($i le size($array)) {
+ $mean := jsoniq_numpy:sum_arrays($mean, $array[[$i]]);
+ $i := $i + 1;
+ }
+ $mean := jsoniq_numpy:compute_mean_of_array($mean, size($array));
+ exit returning $mean;
+ } else {
+ let $accumulated_sub_dimensions :=
+ let $size := size($array)
+ for $i in 1 to $size
+ return jsoniq_numpy:compute_mean_along_axis($array[[$i]], $axis, $current_dimension + 1, $max_dim)
+ return exit returning [$accumulated_sub_dimensions];
+ }
+ }
+};
+
+(: Helper method that invokes maximum with axis only :)
+declare function jsoniq_numpy:compute_mean_along_axis_wrapper($array as array, $axis as integer) {
+ if ($axis eq -1) then avg(flatten($array))
+ else
+ jsoniq_numpy:compute_mean_along_axis($array, $axis, 0, size(utils:shape($array)) - 1)
+};
+
+declare type jsoniq_numpy:mean_params as {
+ "axis": "integer=-1"
+};
+
+(: mean returns the mean (average) of an array along an axis. Without an axis, it returns the mean of the array.
+Required params are:
+- array (array): The array to look into
+Params is an object for optional arguments. These arguments are:
+- axis (integer): The axis along which to compute the mean. Only values greater than 0 are accepted.:)
+declare function jsoniq_numpy:mean($array as array, $params as object) {
+ let $params := validate type jsoniq_numpy:mean_params {$params}
+ return jsoniq_numpy:compute_mean_along_axis_wrapper($array, $params.axis)
+};
+
+declare function jsoniq_numpy:mean($array as array) {
+ jsoniq_numpy:mean($array, {})
+};
+
+(: Returns the array in absolute value.
+Required params are:
+- array (array): the array to perform absolute value on.
+Other numpy equivalent numpy params are unsupported.
+:)
+declare function jsoniq_numpy:absolute($array) {
+ typeswitch($array)
+ case array return if (size($array) eq 0) then []
+ else
+ let $accumulated_sub_dimensions :=
+ for $i in 1 to size($array)
+ return jsoniq_numpy:absolute($array[[$i]])
+ return [$accumulated_sub_dimensions]
+ default return abs($array)
+};
+
+declare function jsoniq_numpy:sort($array as array, $low as integer, $high as integer) as array {
+ if ($low ge $high or $low lt 1) then $array
+ else {
+ variable $partition_res := jsoniq_numpy:partition($array, $low, $high);
+ $array := [flatten(subsequence($partition_res, 1, 1))];
+ variable $pivot := subsequence($partition_res, 2, 2);
+ $array := jsoniq_numpy:sort($array, $low, $pivot - 1);
+ $array := jsoniq_numpy:sort($array, $pivot + 1, $high);
+ $array
+ }
+};
+
+declare function jsoniq_numpy:partition($array as array, $low as integer, $high as integer) {
+ variable $pivot := jsoniq_numpy:random_randint($low, {"high": $high + 1, "size": [1]})[1];
+ variable $end := $array[[$high]];
+ replace value of json $array[[$high]] with $array[[$pivot]];
+ replace value of json $array[[$pivot]] with $end;
+
+ variable $i := $low;
+ for $j in $low to $high - 1
+ return {
+ if ($array[[$j]] le $array[[$high]]) then {
+ variable $aux := $array[[$i]];
+ replace value of json $array[[$i]] with $array[[$j]];
+ replace value of json $array[[$j]] with $aux;
+ $i := $i + 1;
+ } else ();
+ }
+ variable $aux := $array[[$i]];
+ replace value of json $array[[$i]] with $array[[$high]];
+ replace value of json $array[[$high]] with $aux;
+ exit returning ($array, $i);
+};
+
+declare function jsoniq_numpy:sort($array) {
+ jsoniq_numpy:sort([flatten($array)], 1, size($array))
+};
+
+(: Count non-zero :)
+
+declare function jsoniq_numpy:count_nonzero_values($array1) {
+ typeswitch($array1)
+ case array return let $accumulated_sub_dimensions :=
+ for $i in 1 to size($array1)
+ return jsoniq_numpy:count_nonzero_values($array1[[$i]])
+ return [$accumulated_sub_dimensions]
+ case string return if ($array1 eq "") then 0
+ else 1
+ case boolean return if ($array1) then 1
+ else 0
+ default return if ($array1 ne 0) then 1
+ else 0
+};
+
+declare function jsoniq_numpy:count_nonzero_values_along_axis($array as array, $axis as integer, $current_dimension as integer, $max_dim as integer) {
+ if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array.");
+ else
+ if ($current_dimension eq $max_dim) then exit returning sum(flatten(jsoniq_numpy:count_nonzero_values($array)));
+ else {
+ if ($current_dimension eq $axis) then {
+ variable $count_nonzero_accumulated := jsoniq_numpy:count_nonzero_values($array[[1]]);
+ variable $i := 2;
+ while ($i le size($array)) {
+ variable $curr_count := jsoniq_numpy:count_nonzero_values($array[[$i]]);
+ $count_nonzero_accumulated := jsoniq_numpy:sum_arrays($curr_count, $count_nonzero_accumulated);
+ $i := $i + 1;
+ }
+ exit returning $count_nonzero_accumulated;
+ } else {
+ let $accumulated_sub_dimensions :=
+ let $size := size($array)
+ for $i in 1 to $size
+ return jsoniq_numpy:count_nonzero_values_along_axis($array[[$i]], $axis, $current_dimension + 1, $max_dim)
+ return exit returning [$accumulated_sub_dimensions];
+ }
+ }
+};
+
+declare function jsoniq_numpy:count_nonzero_along_axis_wrapper($array as array, $axis as integer) {
+ if ($axis eq -1) then sum(flatten(jsoniq_numpy:count_nonzero_values($array)))
+ else
+ jsoniq_numpy:count_nonzero_values_along_axis($array, $axis, 0, size(utils:shape($array)) - 1)
+};
+
+declare type jsoniq_numpy:count_nonzero_params as {
+ "axis": "integer=-1"
+};
+
+(: count_nonzero returns the the number of non-zero elements in the array. Non-zero is interpreted as being any value greater than 0, has a boolean value of True or is a non-empty string.
+Required params are:
+- array (array): The array to look into
+Params is an object for optional arguments. These arguments are:
+- axis (integer): The axis along which to compute the count on. Only values greater than 0 are accepted.:)
+declare function jsoniq_numpy:count_nonzero($array as array, $params as object) {
+ let $params := validate type jsoniq_numpy:count_nonzero_params {$params}
+ return jsoniq_numpy:count_nonzero_along_axis_wrapper($array, $params.axis)
+};
+
+declare function jsoniq_numpy:count_nonzero($array as array) {
+ jsoniq_numpy:count_nonzero($array, {})
+};
+
+(: Unique :)
+
+(: unique returns a 1 dimensional array containing the unique elements of the array, sorted ascendingly. Currently, we only support flattening of the unique array as axis behavior is more intricate for jsoniq to support.
+Required params are:
+- array (array): the array to look for unique values.:)
+declare function jsoniq_numpy:unique($array as array) {
+ jsoniq_numpy:sort([distinct-values(flatten($array))])
+};
+
+(: Median :)
+(: Helper method to merge two arrays. Destination may have higher dimension than source, thus we may append to it if it is already an array type. :)
+declare function jsoniq_numpy:merge_arrays($source, $dest) {
+ typeswitch($source)
+ case array return let $accumulated_sub_dimensions :=
+ for $i in 1 to size($source)
+ return jsoniq_numpy:merge_arrays($source[[$i]], $dest[[$i]])
+ return [$accumulated_sub_dimensions]
+ default return typeswitch($dest)
+ case array return [$source, flatten($dest)]
+ default return [$source, $dest]
+};
+
+declare function jsoniq_numpy:compute_median($array) {
+ if (size(utils:shape($array)) gt 1) then
+ let $accumulated_sub_dimensions :=
+ for $i in 1 to size($array)
+ return jsoniq_numpy:compute_median($array[[$i]])
+ return [$accumulated_sub_dimensions]
+ else
+ jsoniq_numpy:compute_median_without_axis($array)
+};
+
+declare function jsoniq_numpy:compute_median_along_axis($array as array, $axis as integer, $current_dimension as integer, $max_dim as integer) {
+ if ($axis gt $max_dim) then error("InvalidFunctionCallErrorCode","Axis value higher than maximum dimension! Choose a value fitting the dimensions of your array.");
+ else
+ if ($current_dimension eq $max_dim) then exit returning jsoniq_numpy:compute_median_without_axis($array);
+ else {
+ if ($current_dimension eq $axis) then {
+ variable $accumulated_subarrays := $array[[1]];
+ variable $i := 2;
+ while ($i le size($array)) {
+ $accumulated_subarrays := jsoniq_numpy:merge_arrays($array[[$i]], $accumulated_subarrays);
+ $i := $i + 1;
+ }
+ if ($i eq 2) then
+ (: no merging was done, no median is needed for this axis :)
+ exit returning $accumulated_subarrays;
+ else
+ exit returning jsoniq_numpy:compute_median($accumulated_subarrays);
+ } else {
+ let $accumulated_sub_dimensions :=
+ let $size := size($array)
+ for $i in 1 to $size
+ return jsoniq_numpy:compute_median_along_axis($array[[$i]], $axis, $current_dimension + 1, $max_dim)
+ return exit returning [$accumulated_sub_dimensions];
+ }
+ }
+};
+
+declare function jsoniq_numpy:compute_median_without_axis($array as array) {
+ let $sorted_arr := jsoniq_numpy:sort($array)
+ let $middle_index := size($sorted_arr) div 2
+ return
+ if (size($sorted_arr) mod 2 eq 0) then
+ ($sorted_arr[[$middle_index]] + $sorted_arr[[$middle_index + 1]]) div 2
+ else
+ $sorted_arr[[$middle_index + 1]]
+};
+
+declare function jsoniq_numpy:median_on_axis($array as array, $axis as integer) {
+ if ($axis eq -1) then jsoniq_numpy:compute_median_without_axis([flatten($array)])
+ else
+ jsoniq_numpy:compute_median_along_axis($array, $axis, 0, size(utils:shape($array)) - 1)
+};
+
+declare type jsoniq_numpy:median_params as {
+ "axis": "integer=-1"
+};
+
+(: median computes the median along the specified axis. Given an array V of length N, the median of V is the middle value of a sorted copy of V, V_sorted - i e., V_sorted[(N-1)/2], when N is odd, and the average of the two middle values of V_sorted when N is even.
+Required params are:
+- array (array): The array to look into
+Params is an object for optional arguments. These arguments are:
+- axis (integer): The axis along which to compute median on. Only values greater than 0 are accepted.:)
+declare function jsoniq_numpy:median($array as array, $params as object) {
+ let $params := validate type jsoniq_numpy:median_params {$params}
+ return jsoniq_numpy:median_on_axis($array, $params.axis)
+};
+
+declare function jsoniq_numpy:median($array as array) {
+ jsoniq_numpy:median($array, {})
+};
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq
new file mode 100644
index 0000000000..ea8d62fc15
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_pandas.jq
@@ -0,0 +1,306 @@
+(:JIQS: ShouldNotParse; ErrorCode="XPST0003"; ErrorMetadata="LINE:1:COLUMN:0:" :)
+module namespace jsoniq_pandas = "jsoniq_pandas.jq";
+import module namespace jsoniq_numpy = "jsoniq_numpy.jq";
+import module namespace functx = "functx.jq";
+
+(: describe generates descriptive statistics about a dataset. Statistics summarize the central tendency, dispersion and shape of a dataset, excluding null values. Provides a string/dataframe as result.
+Required params are:
+- dataframe (DataFrame): The dataframe to look into
+Params is an object for optional arguments. These arguments are:
+- include (array) - type of data to include in the description. To return only numeric summaries for numeric types, submit 'number'. To return only object summaries for object types, submit 'categorical'. To return all types, submit 'all'.
+- exclude - not supported :)
+declare function jsoniq_pandas:describe($dataframe as object*, $params as object) {
+ let $params := validate type jsoniq_pandas:describe_params {$params}
+ for $column in keys($dataframe)
+ return { $column:
+ switch($params.include)
+ case "all" return jsoniq_pandas:all_report([$dataframe.$column], $params)
+ case "number" return jsoniq_pandas:number_report([$dataframe.$column], $params)
+ case "object" return jsoniq_pandas:object_report([$dataframe.$column])
+ default return error("Unrecognized include option. Only 'number' and 'object' are supported.")
+ }
+};
+
+declare type jsoniq_pandas:describe_params as {
+ "include": "string=all",
+ "percentiles": "array"
+};
+
+declare function jsoniq_pandas:describe($dataframe as object*) {
+ jsoniq_pandas:describe($dataframe, {})
+};
+
+declare function jsoniq_pandas:all_report($column, $params as object) {
+ let $column_type := item-type($column)
+ return switch($column_type)
+ case "xs:int" return jsoniq_pandas:numerical_report($column, $params)
+ case "xs:integer" return jsoniq_pandas:numerical_report($column, $params)
+ case "xs:decimal" return jsoniq_pandas:numerical_report($column, $params)
+ case "xs:float" return jsoniq_pandas:numerical_report($column, $params)
+ case "xs:double" return jsoniq_pandas:numerical_report($column, $params)
+ case "xs:boolean" return jsoniq_pandas:categorical_report($column)
+ default return jsoniq_pandas:categorical_report($column)
+};
+
+declare function jsoniq_pandas:number_report($column, $params as object) {
+ let $column_type := item-type($column)
+ return switch($column_type)
+ case "xs:integer" return jsoniq_pandas:numerical_report($column, $params)
+ case "xs:decimal" return jsoniq_pandas:numerical_report($column, $params)
+ case "xs:float" return jsoniq_pandas:numerical_report($column, $params)
+ case "xs:double" return jsoniq_pandas:numerical_report($column, $params)
+ default return ()
+};
+
+declare function jsoniq_pandas:object_report($column) {
+ let $column_type := item-type($column)
+ return switch($column_type)
+ case "xs:boolean" return jsoniq_pandas:categorical_report($column)
+ case "xs:string" return jsoniq_pandas:categorical_report($column)
+ default return ()
+};
+
+declare function jsoniq_pandas:numerical_report($column as array, $params as object) {
+ let $count := size($column)
+ let $mean := jsoniq_numpy:mean($column)
+ let $std := jsoniq_pandas:std($column, $mean)
+ let $min := jsoniq_numpy:min($column)
+ let $max := jsoniq_numpy:max($column)
+ let $sorted_arr := jsoniq_numpy:sort($column)
+ let $percentiles := jsoniq_pandas:get_percentiles($params.percentiles)
+ return {|
+ {
+ "count": $count,
+ "mean": $mean,
+ "std": $std,
+ "min": $min,
+ "max": $max
+ },
+ for $percentile in $percentiles[]
+ return {string($percentile * 100) || "%": jsoniq_pandas:compute_percentile($sorted_arr, $percentile)}
+ |}
+};
+
+declare function jsoniq_pandas:get_percentiles($params_percentiles) {
+ if (empty($params_percentiles)) then [.25, .5, .75]
+ else $params_percentiles
+};
+
+declare function jsoniq_pandas:std($arr as array, $mean as double) {
+ let $accumulated :=
+ for $value in $arr[]
+ return pow($value - $mean, 2)
+ let $sum_accumulated := fn:sum($accumulated)
+ let $sample_size := size($arr) - 1
+ return float(sqrt($sum_accumulated div $sample_size))
+};
+
+declare function jsoniq_pandas:categorical_report($column as array) {
+ let $count := size($column)
+ let $unique := count(functx:distinct-deep($column[]))
+ let $occurences := jsoniq_pandas:count_occurences($column)
+ let $top := $occurences[1].value
+ let $frequency := $occurences[1].count
+ return {
+ "count": $count,
+ "unique": $unique,
+ "top": $top,
+ "frequency": $frequency
+ }
+};
+
+declare function jsoniq_pandas:count_occurences($column) {
+ let $column_values := $column[]
+ return if ($column_values instance of atomic*) then jsoniq_pandas:count_occurences_for_atomic($column_values)
+ else if ($column_values instance of json-item*) then jsoniq_pandas:count_occurences_for_structured_item($column_values)
+ else fn:error("Unrecognized type for dataframe. Only atomic and item types are supported.")
+};
+
+declare function jsoniq_pandas:count_occurences_for_atomic($column) {
+ for $value in $column
+ let $group_key := $value
+ group by $group_key
+ return {"value": $group_key, "count": count($value)}
+};
+
+declare function jsoniq_pandas:count_occurences_for_structured_item($column) {
+ variable $counts :=
+ let $distinct_values := functx:distinct-deep($column)
+ for $value in $distinct_values
+ return {"count": jsoniq_pandas:count_value($value, $column), "value": $value};
+ for $count in $counts
+ order by $count.count descending
+ return $count
+};
+
+declare function jsoniq_pandas:count_value($value, $column) {
+ let $frequency :=
+ for $column_value in $column
+ where deep-equal($value, $column_value)
+ return 1
+ return count($frequency)
+};
+
+declare function jsoniq_pandas:compute_percentile($arr as array, $percentile as double) {
+ let $distance_of_min_to_max := size($arr) - 1
+ let $percentile_index := $distance_of_min_to_max * $percentile + 1
+ let $percentile_index_integer_part := floor($percentile_index)
+ let $percentile_index_fractional_part := $percentile_index - $percentile_index_integer_part
+ let $adjacent_difference := $arr[[$percentile_index]] + $percentile_index_fractional_part * ($arr[[$percentile_index_integer_part + 1]] - $arr[[$percentile_index_integer_part]])
+ return $adjacent_difference
+};
+
+(: sample returns a random sample from the DataFrame. We currently only support returning results from the first axis, that is rows of the DataFrame. We do not support weighted samples or fractional samples. We only support sampling with replacement.
+Required params are:
+- dataframe (DataFrame): the dataframe to sample from.
+- n (integer): number of samples to return.
+:)
+declare function jsoniq_pandas:sample($dataframe as object*, $num as integer) {
+ if ($num lt 0) then ()
+ else
+ let $size_dataframe := count($dataframe)
+ let $random_numbers := jsoniq_numpy:random_randint(1, {"size": [$size_dataframe], "high": $size_dataframe})
+ for $i in 1 to $num
+ return $dataframe[$random_numbers[$i]]
+};
+
+(: sample returns a random sample from the DataFrame with a seed. We currently only support returning results from the first axis, that is rows of the DataFrame. We do not support weighted samples or fractional samples. We only support sampling with replacement.
+Required params are:
+- dataframe (DataFrame): the dataframe to sample from.
+- n (integer): number of samples to return.
+- seed (integer): seed to be used for random number sampling.
+:)
+declare function jsoniq_pandas:sample($dataframe as object*, $num as integer, $seed as integer) {
+ if ($num lt 0) then ()
+ else
+ let $size_dataframe := count($dataframe)
+ let $random_numbers := random-between(1, $size_dataframe, $num, "integer", $seed)
+ for $i in 1 to $num
+ return $dataframe[$random_numbers[$i]]
+};
+
+
+(: isnull returns a same-sized array indicating if values are null or not.
+Required params are:
+- dataframe (DataFrame): the dataframe to search nulls in.
+:)
+declare function jsoniq_pandas:isnull($dataframe as object*) as object* {
+ let $keys := keys($dataframe)
+ for $row in $dataframe
+ return jsoniq_pandas:isnull_row($row, $keys)
+};
+
+declare function jsoniq_pandas:isnull_row($row as object, $keys) as object {
+ {|
+ for $key in $keys
+ return if (empty($row.$key)) then {$key: true}
+ else if ($row.$key instance of atomic) then
+ if ($row.$key eq null) then {$key: true}
+ else {$key: false}
+ else {$key: false}
+ |}
+};
+
+
+(: fillna replaces null values with specified values. It returns a new DataFrame with the replacement result.
+Required params are:
+- dataframe (DataFrame): the dataframe to fill nulls in.
+Params is an object for optional arguments. These arguments are:
+- value (integer): the value to replace null's with.
+:)
+declare function jsoniq_pandas:fillna($dataframe as object*, $params as object) as object*{
+ let $params := validate type jsoniq_pandas:fillna_params {$params}
+ let $keys := keys($dataframe)
+ for $row in $dataframe
+ return jsoniq_pandas:fillna_row($row, $params, $keys)
+};
+
+declare function jsoniq_pandas:fillna($dataframe as object*) as object*{
+ jsoniq_pandas:fillna($dataframe, {})
+};
+
+declare type jsoniq_pandas:fillna_params as {
+ "value": "item"
+};
+
+declare function jsoniq_pandas:fillna_row($row as object, $params as object, $keys) as object{
+ {|
+ for $key in $keys
+ return if (empty($row.$key)) then {$key: $params.value}
+ else if ($row.$key instance of atomic) then
+ if ($row.$key eq null) then {$key: $params.value}
+ else {$key: $row.$key}
+ else {$key: $row.$key}
+ |}
+};
+
+(: dropna removes rows or columns from DataFrames that contain nulls. The $axis parameter controls if rows or columns are removed, whereas the $how parameter controls the ruling for dropping the row or column.
+Required params are:
+- dataframe (DataFrame): the dataframe to drop nulls from.
+Params is an object for optional arguments. These arguments are:
+- axis (integer): the axis along to remove values from. Can only be 0 for rows or 1 for columns.
+- how (string): 'any' or 'all' are supported.
+:)
+declare function jsoniq_pandas:dropna($dataframe as object*, $params as object) {
+ let $params := validate type jsoniq_pandas:dropna_params {$params}
+ let $keys := keys($dataframe)
+ return
+ if ($params.axis eq 0) then
+ jsoniq_pandas:remove_rows($dataframe, $params.how, $keys)
+ else
+ jsoniq_pandas:remove_columns($dataframe, $params.how, $keys)
+};
+
+declare type jsoniq_pandas:dropna_params as {
+ "axis": "integer=0",
+ "how": "string=any"
+};
+
+declare function jsoniq_pandas:remove_columns($dataframe as object*, $how as string, $keys) {
+ let $columns_to_remove :=
+ for $column_name in $keys
+ where jsoniq_pandas:column_has_null($dataframe.$column_name, $how) eq true
+ return $column_name
+ return
+ if (count($columns_to_remove) gt 0) then remove-keys($dataframe, $columns_to_remove)
+ else $dataframe
+};
+
+declare function jsoniq_pandas:remove_rows($dataframe as object*, $how as string, $keys) {
+ if ($how eq "any") then {
+ for $row in $dataframe
+ where (count(keys($row)) eq count ($keys))
+ return $row
+ }
+ else {
+ for $row in $dataframe
+ where (count(keys($row)) gt 0)
+ return $row
+ }
+};
+
+declare function jsoniq_pandas:column_has_null($column, $how as string) {
+ if ($how eq "any") then {
+ variable $i := 1;
+ variable $size := count($column);
+ variable $column_flat := flatten($column);
+ while($i le $size) {
+ if (is-null($column_flat[$i])) then exit returning true;
+ else ();
+ $i := $i + 1;
+ }
+ exit returning false;
+ }
+ else {
+ variable $i := 1;
+ variable $size := count($column);
+ variable $column_flat := flatten($column);
+ while($i le $size) {
+ if (not is-null($column_flat[$i])) then exit returning false;
+ else ();
+ $i := $i + 1;
+ }
+ exit returning true;
+ }
+};
+
diff --git a/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq
new file mode 100644
index 0000000000..c3d5e7b8dc
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/jsoniq_utils.jq
@@ -0,0 +1,35 @@
+(:JIQS: ShouldNotParse; ErrorCode="XPST0003"; ErrorMetadata="LINE:1:COLUMN:0:" :)
+module namespace jsoniq_utils = "jsoniq_utils.jq";
+
+declare function jsoniq_utils:cast-as($value, $type as string) {
+ switch ($type)
+ case "string" return $value cast as string
+ case "integer" return $value cast as integer
+ case "numeric" return $value cast as numeric
+ case "float" return $value cast as float
+ case "decimal" return $value cast as decimal
+ case "double" return $value cast as double
+ case "boolean" return $value cast as boolean
+ case "null" return $value cast as null
+ default return $value cast as integer
+};
+
+(: Function returns the shape of the array as a list where each index represents the number of elements in that particular dimension.
+Required params are:
+- arr (array): the array to compute the shape for :)
+declare function jsoniq_utils:shape($arr as array) {
+ variable $shape := [];
+ variable $pos := 1;
+ variable $it := $arr;
+ try {
+ while (size($it) gt 0) {
+ insert json size($it) into $shape at position $pos;
+ $pos := $pos + 1;
+ $it := $it[[1]];
+ }
+ } catch XPTY0004 {
+ (: While loop stops when $it becomes a single value :)
+ ();
+ }
+ $shape
+};
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_item_type.jq b/src/test/resources/test_files/runtime/numpy_lib/test_item_type.jq
new file mode 100644
index 0000000000..f7928e0f85
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_item_type.jq
@@ -0,0 +1,22 @@
+(:JIQS: ShouldRun; Output="(xs:string, js:atomic, js:object, xs:int, xs:dateTime, xs:string, xs:decimal, xs:date, xs:time, xs:duration, xs:boolean, js:null, xs:base64Binary, xs:hexBinary, xs:anyURI, xs:dateTimeStamp, xs:dayTimeDuration, xs:yearMonthDuration, js:object, xs:int)":)
+
+fn:item-type(["2", "3", "4"]),
+fn:item-type([1, "2", 3]),
+fn:item-type({"a": "boo"}),
+fn:item-type(3),
+fn:item-type(dateTime("2001-12-12T23:00:00")),
+fn:item-type("test"),
+fn:item-type(3.234),
+fn:item-type(date("2001-12-12-10:00")),
+fn:item-type(time("13:20:30.5555")),
+fn:item-type(duration("P3Y5M") ),
+fn:item-type(true),
+fn:item-type(null),
+fn:item-type(base64Binary("abcdEFGH")),
+fn:item-type(hexBinary("ab88")),
+fn:item-type(anyURI("example.com/")),
+fn:item-type(dateTimeStamp("2004-04-12T13:20:00-05:00")),
+fn:item-type(dayTimeDuration("P3DT5H6.001S")),
+fn:item-type(yearMonthDuration("P2Y4M")),
+fn:item-type(json-file("../../../queries/rumbleML/sample-ml-data-age-weight.json")),
+fn:item-type(json-file("../../../queries/rumbleML/sample-ml-data-age-weight.json")."age")
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_absolute.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_absolute.jq
new file mode 100644
index 0000000000..f67b87f6a9
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_absolute.jq
@@ -0,0 +1,8 @@
+(:JIQS: ShouldRun; Output="([ 1, 2, 3 ], [ 1, 2, 3 ], [ [ 1, 2, 1 ], [ 2, 3, 3 ] ], [ 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ], [ [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 1, 2, 3 ] ] ], [ ])":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:absolute([1,2,3]),
+numpy:absolute([-1,2,-3]),
+numpy:absolute([[-1, -2, 1], [2, 3, -3]]),
+numpy:absolute(numpy:arange(30, {"start": -50})),
+numpy:absolute([[[1, 2, 3], [4, -5, -6], [-1, 2, 3]]]),
+numpy:absolute([])
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_arange.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_arange.jq
new file mode 100644
index 0000000000..c7c3c2945b
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_arange.jq
@@ -0,0 +1,9 @@
+(:JIQS: ShouldRun; Output="([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], [ 5, 6, 7, 8, 9 ], [ -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], [ -20, -19, -18, -17, -16, -15, -14, -13, -12, -11 ], [ -20, -18, -16, -14, -12 ], [ 20.7, 21.7, 22.7, 23.7, 24.7, 25.7, 26.7, 27.7, 28.7, 29.7, 30.7, 31.7, 32.7, 33.7, 34.7, 35.7, 36.7, 37.7, 38.7, 39.7, 40.7, 41.7, 42.7, 43.7, 44.7, 45.7, 46.7, 47.7, 48.7, 49.7, 50.7, 51.7, 52.7, 53.7 ], [ 20.7, 22.2, 23.7, 25.2, 26.7, 28.2, 29.7, 31.2, 32.7, 34.2, 35.7, 37.2, 38.7, 40.2, 41.7, 43.2, 44.7, 46.2, 47.7, 49.2, 50.7, 52.2, 53.7 ])":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:arange(10, {"start": 0, "step": 1}),
+numpy:arange(10, {"start": 5, "step": 1}),
+numpy:arange(10, {"start": -10, "step": 1}),
+numpy:arange(-10, {"start": -20, "step": 1}),
+numpy:arange(-10, {"start": -20, "step": 2}),
+numpy:arange(54.3, {"start": 20.7, "step": 1}),
+numpy:arange(54.3, {"start": 20.7, "step": 1.5})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_argwhere.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_argwhere.jq
new file mode 100644
index 0000000000..1b97e7d000
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_argwhere.jq
@@ -0,0 +1,6 @@
+(:JIQS: ShouldRun; Output="([ [ 1, 1, 1 ], [ 1, 1, 2 ], [ 1, 1, 3 ], [ 1, 2, 1 ], [ 1, 2, 2 ], [ 1, 2, 3 ] ], [ [ 1, 1, 1 ], [ 1, 2, 1 ], [ 2, 1, 1 ], [ 2, 2, 1 ], [ 3, 1, 1 ], [ 3, 2, 1 ], [ 4, 1, 1 ], [ 4, 2, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 2 ], [ 2, 1, 1 ], [ 2, 1, 2 ], [ 3, 1, 1 ], [ 3, 1, 2 ] ], [ [ 1, 1 ], [ 2, 2 ], [ 3, 3 ], [ 4, 4 ], [ 5, 5 ], [ 6, 6 ], [ 7, 7 ], [ 8, 8 ], [ 9, 9 ], [ 10, 10 ], [ 11, 11 ], [ 12, 12 ], [ 13, 13 ], [ 14, 14 ], [ 15, 15 ], [ 16, 16 ], [ 17, 17 ], [ 18, 18 ], [ 19, 19 ], [ 20, 20 ], [ 21, 21 ], [ 22, 22 ], [ 23, 23 ], [ 24, 24 ], [ 25, 25 ], [ 26, 26 ], [ 27, 27 ], [ 28, 28 ], [ 29, 29 ], [ 30, 30 ] ])":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:argwhere(numpy:ones([1, 2, 3])),
+numpy:argwhere(numpy:ones([4, 2, 1])),
+numpy:argwhere(numpy:ones([3, 1, 2])),
+numpy:argwhere(numpy:identity(30))
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_binsearch.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_binsearch.jq
new file mode 100644
index 0000000000..2a9149df30
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_binsearch.jq
@@ -0,0 +1,10 @@
+(:JIQS: ShouldRun; Output="(5, 4, 0, 101, 1, 10, 1, 11)":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:binsearch(numpy:arange(10, {"start": 0, "step": 1}), 4),
+numpy:binsearch(numpy:arange(11, {"start": 0, "step": 1}), 3),
+numpy:binsearch(numpy:arange(100, {"start": 0, "step": 1}), -12),
+numpy:binsearch(numpy:arange(100, {"start": 0, "step": 1}), 101),
+numpy:binsearch(numpy:arange(10, {"start": 0, "step": 1}), 0),
+numpy:binsearch(numpy:arange(10, {"start": 0, "step": 1}), 9),
+numpy:binsearch(numpy:arange(11, {"start": 0, "step": 1}), 0),
+numpy:binsearch(numpy:arange(11, {"start": 0, "step": 1}), 10)
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_count_nonzero.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_count_nonzero.jq
new file mode 100644
index 0000000000..4de3ba371f
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_count_nonzero.jq
@@ -0,0 +1,15 @@
+(:JIQS: ShouldRun; Output="(3, 4, 4, 3, [ 1, 2 ], [ 2, 0, 1 ], 8, [ [ 0, 1, 0, 1 ], [ 1, 0, 1, 1 ], [ 1, 1, 1, 0 ] ], [ [ 2, 2, 2, 2 ] ], [ [ 2, 3, 3 ] ], 3, 1, [ [ 3, 3, 3 ] ])":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:count_nonzero([1,2,3]),
+numpy:count_nonzero([-1,2,-3, 0, 1, 0]),
+numpy:count_nonzero([-1,2,-3, 0, 1, 0], {"axis": 0}),
+numpy:count_nonzero([[-1, 0, 0], [2, 0, -3]]),
+numpy:count_nonzero([[-1, 0, 0], [2, 0, -3]], {"axis": 1}),
+numpy:count_nonzero([[-1, 0, 0], [2, 0, -3]], {"axis": 0}),
+numpy:count_nonzero([[[0, 1, 0, 3], [2, 0, -3, 7], [2, 1, -3, 0]]]),
+numpy:count_nonzero([[[0, 1, 0, 3], [2, 0, -3, 7], [2, 1, -3, 0]]], {"axis": 0}),
+numpy:count_nonzero([[[0, 1, 0, 3], [2, 0, -3, 7], [2, 1, -3, 0]]], {"axis": 1}),
+numpy:count_nonzero([[[0, 1, 0, 3], [2, 0, -3, 7], [2, 1, -3, 0]]], {"axis": 2}),
+numpy:count_nonzero(["1", "0", "2"]),
+numpy:count_nonzero([[true, false], [false, false]]),
+numpy:count_nonzero([[[0, 1, 0.2, 3], [2, 0, -3.3, 7.21], [2, 1.12, -3, 0]]], {"axis": 2})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq
new file mode 100644
index 0000000000..451be59694
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_digitize.jq
@@ -0,0 +1,17 @@
+(:JIQS: ShouldRun; Output="([ 2, 5, 4, 3 ], [ 3, 4, 5, 6, 7, 8, 9 ], [ 2, 3, 3, 3, 3, 3, 3 ], [ 0, 2, 2, 2, 5 ], [ ], [ ], [ 0, 0 ], [ 5, 2, 3, 4 ], [ 25, 24, 23, 22, 21, 20, 19 ], [ 5, 4, 4, 4, 4, 4, 4 ], [ 5, 4, 4, 4, 1 ], [ 5, 2, 3, 4 ], [ 26, 25, 24, 23, 22, 21, 20 ], [ 6, 5, 4, 4, 4, 4, 4 ], [ 5, 5, 4, 4, 2 ])":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:digitize([0.2, 6.4, 3.0, 1.6], [0.0, 1.0, 2.5, 4.0, 10.0]),
+numpy:digitize([1, 2, 3, 4, 5, 6, 7], numpy:arange(25)),
+numpy:digitize([1, 2, 3, 4, 5, 6, 7], [1, 2, 10, 20, 30]),
+numpy:digitize([1, 2, 3, 4, 7], [2, 5, 6, 7]),
+numpy:digitize([], []),
+numpy:digitize([], [1, 2, 3]),
+numpy:digitize([1, 2], []),
+numpy:digitize([0.2, 6.4, 3.0, 1.6], [10.0, 4.0, 2.5, 1.0, 0.0]),
+numpy:digitize([1, 2, 3, 4, 5, 6, 7], numpy:arange(0, {"start": 25, "step": -1})),
+numpy:digitize([1, 2, 3, 4, 5, 6, 7], [30, 20, 10, 2, 1]),
+numpy:digitize([1, 2, 3, 4, 7], [7, 6, 5, 2]),
+numpy:digitize([0.2, 6.4, 3.0, 1.6], [10.0, 4.0, 2.5, 1.0, 0.0], {"right": true}),
+numpy:digitize([1, 2, 3, 4, 5, 6, 7], numpy:arange(0, {"start": 25, "step": -1}), {"right": true}),
+numpy:digitize([1, 2, 3, 4, 5, 6, 7], [30, 20, 10, 2, 1], {"right": true}),
+numpy:digitize([1, 2, 3, 4, 7], [7, 6, 5, 2], {"right": true})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna1.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna1.jq
new file mode 100644
index 0000000000..dfb8702cea
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna1.jq
@@ -0,0 +1,20 @@
+(:JIQS: ShouldRun; Output="({ "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "nullCol" : 1, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] }, { "label" : 1, "binaryLabel" : 0, "name" : "b", "age" : 21, "weight" : 55.3, "booleanCol" : false, "nullCol" : 1, "stringCol" : "i am data entry 2", "stringArrayCol" : [ "i", "am", "data", "entry", "2" ], "intArrayCol" : [ 4, 5, 6 ], "doubleArrayCol" : [ 4, 5, 6 ], "doubleArrayArrayCol" : [ [ 4, 5, 6 ] ] }, { "label" : 2, "binaryLabel" : 0, "name" : "c", "age" : 22, "weight" : 60.6, "booleanCol" : false, "nullCol" : 1, "stringCol" : "i am data entry 3", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "intArrayCol" : [ 7, 8, 9 ], "doubleArrayCol" : [ 7, 8, 9 ], "doubleArrayArrayCol" : [ [ 7, 8, 9 ] ] }, { "label" : 3, "binaryLabel" : 1, "name" : "d", "age" : 23, "weight" : 65.9, "booleanCol" : 1, "nullCol" : 1, "stringCol" : "i am data entry 4", "stringArrayCol" : [ "i", "am", "data", "entry", "4" ], "intArrayCol" : [ 1, 4, 7 ], "doubleArrayCol" : [ 1, 4, 7 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] }, { "label" : 4, "binaryLabel" : 1, "name" : "e", "age" : 24, "weight" : 70.3, "booleanCol" : true, "nullCol" : 1, "stringCol" : "i am data entry 5", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "intArrayCol" : [ 2, 5, 8 ], "doubleArrayCol" : [ 2, 5, 8 ], "doubleArrayArrayCol" : [ [ 2, 5, 8 ] ] }, { "label" : 5, "binaryLabel" : 1, "name" : "f", "age" : 25, "weight" : 75.6, "booleanCol" : 1, "nullCol" : 1, "stringCol" : "i am data entry 6", "stringArrayCol" : [ "i", "am", "data", "entry", "6" ], "intArrayCol" : [ 3, 6, 9 ], "doubleArrayCol" : [ 3, 6, 9 ], "doubleArrayArrayCol" : [ [ 3, 6, 9 ] ] })":)
+import module namespace pandas = "jsoniq_pandas.jq";
+declare type local:sample-type-with-arrays as {
+ "label": "integer",
+ "binaryLabel": "integer",
+ "name": "string",
+ "age": "integer",
+ "weight": "double",
+ "booleanCol": "boolean",
+ "nullCol": "null",
+ "stringCol": "string",
+ "stringArrayCol": ["string"],
+ "intArrayCol": ["integer"],
+ "doubleArrayCol": ["double"],
+ "doubleArrayArrayCol": [["double"]]
+};
+
+declare variable $file_data := json-file("../../../queries/sample-na-data-4.json");
+let $data := validate type local:sample-type-with-arrays* {$file_data}
+return $data=>pandas:fillna({"value": 1})
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna2.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna2.jq
new file mode 100644
index 0000000000..b704224f64
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna2.jq
@@ -0,0 +1,5 @@
+(:JIQS: ShouldRun; Output="({ "age" : 20, "binaryLabel" : 0, "booleanCol" : false, "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ], "doubleArrayCol" : [ 1, 2, 3 ], "intArrayCol" : [ 1, 2, 3 ], "label" : 0, "name" : "a", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "stringCol" : "i am data entry 1", "weight" : 50 }, { "age" : 21, "binaryLabel" : 0, "booleanCol" : false, "doubleArrayArrayCol" : [ [ 4, 5, 6 ] ], "doubleArrayCol" : [ 4, 5, 6 ], "intArrayCol" : [ 4, 5, 6 ], "label" : 1, "name" : "b", "stringArrayCol" : [ "i", "am", "data", "entry", "2" ], "stringCol" : "i am data entry 2", "weight" : 55.3 }, { "age" : 22, "binaryLabel" : 0, "booleanCol" : null, "doubleArrayArrayCol" : [ [ 7, 8, 9 ] ], "doubleArrayCol" : [ 7, 8, 9 ], "intArrayCol" : [ 7, 8, 9 ], "label" : 2, "name" : "c", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "stringCol" : "i am data entry 3", "weight" : null }, { "age" : 23, "binaryLabel" : 1, "booleanCol" : null, "doubleArrayArrayCol" : [ [ 1, 4, 7 ] ], "doubleArrayCol" : [ 1, 4, 7 ], "intArrayCol" : [ 1, 4, 7 ], "label" : 3, "name" : "d", "stringArrayCol" : [ "i", "am", "data", "entry", "4" ], "stringCol" : "i am data entry 4", "weight" : null }, { "age" : 24, "binaryLabel" : 1, "booleanCol" : true, "doubleArrayArrayCol" : [ [ 2, 5, 8 ] ], "doubleArrayCol" : [ 2, 5, 8 ], "intArrayCol" : [ 2, 5, 8 ], "label" : 4, "name" : "e", "stringArrayCol" : [ "i", "am", "data", "entry", "5" ], "stringCol" : "i am data entry 5", "weight" : 70.3 }, { "age" : 25, "binaryLabel" : 1, "booleanCol" : true, "doubleArrayArrayCol" : [ [ 3, 6, 9 ] ], "doubleArrayCol" : [ 3, 6, 9 ], "intArrayCol" : [ 3, 6, 9 ], "label" : 5, "name" : "f", "stringArrayCol" : [ "i", "am", "data", "entry", "6" ], "stringCol" : "i am data entry 6", "weight" : 75.6 })":)
+import module namespace pandas = "jsoniq_pandas.jq";
+
+let $file_data := structured-json-file("../../../queries/sample-na-data-2.json")
+return $file_data=>pandas:fillna({"value": null})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna3.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna3.jq
new file mode 100644
index 0000000000..cc922127f3
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_fillna3.jq
@@ -0,0 +1,25 @@
+(:JIQS: ShouldRun; Output="({ "anotherArray" : [ 1, 2, 3 ], "name" : [ "null", "null" ], "other" : [ 1, 2, 3 ], "other2" : 1, "type" : "null" }, { "anotherArray" : [ [ 2, 1, 2 ] ], "name" : [ "null" ], "other" : [ "null" ], "other2" : 2, "type" : [ 1, 2, 3 ] }, { "anotherArray" : [ [ 23 ] ], "name" : [ "null" ], "other" : [ 1, 2, 3 ], "other2" : [ 1, 2, 3 ], "type" : "null" })":)
+import module namespace pandas = "jsoniq_pandas.jq";
+
+declare type local:sample-type as {
+ "name": ["string"],
+ "type": "string",
+ "other": ["string"],
+ "other2": "integer",
+ "anotherArray": [["integer"]]
+};
+
+declare function local:order-by-keys($object as object*) as object* {
+ for $row in $object
+ return
+ {|
+ for $key in keys($row)
+ order by $key
+ return {$key: $row.$key}
+ |}
+};
+
+declare variable $file_data := json-file("../../../queries/sample-na-data-3.json");
+let $data := validate type local:sample-type* {$file_data}
+return local:order-by-keys($data=>pandas:fillna({"value": [1, 2, 3]}))
+
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_full.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_full.jq
new file mode 100644
index 0000000000..fffdb9a716
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_full.jq
@@ -0,0 +1,8 @@
+(:JIQS: ShouldRun; Output="([ [ [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ] ], [ [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ] ], [ [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ], [ 3, 3, 3, 3, 3 ] ] ], [ [ [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ] ], [ [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ] ], [ [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ], [ "3", "3", "3", "3", "3" ] ] ], [ 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4, 34.4 ], [ [ 78, 78 ], [ 78, 78 ] ], [ [ "-78.3", "-78.3" ], [ "-78.3", "-78.3" ] ], [ [ -78.3, -78.3 ], [ -78.3, -78.3 ] ])":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:full([3,4,5], 3, {"type": "integer"}),
+numpy:full([3,4,5], 3, {"type": "string"}),
+numpy:full([100], 34.4, {"type": "double"}),
+numpy:full([2, 2], 78.3, {"type": ""}),
+numpy:full([2, 2], -78.3, {"type": "string"}),
+numpy:full([2, 2], -78.3, {"type": "double"})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_identity.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_identity.jq
new file mode 100644
index 0000000000..e89467ec1a
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_identity.jq
@@ -0,0 +1,7 @@
+(:JIQS: ShouldRun; Output="([ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ], [ [ "1", "0", "0", "0", "0", "0", "0", "0", "0", "0" ], [ "0", "1", "0", "0", "0", "0", "0", "0", "0", "0" ], [ "0", "0", "1", "0", "0", "0", "0", "0", "0", "0" ], [ "0", "0", "0", "1", "0", "0", "0", "0", "0", "0" ], [ "0", "0", "0", "0", "1", "0", "0", "0", "0", "0" ], [ "0", "0", "0", "0", "0", "1", "0", "0", "0", "0" ], [ "0", "0", "0", "0", "0", "0", "1", "0", "0", "0" ], [ "0", "0", "0", "0", "0", "0", "0", "1", "0", "0" ], [ "0", "0", "0", "0", "0", "0", "0", "0", "1", "0" ], [ "0", "0", "0", "0", "0", "0", "0", "0", "0", "1" ] ], [ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ], [ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ], [ ])":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:identity(10, {"type": ""}),
+numpy:identity(10, {"type": "string"}),
+numpy:identity(10, {"type": "double"}),
+numpy:identity(57, {"type": ""}),
+numpy:identity(0, {"type": ""})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_linspace.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_linspace.jq
new file mode 100644
index 0000000000..550fc8b431
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_linspace.jq
@@ -0,0 +1,12 @@
+(:JIQS: ShouldRun; Output="([ 3, 4.714285714285714, 6.428571428571429, 8.142857142857142, 9.857142857142858, 11.571428571428571, 13.285714285714285, 15 ], [ 3, 4.5, 6, 7.5, 9, 10.5, 12, 13.5 ], [ 3, 4.714285714285714, 6.428571428571429, 8.142857142857142, 9.857142857142858, 11.571428571428571, 13.285714285714285, 15 ], 1.7142857142857142, [ 3, 4.5, 6, 7.5, 9, 10.5, 12, 13.5 ], 1.5, [ 16, 15.857142857142858, 15.714285714285714, 15.571428571428571, 15.428571428571429, 15.285714285714286, 15.142857142857142, 15 ], [ 15, 15, 15, 15, 15 ], 0, [ -15, -7.5, 0, 7.5, 15 ], 7.5, [ -15, -9, -3, 3, 9 ], 6, [ -127, -120.95652173913044, -114.91304347826087, -108.86956521739131, -102.82608695652173, -96.78260869565217, -90.73913043478261, -84.69565217391303, -78.65217391304347, -72.6086956521739, -66.56521739130434, -60.52173913043478, -54.47826086956522, -48.434782608695656, -42.39130434782608, -36.347826086956516, -30.304347826086953, -24.26086956521739, -18.217391304347828, -12.173913043478251, -6.130434782608688, -0.08695652173912549, 5.956521739130437, 12, 18.043478260869563, 24.086956521739125, 30.13043478260869, 36.17391304347828, 42.21739130434784, 48.260869565217405, 54.30434782608697, 60.34782608695653, 66.3913043478261, 72.43478260869566, 78.47826086956522, 84.52173913043478, 90.56521739130434, 96.6086956521739, 102.6521739130435, 108.69565217391306, 114.73913043478262, 120.78260869565219, 126.82608695652175, 132.8695652173913, 138.91304347826087, 144.95653 ], 6.043478260869565, [ -30, -27.857142857142858, -25.714285714285715, -23.57142857142857, -21.42857142857143, -19.285714285714285, -17.142857142857142, -15 ])":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:linspace(3, 15, {"num": 8, "endpoint": true, "retstep": false}),
+numpy:linspace(3, 15, {"num": 8, "endpoint": false, "retstep": false}),
+numpy:linspace(3, 15, {"num": 8, "endpoint": true, "retstep": true}),
+numpy:linspace(3, 15, {"num": 8, "endpoint": false, "retstep": true}),
+numpy:linspace(16, 15, {"num": 8, "endpoint": true, "retstep": false}),
+numpy:linspace(15, 15, {"num": 5, "endpoint": true, "retstep": true}),
+numpy:linspace(-15, 15, {"num": 5, "endpoint": true, "retstep": true}),
+numpy:linspace(-15, 15, {"num": 5, "endpoint": false, "retstep": true}),
+numpy:linspace(-127, 151, {"num": 46, "endpoint": false, "retstep": true}),
+numpy:linspace(-30, -15, {"num": 8, "endpoint": true, "retstep": false})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq
new file mode 100644
index 0000000000..2c1613db41
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_logspace.jq
@@ -0,0 +1,10 @@
+(:JIQS: ShouldRun; Output="([ 100, 177.82794, 316.22775, 562.3413 ], [ 100, 215.44347, 464.15887, 1000 ], [ 1.2589254, 1.5488166, 1.9054607, 2.3442287, 2.8840315, 3.5481339, 4.3651586, 5.370318, 6.6069345, 8.128305 ], [ 1.2589254, 1.5848932, 1.9952623, 2.5118864, 3.1622777, 3.9810717, 5.0118723, 6.3095737, 7.943282, 10 ], [ 100, 112.20184, 125.89254, 141.25375, 158.48932, 177.82794, 199.52623, 223.87212, 251.18864, 281.8383, 316.22775, 354.8134, 398.10718, 446.6836, 501.18723, 562.3413, 630.95734, 707.9458, 794.32825, 891.2509, 1000, 1122.0184, 1258.9254, 1412.5376, 1584.8932, 1778.2794, 1995.2623, 2238.7212, 2511.8865, 2818.3828, 3162.2776, 3548.1338, 3981.0718, 4466.836, 5011.8726, 5623.413, 6309.573, 7079.458, 7943.282, 8912.51, 10000, 11220.185, 12589.254, 14125.375, 15848.932, 17782.795, 19952.623, 22387.21, 25118.865, 28183.83, 31622.777, 35481.34, 39810.72, 44668.36, 50118.723, 56234.133, 63095.734, 70794.58, 79432.82, 89125.09, 100000, 112201.84, 125892.54, 141253.75, 158489.31, 177827.94, 199526.23, 223872.11, 251188.64, 281838.28, 316227.78, 354813.38, 398107.16, 446683.6, 501187.22, 562341.3, 630957.4, 707945.8, 794328.25, 891250.94, 1.0E6, 1.1220185E6, 1.2589254E6, 1.4125375E6, 1.5848932E6, 1.7782794E6, 1.9952624E6, 2.2387212E6, 2.5118864E6, 2.818383E6, 3.1622778E6, 3.548134E6, 3.9810716E6, 4.466836E6, 5.0118724E6, 5.6234136E6, 6.3095736E6, 7.0794576E6, 7.9432824E6, 8.9125048E6 ], [ 0.1, 0.12589253, 0.15848932, 0.19952624, 0.25118864, 0.31622776, 0.39810717, 0.5011872, 0.63095737, 0.7943282 ], [ 1, 0.63095737, 0.39810717, 0.25118864, 0.15848932, 0.1, 0.06309573, 0.039810717, 0.025118865, 0.015848933 ], [ 0.1, 0.021544347, 0.004641589, 0.001 ])":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:logspace(2.0, 3.0,{"num": 4, "endpoint": false}),
+numpy:logspace(2.0, 3.0,{"num": 4, "endpoint": true}),
+numpy:logspace(0.1, 1.0,{"num": 10, "endpoint": false}),
+numpy:logspace(0.1, 1.0,{"num": 10, "endpoint": true}),
+numpy:logspace(2, 7,{"num": 100, "endpoint": false}),
+numpy:logspace(-1, 0,{"num": 10, "endpoint": false}),
+numpy:logspace(0, -2,{"num": 10, "endpoint": false}),
+numpy:logspace(-1, -3,{"num": 4, "endpoint": true})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_max.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_max.jq
new file mode 100644
index 0000000000..c6f394b53c
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_max.jq
@@ -0,0 +1,15 @@
+(:JIQS: ShouldRun; Output="([ 2, 3 ], [ 1, 3 ], [ 2, 5, 8 ], [ 6, 7, 8 ], [ [ 4, 5, 6, 7 ], [ 12, 13, 14, 15 ] ], [ [ 8, 9, 10, 11 ], [ 12, 13, 14, 15 ] ], [ [ 3, 7 ], [ 11, 15 ] ], [ 15, 17, 25 ], [ 25, 22 ], 19, 19, 20, 19)":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:max([[0, 1], [2, 3]], {"axis": 0}),
+numpy:max([[0, 1], [2, 3]], {"axis": 1}),
+numpy:max([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 1}),
+numpy:max([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 0}),
+numpy:max([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 1}),
+numpy:max([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 0}),
+numpy:max([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 2}),
+numpy:max([[10, 17, 25], [15, 11, 22]], {"axis": 0}),
+numpy:max([[10, 17, 25], [15, 11, 22]], {"axis": 1}),
+numpy:max(numpy:arange(20, {"start":5})),
+numpy:max(numpy:arange(20, {"start":5}), {"axis": 0}),
+numpy:max(numpy:arange(20, {"start":5}), {"axis": 0, "initial": 20}),
+numpy:max(numpy:arange(20, {"start":5}), { "initial": 0})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_mean.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_mean.jq
new file mode 100644
index 0000000000..7d1f1f0a5e
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_mean.jq
@@ -0,0 +1,13 @@
+(:JIQS: ShouldRun; Output="(2.5, [ 2, 3 ], [ 1.5, 3.5 ], 12, [ 10, 11.3333333333, 14.6666666667 ], [ 9, 12, 15 ], 14.5, [ [ [ 0, 1, 2, 3, 4 ], [ 5, 6, 7, 8, 9 ], [ 10, 11, 12, 13, 14 ] ], [ [ 15, 16, 17, 18, 19 ], [ 20, 21, 22, 23, 24 ], [ 25, 26, 27, 28, 29 ] ] ], [ [ [ 7.5, 8.5, 9.5, 10.5, 11.5 ], [ 12.5, 13.5, 14.5, 15.5, 16.5 ], [ 17.5, 18.5, 19.5, 20.5, 21.5 ] ] ], [ [ [ 5, 6, 7, 8, 9 ], [ 20, 21, 22, 23, 24 ] ] ], [ [ [ 2, 7, 12 ], [ 17, 22, 27 ] ] ])":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:mean([[1, 2], [3, 4]]),
+numpy:mean([[1, 2], [3, 4]], {"axis": 0}),
+numpy:mean([[1, 2], [3, 4]], {"axis": 1}),
+numpy:mean([[5, 9, 13], [14, 10, 12], [11, 15, 19]]),
+numpy:mean([[5, 9, 13], [14, 10, 12], [11, 15, 19]], {"axis": 0}),
+numpy:mean([[5, 9, 13], [14, 10, 12], [11, 15, 19]], {"axis": 1}),
+numpy:mean([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]]),
+numpy:mean([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 0}),
+numpy:mean([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 1}),
+numpy:mean([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 2}),
+numpy:mean([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 3})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_median.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_median.jq
new file mode 100644
index 0000000000..d298863916
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_median.jq
@@ -0,0 +1,18 @@
+(:JIQS: ShouldRun; Output="(2.5, [ 2, 3 ], [ 1.5, 3.5 ], 12, [ 11, 10, 13 ], [ 9, 12, 15 ], 14.5, [ [ [ 0, 1, 2, 3, 4 ], [ 5, 6, 7, 8, 9 ], [ 10, 11, 12, 13, 14 ] ], [ [ 15, 16, 17, 18, 19 ], [ 20, 21, 22, 23, 24 ], [ 25, 26, 27, 28, 29 ] ] ], [ [ [ 7.5, 8.5, 9.5, 10.5, 11.5 ], [ 12.5, 13.5, 14.5, 15.5, 16.5 ], [ 17.5, 18.5, 19.5, 20.5, 21.5 ] ] ], [ [ [ 5, 6, 7, 8, 9 ], [ 20, 21, 22, 23, 24 ] ] ], [ [ [ 2, 7, 12 ], [ 17, 22, 27 ] ] ], 2.5, [ [ [ 1, 2, 3 ], [ 2, 4, 5 ] ] ], [ [ [ 1, 2, 3 ], [ 2, 4, 5 ] ] ], [ [ [ 1.5, 3, 4 ] ] ], [ [ [ 2, 4 ] ] ])":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:median([[1, 2], [3, 4]]),
+numpy:median([[1, 2], [3, 4]], {"axis": 0}),
+numpy:median([[1, 2], [3, 4]], {"axis": 1}),
+numpy:median([[5, 9, 13], [14, 10, 12], [11, 15, 19]]),
+numpy:median([[5, 9, 13], [14, 10, 12], [11, 15, 19]], {"axis": 0}),
+numpy:median([[5, 9, 13], [14, 10, 12], [11, 15, 19]], {"axis": 1}),
+numpy:median([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]]),
+numpy:median([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 0}),
+numpy:median([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 1}),
+numpy:median([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 2}),
+numpy:median([[[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]],[[15, 16, 17, 18, 19],[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]]]], {"axis": 3}),
+numpy:median([[[[1,2,3],[2,4,5]]]]),
+numpy:median([[[[1,2,3],[2,4,5]]]], {"axis": 0}),
+numpy:median([[[[1,2,3],[2,4,5]]]], {"axis": 1}),
+numpy:median([[[[1,2,3],[2,4,5]]]], {"axis": 2}),
+numpy:median([[[[1,2,3],[2,4,5]]]], {"axis": 3})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_min.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_min.jq
new file mode 100644
index 0000000000..aec4442a24
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_min.jq
@@ -0,0 +1,15 @@
+(:JIQS: ShouldRun; Output="([ 0, 1 ], [ 0, 2 ], [ 0, 3, 6 ], [ 0, 1, 2 ], [ [ 0, 1, 2, 3 ], [ 8, 9, 10, 11 ] ], [ [ 0, 1, 2, 3 ], [ 4, 5, 6, 7 ] ], [ [ 0, 4 ], [ 8, 12 ] ], [ 10, 11, 22 ], [ 10, 11 ], 5, 5, 0, 0)":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:min([[0, 1], [2, 3]], {"axis": 0}),
+numpy:min([[0, 1], [2, 3]], {"axis": 1}),
+numpy:min([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 1}),
+numpy:min([[0, 1, 2],[3, 4, 5], [6, 7, 8]], {"axis": 0}),
+numpy:min([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 1}),
+numpy:min([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 0}),
+numpy:min([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],[12, 13, 14, 15]]], {"axis": 2}),
+numpy:min([[10, 17, 25], [15, 11, 22]], {"axis": 0}),
+numpy:min([[10, 17, 25], [15, 11, 22]], {"axis": 1}),
+numpy:min(numpy:arange(20, {"start":5})),
+numpy:min(numpy:arange(20, {"start":5}), {"axis": 0}),
+numpy:min(numpy:arange(20, {"start":5}), {"axis": 0, "initial": 0}),
+numpy:min(numpy:arange(20, {"start":5}), { "initial": 0})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_ones.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_ones.jq
new file mode 100644
index 0000000000..de41ca029c
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_ones.jq
@@ -0,0 +1,8 @@
+(:JIQS: ShouldRun; Output="([ [ 1 ], [ 1 ], [ 1 ], [ 1 ] ], [ [ 1 ], [ 1 ], [ 1 ], [ 1 ] ], [ "1", "1", "1", "1", "1", "1", "1" ], [ [ 1, 1, 1, 1 ], [ 1, 1, 1, 1 ], [ 1, 1, 1, 1 ] ], [ [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ], [ [ 1, 1, 1 ], [ 1, 1, 1 ] ] ], [ [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ], [ [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ], [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 1, 1 ] ] ] ])" :)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:ones([4, 1], {"type": "integer"}),
+numpy:ones([4, 1],{"type": "double"}),
+numpy:ones([7], {"type": "string"}),
+numpy:ones([3, 4], {"type": "integer"}),
+numpy:ones([7,2,3], {"type": "integer"}),
+numpy:ones([5,5,5,5],{"type": "double"})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq
new file mode 100644
index 0000000000..e84a6fae5e
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_random.jq
@@ -0,0 +1,9 @@
+(:JIQS: ShouldRun; Output="(1, 3, 4, 10, 600, 21, 256)":)
+import module namespace numpy = "jsoniq_numpy.jq";
+count([numpy:random()]),
+count(numpy:random([3])),
+count(numpy:random_uniform({"low": 0.5, "high": 1.0, "size": [4]})),
+count(numpy:random_randint(5, {"high": 10, "size": [10]})),
+count(flatten(numpy:random_randint(5, {"high": 10, "size": [10, 20, 3]}))),
+count(flatten(numpy:random([3, 7, 1, 1]))),
+count(flatten(numpy:random_uniform({"low": 0.5, "high": 1.0, "size": [4, 4, 4, 4]})))
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_reshape.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_reshape.jq
new file mode 100644
index 0000000000..f24107c20f
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_reshape.jq
@@ -0,0 +1,7 @@
+(:JIQS: ShouldRun; Output="([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ [ [ [ [ 0, 0 ], [ 0, 0 ], [ 0, 0 ] ] ] ] ], [ [ 0, 0 ], [ 0, 0 ], [ 0, 0 ] ], [ [ [ [ 0 ] ], [ [ 0 ] ] ], [ [ [ 0 ] ], [ [ 0 ] ] ], [ [ [ 0 ] ], [ [ 0 ] ] ] ], [ [ [ 1, 4, 2 ] ], [ [ 241, -2, 34 ] ], [ [ 432, 234, 1 ] ], [ [ 423, 43, 430 ] ] ])":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:reshape(numpy:zeros([5,6]), [30]),
+numpy:reshape(numpy:zeros([1,2,3]), [1, 1, 1, 3, 2]),
+numpy:reshape(numpy:zeros([1,2,3]), [3, 2]),
+numpy:reshape(numpy:zeros([1,2,3]), [3, 2, 1, 1]),
+numpy:reshape([1, 4, 2, 241, -2, 34, 432, 234, 1, 423, 43, 430], [4, 1, 3])
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_shape.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_shape.jq
new file mode 100644
index 0000000000..dc77b0ceeb
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_shape.jq
@@ -0,0 +1,7 @@
+(:JIQS: ShouldRun; Output="([ 1, 1, 2 ], [ 3, 2 ], [ 7 ], [ 1, 2, 3, 4, 5, 6, 7, 8 ])":)
+import module namespace utils = "jsoniq_utils.jq";
+import module namespace numpy = "jsoniq_numpy.jq";
+utils:shape([[[3,4]]]),
+utils:shape([[1,2], [3,4], [4, 5]]),
+utils:shape(numpy:arange(7)),
+utils:shape(numpy:ones([1, 2, 3, 4, 5, 6, 7, 8]))
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_sort.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_sort.jq
new file mode 100644
index 0000000000..3a6b501e8b
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_sort.jq
@@ -0,0 +1,11 @@
+(:JIQS: ShouldRun; Output="([ -1, 1, 2, 6, 7, 10 ], [ ], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 ], [ 1, 2, 3, 4, 5, 6, 7, 10 ], [ -1, 1, 2, 3, 4, 5, 6, 7 ], [ 1, 2, 2, 3, 5, 6, 7 ], [ 1, 1, 1, 1, 1, 1 ], [ -2, -1, 1, 2 ], [ -3, -2, -1, 1, 2 ])":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:sort([6, 7, 1, 2, 10, -1]),
+numpy:sort([]),
+numpy:sort(numpy:arange(25)),
+numpy:sort([10, 1, 2, 3, 4, 5, 6, 7]),
+numpy:sort([1, 2, 3, 4, 5, 6, 7, -1]),
+numpy:sort([1, 2, 3, 2, 5, 6, 7]),
+numpy:sort([1, 1, 1, 1, 1, 1]),
+numpy:sort([1, -1, 2, -2]),
+numpy:sort([1, 2, -1, -2, -3])
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_unique.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_unique.jq
new file mode 100644
index 0000000000..44dba55de2
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_unique.jq
@@ -0,0 +1,8 @@
+(:JIQS: ShouldRun; Output="([ 1, 2, 3 ], [ -3, -1, 2 ], [ -3, -2, -1, 1, 2, 3 ], [ -50, -49, -48, -47, -46, -45, -44, -43, -42, -41, -40, -39, -38, -37, -36, -35, -34, -33, -32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ], [ -6, -5, -1, 1, 2, 3, 4 ], [ ])":)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:unique([1,2,3]),
+numpy:unique([-1,2,-3]),
+numpy:unique([[-1, -2, 1], [2, 3, -3]]),
+numpy:unique(numpy:arange(30, {"start": -50})),
+numpy:unique([[[1, 2, 3], [4, -5, -6], [-1, 2, 3]]]),
+numpy:unique([])
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_zeros.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_zeros.jq
new file mode 100644
index 0000000000..d53b9bad58
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_numpy_zeros.jq
@@ -0,0 +1,8 @@
+(:JIQS: ShouldRun; Output="([ [ 0 ], [ 0 ], [ 0 ], [ 0 ] ], [ [ 0 ], [ 0 ], [ 0 ], [ 0 ] ], [ "0", "0", "0", "0", "0", "0", "0" ], [ [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ], [ [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ], [ [ 0, 0, 0 ], [ 0, 0, 0 ] ] ], [ [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ], [ [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ], [ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ] ] ] ])" :)
+import module namespace numpy = "jsoniq_numpy.jq";
+numpy:zeros([4, 1], {"type": "integer"}),
+numpy:zeros([4, 1], {"type": "double"}),
+numpy:zeros([7], {"type": "string"}),
+numpy:zeros([3, 4], {"type": "integer"}),
+numpy:zeros([7,2,3], {"type": "integer"}),
+numpy:zeros([5,5,5,5], {"type": "double"})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq
new file mode 100644
index 0000000000..7fcbe3c3dd
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_describe.jq
@@ -0,0 +1,31 @@
+(:JIQS: ShouldRun; Output="({ "label" : { "count" : 6, "mean" : 2.5, "std" : 1.8708287, "min" : 0, "max" : 5, "25%" : 1.25, "50%" : 2.5, "75%" : 3.75 } }, { "binaryLabel" : { "count" : 6, "mean" : 0.5, "std" : 0.5477226, "min" : 0, "max" : 1, "25%" : 0, "50%" : 0.5, "75%" : 1 } }, { "name" : { "count" : 6, "unique" : 6, "top" : "c", "frequency" : 1 } }, { "age" : { "count" : 6, "mean" : 22.5, "std" : 1.8708287, "min" : 20, "max" : 25, "25%" : 21.25, "50%" : 22.5, "75%" : 23.75 } }, { "weight" : { "count" : 6, "mean" : 62.95000000000001, "std" : 9.534097, "min" : 50, "max" : 75.6, "25%" : 56.625, "50%" : 63.25, "75%" : 69.2 } }, { "booleanCol" : { "count" : 4, "unique" : 2, "top" : false, "frequency" : 3 } }, { "nullCol" : { "count" : 6, "unique" : 1, "top" : null, "frequency" : 6 } }, { "stringCol" : { "count" : 6, "unique" : 6, "top" : "i am data entry 6", "frequency" : 1 } }, { "stringArrayCol" : { "count" : 6, "unique" : 5, "top" : [ "i", "am", "data", "entry", "3" ], "frequency" : 2 } }, { "intArrayCol" : { "count" : 6, "unique" : 6, "top" : [ 1, 2, 3 ], "frequency" : 1 } }, { "doubleArrayCol" : { "count" : 6, "unique" : 6, "top" : [ 1, 2, 3 ], "frequency" : 1 } }, { "doubleArrayArrayCol" : { "count" : 6, "unique" : 5, "top" : [ [ 1, 2, 3 ] ], "frequency" : 2 } })":)
+import module namespace pandas = "jsoniq_pandas.jq";
+
+declare type local:sample-type-with-arrays as {
+ "label": "integer",
+ "binaryLabel": "integer",
+ "name": "string",
+ "age": "integer",
+ "weight": "double",
+ "booleanCol": "boolean",
+ "nullCol": "null",
+ "stringCol": "string",
+ "stringArrayCol": ["string"],
+ "intArrayCol": ["integer"],
+ "doubleArrayCol": ["double"],
+ "doubleArrayArrayCol": [["double"]]
+};
+
+declare function local:order-by-keys($object as object*) as object* {
+ for $row in $object
+ return
+ {|
+ for $key in keys($row)
+ order by $key
+ return {$key: $row.$key}
+ |}
+};
+
+declare variable $file_data := json-file("../../../queries/sample-na-data-4.json");
+let $data := validate type local:sample-type-with-arrays* {$file_data}
+return local:order-by-keys($data=>pandas:describe())
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq
new file mode 100644
index 0000000000..d6a5685073
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna.jq
@@ -0,0 +1,21 @@
+(:JIQS: ShouldRun; Output="({ "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] }, { "label" : 1, "binaryLabel" : 0, "name" : "b", "age" : 21, "weight" : 55.3, "booleanCol" : false, "stringCol" : "i am data entry 2", "stringArrayCol" : [ "i", "am", "data", "entry", "2" ], "intArrayCol" : [ 4, 5, 6 ], "doubleArrayCol" : [ 4, 5, 6 ], "doubleArrayArrayCol" : [ [ 4, 5, 6 ] ] }, { "label" : 2, "binaryLabel" : 0, "name" : "c", "age" : 22, "weight" : 60.6, "booleanCol" : false, "stringCol" : "i am data entry 3", "stringArrayCol" : [ "i", "am", "data", "entry", "3" ], "intArrayCol" : [ 7, 8, 9 ], "doubleArrayCol" : [ 7, 8, 9 ], "doubleArrayArrayCol" : [ [ 7, 8, 9 ] ] }, { "label" : 3, "binaryLabel" : 1, "name" : "d", "age" : 23, "weight" : 65.9, "booleanCol" : false, "stringCol" : "i am data entry 4", "stringArrayCol" : [ "i", "am", "data", "entry", "4" ], "intArrayCol" : [ 1, 4, 7 ], "doubleArrayCol" : [ 1, 4, 7 ], "doubleArrayArrayCol" : [ [ 1, 4, 7 ] ] }, { "label" : 4, "binaryLabel" : 1, "name" : "e", "age" : 24, "weight" : 70.3, "booleanCol" : true, "stringCol" : "i am data entry 5", "stringArrayCol" : [ "i", "am", "data", "entry", "5" ], "intArrayCol" : [ 2, 5, 8 ], "doubleArrayCol" : [ 2, 5, 8 ], "doubleArrayArrayCol" : [ [ 2, 5, 8 ] ] }, { "label" : 5, "binaryLabel" : 1, "name" : "f", "age" : 25, "weight" : 75.6, "booleanCol" : true, "stringCol" : "i am data entry 6", "stringArrayCol" : [ "i", "am", "data", "entry", "6" ], "intArrayCol" : [ 3, 6, 9 ], "doubleArrayCol" : [ 3, 6, 9 ], "doubleArrayArrayCol" : [ [ 3, 6, 9 ] ] })":)
+import module namespace pandas = "jsoniq_pandas.jq";
+
+declare type local:sample-type-with-arrays as {
+ "label": "integer",
+ "binaryLabel": "integer",
+ "name": "string",
+ "age": "integer",
+ "weight": "double",
+ "booleanCol": "boolean",
+ "nullCol": "null",
+ "stringCol": "string",
+ "stringArrayCol": ["string"],
+ "intArrayCol": ["integer"],
+ "doubleArrayCol": ["double"],
+ "doubleArrayArrayCol": [["double"]]
+};
+
+declare variable $file_data := json-file("../../../queries/sample-na-data.json");
+let $data := validate type local:sample-type-with-arrays* {$file_data}
+return $data=>pandas:dropna({"axis": 1, "how": "any"})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna_rows.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna_rows.jq
new file mode 100644
index 0000000000..830ce16f01
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_dropna_rows.jq
@@ -0,0 +1,5 @@
+(:JIQS: ShouldRun; Output="({ "age" : 20, "binaryLabel" : 0, "booleanCol" : false, "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ], "doubleArrayCol" : [ 1, 2, 3 ], "intArrayCol" : [ 1, 2, 3 ], "label" : 0, "name" : "a", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "stringCol" : "i am data entry 1", "weight" : 50 }, { "age" : 21, "binaryLabel" : 0, "booleanCol" : false, "doubleArrayArrayCol" : [ [ 4, 5, 6 ] ], "doubleArrayCol" : [ 4, 5, 6 ], "intArrayCol" : [ 4, 5, 6 ], "label" : 1, "name" : "b", "stringArrayCol" : [ "i", "am", "data", "entry", "2" ], "stringCol" : "i am data entry 2", "weight" : 55.3 }, { "age" : 24, "binaryLabel" : 1, "booleanCol" : true, "doubleArrayArrayCol" : [ [ 2, 5, 8 ] ], "doubleArrayCol" : [ 2, 5, 8 ], "intArrayCol" : [ 2, 5, 8 ], "label" : 4, "name" : "e", "stringArrayCol" : [ "i", "am", "data", "entry", "5" ], "stringCol" : "i am data entry 5", "weight" : 70.3 }, { "age" : 25, "binaryLabel" : 1, "booleanCol" : true, "doubleArrayArrayCol" : [ [ 3, 6, 9 ] ], "doubleArrayCol" : [ 3, 6, 9 ], "intArrayCol" : [ 3, 6, 9 ], "label" : 5, "name" : "f", "stringArrayCol" : [ "i", "am", "data", "entry", "6" ], "stringCol" : "i am data entry 6", "weight" : 75.6 })":)
+import module namespace pandas = "jsoniq_pandas.jq";
+
+let $data := structured-json-file("../../../queries/sample-na-data-2.json")
+return $data=>pandas:dropna({"axis": 0, "how": "any"})
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq
new file mode 100644
index 0000000000..1aa643b8bc
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_isnull.jq
@@ -0,0 +1,24 @@
+(:JIQS: ShouldRun; Output="({ "anotherArray" : true, "name" : false, "other" : true, "other2" : false, "type" : false }, { "anotherArray" : false, "name" : false, "other" : false, "other2" : false, "type" : true }, { "anotherArray" : false, "name" : false, "other" : true, "other2" : true, "type" : false })":)
+import module namespace pandas = "jsoniq_pandas.jq";
+
+declare type local:sample-type as {
+ "name": ["string"],
+ "type": "string",
+ "other": ["string"],
+ "other2": "integer",
+ "anotherArray": [["integer"]]
+};
+
+declare function local:order-by-keys($object as object*) as object* {
+ for $row in $object
+ return
+ {|
+ for $key in keys($row)
+ order by $key
+ return {$key: $row.$key}
+ |}
+};
+
+declare variable $file_data := json-file("../../../queries/sample-na-data-3.json");
+let $data := validate type local:sample-type* {$file_data}
+return local:order-by-keys($data=>pandas:isnull())
\ No newline at end of file
diff --git a/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_sample.jq b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_sample.jq
new file mode 100644
index 0000000000..65d5eb8de5
--- /dev/null
+++ b/src/test/resources/test_files/runtime/numpy_lib/test_jsoniq_pandas_sample.jq
@@ -0,0 +1,21 @@
+(:JIQS: ShouldRun; Output="({ "label" : 4, "binaryLabel" : 1, "name" : "e", "age" : 24, "weight" : 70.3, "booleanCol" : true, "nullCol" : null, "stringCol" : "i am data entry 5", "stringArrayCol" : [ "i", "am", "data", "entry", "5" ], "intArrayCol" : [ 2, 5, 8 ], "doubleArrayCol" : [ 2, 5, 8 ], "doubleArrayArrayCol" : [ [ 2, 5, 8 ] ] }, { "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] }, { "label" : 0, "binaryLabel" : 0, "name" : "a", "age" : 20, "weight" : 50, "booleanCol" : false, "nullCol" : null, "stringCol" : "i am data entry 1", "stringArrayCol" : [ "i", "am", "data", "entry", "1" ], "intArrayCol" : [ 1, 2, 3 ], "doubleArrayCol" : [ 1, 2, 3 ], "doubleArrayArrayCol" : [ [ 1, 2, 3 ] ] })":)
+import module namespace pandas = "jsoniq_pandas.jq";
+
+declare type local:sample-type-with-arrays as {
+ "label": "integer",
+ "binaryLabel": "integer",
+ "name": "string",
+ "age": "integer",
+ "weight": "double",
+ "booleanCol": "boolean",
+ "nullCol": "null",
+ "stringCol": "string",
+ "stringArrayCol": ["string"],
+ "intArrayCol": ["integer"],
+ "doubleArrayCol": ["double"],
+ "doubleArrayArrayCol": [["double"]]
+};
+
+declare variable $file_data := json-file("../../../queries/sample-na-data.json");
+let $data := validate type local:sample-type-with-arrays* {$file_data}
+return $data=>pandas:sample(3, 3)
\ No newline at end of file
diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample1.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample1.jq
new file mode 100644
index 0000000000..f763388b59
--- /dev/null
+++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample1.jq
@@ -0,0 +1 @@
+/child::div1/child::div2
\ No newline at end of file
diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample10.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample10.jq
new file mode 100644
index 0000000000..f343e793c9
--- /dev/null
+++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample10.jq
@@ -0,0 +1 @@
+attribute(price)
\ No newline at end of file
diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample11.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample11.jq
new file mode 100644
index 0000000000..cd099475e5
--- /dev/null
+++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample11.jq
@@ -0,0 +1 @@
+parent::node()
\ No newline at end of file
diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample12.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample12.jq
new file mode 100644
index 0000000000..aab712bd9e
--- /dev/null
+++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample12.jq
@@ -0,0 +1 @@
+../parent::element(*)
\ No newline at end of file
diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample13.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample13.jq
new file mode 100644
index 0000000000..45c32a3443
--- /dev/null
+++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample13.jq
@@ -0,0 +1 @@
+ancestor-or-self::di/ancestor::p/parent::text()
\ No newline at end of file
diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample2.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample2.jq
new file mode 100644
index 0000000000..6015552c6e
--- /dev/null
+++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample2.jq
@@ -0,0 +1 @@
+parent::author/title
\ No newline at end of file
diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample3.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample3.jq
new file mode 100644
index 0000000000..2aeb4296d4
--- /dev/null
+++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample3.jq
@@ -0,0 +1 @@
+/child::book/child::chapter[fn:position() = 5]/child::section[fn:position() = 2]
\ No newline at end of file
diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample4.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample4.jq
new file mode 100644
index 0000000000..b8eeba9094
--- /dev/null
+++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample4.jq
@@ -0,0 +1 @@
+//book/chapter[5]/section[2]
\ No newline at end of file
diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample5.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample5.jq
new file mode 100644
index 0000000000..ab3d4d9c69
--- /dev/null
+++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample5.jq
@@ -0,0 +1 @@
+book/(chapter or appendix)//section
\ No newline at end of file
diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample6.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample6.jq
new file mode 100644
index 0000000000..e683a01b4c
--- /dev/null
+++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample6.jq
@@ -0,0 +1 @@
+chapter//para//@version
\ No newline at end of file
diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample7.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample7.jq
new file mode 100644
index 0000000000..add02a169d
--- /dev/null
+++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample7.jq
@@ -0,0 +1 @@
+attribute::*
\ No newline at end of file
diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample8.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample8.jq
new file mode 100644
index 0000000000..9ab7b2eaa0
--- /dev/null
+++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample8.jq
@@ -0,0 +1 @@
+parent::*
\ No newline at end of file
diff --git a/src/test/resources/test_files/xml/compile-xpath/XPathExample9.jq b/src/test/resources/test_files/xml/compile-xpath/XPathExample9.jq
new file mode 100644
index 0000000000..5b35c4593d
--- /dev/null
+++ b/src/test/resources/test_files/xml/compile-xpath/XPathExample9.jq
@@ -0,0 +1 @@
+child::*/child::para
\ No newline at end of file
diff --git a/src/test/resources/test_files/xml/read-xml/FunctionXmlDoc1.jq b/src/test/resources/test_files/xml/read-xml/FunctionXmlDoc1.jq
new file mode 100644
index 0000000000..2c9da0cbe2
--- /dev/null
+++ b/src/test/resources/test_files/xml/read-xml/FunctionXmlDoc1.jq
@@ -0,0 +1,2 @@
+(:JIQS: ShouldRun; Output="3" :)
+xml-doc("../../../queries/xml/books.xml")