diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 714ed83a8e..aa61b93a52 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -115,3 +115,26 @@ jobs: - name: MLTestsNativeDeactivated run: mvn -Dtest=MLTestsNativeDeactivated test + tests4: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up Java 11 + uses: actions/setup-java@v3 + with: + java-version: 11 + distribution: adopt + - name: Cache Maven packages + uses: actions/cache@v3 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + - name: Install with Maven + run: mvn install -DskipTests -Dgpg.skip --quiet + - name: Compile with Maven + run: mvn clean compile assembly:single + - name: DeltaUpdateRuntimeTests + run: mvn -Dtest=DeltaUpdateRuntimeTests test diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fb9f08fd3a..e1d54fa72e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -79,8 +79,13 @@ NativeFLWORRuntimeTestsParallelismDeactivated: script: - mvn -Dtest=NativeFLWORRuntimeTestsParallelismDeactivated test -StaticTypingTest: - stage: tests3 +updatedeltaruntime-test: + stage: test + script: + - mvn -Dtest=DeltaUpdateRuntimeTests test + +statictyping-test: + stage: test script: - mvn -Dtest=StaticTypeTests test diff --git a/README.md b/README.md index e1fee9832a..7e4866c151 100644 --- a/README.md +++ b/README.md @@ -16,4 +16,4 @@ The documentation also contains an introduction specific to RumbleDB and how you [The documentation of the current master (for the adventurous and curious) is available here.](http://sparksoniq.readthedocs.io/en/latest/) -RumbleDB is an effort involving many researchers and ETH Zurich students: code and support by Stefan Irimescu, Ghislain Fourny, Gustavo Alonso, Renato Marroquin, Rodrigo Bruno, Falko Noé, Ioana Stefan, Andrea Rinaldi, Stevan Mihajlovic, Mario Arduini, Can Berker Çıkış, Elwin Stephan, David Dao, Zirun Wang, Ingo Müller, Dan-Ovidiu Graur, Thomas Zhou, Olivier Goerens, Alexandru Meterez, Remo Röthlisberger, Dominik Bruggisser, David Loughlin. +RumbleDB is an effort involving many researchers and ETH Zurich students: code and support by Stefan Irimescu, Ghislain Fourny, Gustavo Alonso, Renato Marroquin, Rodrigo Bruno, Falko Noé, Ioana Stefan, Andrea Rinaldi, Stevan Mihajlovic, Mario Arduini, Can Berker Çıkış, Elwin Stephan, David Dao, Zirun Wang, Ingo Müller, Dan-Ovidiu Graur, Thomas Zhou, Olivier Goerens, Alexandru Meterez, Remo Röthlisberger, Dominik Bruggisser, David Loughlin, David Buzatu. diff --git a/docs/Getting started.md b/docs/Getting started.md index 64e878246f..a06278e1cd 100644 --- a/docs/Getting started.md +++ b/docs/Getting started.md @@ -78,11 +78,11 @@ If you use Linux, Florian Kellner also kindly contributed an [installation scrip RumbleDB requires an Apache Spark installation on Linux, Mac or Windows. -It is straightforward to directly [download it](https://spark.apache.org/downloads.html), unpack it and put it at a location of your choosing. We recommend to pick Spark 3.2.2. Let us call this location SPARK_HOME (it is a good idea, in fact to also define an environment variable SPARK_HOME pointing to the absolute path of this location). +It is straightforward to directly [download it](https://spark.apache.org/downloads.html), unpack it and put it at a location of your choosing. We recommend to pick Spark 3.4.3. Let us call this location SPARK_HOME (it is a good idea, in fact to also define an environment variable SPARK_HOME pointing to the absolute path of this location). What you need to do then is to add the subdirectory "bin" within the unpacked directory to the PATH variable. On macOS this is done by adding - export SPARK_HOME=/path/to/spark-3.2.2-bin-hadoop3.2 + export SPARK_HOME=/path/to/spark-3.4.3-bin-hadoop3.2 export PATH=$SPARK_HOME/bin:$PATH (with SPARK_HOME appropriately set to match your unzipped Spark directory) to the file .zshrc in your home directory, then making sure to force the change with @@ -111,9 +111,11 @@ Like Spark, RumbleDB is just a download and no installation is required. In order to run RumbleDB, you simply need to download one of the small .jar files from the [download page](https://github.com/RumbleDB/rumble/releases) and put it in a directory of your choice, for example, right besides your data. -If you use Spark 3.2+, use rumbledb-1.22.0-for-spark-3.2.jar. +If you use Spark 3.4+, use rumbledb-1.22.0-for-spark-3.4.jar. -If you use Spark 3.3+, use rumbledb-1.22.0-for-spark-3.3.jar. +If you use Spark 3.5+, use rumbledb-1.22.0-for-spark-3.5.jar. + +If you use Spark 4.0+ (preview), use rumbledb-1.22.0-for-spark-4.0.jar. These jars do not embed Spark, since you chose to set it up separately. They will work with your Spark installation with the spark-submit command. diff --git a/docs/install.md b/docs/install.md index d3bc0bebd2..98f158a46e 100644 --- a/docs/install.md +++ b/docs/install.md @@ -7,9 +7,9 @@ We show here how to install RumbleDB from the github repository if you wish to d The following software is required: - [Java SE](http://www.oracle.com/technetwork/java/javase/downloads/index.html) 8 (last tested on OpenJDK 8u251). The version of Java is important, as Spark only works with Java 8 or java 11. -- [Spark](https://spark.apache.org/), version 3.1.2 (for example) +- [Spark](https://spark.apache.org/), version 3.4.3 (for example) - [Ant](http://www.ant.org/), version 1.11.1 -- [ANTLR](http://www.ant.org/), version 4.8 (supplied in our repository) +- [ANTLR](http://www.ant.org/), version 4.9.3 (supplied in our repository) - [Maven](https://maven.apache.org/) 3.6.0 Important: the ANTLR version varies with the Spark version, because Spark is also shipped with an ANTLR runtime (example: Spark 3.0 and 3.1 is with ANTLR 4.7, Spark 3.2 with ANTLR 4.8). The ANTLR runtime MUST match the ANTLR generator used to generate the RumbleDB jar file. diff --git a/pom.xml b/pom.xml index 715784bf3b..a6d197d96c 100644 --- a/pom.xml +++ b/pom.xml @@ -206,22 +206,32 @@ + + org.openjdk.jmh + jmh-core + 1.37 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.37 + org.apache.spark spark-core_2.13 - 4.0.0-preview1 + 4.0.0-preview2 provided org.apache.spark spark-sql_2.13 - 4.0.0-preview1 + 4.0.0-preview2 provided org.apache.spark spark-mllib_2.13 - 4.0.0-preview1 + 4.0.0-preview2 provided @@ -233,7 +243,7 @@ org.apache.spark spark-avro_2.13 - 4.0.0-preview1 + 4.0.0-preview2 org.antlr @@ -266,36 +276,46 @@ commons-lang3 3.14.0 - + + commons-net + commons-net + 3.1 + + commons-io commons-io 2.11.0 - - org.apache.httpcomponents - httpclient - 4.5.13 - - - - org.jgrapht - jgrapht-core - 1.4.0 - - - joda-time - joda-time - 2.10.6 - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - 2.17.1 - + + org.apache.httpcomponents + httpclient + 4.5.13 + + + + org.jgrapht + jgrapht-core + 1.4.0 + + + joda-time + joda-time + 2.10.6 + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + 2.17.1 + + + io.delta + delta-spark_2.13 + 3.2.1 + diff --git a/src/main/java/org/rumbledb/api/Item.java b/src/main/java/org/rumbledb/api/Item.java index ae0feeb357..27ef9d70be 100644 --- a/src/main/java/org/rumbledb/api/Item.java +++ b/src/main/java/org/rumbledb/api/Item.java @@ -692,17 +692,113 @@ default boolean isNaN() { * @return an int representing nestedness of the item inside transform expressions. */ default int getMutabilityLevel() { - return 0; + return -1; } /** - * Sets the mutability level of the item. + * Sets the mutability level of the item to a supplied value. * - * @param mutabilityLevel the new mutability level. + * @param mutabilityLevel new mutability level. */ default void setMutabilityLevel(int mutabilityLevel) { } + /** + * Returns the top level ID of the item. + * + * @return int representing the rowID of the item within a DeltaFile. + */ + default long getTopLevelID() { + return -1; + } + + /** + * Sets the top level ID of the item to a supplied value. + * + * @param topLevelID new top level ID. + */ + default void setTopLevelID(long topLevelID) { + } + + /** + * Returns the path from the top level object of a DeltaFile for the item. + * + * @return String representing the path of the item from the top level within a DeltaFile. + */ + default String getPathIn() { + return "null"; + } + + /** + * Sets the path from the top level object of a DeltaFile for the item to a supplied value. + * + * @param pathIn new path from top level. + */ + default void setPathIn(String pathIn) { + } + + /** + * Returns the location of the DeltaFile for the item. + * + * @return String representing the location of the DeltaFile for the item. + */ + default String getTableLocation() { + return null; + } + + + /** + * Sets the location of the DeltaFile for the item to a supplied value. + * + * @param location new location of the DeltaFile for the item. + */ + default void setTableLocation(String location) { + } + + /** + * Returns the SparkSQL value of the item for use in a query. + * + * @return String representing the SparkSQL value of the item. + */ + default String getSparkSQLValue() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + /** + * Returns the SparkSQL value of the item for use in a query. + * + * @return String representing the SparkSQL value of the item. + */ + default String getSparkSQLValue(ItemType itemType) { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + /** + * Returns the SparkSQL type of the item for use in a query. + * + * @return String representing the SparkSQL type of the item. + */ + default String getSparkSQLType() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType()); + } + + /** + * Tests for physical equality. The semantics are that of the eq operator. + * + * @param other another item. + * @return true it is equal to other, false otherwise. + */ + default boolean physicalEquals(Object other) { + if (!(other instanceof Item)) { + return false; + } + Item otherItem = (Item) other; + if (this.getTopLevelID() == -1 || otherItem.getTopLevelID() == -1) { + return System.identityHashCode(this) == System.identityHashCode(otherItem); + } + return this.getTopLevelID() == otherItem.getTopLevelID() && this.getPathIn().equals(otherItem.getPathIn()); + } + /** * Tests for logical equality. The semantics are that of the eq operator. * diff --git a/src/main/java/org/rumbledb/api/Rumble.java b/src/main/java/org/rumbledb/api/Rumble.java index d802afd8c2..611df17a69 100644 --- a/src/main/java/org/rumbledb/api/Rumble.java +++ b/src/main/java/org/rumbledb/api/Rumble.java @@ -6,6 +6,7 @@ import org.rumbledb.expressions.module.MainModule; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.update.PendingUpdateList; + import sparksoniq.spark.SparkSessionManager; import java.io.IOException; @@ -52,11 +53,6 @@ public SequenceOfItems runQuery(String query) { this.configuration ); - if (iterator.isUpdating()) { - PendingUpdateList pul = iterator.getPendingUpdateList(dynamicContext); - pul.applyUpdates(iterator.getMetadata()); - } - return new SequenceOfItems(iterator, dynamicContext, this.configuration); } diff --git a/src/main/java/org/rumbledb/api/SequenceOfItems.java b/src/main/java/org/rumbledb/api/SequenceOfItems.java index c8cec7beca..7a32fde406 100644 --- a/src/main/java/org/rumbledb/api/SequenceOfItems.java +++ b/src/main/java/org/rumbledb/api/SequenceOfItems.java @@ -7,8 +7,10 @@ import org.apache.spark.sql.Row; import org.rumbledb.config.RumbleRuntimeConfiguration; import org.rumbledb.context.DynamicContext; +import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.RuntimeIterator; +import org.rumbledb.runtime.update.PendingUpdateList; import sparksoniq.spark.SparkSessionManager; /** @@ -51,7 +53,9 @@ public SequenceOfItems( * Opens the iterator. */ public void open() { - this.iterator.open(this.dynamicContext); + if (this.isMaterialisable()) { + this.iterator.open(this.dynamicContext); + } this.isOpen = true; } @@ -68,7 +72,9 @@ public boolean isOpen() { * Closes the iterator. */ public void close() { - this.iterator.close(); + if (this.isOpen) { + this.iterator.close(); + } this.isOpen = false; } @@ -78,6 +84,9 @@ public void close() { * @return true if there are more items, false otherwise. */ public boolean hasNext() { + if (!this.isMaterialisable()) { + return false; + } return this.iterator.hasNext(); } @@ -88,6 +97,9 @@ public boolean hasNext() { * @return the next item. */ public Item next() { + if (!this.isMaterialisable()) { + return ItemFactory.getInstance().createNullItem(); + } return this.iterator.next(); } @@ -109,6 +121,24 @@ public boolean availableAsDataFrame() { return this.iterator.isDataFrame(); } + /** + * Returns whether the iterator is updating + * + * @return true if updating; otherwise false. + */ + public boolean availableAsPUL() { + return this.iterator.isUpdating(); + } + + /** + * Return whether the iterator of the sequence should be evaluated to materialise the sequence of items. + * + * @return true if materialisable; otherwise false + */ + private boolean isMaterialisable() { + return !(this.availableAsPUL() && !this.iterator.isSequential()); + } + /** * Returns the sequence of items as an RDD of Items rather than iterating over them locally. * It is not possible to do so if the iterator is open. @@ -116,6 +146,9 @@ public boolean availableAsDataFrame() { * @return an RDD of Items. */ public JavaRDD getAsRDD() { + if (!this.isMaterialisable()) { + return SparkSessionManager.getInstance().getJavaSparkContext().emptyRDD(); + } if (this.isOpen) { throw new RuntimeException("Cannot obtain an RDD if the iterator is open."); } @@ -129,12 +162,23 @@ public JavaRDD getAsRDD() { * @return a data frame. */ public Dataset getAsDataFrame() { + if (!this.isMaterialisable()) { + return SparkSessionManager.getInstance().getOrCreateSession().emptyDataFrame(); + } if (this.isOpen) { throw new RuntimeException("Cannot obtain an RDD if the iterator is open."); } return this.iterator.getDataFrame(this.dynamicContext).getDataFrame(); } + /** + * Applies the PUL available when the iterator is updating. + */ + public void applyPUL() { + PendingUpdateList pul = this.iterator.getPendingUpdateList(this.dynamicContext); + pul.applyUpdates(this.iterator.getMetadata()); + } + /* * Populates a list of items with the output. * @@ -142,6 +186,9 @@ public Dataset getAsDataFrame() { */ public long populateList(List resultList) { resultList.clear(); + if (!this.isMaterialisable()) { + return -1; + } this.iterator.open(this.dynamicContext); Item result = null; if (this.iterator.hasNext()) { @@ -176,6 +223,9 @@ public long populateList(List resultList) { public long populateListWithWarningOnlyIfCapReached(List resultList) { if (this.availableAsRDD()) { + if (!this.isMaterialisable()) { + return -1; + } JavaRDD rdd = this.iterator.getRDD(this.dynamicContext); return SparkSessionManager.collectRDDwithLimitWarningOnly(rdd, resultList); } else { @@ -183,5 +233,4 @@ public long populateListWithWarningOnlyIfCapReached(List resultList) { } } - } diff --git a/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java b/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java index 9d6cbb99b9..25c350a557 100644 --- a/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java +++ b/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java @@ -118,7 +118,8 @@ public List runQuery() throws IOException { !(this.configuration.getOutputFormat().equals("json") || this.configuration.getOutputFormat().equals("tyson") || this.configuration.getOutputFormat().equals("xml-json-hybrid") - || this.configuration.getOutputFormat().equals("yaml")) + || this.configuration.getOutputFormat().equals("yaml") + || this.configuration.getOutputFormat().equals("delta")) && !sequence.availableAsDataFrame() ) { @@ -185,6 +186,10 @@ public List runQuery() throws IOException { } } + if (this.configuration.applyUpdates() && sequence.availableAsPUL() && outputPath != null) { + sequence.applyPUL(); + } + long endTime = System.currentTimeMillis(); long totalTime = endTime - startTime; if (logPath != null) { @@ -225,6 +230,9 @@ public long runInteractive(String query, List resultList) throws IOExcepti if (!sequence.availableAsRDD()) { return sequence.populateList(resultList); } + if (this.configuration.applyUpdates() && sequence.availableAsPUL()) { + sequence.applyPUL(); + } resultList.clear(); JavaRDD rdd = sequence.getAsRDD(); return SparkSessionManager.collectRDDwithLimitWarningOnly(rdd, resultList); diff --git a/src/main/java/org/rumbledb/cli/Main.java b/src/main/java/org/rumbledb/cli/Main.java index e1a5cbeac1..bec7ac697f 100644 --- a/src/main/java/org/rumbledb/cli/Main.java +++ b/src/main/java/org/rumbledb/cli/Main.java @@ -38,17 +38,15 @@ public class Main { public static void main(String[] args) throws IOException { String javaVersion = System.getProperty("java.version"); if ( - !javaVersion.startsWith("17") - && !javaVersion.startsWith("18") - && !javaVersion.startsWith("19") - && !javaVersion.startsWith("20") + !javaVersion.startsWith("11") + && !javaVersion.startsWith("17") && !javaVersion.startsWith("21") ) { - System.err.println("[Error] RumbleDB requires at least Java 17 (17 being the default Spark 4 version)."); + System.err.println("[Error] RumbleDB requires Java 11, 17 or 21 (17 being the default Spark 4 version)."); System.err.println("Your Java version: " + System.getProperty("java.version")); - System.err.println("You can download Java 17 from https://adoptium.net/"); + System.err.println("You can download Java 11, 17 or 21 from https://adoptium.net/"); System.err.println( - "If you do have Java 17+, but the wrong version appears above, then it means you need to set your JAVA_HOME environment variable properly to point to Java 17+." + "If you do have Java 11, 17 or 21, but the wrong version appears above, then it means you need to set your JAVA_HOME environment variable properly to point to Java 11, 17 or 21." ); System.exit(43); } diff --git a/src/main/java/org/rumbledb/compiler/CloneVisitor.java b/src/main/java/org/rumbledb/compiler/CloneVisitor.java index 546af9628d..d308ed9104 100644 --- a/src/main/java/org/rumbledb/compiler/CloneVisitor.java +++ b/src/main/java/org/rumbledb/compiler/CloneVisitor.java @@ -448,7 +448,7 @@ public Node visitInlineFunctionExpr(InlineFunctionExpression expression, Node ar expression.getAnnotations(), expression.getName(), expression.getParams(), - expression.getReturnType(), + expression.getActualReturnType(), (StatementsAndOptionalExpr) visit(expression.getBody(), argument), expression.getMetadata() ); diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index 5e8a7ccc2c..e96188dbc4 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -656,7 +656,11 @@ public StaticContext visitProlog(Prolog prolog, StaticContext argument) { @Override public StaticContext visitProgram(Program program, StaticContext argument) { visitDescendants(program, argument); - ExecutionMode mergedExecutionMode = getHighestExecutionModeFromStatements(exitStatementChildren); + ExecutionMode mergedExecutionMode = program.getStatementsAndOptionalExpr().getHighestExecutionMode(); + for (Statement statement : exitStatementChildren) { + ExecutionMode statementExecMode = statement.getHighestExecutionMode(this.visitorConfig); + mergedExecutionMode = getHighestExecutionMode(mergedExecutionMode, statementExecMode); + } program.setHighestExecutionMode(mergedExecutionMode); return argument; } diff --git a/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java b/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java index 7bcd53bdd1..7614931dc4 100644 --- a/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java @@ -1,5 +1,9 @@ package org.rumbledb.compiler; +import org.rumbledb.context.BuiltinFunction; +import org.rumbledb.context.BuiltinFunctionCatalogue; +import org.rumbledb.context.FunctionIdentifier; +import org.rumbledb.context.StaticContext; import org.rumbledb.exceptions.InvalidUpdatingExpressionPositionException; import org.rumbledb.exceptions.SimpleExpressionMustBeVacuousException; import org.rumbledb.expressions.AbstractNodeVisitor; @@ -7,6 +11,8 @@ import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.ExpressionClassification; import org.rumbledb.expressions.Node; +import org.rumbledb.exceptions.UnknownFunctionCallException; +import org.rumbledb.exceptions.UpdatingFunctionHasReturnTypeException; import org.rumbledb.expressions.control.ConditionalExpression; import org.rumbledb.expressions.control.SwitchExpression; import org.rumbledb.expressions.control.TypeSwitchExpression; @@ -27,6 +33,7 @@ import org.rumbledb.expressions.scripting.loops.ReturnStatementClause; import org.rumbledb.expressions.scripting.statement.StatementsAndExpr; import org.rumbledb.expressions.scripting.statement.StatementsAndOptionalExpr; +import org.rumbledb.expressions.typing.TreatExpression; import org.rumbledb.expressions.update.AppendExpression; import org.rumbledb.expressions.update.CopyDeclaration; import org.rumbledb.expressions.update.DeleteExpression; @@ -34,6 +41,7 @@ import org.rumbledb.expressions.update.RenameExpression; import org.rumbledb.expressions.update.ReplaceExpression; import org.rumbledb.expressions.update.TransformExpression; +import org.rumbledb.types.FunctionSignature; import java.util.ArrayList; import java.util.List; @@ -51,14 +59,6 @@ protected ExpressionClassification defaultAction(Node node, ExpressionClassifica return expressionClassification; } - if (node instanceof StatementsAndExpr) { - ((StatementsAndExpr) node).setExpressionClassification(expressionClassification); - return expressionClassification; - } - if (node instanceof StatementsAndOptionalExpr) { - ((StatementsAndOptionalExpr) node).setExpressionClassification(expressionClassification); - return expressionClassification; - } if (node instanceof InlineFunctionExpression) { ((InlineFunctionExpression) node).setExpressionClassification(expressionClassification); return expressionClassification; @@ -88,6 +88,28 @@ public ExpressionClassification visitDescendants(Node node, ExpressionClassifica return result; } + @Override + public ExpressionClassification visitStatementsAndOptionalExpr( + StatementsAndOptionalExpr expression, + ExpressionClassification argument + ) { + this.visitDescendants(expression, argument); + Expression e = expression.getExpression(); + expression.setExpressionClassification(e.getExpressionClassification()); + return e.getExpressionClassification(); + } + + @Override + public ExpressionClassification visitStatementsAndExpr( + StatementsAndExpr expression, + ExpressionClassification argument + ) { + this.visitDescendants(expression, argument); + Expression e = expression.getExpression(); + expression.setExpressionClassification(e.getExpressionClassification()); + return e.getExpressionClassification(); + } + @Override public ExpressionClassification visitCommaExpression( CommaExpression expression, @@ -118,6 +140,21 @@ public ExpressionClassification visitCommaExpression( return expression.getExpressionClassification(); } + // Region Typing + + @Override + public ExpressionClassification visitTreatExpression( + TreatExpression expression, + ExpressionClassification argument + ) { + ExpressionClassification result = this.visit(expression.getMainExpression(), argument); + expression.setExpressionClassification(result); + return result; + } + + + // Endregion + // Region FLWOR @Override @@ -301,13 +338,88 @@ public ExpressionClassification visitTypeSwitchExpression( // Region Primary + private FunctionSignature getSignature(FunctionIdentifier identifier, StaticContext staticContext) { + BuiltinFunction function; + FunctionSignature signature; + function = BuiltinFunctionCatalogue.getBuiltinFunction(identifier); + if (function != null) { + signature = function.getSignature(); + } else { + signature = staticContext.getFunctionSignature(identifier); + } + return signature; + } + @Override public ExpressionClassification visitFunctionCall( FunctionCallExpression expression, ExpressionClassification argument ) { - // TODO: Make vacuous if call to fn:error? - return super.visitFunctionCall(expression, argument); + ExpressionClassification currArgResult; + for (Expression argExpr : expression.getArguments()) { + if (argExpr == null) { + continue; + } + currArgResult = this.visit(argExpr, argument); + if (currArgResult.isUpdating()) { + throw new InvalidUpdatingExpressionPositionException( + "Arguments to function calls cannot be updating", + argExpr.getMetadata() + ); + } + } + FunctionSignature funcSig; + try { + funcSig = getSignature(expression.getFunctionIdentifier(), expression.getStaticContext()); + } catch (UnknownFunctionCallException e) { + throw new UnknownFunctionCallException(expression.getFunctionIdentifier(), expression.getMetadata()); + } + ExpressionClassification result = funcSig.isUpdating() + ? ExpressionClassification.UPDATING + : ExpressionClassification.SIMPLE; + expression.setExpressionClassification(result); + // TODO: Make vacuous if call to fn:error? Not present! + return result; + } + + @Override + public ExpressionClassification visitInlineFunctionExpr( + InlineFunctionExpression expression, + ExpressionClassification argument + ) { + ExpressionClassification bodyResult = this.visit(expression.getBody(), argument); + + if (expression.isUpdating()) { + if (expression.getActualReturnType() != null) { + System.err.println(expression); + throw new UpdatingFunctionHasReturnTypeException( + "An updating function cannot have a return type. Return type " + + expression.getActualReturnType() + + " is specified.", + expression.getMetadata() + ); + } + if (!expression.isExternal() && !(bodyResult.isUpdating() || bodyResult.isVacuous())) { + throw new SimpleExpressionMustBeVacuousException( + "Top level expression of updating function must be updating or vacuous", + expression.getMetadata() + ); + } + // TODO CHECK IF EXTERNAL ERROR XUDY0019 + expression.setExpressionClassification(ExpressionClassification.UPDATING); + } else { + if (!expression.isExternal() && !bodyResult.isSimple()) { + throw new InvalidUpdatingExpressionPositionException( + "Body of simple inline function must be simple", + expression.getMetadata() + ); + } + // TODO CHECK IF EXTERNAL ERROR XUDY0018 + expression.setExpressionClassification(ExpressionClassification.SIMPLE); + } + + + return expression.getExpressionClassification(); } // Endregion diff --git a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java index 9a8cb0d434..bb022d9548 100644 --- a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java @@ -402,7 +402,7 @@ public StaticContext visitInlineFunctionExpr(InlineFunctionExpression expression returnType = expression.getBody().getExpression().getStaticSequenceType(); } List params = new ArrayList<>(expression.getParams().values()); - FunctionSignature signature = new FunctionSignature(params, returnType); + FunctionSignature signature = new FunctionSignature(params, returnType, expression.isUpdating()); expression.setStaticSequenceType(new SequenceType(ItemTypeFactory.createFunctionItemType(signature))); return argument; } @@ -474,6 +474,29 @@ private boolean tryAnnotateSpecificFunctions(FunctionCallExpression expression, } } + // handle 'delta-file' function + if ( + functionName.equals(Name.createVariableInDefaultFunctionNamespace("delta-file")) + && args.size() > 0 + && args.get(0) instanceof StringLiteralExpression + ) { + String path = ((StringLiteralExpression) args.get(0)).getValue(); + URI uri = FileSystemUtil.resolveURI(staticContext.getStaticBaseURI(), path, expression.getMetadata()); + if (!FileSystemUtil.exists(uri, this.rumbleRuntimeConfiguration, expression.getMetadata())) { + throw new CannotRetrieveResourceException("File " + uri + " not found.", expression.getMetadata()); + } + StructType s = SparkSessionManager.getInstance() + .getOrCreateSession() + .read() + .format("delta") + .load(uri.toString()) + .schema(); + ItemType schemaItemType = ItemTypeFactory.createItemType(s); + // TODO : check if arity is correct + expression.setStaticSequenceType(new SequenceType(schemaItemType, SequenceType.Arity.ZeroOrMore)); + return true; + } + // handle 'round' function if (functionName.equals(Name.createVariableInDefaultFunctionNamespace("round"))) { // set output type to the same of the first argument (special handling of numeric) @@ -538,7 +561,11 @@ public StaticContext visitFunctionCall(FunctionCallExpression expression, Static } if (expression.isPartialApplication()) { - FunctionSignature partialSignature = new FunctionSignature(partialParams, signature.getReturnType()); + FunctionSignature partialSignature = new FunctionSignature( + partialParams, + signature.getReturnType(), + expression.isUpdating() + ); expression.setStaticSequenceType( new SequenceType(ItemTypeFactory.createFunctionItemType(partialSignature)) ); @@ -766,8 +793,7 @@ public StaticContext visitTransformExpression(TransformExpression expression, St } visit(expression.getModifyExpression(), argument); visit(expression.getReturnExpression(), argument); - - expression.setStaticSequenceType(SequenceType.EMPTY_SEQUENCE); + expression.setStaticSequenceType(expression.getReturnExpression().getStaticSequenceType()); return argument; } @@ -1781,7 +1807,8 @@ public StaticContext visitDynamicFunctionCallExpression( if (isPartialApplication) { FunctionSignature newSignature = new FunctionSignature( partialFormalParameterTypes, - signature.getReturnType() + signature.getReturnType(), + expression.isUpdating() ); expression.setStaticSequenceType(new SequenceType(ItemTypeFactory.createFunctionItemType(newSignature))); return argument; diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java index 9d5354e400..0102eb79b7 100644 --- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java +++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java @@ -486,9 +486,6 @@ public RuntimeIterator visitTransformExpression(TransformExpression expression, for (CopyDeclaration copyDecl : expression.getCopyDeclarations()) { copyDeclMap.put(copyDecl.getVariableName(), this.visit(copyDecl.getSourceExpression(), argument)); } - for (Expression childExpr : expression.getCopySourceExpressions()) { - copyDeclIterators.add(this.visit(childExpr, argument)); - } RuntimeIterator modifyIterator = this.visit(expression.getModifyExpression(), argument); RuntimeIterator returnIterator = this.visit(expression.getReturnExpression(), argument); @@ -664,7 +661,8 @@ public RuntimeIterator visitInlineFunctionExpr(InlineFunctionExpression expressi paramNameToSequenceTypes, returnType, bodyIterator, - expression.getStaticContextForRuntime(this.config, this.visitorConfig) + expression.getStaticContextForRuntime(this.config, this.visitorConfig), + expression.isUpdating() ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -703,7 +701,8 @@ public RuntimeIterator visitFunctionCall(FunctionCallExpression expression, Runt runtimeIterator = new StaticUserDefinedFunctionCallIterator( identifier, arguments, - expression.getStaticContextForRuntime(this.config, this.visitorConfig) + expression.getStaticContextForRuntime(this.config, this.visitorConfig), + expression.isUpdating() ); } runtimeIterator.setStaticContext(expression.getStaticContext()); @@ -1005,6 +1004,7 @@ public RuntimeIterator visitTreatExpression(TreatExpression expression, RuntimeI RuntimeIterator runtimeIterator = new TreatIterator( childExpression, expression.getSequenceType(), + expression.isUpdating(), expression.errorCodeThatShouldBeThrown(), expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); diff --git a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java index b192378c3d..b4e19efc8b 100644 --- a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java +++ b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java @@ -188,7 +188,8 @@ public StaticContext visitFunctionDeclaration(FunctionDeclaration declaration, S expression.getFunctionIdentifier(), new FunctionSignature( new ArrayList<>(expression.getParams().values()), - expression.getReturnType() + expression.getReturnType(), + expression.isUpdating() ) ); return argument; diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java index f758f29134..8f2c77ffa1 100644 --- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java @@ -426,7 +426,7 @@ public Node visitProlog(JsoniqParser.PrologContext ctx) { return prolog; } - public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean isType) { + public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean isType, boolean isAnnotation) { String localName = null; String prefix = null; Name name = null; @@ -445,6 +445,8 @@ public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean name = Name.createVariableInDefaultFunctionNamespace(localName); } else if (isType) { name = Name.createVariableInDefaultTypeNamespace(localName); + } else if (isAnnotation) { + name = Name.createVariableInDefaultAnnotationsNamespace(localName); } else { name = Name.createVariableInNoNamespace(localName); } @@ -463,14 +465,14 @@ public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean @Override public Node visitFunctionDecl(JsoniqParser.FunctionDeclContext ctx) { List annotations = processAnnotations(ctx.annotations()); - Name name = parseName(ctx.qname(), true, false); + Name name = parseName(ctx.qname(), true, false, false); LinkedHashMap fnParams = new LinkedHashMap<>(); SequenceType fnReturnType = null; Name paramName; SequenceType paramType; if (ctx.paramList() != null) { for (JsoniqParser.ParamContext param : ctx.paramList().param()) { - paramName = parseName(param.qname(), false, false); + paramName = parseName(param.qname(), false, false, false); paramType = ITEM_STAR; if (fnParams.containsKey(paramName)) { throw new DuplicateParamNameException( @@ -495,12 +497,15 @@ public Node visitFunctionDecl(JsoniqParser.FunctionDeclContext ctx) { StatementsAndOptionalExpr funcBody = (StatementsAndOptionalExpr) this .visitStatementsAndOptionalExpr(ctx.fn_body); + boolean isExternal = ctx.is_external != null; + return new InlineFunctionExpression( annotations, name, fnParams, fnReturnType, funcBody, + isExternal, createMetadataFromContext(ctx) ); } @@ -531,7 +536,7 @@ public Node visitTypeDecl(JsoniqParser.TypeDeclContext ctx) { pe.initCause(e); throw pe; } - Name name = parseName(ctx.qname(), false, true); + Name name = parseName(ctx.qname(), false, true, false); String schemaLanguage = null; if (ctx.schema != null) { schemaLanguage = ctx.schema.getText(); @@ -1132,7 +1137,7 @@ public Node visitArrowExpr(JsoniqParser.ArrowExprContext ctx) { children.add(mainExpression); children.addAll(getArgumentsFromArgumentListContext(ctx.arguments.get(i))); if (functionCallContext.qname() != null) { - Name name = parseName(functionCallContext.qname(), true, false); + Name name = parseName(functionCallContext.qname(), true, false, false); mainExpression = processFunctionCall(name, children, createMetadataFromContext(functionCallContext)); continue; } else if (functionCallContext.varRef() != null) { @@ -1518,7 +1523,7 @@ public Node visitParenthesizedExpr(JsoniqParser.ParenthesizedExprContext ctx) { @Override public Node visitVarRef(JsoniqParser.VarRefContext ctx) { - Name name = parseName(ctx.qname(), false, false); + Name name = parseName(ctx.qname(), false, false, false); return new VariableReferenceExpression(name, createMetadataFromContext(ctx)); } @@ -1589,7 +1594,7 @@ public ItemType processItemType(JsoniqParser.ItemTypeContext itemTypeContext) { return BuiltinTypesCatalogue.anyFunctionItem; } } - Name name = parseName(itemTypeContext.qname(), false, true); + Name name = parseName(itemTypeContext.qname(), false, true, false); if (!BuiltinTypesCatalogue.typeExists(name)) { return new ItemTypeReference(name); } @@ -1622,7 +1627,7 @@ private Expression processFunctionCall(Name name, List children, Exc @Override public Node visitFunctionCall(JsoniqParser.FunctionCallContext ctx) { - Name name = parseName(ctx.fn_name, true, false); + Name name = parseName(ctx.fn_name, true, false, false); return processFunctionCall( name, getArgumentsFromArgumentListContext(ctx.argumentList()), @@ -1666,7 +1671,7 @@ public Node visitFunctionItemExpr(JsoniqParser.FunctionItemExprContext ctx) { @Override public Node visitNamedFunctionRef(JsoniqParser.NamedFunctionRefContext ctx) { - Name name = parseName(ctx.fn_name, true, false); + Name name = parseName(ctx.fn_name, true, false, false); int arity = 0; try { arity = Integer.parseInt(ctx.arity.getText()); @@ -1691,7 +1696,7 @@ public Node visitInlineFunctionExpr(JsoniqParser.InlineFunctionExprContext ctx) SequenceType paramType; if (ctx.paramList() != null) { for (JsoniqParser.ParamContext param : ctx.paramList().param()) { - paramName = parseName(param.qname(), false, false); + paramName = parseName(param.qname(), false, false, false); paramType = SequenceType.ITEM_STAR; if (fnParams.containsKey(paramName)) { throw new DuplicateParamNameException( @@ -1873,7 +1878,7 @@ public Node visitTryCatchExpr(JsoniqParser.TryCatchExprContext ctx) { for (JsoniqParser.CatchClauseContext catchCtx : ctx.catches) { Expression catchExpression = (Expression) this.visitExpr(catchCtx.catch_expression); for (JsoniqParser.QnameContext qnameCtx : catchCtx.errors) { - Name name = parseName(qnameCtx, false, false); + Name name = parseName(qnameCtx, false, false, false); if (!catchExpressions.containsKey(name.getLocalName())) { catchExpressions.put(name.getLocalName(), catchExpression); } @@ -2028,7 +2033,7 @@ public Node visitApplyStatement(JsoniqParser.ApplyStatementContext ctx) { @Override public Node visitAssignStatement(JsoniqParser.AssignStatementContext ctx) { - Name paramName = parseName(ctx.qname(), false, false); + Name paramName = parseName(ctx.qname(), false, false, false); Expression exprSingle = (Expression) this.visitExprSingle(ctx.exprSingle()); return new AssignStatement(exprSingle, paramName, createMetadataFromContext(ctx)); } @@ -2170,7 +2175,7 @@ public Node visitTryCatchStatement(JsoniqParser.TryCatchStatementContext ctx) { for (JsoniqParser.CatchCaseStatementContext catchCtx : ctx.catches) { BlockStatement catchBlockStatement = (BlockStatement) this.visitBlockStatement(catchCtx.catch_block); for (JsoniqParser.QnameContext qnameCtx : catchCtx.errors) { - Name name = parseName(qnameCtx, false, false); + Name name = parseName(qnameCtx, false, false, false); if (!catchBlockStatements.containsKey(name.getLocalName())) { catchBlockStatements.put(name.getLocalName(), catchBlockStatement); } @@ -2380,20 +2385,20 @@ public ExceptionMetadata generateMetadata(Token token) { private List processAnnotations(JsoniqParser.AnnotationsContext annotations) { List parsedAnnotations = new ArrayList<>(); - annotations.annotation().forEach(annotationContext -> { + for (JsoniqParser.AnnotationContext annotationContext : annotations.annotation()) { + // for backwards compatibility, the specification allows for updating without % sign + if (annotationContext.updating != null) { + Name name = Name.createVariableInDefaultAnnotationsNamespace("updating"); + parsedAnnotations.add(new Annotation(name, null)); + continue; + } JsoniqParser.QnameContext qnameContext = annotationContext.qname(); - Name name = parseName(qnameContext, false, false); + Name name = parseName(qnameContext, false, false, true); if (!annotationContext.Literal().isEmpty()) { throw new OurBadException("Literals are currently not supported in annotations!"); } parsedAnnotations.add(new Annotation(name, null)); - // List literals = new ArrayList<>(); - // ExceptionMetadata metadata = createMetadataFromContext(annotationContext); - // annotationContext.Literal().forEach(literal -> { - // literals.add(getLiteralExpressionFromToken(literal.getText(), metadata)); - // }); - // parsedAnnotations.add(new Annotation(name, literals)); - }); + } return parsedAnnotations; } diff --git a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java index f63ed59f9f..7c78ec877b 100644 --- a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java +++ b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java @@ -154,16 +154,77 @@ public static MainModule parseJSONiqMainModule( if (main == null) { throw new ParsingException("A library module is not executable.", ExceptionMetadata.EMPTY_METADATA); } + if (configuration.isPrintIteratorTree()) { + System.err.println("***************"); + System.err.println("Parsing program"); + System.err.println("***************"); + } MainModule mainModule = (MainModule) visitor.visit(main); + if (configuration.isPrintIteratorTree()) { + System.err.println("***************"); + System.err.println("Pruning modules"); + System.err.println("***************"); + } pruneModules(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("**********************"); + System.err.println("Resolving dependencies"); + System.err.println("**********************"); + } resolveDependencies(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("*************************************"); + System.err.println("Populating sequential classifications"); + System.err.println("*************************************"); + } populateSequentialClassifications(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("***************************************"); + System.err.println("Applying type independent optimizations"); + System.err.println("***************************************"); + } mainModule = applyTypeIndependentOptimizations(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("*************************"); + System.err.println("Populating static context"); + System.err.println("*************************"); + } populateStaticContext(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("*************************************"); + System.err.println("Populating expression classifications"); + System.err.println("*************************************"); + } + populateExpressionClassifications(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("**************"); + System.err.println("Infering types"); + System.err.println("**************"); + } inferTypes(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("************************"); + System.err.println("Applying type dependent optimizations"); + System.err.println("************************"); + } mainModule = applyTypeDependentOptimizations(mainModule); + if (configuration.isPrintIteratorTree()) { + System.err.println("***************************************"); + System.err.println("Populating execution modes"); + System.err.println("***************************************"); + } populateExecutionModes(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("*************************************"); + System.err.println("Populating expression classifications"); + System.err.println("*************************************"); + } populateExpressionClassifications(mainModule, configuration); + if (configuration.isPrintIteratorTree()) { + System.err.println("********************************"); + System.err.println("Verify composability constraints"); + System.err.println("********************************"); + } verifyComposabilityConstraints(mainModule, configuration); return mainModule; } catch (ParseCancellationException ex) { diff --git a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java index c82b2df27f..593a5fcbcc 100644 --- a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java +++ b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java @@ -73,6 +73,7 @@ public class RumbleRuntimeConfiguration implements Serializable, KryoSerializabl private boolean nativeExecution; private boolean functionInlining; private boolean thirdFeature; + private boolean applyUpdates; private Map shortcutMap; private Set yesNoShortcuts; @@ -422,6 +423,12 @@ public void init() { this.functionInlining = true; } + if (this.arguments.containsKey("apply-updates")) { + this.applyUpdates = this.arguments.get("apply-updates").equals("yes"); + } else { + this.applyUpdates = false; + } + if (this.arguments.containsKey("optimize-general-comparison-to-value-comparison")) { this.optimizeGeneralComparisonToValueComparison = this.arguments.get( "optimize-general-comparison-to-value-comparison" @@ -644,6 +651,14 @@ public void setFunctionInlining(boolean b) { this.functionInlining = b; } + public boolean applyUpdates() { + return this.applyUpdates; + } + + public void setApplyUpdates(boolean b) { + this.applyUpdates = b; + } + public boolean optimizeGeneralComparisonToValueComparison() { return this.optimizeGeneralComparisonToValueComparison; } diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java index 8ff2d1970d..afca459f9a 100644 --- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java +++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java @@ -37,6 +37,8 @@ import org.rumbledb.runtime.functions.datetime.components.TimezoneFromTimeFunctionIterator; import org.rumbledb.runtime.functions.datetime.components.YearFromDateFunctionIterator; import org.rumbledb.runtime.functions.datetime.components.YearFromDateTimeFunctionIterator; +import org.rumbledb.runtime.functions.delta_lake.CreateDeltaLakeTableFunctionIterator; +import org.rumbledb.runtime.functions.delta_lake.DeleteDeltaLakeTableFunctionIterator; import org.rumbledb.runtime.functions.durations.components.DaysFromDurationFunctionIterator; import org.rumbledb.runtime.functions.durations.components.HoursFromDurationFunctionIterator; import org.rumbledb.runtime.functions.durations.components.ImplicitTimezoneIterator; @@ -46,6 +48,7 @@ import org.rumbledb.runtime.functions.durations.components.YearsFromDurationFunctionIterator; import org.rumbledb.runtime.functions.input.AvroFileFunctionIterator; import org.rumbledb.runtime.functions.input.CSVFileFunctionIterator; +import org.rumbledb.runtime.functions.input.DeltaFileFunctionIterator; import org.rumbledb.runtime.functions.input.JsonFileFunctionIterator; import org.rumbledb.runtime.functions.input.LibSVMFileFunctionIterator; import org.rumbledb.runtime.functions.input.ParallelizeFunctionIterator; @@ -518,6 +521,16 @@ private static BuiltinFunction createBuiltinFunction( BuiltinFunction.BuiltinFunctionExecutionMode.DATAFRAME ); + /** + * function that parses a delta file + */ + static final BuiltinFunction delta_file = createBuiltinFunction( + new Name(Name.JN_NS, "jn", "delta-file"), + "string", + "item*", + DeltaFileFunctionIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.DATAFRAME + ); /** * function that parses a csv file */ @@ -2677,6 +2690,28 @@ private static BuiltinFunction createBuiltinFunction( BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); + /** + * function that creates a delta lake table at a given path location + */ + static final BuiltinFunction create_delta_lake_table = createBuiltinFunction( + new Name(Name.JN_NS, "jn", "create-delta-lake-table"), + "string", + "boolean", + CreateDeltaLakeTableFunctionIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + + /** + * function that deletes a delta lake table at a given path location + */ + static final BuiltinFunction delete_delta_lake_table = createBuiltinFunction( + new Name(Name.JN_NS, "jn", "delete-delta-lake-table"), + "string", + "boolean", + DeleteDeltaLakeTableFunctionIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + static { builtinFunctions = new HashMap<>(); @@ -2698,6 +2733,7 @@ private static BuiltinFunction createBuiltinFunction( builtinFunctions.put(parallelizeFunction2.getIdentifier(), parallelizeFunction2); builtinFunctions.put(parquet_file1.getIdentifier(), parquet_file1); builtinFunctions.put(parquet_file2.getIdentifier(), parquet_file2); + builtinFunctions.put(delta_file.getIdentifier(), delta_file); builtinFunctions.put(csv_file1.getIdentifier(), csv_file1); builtinFunctions.put(csv_file2.getIdentifier(), csv_file2); builtinFunctions.put(root_file1.getIdentifier(), root_file1); @@ -2706,6 +2742,9 @@ private static BuiltinFunction createBuiltinFunction( builtinFunctions.put(avro_file2.getIdentifier(), avro_file2); builtinFunctions.put(parse_json.getIdentifier(), parse_json); + builtinFunctions.put(create_delta_lake_table.getIdentifier(), create_delta_lake_table); + builtinFunctions.put(delete_delta_lake_table.getIdentifier(), delete_delta_lake_table); + builtinFunctions.put(count.getIdentifier(), count); builtinFunctions.put(boolean_function.getIdentifier(), boolean_function); builtinFunctions.put(not_function.getIdentifier(), not_function); diff --git a/src/main/java/org/rumbledb/context/GlobalVariables.java b/src/main/java/org/rumbledb/context/GlobalVariables.java index 7c3f87936f..ce93dec247 100644 --- a/src/main/java/org/rumbledb/context/GlobalVariables.java +++ b/src/main/java/org/rumbledb/context/GlobalVariables.java @@ -11,6 +11,7 @@ import java.util.Set; public class GlobalVariables implements Serializable, KryoSerializable { + private static final long serialVersionUID = 1L; private Set globalVariables; public GlobalVariables() { diff --git a/src/main/java/org/rumbledb/context/Name.java b/src/main/java/org/rumbledb/context/Name.java index 45d377c517..687b3a6105 100644 --- a/src/main/java/org/rumbledb/context/Name.java +++ b/src/main/java/org/rumbledb/context/Name.java @@ -59,9 +59,9 @@ public class Name implements Comparable, Serializable, KryoSerializable { public static final String XS_NS = "http://www.w3.org/2001/XMLSchema"; public static final String JS_NS = "http://jsoniq.org/types"; public static final String LOCAL_NS = "http://www.w3.org/2005/xquery-local-functions"; - - public static final String AN_NS = "http://www.zorba-xquery.com/annotations"; + public static final String AN_NS = "http://www.w3.org/2012/xquery"; public static final String DEFAULT_COLLATION_NS = "http://www.w3.org/2005/xpath-functions/collation/codepoint"; + public static final Name CONTEXT_ITEM = createVariableInNoNamespace("$"); public static final Name CONTEXT_POSITION = createVariableInNoNamespace("$position"); public static final Name CONTEXT_COUNT = createVariableInNoNamespace("$count"); @@ -122,6 +122,18 @@ public static Name createVariableInDefaultFunctionNamespace(String localName) { return new Name(JSONIQ_DEFAULT_FUNCTION_NS, "", localName); } + /** + * Creates an expanded name that has the default annotations namespace. By default, in Rumble, unprefixed + * annotations live in this namespace. This namespace includes + * all builtin annotations. + * + * @param localName the name of the variable + * @return the expanded name + */ + public static Name createVariableInDefaultAnnotationsNamespace(String localName) { + return new Name(AN_NS, "", localName); + } + public static Name createVariableInDefaultXQueryTypeNamespace(String localName) { return new Name(FN_NS, "", localName); } diff --git a/src/main/java/org/rumbledb/context/StaticContext.java b/src/main/java/org/rumbledb/context/StaticContext.java index a322077bd0..979fd636e5 100644 --- a/src/main/java/org/rumbledb/context/StaticContext.java +++ b/src/main/java/org/rumbledb/context/StaticContext.java @@ -71,7 +71,7 @@ public class StaticContext implements Serializable, KryoSerializable { defaultBindings.put("xs", Name.XS_NS); defaultBindings.put("jn", Name.JN_NS); defaultBindings.put("js", Name.JS_NS); - defaultBindings.put("an", Name.AN_NS); + // defaultBindings.put("an", Name.AN_NS); } private RumbleRuntimeConfiguration configuration; @@ -454,7 +454,7 @@ public InScopeSchemaTypes getInScopeSchemaTypes() { } public int getCurrentMutabilityLevel() { - return currentMutabilityLevel; + return this.currentMutabilityLevel; } public void setCurrentMutabilityLevel(int currentMutabilityLevel) { diff --git a/src/main/java/org/rumbledb/context/VariableValues.java b/src/main/java/org/rumbledb/context/VariableValues.java index 61572b017f..e37bf4526c 100644 --- a/src/main/java/org/rumbledb/context/VariableValues.java +++ b/src/main/java/org/rumbledb/context/VariableValues.java @@ -366,6 +366,9 @@ public String toString() { sb.append(" " + name + " (" + this.localVariableValues.get(name).size() + " items)\n"); if (this.localVariableValues.get(name).size() == 1) { sb.append(" " + this.localVariableValues.get(name).get(0).serialize() + "\n"); + sb.append( + " Mutability level: " + this.localVariableValues.get(name).get(0).getMutabilityLevel() + "\n" + ); } } sb.append(" Counts:\n"); diff --git a/src/main/java/org/rumbledb/errorcodes/ErrorCode.java b/src/main/java/org/rumbledb/errorcodes/ErrorCode.java index c2f8621601..261f2c261a 100644 --- a/src/main/java/org/rumbledb/errorcodes/ErrorCode.java +++ b/src/main/java/org/rumbledb/errorcodes/ErrorCode.java @@ -74,6 +74,7 @@ public enum ErrorCode { OurBadErrorCode("RBST0004"), ClusterConnectionErrorCode("RBDY0005"), DatesWithTimezonesNotSupported("RBDY0006"), + CannotModifyImmutableValue("RBDY0007"), UnexpectedStaticType("RBTY0001"), @@ -131,6 +132,8 @@ public enum ErrorCode { TransformModifiesNonCopiedValue("XUDY0014"), UpdateTargetIsEmptySeqErrorCode("XUDY0027"), + UpdatingFunctionHasReturnTypeErrorCode("XUST0028"), + DuplicateObjectInsertSourceErrorCode("JNUP0005"), DuplicateKeyOnUpdateApplyErrorCode("JNUP0006"), CannotCastUpdateSelectorErrorCode("JNUP0007"), diff --git a/src/main/java/org/rumbledb/exceptions/ModifiesImmutableValueException.java b/src/main/java/org/rumbledb/exceptions/ModifiesImmutableValueException.java new file mode 100644 index 0000000000..2441383014 --- /dev/null +++ b/src/main/java/org/rumbledb/exceptions/ModifiesImmutableValueException.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package org.rumbledb.exceptions; + +import org.rumbledb.errorcodes.ErrorCode; + +public class ModifiesImmutableValueException extends RumbleException { + + private static final long serialVersionUID = 1L; + + public ModifiesImmutableValueException(String message, ExceptionMetadata metadata) { + super(message, ErrorCode.CannotModifyImmutableValue, metadata); + } +} diff --git a/src/main/java/org/rumbledb/exceptions/UpdatingFunctionHasReturnTypeException.java b/src/main/java/org/rumbledb/exceptions/UpdatingFunctionHasReturnTypeException.java new file mode 100644 index 0000000000..2b8ebf47aa --- /dev/null +++ b/src/main/java/org/rumbledb/exceptions/UpdatingFunctionHasReturnTypeException.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package org.rumbledb.exceptions; + +import org.rumbledb.errorcodes.ErrorCode; + +public class UpdatingFunctionHasReturnTypeException extends RumbleException { + + private static final long serialVersionUID = 1L; + + public UpdatingFunctionHasReturnTypeException(String message, ExceptionMetadata metadata) { + super(message, ErrorCode.UpdatingFunctionHasReturnTypeErrorCode, metadata); + } +} diff --git a/src/main/java/org/rumbledb/expressions/Expression.java b/src/main/java/org/rumbledb/expressions/Expression.java index 5b1bf2f70e..2dc28b4a1e 100644 --- a/src/main/java/org/rumbledb/expressions/Expression.java +++ b/src/main/java/org/rumbledb/expressions/Expression.java @@ -126,7 +126,7 @@ public void setStaticSequenceType(SequenceType staticSequenceType) { * @return Expression Classification of the expression. */ public ExpressionClassification getExpressionClassification() { - return expressionClassification; + return this.expressionClassification; } /** diff --git a/src/main/java/org/rumbledb/expressions/ExpressionClassification.java b/src/main/java/org/rumbledb/expressions/ExpressionClassification.java index f852a1f3de..842478436e 100644 --- a/src/main/java/org/rumbledb/expressions/ExpressionClassification.java +++ b/src/main/java/org/rumbledb/expressions/ExpressionClassification.java @@ -3,10 +3,11 @@ /** * An ExpressionClassification classifies an expression under 4 possible classifications. * - * A BASIC_UPDATING expression is classified as 1 of 6 expressions in the update package, that can alter the state of + * A BASIC_UPDATING expression is classified as 1 of 5 expressions in the update package, that can alter the state of * an existing node. * - * An UPDATING expression is classified as a BASIC_EXPRESSION or any expression (excluding a TransformExpression) that + * An UPDATING expression is classified as a BASIC_UPDATING expression or any expression (excluding a + * TransformExpression) that * directly contains an UPDATING expression and that can alter the state of an existing node. * * A SIMPLE expression is classified as an expression that is not an updating expression. diff --git a/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java b/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java index d0a82bdfda..399082c078 100644 --- a/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java +++ b/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java @@ -30,6 +30,7 @@ import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; import org.rumbledb.expressions.scripting.annotations.Annotation; +import org.rumbledb.expressions.scripting.annotations.AnnotationConstants; import org.rumbledb.expressions.scripting.statement.StatementsAndOptionalExpr; import org.rumbledb.types.SequenceType; @@ -51,6 +52,7 @@ public class InlineFunctionExpression extends Expression { private final List annotations; private boolean hasSequentialPropertyAnnotation; private boolean hasExitStatement; + private final boolean isExternal; public InlineFunctionExpression( List annotations, @@ -58,6 +60,7 @@ public InlineFunctionExpression( Map params, SequenceType returnType, StatementsAndOptionalExpr body, + boolean isExternal, ExceptionMetadata metadata ) { super(metadata); @@ -67,6 +70,7 @@ public InlineFunctionExpression( this.body = body; this.annotations = annotations; this.functionIdentifier = new FunctionIdentifier(name, params.size()); + this.isExternal = isExternal; this.hasExitStatement = false; if (annotations != null) { this.setSequentialFromAnnotations(); @@ -97,6 +101,17 @@ private void setSequentialFromAnnotations() { this.setSequential(foundSeqAnnotation); } + public InlineFunctionExpression( + List annotations, + Name name, + Map params, + SequenceType returnType, + StatementsAndOptionalExpr body, + ExceptionMetadata metadata + ) { + this(annotations, name, params, returnType, body, false, metadata); + } + public Name getName() { return this.name; } @@ -126,6 +141,20 @@ public List getAnnotations() { return this.annotations; } + @Override + public boolean isUpdating() { + for (Annotation a : this.annotations) { + if (a.getAnnotationName().equals(AnnotationConstants.UPDATING)) { + return true; + } + } + return false; + } + + public boolean isExternal() { + return this.isExternal; + } + @Override public List getChildren() { return Arrays.asList(this.body); @@ -192,8 +221,9 @@ public void print(StringBuffer buffer, int indent) { @Override public void serializeToJSONiq(StringBuffer sb, int indent) { indentIt(sb, indent); + String updating = isUpdating() ? "%an:updating" : ""; if (this.name != null) { - sb.append("declare function " + this.name.toString() + "("); + sb.append("declare " + updating + " function " + this.name.toString() + "("); } else { sb.append("function ("); } diff --git a/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java b/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java index f5ec43ca51..0717a299ed 100644 --- a/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java +++ b/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java @@ -5,6 +5,8 @@ public class AnnotationConstants { public static final Name SEQUENTIAL = new Name(Name.AN_NS, "an", "sequential"); public static final Name NON_SEQUENTIAL = new Name(Name.AN_NS, "an", "nonsequential"); + public static final Name UPDATING = new Name(Name.AN_NS, "an", "updating"); + public static final Name SIMPLE = new Name(Name.AN_NS, "an", "simple"); public static final Name ASSIGNABLE = new Name(Name.AN_NS, "an", "assignable"); diff --git a/src/main/java/org/rumbledb/expressions/update/AppendExpression.java b/src/main/java/org/rumbledb/expressions/update/AppendExpression.java index ae7702206d..78fc42429b 100644 --- a/src/main/java/org/rumbledb/expressions/update/AppendExpression.java +++ b/src/main/java/org/rumbledb/expressions/update/AppendExpression.java @@ -31,11 +31,11 @@ public AppendExpression( } public Expression getArrayExpression() { - return arrayExpression; + return this.arrayExpression; } public Expression getToAppendExpression() { - return toAppendExpression; + return this.toAppendExpression; } @Override diff --git a/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java b/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java index f443f4ec8d..fe514e3b44 100644 --- a/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java +++ b/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java @@ -21,11 +21,11 @@ public CopyDeclaration( } public Name getVariableName() { - return variableName; + return this.variableName; } public Expression getSourceExpression() { - return sourceExpression; + return this.sourceExpression; } public SequenceType getSourceSequenceType() { diff --git a/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java b/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java index 57e5368496..1f1c5f78c9 100644 --- a/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java +++ b/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java @@ -36,11 +36,11 @@ public List getChildren() { } public Expression getMainExpression() { - return mainExpression; + return this.mainExpression; } public Expression getLocatorExpression() { - return locatorExpression; + return this.locatorExpression; } diff --git a/src/main/java/org/rumbledb/expressions/update/RenameExpression.java b/src/main/java/org/rumbledb/expressions/update/RenameExpression.java index e50fea257b..3d5205eb23 100644 --- a/src/main/java/org/rumbledb/expressions/update/RenameExpression.java +++ b/src/main/java/org/rumbledb/expressions/update/RenameExpression.java @@ -42,15 +42,15 @@ public List getChildren() { } public Expression getMainExpression() { - return mainExpression; + return this.mainExpression; } public Expression getLocatorExpression() { - return locatorExpression; + return this.locatorExpression; } public Expression getNameExpression() { - return nameExpression; + return this.nameExpression; } @Override diff --git a/src/main/java/org/rumbledb/expressions/update/TransformExpression.java b/src/main/java/org/rumbledb/expressions/update/TransformExpression.java index f4773ab769..aa06596a25 100644 --- a/src/main/java/org/rumbledb/expressions/update/TransformExpression.java +++ b/src/main/java/org/rumbledb/expressions/update/TransformExpression.java @@ -32,7 +32,7 @@ public TransformExpression( } public List getCopyDeclarations() { - return copyDeclarations; + return this.copyDeclarations; } public List getCopySourceExpressions() { @@ -43,11 +43,11 @@ public List getCopySourceExpressions() { } public Expression getModifyExpression() { - return modifyExpression; + return this.modifyExpression; } public Expression getReturnExpression() { - return returnExpression; + return this.returnExpression; } @Override diff --git a/src/main/java/org/rumbledb/items/AnnotatedItem.java b/src/main/java/org/rumbledb/items/AnnotatedItem.java index 5d110a4014..16f790dd9e 100644 --- a/src/main/java/org/rumbledb/items/AnnotatedItem.java +++ b/src/main/java/org/rumbledb/items/AnnotatedItem.java @@ -371,4 +371,79 @@ public int castToIntValue() { public NativeClauseContext generateNativeQuery(NativeClauseContext context) { return this.itemToAnnotate.generateNativeQuery(context); } + + @Override + public String getSparkSQLValue() { + return this.itemToAnnotate.getSparkSQLValue(); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + return this.itemToAnnotate.getSparkSQLValue(itemType); + } + + @Override + public String getSparkSQLType() { + return this.itemToAnnotate.getSparkSQLType(); + } + + @Override + public void putItemAt(Item item, int i) { + this.itemToAnnotate.putItemAt(item, i); + } + + @Override + public void putItemsAt(List items, int i) { + this.itemToAnnotate.putItemsAt(items, i); + } + + @Override + public void removeItemAt(int i) { + this.itemToAnnotate.removeItemAt(i); + } + + @Override + public void removeItemByKey(String key) { + this.itemToAnnotate.removeItemByKey(key); + } + + @Override + public int getMutabilityLevel() { + return this.itemToAnnotate.getMutabilityLevel(); + } + + @Override + public void setMutabilityLevel(int mutabilityLevel) { + this.itemToAnnotate.setMutabilityLevel(mutabilityLevel); + } + + @Override + public long getTopLevelID() { + return this.itemToAnnotate.getTopLevelID(); + } + + @Override + public void setTopLevelID(long topLevelID) { + this.itemToAnnotate.setTopLevelID(topLevelID); + } + + @Override + public String getPathIn() { + return this.itemToAnnotate.getPathIn(); + } + + @Override + public void setPathIn(String pathIn) { + this.itemToAnnotate.setPathIn(pathIn); + } + + @Override + public String getTableLocation() { + return this.itemToAnnotate.getTableLocation(); + } + + @Override + public void setTableLocation(String location) { + this.itemToAnnotate.setTableLocation(location); + } } diff --git a/src/main/java/org/rumbledb/items/ArrayItem.java b/src/main/java/org/rumbledb/items/ArrayItem.java index ee8d7815c1..2ffab147b5 100644 --- a/src/main/java/org/rumbledb/items/ArrayItem.java +++ b/src/main/java/org/rumbledb/items/ArrayItem.java @@ -34,19 +34,27 @@ public class ArrayItem implements Item { private static final long serialVersionUID = 1L; private List arrayItems; - private int mutabilityLevel; + private long topLevelID; + private String pathIn; + private String location; public ArrayItem() { super(); this.arrayItems = new ArrayList<>(); - this.mutabilityLevel = 0; + this.mutabilityLevel = -1; + this.topLevelID = -1; + this.pathIn = "null"; + this.location = "null"; } public ArrayItem(List arrayItems) { super(); this.arrayItems = arrayItems; - this.mutabilityLevel = 0; + this.mutabilityLevel = -1; + this.topLevelID = -1; + this.pathIn = "null"; + this.location = "null"; } public boolean equals(Object otherItem) { @@ -115,12 +123,20 @@ public int getSize() { @Override public void write(Kryo kryo, Output output) { kryo.writeObject(output, this.arrayItems); + output.writeInt(this.mutabilityLevel); + output.writeLong(this.topLevelID); + kryo.writeObject(output, this.pathIn); + kryo.writeObject(output, this.location); } @SuppressWarnings("unchecked") @Override public void read(Kryo kryo, Input input) { this.arrayItems = kryo.readObject(input, ArrayList.class); + this.mutabilityLevel = input.readInt(); + this.topLevelID = input.readLong(); + this.pathIn = kryo.readObject(input, String.class); + this.location = kryo.readObject(input, String.class); } public int hashCode() { @@ -150,8 +166,92 @@ public int getMutabilityLevel() { @Override public void setMutabilityLevel(int mutabilityLevel) { this.mutabilityLevel = mutabilityLevel; - for (Item item : arrayItems) { + for (Item item : this.arrayItems) { item.setMutabilityLevel(mutabilityLevel); } } + + @Override + public long getTopLevelID() { + return this.topLevelID; + } + + @Override + public void setTopLevelID(long topLevelID) { + this.topLevelID = topLevelID; + for (Item item : this.arrayItems) { + item.setTopLevelID(topLevelID); + } + } + + @Override + public String getPathIn() { + return this.pathIn; + } + + @Override + public void setPathIn(String pathIn) { + this.pathIn = pathIn; + for (int i = 0; i < this.arrayItems.size(); i++) { + Item item = this.arrayItems.get(i); + item.setPathIn(pathIn + "[" + i + "]"); + } + } + + @Override + public String getTableLocation() { + return this.location; + } + + @Override + public void setTableLocation(String location) { + this.location = location; + for (Item item : this.arrayItems) { + item.setTableLocation(location); + } + } + + @Override + public String getSparkSQLValue() { + StringBuilder sb = new StringBuilder(); + sb.append("array("); + for (int i = 0; i < this.arrayItems.size(); i++) { + Item item = this.arrayItems.get(i); + sb.append(item.getSparkSQLValue()); + if (i + 1 < this.arrayItems.size()) { + sb.append(", "); + } + } + sb.append(")"); + return sb.toString(); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + StringBuilder sb = new StringBuilder(); + ItemType elementType = itemType.getArrayContentFacet(); + sb.append("array("); + for (int i = 0; i < this.arrayItems.size(); i++) { + Item item = this.arrayItems.get(i); + sb.append(item.getSparkSQLValue(elementType)); + if (i + 1 < this.arrayItems.size()) { + sb.append(", "); + } + } + sb.append(")"); + return sb.toString(); + } + + @Override + public String getSparkSQLType() { + // TODO: Is it okay to assume first elem type is same as rest? + StringBuilder sb = new StringBuilder(); + sb.append("ARRAY<"); + if (this.getSize() <= 0) { + // TODO: Throw error? No empty arrays? + } + sb.append(this.getItemAt(0).getSparkSQLType()); + sb.append(">"); + return sb.toString(); + } } diff --git a/src/main/java/org/rumbledb/items/BooleanItem.java b/src/main/java/org/rumbledb/items/BooleanItem.java index 9348e31013..fa3d108dc6 100644 --- a/src/main/java/org/rumbledb/items/BooleanItem.java +++ b/src/main/java/org/rumbledb/items/BooleanItem.java @@ -100,4 +100,21 @@ public ItemType getDynamicType() { public boolean isAtomic() { return true; } + + @Override + public String getSparkSQLValue() { + return String.valueOf(this.value); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + return String.valueOf(this.value); + } + + @Override + public String getSparkSQLType() { + // TODO: Make enum? + return "BOOLEAN"; + } + } diff --git a/src/main/java/org/rumbledb/items/DateItem.java b/src/main/java/org/rumbledb/items/DateItem.java index 6881e66052..edccd89479 100644 --- a/src/main/java/org/rumbledb/items/DateItem.java +++ b/src/main/java/org/rumbledb/items/DateItem.java @@ -116,4 +116,10 @@ public ItemType getDynamicType() { public boolean isAtomic() { return true; } + + @Override + public String getSparkSQLType() { + // TODO: Make enum? + return "DATE"; + } } diff --git a/src/main/java/org/rumbledb/items/DecimalItem.java b/src/main/java/org/rumbledb/items/DecimalItem.java index bc140b4110..8463fc29b6 100644 --- a/src/main/java/org/rumbledb/items/DecimalItem.java +++ b/src/main/java/org/rumbledb/items/DecimalItem.java @@ -144,4 +144,20 @@ public boolean isNumeric() { public boolean isAtomic() { return true; } + + @Override + public String getSparkSQLValue() { + return this.value.stripTrailingZeros().toPlainString(); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + return this.value.stripTrailingZeros().toPlainString(); + } + + @Override + public String getSparkSQLType() { + // TODO: Make enum? + return "DECIMAL"; + } } diff --git a/src/main/java/org/rumbledb/items/DoubleItem.java b/src/main/java/org/rumbledb/items/DoubleItem.java index a82018813c..dd59e2a1f4 100644 --- a/src/main/java/org/rumbledb/items/DoubleItem.java +++ b/src/main/java/org/rumbledb/items/DoubleItem.java @@ -186,4 +186,32 @@ public boolean isNumeric() { public boolean isAtomic() { return true; } + + @Override + public String getSparkSQLValue() { + if (Double.isInfinite(this.value) && this.value > 0) { + return "INF"; + } + if (Double.isInfinite(this.value) && this.value < 0) { + return "-INF"; + } + return this.getStringValue(); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + if (Double.isInfinite(this.value) && this.value > 0) { + return "INF"; + } + if (Double.isInfinite(this.value) && this.value < 0) { + return "-INF"; + } + return this.getStringValue(); + } + + @Override + public String getSparkSQLType() { + // TODO: Make enum? + return "DOUBLE"; + } } diff --git a/src/main/java/org/rumbledb/items/FloatItem.java b/src/main/java/org/rumbledb/items/FloatItem.java index 62f6a2aaee..43b6da5f3d 100644 --- a/src/main/java/org/rumbledb/items/FloatItem.java +++ b/src/main/java/org/rumbledb/items/FloatItem.java @@ -190,4 +190,32 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext context) { } return new NativeClauseContext(context, "CAST (" + this.value + "D AS FLOAT)", SequenceType.FLOAT); } + + @Override + public String getSparkSQLValue() { + if (Float.isInfinite(this.value) && this.value > 0) { + return "Infinity"; + } + if (Float.isInfinite(this.value) && this.value < 0) { + return "-Infinity"; + } + return this.getStringValue(); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + if (Float.isInfinite(this.value) && this.value > 0) { + return "Infinity"; + } + if (Float.isInfinite(this.value) && this.value < 0) { + return "-Infinity"; + } + return this.getStringValue(); + } + + @Override + public String getSparkSQLType() { + // TODO: Make enum? + return "FLOAT"; + } } diff --git a/src/main/java/org/rumbledb/items/FunctionItem.java b/src/main/java/org/rumbledb/items/FunctionItem.java index f6cd08add5..c767572114 100644 --- a/src/main/java/org/rumbledb/items/FunctionItem.java +++ b/src/main/java/org/rumbledb/items/FunctionItem.java @@ -114,7 +114,8 @@ public FunctionItem( Map paramNameToSequenceTypes, SequenceType returnType, DynamicContext dynamicModuleContext, - RuntimeIterator bodyIterator + RuntimeIterator bodyIterator, + boolean isUpdating ) { List paramNames = new ArrayList<>(); List parameters = new ArrayList<>(); @@ -125,7 +126,7 @@ public FunctionItem( this.identifier = new FunctionIdentifier(name, paramNames.size()); this.parameterNames = paramNames; - this.signature = new FunctionSignature(parameters, returnType); + this.signature = new FunctionSignature(parameters, returnType, isUpdating); this.bodyIterator = bodyIterator; this.dynamicModuleContext = dynamicModuleContext; this.localVariablesInClosure = new HashMap<>(); diff --git a/src/main/java/org/rumbledb/items/IntItem.java b/src/main/java/org/rumbledb/items/IntItem.java index 1998a05216..3f496978dc 100644 --- a/src/main/java/org/rumbledb/items/IntItem.java +++ b/src/main/java/org/rumbledb/items/IntItem.java @@ -162,4 +162,20 @@ public boolean isNumeric() { public boolean isAtomic() { return true; } + + @Override + public String getSparkSQLValue() { + return String.valueOf(this.value); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + return String.valueOf(this.value); + } + + @Override + public String getSparkSQLType() { + // TODO: Make enum? + return "INT"; + } } diff --git a/src/main/java/org/rumbledb/items/IntegerItem.java b/src/main/java/org/rumbledb/items/IntegerItem.java index 0ca1de1822..a38122a040 100644 --- a/src/main/java/org/rumbledb/items/IntegerItem.java +++ b/src/main/java/org/rumbledb/items/IntegerItem.java @@ -151,4 +151,20 @@ public boolean isNumeric() { public boolean isAtomic() { return true; } + + @Override + public String getSparkSQLValue() { + return String.valueOf(this.value); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + return String.valueOf(this.value); + } + + @Override + public String getSparkSQLType() { + // TODO: Make enum? + return "INTEGER"; + } } diff --git a/src/main/java/org/rumbledb/items/ItemFactory.java b/src/main/java/org/rumbledb/items/ItemFactory.java index c81854cd47..6ce96711b2 100644 --- a/src/main/java/org/rumbledb/items/ItemFactory.java +++ b/src/main/java/org/rumbledb/items/ItemFactory.java @@ -209,16 +209,39 @@ public Item createArrayItem() { return new ArrayItem(); } - public Item createArrayItem(List items) { - return new ArrayItem(items); - } - - public Item createObjectItem(List keys, List values, ExceptionMetadata itemMetadata) { - return new ObjectItem(keys, values, itemMetadata); + public Item createArrayItem(List items, boolean mutable) { + Item result = new ArrayItem(items); + if (mutable) { + result.setMutabilityLevel(0); + } else { + result.setMutabilityLevel(-1); + } + return result; + } + + public Item createObjectItem( + List keys, + List values, + ExceptionMetadata itemMetadata, + boolean mutable + ) { + Item result = new ObjectItem(keys, values, itemMetadata); + if (mutable) { + result.setMutabilityLevel(0); + } else { + result.setMutabilityLevel(-1); + } + return result; } - public Item createObjectItem(Map> keyValuePairs) { - return new ObjectItem(keyValuePairs); + public Item createObjectItem(Map> keyValuePairs, boolean mutable) { + Item result = new ObjectItem(keyValuePairs); + if (mutable) { + result.setMutabilityLevel(0); + } else { + result.setMutabilityLevel(-1); + } + return result; } } diff --git a/src/main/java/org/rumbledb/items/LazyObjectItem.java b/src/main/java/org/rumbledb/items/LazyObjectItem.java index 7b447fe94c..720f8af8b0 100644 --- a/src/main/java/org/rumbledb/items/LazyObjectItem.java +++ b/src/main/java/org/rumbledb/items/LazyObjectItem.java @@ -77,7 +77,7 @@ public Item getItem() { return ItemFactory.getInstance().createNullItem(); } } - return ItemFactory.getInstance().createArrayItem(items); + return ItemFactory.getInstance().createArrayItem(items, true); } } diff --git a/src/main/java/org/rumbledb/items/NullItem.java b/src/main/java/org/rumbledb/items/NullItem.java index 250f2e17a9..f80bce34d6 100644 --- a/src/main/java/org/rumbledb/items/NullItem.java +++ b/src/main/java/org/rumbledb/items/NullItem.java @@ -93,4 +93,14 @@ public boolean isAtomic() { public String getStringValue() { return "null"; } + + @Override + public String getSparkSQLValue() { + return "NULL"; + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + return "NULL"; + } } diff --git a/src/main/java/org/rumbledb/items/ObjectItem.java b/src/main/java/org/rumbledb/items/ObjectItem.java index c6f535ac53..cb174fb9a4 100644 --- a/src/main/java/org/rumbledb/items/ObjectItem.java +++ b/src/main/java/org/rumbledb/items/ObjectItem.java @@ -27,6 +27,7 @@ import org.rumbledb.exceptions.DuplicateObjectKeyException; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.FieldDescriptor; import org.rumbledb.types.ItemType; import java.util.*; @@ -37,14 +38,19 @@ public class ObjectItem implements Item { private static final long serialVersionUID = 1L; private List values; private List keys; - private int mutabilityLevel; + private long topLevelID; + private String pathIn; + private String location; public ObjectItem() { super(); this.keys = new ArrayList<>(); this.values = new ArrayList<>(); - this.mutabilityLevel = 0; + this.mutabilityLevel = -1; + this.topLevelID = -1; + this.pathIn = "null"; + this.location = "null"; } public ObjectItem(List keys, List values, ExceptionMetadata itemMetadata) { @@ -52,7 +58,10 @@ public ObjectItem(List keys, List values, ExceptionMetadata itemMe checkForDuplicateKeys(keys, itemMetadata); this.keys = keys; this.values = values; - this.mutabilityLevel = 0; + this.mutabilityLevel = -1; + this.topLevelID = -1; + this.pathIn = "null"; + this.location = "null"; } public boolean equals(Object otherItem) { @@ -103,7 +112,7 @@ public ObjectItem(Map> keyValuePairs) { List values = keyValuePairs.get(key); // for each key, convert the lists of values into arrayItems if (values.size() > 1) { - Item valuesArray = ItemFactory.getInstance().createArrayItem(values); + Item valuesArray = ItemFactory.getInstance().createArrayItem(values, false); valueList.add(valuesArray); } else if (values.size() == 1) { Item value = values.get(0); @@ -115,7 +124,10 @@ public ObjectItem(Map> keyValuePairs) { this.keys = keyList; this.values = valueList; - this.mutabilityLevel = 0; + this.mutabilityLevel = -1; + this.topLevelID = -1; + this.pathIn = "null"; + this.location = "null"; } @Override @@ -173,6 +185,10 @@ public boolean isObject() { public void write(Kryo kryo, Output output) { kryo.writeObject(output, this.keys); kryo.writeObject(output, this.values); + output.writeInt(this.mutabilityLevel); + output.writeLong(this.topLevelID); + kryo.writeObject(output, this.pathIn); + kryo.writeObject(output, this.location); } @SuppressWarnings("unchecked") @@ -180,6 +196,10 @@ public void write(Kryo kryo, Output output) { public void read(Kryo kryo, Input input) { this.keys = kryo.readObject(input, ArrayList.class); this.values = kryo.readObject(input, ArrayList.class); + this.mutabilityLevel = input.readInt(); + this.topLevelID = input.readLong(); + this.pathIn = kryo.readObject(input, String.class); + this.location = kryo.readObject(input, String.class); } public int hashCode() { @@ -209,8 +229,119 @@ public int getMutabilityLevel() { @Override public void setMutabilityLevel(int mutabilityLevel) { this.mutabilityLevel = mutabilityLevel; - for (Item item : values) { + for (Item item : this.values) { item.setMutabilityLevel(mutabilityLevel); } } + + @Override + public long getTopLevelID() { + return this.topLevelID; + } + + @Override + public void setTopLevelID(long topLevelID) { + this.topLevelID = topLevelID; + for (Item item : this.values) { + item.setTopLevelID(topLevelID); + } + } + + @Override + public String getPathIn() { + return this.pathIn; + } + + @Override + public void setPathIn(String pathIn) { + this.pathIn = pathIn; + for (int i = 0; i < this.keys.size(); i++) { + String key = this.keys.get(i); + Item item = this.values.get(i); + item.setPathIn(pathIn + "." + key); + } + } + + @Override + public String getTableLocation() { + return this.location; + } + + @Override + public void setTableLocation(String location) { + this.location = location; + for (Item item : this.values) { + item.setTableLocation(location); + } + } + + @Override + public String getSparkSQLValue() { + StringBuilder sb = new StringBuilder(); + sb.append("named_struct("); + for (int i = 0; i < this.keys.size(); i++) { + sb.append("\""); + sb.append(this.keys.get(i)); + sb.append("\""); + sb.append(", "); + sb.append(this.values.get(i).getSparkSQLValue()); + if (i + 1 < this.keys.size()) { + sb.append(", "); + } + } + sb.append(")"); + return sb.toString(); + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + StringBuilder sb = new StringBuilder(); + + Map content = itemType.getObjectContentFacet(); + String[] keys = content.keySet().toArray(new String[0]); + + sb.append("named_struct("); + + for (int i = 0; i < keys.length; i++) { + String key = keys[i]; + FieldDescriptor field = content.get(key); + int keyIndex = this.keys.indexOf(key); + + sb.append("\""); + sb.append(key); + sb.append("\""); + sb.append(", "); + + if (keyIndex == -1) { + if (!field.isRequired()) { + sb.append("NULL"); + } + } else { + sb.append(this.values.get(keyIndex).getSparkSQLValue(field.getType())); + } + + if (i + 1 < keys.length) { + sb.append(", "); + } + } + + sb.append(")"); + return sb.toString(); + } + + @Override + public String getSparkSQLType() { + StringBuilder sb = new StringBuilder(); + sb.append("STRUCT<"); + for (int i = 0; i < this.keys.size(); i++) { + sb.append(this.keys.get(i)); + sb.append(": "); + sb.append(this.values.get(i).getSparkSQLType()); + if (i + 1 < this.keys.size()) { + sb.append(", "); + } + } + sb.append(">"); + return sb.toString(); + } } diff --git a/src/main/java/org/rumbledb/items/StringItem.java b/src/main/java/org/rumbledb/items/StringItem.java index 130a929bc0..fc19ea73c5 100644 --- a/src/main/java/org/rumbledb/items/StringItem.java +++ b/src/main/java/org/rumbledb/items/StringItem.java @@ -154,4 +154,19 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext context) { public boolean isAtomic() { return true; } + + @Override + public String getSparkSQLValue() { + return "\"" + this.value + "\""; + } + + @Override + public String getSparkSQLValue(ItemType itemType) { + return "\"" + this.value + "\""; + } + + @Override + public String getSparkSQLType() { + return "STRING"; + } } diff --git a/src/main/java/org/rumbledb/items/parsing/ItemParser.java b/src/main/java/org/rumbledb/items/parsing/ItemParser.java index 6db73ad96a..eccf8267af 100644 --- a/src/main/java/org/rumbledb/items/parsing/ItemParser.java +++ b/src/main/java/org/rumbledb/items/parsing/ItemParser.java @@ -116,7 +116,7 @@ public static Item getItemFromObject(JsonReader object, ExceptionMetadata metada values.add(getItemFromObject(object, metadata)); } object.endArray(); - return ItemFactory.getInstance().createArrayItem(values); + return ItemFactory.getInstance().createArrayItem(values, false); } if (object.peek() == JsonToken.BEGIN_OBJECT) { List keys = new ArrayList<>(); @@ -128,7 +128,7 @@ public static Item getItemFromObject(JsonReader object, ExceptionMetadata metada } object.endObject(); return ItemFactory.getInstance() - .createObjectItem(keys, values, metadata); + .createObjectItem(keys, values, metadata, false); } if (object.peek() == JsonToken.NULL) { object.nextNull(); @@ -203,7 +203,7 @@ public static Item getItemFromYAML( // System.err.println("Next token (reading array): " + nt.toString()); } // System.err.println("Finished reading array."); - return ItemFactory.getInstance().createArrayItem(values); + return ItemFactory.getInstance().createArrayItem(values, false); } if (lookahead.equals(com.fasterxml.jackson.core.JsonToken.START_OBJECT)) { List keys = new ArrayList<>(); @@ -223,7 +223,7 @@ public static Item getItemFromYAML( } // System.err.println("Finished reading object."); return ItemFactory.getInstance() - .createObjectItem(keys, values, metadata); + .createObjectItem(keys, values, metadata, false); } if (lookahead.equals(com.fasterxml.jackson.core.JsonToken.VALUE_NULL)) { return ItemFactory.getInstance().createNullItem(); @@ -261,6 +261,41 @@ public static Item getItemFromRow(Row row, ExceptionMetadata metadata, ItemType return convertValueToItem(row, 0, null, fields[0].dataType(), metadata, itemType); } + if ( + fields.length == 5 + && fieldnames[0].equals(SparkSessionManager.atomicJSONiqItemColumnName) + && fieldnames[4].equals("tableLocation") + ) { + ItemType resType = null; + if (itemType != null) { + resType = itemType.getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType(); + } + Item res = convertValueToItem(row, 0, null, fields[0].dataType(), metadata, resType); + // TODO: refactor to not need to loop and check strings -- Indexes perhaps? + for (int i = 0; i < fields.length; ++i) { + String fieldName = fields[i].name(); + + if (fieldName.equals(SparkSessionManager.mutabilityLevelColumnName)) { + res.setMutabilityLevel(row.getInt(i)); + continue; + } + if (fieldName.equals(SparkSessionManager.rowIdColumnName)) { + res.setTopLevelID(row.getLong(i)); + continue; + } + if (fieldName.equals(SparkSessionManager.pathInColumnName)) { + res.setPathIn(row.getString(i)); + continue; + } + if (fieldName.equals(SparkSessionManager.tableLocationColumnName)) { + res.setTableLocation(row.getString(i)); + } + } + return res; + } + Map content = null; if (itemType != null && !itemType.equals(BuiltinTypesCatalogue.item)) { @@ -272,11 +307,34 @@ public static Item getItemFromRow(Row row, ExceptionMetadata metadata, ItemType } } + int mutabilityLevel = -1; + long topLevelID = -1; + String pathIn = "null"; + String tableLocation = "null"; + for (int i = 0; i < fields.length; ++i) { StructField field = fields[i]; DataType fieldType = field.dataType(); String fieldName = field.name(); ItemType fieldItemType = null; + + if (fieldName.equals(SparkSessionManager.mutabilityLevelColumnName)) { + mutabilityLevel = row.getInt(i); + continue; + } + if (fieldName.equals(SparkSessionManager.rowIdColumnName)) { + topLevelID = row.getLong(i); + continue; + } + if (fieldName.equals(SparkSessionManager.pathInColumnName)) { + pathIn = row.getString(i); + continue; + } + if (fieldName.equals(SparkSessionManager.tableLocationColumnName)) { + tableLocation = row.getString(i); + continue; + } + if (content != null) { FieldDescriptor descriptor = content.get(fieldName); if (descriptor != null) { @@ -304,7 +362,13 @@ public static Item getItemFromRow(Row row, ExceptionMetadata metadata, ItemType } } - return ItemFactory.getInstance().createObjectItem(keys, values, metadata); + Item res = ItemFactory.getInstance().createObjectItem(keys, values, metadata, false); + res.setMutabilityLevel(mutabilityLevel); + res.setTopLevelID(topLevelID); + res.setPathIn(pathIn); + res.setTableLocation(tableLocation); + + return res; } public static Item convertValueToItem( @@ -536,7 +600,7 @@ private static Item convertValueToItem( members.add(convertValueToItem(value, dataType, metadata, memberType)); } } - Item item = ItemFactory.getInstance().createArrayItem(members); + Item item = ItemFactory.getInstance().createArrayItem(members, false); if (itemType == null || itemType.equals(BuiltinTypesCatalogue.arrayItem)) { return item; } else { @@ -556,7 +620,7 @@ private static Item convertValueToItem( for (double value : denseVector.values()) { members.add(ItemFactory.getInstance().createDoubleItem(value)); } - Item item = ItemFactory.getInstance().createArrayItem(members); + Item item = ItemFactory.getInstance().createArrayItem(members, false); if (itemType == null || itemType.equals(BuiltinTypesCatalogue.arrayItem)) { return item; } else { @@ -573,7 +637,7 @@ private static Item convertValueToItem( objectKeyList.add(String.valueOf(vectorIndices[j])); objectValueList.add(ItemFactory.getInstance().createDoubleItem(vectorValues[j])); } - Item item = ItemFactory.getInstance().createObjectItem(objectKeyList, objectValueList, metadata); + Item item = ItemFactory.getInstance().createObjectItem(objectKeyList, objectValueList, metadata, false); if (itemType == null || itemType.equals(BuiltinTypesCatalogue.objectItem)) { return item; } else { diff --git a/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java b/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java index 3eebf78e81..24ba7000fa 100644 --- a/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java +++ b/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java @@ -44,7 +44,6 @@ public RowToItemMapper(ExceptionMetadata metadata) { @Override public Item call(Row row) throws Exception { - Item result = ItemParser.getItemFromRow(row, this.metadata, this.itemType); - return result; + return ItemParser.getItemFromRow(row, this.metadata, this.itemType); } } diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.g4 b/src/main/java/org/rumbledb/parser/Jsoniq.g4 index 34dedea4e8..ea2026fca4 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.g4 +++ b/src/main/java/org/rumbledb/parser/Jsoniq.g4 @@ -76,7 +76,7 @@ typeSwitchStatement : Ktypeswitch '(' cond=expr ')' cases+=caseStatement caseStatement : Kcase (var_ref=varRef Kas)? union+=sequenceType ('|' union+=sequenceType)* Kreturn ret=statement ; -annotation : '%' name=qname ('(' Literal (',' Literal)* ')')? ; +annotation : ('%' name=qname ('(' Literal (',' Literal)* ')')? | updating=Kupdating); annotations : annotation* ; @@ -133,7 +133,7 @@ contextItemDecl : Kdeclare Kcontext Kitem (Kas sequenceType)? ((':=' exp functionDecl : Kdeclare annotations 'function' fn_name=qname '(' paramList? ')' (Kas return_type=sequenceType)? - ('{' (fn_body=statementsAndOptionalExpr) '}' | 'external'); + ('{' (fn_body=statementsAndOptionalExpr) '}' | is_external='external'); typeDecl : Kdeclare Ktype type_name=qname 'as' (schema=schemaLanguage)? type_definition=exprSingle; @@ -430,7 +430,6 @@ keyWords : Kjsoniq | Kappend | Kcopy | Kmodify - | Kjson | Kinto | Kvalue | Kwith @@ -443,6 +442,8 @@ keyWords : Kjsoniq | Kexit | Kreturning | Kwhile + | Kjson + | Kupdating ; ///////////////////////// literals @@ -573,12 +574,14 @@ Kinto : 'into'; Kvalue : 'value'; -Kjson : 'json'; - Kwith : 'with'; Kposition : 'position'; +Kjson : 'json'; + +Kupdating : 'updating'; + ///////////////////////// 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 fe2a2cadbc..d3e3fd1cac 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.interp +++ b/src/main/java/org/rumbledb/parser/Jsoniq.interp @@ -123,9 +123,10 @@ null 'append' 'into' 'value' -'json' 'with' 'position' +'json' +'updating' 'break' 'loop' 'continue' @@ -270,9 +271,10 @@ Kmodify Kappend Kinto Kvalue -Kjson Kwith Kposition +Kjson +Kupdating Kbreak Kloop Kcontinue @@ -423,4 +425,4 @@ keyWords atn: -[4, 1, 144, 1344, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 263, 8, 1, 1, 1, 1, 1, 3, 1, 267, 8, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 3, 4, 283, 8, 4, 1, 4, 1, 4, 5, 4, 287, 8, 4, 10, 4, 12, 4, 290, 9, 4, 1, 4, 1, 4, 1, 4, 5, 4, 295, 8, 4, 10, 4, 12, 4, 298, 9, 4, 1, 5, 1, 5, 1, 6, 5, 6, 303, 8, 6, 10, 6, 12, 6, 306, 9, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 3, 8, 313, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 328, 8, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 3, 16, 358, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 366, 8, 16, 10, 16, 12, 16, 369, 9, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 4, 18, 388, 8, 18, 11, 18, 12, 18, 389, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 4, 19, 398, 8, 19, 11, 19, 12, 19, 399, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 4, 20, 408, 8, 20, 11, 20, 12, 20, 409, 1, 21, 1, 21, 1, 21, 3, 21, 415, 8, 21, 1, 21, 1, 21, 1, 21, 3, 21, 420, 8, 21, 5, 21, 422, 8, 21, 10, 21, 12, 21, 425, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 4, 22, 434, 8, 22, 11, 22, 12, 22, 435, 1, 22, 1, 22, 3, 22, 440, 8, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 449, 8, 23, 1, 23, 1, 23, 1, 23, 5, 23, 454, 8, 23, 10, 23, 12, 23, 457, 9, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 468, 8, 24, 10, 24, 12, 24, 471, 9, 24, 1, 24, 3, 24, 474, 8, 24, 1, 25, 5, 25, 477, 8, 25, 10, 25, 12, 25, 480, 9, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 5, 26, 487, 8, 26, 10, 26, 12, 26, 490, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 3, 27, 497, 8, 27, 1, 27, 1, 27, 3, 27, 501, 8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 513, 8, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 525, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 547, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 553, 8, 35, 10, 35, 12, 35, 556, 9, 35, 1, 36, 1, 36, 3, 36, 560, 8, 36, 1, 36, 3, 36, 563, 8, 36, 1, 36, 1, 36, 3, 36, 567, 8, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 576, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 583, 8, 38, 10, 38, 12, 38, 586, 9, 38, 3, 38, 588, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 596, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 603, 8, 39, 3, 39, 605, 8, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 612, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 619, 8, 40, 3, 40, 621, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 629, 8, 41, 1, 41, 1, 41, 1, 41, 3, 41, 634, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 641, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 648, 8, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 658, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 663, 8, 44, 10, 44, 12, 44, 666, 9, 44, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 672, 8, 45, 1, 46, 1, 46, 1, 46, 5, 46, 677, 8, 46, 10, 46, 12, 46, 680, 9, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 688, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 698, 8, 48, 1, 49, 1, 49, 3, 49, 702, 8, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 5, 49, 710, 8, 49, 10, 49, 12, 49, 713, 9, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 5, 50, 722, 8, 50, 10, 50, 12, 50, 725, 9, 50, 1, 51, 1, 51, 1, 51, 3, 51, 730, 8, 51, 1, 51, 1, 51, 3, 51, 734, 8, 51, 1, 51, 1, 51, 3, 51, 738, 8, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 5, 52, 747, 8, 52, 10, 52, 12, 52, 750, 9, 52, 1, 53, 1, 53, 1, 53, 3, 53, 755, 8, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 768, 8, 55, 10, 55, 12, 55, 771, 9, 55, 1, 56, 1, 56, 1, 56, 3, 56, 776, 8, 56, 1, 56, 1, 56, 3, 56, 780, 8, 56, 1, 56, 1, 56, 3, 56, 784, 8, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 791, 8, 57, 1, 57, 1, 57, 1, 57, 5, 57, 796, 8, 57, 10, 57, 12, 57, 799, 9, 57, 1, 58, 1, 58, 1, 58, 3, 58, 804, 8, 58, 1, 58, 1, 58, 1, 58, 3, 58, 809, 8, 58, 3, 58, 811, 8, 58, 1, 58, 1, 58, 3, 58, 815, 8, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 3, 60, 822, 8, 60, 1, 60, 1, 60, 1, 60, 5, 60, 827, 8, 60, 10, 60, 12, 60, 830, 9, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 3, 61, 838, 8, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 4, 62, 848, 8, 62, 11, 62, 12, 62, 849, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 4, 63, 858, 8, 63, 11, 63, 12, 63, 859, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 4, 64, 870, 8, 64, 11, 64, 12, 64, 871, 1, 64, 1, 64, 3, 64, 876, 8, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 885, 8, 65, 1, 65, 1, 65, 1, 65, 5, 65, 890, 8, 65, 10, 65, 12, 65, 893, 9, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 4, 67, 912, 8, 67, 11, 67, 12, 67, 913, 1, 68, 1, 68, 1, 68, 3, 68, 919, 8, 68, 1, 68, 1, 68, 1, 68, 3, 68, 924, 8, 68, 5, 68, 926, 8, 68, 10, 68, 12, 68, 929, 9, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 5, 69, 938, 8, 69, 10, 69, 12, 69, 941, 9, 69, 1, 70, 1, 70, 1, 70, 5, 70, 946, 8, 70, 10, 70, 12, 70, 949, 9, 70, 1, 71, 3, 71, 952, 8, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 3, 72, 959, 8, 72, 1, 73, 1, 73, 1, 73, 5, 73, 964, 8, 73, 10, 73, 12, 73, 967, 9, 73, 1, 74, 1, 74, 1, 74, 3, 74, 972, 8, 74, 1, 75, 1, 75, 1, 75, 5, 75, 977, 8, 75, 10, 75, 12, 75, 980, 9, 75, 1, 76, 1, 76, 1, 76, 5, 76, 985, 8, 76, 10, 76, 12, 76, 988, 9, 76, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 994, 8, 77, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 1000, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 1006, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 3, 80, 1012, 8, 80, 1, 81, 1, 81, 1, 81, 1, 81, 3, 81, 1018, 8, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82, 1027, 8, 82, 10, 82, 12, 82, 1030, 9, 82, 1, 83, 1, 83, 1, 83, 3, 83, 1035, 8, 83, 1, 84, 5, 84, 1038, 8, 84, 10, 84, 12, 84, 1041, 9, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 3, 85, 1048, 8, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 5, 88, 1067, 8, 88, 10, 88, 12, 88, 1070, 9, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 5, 89, 1078, 8, 89, 10, 89, 12, 89, 1081, 9, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 3, 93, 1103, 8, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 3, 94, 1120, 8, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 3, 97, 1131, 8, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 3, 102, 1153, 8, 102, 5, 102, 1155, 8, 102, 10, 102, 12, 102, 1158, 9, 102, 1, 102, 1, 102, 1, 103, 1, 103, 3, 103, 1164, 8, 103, 1, 104, 1, 104, 3, 104, 1168, 8, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1178, 8, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1183, 8, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 3, 107, 1197, 8, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1204, 8, 107, 10, 107, 12, 107, 1207, 9, 107, 1, 107, 1, 107, 1, 107, 3, 107, 1212, 8, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 5, 111, 1236, 8, 111, 10, 111, 12, 111, 1239, 9, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 4, 113, 1255, 8, 113, 11, 113, 12, 113, 1256, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 3, 115, 1269, 8, 115, 3, 115, 1271, 8, 115, 1, 116, 1, 116, 1, 116, 1, 116, 5, 116, 1277, 8, 116, 10, 116, 12, 116, 1280, 9, 116, 3, 116, 1282, 8, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 3, 116, 1289, 8, 116, 1, 117, 1, 117, 1, 117, 3, 117, 1294, 8, 117, 1, 118, 1, 118, 3, 118, 1298, 8, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 5, 120, 1310, 8, 120, 10, 120, 12, 120, 1313, 9, 120, 3, 120, 1315, 8, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 3, 121, 1323, 8, 121, 1, 122, 1, 122, 3, 122, 1327, 8, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 3, 123, 1334, 8, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 0, 0, 127, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 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, 0, 8, 2, 0, 16, 16, 105, 105, 1, 0, 82, 83, 1, 0, 19, 28, 2, 0, 4, 4, 36, 46, 1, 0, 48, 49, 2, 0, 11, 11, 50, 52, 2, 0, 18, 18, 134, 134, 2, 0, 61, 132, 135, 135, 1409, 0, 254, 1, 0, 0, 0, 2, 262, 1, 0, 0, 0, 4, 268, 1, 0, 0, 0, 6, 271, 1, 0, 0, 0, 8, 288, 1, 0, 0, 0, 10, 299, 1, 0, 0, 0, 12, 304, 1, 0, 0, 0, 14, 307, 1, 0, 0, 0, 16, 310, 1, 0, 0, 0, 18, 327, 1, 0, 0, 0, 20, 329, 1, 0, 0, 0, 22, 332, 1, 0, 0, 0, 24, 338, 1, 0, 0, 0, 26, 342, 1, 0, 0, 0, 28, 346, 1, 0, 0, 0, 30, 350, 1, 0, 0, 0, 32, 357, 1, 0, 0, 0, 34, 373, 1, 0, 0, 0, 36, 382, 1, 0, 0, 0, 38, 397, 1, 0, 0, 0, 40, 404, 1, 0, 0, 0, 42, 411, 1, 0, 0, 0, 44, 428, 1, 0, 0, 0, 46, 444, 1, 0, 0, 0, 48, 461, 1, 0, 0, 0, 50, 478, 1, 0, 0, 0, 52, 481, 1, 0, 0, 0, 54, 493, 1, 0, 0, 0, 56, 502, 1, 0, 0, 0, 58, 512, 1, 0, 0, 0, 60, 514, 1, 0, 0, 0, 62, 524, 1, 0, 0, 0, 64, 526, 1, 0, 0, 0, 66, 531, 1, 0, 0, 0, 68, 535, 1, 0, 0, 0, 70, 541, 1, 0, 0, 0, 72, 562, 1, 0, 0, 0, 74, 568, 1, 0, 0, 0, 76, 570, 1, 0, 0, 0, 78, 589, 1, 0, 0, 0, 80, 606, 1, 0, 0, 0, 82, 622, 1, 0, 0, 0, 84, 642, 1, 0, 0, 0, 86, 657, 1, 0, 0, 0, 88, 659, 1, 0, 0, 0, 90, 667, 1, 0, 0, 0, 92, 673, 1, 0, 0, 0, 94, 687, 1, 0, 0, 0, 96, 697, 1, 0, 0, 0, 98, 701, 1, 0, 0, 0, 100, 717, 1, 0, 0, 0, 102, 726, 1, 0, 0, 0, 104, 742, 1, 0, 0, 0, 106, 751, 1, 0, 0, 0, 108, 759, 1, 0, 0, 0, 110, 762, 1, 0, 0, 0, 112, 772, 1, 0, 0, 0, 114, 790, 1, 0, 0, 0, 116, 800, 1, 0, 0, 0, 118, 816, 1, 0, 0, 0, 120, 821, 1, 0, 0, 0, 122, 834, 1, 0, 0, 0, 124, 842, 1, 0, 0, 0, 126, 857, 1, 0, 0, 0, 128, 864, 1, 0, 0, 0, 130, 880, 1, 0, 0, 0, 132, 897, 1, 0, 0, 0, 134, 906, 1, 0, 0, 0, 136, 915, 1, 0, 0, 0, 138, 934, 1, 0, 0, 0, 140, 942, 1, 0, 0, 0, 142, 951, 1, 0, 0, 0, 144, 955, 1, 0, 0, 0, 146, 960, 1, 0, 0, 0, 148, 968, 1, 0, 0, 0, 150, 973, 1, 0, 0, 0, 152, 981, 1, 0, 0, 0, 154, 989, 1, 0, 0, 0, 156, 995, 1, 0, 0, 0, 158, 1001, 1, 0, 0, 0, 160, 1007, 1, 0, 0, 0, 162, 1013, 1, 0, 0, 0, 164, 1019, 1, 0, 0, 0, 166, 1034, 1, 0, 0, 0, 168, 1039, 1, 0, 0, 0, 170, 1047, 1, 0, 0, 0, 172, 1049, 1, 0, 0, 0, 174, 1056, 1, 0, 0, 0, 176, 1063, 1, 0, 0, 0, 178, 1071, 1, 0, 0, 0, 180, 1082, 1, 0, 0, 0, 182, 1088, 1, 0, 0, 0, 184, 1091, 1, 0, 0, 0, 186, 1095, 1, 0, 0, 0, 188, 1119, 1, 0, 0, 0, 190, 1121, 1, 0, 0, 0, 192, 1125, 1, 0, 0, 0, 194, 1128, 1, 0, 0, 0, 196, 1134, 1, 0, 0, 0, 198, 1136, 1, 0, 0, 0, 200, 1141, 1, 0, 0, 0, 202, 1146, 1, 0, 0, 0, 204, 1149, 1, 0, 0, 0, 206, 1163, 1, 0, 0, 0, 208, 1167, 1, 0, 0, 0, 210, 1169, 1, 0, 0, 0, 212, 1173, 1, 0, 0, 0, 214, 1211, 1, 0, 0, 0, 216, 1213, 1, 0, 0, 0, 218, 1217, 1, 0, 0, 0, 220, 1223, 1, 0, 0, 0, 222, 1231, 1, 0, 0, 0, 224, 1245, 1, 0, 0, 0, 226, 1251, 1, 0, 0, 0, 228, 1258, 1, 0, 0, 0, 230, 1270, 1, 0, 0, 0, 232, 1288, 1, 0, 0, 0, 234, 1293, 1, 0, 0, 0, 236, 1297, 1, 0, 0, 0, 238, 1299, 1, 0, 0, 0, 240, 1304, 1, 0, 0, 0, 242, 1320, 1, 0, 0, 0, 244, 1326, 1, 0, 0, 0, 246, 1331, 1, 0, 0, 0, 248, 1337, 1, 0, 0, 0, 250, 1339, 1, 0, 0, 0, 252, 1341, 1, 0, 0, 0, 254, 255, 3, 2, 1, 0, 255, 256, 5, 0, 0, 1, 256, 1, 1, 0, 0, 0, 257, 258, 5, 104, 0, 0, 258, 259, 5, 103, 0, 0, 259, 260, 3, 250, 125, 0, 260, 261, 5, 1, 0, 0, 261, 263, 1, 0, 0, 0, 262, 257, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 266, 1, 0, 0, 0, 264, 267, 3, 6, 3, 0, 265, 267, 3, 4, 2, 0, 266, 264, 1, 0, 0, 0, 266, 265, 1, 0, 0, 0, 267, 3, 1, 0, 0, 0, 268, 269, 3, 8, 4, 0, 269, 270, 3, 10, 5, 0, 270, 5, 1, 0, 0, 0, 271, 272, 5, 2, 0, 0, 272, 273, 5, 3, 0, 0, 273, 274, 5, 142, 0, 0, 274, 275, 5, 4, 0, 0, 275, 276, 3, 248, 124, 0, 276, 277, 5, 1, 0, 0, 277, 278, 3, 8, 4, 0, 278, 7, 1, 0, 0, 0, 279, 283, 3, 58, 29, 0, 280, 283, 3, 60, 30, 0, 281, 283, 3, 76, 38, 0, 282, 279, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 282, 281, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 285, 5, 1, 0, 0, 285, 287, 1, 0, 0, 0, 286, 282, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 296, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 292, 3, 62, 31, 0, 292, 293, 5, 1, 0, 0, 293, 295, 1, 0, 0, 0, 294, 291, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 9, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 300, 3, 16, 8, 0, 300, 11, 1, 0, 0, 0, 301, 303, 3, 18, 9, 0, 302, 301, 1, 0, 0, 0, 303, 306, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 13, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 307, 308, 3, 12, 6, 0, 308, 309, 3, 92, 46, 0, 309, 15, 1, 0, 0, 0, 310, 312, 3, 12, 6, 0, 311, 313, 3, 92, 46, 0, 312, 311, 1, 0, 0, 0, 312, 313, 1, 0, 0, 0, 313, 17, 1, 0, 0, 0, 314, 328, 3, 20, 10, 0, 315, 328, 3, 22, 11, 0, 316, 328, 3, 24, 12, 0, 317, 328, 3, 26, 13, 0, 318, 328, 3, 28, 14, 0, 319, 328, 3, 30, 15, 0, 320, 328, 3, 32, 16, 0, 321, 328, 3, 34, 17, 0, 322, 328, 3, 36, 18, 0, 323, 328, 3, 40, 20, 0, 324, 328, 3, 44, 22, 0, 325, 328, 3, 52, 26, 0, 326, 328, 3, 56, 28, 0, 327, 314, 1, 0, 0, 0, 327, 315, 1, 0, 0, 0, 327, 316, 1, 0, 0, 0, 327, 317, 1, 0, 0, 0, 327, 318, 1, 0, 0, 0, 327, 319, 1, 0, 0, 0, 327, 320, 1, 0, 0, 0, 327, 321, 1, 0, 0, 0, 327, 322, 1, 0, 0, 0, 327, 323, 1, 0, 0, 0, 327, 324, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 326, 1, 0, 0, 0, 328, 19, 1, 0, 0, 0, 329, 330, 3, 96, 48, 0, 330, 331, 5, 1, 0, 0, 331, 21, 1, 0, 0, 0, 332, 333, 5, 5, 0, 0, 333, 334, 3, 72, 36, 0, 334, 335, 5, 6, 0, 0, 335, 336, 3, 94, 47, 0, 336, 337, 5, 1, 0, 0, 337, 23, 1, 0, 0, 0, 338, 339, 5, 7, 0, 0, 339, 340, 3, 12, 6, 0, 340, 341, 5, 8, 0, 0, 341, 25, 1, 0, 0, 0, 342, 343, 5, 127, 0, 0, 343, 344, 5, 128, 0, 0, 344, 345, 5, 1, 0, 0, 345, 27, 1, 0, 0, 0, 346, 347, 5, 129, 0, 0, 347, 348, 5, 128, 0, 0, 348, 349, 5, 1, 0, 0, 349, 29, 1, 0, 0, 0, 350, 351, 5, 130, 0, 0, 351, 352, 5, 131, 0, 0, 352, 353, 3, 94, 47, 0, 353, 354, 5, 1, 0, 0, 354, 31, 1, 0, 0, 0, 355, 358, 3, 100, 50, 0, 356, 358, 3, 104, 52, 0, 357, 355, 1, 0, 0, 0, 357, 356, 1, 0, 0, 0, 358, 367, 1, 0, 0, 0, 359, 366, 3, 100, 50, 0, 360, 366, 3, 104, 52, 0, 361, 366, 3, 108, 54, 0, 362, 366, 3, 110, 55, 0, 363, 366, 3, 114, 57, 0, 364, 366, 3, 118, 59, 0, 365, 359, 1, 0, 0, 0, 365, 360, 1, 0, 0, 0, 365, 361, 1, 0, 0, 0, 365, 362, 1, 0, 0, 0, 365, 363, 1, 0, 0, 0, 365, 364, 1, 0, 0, 0, 366, 369, 1, 0, 0, 0, 367, 365, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 370, 1, 0, 0, 0, 369, 367, 1, 0, 0, 0, 370, 371, 5, 67, 0, 0, 371, 372, 3, 18, 9, 0, 372, 33, 1, 0, 0, 0, 373, 374, 5, 68, 0, 0, 374, 375, 5, 9, 0, 0, 375, 376, 3, 92, 46, 0, 376, 377, 5, 10, 0, 0, 377, 378, 5, 89, 0, 0, 378, 379, 3, 18, 9, 0, 379, 380, 5, 90, 0, 0, 380, 381, 3, 18, 9, 0, 381, 35, 1, 0, 0, 0, 382, 383, 5, 84, 0, 0, 383, 384, 5, 9, 0, 0, 384, 385, 3, 92, 46, 0, 385, 387, 5, 10, 0, 0, 386, 388, 3, 38, 19, 0, 387, 386, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 392, 5, 88, 0, 0, 392, 393, 5, 67, 0, 0, 393, 394, 3, 18, 9, 0, 394, 37, 1, 0, 0, 0, 395, 396, 5, 85, 0, 0, 396, 398, 3, 94, 47, 0, 397, 395, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 397, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 5, 67, 0, 0, 402, 403, 3, 18, 9, 0, 403, 39, 1, 0, 0, 0, 404, 405, 5, 86, 0, 0, 405, 407, 3, 24, 12, 0, 406, 408, 3, 42, 21, 0, 407, 406, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 407, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 41, 1, 0, 0, 0, 411, 414, 5, 87, 0, 0, 412, 415, 5, 11, 0, 0, 413, 415, 3, 72, 36, 0, 414, 412, 1, 0, 0, 0, 414, 413, 1, 0, 0, 0, 415, 423, 1, 0, 0, 0, 416, 419, 5, 12, 0, 0, 417, 420, 5, 11, 0, 0, 418, 420, 3, 72, 36, 0, 419, 417, 1, 0, 0, 0, 419, 418, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 416, 1, 0, 0, 0, 422, 425, 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 426, 1, 0, 0, 0, 425, 423, 1, 0, 0, 0, 426, 427, 3, 24, 12, 0, 427, 43, 1, 0, 0, 0, 428, 429, 5, 91, 0, 0, 429, 430, 5, 9, 0, 0, 430, 431, 3, 92, 46, 0, 431, 433, 5, 10, 0, 0, 432, 434, 3, 46, 23, 0, 433, 432, 1, 0, 0, 0, 434, 435, 1, 0, 0, 0, 435, 433, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 439, 5, 88, 0, 0, 438, 440, 3, 192, 96, 0, 439, 438, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 442, 5, 67, 0, 0, 442, 443, 3, 18, 9, 0, 443, 45, 1, 0, 0, 0, 444, 448, 5, 85, 0, 0, 445, 446, 3, 192, 96, 0, 446, 447, 5, 70, 0, 0, 447, 449, 1, 0, 0, 0, 448, 445, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 1, 0, 0, 0, 450, 455, 3, 230, 115, 0, 451, 452, 5, 12, 0, 0, 452, 454, 3, 230, 115, 0, 453, 451, 1, 0, 0, 0, 454, 457, 1, 0, 0, 0, 455, 453, 1, 0, 0, 0, 455, 456, 1, 0, 0, 0, 456, 458, 1, 0, 0, 0, 457, 455, 1, 0, 0, 0, 458, 459, 5, 67, 0, 0, 459, 460, 3, 18, 9, 0, 460, 47, 1, 0, 0, 0, 461, 462, 5, 13, 0, 0, 462, 473, 3, 72, 36, 0, 463, 464, 5, 9, 0, 0, 464, 469, 5, 136, 0, 0, 465, 466, 5, 14, 0, 0, 466, 468, 5, 136, 0, 0, 467, 465, 1, 0, 0, 0, 468, 471, 1, 0, 0, 0, 469, 467, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 472, 1, 0, 0, 0, 471, 469, 1, 0, 0, 0, 472, 474, 5, 10, 0, 0, 473, 463, 1, 0, 0, 0, 473, 474, 1, 0, 0, 0, 474, 49, 1, 0, 0, 0, 475, 477, 3, 48, 24, 0, 476, 475, 1, 0, 0, 0, 477, 480, 1, 0, 0, 0, 478, 476, 1, 0, 0, 0, 478, 479, 1, 0, 0, 0, 479, 51, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 481, 482, 3, 50, 25, 0, 482, 483, 5, 114, 0, 0, 483, 488, 3, 54, 27, 0, 484, 485, 5, 14, 0, 0, 485, 487, 3, 54, 27, 0, 486, 484, 1, 0, 0, 0, 487, 490, 1, 0, 0, 0, 488, 486, 1, 0, 0, 0, 488, 489, 1, 0, 0, 0, 489, 491, 1, 0, 0, 0, 490, 488, 1, 0, 0, 0, 491, 492, 5, 1, 0, 0, 492, 53, 1, 0, 0, 0, 493, 496, 3, 192, 96, 0, 494, 495, 5, 70, 0, 0, 495, 497, 3, 230, 115, 0, 496, 494, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 500, 1, 0, 0, 0, 498, 499, 5, 6, 0, 0, 499, 501, 3, 94, 47, 0, 500, 498, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 55, 1, 0, 0, 0, 502, 503, 5, 132, 0, 0, 503, 504, 5, 9, 0, 0, 504, 505, 3, 92, 46, 0, 505, 506, 5, 10, 0, 0, 506, 507, 3, 18, 9, 0, 507, 57, 1, 0, 0, 0, 508, 513, 3, 64, 32, 0, 509, 513, 3, 66, 33, 0, 510, 513, 3, 68, 34, 0, 511, 513, 3, 70, 35, 0, 512, 508, 1, 0, 0, 0, 512, 509, 1, 0, 0, 0, 512, 510, 1, 0, 0, 0, 512, 511, 1, 0, 0, 0, 513, 59, 1, 0, 0, 0, 514, 515, 5, 111, 0, 0, 515, 516, 5, 3, 0, 0, 516, 517, 5, 142, 0, 0, 517, 518, 5, 4, 0, 0, 518, 519, 3, 248, 124, 0, 519, 61, 1, 0, 0, 0, 520, 525, 3, 82, 41, 0, 521, 525, 3, 78, 39, 0, 522, 525, 3, 84, 42, 0, 523, 525, 3, 80, 40, 0, 524, 520, 1, 0, 0, 0, 524, 521, 1, 0, 0, 0, 524, 522, 1, 0, 0, 0, 524, 523, 1, 0, 0, 0, 525, 63, 1, 0, 0, 0, 526, 527, 5, 111, 0, 0, 527, 528, 5, 88, 0, 0, 528, 529, 5, 81, 0, 0, 529, 530, 3, 248, 124, 0, 530, 65, 1, 0, 0, 0, 531, 532, 5, 111, 0, 0, 532, 533, 5, 15, 0, 0, 533, 534, 7, 0, 0, 0, 534, 67, 1, 0, 0, 0, 535, 536, 5, 111, 0, 0, 536, 537, 5, 88, 0, 0, 537, 538, 5, 66, 0, 0, 538, 539, 5, 73, 0, 0, 539, 540, 7, 1, 0, 0, 540, 69, 1, 0, 0, 0, 541, 546, 5, 111, 0, 0, 542, 543, 5, 17, 0, 0, 543, 547, 3, 72, 36, 0, 544, 545, 5, 88, 0, 0, 545, 547, 5, 17, 0, 0, 546, 542, 1, 0, 0, 0, 546, 544, 1, 0, 0, 0, 547, 554, 1, 0, 0, 0, 548, 549, 3, 74, 37, 0, 549, 550, 5, 4, 0, 0, 550, 551, 3, 250, 125, 0, 551, 553, 1, 0, 0, 0, 552, 548, 1, 0, 0, 0, 553, 556, 1, 0, 0, 0, 554, 552, 1, 0, 0, 0, 554, 555, 1, 0, 0, 0, 555, 71, 1, 0, 0, 0, 556, 554, 1, 0, 0, 0, 557, 560, 5, 142, 0, 0, 558, 560, 3, 252, 126, 0, 559, 557, 1, 0, 0, 0, 559, 558, 1, 0, 0, 0, 560, 561, 1, 0, 0, 0, 561, 563, 5, 18, 0, 0, 562, 559, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 566, 1, 0, 0, 0, 564, 567, 5, 142, 0, 0, 565, 567, 3, 252, 126, 0, 566, 564, 1, 0, 0, 0, 566, 565, 1, 0, 0, 0, 567, 73, 1, 0, 0, 0, 568, 569, 7, 2, 0, 0, 569, 75, 1, 0, 0, 0, 570, 571, 5, 29, 0, 0, 571, 575, 5, 2, 0, 0, 572, 573, 5, 3, 0, 0, 573, 574, 5, 142, 0, 0, 574, 576, 5, 4, 0, 0, 575, 572, 1, 0, 0, 0, 575, 576, 1, 0, 0, 0, 576, 577, 1, 0, 0, 0, 577, 587, 3, 248, 124, 0, 578, 579, 5, 71, 0, 0, 579, 584, 3, 248, 124, 0, 580, 581, 5, 14, 0, 0, 581, 583, 3, 248, 124, 0, 582, 580, 1, 0, 0, 0, 583, 586, 1, 0, 0, 0, 584, 582, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 588, 1, 0, 0, 0, 586, 584, 1, 0, 0, 0, 587, 578, 1, 0, 0, 0, 587, 588, 1, 0, 0, 0, 588, 77, 1, 0, 0, 0, 589, 590, 5, 111, 0, 0, 590, 591, 3, 50, 25, 0, 591, 592, 5, 114, 0, 0, 592, 595, 3, 192, 96, 0, 593, 594, 5, 70, 0, 0, 594, 596, 3, 230, 115, 0, 595, 593, 1, 0, 0, 0, 595, 596, 1, 0, 0, 0, 596, 604, 1, 0, 0, 0, 597, 598, 5, 6, 0, 0, 598, 605, 3, 94, 47, 0, 599, 602, 5, 30, 0, 0, 600, 601, 5, 6, 0, 0, 601, 603, 3, 94, 47, 0, 602, 600, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 605, 1, 0, 0, 0, 604, 597, 1, 0, 0, 0, 604, 599, 1, 0, 0, 0, 605, 79, 1, 0, 0, 0, 606, 607, 5, 111, 0, 0, 607, 608, 5, 112, 0, 0, 608, 611, 5, 113, 0, 0, 609, 610, 5, 70, 0, 0, 610, 612, 3, 230, 115, 0, 611, 609, 1, 0, 0, 0, 611, 612, 1, 0, 0, 0, 612, 620, 1, 0, 0, 0, 613, 614, 5, 6, 0, 0, 614, 621, 3, 94, 47, 0, 615, 618, 5, 30, 0, 0, 616, 617, 5, 6, 0, 0, 617, 619, 3, 94, 47, 0, 618, 616, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 621, 1, 0, 0, 0, 620, 613, 1, 0, 0, 0, 620, 615, 1, 0, 0, 0, 621, 81, 1, 0, 0, 0, 622, 623, 5, 111, 0, 0, 623, 624, 3, 50, 25, 0, 624, 625, 5, 31, 0, 0, 625, 626, 3, 72, 36, 0, 626, 628, 5, 9, 0, 0, 627, 629, 3, 88, 44, 0, 628, 627, 1, 0, 0, 0, 628, 629, 1, 0, 0, 0, 629, 630, 1, 0, 0, 0, 630, 633, 5, 10, 0, 0, 631, 632, 5, 70, 0, 0, 632, 634, 3, 230, 115, 0, 633, 631, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 640, 1, 0, 0, 0, 635, 636, 5, 7, 0, 0, 636, 637, 3, 16, 8, 0, 637, 638, 5, 8, 0, 0, 638, 641, 1, 0, 0, 0, 639, 641, 5, 30, 0, 0, 640, 635, 1, 0, 0, 0, 640, 639, 1, 0, 0, 0, 641, 83, 1, 0, 0, 0, 642, 643, 5, 111, 0, 0, 643, 644, 5, 108, 0, 0, 644, 645, 3, 72, 36, 0, 645, 647, 5, 70, 0, 0, 646, 648, 3, 86, 43, 0, 647, 646, 1, 0, 0, 0, 647, 648, 1, 0, 0, 0, 648, 649, 1, 0, 0, 0, 649, 650, 3, 94, 47, 0, 650, 85, 1, 0, 0, 0, 651, 652, 5, 32, 0, 0, 652, 658, 5, 33, 0, 0, 653, 654, 5, 32, 0, 0, 654, 658, 5, 34, 0, 0, 655, 656, 5, 124, 0, 0, 656, 658, 5, 35, 0, 0, 657, 651, 1, 0, 0, 0, 657, 653, 1, 0, 0, 0, 657, 655, 1, 0, 0, 0, 658, 87, 1, 0, 0, 0, 659, 664, 3, 90, 45, 0, 660, 661, 5, 14, 0, 0, 661, 663, 3, 90, 45, 0, 662, 660, 1, 0, 0, 0, 663, 666, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 664, 665, 1, 0, 0, 0, 665, 89, 1, 0, 0, 0, 666, 664, 1, 0, 0, 0, 667, 668, 5, 5, 0, 0, 668, 671, 3, 72, 36, 0, 669, 670, 5, 70, 0, 0, 670, 672, 3, 230, 115, 0, 671, 669, 1, 0, 0, 0, 671, 672, 1, 0, 0, 0, 672, 91, 1, 0, 0, 0, 673, 678, 3, 94, 47, 0, 674, 675, 5, 14, 0, 0, 675, 677, 3, 94, 47, 0, 676, 674, 1, 0, 0, 0, 677, 680, 1, 0, 0, 0, 678, 676, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 93, 1, 0, 0, 0, 680, 678, 1, 0, 0, 0, 681, 688, 3, 96, 48, 0, 682, 688, 3, 98, 49, 0, 683, 688, 3, 124, 62, 0, 684, 688, 3, 128, 64, 0, 685, 688, 3, 132, 66, 0, 686, 688, 3, 134, 67, 0, 687, 681, 1, 0, 0, 0, 687, 682, 1, 0, 0, 0, 687, 683, 1, 0, 0, 0, 687, 684, 1, 0, 0, 0, 687, 685, 1, 0, 0, 0, 687, 686, 1, 0, 0, 0, 688, 95, 1, 0, 0, 0, 689, 698, 3, 120, 60, 0, 690, 698, 3, 138, 69, 0, 691, 698, 3, 214, 107, 0, 692, 698, 3, 216, 108, 0, 693, 698, 3, 218, 109, 0, 694, 698, 3, 220, 110, 0, 695, 698, 3, 222, 111, 0, 696, 698, 3, 224, 112, 0, 697, 689, 1, 0, 0, 0, 697, 690, 1, 0, 0, 0, 697, 691, 1, 0, 0, 0, 697, 692, 1, 0, 0, 0, 697, 693, 1, 0, 0, 0, 697, 694, 1, 0, 0, 0, 697, 695, 1, 0, 0, 0, 697, 696, 1, 0, 0, 0, 698, 97, 1, 0, 0, 0, 699, 702, 3, 100, 50, 0, 700, 702, 3, 104, 52, 0, 701, 699, 1, 0, 0, 0, 701, 700, 1, 0, 0, 0, 702, 711, 1, 0, 0, 0, 703, 710, 3, 100, 50, 0, 704, 710, 3, 104, 52, 0, 705, 710, 3, 108, 54, 0, 706, 710, 3, 110, 55, 0, 707, 710, 3, 114, 57, 0, 708, 710, 3, 118, 59, 0, 709, 703, 1, 0, 0, 0, 709, 704, 1, 0, 0, 0, 709, 705, 1, 0, 0, 0, 709, 706, 1, 0, 0, 0, 709, 707, 1, 0, 0, 0, 709, 708, 1, 0, 0, 0, 710, 713, 1, 0, 0, 0, 711, 709, 1, 0, 0, 0, 711, 712, 1, 0, 0, 0, 712, 714, 1, 0, 0, 0, 713, 711, 1, 0, 0, 0, 714, 715, 5, 67, 0, 0, 715, 716, 3, 94, 47, 0, 716, 99, 1, 0, 0, 0, 717, 718, 5, 61, 0, 0, 718, 723, 3, 102, 51, 0, 719, 720, 5, 14, 0, 0, 720, 722, 3, 102, 51, 0, 721, 719, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 723, 724, 1, 0, 0, 0, 724, 101, 1, 0, 0, 0, 725, 723, 1, 0, 0, 0, 726, 729, 3, 192, 96, 0, 727, 728, 5, 70, 0, 0, 728, 730, 3, 230, 115, 0, 729, 727, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 733, 1, 0, 0, 0, 731, 732, 5, 72, 0, 0, 732, 734, 5, 73, 0, 0, 733, 731, 1, 0, 0, 0, 733, 734, 1, 0, 0, 0, 734, 737, 1, 0, 0, 0, 735, 736, 5, 71, 0, 0, 736, 738, 3, 192, 96, 0, 737, 735, 1, 0, 0, 0, 737, 738, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 740, 5, 69, 0, 0, 740, 741, 3, 94, 47, 0, 741, 103, 1, 0, 0, 0, 742, 743, 5, 62, 0, 0, 743, 748, 3, 106, 53, 0, 744, 745, 5, 14, 0, 0, 745, 747, 3, 106, 53, 0, 746, 744, 1, 0, 0, 0, 747, 750, 1, 0, 0, 0, 748, 746, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 105, 1, 0, 0, 0, 750, 748, 1, 0, 0, 0, 751, 754, 3, 192, 96, 0, 752, 753, 5, 70, 0, 0, 753, 755, 3, 230, 115, 0, 754, 752, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 756, 1, 0, 0, 0, 756, 757, 5, 6, 0, 0, 757, 758, 3, 94, 47, 0, 758, 107, 1, 0, 0, 0, 759, 760, 5, 63, 0, 0, 760, 761, 3, 94, 47, 0, 761, 109, 1, 0, 0, 0, 762, 763, 5, 64, 0, 0, 763, 764, 5, 65, 0, 0, 764, 769, 3, 112, 56, 0, 765, 766, 5, 14, 0, 0, 766, 768, 3, 112, 56, 0, 767, 765, 1, 0, 0, 0, 768, 771, 1, 0, 0, 0, 769, 767, 1, 0, 0, 0, 769, 770, 1, 0, 0, 0, 770, 111, 1, 0, 0, 0, 771, 769, 1, 0, 0, 0, 772, 779, 3, 192, 96, 0, 773, 774, 5, 70, 0, 0, 774, 776, 3, 230, 115, 0, 775, 773, 1, 0, 0, 0, 775, 776, 1, 0, 0, 0, 776, 777, 1, 0, 0, 0, 777, 778, 5, 6, 0, 0, 778, 780, 3, 94, 47, 0, 779, 775, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 783, 1, 0, 0, 0, 781, 782, 5, 81, 0, 0, 782, 784, 3, 248, 124, 0, 783, 781, 1, 0, 0, 0, 783, 784, 1, 0, 0, 0, 784, 113, 1, 0, 0, 0, 785, 786, 5, 66, 0, 0, 786, 791, 5, 65, 0, 0, 787, 788, 5, 75, 0, 0, 788, 789, 5, 66, 0, 0, 789, 791, 5, 65, 0, 0, 790, 785, 1, 0, 0, 0, 790, 787, 1, 0, 0, 0, 791, 792, 1, 0, 0, 0, 792, 797, 3, 116, 58, 0, 793, 794, 5, 14, 0, 0, 794, 796, 3, 116, 58, 0, 795, 793, 1, 0, 0, 0, 796, 799, 1, 0, 0, 0, 797, 795, 1, 0, 0, 0, 797, 798, 1, 0, 0, 0, 798, 115, 1, 0, 0, 0, 799, 797, 1, 0, 0, 0, 800, 803, 3, 94, 47, 0, 801, 804, 5, 76, 0, 0, 802, 804, 5, 77, 0, 0, 803, 801, 1, 0, 0, 0, 803, 802, 1, 0, 0, 0, 803, 804, 1, 0, 0, 0, 804, 810, 1, 0, 0, 0, 805, 808, 5, 73, 0, 0, 806, 809, 5, 82, 0, 0, 807, 809, 5, 83, 0, 0, 808, 806, 1, 0, 0, 0, 808, 807, 1, 0, 0, 0, 809, 811, 1, 0, 0, 0, 810, 805, 1, 0, 0, 0, 810, 811, 1, 0, 0, 0, 811, 814, 1, 0, 0, 0, 812, 813, 5, 81, 0, 0, 813, 815, 3, 248, 124, 0, 814, 812, 1, 0, 0, 0, 814, 815, 1, 0, 0, 0, 815, 117, 1, 0, 0, 0, 816, 817, 5, 74, 0, 0, 817, 818, 3, 192, 96, 0, 818, 119, 1, 0, 0, 0, 819, 822, 5, 78, 0, 0, 820, 822, 5, 79, 0, 0, 821, 819, 1, 0, 0, 0, 821, 820, 1, 0, 0, 0, 822, 823, 1, 0, 0, 0, 823, 828, 3, 122, 61, 0, 824, 825, 5, 14, 0, 0, 825, 827, 3, 122, 61, 0, 826, 824, 1, 0, 0, 0, 827, 830, 1, 0, 0, 0, 828, 826, 1, 0, 0, 0, 828, 829, 1, 0, 0, 0, 829, 831, 1, 0, 0, 0, 830, 828, 1, 0, 0, 0, 831, 832, 5, 80, 0, 0, 832, 833, 3, 94, 47, 0, 833, 121, 1, 0, 0, 0, 834, 837, 3, 192, 96, 0, 835, 836, 5, 70, 0, 0, 836, 838, 3, 230, 115, 0, 837, 835, 1, 0, 0, 0, 837, 838, 1, 0, 0, 0, 838, 839, 1, 0, 0, 0, 839, 840, 5, 69, 0, 0, 840, 841, 3, 94, 47, 0, 841, 123, 1, 0, 0, 0, 842, 843, 5, 84, 0, 0, 843, 844, 5, 9, 0, 0, 844, 845, 3, 92, 46, 0, 845, 847, 5, 10, 0, 0, 846, 848, 3, 126, 63, 0, 847, 846, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 847, 1, 0, 0, 0, 849, 850, 1, 0, 0, 0, 850, 851, 1, 0, 0, 0, 851, 852, 5, 88, 0, 0, 852, 853, 5, 67, 0, 0, 853, 854, 3, 94, 47, 0, 854, 125, 1, 0, 0, 0, 855, 856, 5, 85, 0, 0, 856, 858, 3, 94, 47, 0, 857, 855, 1, 0, 0, 0, 858, 859, 1, 0, 0, 0, 859, 857, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 5, 67, 0, 0, 862, 863, 3, 94, 47, 0, 863, 127, 1, 0, 0, 0, 864, 865, 5, 91, 0, 0, 865, 866, 5, 9, 0, 0, 866, 867, 3, 92, 46, 0, 867, 869, 5, 10, 0, 0, 868, 870, 3, 130, 65, 0, 869, 868, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 869, 1, 0, 0, 0, 871, 872, 1, 0, 0, 0, 872, 873, 1, 0, 0, 0, 873, 875, 5, 88, 0, 0, 874, 876, 3, 192, 96, 0, 875, 874, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 878, 5, 67, 0, 0, 878, 879, 3, 94, 47, 0, 879, 129, 1, 0, 0, 0, 880, 884, 5, 85, 0, 0, 881, 882, 3, 192, 96, 0, 882, 883, 5, 70, 0, 0, 883, 885, 1, 0, 0, 0, 884, 881, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 1, 0, 0, 0, 886, 891, 3, 230, 115, 0, 887, 888, 5, 12, 0, 0, 888, 890, 3, 230, 115, 0, 889, 887, 1, 0, 0, 0, 890, 893, 1, 0, 0, 0, 891, 889, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 894, 1, 0, 0, 0, 893, 891, 1, 0, 0, 0, 894, 895, 5, 67, 0, 0, 895, 896, 3, 94, 47, 0, 896, 131, 1, 0, 0, 0, 897, 898, 5, 68, 0, 0, 898, 899, 5, 9, 0, 0, 899, 900, 3, 92, 46, 0, 900, 901, 5, 10, 0, 0, 901, 902, 5, 89, 0, 0, 902, 903, 3, 94, 47, 0, 903, 904, 5, 90, 0, 0, 904, 905, 3, 94, 47, 0, 905, 133, 1, 0, 0, 0, 906, 907, 5, 86, 0, 0, 907, 908, 5, 7, 0, 0, 908, 909, 3, 92, 46, 0, 909, 911, 5, 8, 0, 0, 910, 912, 3, 136, 68, 0, 911, 910, 1, 0, 0, 0, 912, 913, 1, 0, 0, 0, 913, 911, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 135, 1, 0, 0, 0, 915, 918, 5, 87, 0, 0, 916, 919, 5, 11, 0, 0, 917, 919, 3, 72, 36, 0, 918, 916, 1, 0, 0, 0, 918, 917, 1, 0, 0, 0, 919, 927, 1, 0, 0, 0, 920, 923, 5, 12, 0, 0, 921, 924, 5, 11, 0, 0, 922, 924, 3, 72, 36, 0, 923, 921, 1, 0, 0, 0, 923, 922, 1, 0, 0, 0, 924, 926, 1, 0, 0, 0, 925, 920, 1, 0, 0, 0, 926, 929, 1, 0, 0, 0, 927, 925, 1, 0, 0, 0, 927, 928, 1, 0, 0, 0, 928, 930, 1, 0, 0, 0, 929, 927, 1, 0, 0, 0, 930, 931, 5, 7, 0, 0, 931, 932, 3, 92, 46, 0, 932, 933, 5, 8, 0, 0, 933, 137, 1, 0, 0, 0, 934, 939, 3, 140, 70, 0, 935, 936, 5, 92, 0, 0, 936, 938, 3, 140, 70, 0, 937, 935, 1, 0, 0, 0, 938, 941, 1, 0, 0, 0, 939, 937, 1, 0, 0, 0, 939, 940, 1, 0, 0, 0, 940, 139, 1, 0, 0, 0, 941, 939, 1, 0, 0, 0, 942, 947, 3, 142, 71, 0, 943, 944, 5, 93, 0, 0, 944, 946, 3, 142, 71, 0, 945, 943, 1, 0, 0, 0, 946, 949, 1, 0, 0, 0, 947, 945, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 141, 1, 0, 0, 0, 949, 947, 1, 0, 0, 0, 950, 952, 5, 94, 0, 0, 951, 950, 1, 0, 0, 0, 951, 952, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 954, 3, 144, 72, 0, 954, 143, 1, 0, 0, 0, 955, 958, 3, 146, 73, 0, 956, 957, 7, 3, 0, 0, 957, 959, 3, 146, 73, 0, 958, 956, 1, 0, 0, 0, 958, 959, 1, 0, 0, 0, 959, 145, 1, 0, 0, 0, 960, 965, 3, 148, 74, 0, 961, 962, 5, 47, 0, 0, 962, 964, 3, 148, 74, 0, 963, 961, 1, 0, 0, 0, 964, 967, 1, 0, 0, 0, 965, 963, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 147, 1, 0, 0, 0, 967, 965, 1, 0, 0, 0, 968, 971, 3, 150, 75, 0, 969, 970, 5, 95, 0, 0, 970, 972, 3, 150, 75, 0, 971, 969, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 149, 1, 0, 0, 0, 973, 978, 3, 152, 76, 0, 974, 975, 7, 4, 0, 0, 975, 977, 3, 152, 76, 0, 976, 974, 1, 0, 0, 0, 977, 980, 1, 0, 0, 0, 978, 976, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 151, 1, 0, 0, 0, 980, 978, 1, 0, 0, 0, 981, 986, 3, 154, 77, 0, 982, 983, 7, 5, 0, 0, 983, 985, 3, 154, 77, 0, 984, 982, 1, 0, 0, 0, 985, 988, 1, 0, 0, 0, 986, 984, 1, 0, 0, 0, 986, 987, 1, 0, 0, 0, 987, 153, 1, 0, 0, 0, 988, 986, 1, 0, 0, 0, 989, 993, 3, 156, 78, 0, 990, 991, 5, 96, 0, 0, 991, 992, 5, 97, 0, 0, 992, 994, 3, 230, 115, 0, 993, 990, 1, 0, 0, 0, 993, 994, 1, 0, 0, 0, 994, 155, 1, 0, 0, 0, 995, 999, 3, 158, 79, 0, 996, 997, 5, 99, 0, 0, 997, 998, 5, 98, 0, 0, 998, 1000, 3, 230, 115, 0, 999, 996, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 157, 1, 0, 0, 0, 1001, 1005, 3, 160, 80, 0, 1002, 1003, 5, 100, 0, 0, 1003, 1004, 5, 70, 0, 0, 1004, 1006, 3, 230, 115, 0, 1005, 1002, 1, 0, 0, 0, 1005, 1006, 1, 0, 0, 0, 1006, 159, 1, 0, 0, 0, 1007, 1011, 3, 162, 81, 0, 1008, 1009, 5, 102, 0, 0, 1009, 1010, 5, 70, 0, 0, 1010, 1012, 3, 242, 121, 0, 1011, 1008, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 161, 1, 0, 0, 0, 1013, 1017, 3, 164, 82, 0, 1014, 1015, 5, 101, 0, 0, 1015, 1016, 5, 70, 0, 0, 1016, 1018, 3, 242, 121, 0, 1017, 1014, 1, 0, 0, 0, 1017, 1018, 1, 0, 0, 0, 1018, 163, 1, 0, 0, 0, 1019, 1028, 3, 168, 84, 0, 1020, 1021, 5, 4, 0, 0, 1021, 1022, 5, 45, 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 3, 166, 83, 0, 1024, 1025, 3, 204, 102, 0, 1025, 1027, 1, 0, 0, 0, 1026, 1020, 1, 0, 0, 0, 1027, 1030, 1, 0, 0, 0, 1028, 1026, 1, 0, 0, 0, 1028, 1029, 1, 0, 0, 0, 1029, 165, 1, 0, 0, 0, 1030, 1028, 1, 0, 0, 0, 1031, 1035, 3, 72, 36, 0, 1032, 1035, 3, 192, 96, 0, 1033, 1035, 3, 194, 97, 0, 1034, 1031, 1, 0, 0, 0, 1034, 1032, 1, 0, 0, 0, 1034, 1033, 1, 0, 0, 0, 1035, 167, 1, 0, 0, 0, 1036, 1038, 7, 4, 0, 0, 1037, 1036, 1, 0, 0, 0, 1038, 1041, 1, 0, 0, 0, 1039, 1037, 1, 0, 0, 0, 1039, 1040, 1, 0, 0, 0, 1040, 1042, 1, 0, 0, 0, 1041, 1039, 1, 0, 0, 0, 1042, 1043, 3, 170, 85, 0, 1043, 169, 1, 0, 0, 0, 1044, 1048, 3, 176, 88, 0, 1045, 1048, 3, 172, 86, 0, 1046, 1048, 3, 174, 87, 0, 1047, 1044, 1, 0, 0, 0, 1047, 1045, 1, 0, 0, 0, 1047, 1046, 1, 0, 0, 0, 1048, 171, 1, 0, 0, 0, 1049, 1050, 5, 109, 0, 0, 1050, 1051, 5, 108, 0, 0, 1051, 1052, 3, 230, 115, 0, 1052, 1053, 5, 7, 0, 0, 1053, 1054, 3, 92, 46, 0, 1054, 1055, 5, 8, 0, 0, 1055, 173, 1, 0, 0, 0, 1056, 1057, 5, 110, 0, 0, 1057, 1058, 5, 108, 0, 0, 1058, 1059, 3, 230, 115, 0, 1059, 1060, 5, 7, 0, 0, 1060, 1061, 3, 92, 46, 0, 1061, 1062, 5, 8, 0, 0, 1062, 175, 1, 0, 0, 0, 1063, 1068, 3, 178, 89, 0, 1064, 1065, 5, 53, 0, 0, 1065, 1067, 3, 178, 89, 0, 1066, 1064, 1, 0, 0, 0, 1067, 1070, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1069, 177, 1, 0, 0, 0, 1070, 1068, 1, 0, 0, 0, 1071, 1079, 3, 188, 94, 0, 1072, 1078, 3, 180, 90, 0, 1073, 1078, 3, 184, 92, 0, 1074, 1078, 3, 186, 93, 0, 1075, 1078, 3, 182, 91, 0, 1076, 1078, 3, 204, 102, 0, 1077, 1072, 1, 0, 0, 0, 1077, 1073, 1, 0, 0, 0, 1077, 1074, 1, 0, 0, 0, 1077, 1075, 1, 0, 0, 0, 1077, 1076, 1, 0, 0, 0, 1078, 1081, 1, 0, 0, 0, 1079, 1077, 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 179, 1, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1082, 1083, 5, 54, 0, 0, 1083, 1084, 5, 54, 0, 0, 1084, 1085, 3, 92, 46, 0, 1085, 1086, 5, 55, 0, 0, 1086, 1087, 5, 55, 0, 0, 1087, 181, 1, 0, 0, 0, 1088, 1089, 5, 54, 0, 0, 1089, 1090, 5, 55, 0, 0, 1090, 183, 1, 0, 0, 0, 1091, 1092, 5, 54, 0, 0, 1092, 1093, 3, 92, 46, 0, 1093, 1094, 5, 55, 0, 0, 1094, 185, 1, 0, 0, 0, 1095, 1102, 5, 56, 0, 0, 1096, 1103, 3, 252, 126, 0, 1097, 1103, 3, 250, 125, 0, 1098, 1103, 5, 142, 0, 0, 1099, 1103, 3, 194, 97, 0, 1100, 1103, 3, 192, 96, 0, 1101, 1103, 3, 196, 98, 0, 1102, 1096, 1, 0, 0, 0, 1102, 1097, 1, 0, 0, 0, 1102, 1098, 1, 0, 0, 0, 1102, 1099, 1, 0, 0, 0, 1102, 1100, 1, 0, 0, 0, 1102, 1101, 1, 0, 0, 0, 1103, 187, 1, 0, 0, 0, 1104, 1120, 5, 135, 0, 0, 1105, 1120, 5, 106, 0, 0, 1106, 1120, 5, 107, 0, 0, 1107, 1120, 5, 136, 0, 0, 1108, 1120, 3, 250, 125, 0, 1109, 1120, 3, 192, 96, 0, 1110, 1120, 3, 194, 97, 0, 1111, 1120, 3, 196, 98, 0, 1112, 1120, 3, 232, 116, 0, 1113, 1120, 3, 202, 101, 0, 1114, 1120, 3, 198, 99, 0, 1115, 1120, 3, 200, 100, 0, 1116, 1120, 3, 246, 123, 0, 1117, 1120, 3, 208, 104, 0, 1118, 1120, 3, 190, 95, 0, 1119, 1104, 1, 0, 0, 0, 1119, 1105, 1, 0, 0, 0, 1119, 1106, 1, 0, 0, 0, 1119, 1107, 1, 0, 0, 0, 1119, 1108, 1, 0, 0, 0, 1119, 1109, 1, 0, 0, 0, 1119, 1110, 1, 0, 0, 0, 1119, 1111, 1, 0, 0, 0, 1119, 1112, 1, 0, 0, 0, 1119, 1113, 1, 0, 0, 0, 1119, 1114, 1, 0, 0, 0, 1119, 1115, 1, 0, 0, 0, 1119, 1116, 1, 0, 0, 0, 1119, 1117, 1, 0, 0, 0, 1119, 1118, 1, 0, 0, 0, 1120, 189, 1, 0, 0, 0, 1121, 1122, 5, 7, 0, 0, 1122, 1123, 3, 14, 7, 0, 1123, 1124, 5, 8, 0, 0, 1124, 191, 1, 0, 0, 0, 1125, 1126, 5, 5, 0, 0, 1126, 1127, 3, 72, 36, 0, 1127, 193, 1, 0, 0, 0, 1128, 1130, 5, 9, 0, 0, 1129, 1131, 3, 92, 46, 0, 1130, 1129, 1, 0, 0, 0, 1130, 1131, 1, 0, 0, 0, 1131, 1132, 1, 0, 0, 0, 1132, 1133, 5, 10, 0, 0, 1133, 195, 1, 0, 0, 0, 1134, 1135, 5, 57, 0, 0, 1135, 197, 1, 0, 0, 0, 1136, 1137, 5, 16, 0, 0, 1137, 1138, 5, 7, 0, 0, 1138, 1139, 3, 92, 46, 0, 1139, 1140, 5, 8, 0, 0, 1140, 199, 1, 0, 0, 0, 1141, 1142, 5, 105, 0, 0, 1142, 1143, 5, 7, 0, 0, 1143, 1144, 3, 92, 46, 0, 1144, 1145, 5, 8, 0, 0, 1145, 201, 1, 0, 0, 0, 1146, 1147, 3, 72, 36, 0, 1147, 1148, 3, 204, 102, 0, 1148, 203, 1, 0, 0, 0, 1149, 1156, 5, 9, 0, 0, 1150, 1152, 3, 206, 103, 0, 1151, 1153, 5, 14, 0, 0, 1152, 1151, 1, 0, 0, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1155, 1, 0, 0, 0, 1154, 1150, 1, 0, 0, 0, 1155, 1158, 1, 0, 0, 0, 1156, 1154, 1, 0, 0, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1159, 1, 0, 0, 0, 1158, 1156, 1, 0, 0, 0, 1159, 1160, 5, 10, 0, 0, 1160, 205, 1, 0, 0, 0, 1161, 1164, 3, 94, 47, 0, 1162, 1164, 5, 134, 0, 0, 1163, 1161, 1, 0, 0, 0, 1163, 1162, 1, 0, 0, 0, 1164, 207, 1, 0, 0, 0, 1165, 1168, 3, 210, 105, 0, 1166, 1168, 3, 212, 106, 0, 1167, 1165, 1, 0, 0, 0, 1167, 1166, 1, 0, 0, 0, 1168, 209, 1, 0, 0, 0, 1169, 1170, 3, 72, 36, 0, 1170, 1171, 5, 58, 0, 0, 1171, 1172, 5, 136, 0, 0, 1172, 211, 1, 0, 0, 0, 1173, 1174, 3, 50, 25, 0, 1174, 1175, 5, 31, 0, 0, 1175, 1177, 5, 9, 0, 0, 1176, 1178, 3, 88, 44, 0, 1177, 1176, 1, 0, 0, 0, 1177, 1178, 1, 0, 0, 0, 1178, 1179, 1, 0, 0, 0, 1179, 1182, 5, 10, 0, 0, 1180, 1181, 5, 70, 0, 0, 1181, 1183, 3, 230, 115, 0, 1182, 1180, 1, 0, 0, 0, 1182, 1183, 1, 0, 0, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1185, 5, 7, 0, 0, 1185, 1186, 3, 16, 8, 0, 1186, 1187, 5, 8, 0, 0, 1187, 213, 1, 0, 0, 0, 1188, 1189, 5, 115, 0, 0, 1189, 1190, 5, 124, 0, 0, 1190, 1191, 3, 94, 47, 0, 1191, 1192, 5, 122, 0, 0, 1192, 1196, 3, 94, 47, 0, 1193, 1194, 5, 71, 0, 0, 1194, 1195, 5, 126, 0, 0, 1195, 1197, 3, 94, 47, 0, 1196, 1193, 1, 0, 0, 0, 1196, 1197, 1, 0, 0, 0, 1197, 1212, 1, 0, 0, 0, 1198, 1199, 5, 115, 0, 0, 1199, 1200, 5, 124, 0, 0, 1200, 1205, 3, 244, 122, 0, 1201, 1202, 5, 14, 0, 0, 1202, 1204, 3, 244, 122, 0, 1203, 1201, 1, 0, 0, 0, 1204, 1207, 1, 0, 0, 0, 1205, 1203, 1, 0, 0, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1208, 1, 0, 0, 0, 1207, 1205, 1, 0, 0, 0, 1208, 1209, 5, 122, 0, 0, 1209, 1210, 3, 94, 47, 0, 1210, 1212, 1, 0, 0, 0, 1211, 1188, 1, 0, 0, 0, 1211, 1198, 1, 0, 0, 0, 1212, 215, 1, 0, 0, 0, 1213, 1214, 5, 116, 0, 0, 1214, 1215, 5, 124, 0, 0, 1215, 1216, 3, 226, 113, 0, 1216, 217, 1, 0, 0, 0, 1217, 1218, 5, 117, 0, 0, 1218, 1219, 5, 124, 0, 0, 1219, 1220, 3, 226, 113, 0, 1220, 1221, 5, 70, 0, 0, 1221, 1222, 3, 94, 47, 0, 1222, 219, 1, 0, 0, 0, 1223, 1224, 5, 118, 0, 0, 1224, 1225, 5, 123, 0, 0, 1225, 1226, 5, 97, 0, 0, 1226, 1227, 5, 124, 0, 0, 1227, 1228, 3, 226, 113, 0, 1228, 1229, 5, 125, 0, 0, 1229, 1230, 3, 94, 47, 0, 1230, 221, 1, 0, 0, 0, 1231, 1232, 5, 119, 0, 0, 1232, 1237, 3, 228, 114, 0, 1233, 1234, 5, 14, 0, 0, 1234, 1236, 3, 228, 114, 0, 1235, 1233, 1, 0, 0, 0, 1236, 1239, 1, 0, 0, 0, 1237, 1235, 1, 0, 0, 0, 1237, 1238, 1, 0, 0, 0, 1238, 1240, 1, 0, 0, 0, 1239, 1237, 1, 0, 0, 0, 1240, 1241, 5, 120, 0, 0, 1241, 1242, 3, 94, 47, 0, 1242, 1243, 5, 67, 0, 0, 1243, 1244, 3, 94, 47, 0, 1244, 223, 1, 0, 0, 0, 1245, 1246, 5, 121, 0, 0, 1246, 1247, 5, 124, 0, 0, 1247, 1248, 3, 94, 47, 0, 1248, 1249, 5, 122, 0, 0, 1249, 1250, 3, 94, 47, 0, 1250, 225, 1, 0, 0, 0, 1251, 1254, 3, 188, 94, 0, 1252, 1255, 3, 180, 90, 0, 1253, 1255, 3, 186, 93, 0, 1254, 1252, 1, 0, 0, 0, 1254, 1253, 1, 0, 0, 0, 1255, 1256, 1, 0, 0, 0, 1256, 1254, 1, 0, 0, 0, 1256, 1257, 1, 0, 0, 0, 1257, 227, 1, 0, 0, 0, 1258, 1259, 3, 192, 96, 0, 1259, 1260, 5, 6, 0, 0, 1260, 1261, 3, 94, 47, 0, 1261, 229, 1, 0, 0, 0, 1262, 1263, 5, 9, 0, 0, 1263, 1271, 5, 10, 0, 0, 1264, 1268, 3, 234, 117, 0, 1265, 1269, 5, 134, 0, 0, 1266, 1269, 5, 11, 0, 0, 1267, 1269, 5, 48, 0, 0, 1268, 1265, 1, 0, 0, 0, 1268, 1266, 1, 0, 0, 0, 1268, 1267, 1, 0, 0, 0, 1268, 1269, 1, 0, 0, 0, 1269, 1271, 1, 0, 0, 0, 1270, 1262, 1, 0, 0, 0, 1270, 1264, 1, 0, 0, 0, 1271, 231, 1, 0, 0, 0, 1272, 1281, 5, 7, 0, 0, 1273, 1278, 3, 244, 122, 0, 1274, 1275, 5, 14, 0, 0, 1275, 1277, 3, 244, 122, 0, 1276, 1274, 1, 0, 0, 0, 1277, 1280, 1, 0, 0, 0, 1278, 1276, 1, 0, 0, 0, 1278, 1279, 1, 0, 0, 0, 1279, 1282, 1, 0, 0, 0, 1280, 1278, 1, 0, 0, 0, 1281, 1273, 1, 0, 0, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1289, 5, 8, 0, 0, 1284, 1285, 5, 59, 0, 0, 1285, 1286, 3, 92, 46, 0, 1286, 1287, 5, 60, 0, 0, 1287, 1289, 1, 0, 0, 0, 1288, 1272, 1, 0, 0, 0, 1288, 1284, 1, 0, 0, 0, 1289, 233, 1, 0, 0, 0, 1290, 1294, 3, 72, 36, 0, 1291, 1294, 5, 135, 0, 0, 1292, 1294, 3, 236, 118, 0, 1293, 1290, 1, 0, 0, 0, 1293, 1291, 1, 0, 0, 0, 1293, 1292, 1, 0, 0, 0, 1294, 235, 1, 0, 0, 0, 1295, 1298, 3, 238, 119, 0, 1296, 1298, 3, 240, 120, 0, 1297, 1295, 1, 0, 0, 0, 1297, 1296, 1, 0, 0, 0, 1298, 237, 1, 0, 0, 0, 1299, 1300, 5, 31, 0, 0, 1300, 1301, 5, 9, 0, 0, 1301, 1302, 5, 11, 0, 0, 1302, 1303, 5, 10, 0, 0, 1303, 239, 1, 0, 0, 0, 1304, 1305, 5, 31, 0, 0, 1305, 1314, 5, 9, 0, 0, 1306, 1311, 3, 230, 115, 0, 1307, 1308, 5, 14, 0, 0, 1308, 1310, 3, 230, 115, 0, 1309, 1307, 1, 0, 0, 0, 1310, 1313, 1, 0, 0, 0, 1311, 1309, 1, 0, 0, 0, 1311, 1312, 1, 0, 0, 0, 1312, 1315, 1, 0, 0, 0, 1313, 1311, 1, 0, 0, 0, 1314, 1306, 1, 0, 0, 0, 1314, 1315, 1, 0, 0, 0, 1315, 1316, 1, 0, 0, 0, 1316, 1317, 5, 10, 0, 0, 1317, 1318, 5, 70, 0, 0, 1318, 1319, 3, 230, 115, 0, 1319, 241, 1, 0, 0, 0, 1320, 1322, 3, 234, 117, 0, 1321, 1323, 5, 134, 0, 0, 1322, 1321, 1, 0, 0, 0, 1322, 1323, 1, 0, 0, 0, 1323, 243, 1, 0, 0, 0, 1324, 1327, 3, 94, 47, 0, 1325, 1327, 5, 142, 0, 0, 1326, 1324, 1, 0, 0, 0, 1326, 1325, 1, 0, 0, 0, 1327, 1328, 1, 0, 0, 0, 1328, 1329, 7, 6, 0, 0, 1329, 1330, 3, 94, 47, 0, 1330, 245, 1, 0, 0, 0, 1331, 1333, 5, 54, 0, 0, 1332, 1334, 3, 92, 46, 0, 1333, 1332, 1, 0, 0, 0, 1333, 1334, 1, 0, 0, 0, 1334, 1335, 1, 0, 0, 0, 1335, 1336, 5, 55, 0, 0, 1336, 247, 1, 0, 0, 0, 1337, 1338, 3, 250, 125, 0, 1338, 249, 1, 0, 0, 0, 1339, 1340, 5, 133, 0, 0, 1340, 251, 1, 0, 0, 0, 1341, 1342, 7, 7, 0, 0, 1342, 253, 1, 0, 0, 0, 132, 262, 266, 282, 288, 296, 304, 312, 327, 357, 365, 367, 389, 399, 409, 414, 419, 423, 435, 439, 448, 455, 469, 473, 478, 488, 496, 500, 512, 524, 546, 554, 559, 562, 566, 575, 584, 587, 595, 602, 604, 611, 618, 620, 628, 633, 640, 647, 657, 664, 671, 678, 687, 697, 701, 709, 711, 723, 729, 733, 737, 748, 754, 769, 775, 779, 783, 790, 797, 803, 808, 810, 814, 821, 828, 837, 849, 859, 871, 875, 884, 891, 913, 918, 923, 927, 939, 947, 951, 958, 965, 971, 978, 986, 993, 999, 1005, 1011, 1017, 1028, 1034, 1039, 1047, 1068, 1077, 1079, 1102, 1119, 1130, 1152, 1156, 1163, 1167, 1177, 1182, 1196, 1205, 1211, 1237, 1254, 1256, 1268, 1270, 1278, 1281, 1288, 1293, 1297, 1311, 1314, 1322, 1326, 1333] \ No newline at end of file +[4, 1, 145, 1347, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 263, 8, 1, 1, 1, 1, 1, 3, 1, 267, 8, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 3, 4, 283, 8, 4, 1, 4, 1, 4, 5, 4, 287, 8, 4, 10, 4, 12, 4, 290, 9, 4, 1, 4, 1, 4, 1, 4, 5, 4, 295, 8, 4, 10, 4, 12, 4, 298, 9, 4, 1, 5, 1, 5, 1, 6, 5, 6, 303, 8, 6, 10, 6, 12, 6, 306, 9, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 3, 8, 313, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 328, 8, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 3, 16, 358, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 366, 8, 16, 10, 16, 12, 16, 369, 9, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 4, 18, 388, 8, 18, 11, 18, 12, 18, 389, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 4, 19, 398, 8, 19, 11, 19, 12, 19, 399, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 4, 20, 408, 8, 20, 11, 20, 12, 20, 409, 1, 21, 1, 21, 1, 21, 3, 21, 415, 8, 21, 1, 21, 1, 21, 1, 21, 3, 21, 420, 8, 21, 5, 21, 422, 8, 21, 10, 21, 12, 21, 425, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 4, 22, 434, 8, 22, 11, 22, 12, 22, 435, 1, 22, 1, 22, 3, 22, 440, 8, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 449, 8, 23, 1, 23, 1, 23, 1, 23, 5, 23, 454, 8, 23, 10, 23, 12, 23, 457, 9, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 468, 8, 24, 10, 24, 12, 24, 471, 9, 24, 1, 24, 3, 24, 474, 8, 24, 1, 24, 3, 24, 477, 8, 24, 1, 25, 5, 25, 480, 8, 25, 10, 25, 12, 25, 483, 9, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 5, 26, 490, 8, 26, 10, 26, 12, 26, 493, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 3, 27, 500, 8, 27, 1, 27, 1, 27, 3, 27, 504, 8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 516, 8, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 528, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 550, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 556, 8, 35, 10, 35, 12, 35, 559, 9, 35, 1, 36, 1, 36, 3, 36, 563, 8, 36, 1, 36, 3, 36, 566, 8, 36, 1, 36, 1, 36, 3, 36, 570, 8, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 579, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 586, 8, 38, 10, 38, 12, 38, 589, 9, 38, 3, 38, 591, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 599, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 606, 8, 39, 3, 39, 608, 8, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 615, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 622, 8, 40, 3, 40, 624, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 632, 8, 41, 1, 41, 1, 41, 1, 41, 3, 41, 637, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 644, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 651, 8, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 661, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 666, 8, 44, 10, 44, 12, 44, 669, 9, 44, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 675, 8, 45, 1, 46, 1, 46, 1, 46, 5, 46, 680, 8, 46, 10, 46, 12, 46, 683, 9, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 691, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 701, 8, 48, 1, 49, 1, 49, 3, 49, 705, 8, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 5, 49, 713, 8, 49, 10, 49, 12, 49, 716, 9, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 5, 50, 725, 8, 50, 10, 50, 12, 50, 728, 9, 50, 1, 51, 1, 51, 1, 51, 3, 51, 733, 8, 51, 1, 51, 1, 51, 3, 51, 737, 8, 51, 1, 51, 1, 51, 3, 51, 741, 8, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 5, 52, 750, 8, 52, 10, 52, 12, 52, 753, 9, 52, 1, 53, 1, 53, 1, 53, 3, 53, 758, 8, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 771, 8, 55, 10, 55, 12, 55, 774, 9, 55, 1, 56, 1, 56, 1, 56, 3, 56, 779, 8, 56, 1, 56, 1, 56, 3, 56, 783, 8, 56, 1, 56, 1, 56, 3, 56, 787, 8, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 794, 8, 57, 1, 57, 1, 57, 1, 57, 5, 57, 799, 8, 57, 10, 57, 12, 57, 802, 9, 57, 1, 58, 1, 58, 1, 58, 3, 58, 807, 8, 58, 1, 58, 1, 58, 1, 58, 3, 58, 812, 8, 58, 3, 58, 814, 8, 58, 1, 58, 1, 58, 3, 58, 818, 8, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 3, 60, 825, 8, 60, 1, 60, 1, 60, 1, 60, 5, 60, 830, 8, 60, 10, 60, 12, 60, 833, 9, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 3, 61, 841, 8, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 4, 62, 851, 8, 62, 11, 62, 12, 62, 852, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 4, 63, 861, 8, 63, 11, 63, 12, 63, 862, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 4, 64, 873, 8, 64, 11, 64, 12, 64, 874, 1, 64, 1, 64, 3, 64, 879, 8, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 888, 8, 65, 1, 65, 1, 65, 1, 65, 5, 65, 893, 8, 65, 10, 65, 12, 65, 896, 9, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 4, 67, 915, 8, 67, 11, 67, 12, 67, 916, 1, 68, 1, 68, 1, 68, 3, 68, 922, 8, 68, 1, 68, 1, 68, 1, 68, 3, 68, 927, 8, 68, 5, 68, 929, 8, 68, 10, 68, 12, 68, 932, 9, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 5, 69, 941, 8, 69, 10, 69, 12, 69, 944, 9, 69, 1, 70, 1, 70, 1, 70, 5, 70, 949, 8, 70, 10, 70, 12, 70, 952, 9, 70, 1, 71, 3, 71, 955, 8, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 3, 72, 962, 8, 72, 1, 73, 1, 73, 1, 73, 5, 73, 967, 8, 73, 10, 73, 12, 73, 970, 9, 73, 1, 74, 1, 74, 1, 74, 3, 74, 975, 8, 74, 1, 75, 1, 75, 1, 75, 5, 75, 980, 8, 75, 10, 75, 12, 75, 983, 9, 75, 1, 76, 1, 76, 1, 76, 5, 76, 988, 8, 76, 10, 76, 12, 76, 991, 9, 76, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 997, 8, 77, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 1003, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 1009, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 3, 80, 1015, 8, 80, 1, 81, 1, 81, 1, 81, 1, 81, 3, 81, 1021, 8, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82, 1030, 8, 82, 10, 82, 12, 82, 1033, 9, 82, 1, 83, 1, 83, 1, 83, 3, 83, 1038, 8, 83, 1, 84, 5, 84, 1041, 8, 84, 10, 84, 12, 84, 1044, 9, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 3, 85, 1051, 8, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 5, 88, 1070, 8, 88, 10, 88, 12, 88, 1073, 9, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 5, 89, 1081, 8, 89, 10, 89, 12, 89, 1084, 9, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 3, 93, 1106, 8, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 3, 94, 1123, 8, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 3, 97, 1134, 8, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 3, 102, 1156, 8, 102, 5, 102, 1158, 8, 102, 10, 102, 12, 102, 1161, 9, 102, 1, 102, 1, 102, 1, 103, 1, 103, 3, 103, 1167, 8, 103, 1, 104, 1, 104, 3, 104, 1171, 8, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1181, 8, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1186, 8, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 3, 107, 1200, 8, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1207, 8, 107, 10, 107, 12, 107, 1210, 9, 107, 1, 107, 1, 107, 1, 107, 3, 107, 1215, 8, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 5, 111, 1239, 8, 111, 10, 111, 12, 111, 1242, 9, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 4, 113, 1258, 8, 113, 11, 113, 12, 113, 1259, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 3, 115, 1272, 8, 115, 3, 115, 1274, 8, 115, 1, 116, 1, 116, 1, 116, 1, 116, 5, 116, 1280, 8, 116, 10, 116, 12, 116, 1283, 9, 116, 3, 116, 1285, 8, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 3, 116, 1292, 8, 116, 1, 117, 1, 117, 1, 117, 3, 117, 1297, 8, 117, 1, 118, 1, 118, 3, 118, 1301, 8, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 5, 120, 1313, 8, 120, 10, 120, 12, 120, 1316, 9, 120, 3, 120, 1318, 8, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 3, 121, 1326, 8, 121, 1, 122, 1, 122, 3, 122, 1330, 8, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 3, 123, 1337, 8, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 0, 0, 127, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 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, 0, 8, 2, 0, 16, 16, 105, 105, 1, 0, 82, 83, 1, 0, 19, 28, 2, 0, 4, 4, 36, 46, 1, 0, 48, 49, 2, 0, 11, 11, 50, 52, 2, 0, 18, 18, 135, 135, 2, 0, 61, 133, 136, 136, 1413, 0, 254, 1, 0, 0, 0, 2, 262, 1, 0, 0, 0, 4, 268, 1, 0, 0, 0, 6, 271, 1, 0, 0, 0, 8, 288, 1, 0, 0, 0, 10, 299, 1, 0, 0, 0, 12, 304, 1, 0, 0, 0, 14, 307, 1, 0, 0, 0, 16, 310, 1, 0, 0, 0, 18, 327, 1, 0, 0, 0, 20, 329, 1, 0, 0, 0, 22, 332, 1, 0, 0, 0, 24, 338, 1, 0, 0, 0, 26, 342, 1, 0, 0, 0, 28, 346, 1, 0, 0, 0, 30, 350, 1, 0, 0, 0, 32, 357, 1, 0, 0, 0, 34, 373, 1, 0, 0, 0, 36, 382, 1, 0, 0, 0, 38, 397, 1, 0, 0, 0, 40, 404, 1, 0, 0, 0, 42, 411, 1, 0, 0, 0, 44, 428, 1, 0, 0, 0, 46, 444, 1, 0, 0, 0, 48, 476, 1, 0, 0, 0, 50, 481, 1, 0, 0, 0, 52, 484, 1, 0, 0, 0, 54, 496, 1, 0, 0, 0, 56, 505, 1, 0, 0, 0, 58, 515, 1, 0, 0, 0, 60, 517, 1, 0, 0, 0, 62, 527, 1, 0, 0, 0, 64, 529, 1, 0, 0, 0, 66, 534, 1, 0, 0, 0, 68, 538, 1, 0, 0, 0, 70, 544, 1, 0, 0, 0, 72, 565, 1, 0, 0, 0, 74, 571, 1, 0, 0, 0, 76, 573, 1, 0, 0, 0, 78, 592, 1, 0, 0, 0, 80, 609, 1, 0, 0, 0, 82, 625, 1, 0, 0, 0, 84, 645, 1, 0, 0, 0, 86, 660, 1, 0, 0, 0, 88, 662, 1, 0, 0, 0, 90, 670, 1, 0, 0, 0, 92, 676, 1, 0, 0, 0, 94, 690, 1, 0, 0, 0, 96, 700, 1, 0, 0, 0, 98, 704, 1, 0, 0, 0, 100, 720, 1, 0, 0, 0, 102, 729, 1, 0, 0, 0, 104, 745, 1, 0, 0, 0, 106, 754, 1, 0, 0, 0, 108, 762, 1, 0, 0, 0, 110, 765, 1, 0, 0, 0, 112, 775, 1, 0, 0, 0, 114, 793, 1, 0, 0, 0, 116, 803, 1, 0, 0, 0, 118, 819, 1, 0, 0, 0, 120, 824, 1, 0, 0, 0, 122, 837, 1, 0, 0, 0, 124, 845, 1, 0, 0, 0, 126, 860, 1, 0, 0, 0, 128, 867, 1, 0, 0, 0, 130, 883, 1, 0, 0, 0, 132, 900, 1, 0, 0, 0, 134, 909, 1, 0, 0, 0, 136, 918, 1, 0, 0, 0, 138, 937, 1, 0, 0, 0, 140, 945, 1, 0, 0, 0, 142, 954, 1, 0, 0, 0, 144, 958, 1, 0, 0, 0, 146, 963, 1, 0, 0, 0, 148, 971, 1, 0, 0, 0, 150, 976, 1, 0, 0, 0, 152, 984, 1, 0, 0, 0, 154, 992, 1, 0, 0, 0, 156, 998, 1, 0, 0, 0, 158, 1004, 1, 0, 0, 0, 160, 1010, 1, 0, 0, 0, 162, 1016, 1, 0, 0, 0, 164, 1022, 1, 0, 0, 0, 166, 1037, 1, 0, 0, 0, 168, 1042, 1, 0, 0, 0, 170, 1050, 1, 0, 0, 0, 172, 1052, 1, 0, 0, 0, 174, 1059, 1, 0, 0, 0, 176, 1066, 1, 0, 0, 0, 178, 1074, 1, 0, 0, 0, 180, 1085, 1, 0, 0, 0, 182, 1091, 1, 0, 0, 0, 184, 1094, 1, 0, 0, 0, 186, 1098, 1, 0, 0, 0, 188, 1122, 1, 0, 0, 0, 190, 1124, 1, 0, 0, 0, 192, 1128, 1, 0, 0, 0, 194, 1131, 1, 0, 0, 0, 196, 1137, 1, 0, 0, 0, 198, 1139, 1, 0, 0, 0, 200, 1144, 1, 0, 0, 0, 202, 1149, 1, 0, 0, 0, 204, 1152, 1, 0, 0, 0, 206, 1166, 1, 0, 0, 0, 208, 1170, 1, 0, 0, 0, 210, 1172, 1, 0, 0, 0, 212, 1176, 1, 0, 0, 0, 214, 1214, 1, 0, 0, 0, 216, 1216, 1, 0, 0, 0, 218, 1220, 1, 0, 0, 0, 220, 1226, 1, 0, 0, 0, 222, 1234, 1, 0, 0, 0, 224, 1248, 1, 0, 0, 0, 226, 1254, 1, 0, 0, 0, 228, 1261, 1, 0, 0, 0, 230, 1273, 1, 0, 0, 0, 232, 1291, 1, 0, 0, 0, 234, 1296, 1, 0, 0, 0, 236, 1300, 1, 0, 0, 0, 238, 1302, 1, 0, 0, 0, 240, 1307, 1, 0, 0, 0, 242, 1323, 1, 0, 0, 0, 244, 1329, 1, 0, 0, 0, 246, 1334, 1, 0, 0, 0, 248, 1340, 1, 0, 0, 0, 250, 1342, 1, 0, 0, 0, 252, 1344, 1, 0, 0, 0, 254, 255, 3, 2, 1, 0, 255, 256, 5, 0, 0, 1, 256, 1, 1, 0, 0, 0, 257, 258, 5, 104, 0, 0, 258, 259, 5, 103, 0, 0, 259, 260, 3, 250, 125, 0, 260, 261, 5, 1, 0, 0, 261, 263, 1, 0, 0, 0, 262, 257, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 266, 1, 0, 0, 0, 264, 267, 3, 6, 3, 0, 265, 267, 3, 4, 2, 0, 266, 264, 1, 0, 0, 0, 266, 265, 1, 0, 0, 0, 267, 3, 1, 0, 0, 0, 268, 269, 3, 8, 4, 0, 269, 270, 3, 10, 5, 0, 270, 5, 1, 0, 0, 0, 271, 272, 5, 2, 0, 0, 272, 273, 5, 3, 0, 0, 273, 274, 5, 143, 0, 0, 274, 275, 5, 4, 0, 0, 275, 276, 3, 248, 124, 0, 276, 277, 5, 1, 0, 0, 277, 278, 3, 8, 4, 0, 278, 7, 1, 0, 0, 0, 279, 283, 3, 58, 29, 0, 280, 283, 3, 60, 30, 0, 281, 283, 3, 76, 38, 0, 282, 279, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 282, 281, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 285, 5, 1, 0, 0, 285, 287, 1, 0, 0, 0, 286, 282, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 296, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 292, 3, 62, 31, 0, 292, 293, 5, 1, 0, 0, 293, 295, 1, 0, 0, 0, 294, 291, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 9, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 300, 3, 16, 8, 0, 300, 11, 1, 0, 0, 0, 301, 303, 3, 18, 9, 0, 302, 301, 1, 0, 0, 0, 303, 306, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 13, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 307, 308, 3, 12, 6, 0, 308, 309, 3, 92, 46, 0, 309, 15, 1, 0, 0, 0, 310, 312, 3, 12, 6, 0, 311, 313, 3, 92, 46, 0, 312, 311, 1, 0, 0, 0, 312, 313, 1, 0, 0, 0, 313, 17, 1, 0, 0, 0, 314, 328, 3, 20, 10, 0, 315, 328, 3, 22, 11, 0, 316, 328, 3, 24, 12, 0, 317, 328, 3, 26, 13, 0, 318, 328, 3, 28, 14, 0, 319, 328, 3, 30, 15, 0, 320, 328, 3, 32, 16, 0, 321, 328, 3, 34, 17, 0, 322, 328, 3, 36, 18, 0, 323, 328, 3, 40, 20, 0, 324, 328, 3, 44, 22, 0, 325, 328, 3, 52, 26, 0, 326, 328, 3, 56, 28, 0, 327, 314, 1, 0, 0, 0, 327, 315, 1, 0, 0, 0, 327, 316, 1, 0, 0, 0, 327, 317, 1, 0, 0, 0, 327, 318, 1, 0, 0, 0, 327, 319, 1, 0, 0, 0, 327, 320, 1, 0, 0, 0, 327, 321, 1, 0, 0, 0, 327, 322, 1, 0, 0, 0, 327, 323, 1, 0, 0, 0, 327, 324, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 326, 1, 0, 0, 0, 328, 19, 1, 0, 0, 0, 329, 330, 3, 96, 48, 0, 330, 331, 5, 1, 0, 0, 331, 21, 1, 0, 0, 0, 332, 333, 5, 5, 0, 0, 333, 334, 3, 72, 36, 0, 334, 335, 5, 6, 0, 0, 335, 336, 3, 94, 47, 0, 336, 337, 5, 1, 0, 0, 337, 23, 1, 0, 0, 0, 338, 339, 5, 7, 0, 0, 339, 340, 3, 12, 6, 0, 340, 341, 5, 8, 0, 0, 341, 25, 1, 0, 0, 0, 342, 343, 5, 128, 0, 0, 343, 344, 5, 129, 0, 0, 344, 345, 5, 1, 0, 0, 345, 27, 1, 0, 0, 0, 346, 347, 5, 130, 0, 0, 347, 348, 5, 129, 0, 0, 348, 349, 5, 1, 0, 0, 349, 29, 1, 0, 0, 0, 350, 351, 5, 131, 0, 0, 351, 352, 5, 132, 0, 0, 352, 353, 3, 94, 47, 0, 353, 354, 5, 1, 0, 0, 354, 31, 1, 0, 0, 0, 355, 358, 3, 100, 50, 0, 356, 358, 3, 104, 52, 0, 357, 355, 1, 0, 0, 0, 357, 356, 1, 0, 0, 0, 358, 367, 1, 0, 0, 0, 359, 366, 3, 100, 50, 0, 360, 366, 3, 104, 52, 0, 361, 366, 3, 108, 54, 0, 362, 366, 3, 110, 55, 0, 363, 366, 3, 114, 57, 0, 364, 366, 3, 118, 59, 0, 365, 359, 1, 0, 0, 0, 365, 360, 1, 0, 0, 0, 365, 361, 1, 0, 0, 0, 365, 362, 1, 0, 0, 0, 365, 363, 1, 0, 0, 0, 365, 364, 1, 0, 0, 0, 366, 369, 1, 0, 0, 0, 367, 365, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 370, 1, 0, 0, 0, 369, 367, 1, 0, 0, 0, 370, 371, 5, 67, 0, 0, 371, 372, 3, 18, 9, 0, 372, 33, 1, 0, 0, 0, 373, 374, 5, 68, 0, 0, 374, 375, 5, 9, 0, 0, 375, 376, 3, 92, 46, 0, 376, 377, 5, 10, 0, 0, 377, 378, 5, 89, 0, 0, 378, 379, 3, 18, 9, 0, 379, 380, 5, 90, 0, 0, 380, 381, 3, 18, 9, 0, 381, 35, 1, 0, 0, 0, 382, 383, 5, 84, 0, 0, 383, 384, 5, 9, 0, 0, 384, 385, 3, 92, 46, 0, 385, 387, 5, 10, 0, 0, 386, 388, 3, 38, 19, 0, 387, 386, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 392, 5, 88, 0, 0, 392, 393, 5, 67, 0, 0, 393, 394, 3, 18, 9, 0, 394, 37, 1, 0, 0, 0, 395, 396, 5, 85, 0, 0, 396, 398, 3, 94, 47, 0, 397, 395, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 397, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 5, 67, 0, 0, 402, 403, 3, 18, 9, 0, 403, 39, 1, 0, 0, 0, 404, 405, 5, 86, 0, 0, 405, 407, 3, 24, 12, 0, 406, 408, 3, 42, 21, 0, 407, 406, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 407, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 41, 1, 0, 0, 0, 411, 414, 5, 87, 0, 0, 412, 415, 5, 11, 0, 0, 413, 415, 3, 72, 36, 0, 414, 412, 1, 0, 0, 0, 414, 413, 1, 0, 0, 0, 415, 423, 1, 0, 0, 0, 416, 419, 5, 12, 0, 0, 417, 420, 5, 11, 0, 0, 418, 420, 3, 72, 36, 0, 419, 417, 1, 0, 0, 0, 419, 418, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 416, 1, 0, 0, 0, 422, 425, 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 426, 1, 0, 0, 0, 425, 423, 1, 0, 0, 0, 426, 427, 3, 24, 12, 0, 427, 43, 1, 0, 0, 0, 428, 429, 5, 91, 0, 0, 429, 430, 5, 9, 0, 0, 430, 431, 3, 92, 46, 0, 431, 433, 5, 10, 0, 0, 432, 434, 3, 46, 23, 0, 433, 432, 1, 0, 0, 0, 434, 435, 1, 0, 0, 0, 435, 433, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 439, 5, 88, 0, 0, 438, 440, 3, 192, 96, 0, 439, 438, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 442, 5, 67, 0, 0, 442, 443, 3, 18, 9, 0, 443, 45, 1, 0, 0, 0, 444, 448, 5, 85, 0, 0, 445, 446, 3, 192, 96, 0, 446, 447, 5, 70, 0, 0, 447, 449, 1, 0, 0, 0, 448, 445, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 1, 0, 0, 0, 450, 455, 3, 230, 115, 0, 451, 452, 5, 12, 0, 0, 452, 454, 3, 230, 115, 0, 453, 451, 1, 0, 0, 0, 454, 457, 1, 0, 0, 0, 455, 453, 1, 0, 0, 0, 455, 456, 1, 0, 0, 0, 456, 458, 1, 0, 0, 0, 457, 455, 1, 0, 0, 0, 458, 459, 5, 67, 0, 0, 459, 460, 3, 18, 9, 0, 460, 47, 1, 0, 0, 0, 461, 462, 5, 13, 0, 0, 462, 473, 3, 72, 36, 0, 463, 464, 5, 9, 0, 0, 464, 469, 5, 137, 0, 0, 465, 466, 5, 14, 0, 0, 466, 468, 5, 137, 0, 0, 467, 465, 1, 0, 0, 0, 468, 471, 1, 0, 0, 0, 469, 467, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 472, 1, 0, 0, 0, 471, 469, 1, 0, 0, 0, 472, 474, 5, 10, 0, 0, 473, 463, 1, 0, 0, 0, 473, 474, 1, 0, 0, 0, 474, 477, 1, 0, 0, 0, 475, 477, 5, 127, 0, 0, 476, 461, 1, 0, 0, 0, 476, 475, 1, 0, 0, 0, 477, 49, 1, 0, 0, 0, 478, 480, 3, 48, 24, 0, 479, 478, 1, 0, 0, 0, 480, 483, 1, 0, 0, 0, 481, 479, 1, 0, 0, 0, 481, 482, 1, 0, 0, 0, 482, 51, 1, 0, 0, 0, 483, 481, 1, 0, 0, 0, 484, 485, 3, 50, 25, 0, 485, 486, 5, 114, 0, 0, 486, 491, 3, 54, 27, 0, 487, 488, 5, 14, 0, 0, 488, 490, 3, 54, 27, 0, 489, 487, 1, 0, 0, 0, 490, 493, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 492, 494, 1, 0, 0, 0, 493, 491, 1, 0, 0, 0, 494, 495, 5, 1, 0, 0, 495, 53, 1, 0, 0, 0, 496, 499, 3, 192, 96, 0, 497, 498, 5, 70, 0, 0, 498, 500, 3, 230, 115, 0, 499, 497, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 503, 1, 0, 0, 0, 501, 502, 5, 6, 0, 0, 502, 504, 3, 94, 47, 0, 503, 501, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 55, 1, 0, 0, 0, 505, 506, 5, 133, 0, 0, 506, 507, 5, 9, 0, 0, 507, 508, 3, 92, 46, 0, 508, 509, 5, 10, 0, 0, 509, 510, 3, 18, 9, 0, 510, 57, 1, 0, 0, 0, 511, 516, 3, 64, 32, 0, 512, 516, 3, 66, 33, 0, 513, 516, 3, 68, 34, 0, 514, 516, 3, 70, 35, 0, 515, 511, 1, 0, 0, 0, 515, 512, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 515, 514, 1, 0, 0, 0, 516, 59, 1, 0, 0, 0, 517, 518, 5, 111, 0, 0, 518, 519, 5, 3, 0, 0, 519, 520, 5, 143, 0, 0, 520, 521, 5, 4, 0, 0, 521, 522, 3, 248, 124, 0, 522, 61, 1, 0, 0, 0, 523, 528, 3, 82, 41, 0, 524, 528, 3, 78, 39, 0, 525, 528, 3, 84, 42, 0, 526, 528, 3, 80, 40, 0, 527, 523, 1, 0, 0, 0, 527, 524, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 527, 526, 1, 0, 0, 0, 528, 63, 1, 0, 0, 0, 529, 530, 5, 111, 0, 0, 530, 531, 5, 88, 0, 0, 531, 532, 5, 81, 0, 0, 532, 533, 3, 248, 124, 0, 533, 65, 1, 0, 0, 0, 534, 535, 5, 111, 0, 0, 535, 536, 5, 15, 0, 0, 536, 537, 7, 0, 0, 0, 537, 67, 1, 0, 0, 0, 538, 539, 5, 111, 0, 0, 539, 540, 5, 88, 0, 0, 540, 541, 5, 66, 0, 0, 541, 542, 5, 73, 0, 0, 542, 543, 7, 1, 0, 0, 543, 69, 1, 0, 0, 0, 544, 549, 5, 111, 0, 0, 545, 546, 5, 17, 0, 0, 546, 550, 3, 72, 36, 0, 547, 548, 5, 88, 0, 0, 548, 550, 5, 17, 0, 0, 549, 545, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 550, 557, 1, 0, 0, 0, 551, 552, 3, 74, 37, 0, 552, 553, 5, 4, 0, 0, 553, 554, 3, 250, 125, 0, 554, 556, 1, 0, 0, 0, 555, 551, 1, 0, 0, 0, 556, 559, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 71, 1, 0, 0, 0, 559, 557, 1, 0, 0, 0, 560, 563, 5, 143, 0, 0, 561, 563, 3, 252, 126, 0, 562, 560, 1, 0, 0, 0, 562, 561, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 566, 5, 18, 0, 0, 565, 562, 1, 0, 0, 0, 565, 566, 1, 0, 0, 0, 566, 569, 1, 0, 0, 0, 567, 570, 5, 143, 0, 0, 568, 570, 3, 252, 126, 0, 569, 567, 1, 0, 0, 0, 569, 568, 1, 0, 0, 0, 570, 73, 1, 0, 0, 0, 571, 572, 7, 2, 0, 0, 572, 75, 1, 0, 0, 0, 573, 574, 5, 29, 0, 0, 574, 578, 5, 2, 0, 0, 575, 576, 5, 3, 0, 0, 576, 577, 5, 143, 0, 0, 577, 579, 5, 4, 0, 0, 578, 575, 1, 0, 0, 0, 578, 579, 1, 0, 0, 0, 579, 580, 1, 0, 0, 0, 580, 590, 3, 248, 124, 0, 581, 582, 5, 71, 0, 0, 582, 587, 3, 248, 124, 0, 583, 584, 5, 14, 0, 0, 584, 586, 3, 248, 124, 0, 585, 583, 1, 0, 0, 0, 586, 589, 1, 0, 0, 0, 587, 585, 1, 0, 0, 0, 587, 588, 1, 0, 0, 0, 588, 591, 1, 0, 0, 0, 589, 587, 1, 0, 0, 0, 590, 581, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 77, 1, 0, 0, 0, 592, 593, 5, 111, 0, 0, 593, 594, 3, 50, 25, 0, 594, 595, 5, 114, 0, 0, 595, 598, 3, 192, 96, 0, 596, 597, 5, 70, 0, 0, 597, 599, 3, 230, 115, 0, 598, 596, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 607, 1, 0, 0, 0, 600, 601, 5, 6, 0, 0, 601, 608, 3, 94, 47, 0, 602, 605, 5, 30, 0, 0, 603, 604, 5, 6, 0, 0, 604, 606, 3, 94, 47, 0, 605, 603, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 608, 1, 0, 0, 0, 607, 600, 1, 0, 0, 0, 607, 602, 1, 0, 0, 0, 608, 79, 1, 0, 0, 0, 609, 610, 5, 111, 0, 0, 610, 611, 5, 112, 0, 0, 611, 614, 5, 113, 0, 0, 612, 613, 5, 70, 0, 0, 613, 615, 3, 230, 115, 0, 614, 612, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 623, 1, 0, 0, 0, 616, 617, 5, 6, 0, 0, 617, 624, 3, 94, 47, 0, 618, 621, 5, 30, 0, 0, 619, 620, 5, 6, 0, 0, 620, 622, 3, 94, 47, 0, 621, 619, 1, 0, 0, 0, 621, 622, 1, 0, 0, 0, 622, 624, 1, 0, 0, 0, 623, 616, 1, 0, 0, 0, 623, 618, 1, 0, 0, 0, 624, 81, 1, 0, 0, 0, 625, 626, 5, 111, 0, 0, 626, 627, 3, 50, 25, 0, 627, 628, 5, 31, 0, 0, 628, 629, 3, 72, 36, 0, 629, 631, 5, 9, 0, 0, 630, 632, 3, 88, 44, 0, 631, 630, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 1, 0, 0, 0, 633, 636, 5, 10, 0, 0, 634, 635, 5, 70, 0, 0, 635, 637, 3, 230, 115, 0, 636, 634, 1, 0, 0, 0, 636, 637, 1, 0, 0, 0, 637, 643, 1, 0, 0, 0, 638, 639, 5, 7, 0, 0, 639, 640, 3, 16, 8, 0, 640, 641, 5, 8, 0, 0, 641, 644, 1, 0, 0, 0, 642, 644, 5, 30, 0, 0, 643, 638, 1, 0, 0, 0, 643, 642, 1, 0, 0, 0, 644, 83, 1, 0, 0, 0, 645, 646, 5, 111, 0, 0, 646, 647, 5, 108, 0, 0, 647, 648, 3, 72, 36, 0, 648, 650, 5, 70, 0, 0, 649, 651, 3, 86, 43, 0, 650, 649, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 652, 1, 0, 0, 0, 652, 653, 3, 94, 47, 0, 653, 85, 1, 0, 0, 0, 654, 655, 5, 32, 0, 0, 655, 661, 5, 33, 0, 0, 656, 657, 5, 32, 0, 0, 657, 661, 5, 34, 0, 0, 658, 659, 5, 126, 0, 0, 659, 661, 5, 35, 0, 0, 660, 654, 1, 0, 0, 0, 660, 656, 1, 0, 0, 0, 660, 658, 1, 0, 0, 0, 661, 87, 1, 0, 0, 0, 662, 667, 3, 90, 45, 0, 663, 664, 5, 14, 0, 0, 664, 666, 3, 90, 45, 0, 665, 663, 1, 0, 0, 0, 666, 669, 1, 0, 0, 0, 667, 665, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 89, 1, 0, 0, 0, 669, 667, 1, 0, 0, 0, 670, 671, 5, 5, 0, 0, 671, 674, 3, 72, 36, 0, 672, 673, 5, 70, 0, 0, 673, 675, 3, 230, 115, 0, 674, 672, 1, 0, 0, 0, 674, 675, 1, 0, 0, 0, 675, 91, 1, 0, 0, 0, 676, 681, 3, 94, 47, 0, 677, 678, 5, 14, 0, 0, 678, 680, 3, 94, 47, 0, 679, 677, 1, 0, 0, 0, 680, 683, 1, 0, 0, 0, 681, 679, 1, 0, 0, 0, 681, 682, 1, 0, 0, 0, 682, 93, 1, 0, 0, 0, 683, 681, 1, 0, 0, 0, 684, 691, 3, 96, 48, 0, 685, 691, 3, 98, 49, 0, 686, 691, 3, 124, 62, 0, 687, 691, 3, 128, 64, 0, 688, 691, 3, 132, 66, 0, 689, 691, 3, 134, 67, 0, 690, 684, 1, 0, 0, 0, 690, 685, 1, 0, 0, 0, 690, 686, 1, 0, 0, 0, 690, 687, 1, 0, 0, 0, 690, 688, 1, 0, 0, 0, 690, 689, 1, 0, 0, 0, 691, 95, 1, 0, 0, 0, 692, 701, 3, 120, 60, 0, 693, 701, 3, 138, 69, 0, 694, 701, 3, 214, 107, 0, 695, 701, 3, 216, 108, 0, 696, 701, 3, 218, 109, 0, 697, 701, 3, 220, 110, 0, 698, 701, 3, 222, 111, 0, 699, 701, 3, 224, 112, 0, 700, 692, 1, 0, 0, 0, 700, 693, 1, 0, 0, 0, 700, 694, 1, 0, 0, 0, 700, 695, 1, 0, 0, 0, 700, 696, 1, 0, 0, 0, 700, 697, 1, 0, 0, 0, 700, 698, 1, 0, 0, 0, 700, 699, 1, 0, 0, 0, 701, 97, 1, 0, 0, 0, 702, 705, 3, 100, 50, 0, 703, 705, 3, 104, 52, 0, 704, 702, 1, 0, 0, 0, 704, 703, 1, 0, 0, 0, 705, 714, 1, 0, 0, 0, 706, 713, 3, 100, 50, 0, 707, 713, 3, 104, 52, 0, 708, 713, 3, 108, 54, 0, 709, 713, 3, 110, 55, 0, 710, 713, 3, 114, 57, 0, 711, 713, 3, 118, 59, 0, 712, 706, 1, 0, 0, 0, 712, 707, 1, 0, 0, 0, 712, 708, 1, 0, 0, 0, 712, 709, 1, 0, 0, 0, 712, 710, 1, 0, 0, 0, 712, 711, 1, 0, 0, 0, 713, 716, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 717, 1, 0, 0, 0, 716, 714, 1, 0, 0, 0, 717, 718, 5, 67, 0, 0, 718, 719, 3, 94, 47, 0, 719, 99, 1, 0, 0, 0, 720, 721, 5, 61, 0, 0, 721, 726, 3, 102, 51, 0, 722, 723, 5, 14, 0, 0, 723, 725, 3, 102, 51, 0, 724, 722, 1, 0, 0, 0, 725, 728, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 726, 727, 1, 0, 0, 0, 727, 101, 1, 0, 0, 0, 728, 726, 1, 0, 0, 0, 729, 732, 3, 192, 96, 0, 730, 731, 5, 70, 0, 0, 731, 733, 3, 230, 115, 0, 732, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 736, 1, 0, 0, 0, 734, 735, 5, 72, 0, 0, 735, 737, 5, 73, 0, 0, 736, 734, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 740, 1, 0, 0, 0, 738, 739, 5, 71, 0, 0, 739, 741, 3, 192, 96, 0, 740, 738, 1, 0, 0, 0, 740, 741, 1, 0, 0, 0, 741, 742, 1, 0, 0, 0, 742, 743, 5, 69, 0, 0, 743, 744, 3, 94, 47, 0, 744, 103, 1, 0, 0, 0, 745, 746, 5, 62, 0, 0, 746, 751, 3, 106, 53, 0, 747, 748, 5, 14, 0, 0, 748, 750, 3, 106, 53, 0, 749, 747, 1, 0, 0, 0, 750, 753, 1, 0, 0, 0, 751, 749, 1, 0, 0, 0, 751, 752, 1, 0, 0, 0, 752, 105, 1, 0, 0, 0, 753, 751, 1, 0, 0, 0, 754, 757, 3, 192, 96, 0, 755, 756, 5, 70, 0, 0, 756, 758, 3, 230, 115, 0, 757, 755, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 759, 1, 0, 0, 0, 759, 760, 5, 6, 0, 0, 760, 761, 3, 94, 47, 0, 761, 107, 1, 0, 0, 0, 762, 763, 5, 63, 0, 0, 763, 764, 3, 94, 47, 0, 764, 109, 1, 0, 0, 0, 765, 766, 5, 64, 0, 0, 766, 767, 5, 65, 0, 0, 767, 772, 3, 112, 56, 0, 768, 769, 5, 14, 0, 0, 769, 771, 3, 112, 56, 0, 770, 768, 1, 0, 0, 0, 771, 774, 1, 0, 0, 0, 772, 770, 1, 0, 0, 0, 772, 773, 1, 0, 0, 0, 773, 111, 1, 0, 0, 0, 774, 772, 1, 0, 0, 0, 775, 782, 3, 192, 96, 0, 776, 777, 5, 70, 0, 0, 777, 779, 3, 230, 115, 0, 778, 776, 1, 0, 0, 0, 778, 779, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 781, 5, 6, 0, 0, 781, 783, 3, 94, 47, 0, 782, 778, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 786, 1, 0, 0, 0, 784, 785, 5, 81, 0, 0, 785, 787, 3, 248, 124, 0, 786, 784, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 113, 1, 0, 0, 0, 788, 789, 5, 66, 0, 0, 789, 794, 5, 65, 0, 0, 790, 791, 5, 75, 0, 0, 791, 792, 5, 66, 0, 0, 792, 794, 5, 65, 0, 0, 793, 788, 1, 0, 0, 0, 793, 790, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 800, 3, 116, 58, 0, 796, 797, 5, 14, 0, 0, 797, 799, 3, 116, 58, 0, 798, 796, 1, 0, 0, 0, 799, 802, 1, 0, 0, 0, 800, 798, 1, 0, 0, 0, 800, 801, 1, 0, 0, 0, 801, 115, 1, 0, 0, 0, 802, 800, 1, 0, 0, 0, 803, 806, 3, 94, 47, 0, 804, 807, 5, 76, 0, 0, 805, 807, 5, 77, 0, 0, 806, 804, 1, 0, 0, 0, 806, 805, 1, 0, 0, 0, 806, 807, 1, 0, 0, 0, 807, 813, 1, 0, 0, 0, 808, 811, 5, 73, 0, 0, 809, 812, 5, 82, 0, 0, 810, 812, 5, 83, 0, 0, 811, 809, 1, 0, 0, 0, 811, 810, 1, 0, 0, 0, 812, 814, 1, 0, 0, 0, 813, 808, 1, 0, 0, 0, 813, 814, 1, 0, 0, 0, 814, 817, 1, 0, 0, 0, 815, 816, 5, 81, 0, 0, 816, 818, 3, 248, 124, 0, 817, 815, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 117, 1, 0, 0, 0, 819, 820, 5, 74, 0, 0, 820, 821, 3, 192, 96, 0, 821, 119, 1, 0, 0, 0, 822, 825, 5, 78, 0, 0, 823, 825, 5, 79, 0, 0, 824, 822, 1, 0, 0, 0, 824, 823, 1, 0, 0, 0, 825, 826, 1, 0, 0, 0, 826, 831, 3, 122, 61, 0, 827, 828, 5, 14, 0, 0, 828, 830, 3, 122, 61, 0, 829, 827, 1, 0, 0, 0, 830, 833, 1, 0, 0, 0, 831, 829, 1, 0, 0, 0, 831, 832, 1, 0, 0, 0, 832, 834, 1, 0, 0, 0, 833, 831, 1, 0, 0, 0, 834, 835, 5, 80, 0, 0, 835, 836, 3, 94, 47, 0, 836, 121, 1, 0, 0, 0, 837, 840, 3, 192, 96, 0, 838, 839, 5, 70, 0, 0, 839, 841, 3, 230, 115, 0, 840, 838, 1, 0, 0, 0, 840, 841, 1, 0, 0, 0, 841, 842, 1, 0, 0, 0, 842, 843, 5, 69, 0, 0, 843, 844, 3, 94, 47, 0, 844, 123, 1, 0, 0, 0, 845, 846, 5, 84, 0, 0, 846, 847, 5, 9, 0, 0, 847, 848, 3, 92, 46, 0, 848, 850, 5, 10, 0, 0, 849, 851, 3, 126, 63, 0, 850, 849, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 850, 1, 0, 0, 0, 852, 853, 1, 0, 0, 0, 853, 854, 1, 0, 0, 0, 854, 855, 5, 88, 0, 0, 855, 856, 5, 67, 0, 0, 856, 857, 3, 94, 47, 0, 857, 125, 1, 0, 0, 0, 858, 859, 5, 85, 0, 0, 859, 861, 3, 94, 47, 0, 860, 858, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 860, 1, 0, 0, 0, 862, 863, 1, 0, 0, 0, 863, 864, 1, 0, 0, 0, 864, 865, 5, 67, 0, 0, 865, 866, 3, 94, 47, 0, 866, 127, 1, 0, 0, 0, 867, 868, 5, 91, 0, 0, 868, 869, 5, 9, 0, 0, 869, 870, 3, 92, 46, 0, 870, 872, 5, 10, 0, 0, 871, 873, 3, 130, 65, 0, 872, 871, 1, 0, 0, 0, 873, 874, 1, 0, 0, 0, 874, 872, 1, 0, 0, 0, 874, 875, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 878, 5, 88, 0, 0, 877, 879, 3, 192, 96, 0, 878, 877, 1, 0, 0, 0, 878, 879, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 881, 5, 67, 0, 0, 881, 882, 3, 94, 47, 0, 882, 129, 1, 0, 0, 0, 883, 887, 5, 85, 0, 0, 884, 885, 3, 192, 96, 0, 885, 886, 5, 70, 0, 0, 886, 888, 1, 0, 0, 0, 887, 884, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 894, 3, 230, 115, 0, 890, 891, 5, 12, 0, 0, 891, 893, 3, 230, 115, 0, 892, 890, 1, 0, 0, 0, 893, 896, 1, 0, 0, 0, 894, 892, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 897, 1, 0, 0, 0, 896, 894, 1, 0, 0, 0, 897, 898, 5, 67, 0, 0, 898, 899, 3, 94, 47, 0, 899, 131, 1, 0, 0, 0, 900, 901, 5, 68, 0, 0, 901, 902, 5, 9, 0, 0, 902, 903, 3, 92, 46, 0, 903, 904, 5, 10, 0, 0, 904, 905, 5, 89, 0, 0, 905, 906, 3, 94, 47, 0, 906, 907, 5, 90, 0, 0, 907, 908, 3, 94, 47, 0, 908, 133, 1, 0, 0, 0, 909, 910, 5, 86, 0, 0, 910, 911, 5, 7, 0, 0, 911, 912, 3, 92, 46, 0, 912, 914, 5, 8, 0, 0, 913, 915, 3, 136, 68, 0, 914, 913, 1, 0, 0, 0, 915, 916, 1, 0, 0, 0, 916, 914, 1, 0, 0, 0, 916, 917, 1, 0, 0, 0, 917, 135, 1, 0, 0, 0, 918, 921, 5, 87, 0, 0, 919, 922, 5, 11, 0, 0, 920, 922, 3, 72, 36, 0, 921, 919, 1, 0, 0, 0, 921, 920, 1, 0, 0, 0, 922, 930, 1, 0, 0, 0, 923, 926, 5, 12, 0, 0, 924, 927, 5, 11, 0, 0, 925, 927, 3, 72, 36, 0, 926, 924, 1, 0, 0, 0, 926, 925, 1, 0, 0, 0, 927, 929, 1, 0, 0, 0, 928, 923, 1, 0, 0, 0, 929, 932, 1, 0, 0, 0, 930, 928, 1, 0, 0, 0, 930, 931, 1, 0, 0, 0, 931, 933, 1, 0, 0, 0, 932, 930, 1, 0, 0, 0, 933, 934, 5, 7, 0, 0, 934, 935, 3, 92, 46, 0, 935, 936, 5, 8, 0, 0, 936, 137, 1, 0, 0, 0, 937, 942, 3, 140, 70, 0, 938, 939, 5, 92, 0, 0, 939, 941, 3, 140, 70, 0, 940, 938, 1, 0, 0, 0, 941, 944, 1, 0, 0, 0, 942, 940, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 943, 139, 1, 0, 0, 0, 944, 942, 1, 0, 0, 0, 945, 950, 3, 142, 71, 0, 946, 947, 5, 93, 0, 0, 947, 949, 3, 142, 71, 0, 948, 946, 1, 0, 0, 0, 949, 952, 1, 0, 0, 0, 950, 948, 1, 0, 0, 0, 950, 951, 1, 0, 0, 0, 951, 141, 1, 0, 0, 0, 952, 950, 1, 0, 0, 0, 953, 955, 5, 94, 0, 0, 954, 953, 1, 0, 0, 0, 954, 955, 1, 0, 0, 0, 955, 956, 1, 0, 0, 0, 956, 957, 3, 144, 72, 0, 957, 143, 1, 0, 0, 0, 958, 961, 3, 146, 73, 0, 959, 960, 7, 3, 0, 0, 960, 962, 3, 146, 73, 0, 961, 959, 1, 0, 0, 0, 961, 962, 1, 0, 0, 0, 962, 145, 1, 0, 0, 0, 963, 968, 3, 148, 74, 0, 964, 965, 5, 47, 0, 0, 965, 967, 3, 148, 74, 0, 966, 964, 1, 0, 0, 0, 967, 970, 1, 0, 0, 0, 968, 966, 1, 0, 0, 0, 968, 969, 1, 0, 0, 0, 969, 147, 1, 0, 0, 0, 970, 968, 1, 0, 0, 0, 971, 974, 3, 150, 75, 0, 972, 973, 5, 95, 0, 0, 973, 975, 3, 150, 75, 0, 974, 972, 1, 0, 0, 0, 974, 975, 1, 0, 0, 0, 975, 149, 1, 0, 0, 0, 976, 981, 3, 152, 76, 0, 977, 978, 7, 4, 0, 0, 978, 980, 3, 152, 76, 0, 979, 977, 1, 0, 0, 0, 980, 983, 1, 0, 0, 0, 981, 979, 1, 0, 0, 0, 981, 982, 1, 0, 0, 0, 982, 151, 1, 0, 0, 0, 983, 981, 1, 0, 0, 0, 984, 989, 3, 154, 77, 0, 985, 986, 7, 5, 0, 0, 986, 988, 3, 154, 77, 0, 987, 985, 1, 0, 0, 0, 988, 991, 1, 0, 0, 0, 989, 987, 1, 0, 0, 0, 989, 990, 1, 0, 0, 0, 990, 153, 1, 0, 0, 0, 991, 989, 1, 0, 0, 0, 992, 996, 3, 156, 78, 0, 993, 994, 5, 96, 0, 0, 994, 995, 5, 97, 0, 0, 995, 997, 3, 230, 115, 0, 996, 993, 1, 0, 0, 0, 996, 997, 1, 0, 0, 0, 997, 155, 1, 0, 0, 0, 998, 1002, 3, 158, 79, 0, 999, 1000, 5, 99, 0, 0, 1000, 1001, 5, 98, 0, 0, 1001, 1003, 3, 230, 115, 0, 1002, 999, 1, 0, 0, 0, 1002, 1003, 1, 0, 0, 0, 1003, 157, 1, 0, 0, 0, 1004, 1008, 3, 160, 80, 0, 1005, 1006, 5, 100, 0, 0, 1006, 1007, 5, 70, 0, 0, 1007, 1009, 3, 230, 115, 0, 1008, 1005, 1, 0, 0, 0, 1008, 1009, 1, 0, 0, 0, 1009, 159, 1, 0, 0, 0, 1010, 1014, 3, 162, 81, 0, 1011, 1012, 5, 102, 0, 0, 1012, 1013, 5, 70, 0, 0, 1013, 1015, 3, 242, 121, 0, 1014, 1011, 1, 0, 0, 0, 1014, 1015, 1, 0, 0, 0, 1015, 161, 1, 0, 0, 0, 1016, 1020, 3, 164, 82, 0, 1017, 1018, 5, 101, 0, 0, 1018, 1019, 5, 70, 0, 0, 1019, 1021, 3, 242, 121, 0, 1020, 1017, 1, 0, 0, 0, 1020, 1021, 1, 0, 0, 0, 1021, 163, 1, 0, 0, 0, 1022, 1031, 3, 168, 84, 0, 1023, 1024, 5, 4, 0, 0, 1024, 1025, 5, 45, 0, 0, 1025, 1026, 1, 0, 0, 0, 1026, 1027, 3, 166, 83, 0, 1027, 1028, 3, 204, 102, 0, 1028, 1030, 1, 0, 0, 0, 1029, 1023, 1, 0, 0, 0, 1030, 1033, 1, 0, 0, 0, 1031, 1029, 1, 0, 0, 0, 1031, 1032, 1, 0, 0, 0, 1032, 165, 1, 0, 0, 0, 1033, 1031, 1, 0, 0, 0, 1034, 1038, 3, 72, 36, 0, 1035, 1038, 3, 192, 96, 0, 1036, 1038, 3, 194, 97, 0, 1037, 1034, 1, 0, 0, 0, 1037, 1035, 1, 0, 0, 0, 1037, 1036, 1, 0, 0, 0, 1038, 167, 1, 0, 0, 0, 1039, 1041, 7, 4, 0, 0, 1040, 1039, 1, 0, 0, 0, 1041, 1044, 1, 0, 0, 0, 1042, 1040, 1, 0, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1045, 1, 0, 0, 0, 1044, 1042, 1, 0, 0, 0, 1045, 1046, 3, 170, 85, 0, 1046, 169, 1, 0, 0, 0, 1047, 1051, 3, 176, 88, 0, 1048, 1051, 3, 172, 86, 0, 1049, 1051, 3, 174, 87, 0, 1050, 1047, 1, 0, 0, 0, 1050, 1048, 1, 0, 0, 0, 1050, 1049, 1, 0, 0, 0, 1051, 171, 1, 0, 0, 0, 1052, 1053, 5, 109, 0, 0, 1053, 1054, 5, 108, 0, 0, 1054, 1055, 3, 230, 115, 0, 1055, 1056, 5, 7, 0, 0, 1056, 1057, 3, 92, 46, 0, 1057, 1058, 5, 8, 0, 0, 1058, 173, 1, 0, 0, 0, 1059, 1060, 5, 110, 0, 0, 1060, 1061, 5, 108, 0, 0, 1061, 1062, 3, 230, 115, 0, 1062, 1063, 5, 7, 0, 0, 1063, 1064, 3, 92, 46, 0, 1064, 1065, 5, 8, 0, 0, 1065, 175, 1, 0, 0, 0, 1066, 1071, 3, 178, 89, 0, 1067, 1068, 5, 53, 0, 0, 1068, 1070, 3, 178, 89, 0, 1069, 1067, 1, 0, 0, 0, 1070, 1073, 1, 0, 0, 0, 1071, 1069, 1, 0, 0, 0, 1071, 1072, 1, 0, 0, 0, 1072, 177, 1, 0, 0, 0, 1073, 1071, 1, 0, 0, 0, 1074, 1082, 3, 188, 94, 0, 1075, 1081, 3, 180, 90, 0, 1076, 1081, 3, 184, 92, 0, 1077, 1081, 3, 186, 93, 0, 1078, 1081, 3, 182, 91, 0, 1079, 1081, 3, 204, 102, 0, 1080, 1075, 1, 0, 0, 0, 1080, 1076, 1, 0, 0, 0, 1080, 1077, 1, 0, 0, 0, 1080, 1078, 1, 0, 0, 0, 1080, 1079, 1, 0, 0, 0, 1081, 1084, 1, 0, 0, 0, 1082, 1080, 1, 0, 0, 0, 1082, 1083, 1, 0, 0, 0, 1083, 179, 1, 0, 0, 0, 1084, 1082, 1, 0, 0, 0, 1085, 1086, 5, 54, 0, 0, 1086, 1087, 5, 54, 0, 0, 1087, 1088, 3, 92, 46, 0, 1088, 1089, 5, 55, 0, 0, 1089, 1090, 5, 55, 0, 0, 1090, 181, 1, 0, 0, 0, 1091, 1092, 5, 54, 0, 0, 1092, 1093, 5, 55, 0, 0, 1093, 183, 1, 0, 0, 0, 1094, 1095, 5, 54, 0, 0, 1095, 1096, 3, 92, 46, 0, 1096, 1097, 5, 55, 0, 0, 1097, 185, 1, 0, 0, 0, 1098, 1105, 5, 56, 0, 0, 1099, 1106, 3, 252, 126, 0, 1100, 1106, 3, 250, 125, 0, 1101, 1106, 5, 143, 0, 0, 1102, 1106, 3, 194, 97, 0, 1103, 1106, 3, 192, 96, 0, 1104, 1106, 3, 196, 98, 0, 1105, 1099, 1, 0, 0, 0, 1105, 1100, 1, 0, 0, 0, 1105, 1101, 1, 0, 0, 0, 1105, 1102, 1, 0, 0, 0, 1105, 1103, 1, 0, 0, 0, 1105, 1104, 1, 0, 0, 0, 1106, 187, 1, 0, 0, 0, 1107, 1123, 5, 136, 0, 0, 1108, 1123, 5, 106, 0, 0, 1109, 1123, 5, 107, 0, 0, 1110, 1123, 5, 137, 0, 0, 1111, 1123, 3, 250, 125, 0, 1112, 1123, 3, 192, 96, 0, 1113, 1123, 3, 194, 97, 0, 1114, 1123, 3, 196, 98, 0, 1115, 1123, 3, 232, 116, 0, 1116, 1123, 3, 202, 101, 0, 1117, 1123, 3, 198, 99, 0, 1118, 1123, 3, 200, 100, 0, 1119, 1123, 3, 246, 123, 0, 1120, 1123, 3, 208, 104, 0, 1121, 1123, 3, 190, 95, 0, 1122, 1107, 1, 0, 0, 0, 1122, 1108, 1, 0, 0, 0, 1122, 1109, 1, 0, 0, 0, 1122, 1110, 1, 0, 0, 0, 1122, 1111, 1, 0, 0, 0, 1122, 1112, 1, 0, 0, 0, 1122, 1113, 1, 0, 0, 0, 1122, 1114, 1, 0, 0, 0, 1122, 1115, 1, 0, 0, 0, 1122, 1116, 1, 0, 0, 0, 1122, 1117, 1, 0, 0, 0, 1122, 1118, 1, 0, 0, 0, 1122, 1119, 1, 0, 0, 0, 1122, 1120, 1, 0, 0, 0, 1122, 1121, 1, 0, 0, 0, 1123, 189, 1, 0, 0, 0, 1124, 1125, 5, 7, 0, 0, 1125, 1126, 3, 14, 7, 0, 1126, 1127, 5, 8, 0, 0, 1127, 191, 1, 0, 0, 0, 1128, 1129, 5, 5, 0, 0, 1129, 1130, 3, 72, 36, 0, 1130, 193, 1, 0, 0, 0, 1131, 1133, 5, 9, 0, 0, 1132, 1134, 3, 92, 46, 0, 1133, 1132, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1136, 5, 10, 0, 0, 1136, 195, 1, 0, 0, 0, 1137, 1138, 5, 57, 0, 0, 1138, 197, 1, 0, 0, 0, 1139, 1140, 5, 16, 0, 0, 1140, 1141, 5, 7, 0, 0, 1141, 1142, 3, 92, 46, 0, 1142, 1143, 5, 8, 0, 0, 1143, 199, 1, 0, 0, 0, 1144, 1145, 5, 105, 0, 0, 1145, 1146, 5, 7, 0, 0, 1146, 1147, 3, 92, 46, 0, 1147, 1148, 5, 8, 0, 0, 1148, 201, 1, 0, 0, 0, 1149, 1150, 3, 72, 36, 0, 1150, 1151, 3, 204, 102, 0, 1151, 203, 1, 0, 0, 0, 1152, 1159, 5, 9, 0, 0, 1153, 1155, 3, 206, 103, 0, 1154, 1156, 5, 14, 0, 0, 1155, 1154, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1158, 1, 0, 0, 0, 1157, 1153, 1, 0, 0, 0, 1158, 1161, 1, 0, 0, 0, 1159, 1157, 1, 0, 0, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1162, 1, 0, 0, 0, 1161, 1159, 1, 0, 0, 0, 1162, 1163, 5, 10, 0, 0, 1163, 205, 1, 0, 0, 0, 1164, 1167, 3, 94, 47, 0, 1165, 1167, 5, 135, 0, 0, 1166, 1164, 1, 0, 0, 0, 1166, 1165, 1, 0, 0, 0, 1167, 207, 1, 0, 0, 0, 1168, 1171, 3, 210, 105, 0, 1169, 1171, 3, 212, 106, 0, 1170, 1168, 1, 0, 0, 0, 1170, 1169, 1, 0, 0, 0, 1171, 209, 1, 0, 0, 0, 1172, 1173, 3, 72, 36, 0, 1173, 1174, 5, 58, 0, 0, 1174, 1175, 5, 137, 0, 0, 1175, 211, 1, 0, 0, 0, 1176, 1177, 3, 50, 25, 0, 1177, 1178, 5, 31, 0, 0, 1178, 1180, 5, 9, 0, 0, 1179, 1181, 3, 88, 44, 0, 1180, 1179, 1, 0, 0, 0, 1180, 1181, 1, 0, 0, 0, 1181, 1182, 1, 0, 0, 0, 1182, 1185, 5, 10, 0, 0, 1183, 1184, 5, 70, 0, 0, 1184, 1186, 3, 230, 115, 0, 1185, 1183, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1187, 1, 0, 0, 0, 1187, 1188, 5, 7, 0, 0, 1188, 1189, 3, 16, 8, 0, 1189, 1190, 5, 8, 0, 0, 1190, 213, 1, 0, 0, 0, 1191, 1192, 5, 115, 0, 0, 1192, 1193, 5, 126, 0, 0, 1193, 1194, 3, 94, 47, 0, 1194, 1195, 5, 122, 0, 0, 1195, 1199, 3, 94, 47, 0, 1196, 1197, 5, 71, 0, 0, 1197, 1198, 5, 125, 0, 0, 1198, 1200, 3, 94, 47, 0, 1199, 1196, 1, 0, 0, 0, 1199, 1200, 1, 0, 0, 0, 1200, 1215, 1, 0, 0, 0, 1201, 1202, 5, 115, 0, 0, 1202, 1203, 5, 126, 0, 0, 1203, 1208, 3, 244, 122, 0, 1204, 1205, 5, 14, 0, 0, 1205, 1207, 3, 244, 122, 0, 1206, 1204, 1, 0, 0, 0, 1207, 1210, 1, 0, 0, 0, 1208, 1206, 1, 0, 0, 0, 1208, 1209, 1, 0, 0, 0, 1209, 1211, 1, 0, 0, 0, 1210, 1208, 1, 0, 0, 0, 1211, 1212, 5, 122, 0, 0, 1212, 1213, 3, 94, 47, 0, 1213, 1215, 1, 0, 0, 0, 1214, 1191, 1, 0, 0, 0, 1214, 1201, 1, 0, 0, 0, 1215, 215, 1, 0, 0, 0, 1216, 1217, 5, 116, 0, 0, 1217, 1218, 5, 126, 0, 0, 1218, 1219, 3, 226, 113, 0, 1219, 217, 1, 0, 0, 0, 1220, 1221, 5, 117, 0, 0, 1221, 1222, 5, 126, 0, 0, 1222, 1223, 3, 226, 113, 0, 1223, 1224, 5, 70, 0, 0, 1224, 1225, 3, 94, 47, 0, 1225, 219, 1, 0, 0, 0, 1226, 1227, 5, 118, 0, 0, 1227, 1228, 5, 123, 0, 0, 1228, 1229, 5, 97, 0, 0, 1229, 1230, 5, 126, 0, 0, 1230, 1231, 3, 226, 113, 0, 1231, 1232, 5, 124, 0, 0, 1232, 1233, 3, 94, 47, 0, 1233, 221, 1, 0, 0, 0, 1234, 1235, 5, 119, 0, 0, 1235, 1240, 3, 228, 114, 0, 1236, 1237, 5, 14, 0, 0, 1237, 1239, 3, 228, 114, 0, 1238, 1236, 1, 0, 0, 0, 1239, 1242, 1, 0, 0, 0, 1240, 1238, 1, 0, 0, 0, 1240, 1241, 1, 0, 0, 0, 1241, 1243, 1, 0, 0, 0, 1242, 1240, 1, 0, 0, 0, 1243, 1244, 5, 120, 0, 0, 1244, 1245, 3, 94, 47, 0, 1245, 1246, 5, 67, 0, 0, 1246, 1247, 3, 94, 47, 0, 1247, 223, 1, 0, 0, 0, 1248, 1249, 5, 121, 0, 0, 1249, 1250, 5, 126, 0, 0, 1250, 1251, 3, 94, 47, 0, 1251, 1252, 5, 122, 0, 0, 1252, 1253, 3, 94, 47, 0, 1253, 225, 1, 0, 0, 0, 1254, 1257, 3, 188, 94, 0, 1255, 1258, 3, 180, 90, 0, 1256, 1258, 3, 186, 93, 0, 1257, 1255, 1, 0, 0, 0, 1257, 1256, 1, 0, 0, 0, 1258, 1259, 1, 0, 0, 0, 1259, 1257, 1, 0, 0, 0, 1259, 1260, 1, 0, 0, 0, 1260, 227, 1, 0, 0, 0, 1261, 1262, 3, 192, 96, 0, 1262, 1263, 5, 6, 0, 0, 1263, 1264, 3, 94, 47, 0, 1264, 229, 1, 0, 0, 0, 1265, 1266, 5, 9, 0, 0, 1266, 1274, 5, 10, 0, 0, 1267, 1271, 3, 234, 117, 0, 1268, 1272, 5, 135, 0, 0, 1269, 1272, 5, 11, 0, 0, 1270, 1272, 5, 48, 0, 0, 1271, 1268, 1, 0, 0, 0, 1271, 1269, 1, 0, 0, 0, 1271, 1270, 1, 0, 0, 0, 1271, 1272, 1, 0, 0, 0, 1272, 1274, 1, 0, 0, 0, 1273, 1265, 1, 0, 0, 0, 1273, 1267, 1, 0, 0, 0, 1274, 231, 1, 0, 0, 0, 1275, 1284, 5, 7, 0, 0, 1276, 1281, 3, 244, 122, 0, 1277, 1278, 5, 14, 0, 0, 1278, 1280, 3, 244, 122, 0, 1279, 1277, 1, 0, 0, 0, 1280, 1283, 1, 0, 0, 0, 1281, 1279, 1, 0, 0, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1285, 1, 0, 0, 0, 1283, 1281, 1, 0, 0, 0, 1284, 1276, 1, 0, 0, 0, 1284, 1285, 1, 0, 0, 0, 1285, 1286, 1, 0, 0, 0, 1286, 1292, 5, 8, 0, 0, 1287, 1288, 5, 59, 0, 0, 1288, 1289, 3, 92, 46, 0, 1289, 1290, 5, 60, 0, 0, 1290, 1292, 1, 0, 0, 0, 1291, 1275, 1, 0, 0, 0, 1291, 1287, 1, 0, 0, 0, 1292, 233, 1, 0, 0, 0, 1293, 1297, 3, 72, 36, 0, 1294, 1297, 5, 136, 0, 0, 1295, 1297, 3, 236, 118, 0, 1296, 1293, 1, 0, 0, 0, 1296, 1294, 1, 0, 0, 0, 1296, 1295, 1, 0, 0, 0, 1297, 235, 1, 0, 0, 0, 1298, 1301, 3, 238, 119, 0, 1299, 1301, 3, 240, 120, 0, 1300, 1298, 1, 0, 0, 0, 1300, 1299, 1, 0, 0, 0, 1301, 237, 1, 0, 0, 0, 1302, 1303, 5, 31, 0, 0, 1303, 1304, 5, 9, 0, 0, 1304, 1305, 5, 11, 0, 0, 1305, 1306, 5, 10, 0, 0, 1306, 239, 1, 0, 0, 0, 1307, 1308, 5, 31, 0, 0, 1308, 1317, 5, 9, 0, 0, 1309, 1314, 3, 230, 115, 0, 1310, 1311, 5, 14, 0, 0, 1311, 1313, 3, 230, 115, 0, 1312, 1310, 1, 0, 0, 0, 1313, 1316, 1, 0, 0, 0, 1314, 1312, 1, 0, 0, 0, 1314, 1315, 1, 0, 0, 0, 1315, 1318, 1, 0, 0, 0, 1316, 1314, 1, 0, 0, 0, 1317, 1309, 1, 0, 0, 0, 1317, 1318, 1, 0, 0, 0, 1318, 1319, 1, 0, 0, 0, 1319, 1320, 5, 10, 0, 0, 1320, 1321, 5, 70, 0, 0, 1321, 1322, 3, 230, 115, 0, 1322, 241, 1, 0, 0, 0, 1323, 1325, 3, 234, 117, 0, 1324, 1326, 5, 135, 0, 0, 1325, 1324, 1, 0, 0, 0, 1325, 1326, 1, 0, 0, 0, 1326, 243, 1, 0, 0, 0, 1327, 1330, 3, 94, 47, 0, 1328, 1330, 5, 143, 0, 0, 1329, 1327, 1, 0, 0, 0, 1329, 1328, 1, 0, 0, 0, 1330, 1331, 1, 0, 0, 0, 1331, 1332, 7, 6, 0, 0, 1332, 1333, 3, 94, 47, 0, 1333, 245, 1, 0, 0, 0, 1334, 1336, 5, 54, 0, 0, 1335, 1337, 3, 92, 46, 0, 1336, 1335, 1, 0, 0, 0, 1336, 1337, 1, 0, 0, 0, 1337, 1338, 1, 0, 0, 0, 1338, 1339, 5, 55, 0, 0, 1339, 247, 1, 0, 0, 0, 1340, 1341, 3, 250, 125, 0, 1341, 249, 1, 0, 0, 0, 1342, 1343, 5, 134, 0, 0, 1343, 251, 1, 0, 0, 0, 1344, 1345, 7, 7, 0, 0, 1345, 253, 1, 0, 0, 0, 133, 262, 266, 282, 288, 296, 304, 312, 327, 357, 365, 367, 389, 399, 409, 414, 419, 423, 435, 439, 448, 455, 469, 473, 476, 481, 491, 499, 503, 515, 527, 549, 557, 562, 565, 569, 578, 587, 590, 598, 605, 607, 614, 621, 623, 631, 636, 643, 650, 660, 667, 674, 681, 690, 700, 704, 712, 714, 726, 732, 736, 740, 751, 757, 772, 778, 782, 786, 793, 800, 806, 811, 813, 817, 824, 831, 840, 852, 862, 874, 878, 887, 894, 916, 921, 926, 930, 942, 950, 954, 961, 968, 974, 981, 989, 996, 1002, 1008, 1014, 1020, 1031, 1037, 1042, 1050, 1071, 1080, 1082, 1105, 1122, 1133, 1155, 1159, 1166, 1170, 1180, 1185, 1199, 1208, 1214, 1240, 1257, 1259, 1271, 1273, 1281, 1284, 1291, 1296, 1300, 1314, 1317, 1325, 1329, 1336] \ 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..90fc814284 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.tokens +++ b/src/main/java/org/rumbledb/parser/Jsoniq.tokens @@ -121,27 +121,28 @@ 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 +Kwith=124 +Kposition=125 +Kjson=126 +Kupdating=127 +Kbreak=128 +Kloop=129 +Kcontinue=130 +Kexit=131 +Kreturning=132 +Kwhile=133 +STRING=134 +ArgumentPlaceholder=135 +NullLiteral=136 +Literal=137 +NumericLiteral=138 +IntegerLiteral=139 +DecimalLiteral=140 +DoubleLiteral=141 +WS=142 +NCName=143 +XQComment=144 +ContentChar=145 ';'=1 'module'=2 'namespace'=3 @@ -265,14 +266,15 @@ ContentChar=144 '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 +'with'=124 +'position'=125 +'json'=126 +'updating'=127 +'break'=128 +'loop'=129 +'continue'=130 +'exit'=131 +'returning'=132 +'while'=133 +'?'=135 +'null'=136 diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.interp b/src/main/java/org/rumbledb/parser/JsoniqLexer.interp index 6582d2c9ec..6be24f3536 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqLexer.interp +++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.interp @@ -123,9 +123,10 @@ null 'append' 'into' 'value' -'json' 'with' 'position' +'json' +'updating' 'break' 'loop' 'continue' @@ -270,9 +271,10 @@ Kmodify Kappend Kinto Kvalue -Kjson Kwith Kposition +Kjson +Kupdating Kbreak Kloop Kcontinue @@ -416,9 +418,10 @@ Kmodify Kappend Kinto Kvalue -Kjson Kwith Kposition +Kjson +Kupdating Kbreak Kloop Kcontinue @@ -452,4 +455,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 144, 1196, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 5, 132, 1082, 8, 132, 10, 132, 12, 132, 1085, 9, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 3, 133, 1092, 8, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 3, 139, 1114, 8, 139, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 5, 141, 1123, 8, 141, 10, 141, 12, 141, 1126, 9, 141, 3, 141, 1128, 8, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 5, 142, 1135, 8, 142, 10, 142, 12, 142, 1138, 9, 142, 3, 142, 1140, 8, 142, 3, 142, 1142, 8, 142, 1, 142, 1, 142, 3, 142, 1146, 8, 142, 1, 142, 1, 142, 1, 143, 4, 143, 1151, 8, 143, 11, 143, 12, 143, 1152, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 5, 145, 1161, 8, 145, 10, 145, 12, 145, 1164, 9, 145, 1, 146, 3, 146, 1167, 8, 146, 1, 147, 1, 147, 3, 147, 1171, 8, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 5, 148, 1181, 8, 148, 10, 148, 12, 148, 1184, 9, 148, 1, 148, 4, 148, 1187, 8, 148, 11, 148, 12, 148, 1188, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 0, 0, 150, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 0, 269, 0, 271, 0, 273, 134, 275, 135, 277, 136, 279, 137, 281, 138, 283, 139, 285, 140, 287, 0, 289, 141, 291, 142, 293, 0, 295, 0, 297, 143, 299, 144, 1, 0, 13, 2, 0, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 9, 10, 13, 13, 32, 32, 14, 0, 65, 90, 95, 95, 97, 122, 192, 214, 216, 246, 248, 767, 880, 893, 895, 8191, 8204, 8205, 8304, 8591, 11264, 12271, 12289, 55295, 63744, 64975, 65008, 65533, 5, 0, 45, 45, 48, 57, 183, 183, 768, 879, 8255, 8256, 1, 0, 58, 58, 1, 0, 41, 41, 2, 0, 40, 40, 58, 58, 5, 0, 34, 34, 38, 39, 60, 60, 123, 123, 125, 125, 1208, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 1, 301, 1, 0, 0, 0, 3, 303, 1, 0, 0, 0, 5, 310, 1, 0, 0, 0, 7, 320, 1, 0, 0, 0, 9, 322, 1, 0, 0, 0, 11, 324, 1, 0, 0, 0, 13, 327, 1, 0, 0, 0, 15, 329, 1, 0, 0, 0, 17, 331, 1, 0, 0, 0, 19, 333, 1, 0, 0, 0, 21, 335, 1, 0, 0, 0, 23, 337, 1, 0, 0, 0, 25, 339, 1, 0, 0, 0, 27, 341, 1, 0, 0, 0, 29, 343, 1, 0, 0, 0, 31, 352, 1, 0, 0, 0, 33, 360, 1, 0, 0, 0, 35, 375, 1, 0, 0, 0, 37, 377, 1, 0, 0, 0, 39, 395, 1, 0, 0, 0, 41, 414, 1, 0, 0, 0, 43, 423, 1, 0, 0, 0, 45, 434, 1, 0, 0, 0, 47, 438, 1, 0, 0, 0, 49, 446, 1, 0, 0, 0, 51, 456, 1, 0, 0, 0, 53, 467, 1, 0, 0, 0, 55, 473, 1, 0, 0, 0, 57, 491, 1, 0, 0, 0, 59, 498, 1, 0, 0, 0, 61, 507, 1, 0, 0, 0, 63, 516, 1, 0, 0, 0, 65, 523, 1, 0, 0, 0, 67, 531, 1, 0, 0, 0, 69, 539, 1, 0, 0, 0, 71, 546, 1, 0, 0, 0, 73, 549, 1, 0, 0, 0, 75, 552, 1, 0, 0, 0, 77, 555, 1, 0, 0, 0, 79, 558, 1, 0, 0, 0, 81, 561, 1, 0, 0, 0, 83, 564, 1, 0, 0, 0, 85, 567, 1, 0, 0, 0, 87, 569, 1, 0, 0, 0, 89, 572, 1, 0, 0, 0, 91, 574, 1, 0, 0, 0, 93, 577, 1, 0, 0, 0, 95, 580, 1, 0, 0, 0, 97, 582, 1, 0, 0, 0, 99, 584, 1, 0, 0, 0, 101, 588, 1, 0, 0, 0, 103, 593, 1, 0, 0, 0, 105, 597, 1, 0, 0, 0, 107, 599, 1, 0, 0, 0, 109, 601, 1, 0, 0, 0, 111, 603, 1, 0, 0, 0, 113, 605, 1, 0, 0, 0, 115, 608, 1, 0, 0, 0, 117, 610, 1, 0, 0, 0, 119, 613, 1, 0, 0, 0, 121, 616, 1, 0, 0, 0, 123, 620, 1, 0, 0, 0, 125, 624, 1, 0, 0, 0, 127, 630, 1, 0, 0, 0, 129, 636, 1, 0, 0, 0, 131, 639, 1, 0, 0, 0, 133, 645, 1, 0, 0, 0, 135, 652, 1, 0, 0, 0, 137, 655, 1, 0, 0, 0, 139, 658, 1, 0, 0, 0, 141, 661, 1, 0, 0, 0, 143, 664, 1, 0, 0, 0, 145, 673, 1, 0, 0, 0, 147, 679, 1, 0, 0, 0, 149, 685, 1, 0, 0, 0, 151, 692, 1, 0, 0, 0, 153, 702, 1, 0, 0, 0, 155, 713, 1, 0, 0, 0, 157, 718, 1, 0, 0, 0, 159, 724, 1, 0, 0, 0, 161, 734, 1, 0, 0, 0, 163, 744, 1, 0, 0, 0, 165, 753, 1, 0, 0, 0, 167, 759, 1, 0, 0, 0, 169, 766, 1, 0, 0, 0, 171, 771, 1, 0, 0, 0, 173, 775, 1, 0, 0, 0, 175, 781, 1, 0, 0, 0, 177, 789, 1, 0, 0, 0, 179, 794, 1, 0, 0, 0, 181, 799, 1, 0, 0, 0, 183, 810, 1, 0, 0, 0, 185, 813, 1, 0, 0, 0, 187, 817, 1, 0, 0, 0, 189, 821, 1, 0, 0, 0, 191, 824, 1, 0, 0, 0, 193, 833, 1, 0, 0, 0, 195, 836, 1, 0, 0, 0, 197, 847, 1, 0, 0, 0, 199, 850, 1, 0, 0, 0, 201, 856, 1, 0, 0, 0, 203, 861, 1, 0, 0, 0, 205, 870, 1, 0, 0, 0, 207, 878, 1, 0, 0, 0, 209, 885, 1, 0, 0, 0, 211, 895, 1, 0, 0, 0, 213, 900, 1, 0, 0, 0, 215, 906, 1, 0, 0, 0, 217, 911, 1, 0, 0, 0, 219, 920, 1, 0, 0, 0, 221, 929, 1, 0, 0, 0, 223, 937, 1, 0, 0, 0, 225, 945, 1, 0, 0, 0, 227, 950, 1, 0, 0, 0, 229, 959, 1, 0, 0, 0, 231, 966, 1, 0, 0, 0, 233, 973, 1, 0, 0, 0, 235, 980, 1, 0, 0, 0, 237, 988, 1, 0, 0, 0, 239, 993, 1, 0, 0, 0, 241, 1000, 1, 0, 0, 0, 243, 1007, 1, 0, 0, 0, 245, 1012, 1, 0, 0, 0, 247, 1018, 1, 0, 0, 0, 249, 1023, 1, 0, 0, 0, 251, 1028, 1, 0, 0, 0, 253, 1037, 1, 0, 0, 0, 255, 1043, 1, 0, 0, 0, 257, 1048, 1, 0, 0, 0, 259, 1057, 1, 0, 0, 0, 261, 1062, 1, 0, 0, 0, 263, 1072, 1, 0, 0, 0, 265, 1078, 1, 0, 0, 0, 267, 1088, 1, 0, 0, 0, 269, 1093, 1, 0, 0, 0, 271, 1099, 1, 0, 0, 0, 273, 1101, 1, 0, 0, 0, 275, 1103, 1, 0, 0, 0, 277, 1108, 1, 0, 0, 0, 279, 1113, 1, 0, 0, 0, 281, 1115, 1, 0, 0, 0, 283, 1127, 1, 0, 0, 0, 285, 1141, 1, 0, 0, 0, 287, 1150, 1, 0, 0, 0, 289, 1154, 1, 0, 0, 0, 291, 1158, 1, 0, 0, 0, 293, 1166, 1, 0, 0, 0, 295, 1170, 1, 0, 0, 0, 297, 1172, 1, 0, 0, 0, 299, 1194, 1, 0, 0, 0, 301, 302, 5, 59, 0, 0, 302, 2, 1, 0, 0, 0, 303, 304, 5, 109, 0, 0, 304, 305, 5, 111, 0, 0, 305, 306, 5, 100, 0, 0, 306, 307, 5, 117, 0, 0, 307, 308, 5, 108, 0, 0, 308, 309, 5, 101, 0, 0, 309, 4, 1, 0, 0, 0, 310, 311, 5, 110, 0, 0, 311, 312, 5, 97, 0, 0, 312, 313, 5, 109, 0, 0, 313, 314, 5, 101, 0, 0, 314, 315, 5, 115, 0, 0, 315, 316, 5, 112, 0, 0, 316, 317, 5, 97, 0, 0, 317, 318, 5, 99, 0, 0, 318, 319, 5, 101, 0, 0, 319, 6, 1, 0, 0, 0, 320, 321, 5, 61, 0, 0, 321, 8, 1, 0, 0, 0, 322, 323, 5, 36, 0, 0, 323, 10, 1, 0, 0, 0, 324, 325, 5, 58, 0, 0, 325, 326, 5, 61, 0, 0, 326, 12, 1, 0, 0, 0, 327, 328, 5, 123, 0, 0, 328, 14, 1, 0, 0, 0, 329, 330, 5, 125, 0, 0, 330, 16, 1, 0, 0, 0, 331, 332, 5, 40, 0, 0, 332, 18, 1, 0, 0, 0, 333, 334, 5, 41, 0, 0, 334, 20, 1, 0, 0, 0, 335, 336, 5, 42, 0, 0, 336, 22, 1, 0, 0, 0, 337, 338, 5, 124, 0, 0, 338, 24, 1, 0, 0, 0, 339, 340, 5, 37, 0, 0, 340, 26, 1, 0, 0, 0, 341, 342, 5, 44, 0, 0, 342, 28, 1, 0, 0, 0, 343, 344, 5, 111, 0, 0, 344, 345, 5, 114, 0, 0, 345, 346, 5, 100, 0, 0, 346, 347, 5, 101, 0, 0, 347, 348, 5, 114, 0, 0, 348, 349, 5, 105, 0, 0, 349, 350, 5, 110, 0, 0, 350, 351, 5, 103, 0, 0, 351, 30, 1, 0, 0, 0, 352, 353, 5, 111, 0, 0, 353, 354, 5, 114, 0, 0, 354, 355, 5, 100, 0, 0, 355, 356, 5, 101, 0, 0, 356, 357, 5, 114, 0, 0, 357, 358, 5, 101, 0, 0, 358, 359, 5, 100, 0, 0, 359, 32, 1, 0, 0, 0, 360, 361, 5, 100, 0, 0, 361, 362, 5, 101, 0, 0, 362, 363, 5, 99, 0, 0, 363, 364, 5, 105, 0, 0, 364, 365, 5, 109, 0, 0, 365, 366, 5, 97, 0, 0, 366, 367, 5, 108, 0, 0, 367, 368, 5, 45, 0, 0, 368, 369, 5, 102, 0, 0, 369, 370, 5, 111, 0, 0, 370, 371, 5, 114, 0, 0, 371, 372, 5, 109, 0, 0, 372, 373, 5, 97, 0, 0, 373, 374, 5, 116, 0, 0, 374, 34, 1, 0, 0, 0, 375, 376, 5, 58, 0, 0, 376, 36, 1, 0, 0, 0, 377, 378, 5, 100, 0, 0, 378, 379, 5, 101, 0, 0, 379, 380, 5, 99, 0, 0, 380, 381, 5, 105, 0, 0, 381, 382, 5, 109, 0, 0, 382, 383, 5, 97, 0, 0, 383, 384, 5, 108, 0, 0, 384, 385, 5, 45, 0, 0, 385, 386, 5, 115, 0, 0, 386, 387, 5, 101, 0, 0, 387, 388, 5, 112, 0, 0, 388, 389, 5, 97, 0, 0, 389, 390, 5, 114, 0, 0, 390, 391, 5, 97, 0, 0, 391, 392, 5, 116, 0, 0, 392, 393, 5, 111, 0, 0, 393, 394, 5, 114, 0, 0, 394, 38, 1, 0, 0, 0, 395, 396, 5, 103, 0, 0, 396, 397, 5, 114, 0, 0, 397, 398, 5, 111, 0, 0, 398, 399, 5, 117, 0, 0, 399, 400, 5, 112, 0, 0, 400, 401, 5, 105, 0, 0, 401, 402, 5, 110, 0, 0, 402, 403, 5, 103, 0, 0, 403, 404, 5, 45, 0, 0, 404, 405, 5, 115, 0, 0, 405, 406, 5, 101, 0, 0, 406, 407, 5, 112, 0, 0, 407, 408, 5, 97, 0, 0, 408, 409, 5, 114, 0, 0, 409, 410, 5, 97, 0, 0, 410, 411, 5, 116, 0, 0, 411, 412, 5, 111, 0, 0, 412, 413, 5, 114, 0, 0, 413, 40, 1, 0, 0, 0, 414, 415, 5, 105, 0, 0, 415, 416, 5, 110, 0, 0, 416, 417, 5, 102, 0, 0, 417, 418, 5, 105, 0, 0, 418, 419, 5, 110, 0, 0, 419, 420, 5, 105, 0, 0, 420, 421, 5, 116, 0, 0, 421, 422, 5, 121, 0, 0, 422, 42, 1, 0, 0, 0, 423, 424, 5, 109, 0, 0, 424, 425, 5, 105, 0, 0, 425, 426, 5, 110, 0, 0, 426, 427, 5, 117, 0, 0, 427, 428, 5, 115, 0, 0, 428, 429, 5, 45, 0, 0, 429, 430, 5, 115, 0, 0, 430, 431, 5, 105, 0, 0, 431, 432, 5, 103, 0, 0, 432, 433, 5, 110, 0, 0, 433, 44, 1, 0, 0, 0, 434, 435, 5, 78, 0, 0, 435, 436, 5, 97, 0, 0, 436, 437, 5, 78, 0, 0, 437, 46, 1, 0, 0, 0, 438, 439, 5, 112, 0, 0, 439, 440, 5, 101, 0, 0, 440, 441, 5, 114, 0, 0, 441, 442, 5, 99, 0, 0, 442, 443, 5, 101, 0, 0, 443, 444, 5, 110, 0, 0, 444, 445, 5, 116, 0, 0, 445, 48, 1, 0, 0, 0, 446, 447, 5, 112, 0, 0, 447, 448, 5, 101, 0, 0, 448, 449, 5, 114, 0, 0, 449, 450, 5, 45, 0, 0, 450, 451, 5, 109, 0, 0, 451, 452, 5, 105, 0, 0, 452, 453, 5, 108, 0, 0, 453, 454, 5, 108, 0, 0, 454, 455, 5, 101, 0, 0, 455, 50, 1, 0, 0, 0, 456, 457, 5, 122, 0, 0, 457, 458, 5, 101, 0, 0, 458, 459, 5, 114, 0, 0, 459, 460, 5, 111, 0, 0, 460, 461, 5, 45, 0, 0, 461, 462, 5, 100, 0, 0, 462, 463, 5, 105, 0, 0, 463, 464, 5, 103, 0, 0, 464, 465, 5, 105, 0, 0, 465, 466, 5, 116, 0, 0, 466, 52, 1, 0, 0, 0, 467, 468, 5, 100, 0, 0, 468, 469, 5, 105, 0, 0, 469, 470, 5, 103, 0, 0, 470, 471, 5, 105, 0, 0, 471, 472, 5, 116, 0, 0, 472, 54, 1, 0, 0, 0, 473, 474, 5, 112, 0, 0, 474, 475, 5, 97, 0, 0, 475, 476, 5, 116, 0, 0, 476, 477, 5, 116, 0, 0, 477, 478, 5, 101, 0, 0, 478, 479, 5, 114, 0, 0, 479, 480, 5, 110, 0, 0, 480, 481, 5, 45, 0, 0, 481, 482, 5, 115, 0, 0, 482, 483, 5, 101, 0, 0, 483, 484, 5, 112, 0, 0, 484, 485, 5, 97, 0, 0, 485, 486, 5, 114, 0, 0, 486, 487, 5, 97, 0, 0, 487, 488, 5, 116, 0, 0, 488, 489, 5, 111, 0, 0, 489, 490, 5, 114, 0, 0, 490, 56, 1, 0, 0, 0, 491, 492, 5, 105, 0, 0, 492, 493, 5, 109, 0, 0, 493, 494, 5, 112, 0, 0, 494, 495, 5, 111, 0, 0, 495, 496, 5, 114, 0, 0, 496, 497, 5, 116, 0, 0, 497, 58, 1, 0, 0, 0, 498, 499, 5, 101, 0, 0, 499, 500, 5, 120, 0, 0, 500, 501, 5, 116, 0, 0, 501, 502, 5, 101, 0, 0, 502, 503, 5, 114, 0, 0, 503, 504, 5, 110, 0, 0, 504, 505, 5, 97, 0, 0, 505, 506, 5, 108, 0, 0, 506, 60, 1, 0, 0, 0, 507, 508, 5, 102, 0, 0, 508, 509, 5, 117, 0, 0, 509, 510, 5, 110, 0, 0, 510, 511, 5, 99, 0, 0, 511, 512, 5, 116, 0, 0, 512, 513, 5, 105, 0, 0, 513, 514, 5, 111, 0, 0, 514, 515, 5, 110, 0, 0, 515, 62, 1, 0, 0, 0, 516, 517, 5, 106, 0, 0, 517, 518, 5, 115, 0, 0, 518, 519, 5, 111, 0, 0, 519, 520, 5, 117, 0, 0, 520, 521, 5, 110, 0, 0, 521, 522, 5, 100, 0, 0, 522, 64, 1, 0, 0, 0, 523, 524, 5, 99, 0, 0, 524, 525, 5, 111, 0, 0, 525, 526, 5, 109, 0, 0, 526, 527, 5, 112, 0, 0, 527, 528, 5, 97, 0, 0, 528, 529, 5, 99, 0, 0, 529, 530, 5, 116, 0, 0, 530, 66, 1, 0, 0, 0, 531, 532, 5, 118, 0, 0, 532, 533, 5, 101, 0, 0, 533, 534, 5, 114, 0, 0, 534, 535, 5, 98, 0, 0, 535, 536, 5, 111, 0, 0, 536, 537, 5, 115, 0, 0, 537, 538, 5, 101, 0, 0, 538, 68, 1, 0, 0, 0, 539, 540, 5, 115, 0, 0, 540, 541, 5, 99, 0, 0, 541, 542, 5, 104, 0, 0, 542, 543, 5, 101, 0, 0, 543, 544, 5, 109, 0, 0, 544, 545, 5, 97, 0, 0, 545, 70, 1, 0, 0, 0, 546, 547, 5, 101, 0, 0, 547, 548, 5, 113, 0, 0, 548, 72, 1, 0, 0, 0, 549, 550, 5, 110, 0, 0, 550, 551, 5, 101, 0, 0, 551, 74, 1, 0, 0, 0, 552, 553, 5, 108, 0, 0, 553, 554, 5, 116, 0, 0, 554, 76, 1, 0, 0, 0, 555, 556, 5, 108, 0, 0, 556, 557, 5, 101, 0, 0, 557, 78, 1, 0, 0, 0, 558, 559, 5, 103, 0, 0, 559, 560, 5, 116, 0, 0, 560, 80, 1, 0, 0, 0, 561, 562, 5, 103, 0, 0, 562, 563, 5, 101, 0, 0, 563, 82, 1, 0, 0, 0, 564, 565, 5, 33, 0, 0, 565, 566, 5, 61, 0, 0, 566, 84, 1, 0, 0, 0, 567, 568, 5, 60, 0, 0, 568, 86, 1, 0, 0, 0, 569, 570, 5, 60, 0, 0, 570, 571, 5, 61, 0, 0, 571, 88, 1, 0, 0, 0, 572, 573, 5, 62, 0, 0, 573, 90, 1, 0, 0, 0, 574, 575, 5, 62, 0, 0, 575, 576, 5, 61, 0, 0, 576, 92, 1, 0, 0, 0, 577, 578, 5, 124, 0, 0, 578, 579, 5, 124, 0, 0, 579, 94, 1, 0, 0, 0, 580, 581, 5, 43, 0, 0, 581, 96, 1, 0, 0, 0, 582, 583, 5, 45, 0, 0, 583, 98, 1, 0, 0, 0, 584, 585, 5, 100, 0, 0, 585, 586, 5, 105, 0, 0, 586, 587, 5, 118, 0, 0, 587, 100, 1, 0, 0, 0, 588, 589, 5, 105, 0, 0, 589, 590, 5, 100, 0, 0, 590, 591, 5, 105, 0, 0, 591, 592, 5, 118, 0, 0, 592, 102, 1, 0, 0, 0, 593, 594, 5, 109, 0, 0, 594, 595, 5, 111, 0, 0, 595, 596, 5, 100, 0, 0, 596, 104, 1, 0, 0, 0, 597, 598, 5, 33, 0, 0, 598, 106, 1, 0, 0, 0, 599, 600, 5, 91, 0, 0, 600, 108, 1, 0, 0, 0, 601, 602, 5, 93, 0, 0, 602, 110, 1, 0, 0, 0, 603, 604, 5, 46, 0, 0, 604, 112, 1, 0, 0, 0, 605, 606, 5, 36, 0, 0, 606, 607, 5, 36, 0, 0, 607, 114, 1, 0, 0, 0, 608, 609, 5, 35, 0, 0, 609, 116, 1, 0, 0, 0, 610, 611, 5, 123, 0, 0, 611, 612, 5, 124, 0, 0, 612, 118, 1, 0, 0, 0, 613, 614, 5, 124, 0, 0, 614, 615, 5, 125, 0, 0, 615, 120, 1, 0, 0, 0, 616, 617, 5, 102, 0, 0, 617, 618, 5, 111, 0, 0, 618, 619, 5, 114, 0, 0, 619, 122, 1, 0, 0, 0, 620, 621, 5, 108, 0, 0, 621, 622, 5, 101, 0, 0, 622, 623, 5, 116, 0, 0, 623, 124, 1, 0, 0, 0, 624, 625, 5, 119, 0, 0, 625, 626, 5, 104, 0, 0, 626, 627, 5, 101, 0, 0, 627, 628, 5, 114, 0, 0, 628, 629, 5, 101, 0, 0, 629, 126, 1, 0, 0, 0, 630, 631, 5, 103, 0, 0, 631, 632, 5, 114, 0, 0, 632, 633, 5, 111, 0, 0, 633, 634, 5, 117, 0, 0, 634, 635, 5, 112, 0, 0, 635, 128, 1, 0, 0, 0, 636, 637, 5, 98, 0, 0, 637, 638, 5, 121, 0, 0, 638, 130, 1, 0, 0, 0, 639, 640, 5, 111, 0, 0, 640, 641, 5, 114, 0, 0, 641, 642, 5, 100, 0, 0, 642, 643, 5, 101, 0, 0, 643, 644, 5, 114, 0, 0, 644, 132, 1, 0, 0, 0, 645, 646, 5, 114, 0, 0, 646, 647, 5, 101, 0, 0, 647, 648, 5, 116, 0, 0, 648, 649, 5, 117, 0, 0, 649, 650, 5, 114, 0, 0, 650, 651, 5, 110, 0, 0, 651, 134, 1, 0, 0, 0, 652, 653, 5, 105, 0, 0, 653, 654, 5, 102, 0, 0, 654, 136, 1, 0, 0, 0, 655, 656, 5, 105, 0, 0, 656, 657, 5, 110, 0, 0, 657, 138, 1, 0, 0, 0, 658, 659, 5, 97, 0, 0, 659, 660, 5, 115, 0, 0, 660, 140, 1, 0, 0, 0, 661, 662, 5, 97, 0, 0, 662, 663, 5, 116, 0, 0, 663, 142, 1, 0, 0, 0, 664, 665, 5, 97, 0, 0, 665, 666, 5, 108, 0, 0, 666, 667, 5, 108, 0, 0, 667, 668, 5, 111, 0, 0, 668, 669, 5, 119, 0, 0, 669, 670, 5, 105, 0, 0, 670, 671, 5, 110, 0, 0, 671, 672, 5, 103, 0, 0, 672, 144, 1, 0, 0, 0, 673, 674, 5, 101, 0, 0, 674, 675, 5, 109, 0, 0, 675, 676, 5, 112, 0, 0, 676, 677, 5, 116, 0, 0, 677, 678, 5, 121, 0, 0, 678, 146, 1, 0, 0, 0, 679, 680, 5, 99, 0, 0, 680, 681, 5, 111, 0, 0, 681, 682, 5, 117, 0, 0, 682, 683, 5, 110, 0, 0, 683, 684, 5, 116, 0, 0, 684, 148, 1, 0, 0, 0, 685, 686, 5, 115, 0, 0, 686, 687, 5, 116, 0, 0, 687, 688, 5, 97, 0, 0, 688, 689, 5, 98, 0, 0, 689, 690, 5, 108, 0, 0, 690, 691, 5, 101, 0, 0, 691, 150, 1, 0, 0, 0, 692, 693, 5, 97, 0, 0, 693, 694, 5, 115, 0, 0, 694, 695, 5, 99, 0, 0, 695, 696, 5, 101, 0, 0, 696, 697, 5, 110, 0, 0, 697, 698, 5, 100, 0, 0, 698, 699, 5, 105, 0, 0, 699, 700, 5, 110, 0, 0, 700, 701, 5, 103, 0, 0, 701, 152, 1, 0, 0, 0, 702, 703, 5, 100, 0, 0, 703, 704, 5, 101, 0, 0, 704, 705, 5, 115, 0, 0, 705, 706, 5, 99, 0, 0, 706, 707, 5, 101, 0, 0, 707, 708, 5, 110, 0, 0, 708, 709, 5, 100, 0, 0, 709, 710, 5, 105, 0, 0, 710, 711, 5, 110, 0, 0, 711, 712, 5, 103, 0, 0, 712, 154, 1, 0, 0, 0, 713, 714, 5, 115, 0, 0, 714, 715, 5, 111, 0, 0, 715, 716, 5, 109, 0, 0, 716, 717, 5, 101, 0, 0, 717, 156, 1, 0, 0, 0, 718, 719, 5, 101, 0, 0, 719, 720, 5, 118, 0, 0, 720, 721, 5, 101, 0, 0, 721, 722, 5, 114, 0, 0, 722, 723, 5, 121, 0, 0, 723, 158, 1, 0, 0, 0, 724, 725, 5, 115, 0, 0, 725, 726, 5, 97, 0, 0, 726, 727, 5, 116, 0, 0, 727, 728, 5, 105, 0, 0, 728, 729, 5, 115, 0, 0, 729, 730, 5, 102, 0, 0, 730, 731, 5, 105, 0, 0, 731, 732, 5, 101, 0, 0, 732, 733, 5, 115, 0, 0, 733, 160, 1, 0, 0, 0, 734, 735, 5, 99, 0, 0, 735, 736, 5, 111, 0, 0, 736, 737, 5, 108, 0, 0, 737, 738, 5, 108, 0, 0, 738, 739, 5, 97, 0, 0, 739, 740, 5, 116, 0, 0, 740, 741, 5, 105, 0, 0, 741, 742, 5, 111, 0, 0, 742, 743, 5, 110, 0, 0, 743, 162, 1, 0, 0, 0, 744, 745, 5, 103, 0, 0, 745, 746, 5, 114, 0, 0, 746, 747, 5, 101, 0, 0, 747, 748, 5, 97, 0, 0, 748, 749, 5, 116, 0, 0, 749, 750, 5, 101, 0, 0, 750, 751, 5, 115, 0, 0, 751, 752, 5, 116, 0, 0, 752, 164, 1, 0, 0, 0, 753, 754, 5, 108, 0, 0, 754, 755, 5, 101, 0, 0, 755, 756, 5, 97, 0, 0, 756, 757, 5, 115, 0, 0, 757, 758, 5, 116, 0, 0, 758, 166, 1, 0, 0, 0, 759, 760, 5, 115, 0, 0, 760, 761, 5, 119, 0, 0, 761, 762, 5, 105, 0, 0, 762, 763, 5, 116, 0, 0, 763, 764, 5, 99, 0, 0, 764, 765, 5, 104, 0, 0, 765, 168, 1, 0, 0, 0, 766, 767, 5, 99, 0, 0, 767, 768, 5, 97, 0, 0, 768, 769, 5, 115, 0, 0, 769, 770, 5, 101, 0, 0, 770, 170, 1, 0, 0, 0, 771, 772, 5, 116, 0, 0, 772, 773, 5, 114, 0, 0, 773, 774, 5, 121, 0, 0, 774, 172, 1, 0, 0, 0, 775, 776, 5, 99, 0, 0, 776, 777, 5, 97, 0, 0, 777, 778, 5, 116, 0, 0, 778, 779, 5, 99, 0, 0, 779, 780, 5, 104, 0, 0, 780, 174, 1, 0, 0, 0, 781, 782, 5, 100, 0, 0, 782, 783, 5, 101, 0, 0, 783, 784, 5, 102, 0, 0, 784, 785, 5, 97, 0, 0, 785, 786, 5, 117, 0, 0, 786, 787, 5, 108, 0, 0, 787, 788, 5, 116, 0, 0, 788, 176, 1, 0, 0, 0, 789, 790, 5, 116, 0, 0, 790, 791, 5, 104, 0, 0, 791, 792, 5, 101, 0, 0, 792, 793, 5, 110, 0, 0, 793, 178, 1, 0, 0, 0, 794, 795, 5, 101, 0, 0, 795, 796, 5, 108, 0, 0, 796, 797, 5, 115, 0, 0, 797, 798, 5, 101, 0, 0, 798, 180, 1, 0, 0, 0, 799, 800, 5, 116, 0, 0, 800, 801, 5, 121, 0, 0, 801, 802, 5, 112, 0, 0, 802, 803, 5, 101, 0, 0, 803, 804, 5, 115, 0, 0, 804, 805, 5, 119, 0, 0, 805, 806, 5, 105, 0, 0, 806, 807, 5, 116, 0, 0, 807, 808, 5, 99, 0, 0, 808, 809, 5, 104, 0, 0, 809, 182, 1, 0, 0, 0, 810, 811, 5, 111, 0, 0, 811, 812, 5, 114, 0, 0, 812, 184, 1, 0, 0, 0, 813, 814, 5, 97, 0, 0, 814, 815, 5, 110, 0, 0, 815, 816, 5, 100, 0, 0, 816, 186, 1, 0, 0, 0, 817, 818, 5, 110, 0, 0, 818, 819, 5, 111, 0, 0, 819, 820, 5, 116, 0, 0, 820, 188, 1, 0, 0, 0, 821, 822, 5, 116, 0, 0, 822, 823, 5, 111, 0, 0, 823, 190, 1, 0, 0, 0, 824, 825, 5, 105, 0, 0, 825, 826, 5, 110, 0, 0, 826, 827, 5, 115, 0, 0, 827, 828, 5, 116, 0, 0, 828, 829, 5, 97, 0, 0, 829, 830, 5, 110, 0, 0, 830, 831, 5, 99, 0, 0, 831, 832, 5, 101, 0, 0, 832, 192, 1, 0, 0, 0, 833, 834, 5, 111, 0, 0, 834, 835, 5, 102, 0, 0, 835, 194, 1, 0, 0, 0, 836, 837, 5, 115, 0, 0, 837, 838, 5, 116, 0, 0, 838, 839, 5, 97, 0, 0, 839, 840, 5, 116, 0, 0, 840, 841, 5, 105, 0, 0, 841, 842, 5, 99, 0, 0, 842, 843, 5, 97, 0, 0, 843, 844, 5, 108, 0, 0, 844, 845, 5, 108, 0, 0, 845, 846, 5, 121, 0, 0, 846, 196, 1, 0, 0, 0, 847, 848, 5, 105, 0, 0, 848, 849, 5, 115, 0, 0, 849, 198, 1, 0, 0, 0, 850, 851, 5, 116, 0, 0, 851, 852, 5, 114, 0, 0, 852, 853, 5, 101, 0, 0, 853, 854, 5, 97, 0, 0, 854, 855, 5, 116, 0, 0, 855, 200, 1, 0, 0, 0, 856, 857, 5, 99, 0, 0, 857, 858, 5, 97, 0, 0, 858, 859, 5, 115, 0, 0, 859, 860, 5, 116, 0, 0, 860, 202, 1, 0, 0, 0, 861, 862, 5, 99, 0, 0, 862, 863, 5, 97, 0, 0, 863, 864, 5, 115, 0, 0, 864, 865, 5, 116, 0, 0, 865, 866, 5, 97, 0, 0, 866, 867, 5, 98, 0, 0, 867, 868, 5, 108, 0, 0, 868, 869, 5, 101, 0, 0, 869, 204, 1, 0, 0, 0, 870, 871, 5, 118, 0, 0, 871, 872, 5, 101, 0, 0, 872, 873, 5, 114, 0, 0, 873, 874, 5, 115, 0, 0, 874, 875, 5, 105, 0, 0, 875, 876, 5, 111, 0, 0, 876, 877, 5, 110, 0, 0, 877, 206, 1, 0, 0, 0, 878, 879, 5, 106, 0, 0, 879, 880, 5, 115, 0, 0, 880, 881, 5, 111, 0, 0, 881, 882, 5, 110, 0, 0, 882, 883, 5, 105, 0, 0, 883, 884, 5, 113, 0, 0, 884, 208, 1, 0, 0, 0, 885, 886, 5, 117, 0, 0, 886, 887, 5, 110, 0, 0, 887, 888, 5, 111, 0, 0, 888, 889, 5, 114, 0, 0, 889, 890, 5, 100, 0, 0, 890, 891, 5, 101, 0, 0, 891, 892, 5, 114, 0, 0, 892, 893, 5, 101, 0, 0, 893, 894, 5, 100, 0, 0, 894, 210, 1, 0, 0, 0, 895, 896, 5, 116, 0, 0, 896, 897, 5, 114, 0, 0, 897, 898, 5, 117, 0, 0, 898, 899, 5, 101, 0, 0, 899, 212, 1, 0, 0, 0, 900, 901, 5, 102, 0, 0, 901, 902, 5, 97, 0, 0, 902, 903, 5, 108, 0, 0, 903, 904, 5, 115, 0, 0, 904, 905, 5, 101, 0, 0, 905, 214, 1, 0, 0, 0, 906, 907, 5, 116, 0, 0, 907, 908, 5, 121, 0, 0, 908, 909, 5, 112, 0, 0, 909, 910, 5, 101, 0, 0, 910, 216, 1, 0, 0, 0, 911, 912, 5, 118, 0, 0, 912, 913, 5, 97, 0, 0, 913, 914, 5, 108, 0, 0, 914, 915, 5, 105, 0, 0, 915, 916, 5, 100, 0, 0, 916, 917, 5, 97, 0, 0, 917, 918, 5, 116, 0, 0, 918, 919, 5, 101, 0, 0, 919, 218, 1, 0, 0, 0, 920, 921, 5, 97, 0, 0, 921, 922, 5, 110, 0, 0, 922, 923, 5, 110, 0, 0, 923, 924, 5, 111, 0, 0, 924, 925, 5, 116, 0, 0, 925, 926, 5, 97, 0, 0, 926, 927, 5, 116, 0, 0, 927, 928, 5, 101, 0, 0, 928, 220, 1, 0, 0, 0, 929, 930, 5, 100, 0, 0, 930, 931, 5, 101, 0, 0, 931, 932, 5, 99, 0, 0, 932, 933, 5, 108, 0, 0, 933, 934, 5, 97, 0, 0, 934, 935, 5, 114, 0, 0, 935, 936, 5, 101, 0, 0, 936, 222, 1, 0, 0, 0, 937, 938, 5, 99, 0, 0, 938, 939, 5, 111, 0, 0, 939, 940, 5, 110, 0, 0, 940, 941, 5, 116, 0, 0, 941, 942, 5, 101, 0, 0, 942, 943, 5, 120, 0, 0, 943, 944, 5, 116, 0, 0, 944, 224, 1, 0, 0, 0, 945, 946, 5, 105, 0, 0, 946, 947, 5, 116, 0, 0, 947, 948, 5, 101, 0, 0, 948, 949, 5, 109, 0, 0, 949, 226, 1, 0, 0, 0, 950, 951, 5, 118, 0, 0, 951, 952, 5, 97, 0, 0, 952, 953, 5, 114, 0, 0, 953, 954, 5, 105, 0, 0, 954, 955, 5, 97, 0, 0, 955, 956, 5, 98, 0, 0, 956, 957, 5, 108, 0, 0, 957, 958, 5, 101, 0, 0, 958, 228, 1, 0, 0, 0, 959, 960, 5, 105, 0, 0, 960, 961, 5, 110, 0, 0, 961, 962, 5, 115, 0, 0, 962, 963, 5, 101, 0, 0, 963, 964, 5, 114, 0, 0, 964, 965, 5, 116, 0, 0, 965, 230, 1, 0, 0, 0, 966, 967, 5, 100, 0, 0, 967, 968, 5, 101, 0, 0, 968, 969, 5, 108, 0, 0, 969, 970, 5, 101, 0, 0, 970, 971, 5, 116, 0, 0, 971, 972, 5, 101, 0, 0, 972, 232, 1, 0, 0, 0, 973, 974, 5, 114, 0, 0, 974, 975, 5, 101, 0, 0, 975, 976, 5, 110, 0, 0, 976, 977, 5, 97, 0, 0, 977, 978, 5, 109, 0, 0, 978, 979, 5, 101, 0, 0, 979, 234, 1, 0, 0, 0, 980, 981, 5, 114, 0, 0, 981, 982, 5, 101, 0, 0, 982, 983, 5, 112, 0, 0, 983, 984, 5, 108, 0, 0, 984, 985, 5, 97, 0, 0, 985, 986, 5, 99, 0, 0, 986, 987, 5, 101, 0, 0, 987, 236, 1, 0, 0, 0, 988, 989, 5, 99, 0, 0, 989, 990, 5, 111, 0, 0, 990, 991, 5, 112, 0, 0, 991, 992, 5, 121, 0, 0, 992, 238, 1, 0, 0, 0, 993, 994, 5, 109, 0, 0, 994, 995, 5, 111, 0, 0, 995, 996, 5, 100, 0, 0, 996, 997, 5, 105, 0, 0, 997, 998, 5, 102, 0, 0, 998, 999, 5, 121, 0, 0, 999, 240, 1, 0, 0, 0, 1000, 1001, 5, 97, 0, 0, 1001, 1002, 5, 112, 0, 0, 1002, 1003, 5, 112, 0, 0, 1003, 1004, 5, 101, 0, 0, 1004, 1005, 5, 110, 0, 0, 1005, 1006, 5, 100, 0, 0, 1006, 242, 1, 0, 0, 0, 1007, 1008, 5, 105, 0, 0, 1008, 1009, 5, 110, 0, 0, 1009, 1010, 5, 116, 0, 0, 1010, 1011, 5, 111, 0, 0, 1011, 244, 1, 0, 0, 0, 1012, 1013, 5, 118, 0, 0, 1013, 1014, 5, 97, 0, 0, 1014, 1015, 5, 108, 0, 0, 1015, 1016, 5, 117, 0, 0, 1016, 1017, 5, 101, 0, 0, 1017, 246, 1, 0, 0, 0, 1018, 1019, 5, 106, 0, 0, 1019, 1020, 5, 115, 0, 0, 1020, 1021, 5, 111, 0, 0, 1021, 1022, 5, 110, 0, 0, 1022, 248, 1, 0, 0, 0, 1023, 1024, 5, 119, 0, 0, 1024, 1025, 5, 105, 0, 0, 1025, 1026, 5, 116, 0, 0, 1026, 1027, 5, 104, 0, 0, 1027, 250, 1, 0, 0, 0, 1028, 1029, 5, 112, 0, 0, 1029, 1030, 5, 111, 0, 0, 1030, 1031, 5, 115, 0, 0, 1031, 1032, 5, 105, 0, 0, 1032, 1033, 5, 116, 0, 0, 1033, 1034, 5, 105, 0, 0, 1034, 1035, 5, 111, 0, 0, 1035, 1036, 5, 110, 0, 0, 1036, 252, 1, 0, 0, 0, 1037, 1038, 5, 98, 0, 0, 1038, 1039, 5, 114, 0, 0, 1039, 1040, 5, 101, 0, 0, 1040, 1041, 5, 97, 0, 0, 1041, 1042, 5, 107, 0, 0, 1042, 254, 1, 0, 0, 0, 1043, 1044, 5, 108, 0, 0, 1044, 1045, 5, 111, 0, 0, 1045, 1046, 5, 111, 0, 0, 1046, 1047, 5, 112, 0, 0, 1047, 256, 1, 0, 0, 0, 1048, 1049, 5, 99, 0, 0, 1049, 1050, 5, 111, 0, 0, 1050, 1051, 5, 110, 0, 0, 1051, 1052, 5, 116, 0, 0, 1052, 1053, 5, 105, 0, 0, 1053, 1054, 5, 110, 0, 0, 1054, 1055, 5, 117, 0, 0, 1055, 1056, 5, 101, 0, 0, 1056, 258, 1, 0, 0, 0, 1057, 1058, 5, 101, 0, 0, 1058, 1059, 5, 120, 0, 0, 1059, 1060, 5, 105, 0, 0, 1060, 1061, 5, 116, 0, 0, 1061, 260, 1, 0, 0, 0, 1062, 1063, 5, 114, 0, 0, 1063, 1064, 5, 101, 0, 0, 1064, 1065, 5, 116, 0, 0, 1065, 1066, 5, 117, 0, 0, 1066, 1067, 5, 114, 0, 0, 1067, 1068, 5, 110, 0, 0, 1068, 1069, 5, 105, 0, 0, 1069, 1070, 5, 110, 0, 0, 1070, 1071, 5, 103, 0, 0, 1071, 262, 1, 0, 0, 0, 1072, 1073, 5, 119, 0, 0, 1073, 1074, 5, 104, 0, 0, 1074, 1075, 5, 105, 0, 0, 1075, 1076, 5, 108, 0, 0, 1076, 1077, 5, 101, 0, 0, 1077, 264, 1, 0, 0, 0, 1078, 1083, 5, 34, 0, 0, 1079, 1082, 3, 267, 133, 0, 1080, 1082, 8, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1081, 1080, 1, 0, 0, 0, 1082, 1085, 1, 0, 0, 0, 1083, 1081, 1, 0, 0, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1086, 1, 0, 0, 0, 1085, 1083, 1, 0, 0, 0, 1086, 1087, 5, 34, 0, 0, 1087, 266, 1, 0, 0, 0, 1088, 1091, 5, 92, 0, 0, 1089, 1092, 7, 1, 0, 0, 1090, 1092, 3, 269, 134, 0, 1091, 1089, 1, 0, 0, 0, 1091, 1090, 1, 0, 0, 0, 1092, 268, 1, 0, 0, 0, 1093, 1094, 5, 117, 0, 0, 1094, 1095, 3, 271, 135, 0, 1095, 1096, 3, 271, 135, 0, 1096, 1097, 3, 271, 135, 0, 1097, 1098, 3, 271, 135, 0, 1098, 270, 1, 0, 0, 0, 1099, 1100, 7, 2, 0, 0, 1100, 272, 1, 0, 0, 0, 1101, 1102, 5, 63, 0, 0, 1102, 274, 1, 0, 0, 0, 1103, 1104, 5, 110, 0, 0, 1104, 1105, 5, 117, 0, 0, 1105, 1106, 5, 108, 0, 0, 1106, 1107, 5, 108, 0, 0, 1107, 276, 1, 0, 0, 0, 1108, 1109, 3, 279, 139, 0, 1109, 278, 1, 0, 0, 0, 1110, 1114, 3, 281, 140, 0, 1111, 1114, 3, 283, 141, 0, 1112, 1114, 3, 285, 142, 0, 1113, 1110, 1, 0, 0, 0, 1113, 1111, 1, 0, 0, 0, 1113, 1112, 1, 0, 0, 0, 1114, 280, 1, 0, 0, 0, 1115, 1116, 3, 287, 143, 0, 1116, 282, 1, 0, 0, 0, 1117, 1118, 5, 46, 0, 0, 1118, 1128, 3, 287, 143, 0, 1119, 1120, 3, 287, 143, 0, 1120, 1124, 5, 46, 0, 0, 1121, 1123, 7, 3, 0, 0, 1122, 1121, 1, 0, 0, 0, 1123, 1126, 1, 0, 0, 0, 1124, 1122, 1, 0, 0, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1128, 1, 0, 0, 0, 1126, 1124, 1, 0, 0, 0, 1127, 1117, 1, 0, 0, 0, 1127, 1119, 1, 0, 0, 0, 1128, 284, 1, 0, 0, 0, 1129, 1130, 5, 46, 0, 0, 1130, 1142, 3, 287, 143, 0, 1131, 1139, 3, 287, 143, 0, 1132, 1136, 5, 46, 0, 0, 1133, 1135, 7, 3, 0, 0, 1134, 1133, 1, 0, 0, 0, 1135, 1138, 1, 0, 0, 0, 1136, 1134, 1, 0, 0, 0, 1136, 1137, 1, 0, 0, 0, 1137, 1140, 1, 0, 0, 0, 1138, 1136, 1, 0, 0, 0, 1139, 1132, 1, 0, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1142, 1, 0, 0, 0, 1141, 1129, 1, 0, 0, 0, 1141, 1131, 1, 0, 0, 0, 1142, 1143, 1, 0, 0, 0, 1143, 1145, 7, 4, 0, 0, 1144, 1146, 7, 5, 0, 0, 1145, 1144, 1, 0, 0, 0, 1145, 1146, 1, 0, 0, 0, 1146, 1147, 1, 0, 0, 0, 1147, 1148, 3, 287, 143, 0, 1148, 286, 1, 0, 0, 0, 1149, 1151, 7, 3, 0, 0, 1150, 1149, 1, 0, 0, 0, 1151, 1152, 1, 0, 0, 0, 1152, 1150, 1, 0, 0, 0, 1152, 1153, 1, 0, 0, 0, 1153, 288, 1, 0, 0, 0, 1154, 1155, 7, 6, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 6, 144, 0, 0, 1157, 290, 1, 0, 0, 0, 1158, 1162, 3, 293, 146, 0, 1159, 1161, 3, 295, 147, 0, 1160, 1159, 1, 0, 0, 0, 1161, 1164, 1, 0, 0, 0, 1162, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 292, 1, 0, 0, 0, 1164, 1162, 1, 0, 0, 0, 1165, 1167, 7, 7, 0, 0, 1166, 1165, 1, 0, 0, 0, 1167, 294, 1, 0, 0, 0, 1168, 1171, 3, 293, 146, 0, 1169, 1171, 7, 8, 0, 0, 1170, 1168, 1, 0, 0, 0, 1170, 1169, 1, 0, 0, 0, 1171, 296, 1, 0, 0, 0, 1172, 1173, 5, 40, 0, 0, 1173, 1182, 5, 58, 0, 0, 1174, 1181, 3, 297, 148, 0, 1175, 1176, 5, 40, 0, 0, 1176, 1181, 8, 9, 0, 0, 1177, 1178, 5, 58, 0, 0, 1178, 1181, 8, 10, 0, 0, 1179, 1181, 8, 11, 0, 0, 1180, 1174, 1, 0, 0, 0, 1180, 1175, 1, 0, 0, 0, 1180, 1177, 1, 0, 0, 0, 1180, 1179, 1, 0, 0, 0, 1181, 1184, 1, 0, 0, 0, 1182, 1180, 1, 0, 0, 0, 1182, 1183, 1, 0, 0, 0, 1183, 1186, 1, 0, 0, 0, 1184, 1182, 1, 0, 0, 0, 1185, 1187, 5, 58, 0, 0, 1186, 1185, 1, 0, 0, 0, 1187, 1188, 1, 0, 0, 0, 1188, 1186, 1, 0, 0, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1191, 5, 41, 0, 0, 1191, 1192, 1, 0, 0, 0, 1192, 1193, 6, 148, 0, 0, 1193, 298, 1, 0, 0, 0, 1194, 1195, 8, 12, 0, 0, 1195, 300, 1, 0, 0, 0, 18, 0, 1081, 1083, 1091, 1113, 1124, 1127, 1136, 1139, 1141, 1145, 1152, 1162, 1166, 1170, 1180, 1182, 1188, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 145, 1207, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 5, 133, 1093, 8, 133, 10, 133, 12, 133, 1096, 9, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 3, 134, 1103, 8, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 3, 140, 1125, 8, 140, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 5, 142, 1134, 8, 142, 10, 142, 12, 142, 1137, 9, 142, 3, 142, 1139, 8, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 5, 143, 1146, 8, 143, 10, 143, 12, 143, 1149, 9, 143, 3, 143, 1151, 8, 143, 3, 143, 1153, 8, 143, 1, 143, 1, 143, 3, 143, 1157, 8, 143, 1, 143, 1, 143, 1, 144, 4, 144, 1162, 8, 144, 11, 144, 12, 144, 1163, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 5, 146, 1172, 8, 146, 10, 146, 12, 146, 1175, 9, 146, 1, 147, 3, 147, 1178, 8, 147, 1, 148, 1, 148, 3, 148, 1182, 8, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 5, 149, 1192, 8, 149, 10, 149, 12, 149, 1195, 9, 149, 1, 149, 4, 149, 1198, 8, 149, 11, 149, 12, 149, 1199, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 0, 0, 151, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 0, 271, 0, 273, 0, 275, 135, 277, 136, 279, 137, 281, 138, 283, 139, 285, 140, 287, 141, 289, 0, 291, 142, 293, 143, 295, 0, 297, 0, 299, 144, 301, 145, 1, 0, 13, 2, 0, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 9, 10, 13, 13, 32, 32, 14, 0, 65, 90, 95, 95, 97, 122, 192, 214, 216, 246, 248, 767, 880, 893, 895, 8191, 8204, 8205, 8304, 8591, 11264, 12271, 12289, 55295, 63744, 64975, 65008, 65533, 5, 0, 45, 45, 48, 57, 183, 183, 768, 879, 8255, 8256, 1, 0, 58, 58, 1, 0, 41, 41, 2, 0, 40, 40, 58, 58, 5, 0, 34, 34, 38, 39, 60, 60, 123, 123, 125, 125, 1219, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 1, 303, 1, 0, 0, 0, 3, 305, 1, 0, 0, 0, 5, 312, 1, 0, 0, 0, 7, 322, 1, 0, 0, 0, 9, 324, 1, 0, 0, 0, 11, 326, 1, 0, 0, 0, 13, 329, 1, 0, 0, 0, 15, 331, 1, 0, 0, 0, 17, 333, 1, 0, 0, 0, 19, 335, 1, 0, 0, 0, 21, 337, 1, 0, 0, 0, 23, 339, 1, 0, 0, 0, 25, 341, 1, 0, 0, 0, 27, 343, 1, 0, 0, 0, 29, 345, 1, 0, 0, 0, 31, 354, 1, 0, 0, 0, 33, 362, 1, 0, 0, 0, 35, 377, 1, 0, 0, 0, 37, 379, 1, 0, 0, 0, 39, 397, 1, 0, 0, 0, 41, 416, 1, 0, 0, 0, 43, 425, 1, 0, 0, 0, 45, 436, 1, 0, 0, 0, 47, 440, 1, 0, 0, 0, 49, 448, 1, 0, 0, 0, 51, 458, 1, 0, 0, 0, 53, 469, 1, 0, 0, 0, 55, 475, 1, 0, 0, 0, 57, 493, 1, 0, 0, 0, 59, 500, 1, 0, 0, 0, 61, 509, 1, 0, 0, 0, 63, 518, 1, 0, 0, 0, 65, 525, 1, 0, 0, 0, 67, 533, 1, 0, 0, 0, 69, 541, 1, 0, 0, 0, 71, 548, 1, 0, 0, 0, 73, 551, 1, 0, 0, 0, 75, 554, 1, 0, 0, 0, 77, 557, 1, 0, 0, 0, 79, 560, 1, 0, 0, 0, 81, 563, 1, 0, 0, 0, 83, 566, 1, 0, 0, 0, 85, 569, 1, 0, 0, 0, 87, 571, 1, 0, 0, 0, 89, 574, 1, 0, 0, 0, 91, 576, 1, 0, 0, 0, 93, 579, 1, 0, 0, 0, 95, 582, 1, 0, 0, 0, 97, 584, 1, 0, 0, 0, 99, 586, 1, 0, 0, 0, 101, 590, 1, 0, 0, 0, 103, 595, 1, 0, 0, 0, 105, 599, 1, 0, 0, 0, 107, 601, 1, 0, 0, 0, 109, 603, 1, 0, 0, 0, 111, 605, 1, 0, 0, 0, 113, 607, 1, 0, 0, 0, 115, 610, 1, 0, 0, 0, 117, 612, 1, 0, 0, 0, 119, 615, 1, 0, 0, 0, 121, 618, 1, 0, 0, 0, 123, 622, 1, 0, 0, 0, 125, 626, 1, 0, 0, 0, 127, 632, 1, 0, 0, 0, 129, 638, 1, 0, 0, 0, 131, 641, 1, 0, 0, 0, 133, 647, 1, 0, 0, 0, 135, 654, 1, 0, 0, 0, 137, 657, 1, 0, 0, 0, 139, 660, 1, 0, 0, 0, 141, 663, 1, 0, 0, 0, 143, 666, 1, 0, 0, 0, 145, 675, 1, 0, 0, 0, 147, 681, 1, 0, 0, 0, 149, 687, 1, 0, 0, 0, 151, 694, 1, 0, 0, 0, 153, 704, 1, 0, 0, 0, 155, 715, 1, 0, 0, 0, 157, 720, 1, 0, 0, 0, 159, 726, 1, 0, 0, 0, 161, 736, 1, 0, 0, 0, 163, 746, 1, 0, 0, 0, 165, 755, 1, 0, 0, 0, 167, 761, 1, 0, 0, 0, 169, 768, 1, 0, 0, 0, 171, 773, 1, 0, 0, 0, 173, 777, 1, 0, 0, 0, 175, 783, 1, 0, 0, 0, 177, 791, 1, 0, 0, 0, 179, 796, 1, 0, 0, 0, 181, 801, 1, 0, 0, 0, 183, 812, 1, 0, 0, 0, 185, 815, 1, 0, 0, 0, 187, 819, 1, 0, 0, 0, 189, 823, 1, 0, 0, 0, 191, 826, 1, 0, 0, 0, 193, 835, 1, 0, 0, 0, 195, 838, 1, 0, 0, 0, 197, 849, 1, 0, 0, 0, 199, 852, 1, 0, 0, 0, 201, 858, 1, 0, 0, 0, 203, 863, 1, 0, 0, 0, 205, 872, 1, 0, 0, 0, 207, 880, 1, 0, 0, 0, 209, 887, 1, 0, 0, 0, 211, 897, 1, 0, 0, 0, 213, 902, 1, 0, 0, 0, 215, 908, 1, 0, 0, 0, 217, 913, 1, 0, 0, 0, 219, 922, 1, 0, 0, 0, 221, 931, 1, 0, 0, 0, 223, 939, 1, 0, 0, 0, 225, 947, 1, 0, 0, 0, 227, 952, 1, 0, 0, 0, 229, 961, 1, 0, 0, 0, 231, 968, 1, 0, 0, 0, 233, 975, 1, 0, 0, 0, 235, 982, 1, 0, 0, 0, 237, 990, 1, 0, 0, 0, 239, 995, 1, 0, 0, 0, 241, 1002, 1, 0, 0, 0, 243, 1009, 1, 0, 0, 0, 245, 1014, 1, 0, 0, 0, 247, 1020, 1, 0, 0, 0, 249, 1025, 1, 0, 0, 0, 251, 1034, 1, 0, 0, 0, 253, 1039, 1, 0, 0, 0, 255, 1048, 1, 0, 0, 0, 257, 1054, 1, 0, 0, 0, 259, 1059, 1, 0, 0, 0, 261, 1068, 1, 0, 0, 0, 263, 1073, 1, 0, 0, 0, 265, 1083, 1, 0, 0, 0, 267, 1089, 1, 0, 0, 0, 269, 1099, 1, 0, 0, 0, 271, 1104, 1, 0, 0, 0, 273, 1110, 1, 0, 0, 0, 275, 1112, 1, 0, 0, 0, 277, 1114, 1, 0, 0, 0, 279, 1119, 1, 0, 0, 0, 281, 1124, 1, 0, 0, 0, 283, 1126, 1, 0, 0, 0, 285, 1138, 1, 0, 0, 0, 287, 1152, 1, 0, 0, 0, 289, 1161, 1, 0, 0, 0, 291, 1165, 1, 0, 0, 0, 293, 1169, 1, 0, 0, 0, 295, 1177, 1, 0, 0, 0, 297, 1181, 1, 0, 0, 0, 299, 1183, 1, 0, 0, 0, 301, 1205, 1, 0, 0, 0, 303, 304, 5, 59, 0, 0, 304, 2, 1, 0, 0, 0, 305, 306, 5, 109, 0, 0, 306, 307, 5, 111, 0, 0, 307, 308, 5, 100, 0, 0, 308, 309, 5, 117, 0, 0, 309, 310, 5, 108, 0, 0, 310, 311, 5, 101, 0, 0, 311, 4, 1, 0, 0, 0, 312, 313, 5, 110, 0, 0, 313, 314, 5, 97, 0, 0, 314, 315, 5, 109, 0, 0, 315, 316, 5, 101, 0, 0, 316, 317, 5, 115, 0, 0, 317, 318, 5, 112, 0, 0, 318, 319, 5, 97, 0, 0, 319, 320, 5, 99, 0, 0, 320, 321, 5, 101, 0, 0, 321, 6, 1, 0, 0, 0, 322, 323, 5, 61, 0, 0, 323, 8, 1, 0, 0, 0, 324, 325, 5, 36, 0, 0, 325, 10, 1, 0, 0, 0, 326, 327, 5, 58, 0, 0, 327, 328, 5, 61, 0, 0, 328, 12, 1, 0, 0, 0, 329, 330, 5, 123, 0, 0, 330, 14, 1, 0, 0, 0, 331, 332, 5, 125, 0, 0, 332, 16, 1, 0, 0, 0, 333, 334, 5, 40, 0, 0, 334, 18, 1, 0, 0, 0, 335, 336, 5, 41, 0, 0, 336, 20, 1, 0, 0, 0, 337, 338, 5, 42, 0, 0, 338, 22, 1, 0, 0, 0, 339, 340, 5, 124, 0, 0, 340, 24, 1, 0, 0, 0, 341, 342, 5, 37, 0, 0, 342, 26, 1, 0, 0, 0, 343, 344, 5, 44, 0, 0, 344, 28, 1, 0, 0, 0, 345, 346, 5, 111, 0, 0, 346, 347, 5, 114, 0, 0, 347, 348, 5, 100, 0, 0, 348, 349, 5, 101, 0, 0, 349, 350, 5, 114, 0, 0, 350, 351, 5, 105, 0, 0, 351, 352, 5, 110, 0, 0, 352, 353, 5, 103, 0, 0, 353, 30, 1, 0, 0, 0, 354, 355, 5, 111, 0, 0, 355, 356, 5, 114, 0, 0, 356, 357, 5, 100, 0, 0, 357, 358, 5, 101, 0, 0, 358, 359, 5, 114, 0, 0, 359, 360, 5, 101, 0, 0, 360, 361, 5, 100, 0, 0, 361, 32, 1, 0, 0, 0, 362, 363, 5, 100, 0, 0, 363, 364, 5, 101, 0, 0, 364, 365, 5, 99, 0, 0, 365, 366, 5, 105, 0, 0, 366, 367, 5, 109, 0, 0, 367, 368, 5, 97, 0, 0, 368, 369, 5, 108, 0, 0, 369, 370, 5, 45, 0, 0, 370, 371, 5, 102, 0, 0, 371, 372, 5, 111, 0, 0, 372, 373, 5, 114, 0, 0, 373, 374, 5, 109, 0, 0, 374, 375, 5, 97, 0, 0, 375, 376, 5, 116, 0, 0, 376, 34, 1, 0, 0, 0, 377, 378, 5, 58, 0, 0, 378, 36, 1, 0, 0, 0, 379, 380, 5, 100, 0, 0, 380, 381, 5, 101, 0, 0, 381, 382, 5, 99, 0, 0, 382, 383, 5, 105, 0, 0, 383, 384, 5, 109, 0, 0, 384, 385, 5, 97, 0, 0, 385, 386, 5, 108, 0, 0, 386, 387, 5, 45, 0, 0, 387, 388, 5, 115, 0, 0, 388, 389, 5, 101, 0, 0, 389, 390, 5, 112, 0, 0, 390, 391, 5, 97, 0, 0, 391, 392, 5, 114, 0, 0, 392, 393, 5, 97, 0, 0, 393, 394, 5, 116, 0, 0, 394, 395, 5, 111, 0, 0, 395, 396, 5, 114, 0, 0, 396, 38, 1, 0, 0, 0, 397, 398, 5, 103, 0, 0, 398, 399, 5, 114, 0, 0, 399, 400, 5, 111, 0, 0, 400, 401, 5, 117, 0, 0, 401, 402, 5, 112, 0, 0, 402, 403, 5, 105, 0, 0, 403, 404, 5, 110, 0, 0, 404, 405, 5, 103, 0, 0, 405, 406, 5, 45, 0, 0, 406, 407, 5, 115, 0, 0, 407, 408, 5, 101, 0, 0, 408, 409, 5, 112, 0, 0, 409, 410, 5, 97, 0, 0, 410, 411, 5, 114, 0, 0, 411, 412, 5, 97, 0, 0, 412, 413, 5, 116, 0, 0, 413, 414, 5, 111, 0, 0, 414, 415, 5, 114, 0, 0, 415, 40, 1, 0, 0, 0, 416, 417, 5, 105, 0, 0, 417, 418, 5, 110, 0, 0, 418, 419, 5, 102, 0, 0, 419, 420, 5, 105, 0, 0, 420, 421, 5, 110, 0, 0, 421, 422, 5, 105, 0, 0, 422, 423, 5, 116, 0, 0, 423, 424, 5, 121, 0, 0, 424, 42, 1, 0, 0, 0, 425, 426, 5, 109, 0, 0, 426, 427, 5, 105, 0, 0, 427, 428, 5, 110, 0, 0, 428, 429, 5, 117, 0, 0, 429, 430, 5, 115, 0, 0, 430, 431, 5, 45, 0, 0, 431, 432, 5, 115, 0, 0, 432, 433, 5, 105, 0, 0, 433, 434, 5, 103, 0, 0, 434, 435, 5, 110, 0, 0, 435, 44, 1, 0, 0, 0, 436, 437, 5, 78, 0, 0, 437, 438, 5, 97, 0, 0, 438, 439, 5, 78, 0, 0, 439, 46, 1, 0, 0, 0, 440, 441, 5, 112, 0, 0, 441, 442, 5, 101, 0, 0, 442, 443, 5, 114, 0, 0, 443, 444, 5, 99, 0, 0, 444, 445, 5, 101, 0, 0, 445, 446, 5, 110, 0, 0, 446, 447, 5, 116, 0, 0, 447, 48, 1, 0, 0, 0, 448, 449, 5, 112, 0, 0, 449, 450, 5, 101, 0, 0, 450, 451, 5, 114, 0, 0, 451, 452, 5, 45, 0, 0, 452, 453, 5, 109, 0, 0, 453, 454, 5, 105, 0, 0, 454, 455, 5, 108, 0, 0, 455, 456, 5, 108, 0, 0, 456, 457, 5, 101, 0, 0, 457, 50, 1, 0, 0, 0, 458, 459, 5, 122, 0, 0, 459, 460, 5, 101, 0, 0, 460, 461, 5, 114, 0, 0, 461, 462, 5, 111, 0, 0, 462, 463, 5, 45, 0, 0, 463, 464, 5, 100, 0, 0, 464, 465, 5, 105, 0, 0, 465, 466, 5, 103, 0, 0, 466, 467, 5, 105, 0, 0, 467, 468, 5, 116, 0, 0, 468, 52, 1, 0, 0, 0, 469, 470, 5, 100, 0, 0, 470, 471, 5, 105, 0, 0, 471, 472, 5, 103, 0, 0, 472, 473, 5, 105, 0, 0, 473, 474, 5, 116, 0, 0, 474, 54, 1, 0, 0, 0, 475, 476, 5, 112, 0, 0, 476, 477, 5, 97, 0, 0, 477, 478, 5, 116, 0, 0, 478, 479, 5, 116, 0, 0, 479, 480, 5, 101, 0, 0, 480, 481, 5, 114, 0, 0, 481, 482, 5, 110, 0, 0, 482, 483, 5, 45, 0, 0, 483, 484, 5, 115, 0, 0, 484, 485, 5, 101, 0, 0, 485, 486, 5, 112, 0, 0, 486, 487, 5, 97, 0, 0, 487, 488, 5, 114, 0, 0, 488, 489, 5, 97, 0, 0, 489, 490, 5, 116, 0, 0, 490, 491, 5, 111, 0, 0, 491, 492, 5, 114, 0, 0, 492, 56, 1, 0, 0, 0, 493, 494, 5, 105, 0, 0, 494, 495, 5, 109, 0, 0, 495, 496, 5, 112, 0, 0, 496, 497, 5, 111, 0, 0, 497, 498, 5, 114, 0, 0, 498, 499, 5, 116, 0, 0, 499, 58, 1, 0, 0, 0, 500, 501, 5, 101, 0, 0, 501, 502, 5, 120, 0, 0, 502, 503, 5, 116, 0, 0, 503, 504, 5, 101, 0, 0, 504, 505, 5, 114, 0, 0, 505, 506, 5, 110, 0, 0, 506, 507, 5, 97, 0, 0, 507, 508, 5, 108, 0, 0, 508, 60, 1, 0, 0, 0, 509, 510, 5, 102, 0, 0, 510, 511, 5, 117, 0, 0, 511, 512, 5, 110, 0, 0, 512, 513, 5, 99, 0, 0, 513, 514, 5, 116, 0, 0, 514, 515, 5, 105, 0, 0, 515, 516, 5, 111, 0, 0, 516, 517, 5, 110, 0, 0, 517, 62, 1, 0, 0, 0, 518, 519, 5, 106, 0, 0, 519, 520, 5, 115, 0, 0, 520, 521, 5, 111, 0, 0, 521, 522, 5, 117, 0, 0, 522, 523, 5, 110, 0, 0, 523, 524, 5, 100, 0, 0, 524, 64, 1, 0, 0, 0, 525, 526, 5, 99, 0, 0, 526, 527, 5, 111, 0, 0, 527, 528, 5, 109, 0, 0, 528, 529, 5, 112, 0, 0, 529, 530, 5, 97, 0, 0, 530, 531, 5, 99, 0, 0, 531, 532, 5, 116, 0, 0, 532, 66, 1, 0, 0, 0, 533, 534, 5, 118, 0, 0, 534, 535, 5, 101, 0, 0, 535, 536, 5, 114, 0, 0, 536, 537, 5, 98, 0, 0, 537, 538, 5, 111, 0, 0, 538, 539, 5, 115, 0, 0, 539, 540, 5, 101, 0, 0, 540, 68, 1, 0, 0, 0, 541, 542, 5, 115, 0, 0, 542, 543, 5, 99, 0, 0, 543, 544, 5, 104, 0, 0, 544, 545, 5, 101, 0, 0, 545, 546, 5, 109, 0, 0, 546, 547, 5, 97, 0, 0, 547, 70, 1, 0, 0, 0, 548, 549, 5, 101, 0, 0, 549, 550, 5, 113, 0, 0, 550, 72, 1, 0, 0, 0, 551, 552, 5, 110, 0, 0, 552, 553, 5, 101, 0, 0, 553, 74, 1, 0, 0, 0, 554, 555, 5, 108, 0, 0, 555, 556, 5, 116, 0, 0, 556, 76, 1, 0, 0, 0, 557, 558, 5, 108, 0, 0, 558, 559, 5, 101, 0, 0, 559, 78, 1, 0, 0, 0, 560, 561, 5, 103, 0, 0, 561, 562, 5, 116, 0, 0, 562, 80, 1, 0, 0, 0, 563, 564, 5, 103, 0, 0, 564, 565, 5, 101, 0, 0, 565, 82, 1, 0, 0, 0, 566, 567, 5, 33, 0, 0, 567, 568, 5, 61, 0, 0, 568, 84, 1, 0, 0, 0, 569, 570, 5, 60, 0, 0, 570, 86, 1, 0, 0, 0, 571, 572, 5, 60, 0, 0, 572, 573, 5, 61, 0, 0, 573, 88, 1, 0, 0, 0, 574, 575, 5, 62, 0, 0, 575, 90, 1, 0, 0, 0, 576, 577, 5, 62, 0, 0, 577, 578, 5, 61, 0, 0, 578, 92, 1, 0, 0, 0, 579, 580, 5, 124, 0, 0, 580, 581, 5, 124, 0, 0, 581, 94, 1, 0, 0, 0, 582, 583, 5, 43, 0, 0, 583, 96, 1, 0, 0, 0, 584, 585, 5, 45, 0, 0, 585, 98, 1, 0, 0, 0, 586, 587, 5, 100, 0, 0, 587, 588, 5, 105, 0, 0, 588, 589, 5, 118, 0, 0, 589, 100, 1, 0, 0, 0, 590, 591, 5, 105, 0, 0, 591, 592, 5, 100, 0, 0, 592, 593, 5, 105, 0, 0, 593, 594, 5, 118, 0, 0, 594, 102, 1, 0, 0, 0, 595, 596, 5, 109, 0, 0, 596, 597, 5, 111, 0, 0, 597, 598, 5, 100, 0, 0, 598, 104, 1, 0, 0, 0, 599, 600, 5, 33, 0, 0, 600, 106, 1, 0, 0, 0, 601, 602, 5, 91, 0, 0, 602, 108, 1, 0, 0, 0, 603, 604, 5, 93, 0, 0, 604, 110, 1, 0, 0, 0, 605, 606, 5, 46, 0, 0, 606, 112, 1, 0, 0, 0, 607, 608, 5, 36, 0, 0, 608, 609, 5, 36, 0, 0, 609, 114, 1, 0, 0, 0, 610, 611, 5, 35, 0, 0, 611, 116, 1, 0, 0, 0, 612, 613, 5, 123, 0, 0, 613, 614, 5, 124, 0, 0, 614, 118, 1, 0, 0, 0, 615, 616, 5, 124, 0, 0, 616, 617, 5, 125, 0, 0, 617, 120, 1, 0, 0, 0, 618, 619, 5, 102, 0, 0, 619, 620, 5, 111, 0, 0, 620, 621, 5, 114, 0, 0, 621, 122, 1, 0, 0, 0, 622, 623, 5, 108, 0, 0, 623, 624, 5, 101, 0, 0, 624, 625, 5, 116, 0, 0, 625, 124, 1, 0, 0, 0, 626, 627, 5, 119, 0, 0, 627, 628, 5, 104, 0, 0, 628, 629, 5, 101, 0, 0, 629, 630, 5, 114, 0, 0, 630, 631, 5, 101, 0, 0, 631, 126, 1, 0, 0, 0, 632, 633, 5, 103, 0, 0, 633, 634, 5, 114, 0, 0, 634, 635, 5, 111, 0, 0, 635, 636, 5, 117, 0, 0, 636, 637, 5, 112, 0, 0, 637, 128, 1, 0, 0, 0, 638, 639, 5, 98, 0, 0, 639, 640, 5, 121, 0, 0, 640, 130, 1, 0, 0, 0, 641, 642, 5, 111, 0, 0, 642, 643, 5, 114, 0, 0, 643, 644, 5, 100, 0, 0, 644, 645, 5, 101, 0, 0, 645, 646, 5, 114, 0, 0, 646, 132, 1, 0, 0, 0, 647, 648, 5, 114, 0, 0, 648, 649, 5, 101, 0, 0, 649, 650, 5, 116, 0, 0, 650, 651, 5, 117, 0, 0, 651, 652, 5, 114, 0, 0, 652, 653, 5, 110, 0, 0, 653, 134, 1, 0, 0, 0, 654, 655, 5, 105, 0, 0, 655, 656, 5, 102, 0, 0, 656, 136, 1, 0, 0, 0, 657, 658, 5, 105, 0, 0, 658, 659, 5, 110, 0, 0, 659, 138, 1, 0, 0, 0, 660, 661, 5, 97, 0, 0, 661, 662, 5, 115, 0, 0, 662, 140, 1, 0, 0, 0, 663, 664, 5, 97, 0, 0, 664, 665, 5, 116, 0, 0, 665, 142, 1, 0, 0, 0, 666, 667, 5, 97, 0, 0, 667, 668, 5, 108, 0, 0, 668, 669, 5, 108, 0, 0, 669, 670, 5, 111, 0, 0, 670, 671, 5, 119, 0, 0, 671, 672, 5, 105, 0, 0, 672, 673, 5, 110, 0, 0, 673, 674, 5, 103, 0, 0, 674, 144, 1, 0, 0, 0, 675, 676, 5, 101, 0, 0, 676, 677, 5, 109, 0, 0, 677, 678, 5, 112, 0, 0, 678, 679, 5, 116, 0, 0, 679, 680, 5, 121, 0, 0, 680, 146, 1, 0, 0, 0, 681, 682, 5, 99, 0, 0, 682, 683, 5, 111, 0, 0, 683, 684, 5, 117, 0, 0, 684, 685, 5, 110, 0, 0, 685, 686, 5, 116, 0, 0, 686, 148, 1, 0, 0, 0, 687, 688, 5, 115, 0, 0, 688, 689, 5, 116, 0, 0, 689, 690, 5, 97, 0, 0, 690, 691, 5, 98, 0, 0, 691, 692, 5, 108, 0, 0, 692, 693, 5, 101, 0, 0, 693, 150, 1, 0, 0, 0, 694, 695, 5, 97, 0, 0, 695, 696, 5, 115, 0, 0, 696, 697, 5, 99, 0, 0, 697, 698, 5, 101, 0, 0, 698, 699, 5, 110, 0, 0, 699, 700, 5, 100, 0, 0, 700, 701, 5, 105, 0, 0, 701, 702, 5, 110, 0, 0, 702, 703, 5, 103, 0, 0, 703, 152, 1, 0, 0, 0, 704, 705, 5, 100, 0, 0, 705, 706, 5, 101, 0, 0, 706, 707, 5, 115, 0, 0, 707, 708, 5, 99, 0, 0, 708, 709, 5, 101, 0, 0, 709, 710, 5, 110, 0, 0, 710, 711, 5, 100, 0, 0, 711, 712, 5, 105, 0, 0, 712, 713, 5, 110, 0, 0, 713, 714, 5, 103, 0, 0, 714, 154, 1, 0, 0, 0, 715, 716, 5, 115, 0, 0, 716, 717, 5, 111, 0, 0, 717, 718, 5, 109, 0, 0, 718, 719, 5, 101, 0, 0, 719, 156, 1, 0, 0, 0, 720, 721, 5, 101, 0, 0, 721, 722, 5, 118, 0, 0, 722, 723, 5, 101, 0, 0, 723, 724, 5, 114, 0, 0, 724, 725, 5, 121, 0, 0, 725, 158, 1, 0, 0, 0, 726, 727, 5, 115, 0, 0, 727, 728, 5, 97, 0, 0, 728, 729, 5, 116, 0, 0, 729, 730, 5, 105, 0, 0, 730, 731, 5, 115, 0, 0, 731, 732, 5, 102, 0, 0, 732, 733, 5, 105, 0, 0, 733, 734, 5, 101, 0, 0, 734, 735, 5, 115, 0, 0, 735, 160, 1, 0, 0, 0, 736, 737, 5, 99, 0, 0, 737, 738, 5, 111, 0, 0, 738, 739, 5, 108, 0, 0, 739, 740, 5, 108, 0, 0, 740, 741, 5, 97, 0, 0, 741, 742, 5, 116, 0, 0, 742, 743, 5, 105, 0, 0, 743, 744, 5, 111, 0, 0, 744, 745, 5, 110, 0, 0, 745, 162, 1, 0, 0, 0, 746, 747, 5, 103, 0, 0, 747, 748, 5, 114, 0, 0, 748, 749, 5, 101, 0, 0, 749, 750, 5, 97, 0, 0, 750, 751, 5, 116, 0, 0, 751, 752, 5, 101, 0, 0, 752, 753, 5, 115, 0, 0, 753, 754, 5, 116, 0, 0, 754, 164, 1, 0, 0, 0, 755, 756, 5, 108, 0, 0, 756, 757, 5, 101, 0, 0, 757, 758, 5, 97, 0, 0, 758, 759, 5, 115, 0, 0, 759, 760, 5, 116, 0, 0, 760, 166, 1, 0, 0, 0, 761, 762, 5, 115, 0, 0, 762, 763, 5, 119, 0, 0, 763, 764, 5, 105, 0, 0, 764, 765, 5, 116, 0, 0, 765, 766, 5, 99, 0, 0, 766, 767, 5, 104, 0, 0, 767, 168, 1, 0, 0, 0, 768, 769, 5, 99, 0, 0, 769, 770, 5, 97, 0, 0, 770, 771, 5, 115, 0, 0, 771, 772, 5, 101, 0, 0, 772, 170, 1, 0, 0, 0, 773, 774, 5, 116, 0, 0, 774, 775, 5, 114, 0, 0, 775, 776, 5, 121, 0, 0, 776, 172, 1, 0, 0, 0, 777, 778, 5, 99, 0, 0, 778, 779, 5, 97, 0, 0, 779, 780, 5, 116, 0, 0, 780, 781, 5, 99, 0, 0, 781, 782, 5, 104, 0, 0, 782, 174, 1, 0, 0, 0, 783, 784, 5, 100, 0, 0, 784, 785, 5, 101, 0, 0, 785, 786, 5, 102, 0, 0, 786, 787, 5, 97, 0, 0, 787, 788, 5, 117, 0, 0, 788, 789, 5, 108, 0, 0, 789, 790, 5, 116, 0, 0, 790, 176, 1, 0, 0, 0, 791, 792, 5, 116, 0, 0, 792, 793, 5, 104, 0, 0, 793, 794, 5, 101, 0, 0, 794, 795, 5, 110, 0, 0, 795, 178, 1, 0, 0, 0, 796, 797, 5, 101, 0, 0, 797, 798, 5, 108, 0, 0, 798, 799, 5, 115, 0, 0, 799, 800, 5, 101, 0, 0, 800, 180, 1, 0, 0, 0, 801, 802, 5, 116, 0, 0, 802, 803, 5, 121, 0, 0, 803, 804, 5, 112, 0, 0, 804, 805, 5, 101, 0, 0, 805, 806, 5, 115, 0, 0, 806, 807, 5, 119, 0, 0, 807, 808, 5, 105, 0, 0, 808, 809, 5, 116, 0, 0, 809, 810, 5, 99, 0, 0, 810, 811, 5, 104, 0, 0, 811, 182, 1, 0, 0, 0, 812, 813, 5, 111, 0, 0, 813, 814, 5, 114, 0, 0, 814, 184, 1, 0, 0, 0, 815, 816, 5, 97, 0, 0, 816, 817, 5, 110, 0, 0, 817, 818, 5, 100, 0, 0, 818, 186, 1, 0, 0, 0, 819, 820, 5, 110, 0, 0, 820, 821, 5, 111, 0, 0, 821, 822, 5, 116, 0, 0, 822, 188, 1, 0, 0, 0, 823, 824, 5, 116, 0, 0, 824, 825, 5, 111, 0, 0, 825, 190, 1, 0, 0, 0, 826, 827, 5, 105, 0, 0, 827, 828, 5, 110, 0, 0, 828, 829, 5, 115, 0, 0, 829, 830, 5, 116, 0, 0, 830, 831, 5, 97, 0, 0, 831, 832, 5, 110, 0, 0, 832, 833, 5, 99, 0, 0, 833, 834, 5, 101, 0, 0, 834, 192, 1, 0, 0, 0, 835, 836, 5, 111, 0, 0, 836, 837, 5, 102, 0, 0, 837, 194, 1, 0, 0, 0, 838, 839, 5, 115, 0, 0, 839, 840, 5, 116, 0, 0, 840, 841, 5, 97, 0, 0, 841, 842, 5, 116, 0, 0, 842, 843, 5, 105, 0, 0, 843, 844, 5, 99, 0, 0, 844, 845, 5, 97, 0, 0, 845, 846, 5, 108, 0, 0, 846, 847, 5, 108, 0, 0, 847, 848, 5, 121, 0, 0, 848, 196, 1, 0, 0, 0, 849, 850, 5, 105, 0, 0, 850, 851, 5, 115, 0, 0, 851, 198, 1, 0, 0, 0, 852, 853, 5, 116, 0, 0, 853, 854, 5, 114, 0, 0, 854, 855, 5, 101, 0, 0, 855, 856, 5, 97, 0, 0, 856, 857, 5, 116, 0, 0, 857, 200, 1, 0, 0, 0, 858, 859, 5, 99, 0, 0, 859, 860, 5, 97, 0, 0, 860, 861, 5, 115, 0, 0, 861, 862, 5, 116, 0, 0, 862, 202, 1, 0, 0, 0, 863, 864, 5, 99, 0, 0, 864, 865, 5, 97, 0, 0, 865, 866, 5, 115, 0, 0, 866, 867, 5, 116, 0, 0, 867, 868, 5, 97, 0, 0, 868, 869, 5, 98, 0, 0, 869, 870, 5, 108, 0, 0, 870, 871, 5, 101, 0, 0, 871, 204, 1, 0, 0, 0, 872, 873, 5, 118, 0, 0, 873, 874, 5, 101, 0, 0, 874, 875, 5, 114, 0, 0, 875, 876, 5, 115, 0, 0, 876, 877, 5, 105, 0, 0, 877, 878, 5, 111, 0, 0, 878, 879, 5, 110, 0, 0, 879, 206, 1, 0, 0, 0, 880, 881, 5, 106, 0, 0, 881, 882, 5, 115, 0, 0, 882, 883, 5, 111, 0, 0, 883, 884, 5, 110, 0, 0, 884, 885, 5, 105, 0, 0, 885, 886, 5, 113, 0, 0, 886, 208, 1, 0, 0, 0, 887, 888, 5, 117, 0, 0, 888, 889, 5, 110, 0, 0, 889, 890, 5, 111, 0, 0, 890, 891, 5, 114, 0, 0, 891, 892, 5, 100, 0, 0, 892, 893, 5, 101, 0, 0, 893, 894, 5, 114, 0, 0, 894, 895, 5, 101, 0, 0, 895, 896, 5, 100, 0, 0, 896, 210, 1, 0, 0, 0, 897, 898, 5, 116, 0, 0, 898, 899, 5, 114, 0, 0, 899, 900, 5, 117, 0, 0, 900, 901, 5, 101, 0, 0, 901, 212, 1, 0, 0, 0, 902, 903, 5, 102, 0, 0, 903, 904, 5, 97, 0, 0, 904, 905, 5, 108, 0, 0, 905, 906, 5, 115, 0, 0, 906, 907, 5, 101, 0, 0, 907, 214, 1, 0, 0, 0, 908, 909, 5, 116, 0, 0, 909, 910, 5, 121, 0, 0, 910, 911, 5, 112, 0, 0, 911, 912, 5, 101, 0, 0, 912, 216, 1, 0, 0, 0, 913, 914, 5, 118, 0, 0, 914, 915, 5, 97, 0, 0, 915, 916, 5, 108, 0, 0, 916, 917, 5, 105, 0, 0, 917, 918, 5, 100, 0, 0, 918, 919, 5, 97, 0, 0, 919, 920, 5, 116, 0, 0, 920, 921, 5, 101, 0, 0, 921, 218, 1, 0, 0, 0, 922, 923, 5, 97, 0, 0, 923, 924, 5, 110, 0, 0, 924, 925, 5, 110, 0, 0, 925, 926, 5, 111, 0, 0, 926, 927, 5, 116, 0, 0, 927, 928, 5, 97, 0, 0, 928, 929, 5, 116, 0, 0, 929, 930, 5, 101, 0, 0, 930, 220, 1, 0, 0, 0, 931, 932, 5, 100, 0, 0, 932, 933, 5, 101, 0, 0, 933, 934, 5, 99, 0, 0, 934, 935, 5, 108, 0, 0, 935, 936, 5, 97, 0, 0, 936, 937, 5, 114, 0, 0, 937, 938, 5, 101, 0, 0, 938, 222, 1, 0, 0, 0, 939, 940, 5, 99, 0, 0, 940, 941, 5, 111, 0, 0, 941, 942, 5, 110, 0, 0, 942, 943, 5, 116, 0, 0, 943, 944, 5, 101, 0, 0, 944, 945, 5, 120, 0, 0, 945, 946, 5, 116, 0, 0, 946, 224, 1, 0, 0, 0, 947, 948, 5, 105, 0, 0, 948, 949, 5, 116, 0, 0, 949, 950, 5, 101, 0, 0, 950, 951, 5, 109, 0, 0, 951, 226, 1, 0, 0, 0, 952, 953, 5, 118, 0, 0, 953, 954, 5, 97, 0, 0, 954, 955, 5, 114, 0, 0, 955, 956, 5, 105, 0, 0, 956, 957, 5, 97, 0, 0, 957, 958, 5, 98, 0, 0, 958, 959, 5, 108, 0, 0, 959, 960, 5, 101, 0, 0, 960, 228, 1, 0, 0, 0, 961, 962, 5, 105, 0, 0, 962, 963, 5, 110, 0, 0, 963, 964, 5, 115, 0, 0, 964, 965, 5, 101, 0, 0, 965, 966, 5, 114, 0, 0, 966, 967, 5, 116, 0, 0, 967, 230, 1, 0, 0, 0, 968, 969, 5, 100, 0, 0, 969, 970, 5, 101, 0, 0, 970, 971, 5, 108, 0, 0, 971, 972, 5, 101, 0, 0, 972, 973, 5, 116, 0, 0, 973, 974, 5, 101, 0, 0, 974, 232, 1, 0, 0, 0, 975, 976, 5, 114, 0, 0, 976, 977, 5, 101, 0, 0, 977, 978, 5, 110, 0, 0, 978, 979, 5, 97, 0, 0, 979, 980, 5, 109, 0, 0, 980, 981, 5, 101, 0, 0, 981, 234, 1, 0, 0, 0, 982, 983, 5, 114, 0, 0, 983, 984, 5, 101, 0, 0, 984, 985, 5, 112, 0, 0, 985, 986, 5, 108, 0, 0, 986, 987, 5, 97, 0, 0, 987, 988, 5, 99, 0, 0, 988, 989, 5, 101, 0, 0, 989, 236, 1, 0, 0, 0, 990, 991, 5, 99, 0, 0, 991, 992, 5, 111, 0, 0, 992, 993, 5, 112, 0, 0, 993, 994, 5, 121, 0, 0, 994, 238, 1, 0, 0, 0, 995, 996, 5, 109, 0, 0, 996, 997, 5, 111, 0, 0, 997, 998, 5, 100, 0, 0, 998, 999, 5, 105, 0, 0, 999, 1000, 5, 102, 0, 0, 1000, 1001, 5, 121, 0, 0, 1001, 240, 1, 0, 0, 0, 1002, 1003, 5, 97, 0, 0, 1003, 1004, 5, 112, 0, 0, 1004, 1005, 5, 112, 0, 0, 1005, 1006, 5, 101, 0, 0, 1006, 1007, 5, 110, 0, 0, 1007, 1008, 5, 100, 0, 0, 1008, 242, 1, 0, 0, 0, 1009, 1010, 5, 105, 0, 0, 1010, 1011, 5, 110, 0, 0, 1011, 1012, 5, 116, 0, 0, 1012, 1013, 5, 111, 0, 0, 1013, 244, 1, 0, 0, 0, 1014, 1015, 5, 118, 0, 0, 1015, 1016, 5, 97, 0, 0, 1016, 1017, 5, 108, 0, 0, 1017, 1018, 5, 117, 0, 0, 1018, 1019, 5, 101, 0, 0, 1019, 246, 1, 0, 0, 0, 1020, 1021, 5, 119, 0, 0, 1021, 1022, 5, 105, 0, 0, 1022, 1023, 5, 116, 0, 0, 1023, 1024, 5, 104, 0, 0, 1024, 248, 1, 0, 0, 0, 1025, 1026, 5, 112, 0, 0, 1026, 1027, 5, 111, 0, 0, 1027, 1028, 5, 115, 0, 0, 1028, 1029, 5, 105, 0, 0, 1029, 1030, 5, 116, 0, 0, 1030, 1031, 5, 105, 0, 0, 1031, 1032, 5, 111, 0, 0, 1032, 1033, 5, 110, 0, 0, 1033, 250, 1, 0, 0, 0, 1034, 1035, 5, 106, 0, 0, 1035, 1036, 5, 115, 0, 0, 1036, 1037, 5, 111, 0, 0, 1037, 1038, 5, 110, 0, 0, 1038, 252, 1, 0, 0, 0, 1039, 1040, 5, 117, 0, 0, 1040, 1041, 5, 112, 0, 0, 1041, 1042, 5, 100, 0, 0, 1042, 1043, 5, 97, 0, 0, 1043, 1044, 5, 116, 0, 0, 1044, 1045, 5, 105, 0, 0, 1045, 1046, 5, 110, 0, 0, 1046, 1047, 5, 103, 0, 0, 1047, 254, 1, 0, 0, 0, 1048, 1049, 5, 98, 0, 0, 1049, 1050, 5, 114, 0, 0, 1050, 1051, 5, 101, 0, 0, 1051, 1052, 5, 97, 0, 0, 1052, 1053, 5, 107, 0, 0, 1053, 256, 1, 0, 0, 0, 1054, 1055, 5, 108, 0, 0, 1055, 1056, 5, 111, 0, 0, 1056, 1057, 5, 111, 0, 0, 1057, 1058, 5, 112, 0, 0, 1058, 258, 1, 0, 0, 0, 1059, 1060, 5, 99, 0, 0, 1060, 1061, 5, 111, 0, 0, 1061, 1062, 5, 110, 0, 0, 1062, 1063, 5, 116, 0, 0, 1063, 1064, 5, 105, 0, 0, 1064, 1065, 5, 110, 0, 0, 1065, 1066, 5, 117, 0, 0, 1066, 1067, 5, 101, 0, 0, 1067, 260, 1, 0, 0, 0, 1068, 1069, 5, 101, 0, 0, 1069, 1070, 5, 120, 0, 0, 1070, 1071, 5, 105, 0, 0, 1071, 1072, 5, 116, 0, 0, 1072, 262, 1, 0, 0, 0, 1073, 1074, 5, 114, 0, 0, 1074, 1075, 5, 101, 0, 0, 1075, 1076, 5, 116, 0, 0, 1076, 1077, 5, 117, 0, 0, 1077, 1078, 5, 114, 0, 0, 1078, 1079, 5, 110, 0, 0, 1079, 1080, 5, 105, 0, 0, 1080, 1081, 5, 110, 0, 0, 1081, 1082, 5, 103, 0, 0, 1082, 264, 1, 0, 0, 0, 1083, 1084, 5, 119, 0, 0, 1084, 1085, 5, 104, 0, 0, 1085, 1086, 5, 105, 0, 0, 1086, 1087, 5, 108, 0, 0, 1087, 1088, 5, 101, 0, 0, 1088, 266, 1, 0, 0, 0, 1089, 1094, 5, 34, 0, 0, 1090, 1093, 3, 269, 134, 0, 1091, 1093, 8, 0, 0, 0, 1092, 1090, 1, 0, 0, 0, 1092, 1091, 1, 0, 0, 0, 1093, 1096, 1, 0, 0, 0, 1094, 1092, 1, 0, 0, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1097, 1, 0, 0, 0, 1096, 1094, 1, 0, 0, 0, 1097, 1098, 5, 34, 0, 0, 1098, 268, 1, 0, 0, 0, 1099, 1102, 5, 92, 0, 0, 1100, 1103, 7, 1, 0, 0, 1101, 1103, 3, 271, 135, 0, 1102, 1100, 1, 0, 0, 0, 1102, 1101, 1, 0, 0, 0, 1103, 270, 1, 0, 0, 0, 1104, 1105, 5, 117, 0, 0, 1105, 1106, 3, 273, 136, 0, 1106, 1107, 3, 273, 136, 0, 1107, 1108, 3, 273, 136, 0, 1108, 1109, 3, 273, 136, 0, 1109, 272, 1, 0, 0, 0, 1110, 1111, 7, 2, 0, 0, 1111, 274, 1, 0, 0, 0, 1112, 1113, 5, 63, 0, 0, 1113, 276, 1, 0, 0, 0, 1114, 1115, 5, 110, 0, 0, 1115, 1116, 5, 117, 0, 0, 1116, 1117, 5, 108, 0, 0, 1117, 1118, 5, 108, 0, 0, 1118, 278, 1, 0, 0, 0, 1119, 1120, 3, 281, 140, 0, 1120, 280, 1, 0, 0, 0, 1121, 1125, 3, 283, 141, 0, 1122, 1125, 3, 285, 142, 0, 1123, 1125, 3, 287, 143, 0, 1124, 1121, 1, 0, 0, 0, 1124, 1122, 1, 0, 0, 0, 1124, 1123, 1, 0, 0, 0, 1125, 282, 1, 0, 0, 0, 1126, 1127, 3, 289, 144, 0, 1127, 284, 1, 0, 0, 0, 1128, 1129, 5, 46, 0, 0, 1129, 1139, 3, 289, 144, 0, 1130, 1131, 3, 289, 144, 0, 1131, 1135, 5, 46, 0, 0, 1132, 1134, 7, 3, 0, 0, 1133, 1132, 1, 0, 0, 0, 1134, 1137, 1, 0, 0, 0, 1135, 1133, 1, 0, 0, 0, 1135, 1136, 1, 0, 0, 0, 1136, 1139, 1, 0, 0, 0, 1137, 1135, 1, 0, 0, 0, 1138, 1128, 1, 0, 0, 0, 1138, 1130, 1, 0, 0, 0, 1139, 286, 1, 0, 0, 0, 1140, 1141, 5, 46, 0, 0, 1141, 1153, 3, 289, 144, 0, 1142, 1150, 3, 289, 144, 0, 1143, 1147, 5, 46, 0, 0, 1144, 1146, 7, 3, 0, 0, 1145, 1144, 1, 0, 0, 0, 1146, 1149, 1, 0, 0, 0, 1147, 1145, 1, 0, 0, 0, 1147, 1148, 1, 0, 0, 0, 1148, 1151, 1, 0, 0, 0, 1149, 1147, 1, 0, 0, 0, 1150, 1143, 1, 0, 0, 0, 1150, 1151, 1, 0, 0, 0, 1151, 1153, 1, 0, 0, 0, 1152, 1140, 1, 0, 0, 0, 1152, 1142, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1156, 7, 4, 0, 0, 1155, 1157, 7, 5, 0, 0, 1156, 1155, 1, 0, 0, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1158, 1, 0, 0, 0, 1158, 1159, 3, 289, 144, 0, 1159, 288, 1, 0, 0, 0, 1160, 1162, 7, 3, 0, 0, 1161, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1161, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 290, 1, 0, 0, 0, 1165, 1166, 7, 6, 0, 0, 1166, 1167, 1, 0, 0, 0, 1167, 1168, 6, 145, 0, 0, 1168, 292, 1, 0, 0, 0, 1169, 1173, 3, 295, 147, 0, 1170, 1172, 3, 297, 148, 0, 1171, 1170, 1, 0, 0, 0, 1172, 1175, 1, 0, 0, 0, 1173, 1171, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 294, 1, 0, 0, 0, 1175, 1173, 1, 0, 0, 0, 1176, 1178, 7, 7, 0, 0, 1177, 1176, 1, 0, 0, 0, 1178, 296, 1, 0, 0, 0, 1179, 1182, 3, 295, 147, 0, 1180, 1182, 7, 8, 0, 0, 1181, 1179, 1, 0, 0, 0, 1181, 1180, 1, 0, 0, 0, 1182, 298, 1, 0, 0, 0, 1183, 1184, 5, 40, 0, 0, 1184, 1193, 5, 58, 0, 0, 1185, 1192, 3, 299, 149, 0, 1186, 1187, 5, 40, 0, 0, 1187, 1192, 8, 9, 0, 0, 1188, 1189, 5, 58, 0, 0, 1189, 1192, 8, 10, 0, 0, 1190, 1192, 8, 11, 0, 0, 1191, 1185, 1, 0, 0, 0, 1191, 1186, 1, 0, 0, 0, 1191, 1188, 1, 0, 0, 0, 1191, 1190, 1, 0, 0, 0, 1192, 1195, 1, 0, 0, 0, 1193, 1191, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1197, 1, 0, 0, 0, 1195, 1193, 1, 0, 0, 0, 1196, 1198, 5, 58, 0, 0, 1197, 1196, 1, 0, 0, 0, 1198, 1199, 1, 0, 0, 0, 1199, 1197, 1, 0, 0, 0, 1199, 1200, 1, 0, 0, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1202, 5, 41, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 6, 149, 0, 0, 1204, 300, 1, 0, 0, 0, 1205, 1206, 8, 12, 0, 0, 1206, 302, 1, 0, 0, 0, 18, 0, 1092, 1094, 1102, 1124, 1135, 1138, 1147, 1150, 1152, 1156, 1163, 1173, 1177, 1181, 1191, 1193, 1199, 1, 0, 1, 0] \ 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 6f65df92b2..1f97d2225d 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqLexer.java +++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.java @@ -39,11 +39,11 @@ public class JsoniqLexer extends Lexer { 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; + Kappend=121, Kinto=122, Kvalue=123, Kwith=124, Kposition=125, Kjson=126, + Kupdating=127, Kbreak=128, Kloop=129, Kcontinue=130, Kexit=131, Kreturning=132, + Kwhile=133, STRING=134, ArgumentPlaceholder=135, NullLiteral=136, Literal=137, + NumericLiteral=138, IntegerLiteral=139, DecimalLiteral=140, DoubleLiteral=141, + WS=142, NCName=143, XQComment=144, ContentChar=145; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -70,9 +70,9 @@ private static String[] makeRuleNames() { "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", "ESC", "UNICODE", - "HEX", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral", + "Kinto", "Kvalue", "Kwith", "Kposition", "Kjson", "Kupdating", "Kbreak", + "Kloop", "Kcontinue", "Kexit", "Kreturning", "Kwhile", "STRING", "ESC", + "UNICODE", "HEX", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "Digits", "WS", "NCName", "NameStartChar", "NameChar", "XQComment", "ContentChar" }; @@ -98,9 +98,9 @@ private static String[] makeLiteralNames() { "'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'" + "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'with'", + "'position'", "'json'", "'updating'", "'break'", "'loop'", "'continue'", + "'exit'", "'returning'", "'while'", null, "'?'", "'null'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -119,10 +119,10 @@ private static String[] makeSymbolicNames() { "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", + "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kwith", + "Kposition", "Kjson", "Kupdating", "Kbreak", "Kloop", "Kcontinue", "Kexit", + "Kreturning", "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral", + "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "WS", "NCName", "XQComment", "ContentChar" }; } @@ -185,7 +185,7 @@ public JsoniqLexer(CharStream input) { public ATN getATN() { return _ATN; } public static final String _serializedATN = - "\u0004\u0000\u0090\u04ac\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002"+ + "\u0004\u0000\u0091\u04b7\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002"+ "\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002"+ "\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002"+ "\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002"+ @@ -222,146 +222,148 @@ public JsoniqLexer(CharStream input) { "\u0002\u008c\u0007\u008c\u0002\u008d\u0007\u008d\u0002\u008e\u0007\u008e"+ "\u0002\u008f\u0007\u008f\u0002\u0090\u0007\u0090\u0002\u0091\u0007\u0091"+ "\u0002\u0092\u0007\u0092\u0002\u0093\u0007\u0093\u0002\u0094\u0007\u0094"+ - "\u0002\u0095\u0007\u0095\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0004"+ - "\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006"+ - "\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\t\u0001\t\u0001\n\u0001"+ - "\n\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\r\u0001\r\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010"+ + "\u0002\u0095\u0007\u0095\u0002\u0096\u0007\u0096\u0001\u0000\u0001\u0000"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003"+ + "\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001"+ + "\t\u0001\t\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001"+ + "\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ - "\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0012"+ "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013"+ + "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ - "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014"+ "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ - "\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ + "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015"+ "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ - "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017"+ + "\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019"+ "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ - "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b"+ "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ - "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c"+ - "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ - "\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ - "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001"+ - " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001"+ - "!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\""+ - "\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001%\u0001"+ - "%\u0001%\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001"+ - "(\u0001)\u0001)\u0001)\u0001*\u0001*\u0001+\u0001+\u0001+\u0001,\u0001"+ - ",\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001/\u0001/\u00010\u0001"+ - "0\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u0001"+ - "3\u00013\u00013\u00013\u00014\u00014\u00015\u00015\u00016\u00016\u0001"+ - "7\u00017\u00018\u00018\u00018\u00019\u00019\u0001:\u0001:\u0001:\u0001"+ - ";\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001"+ - "=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001"+ - "?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001"+ - "A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001"+ - "C\u0001C\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001F\u0001F\u0001"+ - "F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001"+ - "H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001"+ - "I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001"+ - "K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001"+ - "L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ - "M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001N\u0001"+ - "N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001"+ - "O\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001"+ - "P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ - "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001"+ - "U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001"+ - "W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001"+ - "X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001"+ - "\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001"+ - "^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001"+ - "`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001"+ - "a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001"+ - "c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001"+ - "e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001"+ - "f\u0001f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001g\u0001"+ - "g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001"+ - "h\u0001h\u0001i\u0001i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001"+ - "j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001k\u0001l\u0001l\u0001"+ - "l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001"+ - "m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001"+ - "n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001o\u0001o\u0001"+ - "o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001p\u0001q\u0001q\u0001q\u0001"+ - "q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001"+ - "r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001s\u0001s\u0001s\u0001"+ - "t\u0001t\u0001t\u0001t\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001"+ - "u\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001v\u0001"+ - "w\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001"+ - "x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001y\u0001y\u0001z\u0001"+ - "z\u0001z\u0001z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001{\u0001{\u0001"+ - "|\u0001|\u0001|\u0001|\u0001|\u0001}\u0001}\u0001}\u0001}\u0001}\u0001"+ - "}\u0001}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001"+ - "\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001"+ - "\u0080\u0001\u0080\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001"+ - "\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001"+ - "\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001"+ - "\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001"+ - "\u0084\u0001\u0084\u0005\u0084\u043a\b\u0084\n\u0084\f\u0084\u043d\t\u0084"+ - "\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0003\u0085"+ - "\u0444\b\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086"+ - "\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0089"+ - "\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u008a\u0001\u008a"+ - "\u0001\u008b\u0001\u008b\u0001\u008b\u0003\u008b\u045a\b\u008b\u0001\u008c"+ - "\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d"+ - "\u0005\u008d\u0463\b\u008d\n\u008d\f\u008d\u0466\t\u008d\u0003\u008d\u0468"+ - "\b\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0005"+ - "\u008e\u046f\b\u008e\n\u008e\f\u008e\u0472\t\u008e\u0003\u008e\u0474\b"+ - "\u008e\u0003\u008e\u0476\b\u008e\u0001\u008e\u0001\u008e\u0003\u008e\u047a"+ - "\b\u008e\u0001\u008e\u0001\u008e\u0001\u008f\u0004\u008f\u047f\b\u008f"+ - "\u000b\u008f\f\u008f\u0480\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090"+ - "\u0001\u0091\u0001\u0091\u0005\u0091\u0489\b\u0091\n\u0091\f\u0091\u048c"+ - "\t\u0091\u0001\u0092\u0003\u0092\u048f\b\u0092\u0001\u0093\u0001\u0093"+ - "\u0003\u0093\u0493\b\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094"+ - "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0005\u0094\u049d\b\u0094"+ - "\n\u0094\f\u0094\u04a0\t\u0094\u0001\u0094\u0004\u0094\u04a3\b\u0094\u000b"+ - "\u0094\f\u0094\u04a4\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001"+ - "\u0095\u0001\u0095\u0000\u0000\u0096\u0001\u0001\u0003\u0002\u0005\u0003"+ - "\u0007\u0004\t\u0005\u000b\u0006\r\u0007\u000f\b\u0011\t\u0013\n\u0015"+ - "\u000b\u0017\f\u0019\r\u001b\u000e\u001d\u000f\u001f\u0010!\u0011#\u0012"+ - "%\u0013\'\u0014)\u0015+\u0016-\u0017/\u00181\u00193\u001a5\u001b7\u001c"+ - "9\u001d;\u001e=\u001f? A!C\"E#G$I%K&M\'O(Q)S*U+W,Y-[.]/_0a1c2e3g4i5k6"+ - "m7o8q9s:u;w}?\u007f@\u0081A\u0083B\u0085C\u0087D\u0089E\u008bF\u008d"+ - "G\u008fH\u0091I\u0093J\u0095K\u0097L\u0099M\u009bN\u009dO\u009fP\u00a1"+ - "Q\u00a3R\u00a5S\u00a7T\u00a9U\u00abV\u00adW\u00afX\u00b1Y\u00b3Z\u00b5"+ - "[\u00b7\\\u00b9]\u00bb^\u00bd_\u00bf`\u00c1a\u00c3b\u00c5c\u00c7d\u00c9"+ - "e\u00cbf\u00cdg\u00cfh\u00d1i\u00d3j\u00d5k\u00d7l\u00d9m\u00dbn\u00dd"+ - "o\u00dfp\u00e1q\u00e3r\u00e5s\u00e7t\u00e9u\u00ebv\u00edw\u00efx\u00f1"+ - "y\u00f3z\u00f5{\u00f7|\u00f9}\u00fb~\u00fd\u007f\u00ff\u0080\u0101\u0081"+ - "\u0103\u0082\u0105\u0083\u0107\u0084\u0109\u0085\u010b\u0000\u010d\u0000"+ - "\u010f\u0000\u0111\u0086\u0113\u0087\u0115\u0088\u0117\u0089\u0119\u008a"+ - "\u011b\u008b\u011d\u008c\u011f\u0000\u0121\u008d\u0123\u008e\u0125\u0000"+ - "\u0127\u0000\u0129\u008f\u012b\u0090\u0001\u0000\r\u0002\u0000\"\"\\\\"+ - "\b\u0000\"\"//\\\\bbffnnrrtt\u0003\u000009AFaf\u0001\u000009\u0002\u0000"+ - "EEee\u0002\u0000++--\u0003\u0000\t\n\r\r \u000e\u0000AZ__az\u00c0\u00d6"+ - "\u00d8\u00f6\u00f8\u02ff\u0370\u037d\u037f\u1fff\u200c\u200d\u2070\u218f"+ - "\u2c00\u2fef\u3001\u8000\ud7ff\u8000\uf900\u8000\ufdcf\u8000\ufdf0\u8000"+ - "\ufffd\u0005\u0000--09\u00b7\u00b7\u0300\u036f\u203f\u2040\u0001\u0000"+ - "::\u0001\u0000))\u0002\u0000((::\u0005\u0000\"\"&\'<<{{}}\u04b8\u0000"+ - "\u0001\u0001\u0000\u0000\u0000\u0000\u0003\u0001\u0000\u0000\u0000\u0000"+ - "\u0005\u0001\u0000\u0000\u0000\u0000\u0007\u0001\u0000\u0000\u0000\u0000"+ - "\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001\u0000\u0000\u0000\u0000\r"+ - "\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000\u0000\u0000\u0000\u0011"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ + "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001$\u0001$"+ + "\u0001$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001"+ + "\'\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001*\u0001*\u0001+\u0001"+ + "+\u0001+\u0001,\u0001,\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001"+ + "/\u0001/\u00010\u00010\u00011\u00011\u00011\u00011\u00012\u00012\u0001"+ + "2\u00012\u00012\u00013\u00013\u00013\u00013\u00014\u00014\u00015\u0001"+ + "5\u00016\u00016\u00017\u00017\u00018\u00018\u00018\u00019\u00019\u0001"+ + ":\u0001:\u0001:\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001"+ + "=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001E\u0001E\u0001"+ + "E\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001"+ + "G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001I\u0001"+ + "I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001"+ + "J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001"+ + "K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001"+ + "N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001"+ + "O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001"+ + "P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001"+ + "T\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ + "V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001"+ + "]\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001"+ + "_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001"+ + "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001"+ + "c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001"+ + "d\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001"+ + "f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001"+ + "g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001h\u0001"+ + "h\u0001h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001i\u0001i\u0001i\u0001"+ + "j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001"+ + "k\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001"+ + "m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001n\u0001"+ + "n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001"+ + "o\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001p\u0001"+ + "q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001r\u0001"+ + "r\u0001r\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001"+ + "s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001t\u0001t\u0001t\u0001t\u0001"+ + "u\u0001u\u0001u\u0001u\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001"+ + "v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0001"+ + "x\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001"+ + "y\u0001y\u0001z\u0001z\u0001z\u0001z\u0001z\u0001z\u0001{\u0001{\u0001"+ + "{\u0001{\u0001{\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001"+ + "|\u0001|\u0001}\u0001}\u0001}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f"+ + "\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080"+ + "\u0001\u0080\u0001\u0080\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081"+ + "\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082"+ + "\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083"+ + "\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083"+ + "\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0084"+ + "\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0005\u0085"+ + "\u0445\b\u0085\n\u0085\f\u0085\u0448\t\u0085\u0001\u0085\u0001\u0085\u0001"+ + "\u0086\u0001\u0086\u0001\u0086\u0003\u0086\u044f\b\u0086\u0001\u0087\u0001"+ + "\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001"+ + "\u0088\u0001\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001"+ + "\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001"+ + "\u008c\u0003\u008c\u0465\b\u008c\u0001\u008d\u0001\u008d\u0001\u008e\u0001"+ + "\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0005\u008e\u046e\b\u008e\n"+ + "\u008e\f\u008e\u0471\t\u008e\u0003\u008e\u0473\b\u008e\u0001\u008f\u0001"+ + "\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0005\u008f\u047a\b\u008f\n"+ + "\u008f\f\u008f\u047d\t\u008f\u0003\u008f\u047f\b\u008f\u0003\u008f\u0481"+ + "\b\u008f\u0001\u008f\u0001\u008f\u0003\u008f\u0485\b\u008f\u0001\u008f"+ + "\u0001\u008f\u0001\u0090\u0004\u0090\u048a\b\u0090\u000b\u0090\f\u0090"+ + "\u048b\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001"+ + "\u0092\u0005\u0092\u0494\b\u0092\n\u0092\f\u0092\u0497\t\u0092\u0001\u0093"+ + "\u0003\u0093\u049a\b\u0093\u0001\u0094\u0001\u0094\u0003\u0094\u049e\b"+ + "\u0094\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001"+ + "\u0095\u0001\u0095\u0001\u0095\u0005\u0095\u04a8\b\u0095\n\u0095\f\u0095"+ + "\u04ab\t\u0095\u0001\u0095\u0004\u0095\u04ae\b\u0095\u000b\u0095\f\u0095"+ + "\u04af\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001"+ + "\u0096\u0000\u0000\u0097\u0001\u0001\u0003\u0002\u0005\u0003\u0007\u0004"+ + "\t\u0005\u000b\u0006\r\u0007\u000f\b\u0011\t\u0013\n\u0015\u000b\u0017"+ + "\f\u0019\r\u001b\u000e\u001d\u000f\u001f\u0010!\u0011#\u0012%\u0013\'"+ + "\u0014)\u0015+\u0016-\u0017/\u00181\u00193\u001a5\u001b7\u001c9\u001d"+ + ";\u001e=\u001f? A!C\"E#G$I%K&M\'O(Q)S*U+W,Y-[.]/_0a1c2e3g4i5k6m7o8q9s"+ + ":u;w}?\u007f@\u0081A\u0083B\u0085C\u0087D\u0089E\u008bF\u008dG\u008f"+ + "H\u0091I\u0093J\u0095K\u0097L\u0099M\u009bN\u009dO\u009fP\u00a1Q\u00a3"+ + "R\u00a5S\u00a7T\u00a9U\u00abV\u00adW\u00afX\u00b1Y\u00b3Z\u00b5[\u00b7"+ + "\\\u00b9]\u00bb^\u00bd_\u00bf`\u00c1a\u00c3b\u00c5c\u00c7d\u00c9e\u00cb"+ + "f\u00cdg\u00cfh\u00d1i\u00d3j\u00d5k\u00d7l\u00d9m\u00dbn\u00ddo\u00df"+ + "p\u00e1q\u00e3r\u00e5s\u00e7t\u00e9u\u00ebv\u00edw\u00efx\u00f1y\u00f3"+ + "z\u00f5{\u00f7|\u00f9}\u00fb~\u00fd\u007f\u00ff\u0080\u0101\u0081\u0103"+ + "\u0082\u0105\u0083\u0107\u0084\u0109\u0085\u010b\u0086\u010d\u0000\u010f"+ + "\u0000\u0111\u0000\u0113\u0087\u0115\u0088\u0117\u0089\u0119\u008a\u011b"+ + "\u008b\u011d\u008c\u011f\u008d\u0121\u0000\u0123\u008e\u0125\u008f\u0127"+ + "\u0000\u0129\u0000\u012b\u0090\u012d\u0091\u0001\u0000\r\u0002\u0000\""+ + "\"\\\\\b\u0000\"\"//\\\\bbffnnrrtt\u0003\u000009AFaf\u0001\u000009\u0002"+ + "\u0000EEee\u0002\u0000++--\u0003\u0000\t\n\r\r \u000e\u0000AZ__az\u00c0"+ + "\u00d6\u00d8\u00f6\u00f8\u02ff\u0370\u037d\u037f\u1fff\u200c\u200d\u2070"+ + "\u218f\u2c00\u2fef\u3001\u8000\ud7ff\u8000\uf900\u8000\ufdcf\u8000\ufdf0"+ + "\u8000\ufffd\u0005\u0000--09\u00b7\u00b7\u0300\u036f\u203f\u2040\u0001"+ + "\u0000::\u0001\u0000))\u0002\u0000((::\u0005\u0000\"\"&\'<<{{}}\u04c3"+ + "\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0003\u0001\u0000\u0000\u0000"+ + "\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007\u0001\u0000\u0000\u0000"+ + "\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001\u0000\u0000\u0000\u0000"+ + "\r\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000\u0000\u0000\u0000\u0011"+ "\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000\u0000\u0000\u0000\u0015"+ "\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000\u0000\u0000\u0019"+ "\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000\u0000\u0000\u001d"+ @@ -421,489 +423,495 @@ public JsoniqLexer(CharStream input) { "\u0000\u00ff\u0001\u0000\u0000\u0000\u0000\u0101\u0001\u0000\u0000\u0000"+ "\u0000\u0103\u0001\u0000\u0000\u0000\u0000\u0105\u0001\u0000\u0000\u0000"+ "\u0000\u0107\u0001\u0000\u0000\u0000\u0000\u0109\u0001\u0000\u0000\u0000"+ - "\u0000\u0111\u0001\u0000\u0000\u0000\u0000\u0113\u0001\u0000\u0000\u0000"+ + "\u0000\u010b\u0001\u0000\u0000\u0000\u0000\u0113\u0001\u0000\u0000\u0000"+ "\u0000\u0115\u0001\u0000\u0000\u0000\u0000\u0117\u0001\u0000\u0000\u0000"+ "\u0000\u0119\u0001\u0000\u0000\u0000\u0000\u011b\u0001\u0000\u0000\u0000"+ - "\u0000\u011d\u0001\u0000\u0000\u0000\u0000\u0121\u0001\u0000\u0000\u0000"+ - "\u0000\u0123\u0001\u0000\u0000\u0000\u0000\u0129\u0001\u0000\u0000\u0000"+ - "\u0000\u012b\u0001\u0000\u0000\u0000\u0001\u012d\u0001\u0000\u0000\u0000"+ - "\u0003\u012f\u0001\u0000\u0000\u0000\u0005\u0136\u0001\u0000\u0000\u0000"+ - "\u0007\u0140\u0001\u0000\u0000\u0000\t\u0142\u0001\u0000\u0000\u0000\u000b"+ - "\u0144\u0001\u0000\u0000\u0000\r\u0147\u0001\u0000\u0000\u0000\u000f\u0149"+ - "\u0001\u0000\u0000\u0000\u0011\u014b\u0001\u0000\u0000\u0000\u0013\u014d"+ - "\u0001\u0000\u0000\u0000\u0015\u014f\u0001\u0000\u0000\u0000\u0017\u0151"+ - "\u0001\u0000\u0000\u0000\u0019\u0153\u0001\u0000\u0000\u0000\u001b\u0155"+ - "\u0001\u0000\u0000\u0000\u001d\u0157\u0001\u0000\u0000\u0000\u001f\u0160"+ - "\u0001\u0000\u0000\u0000!\u0168\u0001\u0000\u0000\u0000#\u0177\u0001\u0000"+ - "\u0000\u0000%\u0179\u0001\u0000\u0000\u0000\'\u018b\u0001\u0000\u0000"+ - "\u0000)\u019e\u0001\u0000\u0000\u0000+\u01a7\u0001\u0000\u0000\u0000-"+ - "\u01b2\u0001\u0000\u0000\u0000/\u01b6\u0001\u0000\u0000\u00001\u01be\u0001"+ - "\u0000\u0000\u00003\u01c8\u0001\u0000\u0000\u00005\u01d3\u0001\u0000\u0000"+ - "\u00007\u01d9\u0001\u0000\u0000\u00009\u01eb\u0001\u0000\u0000\u0000;"+ - "\u01f2\u0001\u0000\u0000\u0000=\u01fb\u0001\u0000\u0000\u0000?\u0204\u0001"+ - "\u0000\u0000\u0000A\u020b\u0001\u0000\u0000\u0000C\u0213\u0001\u0000\u0000"+ - "\u0000E\u021b\u0001\u0000\u0000\u0000G\u0222\u0001\u0000\u0000\u0000I"+ - "\u0225\u0001\u0000\u0000\u0000K\u0228\u0001\u0000\u0000\u0000M\u022b\u0001"+ - "\u0000\u0000\u0000O\u022e\u0001\u0000\u0000\u0000Q\u0231\u0001\u0000\u0000"+ - "\u0000S\u0234\u0001\u0000\u0000\u0000U\u0237\u0001\u0000\u0000\u0000W"+ - "\u0239\u0001\u0000\u0000\u0000Y\u023c\u0001\u0000\u0000\u0000[\u023e\u0001"+ - "\u0000\u0000\u0000]\u0241\u0001\u0000\u0000\u0000_\u0244\u0001\u0000\u0000"+ - "\u0000a\u0246\u0001\u0000\u0000\u0000c\u0248\u0001\u0000\u0000\u0000e"+ - "\u024c\u0001\u0000\u0000\u0000g\u0251\u0001\u0000\u0000\u0000i\u0255\u0001"+ - "\u0000\u0000\u0000k\u0257\u0001\u0000\u0000\u0000m\u0259\u0001\u0000\u0000"+ - "\u0000o\u025b\u0001\u0000\u0000\u0000q\u025d\u0001\u0000\u0000\u0000s"+ - "\u0260\u0001\u0000\u0000\u0000u\u0262\u0001\u0000\u0000\u0000w\u0265\u0001"+ - "\u0000\u0000\u0000y\u0268\u0001\u0000\u0000\u0000{\u026c\u0001\u0000\u0000"+ - "\u0000}\u0270\u0001\u0000\u0000\u0000\u007f\u0276\u0001\u0000\u0000\u0000"+ - "\u0081\u027c\u0001\u0000\u0000\u0000\u0083\u027f\u0001\u0000\u0000\u0000"+ - "\u0085\u0285\u0001\u0000\u0000\u0000\u0087\u028c\u0001\u0000\u0000\u0000"+ - "\u0089\u028f\u0001\u0000\u0000\u0000\u008b\u0292\u0001\u0000\u0000\u0000"+ - "\u008d\u0295\u0001\u0000\u0000\u0000\u008f\u0298\u0001\u0000\u0000\u0000"+ - "\u0091\u02a1\u0001\u0000\u0000\u0000\u0093\u02a7\u0001\u0000\u0000\u0000"+ - "\u0095\u02ad\u0001\u0000\u0000\u0000\u0097\u02b4\u0001\u0000\u0000\u0000"+ - "\u0099\u02be\u0001\u0000\u0000\u0000\u009b\u02c9\u0001\u0000\u0000\u0000"+ - "\u009d\u02ce\u0001\u0000\u0000\u0000\u009f\u02d4\u0001\u0000\u0000\u0000"+ - "\u00a1\u02de\u0001\u0000\u0000\u0000\u00a3\u02e8\u0001\u0000\u0000\u0000"+ - "\u00a5\u02f1\u0001\u0000\u0000\u0000\u00a7\u02f7\u0001\u0000\u0000\u0000"+ - "\u00a9\u02fe\u0001\u0000\u0000\u0000\u00ab\u0303\u0001\u0000\u0000\u0000"+ - "\u00ad\u0307\u0001\u0000\u0000\u0000\u00af\u030d\u0001\u0000\u0000\u0000"+ - "\u00b1\u0315\u0001\u0000\u0000\u0000\u00b3\u031a\u0001\u0000\u0000\u0000"+ - "\u00b5\u031f\u0001\u0000\u0000\u0000\u00b7\u032a\u0001\u0000\u0000\u0000"+ - "\u00b9\u032d\u0001\u0000\u0000\u0000\u00bb\u0331\u0001\u0000\u0000\u0000"+ - "\u00bd\u0335\u0001\u0000\u0000\u0000\u00bf\u0338\u0001\u0000\u0000\u0000"+ - "\u00c1\u0341\u0001\u0000\u0000\u0000\u00c3\u0344\u0001\u0000\u0000\u0000"+ - "\u00c5\u034f\u0001\u0000\u0000\u0000\u00c7\u0352\u0001\u0000\u0000\u0000"+ - "\u00c9\u0358\u0001\u0000\u0000\u0000\u00cb\u035d\u0001\u0000\u0000\u0000"+ - "\u00cd\u0366\u0001\u0000\u0000\u0000\u00cf\u036e\u0001\u0000\u0000\u0000"+ - "\u00d1\u0375\u0001\u0000\u0000\u0000\u00d3\u037f\u0001\u0000\u0000\u0000"+ - "\u00d5\u0384\u0001\u0000\u0000\u0000\u00d7\u038a\u0001\u0000\u0000\u0000"+ - "\u00d9\u038f\u0001\u0000\u0000\u0000\u00db\u0398\u0001\u0000\u0000\u0000"+ - "\u00dd\u03a1\u0001\u0000\u0000\u0000\u00df\u03a9\u0001\u0000\u0000\u0000"+ - "\u00e1\u03b1\u0001\u0000\u0000\u0000\u00e3\u03b6\u0001\u0000\u0000\u0000"+ - "\u00e5\u03bf\u0001\u0000\u0000\u0000\u00e7\u03c6\u0001\u0000\u0000\u0000"+ - "\u00e9\u03cd\u0001\u0000\u0000\u0000\u00eb\u03d4\u0001\u0000\u0000\u0000"+ - "\u00ed\u03dc\u0001\u0000\u0000\u0000\u00ef\u03e1\u0001\u0000\u0000\u0000"+ - "\u00f1\u03e8\u0001\u0000\u0000\u0000\u00f3\u03ef\u0001\u0000\u0000\u0000"+ - "\u00f5\u03f4\u0001\u0000\u0000\u0000\u00f7\u03fa\u0001\u0000\u0000\u0000"+ - "\u00f9\u03ff\u0001\u0000\u0000\u0000\u00fb\u0404\u0001\u0000\u0000\u0000"+ - "\u00fd\u040d\u0001\u0000\u0000\u0000\u00ff\u0413\u0001\u0000\u0000\u0000"+ - "\u0101\u0418\u0001\u0000\u0000\u0000\u0103\u0421\u0001\u0000\u0000\u0000"+ - "\u0105\u0426\u0001\u0000\u0000\u0000\u0107\u0430\u0001\u0000\u0000\u0000"+ - "\u0109\u0436\u0001\u0000\u0000\u0000\u010b\u0440\u0001\u0000\u0000\u0000"+ - "\u010d\u0445\u0001\u0000\u0000\u0000\u010f\u044b\u0001\u0000\u0000\u0000"+ - "\u0111\u044d\u0001\u0000\u0000\u0000\u0113\u044f\u0001\u0000\u0000\u0000"+ - "\u0115\u0454\u0001\u0000\u0000\u0000\u0117\u0459\u0001\u0000\u0000\u0000"+ - "\u0119\u045b\u0001\u0000\u0000\u0000\u011b\u0467\u0001\u0000\u0000\u0000"+ - "\u011d\u0475\u0001\u0000\u0000\u0000\u011f\u047e\u0001\u0000\u0000\u0000"+ - "\u0121\u0482\u0001\u0000\u0000\u0000\u0123\u0486\u0001\u0000\u0000\u0000"+ - "\u0125\u048e\u0001\u0000\u0000\u0000\u0127\u0492\u0001\u0000\u0000\u0000"+ - "\u0129\u0494\u0001\u0000\u0000\u0000\u012b\u04aa\u0001\u0000\u0000\u0000"+ - "\u012d\u012e\u0005;\u0000\u0000\u012e\u0002\u0001\u0000\u0000\u0000\u012f"+ - "\u0130\u0005m\u0000\u0000\u0130\u0131\u0005o\u0000\u0000\u0131\u0132\u0005"+ - "d\u0000\u0000\u0132\u0133\u0005u\u0000\u0000\u0133\u0134\u0005l\u0000"+ - "\u0000\u0134\u0135\u0005e\u0000\u0000\u0135\u0004\u0001\u0000\u0000\u0000"+ - "\u0136\u0137\u0005n\u0000\u0000\u0137\u0138\u0005a\u0000\u0000\u0138\u0139"+ - "\u0005m\u0000\u0000\u0139\u013a\u0005e\u0000\u0000\u013a\u013b\u0005s"+ - "\u0000\u0000\u013b\u013c\u0005p\u0000\u0000\u013c\u013d\u0005a\u0000\u0000"+ - "\u013d\u013e\u0005c\u0000\u0000\u013e\u013f\u0005e\u0000\u0000\u013f\u0006"+ - "\u0001\u0000\u0000\u0000\u0140\u0141\u0005=\u0000\u0000\u0141\b\u0001"+ - "\u0000\u0000\u0000\u0142\u0143\u0005$\u0000\u0000\u0143\n\u0001\u0000"+ - "\u0000\u0000\u0144\u0145\u0005:\u0000\u0000\u0145\u0146\u0005=\u0000\u0000"+ - "\u0146\f\u0001\u0000\u0000\u0000\u0147\u0148\u0005{\u0000\u0000\u0148"+ - "\u000e\u0001\u0000\u0000\u0000\u0149\u014a\u0005}\u0000\u0000\u014a\u0010"+ - "\u0001\u0000\u0000\u0000\u014b\u014c\u0005(\u0000\u0000\u014c\u0012\u0001"+ - "\u0000\u0000\u0000\u014d\u014e\u0005)\u0000\u0000\u014e\u0014\u0001\u0000"+ - "\u0000\u0000\u014f\u0150\u0005*\u0000\u0000\u0150\u0016\u0001\u0000\u0000"+ - "\u0000\u0151\u0152\u0005|\u0000\u0000\u0152\u0018\u0001\u0000\u0000\u0000"+ - "\u0153\u0154\u0005%\u0000\u0000\u0154\u001a\u0001\u0000\u0000\u0000\u0155"+ - "\u0156\u0005,\u0000\u0000\u0156\u001c\u0001\u0000\u0000\u0000\u0157\u0158"+ - "\u0005o\u0000\u0000\u0158\u0159\u0005r\u0000\u0000\u0159\u015a\u0005d"+ - "\u0000\u0000\u015a\u015b\u0005e\u0000\u0000\u015b\u015c\u0005r\u0000\u0000"+ - "\u015c\u015d\u0005i\u0000\u0000\u015d\u015e\u0005n\u0000\u0000\u015e\u015f"+ - "\u0005g\u0000\u0000\u015f\u001e\u0001\u0000\u0000\u0000\u0160\u0161\u0005"+ - "o\u0000\u0000\u0161\u0162\u0005r\u0000\u0000\u0162\u0163\u0005d\u0000"+ - "\u0000\u0163\u0164\u0005e\u0000\u0000\u0164\u0165\u0005r\u0000\u0000\u0165"+ - "\u0166\u0005e\u0000\u0000\u0166\u0167\u0005d\u0000\u0000\u0167 \u0001"+ - "\u0000\u0000\u0000\u0168\u0169\u0005d\u0000\u0000\u0169\u016a\u0005e\u0000"+ - "\u0000\u016a\u016b\u0005c\u0000\u0000\u016b\u016c\u0005i\u0000\u0000\u016c"+ - "\u016d\u0005m\u0000\u0000\u016d\u016e\u0005a\u0000\u0000\u016e\u016f\u0005"+ - "l\u0000\u0000\u016f\u0170\u0005-\u0000\u0000\u0170\u0171\u0005f\u0000"+ - "\u0000\u0171\u0172\u0005o\u0000\u0000\u0172\u0173\u0005r\u0000\u0000\u0173"+ - "\u0174\u0005m\u0000\u0000\u0174\u0175\u0005a\u0000\u0000\u0175\u0176\u0005"+ - "t\u0000\u0000\u0176\"\u0001\u0000\u0000\u0000\u0177\u0178\u0005:\u0000"+ - "\u0000\u0178$\u0001\u0000\u0000\u0000\u0179\u017a\u0005d\u0000\u0000\u017a"+ - "\u017b\u0005e\u0000\u0000\u017b\u017c\u0005c\u0000\u0000\u017c\u017d\u0005"+ - "i\u0000\u0000\u017d\u017e\u0005m\u0000\u0000\u017e\u017f\u0005a\u0000"+ - "\u0000\u017f\u0180\u0005l\u0000\u0000\u0180\u0181\u0005-\u0000\u0000\u0181"+ - "\u0182\u0005s\u0000\u0000\u0182\u0183\u0005e\u0000\u0000\u0183\u0184\u0005"+ - "p\u0000\u0000\u0184\u0185\u0005a\u0000\u0000\u0185\u0186\u0005r\u0000"+ - "\u0000\u0186\u0187\u0005a\u0000\u0000\u0187\u0188\u0005t\u0000\u0000\u0188"+ - "\u0189\u0005o\u0000\u0000\u0189\u018a\u0005r\u0000\u0000\u018a&\u0001"+ - "\u0000\u0000\u0000\u018b\u018c\u0005g\u0000\u0000\u018c\u018d\u0005r\u0000"+ - "\u0000\u018d\u018e\u0005o\u0000\u0000\u018e\u018f\u0005u\u0000\u0000\u018f"+ - "\u0190\u0005p\u0000\u0000\u0190\u0191\u0005i\u0000\u0000\u0191\u0192\u0005"+ - "n\u0000\u0000\u0192\u0193\u0005g\u0000\u0000\u0193\u0194\u0005-\u0000"+ - "\u0000\u0194\u0195\u0005s\u0000\u0000\u0195\u0196\u0005e\u0000\u0000\u0196"+ - "\u0197\u0005p\u0000\u0000\u0197\u0198\u0005a\u0000\u0000\u0198\u0199\u0005"+ - "r\u0000\u0000\u0199\u019a\u0005a\u0000\u0000\u019a\u019b\u0005t\u0000"+ - "\u0000\u019b\u019c\u0005o\u0000\u0000\u019c\u019d\u0005r\u0000\u0000\u019d"+ - "(\u0001\u0000\u0000\u0000\u019e\u019f\u0005i\u0000\u0000\u019f\u01a0\u0005"+ - "n\u0000\u0000\u01a0\u01a1\u0005f\u0000\u0000\u01a1\u01a2\u0005i\u0000"+ - "\u0000\u01a2\u01a3\u0005n\u0000\u0000\u01a3\u01a4\u0005i\u0000\u0000\u01a4"+ - "\u01a5\u0005t\u0000\u0000\u01a5\u01a6\u0005y\u0000\u0000\u01a6*\u0001"+ - "\u0000\u0000\u0000\u01a7\u01a8\u0005m\u0000\u0000\u01a8\u01a9\u0005i\u0000"+ - "\u0000\u01a9\u01aa\u0005n\u0000\u0000\u01aa\u01ab\u0005u\u0000\u0000\u01ab"+ - "\u01ac\u0005s\u0000\u0000\u01ac\u01ad\u0005-\u0000\u0000\u01ad\u01ae\u0005"+ - "s\u0000\u0000\u01ae\u01af\u0005i\u0000\u0000\u01af\u01b0\u0005g\u0000"+ - "\u0000\u01b0\u01b1\u0005n\u0000\u0000\u01b1,\u0001\u0000\u0000\u0000\u01b2"+ - "\u01b3\u0005N\u0000\u0000\u01b3\u01b4\u0005a\u0000\u0000\u01b4\u01b5\u0005"+ - "N\u0000\u0000\u01b5.\u0001\u0000\u0000\u0000\u01b6\u01b7\u0005p\u0000"+ - "\u0000\u01b7\u01b8\u0005e\u0000\u0000\u01b8\u01b9\u0005r\u0000\u0000\u01b9"+ - "\u01ba\u0005c\u0000\u0000\u01ba\u01bb\u0005e\u0000\u0000\u01bb\u01bc\u0005"+ - "n\u0000\u0000\u01bc\u01bd\u0005t\u0000\u0000\u01bd0\u0001\u0000\u0000"+ - "\u0000\u01be\u01bf\u0005p\u0000\u0000\u01bf\u01c0\u0005e\u0000\u0000\u01c0"+ - "\u01c1\u0005r\u0000\u0000\u01c1\u01c2\u0005-\u0000\u0000\u01c2\u01c3\u0005"+ - "m\u0000\u0000\u01c3\u01c4\u0005i\u0000\u0000\u01c4\u01c5\u0005l\u0000"+ - "\u0000\u01c5\u01c6\u0005l\u0000\u0000\u01c6\u01c7\u0005e\u0000\u0000\u01c7"+ - "2\u0001\u0000\u0000\u0000\u01c8\u01c9\u0005z\u0000\u0000\u01c9\u01ca\u0005"+ - "e\u0000\u0000\u01ca\u01cb\u0005r\u0000\u0000\u01cb\u01cc\u0005o\u0000"+ - "\u0000\u01cc\u01cd\u0005-\u0000\u0000\u01cd\u01ce\u0005d\u0000\u0000\u01ce"+ - "\u01cf\u0005i\u0000\u0000\u01cf\u01d0\u0005g\u0000\u0000\u01d0\u01d1\u0005"+ - "i\u0000\u0000\u01d1\u01d2\u0005t\u0000\u0000\u01d24\u0001\u0000\u0000"+ - "\u0000\u01d3\u01d4\u0005d\u0000\u0000\u01d4\u01d5\u0005i\u0000\u0000\u01d5"+ - "\u01d6\u0005g\u0000\u0000\u01d6\u01d7\u0005i\u0000\u0000\u01d7\u01d8\u0005"+ - "t\u0000\u0000\u01d86\u0001\u0000\u0000\u0000\u01d9\u01da\u0005p\u0000"+ - "\u0000\u01da\u01db\u0005a\u0000\u0000\u01db\u01dc\u0005t\u0000\u0000\u01dc"+ - "\u01dd\u0005t\u0000\u0000\u01dd\u01de\u0005e\u0000\u0000\u01de\u01df\u0005"+ - "r\u0000\u0000\u01df\u01e0\u0005n\u0000\u0000\u01e0\u01e1\u0005-\u0000"+ - "\u0000\u01e1\u01e2\u0005s\u0000\u0000\u01e2\u01e3\u0005e\u0000\u0000\u01e3"+ - "\u01e4\u0005p\u0000\u0000\u01e4\u01e5\u0005a\u0000\u0000\u01e5\u01e6\u0005"+ - "r\u0000\u0000\u01e6\u01e7\u0005a\u0000\u0000\u01e7\u01e8\u0005t\u0000"+ - "\u0000\u01e8\u01e9\u0005o\u0000\u0000\u01e9\u01ea\u0005r\u0000\u0000\u01ea"+ - "8\u0001\u0000\u0000\u0000\u01eb\u01ec\u0005i\u0000\u0000\u01ec\u01ed\u0005"+ - "m\u0000\u0000\u01ed\u01ee\u0005p\u0000\u0000\u01ee\u01ef\u0005o\u0000"+ - "\u0000\u01ef\u01f0\u0005r\u0000\u0000\u01f0\u01f1\u0005t\u0000\u0000\u01f1"+ - ":\u0001\u0000\u0000\u0000\u01f2\u01f3\u0005e\u0000\u0000\u01f3\u01f4\u0005"+ - "x\u0000\u0000\u01f4\u01f5\u0005t\u0000\u0000\u01f5\u01f6\u0005e\u0000"+ - "\u0000\u01f6\u01f7\u0005r\u0000\u0000\u01f7\u01f8\u0005n\u0000\u0000\u01f8"+ - "\u01f9\u0005a\u0000\u0000\u01f9\u01fa\u0005l\u0000\u0000\u01fa<\u0001"+ - "\u0000\u0000\u0000\u01fb\u01fc\u0005f\u0000\u0000\u01fc\u01fd\u0005u\u0000"+ - "\u0000\u01fd\u01fe\u0005n\u0000\u0000\u01fe\u01ff\u0005c\u0000\u0000\u01ff"+ - "\u0200\u0005t\u0000\u0000\u0200\u0201\u0005i\u0000\u0000\u0201\u0202\u0005"+ - "o\u0000\u0000\u0202\u0203\u0005n\u0000\u0000\u0203>\u0001\u0000\u0000"+ - "\u0000\u0204\u0205\u0005j\u0000\u0000\u0205\u0206\u0005s\u0000\u0000\u0206"+ - "\u0207\u0005o\u0000\u0000\u0207\u0208\u0005u\u0000\u0000\u0208\u0209\u0005"+ - "n\u0000\u0000\u0209\u020a\u0005d\u0000\u0000\u020a@\u0001\u0000\u0000"+ - "\u0000\u020b\u020c\u0005c\u0000\u0000\u020c\u020d\u0005o\u0000\u0000\u020d"+ - "\u020e\u0005m\u0000\u0000\u020e\u020f\u0005p\u0000\u0000\u020f\u0210\u0005"+ - "a\u0000\u0000\u0210\u0211\u0005c\u0000\u0000\u0211\u0212\u0005t\u0000"+ - "\u0000\u0212B\u0001\u0000\u0000\u0000\u0213\u0214\u0005v\u0000\u0000\u0214"+ - "\u0215\u0005e\u0000\u0000\u0215\u0216\u0005r\u0000\u0000\u0216\u0217\u0005"+ - "b\u0000\u0000\u0217\u0218\u0005o\u0000\u0000\u0218\u0219\u0005s\u0000"+ - "\u0000\u0219\u021a\u0005e\u0000\u0000\u021aD\u0001\u0000\u0000\u0000\u021b"+ - "\u021c\u0005s\u0000\u0000\u021c\u021d\u0005c\u0000\u0000\u021d\u021e\u0005"+ - "h\u0000\u0000\u021e\u021f\u0005e\u0000\u0000\u021f\u0220\u0005m\u0000"+ - "\u0000\u0220\u0221\u0005a\u0000\u0000\u0221F\u0001\u0000\u0000\u0000\u0222"+ - "\u0223\u0005e\u0000\u0000\u0223\u0224\u0005q\u0000\u0000\u0224H\u0001"+ - "\u0000\u0000\u0000\u0225\u0226\u0005n\u0000\u0000\u0226\u0227\u0005e\u0000"+ - "\u0000\u0227J\u0001\u0000\u0000\u0000\u0228\u0229\u0005l\u0000\u0000\u0229"+ - "\u022a\u0005t\u0000\u0000\u022aL\u0001\u0000\u0000\u0000\u022b\u022c\u0005"+ - "l\u0000\u0000\u022c\u022d\u0005e\u0000\u0000\u022dN\u0001\u0000\u0000"+ - "\u0000\u022e\u022f\u0005g\u0000\u0000\u022f\u0230\u0005t\u0000\u0000\u0230"+ - "P\u0001\u0000\u0000\u0000\u0231\u0232\u0005g\u0000\u0000\u0232\u0233\u0005"+ - "e\u0000\u0000\u0233R\u0001\u0000\u0000\u0000\u0234\u0235\u0005!\u0000"+ - "\u0000\u0235\u0236\u0005=\u0000\u0000\u0236T\u0001\u0000\u0000\u0000\u0237"+ - "\u0238\u0005<\u0000\u0000\u0238V\u0001\u0000\u0000\u0000\u0239\u023a\u0005"+ - "<\u0000\u0000\u023a\u023b\u0005=\u0000\u0000\u023bX\u0001\u0000\u0000"+ - "\u0000\u023c\u023d\u0005>\u0000\u0000\u023dZ\u0001\u0000\u0000\u0000\u023e"+ - "\u023f\u0005>\u0000\u0000\u023f\u0240\u0005=\u0000\u0000\u0240\\\u0001"+ - "\u0000\u0000\u0000\u0241\u0242\u0005|\u0000\u0000\u0242\u0243\u0005|\u0000"+ - "\u0000\u0243^\u0001\u0000\u0000\u0000\u0244\u0245\u0005+\u0000\u0000\u0245"+ - "`\u0001\u0000\u0000\u0000\u0246\u0247\u0005-\u0000\u0000\u0247b\u0001"+ - "\u0000\u0000\u0000\u0248\u0249\u0005d\u0000\u0000\u0249\u024a\u0005i\u0000"+ - "\u0000\u024a\u024b\u0005v\u0000\u0000\u024bd\u0001\u0000\u0000\u0000\u024c"+ - "\u024d\u0005i\u0000\u0000\u024d\u024e\u0005d\u0000\u0000\u024e\u024f\u0005"+ - "i\u0000\u0000\u024f\u0250\u0005v\u0000\u0000\u0250f\u0001\u0000\u0000"+ - "\u0000\u0251\u0252\u0005m\u0000\u0000\u0252\u0253\u0005o\u0000\u0000\u0253"+ - "\u0254\u0005d\u0000\u0000\u0254h\u0001\u0000\u0000\u0000\u0255\u0256\u0005"+ - "!\u0000\u0000\u0256j\u0001\u0000\u0000\u0000\u0257\u0258\u0005[\u0000"+ - "\u0000\u0258l\u0001\u0000\u0000\u0000\u0259\u025a\u0005]\u0000\u0000\u025a"+ - "n\u0001\u0000\u0000\u0000\u025b\u025c\u0005.\u0000\u0000\u025cp\u0001"+ - "\u0000\u0000\u0000\u025d\u025e\u0005$\u0000\u0000\u025e\u025f\u0005$\u0000"+ - "\u0000\u025fr\u0001\u0000\u0000\u0000\u0260\u0261\u0005#\u0000\u0000\u0261"+ - "t\u0001\u0000\u0000\u0000\u0262\u0263\u0005{\u0000\u0000\u0263\u0264\u0005"+ - "|\u0000\u0000\u0264v\u0001\u0000\u0000\u0000\u0265\u0266\u0005|\u0000"+ - "\u0000\u0266\u0267\u0005}\u0000\u0000\u0267x\u0001\u0000\u0000\u0000\u0268"+ - "\u0269\u0005f\u0000\u0000\u0269\u026a\u0005o\u0000\u0000\u026a\u026b\u0005"+ - "r\u0000\u0000\u026bz\u0001\u0000\u0000\u0000\u026c\u026d\u0005l\u0000"+ - "\u0000\u026d\u026e\u0005e\u0000\u0000\u026e\u026f\u0005t\u0000\u0000\u026f"+ - "|\u0001\u0000\u0000\u0000\u0270\u0271\u0005w\u0000\u0000\u0271\u0272\u0005"+ - "h\u0000\u0000\u0272\u0273\u0005e\u0000\u0000\u0273\u0274\u0005r\u0000"+ - "\u0000\u0274\u0275\u0005e\u0000\u0000\u0275~\u0001\u0000\u0000\u0000\u0276"+ - "\u0277\u0005g\u0000\u0000\u0277\u0278\u0005r\u0000\u0000\u0278\u0279\u0005"+ - "o\u0000\u0000\u0279\u027a\u0005u\u0000\u0000\u027a\u027b\u0005p\u0000"+ - "\u0000\u027b\u0080\u0001\u0000\u0000\u0000\u027c\u027d\u0005b\u0000\u0000"+ - "\u027d\u027e\u0005y\u0000\u0000\u027e\u0082\u0001\u0000\u0000\u0000\u027f"+ - "\u0280\u0005o\u0000\u0000\u0280\u0281\u0005r\u0000\u0000\u0281\u0282\u0005"+ - "d\u0000\u0000\u0282\u0283\u0005e\u0000\u0000\u0283\u0284\u0005r\u0000"+ - "\u0000\u0284\u0084\u0001\u0000\u0000\u0000\u0285\u0286\u0005r\u0000\u0000"+ - "\u0286\u0287\u0005e\u0000\u0000\u0287\u0288\u0005t\u0000\u0000\u0288\u0289"+ - "\u0005u\u0000\u0000\u0289\u028a\u0005r\u0000\u0000\u028a\u028b\u0005n"+ - "\u0000\u0000\u028b\u0086\u0001\u0000\u0000\u0000\u028c\u028d\u0005i\u0000"+ - "\u0000\u028d\u028e\u0005f\u0000\u0000\u028e\u0088\u0001\u0000\u0000\u0000"+ - "\u028f\u0290\u0005i\u0000\u0000\u0290\u0291\u0005n\u0000\u0000\u0291\u008a"+ - "\u0001\u0000\u0000\u0000\u0292\u0293\u0005a\u0000\u0000\u0293\u0294\u0005"+ - "s\u0000\u0000\u0294\u008c\u0001\u0000\u0000\u0000\u0295\u0296\u0005a\u0000"+ - "\u0000\u0296\u0297\u0005t\u0000\u0000\u0297\u008e\u0001\u0000\u0000\u0000"+ - "\u0298\u0299\u0005a\u0000\u0000\u0299\u029a\u0005l\u0000\u0000\u029a\u029b"+ - "\u0005l\u0000\u0000\u029b\u029c\u0005o\u0000\u0000\u029c\u029d\u0005w"+ - "\u0000\u0000\u029d\u029e\u0005i\u0000\u0000\u029e\u029f\u0005n\u0000\u0000"+ - "\u029f\u02a0\u0005g\u0000\u0000\u02a0\u0090\u0001\u0000\u0000\u0000\u02a1"+ - "\u02a2\u0005e\u0000\u0000\u02a2\u02a3\u0005m\u0000\u0000\u02a3\u02a4\u0005"+ - "p\u0000\u0000\u02a4\u02a5\u0005t\u0000\u0000\u02a5\u02a6\u0005y\u0000"+ - "\u0000\u02a6\u0092\u0001\u0000\u0000\u0000\u02a7\u02a8\u0005c\u0000\u0000"+ - "\u02a8\u02a9\u0005o\u0000\u0000\u02a9\u02aa\u0005u\u0000\u0000\u02aa\u02ab"+ - "\u0005n\u0000\u0000\u02ab\u02ac\u0005t\u0000\u0000\u02ac\u0094\u0001\u0000"+ - "\u0000\u0000\u02ad\u02ae\u0005s\u0000\u0000\u02ae\u02af\u0005t\u0000\u0000"+ - "\u02af\u02b0\u0005a\u0000\u0000\u02b0\u02b1\u0005b\u0000\u0000\u02b1\u02b2"+ - "\u0005l\u0000\u0000\u02b2\u02b3\u0005e\u0000\u0000\u02b3\u0096\u0001\u0000"+ - "\u0000\u0000\u02b4\u02b5\u0005a\u0000\u0000\u02b5\u02b6\u0005s\u0000\u0000"+ - "\u02b6\u02b7\u0005c\u0000\u0000\u02b7\u02b8\u0005e\u0000\u0000\u02b8\u02b9"+ - "\u0005n\u0000\u0000\u02b9\u02ba\u0005d\u0000\u0000\u02ba\u02bb\u0005i"+ - "\u0000\u0000\u02bb\u02bc\u0005n\u0000\u0000\u02bc\u02bd\u0005g\u0000\u0000"+ - "\u02bd\u0098\u0001\u0000\u0000\u0000\u02be\u02bf\u0005d\u0000\u0000\u02bf"+ - "\u02c0\u0005e\u0000\u0000\u02c0\u02c1\u0005s\u0000\u0000\u02c1\u02c2\u0005"+ - "c\u0000\u0000\u02c2\u02c3\u0005e\u0000\u0000\u02c3\u02c4\u0005n\u0000"+ - "\u0000\u02c4\u02c5\u0005d\u0000\u0000\u02c5\u02c6\u0005i\u0000\u0000\u02c6"+ - "\u02c7\u0005n\u0000\u0000\u02c7\u02c8\u0005g\u0000\u0000\u02c8\u009a\u0001"+ - "\u0000\u0000\u0000\u02c9\u02ca\u0005s\u0000\u0000\u02ca\u02cb\u0005o\u0000"+ - "\u0000\u02cb\u02cc\u0005m\u0000\u0000\u02cc\u02cd\u0005e\u0000\u0000\u02cd"+ - "\u009c\u0001\u0000\u0000\u0000\u02ce\u02cf\u0005e\u0000\u0000\u02cf\u02d0"+ - "\u0005v\u0000\u0000\u02d0\u02d1\u0005e\u0000\u0000\u02d1\u02d2\u0005r"+ - "\u0000\u0000\u02d2\u02d3\u0005y\u0000\u0000\u02d3\u009e\u0001\u0000\u0000"+ - "\u0000\u02d4\u02d5\u0005s\u0000\u0000\u02d5\u02d6\u0005a\u0000\u0000\u02d6"+ - "\u02d7\u0005t\u0000\u0000\u02d7\u02d8\u0005i\u0000\u0000\u02d8\u02d9\u0005"+ - "s\u0000\u0000\u02d9\u02da\u0005f\u0000\u0000\u02da\u02db\u0005i\u0000"+ - "\u0000\u02db\u02dc\u0005e\u0000\u0000\u02dc\u02dd\u0005s\u0000\u0000\u02dd"+ - "\u00a0\u0001\u0000\u0000\u0000\u02de\u02df\u0005c\u0000\u0000\u02df\u02e0"+ - "\u0005o\u0000\u0000\u02e0\u02e1\u0005l\u0000\u0000\u02e1\u02e2\u0005l"+ - "\u0000\u0000\u02e2\u02e3\u0005a\u0000\u0000\u02e3\u02e4\u0005t\u0000\u0000"+ - "\u02e4\u02e5\u0005i\u0000\u0000\u02e5\u02e6\u0005o\u0000\u0000\u02e6\u02e7"+ - "\u0005n\u0000\u0000\u02e7\u00a2\u0001\u0000\u0000\u0000\u02e8\u02e9\u0005"+ - "g\u0000\u0000\u02e9\u02ea\u0005r\u0000\u0000\u02ea\u02eb\u0005e\u0000"+ - "\u0000\u02eb\u02ec\u0005a\u0000\u0000\u02ec\u02ed\u0005t\u0000\u0000\u02ed"+ - "\u02ee\u0005e\u0000\u0000\u02ee\u02ef\u0005s\u0000\u0000\u02ef\u02f0\u0005"+ - "t\u0000\u0000\u02f0\u00a4\u0001\u0000\u0000\u0000\u02f1\u02f2\u0005l\u0000"+ - "\u0000\u02f2\u02f3\u0005e\u0000\u0000\u02f3\u02f4\u0005a\u0000\u0000\u02f4"+ - "\u02f5\u0005s\u0000\u0000\u02f5\u02f6\u0005t\u0000\u0000\u02f6\u00a6\u0001"+ - "\u0000\u0000\u0000\u02f7\u02f8\u0005s\u0000\u0000\u02f8\u02f9\u0005w\u0000"+ - "\u0000\u02f9\u02fa\u0005i\u0000\u0000\u02fa\u02fb\u0005t\u0000\u0000\u02fb"+ - "\u02fc\u0005c\u0000\u0000\u02fc\u02fd\u0005h\u0000\u0000\u02fd\u00a8\u0001"+ - "\u0000\u0000\u0000\u02fe\u02ff\u0005c\u0000\u0000\u02ff\u0300\u0005a\u0000"+ - "\u0000\u0300\u0301\u0005s\u0000\u0000\u0301\u0302\u0005e\u0000\u0000\u0302"+ - "\u00aa\u0001\u0000\u0000\u0000\u0303\u0304\u0005t\u0000\u0000\u0304\u0305"+ - "\u0005r\u0000\u0000\u0305\u0306\u0005y\u0000\u0000\u0306\u00ac\u0001\u0000"+ - "\u0000\u0000\u0307\u0308\u0005c\u0000\u0000\u0308\u0309\u0005a\u0000\u0000"+ - "\u0309\u030a\u0005t\u0000\u0000\u030a\u030b\u0005c\u0000\u0000\u030b\u030c"+ - "\u0005h\u0000\u0000\u030c\u00ae\u0001\u0000\u0000\u0000\u030d\u030e\u0005"+ - "d\u0000\u0000\u030e\u030f\u0005e\u0000\u0000\u030f\u0310\u0005f\u0000"+ - "\u0000\u0310\u0311\u0005a\u0000\u0000\u0311\u0312\u0005u\u0000\u0000\u0312"+ - "\u0313\u0005l\u0000\u0000\u0313\u0314\u0005t\u0000\u0000\u0314\u00b0\u0001"+ - "\u0000\u0000\u0000\u0315\u0316\u0005t\u0000\u0000\u0316\u0317\u0005h\u0000"+ - "\u0000\u0317\u0318\u0005e\u0000\u0000\u0318\u0319\u0005n\u0000\u0000\u0319"+ - "\u00b2\u0001\u0000\u0000\u0000\u031a\u031b\u0005e\u0000\u0000\u031b\u031c"+ - "\u0005l\u0000\u0000\u031c\u031d\u0005s\u0000\u0000\u031d\u031e\u0005e"+ - "\u0000\u0000\u031e\u00b4\u0001\u0000\u0000\u0000\u031f\u0320\u0005t\u0000"+ - "\u0000\u0320\u0321\u0005y\u0000\u0000\u0321\u0322\u0005p\u0000\u0000\u0322"+ - "\u0323\u0005e\u0000\u0000\u0323\u0324\u0005s\u0000\u0000\u0324\u0325\u0005"+ - "w\u0000\u0000\u0325\u0326\u0005i\u0000\u0000\u0326\u0327\u0005t\u0000"+ - "\u0000\u0327\u0328\u0005c\u0000\u0000\u0328\u0329\u0005h\u0000\u0000\u0329"+ - "\u00b6\u0001\u0000\u0000\u0000\u032a\u032b\u0005o\u0000\u0000\u032b\u032c"+ - "\u0005r\u0000\u0000\u032c\u00b8\u0001\u0000\u0000\u0000\u032d\u032e\u0005"+ - "a\u0000\u0000\u032e\u032f\u0005n\u0000\u0000\u032f\u0330\u0005d\u0000"+ - "\u0000\u0330\u00ba\u0001\u0000\u0000\u0000\u0331\u0332\u0005n\u0000\u0000"+ - "\u0332\u0333\u0005o\u0000\u0000\u0333\u0334\u0005t\u0000\u0000\u0334\u00bc"+ - "\u0001\u0000\u0000\u0000\u0335\u0336\u0005t\u0000\u0000\u0336\u0337\u0005"+ - "o\u0000\u0000\u0337\u00be\u0001\u0000\u0000\u0000\u0338\u0339\u0005i\u0000"+ - "\u0000\u0339\u033a\u0005n\u0000\u0000\u033a\u033b\u0005s\u0000\u0000\u033b"+ - "\u033c\u0005t\u0000\u0000\u033c\u033d\u0005a\u0000\u0000\u033d\u033e\u0005"+ - "n\u0000\u0000\u033e\u033f\u0005c\u0000\u0000\u033f\u0340\u0005e\u0000"+ - "\u0000\u0340\u00c0\u0001\u0000\u0000\u0000\u0341\u0342\u0005o\u0000\u0000"+ - "\u0342\u0343\u0005f\u0000\u0000\u0343\u00c2\u0001\u0000\u0000\u0000\u0344"+ - "\u0345\u0005s\u0000\u0000\u0345\u0346\u0005t\u0000\u0000\u0346\u0347\u0005"+ - "a\u0000\u0000\u0347\u0348\u0005t\u0000\u0000\u0348\u0349\u0005i\u0000"+ - "\u0000\u0349\u034a\u0005c\u0000\u0000\u034a\u034b\u0005a\u0000\u0000\u034b"+ - "\u034c\u0005l\u0000\u0000\u034c\u034d\u0005l\u0000\u0000\u034d\u034e\u0005"+ - "y\u0000\u0000\u034e\u00c4\u0001\u0000\u0000\u0000\u034f\u0350\u0005i\u0000"+ - "\u0000\u0350\u0351\u0005s\u0000\u0000\u0351\u00c6\u0001\u0000\u0000\u0000"+ - "\u0352\u0353\u0005t\u0000\u0000\u0353\u0354\u0005r\u0000\u0000\u0354\u0355"+ - "\u0005e\u0000\u0000\u0355\u0356\u0005a\u0000\u0000\u0356\u0357\u0005t"+ - "\u0000\u0000\u0357\u00c8\u0001\u0000\u0000\u0000\u0358\u0359\u0005c\u0000"+ - "\u0000\u0359\u035a\u0005a\u0000\u0000\u035a\u035b\u0005s\u0000\u0000\u035b"+ - "\u035c\u0005t\u0000\u0000\u035c\u00ca\u0001\u0000\u0000\u0000\u035d\u035e"+ - "\u0005c\u0000\u0000\u035e\u035f\u0005a\u0000\u0000\u035f\u0360\u0005s"+ - "\u0000\u0000\u0360\u0361\u0005t\u0000\u0000\u0361\u0362\u0005a\u0000\u0000"+ - "\u0362\u0363\u0005b\u0000\u0000\u0363\u0364\u0005l\u0000\u0000\u0364\u0365"+ - "\u0005e\u0000\u0000\u0365\u00cc\u0001\u0000\u0000\u0000\u0366\u0367\u0005"+ - "v\u0000\u0000\u0367\u0368\u0005e\u0000\u0000\u0368\u0369\u0005r\u0000"+ - "\u0000\u0369\u036a\u0005s\u0000\u0000\u036a\u036b\u0005i\u0000\u0000\u036b"+ - "\u036c\u0005o\u0000\u0000\u036c\u036d\u0005n\u0000\u0000\u036d\u00ce\u0001"+ - "\u0000\u0000\u0000\u036e\u036f\u0005j\u0000\u0000\u036f\u0370\u0005s\u0000"+ - "\u0000\u0370\u0371\u0005o\u0000\u0000\u0371\u0372\u0005n\u0000\u0000\u0372"+ - "\u0373\u0005i\u0000\u0000\u0373\u0374\u0005q\u0000\u0000\u0374\u00d0\u0001"+ - "\u0000\u0000\u0000\u0375\u0376\u0005u\u0000\u0000\u0376\u0377\u0005n\u0000"+ - "\u0000\u0377\u0378\u0005o\u0000\u0000\u0378\u0379\u0005r\u0000\u0000\u0379"+ - "\u037a\u0005d\u0000\u0000\u037a\u037b\u0005e\u0000\u0000\u037b\u037c\u0005"+ - "r\u0000\u0000\u037c\u037d\u0005e\u0000\u0000\u037d\u037e\u0005d\u0000"+ - "\u0000\u037e\u00d2\u0001\u0000\u0000\u0000\u037f\u0380\u0005t\u0000\u0000"+ - "\u0380\u0381\u0005r\u0000\u0000\u0381\u0382\u0005u\u0000\u0000\u0382\u0383"+ - "\u0005e\u0000\u0000\u0383\u00d4\u0001\u0000\u0000\u0000\u0384\u0385\u0005"+ - "f\u0000\u0000\u0385\u0386\u0005a\u0000\u0000\u0386\u0387\u0005l\u0000"+ - "\u0000\u0387\u0388\u0005s\u0000\u0000\u0388\u0389\u0005e\u0000\u0000\u0389"+ - "\u00d6\u0001\u0000\u0000\u0000\u038a\u038b\u0005t\u0000\u0000\u038b\u038c"+ - "\u0005y\u0000\u0000\u038c\u038d\u0005p\u0000\u0000\u038d\u038e\u0005e"+ - "\u0000\u0000\u038e\u00d8\u0001\u0000\u0000\u0000\u038f\u0390\u0005v\u0000"+ - "\u0000\u0390\u0391\u0005a\u0000\u0000\u0391\u0392\u0005l\u0000\u0000\u0392"+ - "\u0393\u0005i\u0000\u0000\u0393\u0394\u0005d\u0000\u0000\u0394\u0395\u0005"+ - "a\u0000\u0000\u0395\u0396\u0005t\u0000\u0000\u0396\u0397\u0005e\u0000"+ - "\u0000\u0397\u00da\u0001\u0000\u0000\u0000\u0398\u0399\u0005a\u0000\u0000"+ - "\u0399\u039a\u0005n\u0000\u0000\u039a\u039b\u0005n\u0000\u0000\u039b\u039c"+ - "\u0005o\u0000\u0000\u039c\u039d\u0005t\u0000\u0000\u039d\u039e\u0005a"+ - "\u0000\u0000\u039e\u039f\u0005t\u0000\u0000\u039f\u03a0\u0005e\u0000\u0000"+ - "\u03a0\u00dc\u0001\u0000\u0000\u0000\u03a1\u03a2\u0005d\u0000\u0000\u03a2"+ - "\u03a3\u0005e\u0000\u0000\u03a3\u03a4\u0005c\u0000\u0000\u03a4\u03a5\u0005"+ - "l\u0000\u0000\u03a5\u03a6\u0005a\u0000\u0000\u03a6\u03a7\u0005r\u0000"+ - "\u0000\u03a7\u03a8\u0005e\u0000\u0000\u03a8\u00de\u0001\u0000\u0000\u0000"+ - "\u03a9\u03aa\u0005c\u0000\u0000\u03aa\u03ab\u0005o\u0000\u0000\u03ab\u03ac"+ - "\u0005n\u0000\u0000\u03ac\u03ad\u0005t\u0000\u0000\u03ad\u03ae\u0005e"+ - "\u0000\u0000\u03ae\u03af\u0005x\u0000\u0000\u03af\u03b0\u0005t\u0000\u0000"+ - "\u03b0\u00e0\u0001\u0000\u0000\u0000\u03b1\u03b2\u0005i\u0000\u0000\u03b2"+ - "\u03b3\u0005t\u0000\u0000\u03b3\u03b4\u0005e\u0000\u0000\u03b4\u03b5\u0005"+ - "m\u0000\u0000\u03b5\u00e2\u0001\u0000\u0000\u0000\u03b6\u03b7\u0005v\u0000"+ - "\u0000\u03b7\u03b8\u0005a\u0000\u0000\u03b8\u03b9\u0005r\u0000\u0000\u03b9"+ - "\u03ba\u0005i\u0000\u0000\u03ba\u03bb\u0005a\u0000\u0000\u03bb\u03bc\u0005"+ - "b\u0000\u0000\u03bc\u03bd\u0005l\u0000\u0000\u03bd\u03be\u0005e\u0000"+ - "\u0000\u03be\u00e4\u0001\u0000\u0000\u0000\u03bf\u03c0\u0005i\u0000\u0000"+ - "\u03c0\u03c1\u0005n\u0000\u0000\u03c1\u03c2\u0005s\u0000\u0000\u03c2\u03c3"+ - "\u0005e\u0000\u0000\u03c3\u03c4\u0005r\u0000\u0000\u03c4\u03c5\u0005t"+ - "\u0000\u0000\u03c5\u00e6\u0001\u0000\u0000\u0000\u03c6\u03c7\u0005d\u0000"+ - "\u0000\u03c7\u03c8\u0005e\u0000\u0000\u03c8\u03c9\u0005l\u0000\u0000\u03c9"+ - "\u03ca\u0005e\u0000\u0000\u03ca\u03cb\u0005t\u0000\u0000\u03cb\u03cc\u0005"+ - "e\u0000\u0000\u03cc\u00e8\u0001\u0000\u0000\u0000\u03cd\u03ce\u0005r\u0000"+ - "\u0000\u03ce\u03cf\u0005e\u0000\u0000\u03cf\u03d0\u0005n\u0000\u0000\u03d0"+ - "\u03d1\u0005a\u0000\u0000\u03d1\u03d2\u0005m\u0000\u0000\u03d2\u03d3\u0005"+ - "e\u0000\u0000\u03d3\u00ea\u0001\u0000\u0000\u0000\u03d4\u03d5\u0005r\u0000"+ - "\u0000\u03d5\u03d6\u0005e\u0000\u0000\u03d6\u03d7\u0005p\u0000\u0000\u03d7"+ - "\u03d8\u0005l\u0000\u0000\u03d8\u03d9\u0005a\u0000\u0000\u03d9\u03da\u0005"+ - "c\u0000\u0000\u03da\u03db\u0005e\u0000\u0000\u03db\u00ec\u0001\u0000\u0000"+ - "\u0000\u03dc\u03dd\u0005c\u0000\u0000\u03dd\u03de\u0005o\u0000\u0000\u03de"+ - "\u03df\u0005p\u0000\u0000\u03df\u03e0\u0005y\u0000\u0000\u03e0\u00ee\u0001"+ - "\u0000\u0000\u0000\u03e1\u03e2\u0005m\u0000\u0000\u03e2\u03e3\u0005o\u0000"+ - "\u0000\u03e3\u03e4\u0005d\u0000\u0000\u03e4\u03e5\u0005i\u0000\u0000\u03e5"+ - "\u03e6\u0005f\u0000\u0000\u03e6\u03e7\u0005y\u0000\u0000\u03e7\u00f0\u0001"+ - "\u0000\u0000\u0000\u03e8\u03e9\u0005a\u0000\u0000\u03e9\u03ea\u0005p\u0000"+ - "\u0000\u03ea\u03eb\u0005p\u0000\u0000\u03eb\u03ec\u0005e\u0000\u0000\u03ec"+ - "\u03ed\u0005n\u0000\u0000\u03ed\u03ee\u0005d\u0000\u0000\u03ee\u00f2\u0001"+ - "\u0000\u0000\u0000\u03ef\u03f0\u0005i\u0000\u0000\u03f0\u03f1\u0005n\u0000"+ - "\u0000\u03f1\u03f2\u0005t\u0000\u0000\u03f2\u03f3\u0005o\u0000\u0000\u03f3"+ - "\u00f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0005v\u0000\u0000\u03f5\u03f6"+ - "\u0005a\u0000\u0000\u03f6\u03f7\u0005l\u0000\u0000\u03f7\u03f8\u0005u"+ - "\u0000\u0000\u03f8\u03f9\u0005e\u0000\u0000\u03f9\u00f6\u0001\u0000\u0000"+ - "\u0000\u03fa\u03fb\u0005j\u0000\u0000\u03fb\u03fc\u0005s\u0000\u0000\u03fc"+ - "\u03fd\u0005o\u0000\u0000\u03fd\u03fe\u0005n\u0000\u0000\u03fe\u00f8\u0001"+ - "\u0000\u0000\u0000\u03ff\u0400\u0005w\u0000\u0000\u0400\u0401\u0005i\u0000"+ - "\u0000\u0401\u0402\u0005t\u0000\u0000\u0402\u0403\u0005h\u0000\u0000\u0403"+ - "\u00fa\u0001\u0000\u0000\u0000\u0404\u0405\u0005p\u0000\u0000\u0405\u0406"+ - "\u0005o\u0000\u0000\u0406\u0407\u0005s\u0000\u0000\u0407\u0408\u0005i"+ - "\u0000\u0000\u0408\u0409\u0005t\u0000\u0000\u0409\u040a\u0005i\u0000\u0000"+ - "\u040a\u040b\u0005o\u0000\u0000\u040b\u040c\u0005n\u0000\u0000\u040c\u00fc"+ - "\u0001\u0000\u0000\u0000\u040d\u040e\u0005b\u0000\u0000\u040e\u040f\u0005"+ - "r\u0000\u0000\u040f\u0410\u0005e\u0000\u0000\u0410\u0411\u0005a\u0000"+ - "\u0000\u0411\u0412\u0005k\u0000\u0000\u0412\u00fe\u0001\u0000\u0000\u0000"+ - "\u0413\u0414\u0005l\u0000\u0000\u0414\u0415\u0005o\u0000\u0000\u0415\u0416"+ - "\u0005o\u0000\u0000\u0416\u0417\u0005p\u0000\u0000\u0417\u0100\u0001\u0000"+ - "\u0000\u0000\u0418\u0419\u0005c\u0000\u0000\u0419\u041a\u0005o\u0000\u0000"+ - "\u041a\u041b\u0005n\u0000\u0000\u041b\u041c\u0005t\u0000\u0000\u041c\u041d"+ - "\u0005i\u0000\u0000\u041d\u041e\u0005n\u0000\u0000\u041e\u041f\u0005u"+ - "\u0000\u0000\u041f\u0420\u0005e\u0000\u0000\u0420\u0102\u0001\u0000\u0000"+ - "\u0000\u0421\u0422\u0005e\u0000\u0000\u0422\u0423\u0005x\u0000\u0000\u0423"+ - "\u0424\u0005i\u0000\u0000\u0424\u0425\u0005t\u0000\u0000\u0425\u0104\u0001"+ - "\u0000\u0000\u0000\u0426\u0427\u0005r\u0000\u0000\u0427\u0428\u0005e\u0000"+ - "\u0000\u0428\u0429\u0005t\u0000\u0000\u0429\u042a\u0005u\u0000\u0000\u042a"+ - "\u042b\u0005r\u0000\u0000\u042b\u042c\u0005n\u0000\u0000\u042c\u042d\u0005"+ - "i\u0000\u0000\u042d\u042e\u0005n\u0000\u0000\u042e\u042f\u0005g\u0000"+ - "\u0000\u042f\u0106\u0001\u0000\u0000\u0000\u0430\u0431\u0005w\u0000\u0000"+ - "\u0431\u0432\u0005h\u0000\u0000\u0432\u0433\u0005i\u0000\u0000\u0433\u0434"+ - "\u0005l\u0000\u0000\u0434\u0435\u0005e\u0000\u0000\u0435\u0108\u0001\u0000"+ - "\u0000\u0000\u0436\u043b\u0005\"\u0000\u0000\u0437\u043a\u0003\u010b\u0085"+ - "\u0000\u0438\u043a\b\u0000\u0000\u0000\u0439\u0437\u0001\u0000\u0000\u0000"+ - "\u0439\u0438\u0001\u0000\u0000\u0000\u043a\u043d\u0001\u0000\u0000\u0000"+ - "\u043b\u0439\u0001\u0000\u0000\u0000\u043b\u043c\u0001\u0000\u0000\u0000"+ - "\u043c\u043e\u0001\u0000\u0000\u0000\u043d\u043b\u0001\u0000\u0000\u0000"+ - "\u043e\u043f\u0005\"\u0000\u0000\u043f\u010a\u0001\u0000\u0000\u0000\u0440"+ - "\u0443\u0005\\\u0000\u0000\u0441\u0444\u0007\u0001\u0000\u0000\u0442\u0444"+ - "\u0003\u010d\u0086\u0000\u0443\u0441\u0001\u0000\u0000\u0000\u0443\u0442"+ - "\u0001\u0000\u0000\u0000\u0444\u010c\u0001\u0000\u0000\u0000\u0445\u0446"+ - "\u0005u\u0000\u0000\u0446\u0447\u0003\u010f\u0087\u0000\u0447\u0448\u0003"+ - "\u010f\u0087\u0000\u0448\u0449\u0003\u010f\u0087\u0000\u0449\u044a\u0003"+ - "\u010f\u0087\u0000\u044a\u010e\u0001\u0000\u0000\u0000\u044b\u044c\u0007"+ - "\u0002\u0000\u0000\u044c\u0110\u0001\u0000\u0000\u0000\u044d\u044e\u0005"+ - "?\u0000\u0000\u044e\u0112\u0001\u0000\u0000\u0000\u044f\u0450\u0005n\u0000"+ - "\u0000\u0450\u0451\u0005u\u0000\u0000\u0451\u0452\u0005l\u0000\u0000\u0452"+ - "\u0453\u0005l\u0000\u0000\u0453\u0114\u0001\u0000\u0000\u0000\u0454\u0455"+ - "\u0003\u0117\u008b\u0000\u0455\u0116\u0001\u0000\u0000\u0000\u0456\u045a"+ - "\u0003\u0119\u008c\u0000\u0457\u045a\u0003\u011b\u008d\u0000\u0458\u045a"+ - "\u0003\u011d\u008e\u0000\u0459\u0456\u0001\u0000\u0000\u0000\u0459\u0457"+ - "\u0001\u0000\u0000\u0000\u0459\u0458\u0001\u0000\u0000\u0000\u045a\u0118"+ - "\u0001\u0000\u0000\u0000\u045b\u045c\u0003\u011f\u008f\u0000\u045c\u011a"+ - "\u0001\u0000\u0000\u0000\u045d\u045e\u0005.\u0000\u0000\u045e\u0468\u0003"+ - "\u011f\u008f\u0000\u045f\u0460\u0003\u011f\u008f\u0000\u0460\u0464\u0005"+ - ".\u0000\u0000\u0461\u0463\u0007\u0003\u0000\u0000\u0462\u0461\u0001\u0000"+ - "\u0000\u0000\u0463\u0466\u0001\u0000\u0000\u0000\u0464\u0462\u0001\u0000"+ - "\u0000\u0000\u0464\u0465\u0001\u0000\u0000\u0000\u0465\u0468\u0001\u0000"+ - "\u0000\u0000\u0466\u0464\u0001\u0000\u0000\u0000\u0467\u045d\u0001\u0000"+ - "\u0000\u0000\u0467\u045f\u0001\u0000\u0000\u0000\u0468\u011c\u0001\u0000"+ - "\u0000\u0000\u0469\u046a\u0005.\u0000\u0000\u046a\u0476\u0003\u011f\u008f"+ - "\u0000\u046b\u0473\u0003\u011f\u008f\u0000\u046c\u0470\u0005.\u0000\u0000"+ - "\u046d\u046f\u0007\u0003\u0000\u0000\u046e\u046d\u0001\u0000\u0000\u0000"+ - "\u046f\u0472\u0001\u0000\u0000\u0000\u0470\u046e\u0001\u0000\u0000\u0000"+ - "\u0470\u0471\u0001\u0000\u0000\u0000\u0471\u0474\u0001\u0000\u0000\u0000"+ - "\u0472\u0470\u0001\u0000\u0000\u0000\u0473\u046c\u0001\u0000\u0000\u0000"+ - "\u0473\u0474\u0001\u0000\u0000\u0000\u0474\u0476\u0001\u0000\u0000\u0000"+ - "\u0475\u0469\u0001\u0000\u0000\u0000\u0475\u046b\u0001\u0000\u0000\u0000"+ - "\u0476\u0477\u0001\u0000\u0000\u0000\u0477\u0479\u0007\u0004\u0000\u0000"+ - "\u0478\u047a\u0007\u0005\u0000\u0000\u0479\u0478\u0001\u0000\u0000\u0000"+ - "\u0479\u047a\u0001\u0000\u0000\u0000\u047a\u047b\u0001\u0000\u0000\u0000"+ - "\u047b\u047c\u0003\u011f\u008f\u0000\u047c\u011e\u0001\u0000\u0000\u0000"+ - "\u047d\u047f\u0007\u0003\u0000\u0000\u047e\u047d\u0001\u0000\u0000\u0000"+ - "\u047f\u0480\u0001\u0000\u0000\u0000\u0480\u047e\u0001\u0000\u0000\u0000"+ - "\u0480\u0481\u0001\u0000\u0000\u0000\u0481\u0120\u0001\u0000\u0000\u0000"+ - "\u0482\u0483\u0007\u0006\u0000\u0000\u0483\u0484\u0001\u0000\u0000\u0000"+ - "\u0484\u0485\u0006\u0090\u0000\u0000\u0485\u0122\u0001\u0000\u0000\u0000"+ - "\u0486\u048a\u0003\u0125\u0092\u0000\u0487\u0489\u0003\u0127\u0093\u0000"+ - "\u0488\u0487\u0001\u0000\u0000\u0000\u0489\u048c\u0001\u0000\u0000\u0000"+ - "\u048a\u0488\u0001\u0000\u0000\u0000\u048a\u048b\u0001\u0000\u0000\u0000"+ - "\u048b\u0124\u0001\u0000\u0000\u0000\u048c\u048a\u0001\u0000\u0000\u0000"+ - "\u048d\u048f\u0007\u0007\u0000\u0000\u048e\u048d\u0001\u0000\u0000\u0000"+ - "\u048f\u0126\u0001\u0000\u0000\u0000\u0490\u0493\u0003\u0125\u0092\u0000"+ - "\u0491\u0493\u0007\b\u0000\u0000\u0492\u0490\u0001\u0000\u0000\u0000\u0492"+ - "\u0491\u0001\u0000\u0000\u0000\u0493\u0128\u0001\u0000\u0000\u0000\u0494"+ - "\u0495\u0005(\u0000\u0000\u0495\u049e\u0005:\u0000\u0000\u0496\u049d\u0003"+ - "\u0129\u0094\u0000\u0497\u0498\u0005(\u0000\u0000\u0498\u049d\b\t\u0000"+ - "\u0000\u0499\u049a\u0005:\u0000\u0000\u049a\u049d\b\n\u0000\u0000\u049b"+ - "\u049d\b\u000b\u0000\u0000\u049c\u0496\u0001\u0000\u0000\u0000\u049c\u0497"+ - "\u0001\u0000\u0000\u0000\u049c\u0499\u0001\u0000\u0000\u0000\u049c\u049b"+ - "\u0001\u0000\u0000\u0000\u049d\u04a0\u0001\u0000\u0000\u0000\u049e\u049c"+ - "\u0001\u0000\u0000\u0000\u049e\u049f\u0001\u0000\u0000\u0000\u049f\u04a2"+ - "\u0001\u0000\u0000\u0000\u04a0\u049e\u0001\u0000\u0000\u0000\u04a1\u04a3"+ - "\u0005:\u0000\u0000\u04a2\u04a1\u0001\u0000\u0000\u0000\u04a3\u04a4\u0001"+ - "\u0000\u0000\u0000\u04a4\u04a2\u0001\u0000\u0000\u0000\u04a4\u04a5\u0001"+ - "\u0000\u0000\u0000\u04a5\u04a6\u0001\u0000\u0000\u0000\u04a6\u04a7\u0005"+ - ")\u0000\u0000\u04a7\u04a8\u0001\u0000\u0000\u0000\u04a8\u04a9\u0006\u0094"+ - "\u0000\u0000\u04a9\u012a\u0001\u0000\u0000\u0000\u04aa\u04ab\b\f\u0000"+ - "\u0000\u04ab\u012c\u0001\u0000\u0000\u0000\u0012\u0000\u0439\u043b\u0443"+ - "\u0459\u0464\u0467\u0470\u0473\u0475\u0479\u0480\u048a\u048e\u0492\u049c"+ - "\u049e\u04a4\u0001\u0000\u0001\u0000"; + "\u0000\u011d\u0001\u0000\u0000\u0000\u0000\u011f\u0001\u0000\u0000\u0000"+ + "\u0000\u0123\u0001\u0000\u0000\u0000\u0000\u0125\u0001\u0000\u0000\u0000"+ + "\u0000\u012b\u0001\u0000\u0000\u0000\u0000\u012d\u0001\u0000\u0000\u0000"+ + "\u0001\u012f\u0001\u0000\u0000\u0000\u0003\u0131\u0001\u0000\u0000\u0000"+ + "\u0005\u0138\u0001\u0000\u0000\u0000\u0007\u0142\u0001\u0000\u0000\u0000"+ + "\t\u0144\u0001\u0000\u0000\u0000\u000b\u0146\u0001\u0000\u0000\u0000\r"+ + "\u0149\u0001\u0000\u0000\u0000\u000f\u014b\u0001\u0000\u0000\u0000\u0011"+ + "\u014d\u0001\u0000\u0000\u0000\u0013\u014f\u0001\u0000\u0000\u0000\u0015"+ + "\u0151\u0001\u0000\u0000\u0000\u0017\u0153\u0001\u0000\u0000\u0000\u0019"+ + "\u0155\u0001\u0000\u0000\u0000\u001b\u0157\u0001\u0000\u0000\u0000\u001d"+ + "\u0159\u0001\u0000\u0000\u0000\u001f\u0162\u0001\u0000\u0000\u0000!\u016a"+ + "\u0001\u0000\u0000\u0000#\u0179\u0001\u0000\u0000\u0000%\u017b\u0001\u0000"+ + "\u0000\u0000\'\u018d\u0001\u0000\u0000\u0000)\u01a0\u0001\u0000\u0000"+ + "\u0000+\u01a9\u0001\u0000\u0000\u0000-\u01b4\u0001\u0000\u0000\u0000/"+ + "\u01b8\u0001\u0000\u0000\u00001\u01c0\u0001\u0000\u0000\u00003\u01ca\u0001"+ + "\u0000\u0000\u00005\u01d5\u0001\u0000\u0000\u00007\u01db\u0001\u0000\u0000"+ + "\u00009\u01ed\u0001\u0000\u0000\u0000;\u01f4\u0001\u0000\u0000\u0000="+ + "\u01fd\u0001\u0000\u0000\u0000?\u0206\u0001\u0000\u0000\u0000A\u020d\u0001"+ + "\u0000\u0000\u0000C\u0215\u0001\u0000\u0000\u0000E\u021d\u0001\u0000\u0000"+ + "\u0000G\u0224\u0001\u0000\u0000\u0000I\u0227\u0001\u0000\u0000\u0000K"+ + "\u022a\u0001\u0000\u0000\u0000M\u022d\u0001\u0000\u0000\u0000O\u0230\u0001"+ + "\u0000\u0000\u0000Q\u0233\u0001\u0000\u0000\u0000S\u0236\u0001\u0000\u0000"+ + "\u0000U\u0239\u0001\u0000\u0000\u0000W\u023b\u0001\u0000\u0000\u0000Y"+ + "\u023e\u0001\u0000\u0000\u0000[\u0240\u0001\u0000\u0000\u0000]\u0243\u0001"+ + "\u0000\u0000\u0000_\u0246\u0001\u0000\u0000\u0000a\u0248\u0001\u0000\u0000"+ + "\u0000c\u024a\u0001\u0000\u0000\u0000e\u024e\u0001\u0000\u0000\u0000g"+ + "\u0253\u0001\u0000\u0000\u0000i\u0257\u0001\u0000\u0000\u0000k\u0259\u0001"+ + "\u0000\u0000\u0000m\u025b\u0001\u0000\u0000\u0000o\u025d\u0001\u0000\u0000"+ + "\u0000q\u025f\u0001\u0000\u0000\u0000s\u0262\u0001\u0000\u0000\u0000u"+ + "\u0264\u0001\u0000\u0000\u0000w\u0267\u0001\u0000\u0000\u0000y\u026a\u0001"+ + "\u0000\u0000\u0000{\u026e\u0001\u0000\u0000\u0000}\u0272\u0001\u0000\u0000"+ + "\u0000\u007f\u0278\u0001\u0000\u0000\u0000\u0081\u027e\u0001\u0000\u0000"+ + "\u0000\u0083\u0281\u0001\u0000\u0000\u0000\u0085\u0287\u0001\u0000\u0000"+ + "\u0000\u0087\u028e\u0001\u0000\u0000\u0000\u0089\u0291\u0001\u0000\u0000"+ + "\u0000\u008b\u0294\u0001\u0000\u0000\u0000\u008d\u0297\u0001\u0000\u0000"+ + "\u0000\u008f\u029a\u0001\u0000\u0000\u0000\u0091\u02a3\u0001\u0000\u0000"+ + "\u0000\u0093\u02a9\u0001\u0000\u0000\u0000\u0095\u02af\u0001\u0000\u0000"+ + "\u0000\u0097\u02b6\u0001\u0000\u0000\u0000\u0099\u02c0\u0001\u0000\u0000"+ + "\u0000\u009b\u02cb\u0001\u0000\u0000\u0000\u009d\u02d0\u0001\u0000\u0000"+ + "\u0000\u009f\u02d6\u0001\u0000\u0000\u0000\u00a1\u02e0\u0001\u0000\u0000"+ + "\u0000\u00a3\u02ea\u0001\u0000\u0000\u0000\u00a5\u02f3\u0001\u0000\u0000"+ + "\u0000\u00a7\u02f9\u0001\u0000\u0000\u0000\u00a9\u0300\u0001\u0000\u0000"+ + "\u0000\u00ab\u0305\u0001\u0000\u0000\u0000\u00ad\u0309\u0001\u0000\u0000"+ + "\u0000\u00af\u030f\u0001\u0000\u0000\u0000\u00b1\u0317\u0001\u0000\u0000"+ + "\u0000\u00b3\u031c\u0001\u0000\u0000\u0000\u00b5\u0321\u0001\u0000\u0000"+ + "\u0000\u00b7\u032c\u0001\u0000\u0000\u0000\u00b9\u032f\u0001\u0000\u0000"+ + "\u0000\u00bb\u0333\u0001\u0000\u0000\u0000\u00bd\u0337\u0001\u0000\u0000"+ + "\u0000\u00bf\u033a\u0001\u0000\u0000\u0000\u00c1\u0343\u0001\u0000\u0000"+ + "\u0000\u00c3\u0346\u0001\u0000\u0000\u0000\u00c5\u0351\u0001\u0000\u0000"+ + "\u0000\u00c7\u0354\u0001\u0000\u0000\u0000\u00c9\u035a\u0001\u0000\u0000"+ + "\u0000\u00cb\u035f\u0001\u0000\u0000\u0000\u00cd\u0368\u0001\u0000\u0000"+ + "\u0000\u00cf\u0370\u0001\u0000\u0000\u0000\u00d1\u0377\u0001\u0000\u0000"+ + "\u0000\u00d3\u0381\u0001\u0000\u0000\u0000\u00d5\u0386\u0001\u0000\u0000"+ + "\u0000\u00d7\u038c\u0001\u0000\u0000\u0000\u00d9\u0391\u0001\u0000\u0000"+ + "\u0000\u00db\u039a\u0001\u0000\u0000\u0000\u00dd\u03a3\u0001\u0000\u0000"+ + "\u0000\u00df\u03ab\u0001\u0000\u0000\u0000\u00e1\u03b3\u0001\u0000\u0000"+ + "\u0000\u00e3\u03b8\u0001\u0000\u0000\u0000\u00e5\u03c1\u0001\u0000\u0000"+ + "\u0000\u00e7\u03c8\u0001\u0000\u0000\u0000\u00e9\u03cf\u0001\u0000\u0000"+ + "\u0000\u00eb\u03d6\u0001\u0000\u0000\u0000\u00ed\u03de\u0001\u0000\u0000"+ + "\u0000\u00ef\u03e3\u0001\u0000\u0000\u0000\u00f1\u03ea\u0001\u0000\u0000"+ + "\u0000\u00f3\u03f1\u0001\u0000\u0000\u0000\u00f5\u03f6\u0001\u0000\u0000"+ + "\u0000\u00f7\u03fc\u0001\u0000\u0000\u0000\u00f9\u0401\u0001\u0000\u0000"+ + "\u0000\u00fb\u040a\u0001\u0000\u0000\u0000\u00fd\u040f\u0001\u0000\u0000"+ + "\u0000\u00ff\u0418\u0001\u0000\u0000\u0000\u0101\u041e\u0001\u0000\u0000"+ + "\u0000\u0103\u0423\u0001\u0000\u0000\u0000\u0105\u042c\u0001\u0000\u0000"+ + "\u0000\u0107\u0431\u0001\u0000\u0000\u0000\u0109\u043b\u0001\u0000\u0000"+ + "\u0000\u010b\u0441\u0001\u0000\u0000\u0000\u010d\u044b\u0001\u0000\u0000"+ + "\u0000\u010f\u0450\u0001\u0000\u0000\u0000\u0111\u0456\u0001\u0000\u0000"+ + "\u0000\u0113\u0458\u0001\u0000\u0000\u0000\u0115\u045a\u0001\u0000\u0000"+ + "\u0000\u0117\u045f\u0001\u0000\u0000\u0000\u0119\u0464\u0001\u0000\u0000"+ + "\u0000\u011b\u0466\u0001\u0000\u0000\u0000\u011d\u0472\u0001\u0000\u0000"+ + "\u0000\u011f\u0480\u0001\u0000\u0000\u0000\u0121\u0489\u0001\u0000\u0000"+ + "\u0000\u0123\u048d\u0001\u0000\u0000\u0000\u0125\u0491\u0001\u0000\u0000"+ + "\u0000\u0127\u0499\u0001\u0000\u0000\u0000\u0129\u049d\u0001\u0000\u0000"+ + "\u0000\u012b\u049f\u0001\u0000\u0000\u0000\u012d\u04b5\u0001\u0000\u0000"+ + "\u0000\u012f\u0130\u0005;\u0000\u0000\u0130\u0002\u0001\u0000\u0000\u0000"+ + "\u0131\u0132\u0005m\u0000\u0000\u0132\u0133\u0005o\u0000\u0000\u0133\u0134"+ + "\u0005d\u0000\u0000\u0134\u0135\u0005u\u0000\u0000\u0135\u0136\u0005l"+ + "\u0000\u0000\u0136\u0137\u0005e\u0000\u0000\u0137\u0004\u0001\u0000\u0000"+ + "\u0000\u0138\u0139\u0005n\u0000\u0000\u0139\u013a\u0005a\u0000\u0000\u013a"+ + "\u013b\u0005m\u0000\u0000\u013b\u013c\u0005e\u0000\u0000\u013c\u013d\u0005"+ + "s\u0000\u0000\u013d\u013e\u0005p\u0000\u0000\u013e\u013f\u0005a\u0000"+ + "\u0000\u013f\u0140\u0005c\u0000\u0000\u0140\u0141\u0005e\u0000\u0000\u0141"+ + "\u0006\u0001\u0000\u0000\u0000\u0142\u0143\u0005=\u0000\u0000\u0143\b"+ + "\u0001\u0000\u0000\u0000\u0144\u0145\u0005$\u0000\u0000\u0145\n\u0001"+ + "\u0000\u0000\u0000\u0146\u0147\u0005:\u0000\u0000\u0147\u0148\u0005=\u0000"+ + "\u0000\u0148\f\u0001\u0000\u0000\u0000\u0149\u014a\u0005{\u0000\u0000"+ + "\u014a\u000e\u0001\u0000\u0000\u0000\u014b\u014c\u0005}\u0000\u0000\u014c"+ + "\u0010\u0001\u0000\u0000\u0000\u014d\u014e\u0005(\u0000\u0000\u014e\u0012"+ + "\u0001\u0000\u0000\u0000\u014f\u0150\u0005)\u0000\u0000\u0150\u0014\u0001"+ + "\u0000\u0000\u0000\u0151\u0152\u0005*\u0000\u0000\u0152\u0016\u0001\u0000"+ + "\u0000\u0000\u0153\u0154\u0005|\u0000\u0000\u0154\u0018\u0001\u0000\u0000"+ + "\u0000\u0155\u0156\u0005%\u0000\u0000\u0156\u001a\u0001\u0000\u0000\u0000"+ + "\u0157\u0158\u0005,\u0000\u0000\u0158\u001c\u0001\u0000\u0000\u0000\u0159"+ + "\u015a\u0005o\u0000\u0000\u015a\u015b\u0005r\u0000\u0000\u015b\u015c\u0005"+ + "d\u0000\u0000\u015c\u015d\u0005e\u0000\u0000\u015d\u015e\u0005r\u0000"+ + "\u0000\u015e\u015f\u0005i\u0000\u0000\u015f\u0160\u0005n\u0000\u0000\u0160"+ + "\u0161\u0005g\u0000\u0000\u0161\u001e\u0001\u0000\u0000\u0000\u0162\u0163"+ + "\u0005o\u0000\u0000\u0163\u0164\u0005r\u0000\u0000\u0164\u0165\u0005d"+ + "\u0000\u0000\u0165\u0166\u0005e\u0000\u0000\u0166\u0167\u0005r\u0000\u0000"+ + "\u0167\u0168\u0005e\u0000\u0000\u0168\u0169\u0005d\u0000\u0000\u0169 "+ + "\u0001\u0000\u0000\u0000\u016a\u016b\u0005d\u0000\u0000\u016b\u016c\u0005"+ + "e\u0000\u0000\u016c\u016d\u0005c\u0000\u0000\u016d\u016e\u0005i\u0000"+ + "\u0000\u016e\u016f\u0005m\u0000\u0000\u016f\u0170\u0005a\u0000\u0000\u0170"+ + "\u0171\u0005l\u0000\u0000\u0171\u0172\u0005-\u0000\u0000\u0172\u0173\u0005"+ + "f\u0000\u0000\u0173\u0174\u0005o\u0000\u0000\u0174\u0175\u0005r\u0000"+ + "\u0000\u0175\u0176\u0005m\u0000\u0000\u0176\u0177\u0005a\u0000\u0000\u0177"+ + "\u0178\u0005t\u0000\u0000\u0178\"\u0001\u0000\u0000\u0000\u0179\u017a"+ + "\u0005:\u0000\u0000\u017a$\u0001\u0000\u0000\u0000\u017b\u017c\u0005d"+ + "\u0000\u0000\u017c\u017d\u0005e\u0000\u0000\u017d\u017e\u0005c\u0000\u0000"+ + "\u017e\u017f\u0005i\u0000\u0000\u017f\u0180\u0005m\u0000\u0000\u0180\u0181"+ + "\u0005a\u0000\u0000\u0181\u0182\u0005l\u0000\u0000\u0182\u0183\u0005-"+ + "\u0000\u0000\u0183\u0184\u0005s\u0000\u0000\u0184\u0185\u0005e\u0000\u0000"+ + "\u0185\u0186\u0005p\u0000\u0000\u0186\u0187\u0005a\u0000\u0000\u0187\u0188"+ + "\u0005r\u0000\u0000\u0188\u0189\u0005a\u0000\u0000\u0189\u018a\u0005t"+ + "\u0000\u0000\u018a\u018b\u0005o\u0000\u0000\u018b\u018c\u0005r\u0000\u0000"+ + "\u018c&\u0001\u0000\u0000\u0000\u018d\u018e\u0005g\u0000\u0000\u018e\u018f"+ + "\u0005r\u0000\u0000\u018f\u0190\u0005o\u0000\u0000\u0190\u0191\u0005u"+ + "\u0000\u0000\u0191\u0192\u0005p\u0000\u0000\u0192\u0193\u0005i\u0000\u0000"+ + "\u0193\u0194\u0005n\u0000\u0000\u0194\u0195\u0005g\u0000\u0000\u0195\u0196"+ + "\u0005-\u0000\u0000\u0196\u0197\u0005s\u0000\u0000\u0197\u0198\u0005e"+ + "\u0000\u0000\u0198\u0199\u0005p\u0000\u0000\u0199\u019a\u0005a\u0000\u0000"+ + "\u019a\u019b\u0005r\u0000\u0000\u019b\u019c\u0005a\u0000\u0000\u019c\u019d"+ + "\u0005t\u0000\u0000\u019d\u019e\u0005o\u0000\u0000\u019e\u019f\u0005r"+ + "\u0000\u0000\u019f(\u0001\u0000\u0000\u0000\u01a0\u01a1\u0005i\u0000\u0000"+ + "\u01a1\u01a2\u0005n\u0000\u0000\u01a2\u01a3\u0005f\u0000\u0000\u01a3\u01a4"+ + "\u0005i\u0000\u0000\u01a4\u01a5\u0005n\u0000\u0000\u01a5\u01a6\u0005i"+ + "\u0000\u0000\u01a6\u01a7\u0005t\u0000\u0000\u01a7\u01a8\u0005y\u0000\u0000"+ + "\u01a8*\u0001\u0000\u0000\u0000\u01a9\u01aa\u0005m\u0000\u0000\u01aa\u01ab"+ + "\u0005i\u0000\u0000\u01ab\u01ac\u0005n\u0000\u0000\u01ac\u01ad\u0005u"+ + "\u0000\u0000\u01ad\u01ae\u0005s\u0000\u0000\u01ae\u01af\u0005-\u0000\u0000"+ + "\u01af\u01b0\u0005s\u0000\u0000\u01b0\u01b1\u0005i\u0000\u0000\u01b1\u01b2"+ + "\u0005g\u0000\u0000\u01b2\u01b3\u0005n\u0000\u0000\u01b3,\u0001\u0000"+ + "\u0000\u0000\u01b4\u01b5\u0005N\u0000\u0000\u01b5\u01b6\u0005a\u0000\u0000"+ + "\u01b6\u01b7\u0005N\u0000\u0000\u01b7.\u0001\u0000\u0000\u0000\u01b8\u01b9"+ + "\u0005p\u0000\u0000\u01b9\u01ba\u0005e\u0000\u0000\u01ba\u01bb\u0005r"+ + "\u0000\u0000\u01bb\u01bc\u0005c\u0000\u0000\u01bc\u01bd\u0005e\u0000\u0000"+ + "\u01bd\u01be\u0005n\u0000\u0000\u01be\u01bf\u0005t\u0000\u0000\u01bf0"+ + "\u0001\u0000\u0000\u0000\u01c0\u01c1\u0005p\u0000\u0000\u01c1\u01c2\u0005"+ + "e\u0000\u0000\u01c2\u01c3\u0005r\u0000\u0000\u01c3\u01c4\u0005-\u0000"+ + "\u0000\u01c4\u01c5\u0005m\u0000\u0000\u01c5\u01c6\u0005i\u0000\u0000\u01c6"+ + "\u01c7\u0005l\u0000\u0000\u01c7\u01c8\u0005l\u0000\u0000\u01c8\u01c9\u0005"+ + "e\u0000\u0000\u01c92\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005z\u0000"+ + "\u0000\u01cb\u01cc\u0005e\u0000\u0000\u01cc\u01cd\u0005r\u0000\u0000\u01cd"+ + "\u01ce\u0005o\u0000\u0000\u01ce\u01cf\u0005-\u0000\u0000\u01cf\u01d0\u0005"+ + "d\u0000\u0000\u01d0\u01d1\u0005i\u0000\u0000\u01d1\u01d2\u0005g\u0000"+ + "\u0000\u01d2\u01d3\u0005i\u0000\u0000\u01d3\u01d4\u0005t\u0000\u0000\u01d4"+ + "4\u0001\u0000\u0000\u0000\u01d5\u01d6\u0005d\u0000\u0000\u01d6\u01d7\u0005"+ + "i\u0000\u0000\u01d7\u01d8\u0005g\u0000\u0000\u01d8\u01d9\u0005i\u0000"+ + "\u0000\u01d9\u01da\u0005t\u0000\u0000\u01da6\u0001\u0000\u0000\u0000\u01db"+ + "\u01dc\u0005p\u0000\u0000\u01dc\u01dd\u0005a\u0000\u0000\u01dd\u01de\u0005"+ + "t\u0000\u0000\u01de\u01df\u0005t\u0000\u0000\u01df\u01e0\u0005e\u0000"+ + "\u0000\u01e0\u01e1\u0005r\u0000\u0000\u01e1\u01e2\u0005n\u0000\u0000\u01e2"+ + "\u01e3\u0005-\u0000\u0000\u01e3\u01e4\u0005s\u0000\u0000\u01e4\u01e5\u0005"+ + "e\u0000\u0000\u01e5\u01e6\u0005p\u0000\u0000\u01e6\u01e7\u0005a\u0000"+ + "\u0000\u01e7\u01e8\u0005r\u0000\u0000\u01e8\u01e9\u0005a\u0000\u0000\u01e9"+ + "\u01ea\u0005t\u0000\u0000\u01ea\u01eb\u0005o\u0000\u0000\u01eb\u01ec\u0005"+ + "r\u0000\u0000\u01ec8\u0001\u0000\u0000\u0000\u01ed\u01ee\u0005i\u0000"+ + "\u0000\u01ee\u01ef\u0005m\u0000\u0000\u01ef\u01f0\u0005p\u0000\u0000\u01f0"+ + "\u01f1\u0005o\u0000\u0000\u01f1\u01f2\u0005r\u0000\u0000\u01f2\u01f3\u0005"+ + "t\u0000\u0000\u01f3:\u0001\u0000\u0000\u0000\u01f4\u01f5\u0005e\u0000"+ + "\u0000\u01f5\u01f6\u0005x\u0000\u0000\u01f6\u01f7\u0005t\u0000\u0000\u01f7"+ + "\u01f8\u0005e\u0000\u0000\u01f8\u01f9\u0005r\u0000\u0000\u01f9\u01fa\u0005"+ + "n\u0000\u0000\u01fa\u01fb\u0005a\u0000\u0000\u01fb\u01fc\u0005l\u0000"+ + "\u0000\u01fc<\u0001\u0000\u0000\u0000\u01fd\u01fe\u0005f\u0000\u0000\u01fe"+ + "\u01ff\u0005u\u0000\u0000\u01ff\u0200\u0005n\u0000\u0000\u0200\u0201\u0005"+ + "c\u0000\u0000\u0201\u0202\u0005t\u0000\u0000\u0202\u0203\u0005i\u0000"+ + "\u0000\u0203\u0204\u0005o\u0000\u0000\u0204\u0205\u0005n\u0000\u0000\u0205"+ + ">\u0001\u0000\u0000\u0000\u0206\u0207\u0005j\u0000\u0000\u0207\u0208\u0005"+ + "s\u0000\u0000\u0208\u0209\u0005o\u0000\u0000\u0209\u020a\u0005u\u0000"+ + "\u0000\u020a\u020b\u0005n\u0000\u0000\u020b\u020c\u0005d\u0000\u0000\u020c"+ + "@\u0001\u0000\u0000\u0000\u020d\u020e\u0005c\u0000\u0000\u020e\u020f\u0005"+ + "o\u0000\u0000\u020f\u0210\u0005m\u0000\u0000\u0210\u0211\u0005p\u0000"+ + "\u0000\u0211\u0212\u0005a\u0000\u0000\u0212\u0213\u0005c\u0000\u0000\u0213"+ + "\u0214\u0005t\u0000\u0000\u0214B\u0001\u0000\u0000\u0000\u0215\u0216\u0005"+ + "v\u0000\u0000\u0216\u0217\u0005e\u0000\u0000\u0217\u0218\u0005r\u0000"+ + "\u0000\u0218\u0219\u0005b\u0000\u0000\u0219\u021a\u0005o\u0000\u0000\u021a"+ + "\u021b\u0005s\u0000\u0000\u021b\u021c\u0005e\u0000\u0000\u021cD\u0001"+ + "\u0000\u0000\u0000\u021d\u021e\u0005s\u0000\u0000\u021e\u021f\u0005c\u0000"+ + "\u0000\u021f\u0220\u0005h\u0000\u0000\u0220\u0221\u0005e\u0000\u0000\u0221"+ + "\u0222\u0005m\u0000\u0000\u0222\u0223\u0005a\u0000\u0000\u0223F\u0001"+ + "\u0000\u0000\u0000\u0224\u0225\u0005e\u0000\u0000\u0225\u0226\u0005q\u0000"+ + "\u0000\u0226H\u0001\u0000\u0000\u0000\u0227\u0228\u0005n\u0000\u0000\u0228"+ + "\u0229\u0005e\u0000\u0000\u0229J\u0001\u0000\u0000\u0000\u022a\u022b\u0005"+ + "l\u0000\u0000\u022b\u022c\u0005t\u0000\u0000\u022cL\u0001\u0000\u0000"+ + "\u0000\u022d\u022e\u0005l\u0000\u0000\u022e\u022f\u0005e\u0000\u0000\u022f"+ + "N\u0001\u0000\u0000\u0000\u0230\u0231\u0005g\u0000\u0000\u0231\u0232\u0005"+ + "t\u0000\u0000\u0232P\u0001\u0000\u0000\u0000\u0233\u0234\u0005g\u0000"+ + "\u0000\u0234\u0235\u0005e\u0000\u0000\u0235R\u0001\u0000\u0000\u0000\u0236"+ + "\u0237\u0005!\u0000\u0000\u0237\u0238\u0005=\u0000\u0000\u0238T\u0001"+ + "\u0000\u0000\u0000\u0239\u023a\u0005<\u0000\u0000\u023aV\u0001\u0000\u0000"+ + "\u0000\u023b\u023c\u0005<\u0000\u0000\u023c\u023d\u0005=\u0000\u0000\u023d"+ + "X\u0001\u0000\u0000\u0000\u023e\u023f\u0005>\u0000\u0000\u023fZ\u0001"+ + "\u0000\u0000\u0000\u0240\u0241\u0005>\u0000\u0000\u0241\u0242\u0005=\u0000"+ + "\u0000\u0242\\\u0001\u0000\u0000\u0000\u0243\u0244\u0005|\u0000\u0000"+ + "\u0244\u0245\u0005|\u0000\u0000\u0245^\u0001\u0000\u0000\u0000\u0246\u0247"+ + "\u0005+\u0000\u0000\u0247`\u0001\u0000\u0000\u0000\u0248\u0249\u0005-"+ + "\u0000\u0000\u0249b\u0001\u0000\u0000\u0000\u024a\u024b\u0005d\u0000\u0000"+ + "\u024b\u024c\u0005i\u0000\u0000\u024c\u024d\u0005v\u0000\u0000\u024dd"+ + "\u0001\u0000\u0000\u0000\u024e\u024f\u0005i\u0000\u0000\u024f\u0250\u0005"+ + "d\u0000\u0000\u0250\u0251\u0005i\u0000\u0000\u0251\u0252\u0005v\u0000"+ + "\u0000\u0252f\u0001\u0000\u0000\u0000\u0253\u0254\u0005m\u0000\u0000\u0254"+ + "\u0255\u0005o\u0000\u0000\u0255\u0256\u0005d\u0000\u0000\u0256h\u0001"+ + "\u0000\u0000\u0000\u0257\u0258\u0005!\u0000\u0000\u0258j\u0001\u0000\u0000"+ + "\u0000\u0259\u025a\u0005[\u0000\u0000\u025al\u0001\u0000\u0000\u0000\u025b"+ + "\u025c\u0005]\u0000\u0000\u025cn\u0001\u0000\u0000\u0000\u025d\u025e\u0005"+ + ".\u0000\u0000\u025ep\u0001\u0000\u0000\u0000\u025f\u0260\u0005$\u0000"+ + "\u0000\u0260\u0261\u0005$\u0000\u0000\u0261r\u0001\u0000\u0000\u0000\u0262"+ + "\u0263\u0005#\u0000\u0000\u0263t\u0001\u0000\u0000\u0000\u0264\u0265\u0005"+ + "{\u0000\u0000\u0265\u0266\u0005|\u0000\u0000\u0266v\u0001\u0000\u0000"+ + "\u0000\u0267\u0268\u0005|\u0000\u0000\u0268\u0269\u0005}\u0000\u0000\u0269"+ + "x\u0001\u0000\u0000\u0000\u026a\u026b\u0005f\u0000\u0000\u026b\u026c\u0005"+ + "o\u0000\u0000\u026c\u026d\u0005r\u0000\u0000\u026dz\u0001\u0000\u0000"+ + "\u0000\u026e\u026f\u0005l\u0000\u0000\u026f\u0270\u0005e\u0000\u0000\u0270"+ + "\u0271\u0005t\u0000\u0000\u0271|\u0001\u0000\u0000\u0000\u0272\u0273\u0005"+ + "w\u0000\u0000\u0273\u0274\u0005h\u0000\u0000\u0274\u0275\u0005e\u0000"+ + "\u0000\u0275\u0276\u0005r\u0000\u0000\u0276\u0277\u0005e\u0000\u0000\u0277"+ + "~\u0001\u0000\u0000\u0000\u0278\u0279\u0005g\u0000\u0000\u0279\u027a\u0005"+ + "r\u0000\u0000\u027a\u027b\u0005o\u0000\u0000\u027b\u027c\u0005u\u0000"+ + "\u0000\u027c\u027d\u0005p\u0000\u0000\u027d\u0080\u0001\u0000\u0000\u0000"+ + "\u027e\u027f\u0005b\u0000\u0000\u027f\u0280\u0005y\u0000\u0000\u0280\u0082"+ + "\u0001\u0000\u0000\u0000\u0281\u0282\u0005o\u0000\u0000\u0282\u0283\u0005"+ + "r\u0000\u0000\u0283\u0284\u0005d\u0000\u0000\u0284\u0285\u0005e\u0000"+ + "\u0000\u0285\u0286\u0005r\u0000\u0000\u0286\u0084\u0001\u0000\u0000\u0000"+ + "\u0287\u0288\u0005r\u0000\u0000\u0288\u0289\u0005e\u0000\u0000\u0289\u028a"+ + "\u0005t\u0000\u0000\u028a\u028b\u0005u\u0000\u0000\u028b\u028c\u0005r"+ + "\u0000\u0000\u028c\u028d\u0005n\u0000\u0000\u028d\u0086\u0001\u0000\u0000"+ + "\u0000\u028e\u028f\u0005i\u0000\u0000\u028f\u0290\u0005f\u0000\u0000\u0290"+ + "\u0088\u0001\u0000\u0000\u0000\u0291\u0292\u0005i\u0000\u0000\u0292\u0293"+ + "\u0005n\u0000\u0000\u0293\u008a\u0001\u0000\u0000\u0000\u0294\u0295\u0005"+ + "a\u0000\u0000\u0295\u0296\u0005s\u0000\u0000\u0296\u008c\u0001\u0000\u0000"+ + "\u0000\u0297\u0298\u0005a\u0000\u0000\u0298\u0299\u0005t\u0000\u0000\u0299"+ + "\u008e\u0001\u0000\u0000\u0000\u029a\u029b\u0005a\u0000\u0000\u029b\u029c"+ + "\u0005l\u0000\u0000\u029c\u029d\u0005l\u0000\u0000\u029d\u029e\u0005o"+ + "\u0000\u0000\u029e\u029f\u0005w\u0000\u0000\u029f\u02a0\u0005i\u0000\u0000"+ + "\u02a0\u02a1\u0005n\u0000\u0000\u02a1\u02a2\u0005g\u0000\u0000\u02a2\u0090"+ + "\u0001\u0000\u0000\u0000\u02a3\u02a4\u0005e\u0000\u0000\u02a4\u02a5\u0005"+ + "m\u0000\u0000\u02a5\u02a6\u0005p\u0000\u0000\u02a6\u02a7\u0005t\u0000"+ + "\u0000\u02a7\u02a8\u0005y\u0000\u0000\u02a8\u0092\u0001\u0000\u0000\u0000"+ + "\u02a9\u02aa\u0005c\u0000\u0000\u02aa\u02ab\u0005o\u0000\u0000\u02ab\u02ac"+ + "\u0005u\u0000\u0000\u02ac\u02ad\u0005n\u0000\u0000\u02ad\u02ae\u0005t"+ + "\u0000\u0000\u02ae\u0094\u0001\u0000\u0000\u0000\u02af\u02b0\u0005s\u0000"+ + "\u0000\u02b0\u02b1\u0005t\u0000\u0000\u02b1\u02b2\u0005a\u0000\u0000\u02b2"+ + "\u02b3\u0005b\u0000\u0000\u02b3\u02b4\u0005l\u0000\u0000\u02b4\u02b5\u0005"+ + "e\u0000\u0000\u02b5\u0096\u0001\u0000\u0000\u0000\u02b6\u02b7\u0005a\u0000"+ + "\u0000\u02b7\u02b8\u0005s\u0000\u0000\u02b8\u02b9\u0005c\u0000\u0000\u02b9"+ + "\u02ba\u0005e\u0000\u0000\u02ba\u02bb\u0005n\u0000\u0000\u02bb\u02bc\u0005"+ + "d\u0000\u0000\u02bc\u02bd\u0005i\u0000\u0000\u02bd\u02be\u0005n\u0000"+ + "\u0000\u02be\u02bf\u0005g\u0000\u0000\u02bf\u0098\u0001\u0000\u0000\u0000"+ + "\u02c0\u02c1\u0005d\u0000\u0000\u02c1\u02c2\u0005e\u0000\u0000\u02c2\u02c3"+ + "\u0005s\u0000\u0000\u02c3\u02c4\u0005c\u0000\u0000\u02c4\u02c5\u0005e"+ + "\u0000\u0000\u02c5\u02c6\u0005n\u0000\u0000\u02c6\u02c7\u0005d\u0000\u0000"+ + "\u02c7\u02c8\u0005i\u0000\u0000\u02c8\u02c9\u0005n\u0000\u0000\u02c9\u02ca"+ + "\u0005g\u0000\u0000\u02ca\u009a\u0001\u0000\u0000\u0000\u02cb\u02cc\u0005"+ + "s\u0000\u0000\u02cc\u02cd\u0005o\u0000\u0000\u02cd\u02ce\u0005m\u0000"+ + "\u0000\u02ce\u02cf\u0005e\u0000\u0000\u02cf\u009c\u0001\u0000\u0000\u0000"+ + "\u02d0\u02d1\u0005e\u0000\u0000\u02d1\u02d2\u0005v\u0000\u0000\u02d2\u02d3"+ + "\u0005e\u0000\u0000\u02d3\u02d4\u0005r\u0000\u0000\u02d4\u02d5\u0005y"+ + "\u0000\u0000\u02d5\u009e\u0001\u0000\u0000\u0000\u02d6\u02d7\u0005s\u0000"+ + "\u0000\u02d7\u02d8\u0005a\u0000\u0000\u02d8\u02d9\u0005t\u0000\u0000\u02d9"+ + "\u02da\u0005i\u0000\u0000\u02da\u02db\u0005s\u0000\u0000\u02db\u02dc\u0005"+ + "f\u0000\u0000\u02dc\u02dd\u0005i\u0000\u0000\u02dd\u02de\u0005e\u0000"+ + "\u0000\u02de\u02df\u0005s\u0000\u0000\u02df\u00a0\u0001\u0000\u0000\u0000"+ + "\u02e0\u02e1\u0005c\u0000\u0000\u02e1\u02e2\u0005o\u0000\u0000\u02e2\u02e3"+ + "\u0005l\u0000\u0000\u02e3\u02e4\u0005l\u0000\u0000\u02e4\u02e5\u0005a"+ + "\u0000\u0000\u02e5\u02e6\u0005t\u0000\u0000\u02e6\u02e7\u0005i\u0000\u0000"+ + "\u02e7\u02e8\u0005o\u0000\u0000\u02e8\u02e9\u0005n\u0000\u0000\u02e9\u00a2"+ + "\u0001\u0000\u0000\u0000\u02ea\u02eb\u0005g\u0000\u0000\u02eb\u02ec\u0005"+ + "r\u0000\u0000\u02ec\u02ed\u0005e\u0000\u0000\u02ed\u02ee\u0005a\u0000"+ + "\u0000\u02ee\u02ef\u0005t\u0000\u0000\u02ef\u02f0\u0005e\u0000\u0000\u02f0"+ + "\u02f1\u0005s\u0000\u0000\u02f1\u02f2\u0005t\u0000\u0000\u02f2\u00a4\u0001"+ + "\u0000\u0000\u0000\u02f3\u02f4\u0005l\u0000\u0000\u02f4\u02f5\u0005e\u0000"+ + "\u0000\u02f5\u02f6\u0005a\u0000\u0000\u02f6\u02f7\u0005s\u0000\u0000\u02f7"+ + "\u02f8\u0005t\u0000\u0000\u02f8\u00a6\u0001\u0000\u0000\u0000\u02f9\u02fa"+ + "\u0005s\u0000\u0000\u02fa\u02fb\u0005w\u0000\u0000\u02fb\u02fc\u0005i"+ + "\u0000\u0000\u02fc\u02fd\u0005t\u0000\u0000\u02fd\u02fe\u0005c\u0000\u0000"+ + "\u02fe\u02ff\u0005h\u0000\u0000\u02ff\u00a8\u0001\u0000\u0000\u0000\u0300"+ + "\u0301\u0005c\u0000\u0000\u0301\u0302\u0005a\u0000\u0000\u0302\u0303\u0005"+ + "s\u0000\u0000\u0303\u0304\u0005e\u0000\u0000\u0304\u00aa\u0001\u0000\u0000"+ + "\u0000\u0305\u0306\u0005t\u0000\u0000\u0306\u0307\u0005r\u0000\u0000\u0307"+ + "\u0308\u0005y\u0000\u0000\u0308\u00ac\u0001\u0000\u0000\u0000\u0309\u030a"+ + "\u0005c\u0000\u0000\u030a\u030b\u0005a\u0000\u0000\u030b\u030c\u0005t"+ + "\u0000\u0000\u030c\u030d\u0005c\u0000\u0000\u030d\u030e\u0005h\u0000\u0000"+ + "\u030e\u00ae\u0001\u0000\u0000\u0000\u030f\u0310\u0005d\u0000\u0000\u0310"+ + "\u0311\u0005e\u0000\u0000\u0311\u0312\u0005f\u0000\u0000\u0312\u0313\u0005"+ + "a\u0000\u0000\u0313\u0314\u0005u\u0000\u0000\u0314\u0315\u0005l\u0000"+ + "\u0000\u0315\u0316\u0005t\u0000\u0000\u0316\u00b0\u0001\u0000\u0000\u0000"+ + "\u0317\u0318\u0005t\u0000\u0000\u0318\u0319\u0005h\u0000\u0000\u0319\u031a"+ + "\u0005e\u0000\u0000\u031a\u031b\u0005n\u0000\u0000\u031b\u00b2\u0001\u0000"+ + "\u0000\u0000\u031c\u031d\u0005e\u0000\u0000\u031d\u031e\u0005l\u0000\u0000"+ + "\u031e\u031f\u0005s\u0000\u0000\u031f\u0320\u0005e\u0000\u0000\u0320\u00b4"+ + "\u0001\u0000\u0000\u0000\u0321\u0322\u0005t\u0000\u0000\u0322\u0323\u0005"+ + "y\u0000\u0000\u0323\u0324\u0005p\u0000\u0000\u0324\u0325\u0005e\u0000"+ + "\u0000\u0325\u0326\u0005s\u0000\u0000\u0326\u0327\u0005w\u0000\u0000\u0327"+ + "\u0328\u0005i\u0000\u0000\u0328\u0329\u0005t\u0000\u0000\u0329\u032a\u0005"+ + "c\u0000\u0000\u032a\u032b\u0005h\u0000\u0000\u032b\u00b6\u0001\u0000\u0000"+ + "\u0000\u032c\u032d\u0005o\u0000\u0000\u032d\u032e\u0005r\u0000\u0000\u032e"+ + "\u00b8\u0001\u0000\u0000\u0000\u032f\u0330\u0005a\u0000\u0000\u0330\u0331"+ + "\u0005n\u0000\u0000\u0331\u0332\u0005d\u0000\u0000\u0332\u00ba\u0001\u0000"+ + "\u0000\u0000\u0333\u0334\u0005n\u0000\u0000\u0334\u0335\u0005o\u0000\u0000"+ + "\u0335\u0336\u0005t\u0000\u0000\u0336\u00bc\u0001\u0000\u0000\u0000\u0337"+ + "\u0338\u0005t\u0000\u0000\u0338\u0339\u0005o\u0000\u0000\u0339\u00be\u0001"+ + "\u0000\u0000\u0000\u033a\u033b\u0005i\u0000\u0000\u033b\u033c\u0005n\u0000"+ + "\u0000\u033c\u033d\u0005s\u0000\u0000\u033d\u033e\u0005t\u0000\u0000\u033e"+ + "\u033f\u0005a\u0000\u0000\u033f\u0340\u0005n\u0000\u0000\u0340\u0341\u0005"+ + "c\u0000\u0000\u0341\u0342\u0005e\u0000\u0000\u0342\u00c0\u0001\u0000\u0000"+ + "\u0000\u0343\u0344\u0005o\u0000\u0000\u0344\u0345\u0005f\u0000\u0000\u0345"+ + "\u00c2\u0001\u0000\u0000\u0000\u0346\u0347\u0005s\u0000\u0000\u0347\u0348"+ + "\u0005t\u0000\u0000\u0348\u0349\u0005a\u0000\u0000\u0349\u034a\u0005t"+ + "\u0000\u0000\u034a\u034b\u0005i\u0000\u0000\u034b\u034c\u0005c\u0000\u0000"+ + "\u034c\u034d\u0005a\u0000\u0000\u034d\u034e\u0005l\u0000\u0000\u034e\u034f"+ + "\u0005l\u0000\u0000\u034f\u0350\u0005y\u0000\u0000\u0350\u00c4\u0001\u0000"+ + "\u0000\u0000\u0351\u0352\u0005i\u0000\u0000\u0352\u0353\u0005s\u0000\u0000"+ + "\u0353\u00c6\u0001\u0000\u0000\u0000\u0354\u0355\u0005t\u0000\u0000\u0355"+ + "\u0356\u0005r\u0000\u0000\u0356\u0357\u0005e\u0000\u0000\u0357\u0358\u0005"+ + "a\u0000\u0000\u0358\u0359\u0005t\u0000\u0000\u0359\u00c8\u0001\u0000\u0000"+ + "\u0000\u035a\u035b\u0005c\u0000\u0000\u035b\u035c\u0005a\u0000\u0000\u035c"+ + "\u035d\u0005s\u0000\u0000\u035d\u035e\u0005t\u0000\u0000\u035e\u00ca\u0001"+ + "\u0000\u0000\u0000\u035f\u0360\u0005c\u0000\u0000\u0360\u0361\u0005a\u0000"+ + "\u0000\u0361\u0362\u0005s\u0000\u0000\u0362\u0363\u0005t\u0000\u0000\u0363"+ + "\u0364\u0005a\u0000\u0000\u0364\u0365\u0005b\u0000\u0000\u0365\u0366\u0005"+ + "l\u0000\u0000\u0366\u0367\u0005e\u0000\u0000\u0367\u00cc\u0001\u0000\u0000"+ + "\u0000\u0368\u0369\u0005v\u0000\u0000\u0369\u036a\u0005e\u0000\u0000\u036a"+ + "\u036b\u0005r\u0000\u0000\u036b\u036c\u0005s\u0000\u0000\u036c\u036d\u0005"+ + "i\u0000\u0000\u036d\u036e\u0005o\u0000\u0000\u036e\u036f\u0005n\u0000"+ + "\u0000\u036f\u00ce\u0001\u0000\u0000\u0000\u0370\u0371\u0005j\u0000\u0000"+ + "\u0371\u0372\u0005s\u0000\u0000\u0372\u0373\u0005o\u0000\u0000\u0373\u0374"+ + "\u0005n\u0000\u0000\u0374\u0375\u0005i\u0000\u0000\u0375\u0376\u0005q"+ + "\u0000\u0000\u0376\u00d0\u0001\u0000\u0000\u0000\u0377\u0378\u0005u\u0000"+ + "\u0000\u0378\u0379\u0005n\u0000\u0000\u0379\u037a\u0005o\u0000\u0000\u037a"+ + "\u037b\u0005r\u0000\u0000\u037b\u037c\u0005d\u0000\u0000\u037c\u037d\u0005"+ + "e\u0000\u0000\u037d\u037e\u0005r\u0000\u0000\u037e\u037f\u0005e\u0000"+ + "\u0000\u037f\u0380\u0005d\u0000\u0000\u0380\u00d2\u0001\u0000\u0000\u0000"+ + "\u0381\u0382\u0005t\u0000\u0000\u0382\u0383\u0005r\u0000\u0000\u0383\u0384"+ + "\u0005u\u0000\u0000\u0384\u0385\u0005e\u0000\u0000\u0385\u00d4\u0001\u0000"+ + "\u0000\u0000\u0386\u0387\u0005f\u0000\u0000\u0387\u0388\u0005a\u0000\u0000"+ + "\u0388\u0389\u0005l\u0000\u0000\u0389\u038a\u0005s\u0000\u0000\u038a\u038b"+ + "\u0005e\u0000\u0000\u038b\u00d6\u0001\u0000\u0000\u0000\u038c\u038d\u0005"+ + "t\u0000\u0000\u038d\u038e\u0005y\u0000\u0000\u038e\u038f\u0005p\u0000"+ + "\u0000\u038f\u0390\u0005e\u0000\u0000\u0390\u00d8\u0001\u0000\u0000\u0000"+ + "\u0391\u0392\u0005v\u0000\u0000\u0392\u0393\u0005a\u0000\u0000\u0393\u0394"+ + "\u0005l\u0000\u0000\u0394\u0395\u0005i\u0000\u0000\u0395\u0396\u0005d"+ + "\u0000\u0000\u0396\u0397\u0005a\u0000\u0000\u0397\u0398\u0005t\u0000\u0000"+ + "\u0398\u0399\u0005e\u0000\u0000\u0399\u00da\u0001\u0000\u0000\u0000\u039a"+ + "\u039b\u0005a\u0000\u0000\u039b\u039c\u0005n\u0000\u0000\u039c\u039d\u0005"+ + "n\u0000\u0000\u039d\u039e\u0005o\u0000\u0000\u039e\u039f\u0005t\u0000"+ + "\u0000\u039f\u03a0\u0005a\u0000\u0000\u03a0\u03a1\u0005t\u0000\u0000\u03a1"+ + "\u03a2\u0005e\u0000\u0000\u03a2\u00dc\u0001\u0000\u0000\u0000\u03a3\u03a4"+ + "\u0005d\u0000\u0000\u03a4\u03a5\u0005e\u0000\u0000\u03a5\u03a6\u0005c"+ + "\u0000\u0000\u03a6\u03a7\u0005l\u0000\u0000\u03a7\u03a8\u0005a\u0000\u0000"+ + "\u03a8\u03a9\u0005r\u0000\u0000\u03a9\u03aa\u0005e\u0000\u0000\u03aa\u00de"+ + "\u0001\u0000\u0000\u0000\u03ab\u03ac\u0005c\u0000\u0000\u03ac\u03ad\u0005"+ + "o\u0000\u0000\u03ad\u03ae\u0005n\u0000\u0000\u03ae\u03af\u0005t\u0000"+ + "\u0000\u03af\u03b0\u0005e\u0000\u0000\u03b0\u03b1\u0005x\u0000\u0000\u03b1"+ + "\u03b2\u0005t\u0000\u0000\u03b2\u00e0\u0001\u0000\u0000\u0000\u03b3\u03b4"+ + "\u0005i\u0000\u0000\u03b4\u03b5\u0005t\u0000\u0000\u03b5\u03b6\u0005e"+ + "\u0000\u0000\u03b6\u03b7\u0005m\u0000\u0000\u03b7\u00e2\u0001\u0000\u0000"+ + "\u0000\u03b8\u03b9\u0005v\u0000\u0000\u03b9\u03ba\u0005a\u0000\u0000\u03ba"+ + "\u03bb\u0005r\u0000\u0000\u03bb\u03bc\u0005i\u0000\u0000\u03bc\u03bd\u0005"+ + "a\u0000\u0000\u03bd\u03be\u0005b\u0000\u0000\u03be\u03bf\u0005l\u0000"+ + "\u0000\u03bf\u03c0\u0005e\u0000\u0000\u03c0\u00e4\u0001\u0000\u0000\u0000"+ + "\u03c1\u03c2\u0005i\u0000\u0000\u03c2\u03c3\u0005n\u0000\u0000\u03c3\u03c4"+ + "\u0005s\u0000\u0000\u03c4\u03c5\u0005e\u0000\u0000\u03c5\u03c6\u0005r"+ + "\u0000\u0000\u03c6\u03c7\u0005t\u0000\u0000\u03c7\u00e6\u0001\u0000\u0000"+ + "\u0000\u03c8\u03c9\u0005d\u0000\u0000\u03c9\u03ca\u0005e\u0000\u0000\u03ca"+ + "\u03cb\u0005l\u0000\u0000\u03cb\u03cc\u0005e\u0000\u0000\u03cc\u03cd\u0005"+ + "t\u0000\u0000\u03cd\u03ce\u0005e\u0000\u0000\u03ce\u00e8\u0001\u0000\u0000"+ + "\u0000\u03cf\u03d0\u0005r\u0000\u0000\u03d0\u03d1\u0005e\u0000\u0000\u03d1"+ + "\u03d2\u0005n\u0000\u0000\u03d2\u03d3\u0005a\u0000\u0000\u03d3\u03d4\u0005"+ + "m\u0000\u0000\u03d4\u03d5\u0005e\u0000\u0000\u03d5\u00ea\u0001\u0000\u0000"+ + "\u0000\u03d6\u03d7\u0005r\u0000\u0000\u03d7\u03d8\u0005e\u0000\u0000\u03d8"+ + "\u03d9\u0005p\u0000\u0000\u03d9\u03da\u0005l\u0000\u0000\u03da\u03db\u0005"+ + "a\u0000\u0000\u03db\u03dc\u0005c\u0000\u0000\u03dc\u03dd\u0005e\u0000"+ + "\u0000\u03dd\u00ec\u0001\u0000\u0000\u0000\u03de\u03df\u0005c\u0000\u0000"+ + "\u03df\u03e0\u0005o\u0000\u0000\u03e0\u03e1\u0005p\u0000\u0000\u03e1\u03e2"+ + "\u0005y\u0000\u0000\u03e2\u00ee\u0001\u0000\u0000\u0000\u03e3\u03e4\u0005"+ + "m\u0000\u0000\u03e4\u03e5\u0005o\u0000\u0000\u03e5\u03e6\u0005d\u0000"+ + "\u0000\u03e6\u03e7\u0005i\u0000\u0000\u03e7\u03e8\u0005f\u0000\u0000\u03e8"+ + "\u03e9\u0005y\u0000\u0000\u03e9\u00f0\u0001\u0000\u0000\u0000\u03ea\u03eb"+ + "\u0005a\u0000\u0000\u03eb\u03ec\u0005p\u0000\u0000\u03ec\u03ed\u0005p"+ + "\u0000\u0000\u03ed\u03ee\u0005e\u0000\u0000\u03ee\u03ef\u0005n\u0000\u0000"+ + "\u03ef\u03f0\u0005d\u0000\u0000\u03f0\u00f2\u0001\u0000\u0000\u0000\u03f1"+ + "\u03f2\u0005i\u0000\u0000\u03f2\u03f3\u0005n\u0000\u0000\u03f3\u03f4\u0005"+ + "t\u0000\u0000\u03f4\u03f5\u0005o\u0000\u0000\u03f5\u00f4\u0001\u0000\u0000"+ + "\u0000\u03f6\u03f7\u0005v\u0000\u0000\u03f7\u03f8\u0005a\u0000\u0000\u03f8"+ + "\u03f9\u0005l\u0000\u0000\u03f9\u03fa\u0005u\u0000\u0000\u03fa\u03fb\u0005"+ + "e\u0000\u0000\u03fb\u00f6\u0001\u0000\u0000\u0000\u03fc\u03fd\u0005w\u0000"+ + "\u0000\u03fd\u03fe\u0005i\u0000\u0000\u03fe\u03ff\u0005t\u0000\u0000\u03ff"+ + "\u0400\u0005h\u0000\u0000\u0400\u00f8\u0001\u0000\u0000\u0000\u0401\u0402"+ + "\u0005p\u0000\u0000\u0402\u0403\u0005o\u0000\u0000\u0403\u0404\u0005s"+ + "\u0000\u0000\u0404\u0405\u0005i\u0000\u0000\u0405\u0406\u0005t\u0000\u0000"+ + "\u0406\u0407\u0005i\u0000\u0000\u0407\u0408\u0005o\u0000\u0000\u0408\u0409"+ + "\u0005n\u0000\u0000\u0409\u00fa\u0001\u0000\u0000\u0000\u040a\u040b\u0005"+ + "j\u0000\u0000\u040b\u040c\u0005s\u0000\u0000\u040c\u040d\u0005o\u0000"+ + "\u0000\u040d\u040e\u0005n\u0000\u0000\u040e\u00fc\u0001\u0000\u0000\u0000"+ + "\u040f\u0410\u0005u\u0000\u0000\u0410\u0411\u0005p\u0000\u0000\u0411\u0412"+ + "\u0005d\u0000\u0000\u0412\u0413\u0005a\u0000\u0000\u0413\u0414\u0005t"+ + "\u0000\u0000\u0414\u0415\u0005i\u0000\u0000\u0415\u0416\u0005n\u0000\u0000"+ + "\u0416\u0417\u0005g\u0000\u0000\u0417\u00fe\u0001\u0000\u0000\u0000\u0418"+ + "\u0419\u0005b\u0000\u0000\u0419\u041a\u0005r\u0000\u0000\u041a\u041b\u0005"+ + "e\u0000\u0000\u041b\u041c\u0005a\u0000\u0000\u041c\u041d\u0005k\u0000"+ + "\u0000\u041d\u0100\u0001\u0000\u0000\u0000\u041e\u041f\u0005l\u0000\u0000"+ + "\u041f\u0420\u0005o\u0000\u0000\u0420\u0421\u0005o\u0000\u0000\u0421\u0422"+ + "\u0005p\u0000\u0000\u0422\u0102\u0001\u0000\u0000\u0000\u0423\u0424\u0005"+ + "c\u0000\u0000\u0424\u0425\u0005o\u0000\u0000\u0425\u0426\u0005n\u0000"+ + "\u0000\u0426\u0427\u0005t\u0000\u0000\u0427\u0428\u0005i\u0000\u0000\u0428"+ + "\u0429\u0005n\u0000\u0000\u0429\u042a\u0005u\u0000\u0000\u042a\u042b\u0005"+ + "e\u0000\u0000\u042b\u0104\u0001\u0000\u0000\u0000\u042c\u042d\u0005e\u0000"+ + "\u0000\u042d\u042e\u0005x\u0000\u0000\u042e\u042f\u0005i\u0000\u0000\u042f"+ + "\u0430\u0005t\u0000\u0000\u0430\u0106\u0001\u0000\u0000\u0000\u0431\u0432"+ + "\u0005r\u0000\u0000\u0432\u0433\u0005e\u0000\u0000\u0433\u0434\u0005t"+ + "\u0000\u0000\u0434\u0435\u0005u\u0000\u0000\u0435\u0436\u0005r\u0000\u0000"+ + "\u0436\u0437\u0005n\u0000\u0000\u0437\u0438\u0005i\u0000\u0000\u0438\u0439"+ + "\u0005n\u0000\u0000\u0439\u043a\u0005g\u0000\u0000\u043a\u0108\u0001\u0000"+ + "\u0000\u0000\u043b\u043c\u0005w\u0000\u0000\u043c\u043d\u0005h\u0000\u0000"+ + "\u043d\u043e\u0005i\u0000\u0000\u043e\u043f\u0005l\u0000\u0000\u043f\u0440"+ + "\u0005e\u0000\u0000\u0440\u010a\u0001\u0000\u0000\u0000\u0441\u0446\u0005"+ + "\"\u0000\u0000\u0442\u0445\u0003\u010d\u0086\u0000\u0443\u0445\b\u0000"+ + "\u0000\u0000\u0444\u0442\u0001\u0000\u0000\u0000\u0444\u0443\u0001\u0000"+ + "\u0000\u0000\u0445\u0448\u0001\u0000\u0000\u0000\u0446\u0444\u0001\u0000"+ + "\u0000\u0000\u0446\u0447\u0001\u0000\u0000\u0000\u0447\u0449\u0001\u0000"+ + "\u0000\u0000\u0448\u0446\u0001\u0000\u0000\u0000\u0449\u044a\u0005\"\u0000"+ + "\u0000\u044a\u010c\u0001\u0000\u0000\u0000\u044b\u044e\u0005\\\u0000\u0000"+ + "\u044c\u044f\u0007\u0001\u0000\u0000\u044d\u044f\u0003\u010f\u0087\u0000"+ + "\u044e\u044c\u0001\u0000\u0000\u0000\u044e\u044d\u0001\u0000\u0000\u0000"+ + "\u044f\u010e\u0001\u0000\u0000\u0000\u0450\u0451\u0005u\u0000\u0000\u0451"+ + "\u0452\u0003\u0111\u0088\u0000\u0452\u0453\u0003\u0111\u0088\u0000\u0453"+ + "\u0454\u0003\u0111\u0088\u0000\u0454\u0455\u0003\u0111\u0088\u0000\u0455"+ + "\u0110\u0001\u0000\u0000\u0000\u0456\u0457\u0007\u0002\u0000\u0000\u0457"+ + "\u0112\u0001\u0000\u0000\u0000\u0458\u0459\u0005?\u0000\u0000\u0459\u0114"+ + "\u0001\u0000\u0000\u0000\u045a\u045b\u0005n\u0000\u0000\u045b\u045c\u0005"+ + "u\u0000\u0000\u045c\u045d\u0005l\u0000\u0000\u045d\u045e\u0005l\u0000"+ + "\u0000\u045e\u0116\u0001\u0000\u0000\u0000\u045f\u0460\u0003\u0119\u008c"+ + "\u0000\u0460\u0118\u0001\u0000\u0000\u0000\u0461\u0465\u0003\u011b\u008d"+ + "\u0000\u0462\u0465\u0003\u011d\u008e\u0000\u0463\u0465\u0003\u011f\u008f"+ + "\u0000\u0464\u0461\u0001\u0000\u0000\u0000\u0464\u0462\u0001\u0000\u0000"+ + "\u0000\u0464\u0463\u0001\u0000\u0000\u0000\u0465\u011a\u0001\u0000\u0000"+ + "\u0000\u0466\u0467\u0003\u0121\u0090\u0000\u0467\u011c\u0001\u0000\u0000"+ + "\u0000\u0468\u0469\u0005.\u0000\u0000\u0469\u0473\u0003\u0121\u0090\u0000"+ + "\u046a\u046b\u0003\u0121\u0090\u0000\u046b\u046f\u0005.\u0000\u0000\u046c"+ + "\u046e\u0007\u0003\u0000\u0000\u046d\u046c\u0001\u0000\u0000\u0000\u046e"+ + "\u0471\u0001\u0000\u0000\u0000\u046f\u046d\u0001\u0000\u0000\u0000\u046f"+ + "\u0470\u0001\u0000\u0000\u0000\u0470\u0473\u0001\u0000\u0000\u0000\u0471"+ + "\u046f\u0001\u0000\u0000\u0000\u0472\u0468\u0001\u0000\u0000\u0000\u0472"+ + "\u046a\u0001\u0000\u0000\u0000\u0473\u011e\u0001\u0000\u0000\u0000\u0474"+ + "\u0475\u0005.\u0000\u0000\u0475\u0481\u0003\u0121\u0090\u0000\u0476\u047e"+ + "\u0003\u0121\u0090\u0000\u0477\u047b\u0005.\u0000\u0000\u0478\u047a\u0007"+ + "\u0003\u0000\u0000\u0479\u0478\u0001\u0000\u0000\u0000\u047a\u047d\u0001"+ + "\u0000\u0000\u0000\u047b\u0479\u0001\u0000\u0000\u0000\u047b\u047c\u0001"+ + "\u0000\u0000\u0000\u047c\u047f\u0001\u0000\u0000\u0000\u047d\u047b\u0001"+ + "\u0000\u0000\u0000\u047e\u0477\u0001\u0000\u0000\u0000\u047e\u047f\u0001"+ + "\u0000\u0000\u0000\u047f\u0481\u0001\u0000\u0000\u0000\u0480\u0474\u0001"+ + "\u0000\u0000\u0000\u0480\u0476\u0001\u0000\u0000\u0000\u0481\u0482\u0001"+ + "\u0000\u0000\u0000\u0482\u0484\u0007\u0004\u0000\u0000\u0483\u0485\u0007"+ + "\u0005\u0000\u0000\u0484\u0483\u0001\u0000\u0000\u0000\u0484\u0485\u0001"+ + "\u0000\u0000\u0000\u0485\u0486\u0001\u0000\u0000\u0000\u0486\u0487\u0003"+ + "\u0121\u0090\u0000\u0487\u0120\u0001\u0000\u0000\u0000\u0488\u048a\u0007"+ + "\u0003\u0000\u0000\u0489\u0488\u0001\u0000\u0000\u0000\u048a\u048b\u0001"+ + "\u0000\u0000\u0000\u048b\u0489\u0001\u0000\u0000\u0000\u048b\u048c\u0001"+ + "\u0000\u0000\u0000\u048c\u0122\u0001\u0000\u0000\u0000\u048d\u048e\u0007"+ + "\u0006\u0000\u0000\u048e\u048f\u0001\u0000\u0000\u0000\u048f\u0490\u0006"+ + "\u0091\u0000\u0000\u0490\u0124\u0001\u0000\u0000\u0000\u0491\u0495\u0003"+ + "\u0127\u0093\u0000\u0492\u0494\u0003\u0129\u0094\u0000\u0493\u0492\u0001"+ + "\u0000\u0000\u0000\u0494\u0497\u0001\u0000\u0000\u0000\u0495\u0493\u0001"+ + "\u0000\u0000\u0000\u0495\u0496\u0001\u0000\u0000\u0000\u0496\u0126\u0001"+ + "\u0000\u0000\u0000\u0497\u0495\u0001\u0000\u0000\u0000\u0498\u049a\u0007"+ + "\u0007\u0000\u0000\u0499\u0498\u0001\u0000\u0000\u0000\u049a\u0128\u0001"+ + "\u0000\u0000\u0000\u049b\u049e\u0003\u0127\u0093\u0000\u049c\u049e\u0007"+ + "\b\u0000\u0000\u049d\u049b\u0001\u0000\u0000\u0000\u049d\u049c\u0001\u0000"+ + "\u0000\u0000\u049e\u012a\u0001\u0000\u0000\u0000\u049f\u04a0\u0005(\u0000"+ + "\u0000\u04a0\u04a9\u0005:\u0000\u0000\u04a1\u04a8\u0003\u012b\u0095\u0000"+ + "\u04a2\u04a3\u0005(\u0000\u0000\u04a3\u04a8\b\t\u0000\u0000\u04a4\u04a5"+ + "\u0005:\u0000\u0000\u04a5\u04a8\b\n\u0000\u0000\u04a6\u04a8\b\u000b\u0000"+ + "\u0000\u04a7\u04a1\u0001\u0000\u0000\u0000\u04a7\u04a2\u0001\u0000\u0000"+ + "\u0000\u04a7\u04a4\u0001\u0000\u0000\u0000\u04a7\u04a6\u0001\u0000\u0000"+ + "\u0000\u04a8\u04ab\u0001\u0000\u0000\u0000\u04a9\u04a7\u0001\u0000\u0000"+ + "\u0000\u04a9\u04aa\u0001\u0000\u0000\u0000\u04aa\u04ad\u0001\u0000\u0000"+ + "\u0000\u04ab\u04a9\u0001\u0000\u0000\u0000\u04ac\u04ae\u0005:\u0000\u0000"+ + "\u04ad\u04ac\u0001\u0000\u0000\u0000\u04ae\u04af\u0001\u0000\u0000\u0000"+ + "\u04af\u04ad\u0001\u0000\u0000\u0000\u04af\u04b0\u0001\u0000\u0000\u0000"+ + "\u04b0\u04b1\u0001\u0000\u0000\u0000\u04b1\u04b2\u0005)\u0000\u0000\u04b2"+ + "\u04b3\u0001\u0000\u0000\u0000\u04b3\u04b4\u0006\u0095\u0000\u0000\u04b4"+ + "\u012c\u0001\u0000\u0000\u0000\u04b5\u04b6\b\f\u0000\u0000\u04b6\u012e"+ + "\u0001\u0000\u0000\u0000\u0012\u0000\u0444\u0446\u044e\u0464\u046f\u0472"+ + "\u047b\u047e\u0480\u0484\u048b\u0495\u0499\u049d\u04a7\u04a9\u04af\u0001"+ + "\u0000\u0001\u0000"; 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..90fc814284 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens +++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens @@ -121,27 +121,28 @@ 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 +Kwith=124 +Kposition=125 +Kjson=126 +Kupdating=127 +Kbreak=128 +Kloop=129 +Kcontinue=130 +Kexit=131 +Kreturning=132 +Kwhile=133 +STRING=134 +ArgumentPlaceholder=135 +NullLiteral=136 +Literal=137 +NumericLiteral=138 +IntegerLiteral=139 +DecimalLiteral=140 +DoubleLiteral=141 +WS=142 +NCName=143 +XQComment=144 +ContentChar=145 ';'=1 'module'=2 'namespace'=3 @@ -265,14 +266,15 @@ ContentChar=144 '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 +'with'=124 +'position'=125 +'json'=126 +'updating'=127 +'break'=128 +'loop'=129 +'continue'=130 +'exit'=131 +'returning'=132 +'while'=133 +'?'=135 +'null'=136 diff --git a/src/main/java/org/rumbledb/parser/JsoniqParser.java b/src/main/java/org/rumbledb/parser/JsoniqParser.java index 7f7947c755..355a01ca9c 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", "CheckReturnValue"}) public class JsoniqParser extends Parser { @@ -48,11 +37,11 @@ public class JsoniqParser extends Parser { 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; + Kappend=121, Kinto=122, Kvalue=123, Kwith=124, Kposition=125, Kjson=126, + Kupdating=127, Kbreak=128, Kloop=129, Kcontinue=130, Kexit=131, Kreturning=132, + Kwhile=133, STRING=134, ArgumentPlaceholder=135, NullLiteral=136, Literal=137, + NumericLiteral=138, IntegerLiteral=139, DecimalLiteral=140, DoubleLiteral=141, + WS=142, NCName=143, XQComment=144, ContentChar=145; 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, @@ -145,9 +134,9 @@ private static String[] makeLiteralNames() { "'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'" + "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'with'", + "'position'", "'json'", "'updating'", "'break'", "'loop'", "'continue'", + "'exit'", "'returning'", "'while'", null, "'?'", "'null'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -166,10 +155,10 @@ private static String[] makeSymbolicNames() { "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", + "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kwith", + "Kposition", "Kjson", "Kupdating", "Kbreak", "Kloop", "Kcontinue", "Kexit", + "Kreturning", "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral", + "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "WS", "NCName", "XQComment", "ContentChar" }; } @@ -397,9 +386,10 @@ public final ModuleContext module() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -804,7 +794,7 @@ public final StatementsAndOptionalExprContext statementsAndOptionalExpr() throws setState(312); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 16831L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 33663L) != 0)) { { setState(311); expr(); @@ -1787,9 +1777,10 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -1888,9 +1879,10 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -2117,9 +2109,11 @@ public final CaseStatementContext caseStatement() throws RecognitionException { @SuppressWarnings("CheckReturnValue") public static class AnnotationContext extends ParserRuleContext { public QnameContext name; + public Token updating; public QnameContext qname() { return getRuleContext(QnameContext.class,0); } + public TerminalNode Kupdating() { return getToken(JsoniqParser.Kupdating, 0); } public List Literal() { return getTokens(JsoniqParser.Literal); } public TerminalNode Literal(int i) { return getToken(JsoniqParser.Literal, i); @@ -2142,40 +2136,56 @@ public final AnnotationContext annotation() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(461); - match(T__12); - setState(462); - ((AnnotationContext)_localctx).name = qname(); - setState(473); + setState(476); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==T__8) { + switch (_input.LA(1)) { + case T__12: { - setState(463); - match(T__8); - setState(464); - match(Literal); - setState(469); + setState(461); + match(T__12); + setState(462); + ((AnnotationContext)_localctx).name = qname(); + setState(473); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__13) { - { + if (_la==T__8) { { - setState(465); - match(T__13); - setState(466); + setState(463); + match(T__8); + setState(464); match(Literal); - } - } - setState(471); + setState(469); _errHandler.sync(this); _la = _input.LA(1); + while (_la==T__13) { + { + { + setState(465); + match(T__13); + setState(466); + match(Literal); + } + } + setState(471); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(472); + match(T__9); + } } - setState(472); - match(T__9); + + } + break; + case Kupdating: + { + setState(475); + ((AnnotationContext)_localctx).updating = match(Kupdating); } + break; + default: + throw new NoViableAltException(this); } - } } catch (RecognitionException re) { @@ -2215,17 +2225,17 @@ public final AnnotationsContext annotations() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(478); + setState(481); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__12) { + while (_la==T__12 || _la==Kupdating) { { { - setState(475); + setState(478); annotation(); } } - setState(480); + setState(483); _errHandler.sync(this); _la = _input.LA(1); } @@ -2272,29 +2282,29 @@ public final VarDeclStatementContext varDeclStatement() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(481); + setState(484); annotations(); - setState(482); + setState(485); match(Kvariable); - setState(483); + setState(486); varDeclForStatement(); - setState(488); + setState(491); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(484); + setState(487); match(T__13); - setState(485); + setState(488); varDeclForStatement(); } } - setState(490); + setState(493); _errHandler.sync(this); _la = _input.LA(1); } - setState(491); + setState(494); match(T__0); } } @@ -2342,28 +2352,28 @@ public final VarDeclForStatementContext varDeclForStatement() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(493); - ((VarDeclForStatementContext)_localctx).var_ref = varRef(); setState(496); + ((VarDeclForStatementContext)_localctx).var_ref = varRef(); + setState(499); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(494); + setState(497); match(Kas); - setState(495); + setState(498); sequenceType(); } } - setState(500); + setState(503); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__5) { { - setState(498); + setState(501); match(T__5); - setState(499); + setState(502); ((VarDeclForStatementContext)_localctx).exprSingle = exprSingle(); ((VarDeclForStatementContext)_localctx).expr_vals.add(((VarDeclForStatementContext)_localctx).exprSingle); } @@ -2410,15 +2420,15 @@ public final WhileStatementContext whileStatement() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(502); + setState(505); match(Kwhile); - setState(503); + setState(506); match(T__8); - setState(504); + setState(507); ((WhileStatementContext)_localctx).test_expr = expr(); - setState(505); + setState(508); match(T__9); - setState(506); + setState(509); ((WhileStatementContext)_localctx).stmt = statement(); } } @@ -2462,34 +2472,34 @@ public final SetterContext setter() throws RecognitionException { SetterContext _localctx = new SetterContext(_ctx, getState()); enterRule(_localctx, 58, RULE_setter); try { - setState(512); + setState(515); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(508); + setState(511); defaultCollationDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(509); + setState(512); orderingModeDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(510); + setState(513); emptyOrderDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(511); + setState(514); decimalFormatDecl(); } break; @@ -2530,15 +2540,15 @@ public final NamespaceDeclContext namespaceDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(514); + setState(517); match(Kdeclare); - setState(515); + setState(518); match(T__2); - setState(516); + setState(519); match(NCName); - setState(517); + setState(520); match(T__3); - setState(518); + setState(521); uriLiteral(); } } @@ -2582,34 +2592,34 @@ public final AnnotatedDeclContext annotatedDecl() throws RecognitionException { AnnotatedDeclContext _localctx = new AnnotatedDeclContext(_ctx, getState()); enterRule(_localctx, 62, RULE_annotatedDecl); try { - setState(524); + setState(527); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(520); + setState(523); functionDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(521); + setState(524); varDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(522); + setState(525); typeDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(523); + setState(526); contextItemDecl(); } break; @@ -2651,13 +2661,13 @@ public final DefaultCollationDeclContext defaultCollationDecl() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(526); + setState(529); match(Kdeclare); - setState(527); + setState(530); match(Kdefault); - setState(528); + setState(531); match(Kcollation); - setState(529); + setState(532); uriLiteral(); } } @@ -2694,11 +2704,11 @@ public final OrderingModeDeclContext orderingModeDecl() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(531); + setState(534); match(Kdeclare); - setState(532); + setState(535); match(T__14); - setState(533); + setState(536); _la = _input.LA(1); if ( !(_la==T__15 || _la==Kunordered) ) { _errHandler.recoverInline(this); @@ -2748,16 +2758,16 @@ public final EmptyOrderDeclContext emptyOrderDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(535); + setState(538); match(Kdeclare); - setState(536); + setState(539); match(Kdefault); - setState(537); + setState(540); match(Korder); - setState(538); + setState(541); match(Kempty); { - setState(539); + setState(542); ((EmptyOrderDeclContext)_localctx).emptySequenceOrder = _input.LT(1); _la = _input.LA(1); if ( !(_la==Kgreatest || _la==Kleast) ) { @@ -2819,17 +2829,17 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(541); + setState(544); match(Kdeclare); - setState(546); + setState(549); _errHandler.sync(this); switch (_input.LA(1)) { case T__16: { { - setState(542); + setState(545); match(T__16); - setState(543); + setState(546); qname(); } } @@ -2837,9 +2847,9 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce case Kdefault: { { - setState(544); + setState(547); match(Kdefault); - setState(545); + setState(548); match(T__16); } } @@ -2847,21 +2857,21 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce default: throw new NoViableAltException(this); } - setState(554); + setState(557); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 536346624L) != 0)) { { { - setState(548); + setState(551); dfPropertyName(); - setState(549); + setState(552); match(T__3); - setState(550); + setState(553); stringLiteral(); } } - setState(556); + setState(559); _errHandler.sync(this); _la = _input.LA(1); } @@ -2911,17 +2921,17 @@ public final QnameContext qname() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(562); + setState(565); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) { case 1: { - setState(559); + setState(562); _errHandler.sync(this); switch (_input.LA(1)) { case NCName: { - setState(557); + setState(560); ((QnameContext)_localctx).ns = match(NCName); } break; @@ -2988,9 +2998,10 @@ public final QnameContext qname() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -2999,24 +3010,24 @@ public final QnameContext qname() throws RecognitionException { case Kwhile: case NullLiteral: { - setState(558); + setState(561); ((QnameContext)_localctx).nskw = keyWords(); } break; default: throw new NoViableAltException(this); } - setState(561); + setState(564); match(T__17); } break; } - setState(566); + setState(569); _errHandler.sync(this); switch (_input.LA(1)) { case NCName: { - setState(564); + setState(567); ((QnameContext)_localctx).local_name = match(NCName); } break; @@ -3083,9 +3094,10 @@ public final QnameContext qname() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -3094,7 +3106,7 @@ public final QnameContext qname() throws RecognitionException { case Kwhile: case NullLiteral: { - setState(565); + setState(568); ((QnameContext)_localctx).local_namekw = keyWords(); } break; @@ -3134,7 +3146,7 @@ public final DfPropertyNameContext dfPropertyName() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(568); + setState(571); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 536346624L) != 0)) ) { _errHandler.recoverInline(this); @@ -3187,48 +3199,48 @@ public final ModuleImportContext moduleImport() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(570); + setState(573); match(T__28); - setState(571); + setState(574); match(T__1); - setState(575); + setState(578); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__2) { { - setState(572); + setState(575); match(T__2); - setState(573); + setState(576); ((ModuleImportContext)_localctx).prefix = match(NCName); - setState(574); + setState(577); match(T__3); } } - setState(577); + setState(580); ((ModuleImportContext)_localctx).targetNamespace = uriLiteral(); - setState(587); + setState(590); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kat) { { - setState(578); + setState(581); match(Kat); - setState(579); + setState(582); uriLiteral(); - setState(584); + setState(587); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(580); + setState(583); match(T__13); - setState(581); + setState(584); uriLiteral(); } } - setState(586); + setState(589); _errHandler.sync(this); _la = _input.LA(1); } @@ -3284,35 +3296,35 @@ public final VarDeclContext varDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(589); + setState(592); match(Kdeclare); - setState(590); + setState(593); annotations(); - setState(591); + setState(594); match(Kvariable); - setState(592); - varRef(); setState(595); + varRef(); + setState(598); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(593); + setState(596); match(Kas); - setState(594); + setState(597); sequenceType(); } } - setState(604); + setState(607); _errHandler.sync(this); switch (_input.LA(1)) { case T__5: { { - setState(597); + setState(600); match(T__5); - setState(598); + setState(601); exprSingle(); } } @@ -3320,16 +3332,16 @@ public final VarDeclContext varDecl() throws RecognitionException { case T__29: { { - setState(599); - ((VarDeclContext)_localctx).external = match(T__29); setState(602); + ((VarDeclContext)_localctx).external = match(T__29); + setState(605); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__5) { { - setState(600); + setState(603); match(T__5); - setState(601); + setState(604); exprSingle(); } } @@ -3384,33 +3396,33 @@ public final ContextItemDeclContext contextItemDecl() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(606); + setState(609); match(Kdeclare); - setState(607); + setState(610); match(Kcontext); - setState(608); - match(Kitem); setState(611); + match(Kitem); + setState(614); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(609); + setState(612); match(Kas); - setState(610); + setState(613); sequenceType(); } } - setState(620); + setState(623); _errHandler.sync(this); switch (_input.LA(1)) { case T__5: { { - setState(613); + setState(616); match(T__5); - setState(614); + setState(617); exprSingle(); } } @@ -3418,16 +3430,16 @@ public final ContextItemDeclContext contextItemDecl() throws RecognitionExceptio case T__29: { { - setState(615); - ((ContextItemDeclContext)_localctx).external = match(T__29); setState(618); + ((ContextItemDeclContext)_localctx).external = match(T__29); + setState(621); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__5) { { - setState(616); + setState(619); match(T__5); - setState(617); + setState(620); exprSingle(); } } @@ -3456,6 +3468,7 @@ public static class FunctionDeclContext extends ParserRuleContext { public QnameContext fn_name; public SequenceTypeContext return_type; public StatementsAndOptionalExprContext fn_body; + public Token is_external; public TerminalNode Kdeclare() { return getToken(JsoniqParser.Kdeclare, 0); } public AnnotationsContext annotations() { return getRuleContext(AnnotationsContext.class,0); @@ -3491,59 +3504,59 @@ public final FunctionDeclContext functionDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(622); + setState(625); match(Kdeclare); - setState(623); + setState(626); annotations(); - setState(624); + setState(627); match(T__30); - setState(625); + setState(628); ((FunctionDeclContext)_localctx).fn_name = qname(); - setState(626); + setState(629); match(T__8); - setState(628); + setState(631); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__4) { { - setState(627); + setState(630); paramList(); } } - setState(630); - match(T__9); setState(633); + match(T__9); + setState(636); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(631); + setState(634); match(Kas); - setState(632); + setState(635); ((FunctionDeclContext)_localctx).return_type = sequenceType(); } } - setState(640); + setState(643); _errHandler.sync(this); switch (_input.LA(1)) { case T__6: { - setState(635); + setState(638); match(T__6); { - setState(636); + setState(639); ((FunctionDeclContext)_localctx).fn_body = statementsAndOptionalExpr(); } - setState(637); + setState(640); match(T__7); } break; case T__29: { - setState(639); - match(T__29); + setState(642); + ((FunctionDeclContext)_localctx).is_external = match(T__29); } break; default: @@ -3596,25 +3609,25 @@ public final TypeDeclContext typeDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(642); + setState(645); match(Kdeclare); - setState(643); + setState(646); match(Ktype); - setState(644); + setState(647); ((TypeDeclContext)_localctx).type_name = qname(); - setState(645); + setState(648); match(Kas); - setState(647); + setState(650); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(646); + setState(649); ((TypeDeclContext)_localctx).schema = schemaLanguage(); } break; } - setState(649); + setState(652); ((TypeDeclContext)_localctx).type_definition = exprSingle(); } } @@ -3647,33 +3660,33 @@ public final SchemaLanguageContext schemaLanguage() throws RecognitionException SchemaLanguageContext _localctx = new SchemaLanguageContext(_ctx, getState()); enterRule(_localctx, 86, RULE_schemaLanguage); try { - setState(657); + setState(660); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(651); + setState(654); match(T__31); - setState(652); + setState(655); match(T__32); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(653); + setState(656); match(T__31); - setState(654); + setState(657); match(T__33); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(655); + setState(658); match(Kjson); - setState(656); + setState(659); match(T__34); } break; @@ -3716,21 +3729,21 @@ public final ParamListContext paramList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(659); + setState(662); param(); - setState(664); + setState(667); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(660); + setState(663); match(T__13); - setState(661); + setState(664); param(); } } - setState(666); + setState(669); _errHandler.sync(this); _la = _input.LA(1); } @@ -3774,18 +3787,18 @@ public final ParamContext param() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(667); + setState(670); match(T__4); - setState(668); - qname(); setState(671); + qname(); + setState(674); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(669); + setState(672); match(Kas); - setState(670); + setState(673); sequenceType(); } } @@ -3829,21 +3842,21 @@ public final ExprContext expr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(673); + setState(676); exprSingle(); - setState(678); + setState(681); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(674); + setState(677); match(T__13); - setState(675); + setState(678); exprSingle(); } } - setState(680); + setState(683); _errHandler.sync(this); _la = _input.LA(1); } @@ -3895,48 +3908,48 @@ public final ExprSingleContext exprSingle() throws RecognitionException { ExprSingleContext _localctx = new ExprSingleContext(_ctx, getState()); enterRule(_localctx, 94, RULE_exprSingle); try { - setState(687); + setState(690); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(681); + setState(684); exprSimple(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(682); + setState(685); flowrExpr(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(683); + setState(686); switchExpr(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(684); + setState(687); typeSwitchExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(685); + setState(688); ifExpr(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(686); + setState(689); tryCatchExpr(); } break; @@ -3994,62 +4007,62 @@ public final ExprSimpleContext exprSimple() throws RecognitionException { ExprSimpleContext _localctx = new ExprSimpleContext(_ctx, getState()); enterRule(_localctx, 96, RULE_exprSimple); try { - setState(697); + setState(700); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(689); + setState(692); quantifiedExpr(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(690); + setState(693); orExpr(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(691); + setState(694); insertExpr(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(692); + setState(695); deleteExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(693); + setState(696); renameExpr(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(694); + setState(697); replaceExpr(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(695); + setState(698); transformExpr(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(696); + setState(699); appendExpr(); } break; @@ -4129,66 +4142,66 @@ public final FlowrExprContext flowrExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(701); + setState(704); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: { - setState(699); + setState(702); ((FlowrExprContext)_localctx).start_for = forClause(); } break; case Klet: { - setState(700); + setState(703); ((FlowrExprContext)_localctx).start_let = letClause(); } break; default: throw new NoViableAltException(this); } - setState(711); + setState(714); _errHandler.sync(this); _la = _input.LA(1); while (((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & 24623L) != 0)) { { - setState(709); + setState(712); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: { - setState(703); + setState(706); forClause(); } break; case Klet: { - setState(704); + setState(707); letClause(); } break; case Kwhere: { - setState(705); + setState(708); whereClause(); } break; case Kgroup: { - setState(706); + setState(709); groupByClause(); } break; case Korder: case Kstable: { - setState(707); + setState(710); orderByClause(); } break; case Kcount: { - setState(708); + setState(711); countClause(); } break; @@ -4196,13 +4209,13 @@ public final FlowrExprContext flowrExpr() throws RecognitionException { throw new NoViableAltException(this); } } - setState(713); + setState(716); _errHandler.sync(this); _la = _input.LA(1); } - setState(714); + setState(717); match(Kreturn); - setState(715); + setState(718); ((FlowrExprContext)_localctx).return_expr = exprSingle(); } } @@ -4246,25 +4259,25 @@ public final ForClauseContext forClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(717); + setState(720); match(Kfor); - setState(718); + setState(721); ((ForClauseContext)_localctx).forVar = forVar(); ((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar); - setState(723); + setState(726); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(719); + setState(722); match(T__13); - setState(720); + setState(723); ((ForClauseContext)_localctx).forVar = forVar(); ((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar); } } - setState(725); + setState(728); _errHandler.sync(this); _la = _input.LA(1); } @@ -4323,47 +4336,47 @@ public final ForVarContext forVar() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(726); - ((ForVarContext)_localctx).var_ref = varRef(); setState(729); + ((ForVarContext)_localctx).var_ref = varRef(); + setState(732); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(727); + setState(730); match(Kas); - setState(728); + setState(731); ((ForVarContext)_localctx).seq = sequenceType(); } } - setState(733); + setState(736); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kallowing) { { - setState(731); + setState(734); ((ForVarContext)_localctx).flag = match(Kallowing); - setState(732); + setState(735); match(Kempty); } } - setState(737); + setState(740); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kat) { { - setState(735); + setState(738); match(Kat); - setState(736); + setState(739); ((ForVarContext)_localctx).at = varRef(); } } - setState(739); + setState(742); match(Kin); - setState(740); + setState(743); ((ForVarContext)_localctx).ex = exprSingle(); } } @@ -4407,25 +4420,25 @@ public final LetClauseContext letClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(742); + setState(745); match(Klet); - setState(743); + setState(746); ((LetClauseContext)_localctx).letVar = letVar(); ((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar); - setState(748); + setState(751); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(744); + setState(747); match(T__13); - setState(745); + setState(748); ((LetClauseContext)_localctx).letVar = letVar(); ((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar); } } - setState(750); + setState(753); _errHandler.sync(this); _la = _input.LA(1); } @@ -4475,23 +4488,23 @@ public final LetVarContext letVar() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(751); - ((LetVarContext)_localctx).var_ref = varRef(); setState(754); + ((LetVarContext)_localctx).var_ref = varRef(); + setState(757); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(752); + setState(755); match(Kas); - setState(753); + setState(756); ((LetVarContext)_localctx).seq = sequenceType(); } } - setState(756); + setState(759); match(T__5); - setState(757); + setState(760); ((LetVarContext)_localctx).ex = exprSingle(); } } @@ -4529,9 +4542,9 @@ public final WhereClauseContext whereClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(759); + setState(762); match(Kwhere); - setState(760); + setState(763); exprSingle(); } } @@ -4576,27 +4589,27 @@ public final GroupByClauseContext groupByClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(762); + setState(765); match(Kgroup); - setState(763); + setState(766); match(Kby); - setState(764); + setState(767); ((GroupByClauseContext)_localctx).groupByVar = groupByVar(); ((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar); - setState(769); + setState(772); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(765); + setState(768); match(T__13); - setState(766); + setState(769); ((GroupByClauseContext)_localctx).groupByVar = groupByVar(); ((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar); } } - setState(771); + setState(774); _errHandler.sync(this); _la = _input.LA(1); } @@ -4652,40 +4665,40 @@ public final GroupByVarContext groupByVar() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(772); + setState(775); ((GroupByVarContext)_localctx).var_ref = varRef(); - setState(779); + setState(782); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__5 || _la==Kas) { { - setState(775); + setState(778); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(773); + setState(776); match(Kas); - setState(774); + setState(777); ((GroupByVarContext)_localctx).seq = sequenceType(); } } - setState(777); + setState(780); ((GroupByVarContext)_localctx).decl = match(T__5); - setState(778); + setState(781); ((GroupByVarContext)_localctx).ex = exprSingle(); } } - setState(783); + setState(786); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kcollation) { { - setState(781); + setState(784); match(Kcollation); - setState(782); + setState(785); ((GroupByVarContext)_localctx).uri = uriLiteral(); } } @@ -4733,15 +4746,15 @@ public final OrderByClauseContext orderByClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(790); + setState(793); _errHandler.sync(this); switch (_input.LA(1)) { case Korder: { { - setState(785); + setState(788); match(Korder); - setState(786); + setState(789); match(Kby); } } @@ -4749,11 +4762,11 @@ public final OrderByClauseContext orderByClause() throws RecognitionException { case Kstable: { { - setState(787); + setState(790); ((OrderByClauseContext)_localctx).stb = match(Kstable); - setState(788); + setState(791); match(Korder); - setState(789); + setState(792); match(Kby); } } @@ -4761,21 +4774,21 @@ public final OrderByClauseContext orderByClause() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(792); + setState(795); orderByExpr(); - setState(797); + setState(800); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(793); + setState(796); match(T__13); - setState(794); + setState(797); orderByExpr(); } } - setState(799); + setState(802); _errHandler.sync(this); _la = _input.LA(1); } @@ -4829,20 +4842,20 @@ public final OrderByExprContext orderByExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(800); - ((OrderByExprContext)_localctx).ex = exprSingle(); setState(803); + ((OrderByExprContext)_localctx).ex = exprSingle(); + setState(806); _errHandler.sync(this); switch (_input.LA(1)) { case Kascending: { - setState(801); + setState(804); match(Kascending); } break; case Kdescending: { - setState(802); + setState(805); ((OrderByExprContext)_localctx).desc = match(Kdescending); } break; @@ -4861,25 +4874,25 @@ public final OrderByExprContext orderByExpr() throws RecognitionException { default: break; } - setState(810); + setState(813); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kempty) { { - setState(805); - match(Kempty); setState(808); + match(Kempty); + setState(811); _errHandler.sync(this); switch (_input.LA(1)) { case Kgreatest: { - setState(806); + setState(809); ((OrderByExprContext)_localctx).gr = match(Kgreatest); } break; case Kleast: { - setState(807); + setState(810); ((OrderByExprContext)_localctx).ls = match(Kleast); } break; @@ -4889,14 +4902,14 @@ public final OrderByExprContext orderByExpr() throws RecognitionException { } } - setState(814); + setState(817); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kcollation) { { - setState(812); + setState(815); match(Kcollation); - setState(813); + setState(816); ((OrderByExprContext)_localctx).uril = uriLiteral(); } } @@ -4937,9 +4950,9 @@ public final CountClauseContext countClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(816); + setState(819); match(Kcount); - setState(817); + setState(820); varRef(); } } @@ -4990,47 +5003,47 @@ public final QuantifiedExprContext quantifiedExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(821); + setState(824); _errHandler.sync(this); switch (_input.LA(1)) { case Ksome: { - setState(819); + setState(822); ((QuantifiedExprContext)_localctx).so = match(Ksome); } break; case Kevery: { - setState(820); + setState(823); ((QuantifiedExprContext)_localctx).ev = match(Kevery); } break; default: throw new NoViableAltException(this); } - setState(823); + setState(826); ((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar(); ((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar); - setState(828); + setState(831); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(824); + setState(827); match(T__13); - setState(825); + setState(828); ((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar(); ((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar); } } - setState(830); + setState(833); _errHandler.sync(this); _la = _input.LA(1); } - setState(831); + setState(834); match(Ksatisfies); - setState(832); + setState(835); exprSingle(); } } @@ -5076,23 +5089,23 @@ public final QuantifiedExprVarContext quantifiedExprVar() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(834); - varRef(); setState(837); + varRef(); + setState(840); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(835); + setState(838); match(Kas); - setState(836); + setState(839); sequenceType(); } } - setState(839); + setState(842); match(Kin); - setState(840); + setState(843); exprSingle(); } } @@ -5146,34 +5159,34 @@ public final SwitchExprContext switchExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(842); + setState(845); match(Kswitch); - setState(843); + setState(846); match(T__8); - setState(844); + setState(847); ((SwitchExprContext)_localctx).cond = expr(); - setState(845); + setState(848); match(T__9); - setState(847); + setState(850); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(846); + setState(849); ((SwitchExprContext)_localctx).switchCaseClause = switchCaseClause(); ((SwitchExprContext)_localctx).cases.add(((SwitchExprContext)_localctx).switchCaseClause); } } - setState(849); + setState(852); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(851); + setState(854); match(Kdefault); - setState(852); + setState(855); match(Kreturn); - setState(853); + setState(856); ((SwitchExprContext)_localctx).def = exprSingle(); } } @@ -5222,26 +5235,26 @@ public final SwitchCaseClauseContext switchCaseClause() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(857); + setState(860); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(855); + setState(858); match(Kcase); - setState(856); + setState(859); ((SwitchCaseClauseContext)_localctx).exprSingle = exprSingle(); ((SwitchCaseClauseContext)_localctx).cond.add(((SwitchCaseClauseContext)_localctx).exprSingle); } } - setState(859); + setState(862); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(861); + setState(864); match(Kreturn); - setState(862); + setState(865); ((SwitchCaseClauseContext)_localctx).ret = exprSingle(); } } @@ -5299,44 +5312,44 @@ public final TypeSwitchExprContext typeSwitchExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(864); + setState(867); match(Ktypeswitch); - setState(865); + setState(868); match(T__8); - setState(866); + setState(869); ((TypeSwitchExprContext)_localctx).cond = expr(); - setState(867); + setState(870); match(T__9); - setState(869); + setState(872); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(868); + setState(871); ((TypeSwitchExprContext)_localctx).caseClause = caseClause(); ((TypeSwitchExprContext)_localctx).cses.add(((TypeSwitchExprContext)_localctx).caseClause); } } - setState(871); + setState(874); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(873); + setState(876); match(Kdefault); - setState(875); + setState(878); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__4) { { - setState(874); + setState(877); ((TypeSwitchExprContext)_localctx).var_ref = varRef(); } } - setState(877); + setState(880); match(Kreturn); - setState(878); + setState(881); ((TypeSwitchExprContext)_localctx).def = exprSingle(); } } @@ -5390,43 +5403,43 @@ public final CaseClauseContext caseClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(880); + setState(883); match(Kcase); - setState(884); + setState(887); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__4) { { - setState(881); + setState(884); ((CaseClauseContext)_localctx).var_ref = varRef(); - setState(882); + setState(885); match(Kas); } } - setState(886); + setState(889); ((CaseClauseContext)_localctx).sequenceType = sequenceType(); ((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType); - setState(891); + setState(894); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__11) { { { - setState(887); + setState(890); match(T__11); - setState(888); + setState(891); ((CaseClauseContext)_localctx).sequenceType = sequenceType(); ((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType); } } - setState(893); + setState(896); _errHandler.sync(this); _la = _input.LA(1); } - setState(894); + setState(897); match(Kreturn); - setState(895); + setState(898); ((CaseClauseContext)_localctx).ret = exprSingle(); } } @@ -5475,21 +5488,21 @@ public final IfExprContext ifExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(897); + setState(900); match(Kif); - setState(898); + setState(901); match(T__8); - setState(899); + setState(902); ((IfExprContext)_localctx).test_condition = expr(); - setState(900); + setState(903); match(T__9); - setState(901); + setState(904); match(Kthen); - setState(902); + setState(905); ((IfExprContext)_localctx).branch = exprSingle(); - setState(903); + setState(906); match(Kelse); - setState(904); + setState(907); ((IfExprContext)_localctx).else_branch = exprSingle(); } } @@ -5537,15 +5550,15 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(906); + setState(909); match(Ktry); - setState(907); + setState(910); match(T__6); - setState(908); + setState(911); ((TryCatchExprContext)_localctx).try_expression = expr(); - setState(909); + setState(912); match(T__7); - setState(911); + setState(914); _errHandler.sync(this); _alt = 1; do { @@ -5553,7 +5566,7 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { case 1: { { - setState(910); + setState(913); ((TryCatchExprContext)_localctx).catchClause = catchClause(); ((TryCatchExprContext)_localctx).catches.add(((TryCatchExprContext)_localctx).catchClause); } @@ -5562,9 +5575,9 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(913); + setState(916); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,81,_ctx); + _alt = getInterpreter().adaptivePredict(_input,82,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -5614,14 +5627,14 @@ public final CatchClauseContext catchClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(915); - match(Kcatch); setState(918); + match(Kcatch); + setState(921); _errHandler.sync(this); switch (_input.LA(1)) { case T__10: { - setState(916); + setState(919); ((CatchClauseContext)_localctx).s11 = match(T__10); ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s11); } @@ -5689,9 +5702,10 @@ public final CatchClauseContext catchClause() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -5701,7 +5715,7 @@ public final CatchClauseContext catchClause() throws RecognitionException { case NullLiteral: case NCName: { - setState(917); + setState(920); ((CatchClauseContext)_localctx).qname = qname(); ((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname); } @@ -5709,20 +5723,20 @@ public final CatchClauseContext catchClause() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(927); + setState(930); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__11) { { { - setState(920); - match(T__11); setState(923); + match(T__11); + setState(926); _errHandler.sync(this); switch (_input.LA(1)) { case T__10: { - setState(921); + setState(924); ((CatchClauseContext)_localctx).s11 = match(T__10); ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s11); } @@ -5790,9 +5804,10 @@ public final CatchClauseContext catchClause() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -5802,7 +5817,7 @@ public final CatchClauseContext catchClause() throws RecognitionException { case NullLiteral: case NCName: { - setState(922); + setState(925); ((CatchClauseContext)_localctx).qname = qname(); ((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname); } @@ -5812,15 +5827,15 @@ public final CatchClauseContext catchClause() throws RecognitionException { } } } - setState(929); + setState(932); _errHandler.sync(this); _la = _input.LA(1); } - setState(930); + setState(933); match(T__6); - setState(931); + setState(934); ((CatchClauseContext)_localctx).catch_expression = expr(); - setState(932); + setState(935); match(T__7); } } @@ -5868,26 +5883,26 @@ public final OrExprContext orExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(934); + setState(937); ((OrExprContext)_localctx).main_expr = andExpr(); - setState(939); + setState(942); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,85,_ctx); + _alt = getInterpreter().adaptivePredict(_input,86,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(935); + setState(938); match(Kor); - setState(936); + setState(939); ((OrExprContext)_localctx).andExpr = andExpr(); ((OrExprContext)_localctx).rhs.add(((OrExprContext)_localctx).andExpr); } } } - setState(941); + setState(944); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,85,_ctx); + _alt = getInterpreter().adaptivePredict(_input,86,_ctx); } } } @@ -5935,26 +5950,26 @@ public final AndExprContext andExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(942); + setState(945); ((AndExprContext)_localctx).main_expr = notExpr(); - setState(947); + setState(950); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,86,_ctx); + _alt = getInterpreter().adaptivePredict(_input,87,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(943); + setState(946); match(Kand); - setState(944); + setState(947); ((AndExprContext)_localctx).notExpr = notExpr(); ((AndExprContext)_localctx).rhs.add(((AndExprContext)_localctx).notExpr); } } } - setState(949); + setState(952); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,86,_ctx); + _alt = getInterpreter().adaptivePredict(_input,87,_ctx); } } } @@ -5995,18 +6010,18 @@ public final NotExprContext notExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(951); + setState(954); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) { case 1: { - setState(950); + setState(953); ((NotExprContext)_localctx).Knot = match(Knot); ((NotExprContext)_localctx).op.add(((NotExprContext)_localctx).Knot); } break; } - setState(953); + setState(956); ((NotExprContext)_localctx).main_expr = comparisonExpr(); } } @@ -6037,7 +6052,7 @@ public static class ComparisonExprContext extends ParserRuleContext { public Token s44; public Token s45; public Token s46; - public Token _tset1828; + public Token _tset1837; public StringConcatExprContext stringConcatExpr; public List rhs = new ArrayList(); public List stringConcatExpr() { @@ -6064,26 +6079,26 @@ public final ComparisonExprContext comparisonExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(955); - ((ComparisonExprContext)_localctx).main_expr = stringConcatExpr(); setState(958); + ((ComparisonExprContext)_localctx).main_expr = stringConcatExpr(); + setState(961); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 140668768878608L) != 0)) { { - setState(956); - ((ComparisonExprContext)_localctx)._tset1828 = _input.LT(1); + setState(959); + ((ComparisonExprContext)_localctx)._tset1837 = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 140668768878608L) != 0)) ) { - ((ComparisonExprContext)_localctx)._tset1828 = (Token)_errHandler.recoverInline(this); + ((ComparisonExprContext)_localctx)._tset1837 = (Token)_errHandler.recoverInline(this); } else { if ( _input.LA(1)==Token.EOF ) matchedEOF = true; _errHandler.reportMatch(this); consume(); } - ((ComparisonExprContext)_localctx).op.add(((ComparisonExprContext)_localctx)._tset1828); - setState(957); + ((ComparisonExprContext)_localctx).op.add(((ComparisonExprContext)_localctx)._tset1837); + setState(960); ((ComparisonExprContext)_localctx).stringConcatExpr = stringConcatExpr(); ((ComparisonExprContext)_localctx).rhs.add(((ComparisonExprContext)_localctx).stringConcatExpr); } @@ -6131,22 +6146,22 @@ public final StringConcatExprContext stringConcatExpr() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(960); + setState(963); ((StringConcatExprContext)_localctx).main_expr = rangeExpr(); - setState(965); + setState(968); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__46) { { { - setState(961); + setState(964); match(T__46); - setState(962); + setState(965); ((StringConcatExprContext)_localctx).rangeExpr = rangeExpr(); ((StringConcatExprContext)_localctx).rhs.add(((StringConcatExprContext)_localctx).rangeExpr); } } - setState(967); + setState(970); _errHandler.sync(this); _la = _input.LA(1); } @@ -6192,16 +6207,16 @@ public final RangeExprContext rangeExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(968); - ((RangeExprContext)_localctx).main_expr = additiveExpr(); setState(971); + ((RangeExprContext)_localctx).main_expr = additiveExpr(); + setState(974); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,91,_ctx) ) { case 1: { - setState(969); + setState(972); match(Kto); - setState(970); + setState(973); ((RangeExprContext)_localctx).additiveExpr = additiveExpr(); ((RangeExprContext)_localctx).rhs.add(((RangeExprContext)_localctx).additiveExpr); } @@ -6226,7 +6241,7 @@ public static class AdditiveExprContext extends ParserRuleContext { public Token s48; public List op = new ArrayList(); public Token s49; - public Token _tset1937; + public Token _tset1946; public MultiplicativeExprContext multiplicativeExpr; public List rhs = new ArrayList(); public List multiplicativeExpr() { @@ -6254,36 +6269,36 @@ public final AdditiveExprContext additiveExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(973); + setState(976); ((AdditiveExprContext)_localctx).main_expr = multiplicativeExpr(); - setState(978); + setState(981); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,91,_ctx); + _alt = getInterpreter().adaptivePredict(_input,92,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(974); - ((AdditiveExprContext)_localctx)._tset1937 = _input.LT(1); + setState(977); + ((AdditiveExprContext)_localctx)._tset1946 = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__47 || _la==T__48) ) { - ((AdditiveExprContext)_localctx)._tset1937 = (Token)_errHandler.recoverInline(this); + ((AdditiveExprContext)_localctx)._tset1946 = (Token)_errHandler.recoverInline(this); } else { if ( _input.LA(1)==Token.EOF ) matchedEOF = true; _errHandler.reportMatch(this); consume(); } - ((AdditiveExprContext)_localctx).op.add(((AdditiveExprContext)_localctx)._tset1937); - setState(975); + ((AdditiveExprContext)_localctx).op.add(((AdditiveExprContext)_localctx)._tset1946); + setState(978); ((AdditiveExprContext)_localctx).multiplicativeExpr = multiplicativeExpr(); ((AdditiveExprContext)_localctx).rhs.add(((AdditiveExprContext)_localctx).multiplicativeExpr); } } } - setState(980); + setState(983); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,91,_ctx); + _alt = getInterpreter().adaptivePredict(_input,92,_ctx); } } } @@ -6306,7 +6321,7 @@ public static class MultiplicativeExprContext extends ParserRuleContext { public Token s50; public Token s51; public Token s52; - public Token _tset1965; + public Token _tset1974; public InstanceOfExprContext instanceOfExpr; public List rhs = new ArrayList(); public List instanceOfExpr() { @@ -6333,32 +6348,32 @@ public final MultiplicativeExprContext multiplicativeExpr() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(981); + setState(984); ((MultiplicativeExprContext)_localctx).main_expr = instanceOfExpr(); - setState(986); + setState(989); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 7881299347900416L) != 0)) { { { - setState(982); - ((MultiplicativeExprContext)_localctx)._tset1965 = _input.LT(1); + setState(985); + ((MultiplicativeExprContext)_localctx)._tset1974 = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7881299347900416L) != 0)) ) { - ((MultiplicativeExprContext)_localctx)._tset1965 = (Token)_errHandler.recoverInline(this); + ((MultiplicativeExprContext)_localctx)._tset1974 = (Token)_errHandler.recoverInline(this); } else { if ( _input.LA(1)==Token.EOF ) matchedEOF = true; _errHandler.reportMatch(this); consume(); } - ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1965); - setState(983); + ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1974); + setState(986); ((MultiplicativeExprContext)_localctx).instanceOfExpr = instanceOfExpr(); ((MultiplicativeExprContext)_localctx).rhs.add(((MultiplicativeExprContext)_localctx).instanceOfExpr); } } - setState(988); + setState(991); _errHandler.sync(this); _la = _input.LA(1); } @@ -6404,18 +6419,18 @@ public final InstanceOfExprContext instanceOfExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(989); + setState(992); ((InstanceOfExprContext)_localctx).main_expr = isStaticallyExpr(); - setState(993); + setState(996); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) { case 1: { - setState(990); + setState(993); match(Kinstance); - setState(991); + setState(994); match(Kof); - setState(992); + setState(995); ((InstanceOfExprContext)_localctx).seq = sequenceType(); } break; @@ -6462,18 +6477,18 @@ public final IsStaticallyExprContext isStaticallyExpr() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(995); + setState(998); ((IsStaticallyExprContext)_localctx).main_expr = treatExpr(); - setState(999); + setState(1002); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { case 1: { - setState(996); + setState(999); match(Kis); - setState(997); + setState(1000); match(Kstatically); - setState(998); + setState(1001); ((IsStaticallyExprContext)_localctx).seq = sequenceType(); } break; @@ -6520,18 +6535,18 @@ public final TreatExprContext treatExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1001); + setState(1004); ((TreatExprContext)_localctx).main_expr = castableExpr(); - setState(1005); + setState(1008); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { case 1: { - setState(1002); + setState(1005); match(Ktreat); - setState(1003); + setState(1006); match(Kas); - setState(1004); + setState(1007); ((TreatExprContext)_localctx).seq = sequenceType(); } break; @@ -6578,18 +6593,18 @@ public final CastableExprContext castableExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1007); + setState(1010); ((CastableExprContext)_localctx).main_expr = castExpr(); - setState(1011); + setState(1014); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { case 1: { - setState(1008); + setState(1011); match(Kcastable); - setState(1009); + setState(1012); match(Kas); - setState(1010); + setState(1013); ((CastableExprContext)_localctx).single = singleType(); } break; @@ -6636,18 +6651,18 @@ public final CastExprContext castExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1013); + setState(1016); ((CastExprContext)_localctx).main_expr = arrowExpr(); - setState(1017); + setState(1020); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,98,_ctx) ) { case 1: { - setState(1014); + setState(1017); match(Kcast); - setState(1015); + setState(1018); match(Kas); - setState(1016); + setState(1019); ((CastExprContext)_localctx).single = singleType(); } break; @@ -6705,33 +6720,33 @@ public final ArrowExprContext arrowExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1019); + setState(1022); ((ArrowExprContext)_localctx).main_expr = unaryExpr(); - setState(1028); + setState(1031); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,98,_ctx); + _alt = getInterpreter().adaptivePredict(_input,99,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { { - setState(1020); + setState(1023); match(T__3); - setState(1021); + setState(1024); match(T__44); } - setState(1023); + setState(1026); ((ArrowExprContext)_localctx).arrowFunctionSpecifier = arrowFunctionSpecifier(); ((ArrowExprContext)_localctx).function.add(((ArrowExprContext)_localctx).arrowFunctionSpecifier); - setState(1024); + setState(1027); ((ArrowExprContext)_localctx).argumentList = argumentList(); ((ArrowExprContext)_localctx).arguments.add(((ArrowExprContext)_localctx).argumentList); } } } - setState(1030); + setState(1033); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,98,_ctx); + _alt = getInterpreter().adaptivePredict(_input,99,_ctx); } } } @@ -6772,7 +6787,7 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog ArrowFunctionSpecifierContext _localctx = new ArrowFunctionSpecifierContext(_ctx, getState()); enterRule(_localctx, 166, RULE_arrowFunctionSpecifier); try { - setState(1034); + setState(1037); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -6838,9 +6853,10 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -6851,21 +6867,21 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog case NCName: enterOuterAlt(_localctx, 1); { - setState(1031); + setState(1034); qname(); } break; case T__4: enterOuterAlt(_localctx, 2); { - setState(1032); + setState(1035); varRef(); } break; case T__8: enterOuterAlt(_localctx, 3); { - setState(1033); + setState(1036); parenthesizedExpr(); } break; @@ -6889,7 +6905,7 @@ public static class UnaryExprContext extends ParserRuleContext { public Token s49; public List op = new ArrayList(); public Token s48; - public Token _tset2144; + public Token _tset2153; public ValueExprContext main_expr; public ValueExprContext valueExpr() { return getRuleContext(ValueExprContext.class,0); @@ -6912,31 +6928,31 @@ public final UnaryExprContext unaryExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1039); + setState(1042); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__47 || _la==T__48) { { { - setState(1036); - ((UnaryExprContext)_localctx)._tset2144 = _input.LT(1); + setState(1039); + ((UnaryExprContext)_localctx)._tset2153 = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__47 || _la==T__48) ) { - ((UnaryExprContext)_localctx)._tset2144 = (Token)_errHandler.recoverInline(this); + ((UnaryExprContext)_localctx)._tset2153 = (Token)_errHandler.recoverInline(this); } else { if ( _input.LA(1)==Token.EOF ) matchedEOF = true; _errHandler.reportMatch(this); consume(); } - ((UnaryExprContext)_localctx).op.add(((UnaryExprContext)_localctx)._tset2144); + ((UnaryExprContext)_localctx).op.add(((UnaryExprContext)_localctx)._tset2153); } } - setState(1041); + setState(1044); _errHandler.sync(this); _la = _input.LA(1); } - setState(1042); + setState(1045); ((UnaryExprContext)_localctx).main_expr = valueExpr(); } } @@ -6980,27 +6996,27 @@ public final ValueExprContext valueExpr() throws RecognitionException { ValueExprContext _localctx = new ValueExprContext(_ctx, getState()); enterRule(_localctx, 170, RULE_valueExpr); try { - setState(1047); + setState(1050); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1044); + setState(1047); ((ValueExprContext)_localctx).simpleMap_expr = simpleMapExpr(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1045); + setState(1048); ((ValueExprContext)_localctx).validate_expr = validateExpr(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1046); + setState(1049); ((ValueExprContext)_localctx).annotate_expr = annotateExpr(); } break; @@ -7044,17 +7060,17 @@ public final ValidateExprContext validateExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1049); + setState(1052); match(Kvalidate); - setState(1050); + setState(1053); match(Ktype); - setState(1051); + setState(1054); sequenceType(); - setState(1052); + setState(1055); match(T__6); - setState(1053); + setState(1056); expr(); - setState(1054); + setState(1057); match(T__7); } } @@ -7096,17 +7112,17 @@ public final AnnotateExprContext annotateExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1056); + setState(1059); match(Kannotate); - setState(1057); + setState(1060); match(Ktype); - setState(1058); + setState(1061); sequenceType(); - setState(1059); + setState(1062); match(T__6); - setState(1060); + setState(1063); expr(); - setState(1061); + setState(1064); match(T__7); } } @@ -7150,22 +7166,22 @@ public final SimpleMapExprContext simpleMapExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1063); + setState(1066); ((SimpleMapExprContext)_localctx).main_expr = postFixExpr(); - setState(1068); + setState(1071); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__52) { { { - setState(1064); + setState(1067); match(T__52); - setState(1065); + setState(1068); ((SimpleMapExprContext)_localctx).postFixExpr = postFixExpr(); ((SimpleMapExprContext)_localctx).map_expr.add(((SimpleMapExprContext)_localctx).postFixExpr); } } - setState(1070); + setState(1073); _errHandler.sync(this); _la = _input.LA(1); } @@ -7236,53 +7252,53 @@ public final PostFixExprContext postFixExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1071); + setState(1074); ((PostFixExprContext)_localctx).main_expr = primaryExpr(); - setState(1079); + setState(1082); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,104,_ctx); + _alt = getInterpreter().adaptivePredict(_input,105,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { - setState(1077); + setState(1080); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,104,_ctx) ) { case 1: { - setState(1072); + setState(1075); arrayLookup(); } break; case 2: { - setState(1073); + setState(1076); predicate(); } break; case 3: { - setState(1074); + setState(1077); objectLookup(); } break; case 4: { - setState(1075); + setState(1078); arrayUnboxing(); } break; case 5: { - setState(1076); + setState(1079); argumentList(); } break; } } } - setState(1081); + setState(1084); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,104,_ctx); + _alt = getInterpreter().adaptivePredict(_input,105,_ctx); } } } @@ -7319,15 +7335,15 @@ public final ArrayLookupContext arrayLookup() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1082); + setState(1085); match(T__53); - setState(1083); + setState(1086); match(T__53); - setState(1084); + setState(1087); expr(); - setState(1085); + setState(1088); match(T__54); - setState(1086); + setState(1089); match(T__54); } } @@ -7361,9 +7377,9 @@ public final ArrayUnboxingContext arrayUnboxing() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1088); + setState(1091); match(T__53); - setState(1089); + setState(1092); match(T__54); } } @@ -7400,11 +7416,11 @@ public final PredicateContext predicate() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1091); + setState(1094); match(T__53); - setState(1092); + setState(1095); expr(); - setState(1093); + setState(1096); match(T__54); } } @@ -7460,9 +7476,9 @@ public final ObjectLookupContext objectLookup() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1095); + setState(1098); match(T__55); - setState(1102); + setState(1105); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -7528,9 +7544,10 @@ public final ObjectLookupContext objectLookup() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -7539,37 +7556,37 @@ public final ObjectLookupContext objectLookup() throws RecognitionException { case Kwhile: case NullLiteral: { - setState(1096); + setState(1099); ((ObjectLookupContext)_localctx).kw = keyWords(); } break; case STRING: { - setState(1097); + setState(1100); ((ObjectLookupContext)_localctx).lt = stringLiteral(); } break; case NCName: { - setState(1098); + setState(1101); ((ObjectLookupContext)_localctx).nc = match(NCName); } break; case T__8: { - setState(1099); + setState(1102); ((ObjectLookupContext)_localctx).pe = parenthesizedExpr(); } break; case T__4: { - setState(1100); + setState(1103); ((ObjectLookupContext)_localctx).vr = varRef(); } break; case T__56: { - setState(1101); + setState(1104); ((ObjectLookupContext)_localctx).ci = contextItemExpr(); } break; @@ -7643,111 +7660,111 @@ public final PrimaryExprContext primaryExpr() throws RecognitionException { PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, getState()); enterRule(_localctx, 188, RULE_primaryExpr); try { - setState(1119); + setState(1122); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,107,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1104); + setState(1107); match(NullLiteral); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1105); + setState(1108); match(Ktrue); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1106); + setState(1109); match(Kfalse); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1107); + setState(1110); match(Literal); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1108); + setState(1111); stringLiteral(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1109); + setState(1112); varRef(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1110); + setState(1113); parenthesizedExpr(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1111); + setState(1114); contextItemExpr(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1112); + setState(1115); objectConstructor(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1113); + setState(1116); functionCall(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1114); + setState(1117); orderedExpr(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1115); + setState(1118); unorderedExpr(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1116); + setState(1119); arrayConstructor(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1117); + setState(1120); functionItemExpr(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1118); + setState(1121); blockExpr(); } break; @@ -7786,11 +7803,11 @@ public final BlockExprContext blockExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1121); + setState(1124); match(T__6); - setState(1122); + setState(1125); statementsAndExpr(); - setState(1123); + setState(1126); match(T__7); } } @@ -7828,9 +7845,9 @@ public final VarRefContext varRef() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1125); + setState(1128); match(T__4); - setState(1126); + setState(1129); ((VarRefContext)_localctx).var_name = qname(); } } @@ -7868,19 +7885,19 @@ public final ParenthesizedExprContext parenthesizedExpr() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1128); + setState(1131); match(T__8); - setState(1130); + setState(1133); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 16831L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 33663L) != 0)) { { - setState(1129); + setState(1132); expr(); } } - setState(1132); + setState(1135); match(T__9); } } @@ -7914,7 +7931,7 @@ public final ContextItemExprContext contextItemExpr() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1134); + setState(1137); match(T__56); } } @@ -7951,13 +7968,13 @@ public final OrderedExprContext orderedExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1136); + setState(1139); match(T__15); - setState(1137); + setState(1140); match(T__6); - setState(1138); + setState(1141); expr(); - setState(1139); + setState(1142); match(T__7); } } @@ -7995,13 +8012,13 @@ public final UnorderedExprContext unorderedExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1141); + setState(1144); match(Kunordered); - setState(1142); + setState(1145); match(T__6); - setState(1143); + setState(1146); expr(); - setState(1144); + setState(1147); match(T__7); } } @@ -8042,9 +8059,9 @@ public final FunctionCallContext functionCall() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1146); + setState(1149); ((FunctionCallContext)_localctx).fn_name = qname(); - setState(1147); + setState(1150); argumentList(); } } @@ -8087,34 +8104,34 @@ public final ArgumentListContext argumentList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1149); + setState(1152); match(T__8); - setState(1156); + setState(1159); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 16895L) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 33791L) != 0)) { { { - setState(1150); + setState(1153); ((ArgumentListContext)_localctx).argument = argument(); ((ArgumentListContext)_localctx).args.add(((ArgumentListContext)_localctx).argument); - setState(1152); + setState(1155); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__13) { { - setState(1151); + setState(1154); match(T__13); } } } } - setState(1158); + setState(1161); _errHandler.sync(this); _la = _input.LA(1); } - setState(1159); + setState(1162); match(T__9); } } @@ -8150,7 +8167,7 @@ public final ArgumentContext argument() throws RecognitionException { ArgumentContext _localctx = new ArgumentContext(_ctx, getState()); enterRule(_localctx, 206, RULE_argument); try { - setState(1163); + setState(1166); _errHandler.sync(this); switch (_input.LA(1)) { case T__4: @@ -8227,9 +8244,10 @@ public final ArgumentContext argument() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -8242,14 +8260,14 @@ public final ArgumentContext argument() throws RecognitionException { case NCName: enterOuterAlt(_localctx, 1); { - setState(1161); + setState(1164); exprSingle(); } break; case ArgumentPlaceholder: enterOuterAlt(_localctx, 2); { - setState(1162); + setState(1165); match(ArgumentPlaceholder); } break; @@ -8291,99 +8309,23 @@ public final FunctionItemExprContext functionItemExpr() throws RecognitionExcept FunctionItemExprContext _localctx = new FunctionItemExprContext(_ctx, getState()); enterRule(_localctx, 208, RULE_functionItemExpr); try { - setState(1167); + setState(1170); _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: + switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { + case 1: enterOuterAlt(_localctx, 1); { - setState(1165); + setState(1168); namedFunctionRef(); } break; - case T__12: - case T__30: + case 2: enterOuterAlt(_localctx, 2); { - setState(1166); + setState(1169); inlineFunctionExpr(); } break; - default: - throw new NoViableAltException(this); } } catch (RecognitionException re) { @@ -8422,11 +8364,11 @@ public final NamedFunctionRefContext namedFunctionRef() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1169); + setState(1172); ((NamedFunctionRefContext)_localctx).fn_name = qname(); - setState(1170); + setState(1173); match(T__57); - setState(1171); + setState(1174); ((NamedFunctionRefContext)_localctx).arity = match(Literal); } } @@ -8476,44 +8418,44 @@ public final InlineFunctionExprContext inlineFunctionExpr() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(1173); + setState(1176); annotations(); - setState(1174); + setState(1177); match(T__30); - setState(1175); + setState(1178); match(T__8); - setState(1177); + setState(1180); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__4) { { - setState(1176); + setState(1179); paramList(); } } - setState(1179); - match(T__9); setState(1182); + match(T__9); + setState(1185); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(1180); + setState(1183); match(Kas); - setState(1181); + setState(1184); ((InlineFunctionExprContext)_localctx).return_type = sequenceType(); } } { - setState(1184); + setState(1187); match(T__6); { - setState(1185); + setState(1188); ((InlineFunctionExprContext)_localctx).fn_body = statementsAndOptionalExpr(); } - setState(1186); + setState(1189); match(T__7); } } @@ -8567,32 +8509,32 @@ public final InsertExprContext insertExpr() throws RecognitionException { enterRule(_localctx, 214, RULE_insertExpr); int _la; try { - setState(1211); + setState(1214); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1188); + setState(1191); match(Kinsert); - setState(1189); + setState(1192); match(Kjson); - setState(1190); + setState(1193); ((InsertExprContext)_localctx).to_insert_expr = exprSingle(); - setState(1191); + setState(1194); match(Kinto); - setState(1192); + setState(1195); ((InsertExprContext)_localctx).main_expr = exprSingle(); - setState(1196); + setState(1199); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) { case 1: { - setState(1193); + setState(1196); match(Kat); - setState(1194); + setState(1197); match(Kposition); - setState(1195); + setState(1198); ((InsertExprContext)_localctx).pos_expr = exprSingle(); } break; @@ -8602,31 +8544,31 @@ public final InsertExprContext insertExpr() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(1198); + setState(1201); match(Kinsert); - setState(1199); + setState(1202); match(Kjson); - setState(1200); + setState(1203); pairConstructor(); - setState(1205); + setState(1208); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(1201); + setState(1204); match(T__13); - setState(1202); + setState(1205); pairConstructor(); } } - setState(1207); + setState(1210); _errHandler.sync(this); _la = _input.LA(1); } - setState(1208); + setState(1211); match(Kinto); - setState(1209); + setState(1212); ((InsertExprContext)_localctx).main_expr = exprSingle(); } break; @@ -8667,11 +8609,11 @@ public final DeleteExprContext deleteExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1213); + setState(1216); match(Kdelete); - setState(1214); + setState(1217); match(Kjson); - setState(1215); + setState(1218); updateLocator(); } } @@ -8715,15 +8657,15 @@ public final RenameExprContext renameExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1217); + setState(1220); match(Krename); - setState(1218); + setState(1221); match(Kjson); - setState(1219); + setState(1222); updateLocator(); - setState(1220); + setState(1223); match(Kas); - setState(1221); + setState(1224); ((RenameExprContext)_localctx).name_expr = exprSingle(); } } @@ -8769,19 +8711,19 @@ public final ReplaceExprContext replaceExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1223); + setState(1226); match(Kreplace); - setState(1224); + setState(1227); match(Kvalue); - setState(1225); + setState(1228); match(Kof); - setState(1226); + setState(1229); match(Kjson); - setState(1227); + setState(1230); updateLocator(); - setState(1228); + setState(1231); match(Kwith); - setState(1229); + setState(1232); ((ReplaceExprContext)_localctx).replacer_expr = exprSingle(); } } @@ -8833,33 +8775,33 @@ public final TransformExprContext transformExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1231); + setState(1234); match(Kcopy); - setState(1232); + setState(1235); copyDecl(); - setState(1237); + setState(1240); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(1233); + setState(1236); match(T__13); - setState(1234); + setState(1237); copyDecl(); } } - setState(1239); + setState(1242); _errHandler.sync(this); _la = _input.LA(1); } - setState(1240); + setState(1243); match(Kmodify); - setState(1241); + setState(1244); ((TransformExprContext)_localctx).mod_expr = exprSingle(); - setState(1242); + setState(1245); match(Kreturn); - setState(1243); + setState(1246); ((TransformExprContext)_localctx).ret_expr = exprSingle(); } } @@ -8904,15 +8846,15 @@ public final AppendExprContext appendExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1245); + setState(1248); match(Kappend); - setState(1246); + setState(1249); match(Kjson); - setState(1247); + setState(1250); ((AppendExprContext)_localctx).to_append_expr = exprSingle(); - setState(1248); + setState(1251); match(Kinto); - setState(1249); + setState(1252); ((AppendExprContext)_localctx).array_expr = exprSingle(); } } @@ -8963,27 +8905,27 @@ public final UpdateLocatorContext updateLocator() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1251); + setState(1254); ((UpdateLocatorContext)_localctx).main_expr = primaryExpr(); - setState(1254); + setState(1257); _errHandler.sync(this); _alt = 1; do { switch (_alt) { case 1: { - setState(1254); + setState(1257); _errHandler.sync(this); switch (_input.LA(1)) { case T__53: { - setState(1252); + setState(1255); arrayLookup(); } break; case T__55: { - setState(1253); + setState(1256); objectLookup(); } break; @@ -8995,9 +8937,9 @@ public final UpdateLocatorContext updateLocator() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1256); + setState(1259); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,119,_ctx); + _alt = getInterpreter().adaptivePredict(_input,120,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -9039,11 +8981,11 @@ public final CopyDeclContext copyDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1258); + setState(1261); ((CopyDeclContext)_localctx).var_ref = varRef(); - setState(1259); + setState(1262); match(T__5); - setState(1260); + setState(1263); ((CopyDeclContext)_localctx).src_expr = exprSingle(); } } @@ -9061,7 +9003,7 @@ public final CopyDeclContext copyDecl() throws RecognitionException { @SuppressWarnings("CheckReturnValue") public static class SequenceTypeContext extends ParserRuleContext { public ItemTypeContext item; - public Token s134; + public Token s135; public List question = new ArrayList(); public Token s11; public List star = new ArrayList(); @@ -9086,15 +9028,15 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { SequenceTypeContext _localctx = new SequenceTypeContext(_ctx, getState()); enterRule(_localctx, 230, RULE_sequenceType); try { - setState(1270); + setState(1273); _errHandler.sync(this); switch (_input.LA(1)) { case T__8: enterOuterAlt(_localctx, 1); { - setState(1262); + setState(1265); match(T__8); - setState(1263); + setState(1266); match(T__9); } break; @@ -9162,9 +9104,10 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { case Kappend: case Kinto: case Kvalue: - case Kjson: case Kwith: case Kposition: + case Kjson: + case Kupdating: case Kbreak: case Kloop: case Kcontinue: @@ -9175,28 +9118,28 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { case NCName: enterOuterAlt(_localctx, 2); { - setState(1264); + setState(1267); ((SequenceTypeContext)_localctx).item = itemType(); - setState(1268); + setState(1271); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) { case 1: { - setState(1265); - ((SequenceTypeContext)_localctx).s134 = match(ArgumentPlaceholder); - ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s134); + setState(1268); + ((SequenceTypeContext)_localctx).s135 = match(ArgumentPlaceholder); + ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s135); } break; case 2: { - setState(1266); + setState(1269); ((SequenceTypeContext)_localctx).s11 = match(T__10); ((SequenceTypeContext)_localctx).star.add(((SequenceTypeContext)_localctx).s11); } break; case 3: { - setState(1267); + setState(1270); ((SequenceTypeContext)_localctx).s48 = match(T__47); ((SequenceTypeContext)_localctx).plus.add(((SequenceTypeContext)_localctx).s48); } @@ -9248,53 +9191,53 @@ public final ObjectConstructorContext objectConstructor() throws RecognitionExce enterRule(_localctx, 232, RULE_objectConstructor); int _la; try { - setState(1288); + setState(1291); _errHandler.sync(this); switch (_input.LA(1)) { case T__6: enterOuterAlt(_localctx, 1); { - setState(1272); + setState(1275); match(T__6); - setState(1281); + setState(1284); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 16831L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 33663L) != 0)) { { - setState(1273); + setState(1276); pairConstructor(); - setState(1278); + setState(1281); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(1274); + setState(1277); match(T__13); - setState(1275); + setState(1278); pairConstructor(); } } - setState(1280); + setState(1283); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1283); + setState(1286); match(T__7); } break; case T__58: enterOuterAlt(_localctx, 2); { - setState(1284); + setState(1287); ((ObjectConstructorContext)_localctx).s59 = match(T__58); ((ObjectConstructorContext)_localctx).merge_operator.add(((ObjectConstructorContext)_localctx).s59); - setState(1285); + setState(1288); expr(); - setState(1286); + setState(1289); match(T__59); } break; @@ -9337,27 +9280,27 @@ public final ItemTypeContext itemType() throws RecognitionException { ItemTypeContext _localctx = new ItemTypeContext(_ctx, getState()); enterRule(_localctx, 234, RULE_itemType); try { - setState(1293); + setState(1296); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1290); + setState(1293); qname(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1291); + setState(1294); match(NullLiteral); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1292); + setState(1295); functionTest(); } break; @@ -9399,18 +9342,18 @@ public final FunctionTestContext functionTest() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1297); + setState(1300); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { case 1: { - setState(1295); + setState(1298); anyFunctionTest(); } break; case 2: { - setState(1296); + setState(1299); typedFunctionTest(); } break; @@ -9447,13 +9390,13 @@ public final AnyFunctionTestContext anyFunctionTest() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1299); + setState(1302); match(T__30); - setState(1300); + setState(1303); match(T__8); - setState(1301); + setState(1304); match(T__10); - setState(1302); + setState(1305); match(T__9); } } @@ -9498,43 +9441,43 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1304); + setState(1307); match(T__30); - setState(1305); + setState(1308); match(T__8); - setState(1314); + setState(1317); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -2305843007066209792L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 16543L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -2305843007066209792L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 33087L) != 0)) { { - setState(1306); + setState(1309); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); - setState(1311); + setState(1314); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(1307); + setState(1310); match(T__13); - setState(1308); + setState(1311); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); } } - setState(1313); + setState(1316); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(1316); + setState(1319); match(T__9); - setState(1317); + setState(1320); match(Kas); - setState(1318); + setState(1321); ((TypedFunctionTestContext)_localctx).rt = sequenceType(); } } @@ -9552,7 +9495,7 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce @SuppressWarnings("CheckReturnValue") public static class SingleTypeContext extends ParserRuleContext { public ItemTypeContext item; - public Token s134; + public Token s135; public List question = new ArrayList(); public ItemTypeContext itemType() { return getRuleContext(ItemTypeContext.class,0); @@ -9575,16 +9518,16 @@ public final SingleTypeContext singleType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1320); + setState(1323); ((SingleTypeContext)_localctx).item = itemType(); - setState(1322); + setState(1325); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { case 1: { - setState(1321); - ((SingleTypeContext)_localctx).s134 = match(ArgumentPlaceholder); - ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s134); + setState(1324); + ((SingleTypeContext)_localctx).s135 = match(ArgumentPlaceholder); + ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s135); } break; } @@ -9632,23 +9575,23 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1326); + setState(1329); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { case 1: { - setState(1324); + setState(1327); ((PairConstructorContext)_localctx).lhs = exprSingle(); } break; case 2: { - setState(1325); + setState(1328); ((PairConstructorContext)_localctx).name = match(NCName); } break; } - setState(1328); + setState(1331); _la = _input.LA(1); if ( !(_la==T__17 || _la==ArgumentPlaceholder) ) { _errHandler.recoverInline(this); @@ -9658,7 +9601,7 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio _errHandler.reportMatch(this); consume(); } - setState(1329); + setState(1332); ((PairConstructorContext)_localctx).rhs = exprSingle(); } } @@ -9696,19 +9639,19 @@ public final ArrayConstructorContext arrayConstructor() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(1331); + setState(1334); match(T__53); - setState(1333); + setState(1336); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 16831L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -1566408243247242592L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 33663L) != 0)) { { - setState(1332); + setState(1335); expr(); } } - setState(1335); + setState(1338); match(T__54); } } @@ -9745,7 +9688,7 @@ public final UriLiteralContext uriLiteral() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1337); + setState(1340); stringLiteral(); } } @@ -9780,7 +9723,7 @@ public final StringLiteralContext stringLiteral() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1339); + setState(1342); match(STRING); } } @@ -9857,7 +9800,6 @@ public static class KeyWordsContext extends ParserRuleContext { public TerminalNode Kappend() { return getToken(JsoniqParser.Kappend, 0); } public TerminalNode Kcopy() { return getToken(JsoniqParser.Kcopy, 0); } public TerminalNode Kmodify() { return getToken(JsoniqParser.Kmodify, 0); } - public TerminalNode Kjson() { return getToken(JsoniqParser.Kjson, 0); } public TerminalNode Kinto() { return getToken(JsoniqParser.Kinto, 0); } public TerminalNode Kvalue() { return getToken(JsoniqParser.Kvalue, 0); } public TerminalNode Kwith() { return getToken(JsoniqParser.Kwith, 0); } @@ -9870,6 +9812,8 @@ public static class KeyWordsContext extends ParserRuleContext { public TerminalNode Kexit() { return getToken(JsoniqParser.Kexit, 0); } public TerminalNode Kreturning() { return getToken(JsoniqParser.Kreturning, 0); } public TerminalNode Kwhile() { return getToken(JsoniqParser.Kwhile, 0); } + public TerminalNode Kjson() { return getToken(JsoniqParser.Kjson, 0); } + public TerminalNode Kupdating() { return getToken(JsoniqParser.Kupdating, 0); } public KeyWordsContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -9888,9 +9832,9 @@ public final KeyWordsContext keyWords() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1341); + setState(1344); _la = _input.LA(1); - if ( !(((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & -1L) != 0) || ((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 1279L) != 0)) ) { + if ( !(((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & -1L) != 0) || ((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 2559L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -9912,7 +9856,7 @@ public final KeyWordsContext keyWords() throws RecognitionException { } public static final String _serializedATN = - "\u0004\u0001\u0090\u0540\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u0091\u0543\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ @@ -9976,770 +9920,773 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\u0017\u01c6\b\u0017\n\u0017\f\u0017\u01c9\t\u0017\u0001\u0017\u0001\u0017"+ "\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ "\u0001\u0018\u0005\u0018\u01d4\b\u0018\n\u0018\f\u0018\u01d7\t\u0018\u0001"+ - "\u0018\u0003\u0018\u01da\b\u0018\u0001\u0019\u0005\u0019\u01dd\b\u0019"+ - "\n\u0019\f\u0019\u01e0\t\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+ - "\u001a\u0001\u001a\u0005\u001a\u01e7\b\u001a\n\u001a\f\u001a\u01ea\t\u001a"+ - "\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0003\u001b"+ - "\u01f1\b\u001b\u0001\u001b\u0001\u001b\u0003\u001b\u01f5\b\u001b\u0001"+ - "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ - "\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0003\u001d\u0201\b\u001d\u0001"+ - "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u020d\b\u001f\u0001"+ - " \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001\"\u0001"+ - "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#"+ - "\u0003#\u0223\b#\u0001#\u0001#\u0001#\u0001#\u0005#\u0229\b#\n#\f#\u022c"+ - "\t#\u0001$\u0001$\u0003$\u0230\b$\u0001$\u0003$\u0233\b$\u0001$\u0001"+ - "$\u0003$\u0237\b$\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001&\u0003"+ - "&\u0240\b&\u0001&\u0001&\u0001&\u0001&\u0001&\u0005&\u0247\b&\n&\f&\u024a"+ - "\t&\u0003&\u024c\b&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0003"+ - "\'\u0254\b\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0003\'\u025b\b\'"+ - "\u0003\'\u025d\b\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0003(\u0264\b("+ - "\u0001(\u0001(\u0001(\u0001(\u0001(\u0003(\u026b\b(\u0003(\u026d\b(\u0001"+ - ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0003)\u0275\b)\u0001)\u0001)\u0001"+ - ")\u0003)\u027a\b)\u0001)\u0001)\u0001)\u0001)\u0001)\u0003)\u0281\b)\u0001"+ - "*\u0001*\u0001*\u0001*\u0001*\u0003*\u0288\b*\u0001*\u0001*\u0001+\u0001"+ - "+\u0001+\u0001+\u0001+\u0001+\u0003+\u0292\b+\u0001,\u0001,\u0001,\u0005"+ - ",\u0297\b,\n,\f,\u029a\t,\u0001-\u0001-\u0001-\u0001-\u0003-\u02a0\b-"+ - "\u0001.\u0001.\u0001.\u0005.\u02a5\b.\n.\f.\u02a8\t.\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0003/\u02b0\b/\u00010\u00010\u00010\u00010\u0001"+ - "0\u00010\u00010\u00010\u00030\u02ba\b0\u00011\u00011\u00031\u02be\b1\u0001"+ - "1\u00011\u00011\u00011\u00011\u00011\u00051\u02c6\b1\n1\f1\u02c9\t1\u0001"+ - "1\u00011\u00011\u00012\u00012\u00012\u00012\u00052\u02d2\b2\n2\f2\u02d5"+ - "\t2\u00013\u00013\u00013\u00033\u02da\b3\u00013\u00013\u00033\u02de\b"+ - "3\u00013\u00013\u00033\u02e2\b3\u00013\u00013\u00013\u00014\u00014\u0001"+ - "4\u00014\u00054\u02eb\b4\n4\f4\u02ee\t4\u00015\u00015\u00015\u00035\u02f3"+ - "\b5\u00015\u00015\u00015\u00016\u00016\u00016\u00017\u00017\u00017\u0001"+ - "7\u00017\u00057\u0300\b7\n7\f7\u0303\t7\u00018\u00018\u00018\u00038\u0308"+ - "\b8\u00018\u00018\u00038\u030c\b8\u00018\u00018\u00038\u0310\b8\u0001"+ - "9\u00019\u00019\u00019\u00019\u00039\u0317\b9\u00019\u00019\u00019\u0005"+ - "9\u031c\b9\n9\f9\u031f\t9\u0001:\u0001:\u0001:\u0003:\u0324\b:\u0001:"+ - "\u0001:\u0001:\u0003:\u0329\b:\u0003:\u032b\b:\u0001:\u0001:\u0003:\u032f"+ - "\b:\u0001;\u0001;\u0001;\u0001<\u0001<\u0003<\u0336\b<\u0001<\u0001<\u0001"+ - "<\u0005<\u033b\b<\n<\f<\u033e\t<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001"+ - "=\u0003=\u0346\b=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001"+ - ">\u0004>\u0350\b>\u000b>\f>\u0351\u0001>\u0001>\u0001>\u0001>\u0001?\u0001"+ - "?\u0004?\u035a\b?\u000b?\f?\u035b\u0001?\u0001?\u0001?\u0001@\u0001@\u0001"+ - "@\u0001@\u0001@\u0004@\u0366\b@\u000b@\f@\u0367\u0001@\u0001@\u0003@\u036c"+ - "\b@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0003A\u0375\bA\u0001"+ - "A\u0001A\u0001A\u0005A\u037a\bA\nA\fA\u037d\tA\u0001A\u0001A\u0001A\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0004C\u0390\bC\u000bC\fC\u0391\u0001D\u0001D\u0001"+ - "D\u0003D\u0397\bD\u0001D\u0001D\u0001D\u0003D\u039c\bD\u0005D\u039e\b"+ - "D\nD\fD\u03a1\tD\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0005"+ - "E\u03aa\bE\nE\fE\u03ad\tE\u0001F\u0001F\u0001F\u0005F\u03b2\bF\nF\fF\u03b5"+ - "\tF\u0001G\u0003G\u03b8\bG\u0001G\u0001G\u0001H\u0001H\u0001H\u0003H\u03bf"+ - "\bH\u0001I\u0001I\u0001I\u0005I\u03c4\bI\nI\fI\u03c7\tI\u0001J\u0001J"+ - "\u0001J\u0003J\u03cc\bJ\u0001K\u0001K\u0001K\u0005K\u03d1\bK\nK\fK\u03d4"+ - "\tK\u0001L\u0001L\u0001L\u0005L\u03d9\bL\nL\fL\u03dc\tL\u0001M\u0001M"+ - "\u0001M\u0001M\u0003M\u03e2\bM\u0001N\u0001N\u0001N\u0001N\u0003N\u03e8"+ - "\bN\u0001O\u0001O\u0001O\u0001O\u0003O\u03ee\bO\u0001P\u0001P\u0001P\u0001"+ - "P\u0003P\u03f4\bP\u0001Q\u0001Q\u0001Q\u0001Q\u0003Q\u03fa\bQ\u0001R\u0001"+ - "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0005R\u0403\bR\nR\fR\u0406\tR\u0001"+ - "S\u0001S\u0001S\u0003S\u040b\bS\u0001T\u0005T\u040e\bT\nT\fT\u0411\tT"+ - "\u0001T\u0001T\u0001U\u0001U\u0001U\u0003U\u0418\bU\u0001V\u0001V\u0001"+ - "V\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001"+ - "W\u0001W\u0001X\u0001X\u0001X\u0005X\u042b\bX\nX\fX\u042e\tX\u0001Y\u0001"+ - "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0005Y\u0436\bY\nY\fY\u0439\tY\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001"+ - "\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0003]\u044f"+ - "\b]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+ - "^\u0001^\u0001^\u0001^\u0001^\u0001^\u0003^\u0460\b^\u0001_\u0001_\u0001"+ - "_\u0001_\u0001`\u0001`\u0001`\u0001a\u0001a\u0003a\u046b\ba\u0001a\u0001"+ - "a\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001"+ - "d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0003f\u0481"+ - "\bf\u0005f\u0483\bf\nf\ff\u0486\tf\u0001f\u0001f\u0001g\u0001g\u0003g"+ - "\u048c\bg\u0001h\u0001h\u0003h\u0490\bh\u0001i\u0001i\u0001i\u0001i\u0001"+ - "j\u0001j\u0001j\u0001j\u0003j\u049a\bj\u0001j\u0001j\u0001j\u0003j\u049f"+ - "\bj\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001k\u0001"+ - "k\u0001k\u0001k\u0003k\u04ad\bk\u0001k\u0001k\u0001k\u0001k\u0001k\u0005"+ - "k\u04b4\bk\nk\fk\u04b7\tk\u0001k\u0001k\u0001k\u0003k\u04bc\bk\u0001l"+ - "\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001"+ - "n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001"+ - "o\u0001o\u0005o\u04d4\bo\no\fo\u04d7\to\u0001o\u0001o\u0001o\u0001o\u0001"+ - "o\u0001p\u0001p\u0001p\u0001p\u0001p\u0001p\u0001q\u0001q\u0001q\u0004"+ - "q\u04e7\bq\u000bq\fq\u04e8\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001"+ - "s\u0001s\u0001s\u0001s\u0003s\u04f5\bs\u0003s\u04f7\bs\u0001t\u0001t\u0001"+ - "t\u0001t\u0005t\u04fd\bt\nt\ft\u0500\tt\u0003t\u0502\bt\u0001t\u0001t"+ - "\u0001t\u0001t\u0001t\u0003t\u0509\bt\u0001u\u0001u\u0001u\u0003u\u050e"+ - "\bu\u0001v\u0001v\u0003v\u0512\bv\u0001w\u0001w\u0001w\u0001w\u0001w\u0001"+ - "x\u0001x\u0001x\u0001x\u0001x\u0005x\u051e\bx\nx\fx\u0521\tx\u0003x\u0523"+ - "\bx\u0001x\u0001x\u0001x\u0001x\u0001y\u0001y\u0003y\u052b\by\u0001z\u0001"+ - "z\u0003z\u052f\bz\u0001z\u0001z\u0001z\u0001{\u0001{\u0003{\u0536\b{\u0001"+ - "{\u0001{\u0001|\u0001|\u0001}\u0001}\u0001~\u0001~\u0001~\u0000\u0000"+ - "\u007f\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018"+ - "\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080"+ - "\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098"+ - "\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0"+ - "\u00b2\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\u0000\b\u0002\u0000\u0010\u0010ii\u0001\u0000RS\u0001\u0000"+ - "\u0013\u001c\u0002\u0000\u0004\u0004$.\u0001\u000001\u0002\u0000\u000b"+ - "\u000b24\u0002\u0000\u0012\u0012\u0086\u0086\u0002\u0000=\u0084\u0087"+ - "\u0087\u0581\u0000\u00fe\u0001\u0000\u0000\u0000\u0002\u0106\u0001\u0000"+ - "\u0000\u0000\u0004\u010c\u0001\u0000\u0000\u0000\u0006\u010f\u0001\u0000"+ - "\u0000\u0000\b\u0120\u0001\u0000\u0000\u0000\n\u012b\u0001\u0000\u0000"+ - "\u0000\f\u0130\u0001\u0000\u0000\u0000\u000e\u0133\u0001\u0000\u0000\u0000"+ - "\u0010\u0136\u0001\u0000\u0000\u0000\u0012\u0147\u0001\u0000\u0000\u0000"+ - "\u0014\u0149\u0001\u0000\u0000\u0000\u0016\u014c\u0001\u0000\u0000\u0000"+ - "\u0018\u0152\u0001\u0000\u0000\u0000\u001a\u0156\u0001\u0000\u0000\u0000"+ - "\u001c\u015a\u0001\u0000\u0000\u0000\u001e\u015e\u0001\u0000\u0000\u0000"+ - " \u0165\u0001\u0000\u0000\u0000\"\u0175\u0001\u0000\u0000\u0000$\u017e"+ - "\u0001\u0000\u0000\u0000&\u018d\u0001\u0000\u0000\u0000(\u0194\u0001\u0000"+ - "\u0000\u0000*\u019b\u0001\u0000\u0000\u0000,\u01ac\u0001\u0000\u0000\u0000"+ - ".\u01bc\u0001\u0000\u0000\u00000\u01cd\u0001\u0000\u0000\u00002\u01de"+ - "\u0001\u0000\u0000\u00004\u01e1\u0001\u0000\u0000\u00006\u01ed\u0001\u0000"+ - "\u0000\u00008\u01f6\u0001\u0000\u0000\u0000:\u0200\u0001\u0000\u0000\u0000"+ - "<\u0202\u0001\u0000\u0000\u0000>\u020c\u0001\u0000\u0000\u0000@\u020e"+ - "\u0001\u0000\u0000\u0000B\u0213\u0001\u0000\u0000\u0000D\u0217\u0001\u0000"+ - "\u0000\u0000F\u021d\u0001\u0000\u0000\u0000H\u0232\u0001\u0000\u0000\u0000"+ - "J\u0238\u0001\u0000\u0000\u0000L\u023a\u0001\u0000\u0000\u0000N\u024d"+ - "\u0001\u0000\u0000\u0000P\u025e\u0001\u0000\u0000\u0000R\u026e\u0001\u0000"+ - "\u0000\u0000T\u0282\u0001\u0000\u0000\u0000V\u0291\u0001\u0000\u0000\u0000"+ - "X\u0293\u0001\u0000\u0000\u0000Z\u029b\u0001\u0000\u0000\u0000\\\u02a1"+ - "\u0001\u0000\u0000\u0000^\u02af\u0001\u0000\u0000\u0000`\u02b9\u0001\u0000"+ - "\u0000\u0000b\u02bd\u0001\u0000\u0000\u0000d\u02cd\u0001\u0000\u0000\u0000"+ - "f\u02d6\u0001\u0000\u0000\u0000h\u02e6\u0001\u0000\u0000\u0000j\u02ef"+ - "\u0001\u0000\u0000\u0000l\u02f7\u0001\u0000\u0000\u0000n\u02fa\u0001\u0000"+ - "\u0000\u0000p\u0304\u0001\u0000\u0000\u0000r\u0316\u0001\u0000\u0000\u0000"+ - "t\u0320\u0001\u0000\u0000\u0000v\u0330\u0001\u0000\u0000\u0000x\u0335"+ - "\u0001\u0000\u0000\u0000z\u0342\u0001\u0000\u0000\u0000|\u034a\u0001\u0000"+ - "\u0000\u0000~\u0359\u0001\u0000\u0000\u0000\u0080\u0360\u0001\u0000\u0000"+ - "\u0000\u0082\u0370\u0001\u0000\u0000\u0000\u0084\u0381\u0001\u0000\u0000"+ - "\u0000\u0086\u038a\u0001\u0000\u0000\u0000\u0088\u0393\u0001\u0000\u0000"+ - "\u0000\u008a\u03a6\u0001\u0000\u0000\u0000\u008c\u03ae\u0001\u0000\u0000"+ - "\u0000\u008e\u03b7\u0001\u0000\u0000\u0000\u0090\u03bb\u0001\u0000\u0000"+ - "\u0000\u0092\u03c0\u0001\u0000\u0000\u0000\u0094\u03c8\u0001\u0000\u0000"+ - "\u0000\u0096\u03cd\u0001\u0000\u0000\u0000\u0098\u03d5\u0001\u0000\u0000"+ - "\u0000\u009a\u03dd\u0001\u0000\u0000\u0000\u009c\u03e3\u0001\u0000\u0000"+ - "\u0000\u009e\u03e9\u0001\u0000\u0000\u0000\u00a0\u03ef\u0001\u0000\u0000"+ - "\u0000\u00a2\u03f5\u0001\u0000\u0000\u0000\u00a4\u03fb\u0001\u0000\u0000"+ - "\u0000\u00a6\u040a\u0001\u0000\u0000\u0000\u00a8\u040f\u0001\u0000\u0000"+ - "\u0000\u00aa\u0417\u0001\u0000\u0000\u0000\u00ac\u0419\u0001\u0000\u0000"+ - "\u0000\u00ae\u0420\u0001\u0000\u0000\u0000\u00b0\u0427\u0001\u0000\u0000"+ - "\u0000\u00b2\u042f\u0001\u0000\u0000\u0000\u00b4\u043a\u0001\u0000\u0000"+ - "\u0000\u00b6\u0440\u0001\u0000\u0000\u0000\u00b8\u0443\u0001\u0000\u0000"+ - "\u0000\u00ba\u0447\u0001\u0000\u0000\u0000\u00bc\u045f\u0001\u0000\u0000"+ - "\u0000\u00be\u0461\u0001\u0000\u0000\u0000\u00c0\u0465\u0001\u0000\u0000"+ - "\u0000\u00c2\u0468\u0001\u0000\u0000\u0000\u00c4\u046e\u0001\u0000\u0000"+ - "\u0000\u00c6\u0470\u0001\u0000\u0000\u0000\u00c8\u0475\u0001\u0000\u0000"+ - "\u0000\u00ca\u047a\u0001\u0000\u0000\u0000\u00cc\u047d\u0001\u0000\u0000"+ - "\u0000\u00ce\u048b\u0001\u0000\u0000\u0000\u00d0\u048f\u0001\u0000\u0000"+ - "\u0000\u00d2\u0491\u0001\u0000\u0000\u0000\u00d4\u0495\u0001\u0000\u0000"+ - "\u0000\u00d6\u04bb\u0001\u0000\u0000\u0000\u00d8\u04bd\u0001\u0000\u0000"+ - "\u0000\u00da\u04c1\u0001\u0000\u0000\u0000\u00dc\u04c7\u0001\u0000\u0000"+ - "\u0000\u00de\u04cf\u0001\u0000\u0000\u0000\u00e0\u04dd\u0001\u0000\u0000"+ - "\u0000\u00e2\u04e3\u0001\u0000\u0000\u0000\u00e4\u04ea\u0001\u0000\u0000"+ - "\u0000\u00e6\u04f6\u0001\u0000\u0000\u0000\u00e8\u0508\u0001\u0000\u0000"+ - "\u0000\u00ea\u050d\u0001\u0000\u0000\u0000\u00ec\u0511\u0001\u0000\u0000"+ - "\u0000\u00ee\u0513\u0001\u0000\u0000\u0000\u00f0\u0518\u0001\u0000\u0000"+ - "\u0000\u00f2\u0528\u0001\u0000\u0000\u0000\u00f4\u052e\u0001\u0000\u0000"+ - "\u0000\u00f6\u0533\u0001\u0000\u0000\u0000\u00f8\u0539\u0001\u0000\u0000"+ - "\u0000\u00fa\u053b\u0001\u0000\u0000\u0000\u00fc\u053d\u0001\u0000\u0000"+ - "\u0000\u00fe\u00ff\u0003\u0002\u0001\u0000\u00ff\u0100\u0005\u0000\u0000"+ - "\u0001\u0100\u0001\u0001\u0000\u0000\u0000\u0101\u0102\u0005h\u0000\u0000"+ - "\u0102\u0103\u0005g\u0000\u0000\u0103\u0104\u0003\u00fa}\u0000\u0104\u0105"+ - "\u0005\u0001\u0000\u0000\u0105\u0107\u0001\u0000\u0000\u0000\u0106\u0101"+ - "\u0001\u0000\u0000\u0000\u0106\u0107\u0001\u0000\u0000\u0000\u0107\u010a"+ - "\u0001\u0000\u0000\u0000\u0108\u010b\u0003\u0006\u0003\u0000\u0109\u010b"+ - "\u0003\u0004\u0002\u0000\u010a\u0108\u0001\u0000\u0000\u0000\u010a\u0109"+ - "\u0001\u0000\u0000\u0000\u010b\u0003\u0001\u0000\u0000\u0000\u010c\u010d"+ - "\u0003\b\u0004\u0000\u010d\u010e\u0003\n\u0005\u0000\u010e\u0005\u0001"+ - "\u0000\u0000\u0000\u010f\u0110\u0005\u0002\u0000\u0000\u0110\u0111\u0005"+ - "\u0003\u0000\u0000\u0111\u0112\u0005\u008e\u0000\u0000\u0112\u0113\u0005"+ - "\u0004\u0000\u0000\u0113\u0114\u0003\u00f8|\u0000\u0114\u0115\u0005\u0001"+ - "\u0000\u0000\u0115\u0116\u0003\b\u0004\u0000\u0116\u0007\u0001\u0000\u0000"+ - "\u0000\u0117\u011b\u0003:\u001d\u0000\u0118\u011b\u0003<\u001e\u0000\u0119"+ - "\u011b\u0003L&\u0000\u011a\u0117\u0001\u0000\u0000\u0000\u011a\u0118\u0001"+ - "\u0000\u0000\u0000\u011a\u0119\u0001\u0000\u0000\u0000\u011b\u011c\u0001"+ - "\u0000\u0000\u0000\u011c\u011d\u0005\u0001\u0000\u0000\u011d\u011f\u0001"+ - "\u0000\u0000\u0000\u011e\u011a\u0001\u0000\u0000\u0000\u011f\u0122\u0001"+ - "\u0000\u0000\u0000\u0120\u011e\u0001\u0000\u0000\u0000\u0120\u0121\u0001"+ - "\u0000\u0000\u0000\u0121\u0128\u0001\u0000\u0000\u0000\u0122\u0120\u0001"+ - "\u0000\u0000\u0000\u0123\u0124\u0003>\u001f\u0000\u0124\u0125\u0005\u0001"+ - "\u0000\u0000\u0125\u0127\u0001\u0000\u0000\u0000\u0126\u0123\u0001\u0000"+ - "\u0000\u0000\u0127\u012a\u0001\u0000\u0000\u0000\u0128\u0126\u0001\u0000"+ - "\u0000\u0000\u0128\u0129\u0001\u0000\u0000\u0000\u0129\t\u0001\u0000\u0000"+ - "\u0000\u012a\u0128\u0001\u0000\u0000\u0000\u012b\u012c\u0003\u0010\b\u0000"+ - "\u012c\u000b\u0001\u0000\u0000\u0000\u012d\u012f\u0003\u0012\t\u0000\u012e"+ - "\u012d\u0001\u0000\u0000\u0000\u012f\u0132\u0001\u0000\u0000\u0000\u0130"+ - "\u012e\u0001\u0000\u0000\u0000\u0130\u0131\u0001\u0000\u0000\u0000\u0131"+ - "\r\u0001\u0000\u0000\u0000\u0132\u0130\u0001\u0000\u0000\u0000\u0133\u0134"+ - "\u0003\f\u0006\u0000\u0134\u0135\u0003\\.\u0000\u0135\u000f\u0001\u0000"+ - "\u0000\u0000\u0136\u0138\u0003\f\u0006\u0000\u0137\u0139\u0003\\.\u0000"+ - "\u0138\u0137\u0001\u0000\u0000\u0000\u0138\u0139\u0001\u0000\u0000\u0000"+ - "\u0139\u0011\u0001\u0000\u0000\u0000\u013a\u0148\u0003\u0014\n\u0000\u013b"+ - "\u0148\u0003\u0016\u000b\u0000\u013c\u0148\u0003\u0018\f\u0000\u013d\u0148"+ - "\u0003\u001a\r\u0000\u013e\u0148\u0003\u001c\u000e\u0000\u013f\u0148\u0003"+ - "\u001e\u000f\u0000\u0140\u0148\u0003 \u0010\u0000\u0141\u0148\u0003\""+ - "\u0011\u0000\u0142\u0148\u0003$\u0012\u0000\u0143\u0148\u0003(\u0014\u0000"+ - "\u0144\u0148\u0003,\u0016\u0000\u0145\u0148\u00034\u001a\u0000\u0146\u0148"+ - "\u00038\u001c\u0000\u0147\u013a\u0001\u0000\u0000\u0000\u0147\u013b\u0001"+ - "\u0000\u0000\u0000\u0147\u013c\u0001\u0000\u0000\u0000\u0147\u013d\u0001"+ - "\u0000\u0000\u0000\u0147\u013e\u0001\u0000\u0000\u0000\u0147\u013f\u0001"+ - "\u0000\u0000\u0000\u0147\u0140\u0001\u0000\u0000\u0000\u0147\u0141\u0001"+ - "\u0000\u0000\u0000\u0147\u0142\u0001\u0000\u0000\u0000\u0147\u0143\u0001"+ - "\u0000\u0000\u0000\u0147\u0144\u0001\u0000\u0000\u0000\u0147\u0145\u0001"+ - "\u0000\u0000\u0000\u0147\u0146\u0001\u0000\u0000\u0000\u0148\u0013\u0001"+ - "\u0000\u0000\u0000\u0149\u014a\u0003`0\u0000\u014a\u014b\u0005\u0001\u0000"+ - "\u0000\u014b\u0015\u0001\u0000\u0000\u0000\u014c\u014d\u0005\u0005\u0000"+ - "\u0000\u014d\u014e\u0003H$\u0000\u014e\u014f\u0005\u0006\u0000\u0000\u014f"+ - "\u0150\u0003^/\u0000\u0150\u0151\u0005\u0001\u0000\u0000\u0151\u0017\u0001"+ - "\u0000\u0000\u0000\u0152\u0153\u0005\u0007\u0000\u0000\u0153\u0154\u0003"+ - "\f\u0006\u0000\u0154\u0155\u0005\b\u0000\u0000\u0155\u0019\u0001\u0000"+ - "\u0000\u0000\u0156\u0157\u0005\u007f\u0000\u0000\u0157\u0158\u0005\u0080"+ - "\u0000\u0000\u0158\u0159\u0005\u0001\u0000\u0000\u0159\u001b\u0001\u0000"+ - "\u0000\u0000\u015a\u015b\u0005\u0081\u0000\u0000\u015b\u015c\u0005\u0080"+ - "\u0000\u0000\u015c\u015d\u0005\u0001\u0000\u0000\u015d\u001d\u0001\u0000"+ - "\u0000\u0000\u015e\u015f\u0005\u0082\u0000\u0000\u015f\u0160\u0005\u0083"+ - "\u0000\u0000\u0160\u0161\u0003^/\u0000\u0161\u0162\u0005\u0001\u0000\u0000"+ - "\u0162\u001f\u0001\u0000\u0000\u0000\u0163\u0166\u0003d2\u0000\u0164\u0166"+ - "\u0003h4\u0000\u0165\u0163\u0001\u0000\u0000\u0000\u0165\u0164\u0001\u0000"+ - "\u0000\u0000\u0166\u016f\u0001\u0000\u0000\u0000\u0167\u016e\u0003d2\u0000"+ - "\u0168\u016e\u0003h4\u0000\u0169\u016e\u0003l6\u0000\u016a\u016e\u0003"+ - "n7\u0000\u016b\u016e\u0003r9\u0000\u016c\u016e\u0003v;\u0000\u016d\u0167"+ - "\u0001\u0000\u0000\u0000\u016d\u0168\u0001\u0000\u0000\u0000\u016d\u0169"+ - "\u0001\u0000\u0000\u0000\u016d\u016a\u0001\u0000\u0000\u0000\u016d\u016b"+ - "\u0001\u0000\u0000\u0000\u016d\u016c\u0001\u0000\u0000\u0000\u016e\u0171"+ - "\u0001\u0000\u0000\u0000\u016f\u016d\u0001\u0000\u0000\u0000\u016f\u0170"+ - "\u0001\u0000\u0000\u0000\u0170\u0172\u0001\u0000\u0000\u0000\u0171\u016f"+ - "\u0001\u0000\u0000\u0000\u0172\u0173\u0005C\u0000\u0000\u0173\u0174\u0003"+ - "\u0012\t\u0000\u0174!\u0001\u0000\u0000\u0000\u0175\u0176\u0005D\u0000"+ - "\u0000\u0176\u0177\u0005\t\u0000\u0000\u0177\u0178\u0003\\.\u0000\u0178"+ - "\u0179\u0005\n\u0000\u0000\u0179\u017a\u0005Y\u0000\u0000\u017a\u017b"+ - "\u0003\u0012\t\u0000\u017b\u017c\u0005Z\u0000\u0000\u017c\u017d\u0003"+ - "\u0012\t\u0000\u017d#\u0001\u0000\u0000\u0000\u017e\u017f\u0005T\u0000"+ - "\u0000\u017f\u0180\u0005\t\u0000\u0000\u0180\u0181\u0003\\.\u0000\u0181"+ - "\u0183\u0005\n\u0000\u0000\u0182\u0184\u0003&\u0013\u0000\u0183\u0182"+ - "\u0001\u0000\u0000\u0000\u0184\u0185\u0001\u0000\u0000\u0000\u0185\u0183"+ - "\u0001\u0000\u0000\u0000\u0185\u0186\u0001\u0000\u0000\u0000\u0186\u0187"+ - "\u0001\u0000\u0000\u0000\u0187\u0188\u0005X\u0000\u0000\u0188\u0189\u0005"+ - "C\u0000\u0000\u0189\u018a\u0003\u0012\t\u0000\u018a%\u0001\u0000\u0000"+ - "\u0000\u018b\u018c\u0005U\u0000\u0000\u018c\u018e\u0003^/\u0000\u018d"+ - "\u018b\u0001\u0000\u0000\u0000\u018e\u018f\u0001\u0000\u0000\u0000\u018f"+ - "\u018d\u0001\u0000\u0000\u0000\u018f\u0190\u0001\u0000\u0000\u0000\u0190"+ - "\u0191\u0001\u0000\u0000\u0000\u0191\u0192\u0005C\u0000\u0000\u0192\u0193"+ - "\u0003\u0012\t\u0000\u0193\'\u0001\u0000\u0000\u0000\u0194\u0195\u0005"+ - "V\u0000\u0000\u0195\u0197\u0003\u0018\f\u0000\u0196\u0198\u0003*\u0015"+ - "\u0000\u0197\u0196\u0001\u0000\u0000\u0000\u0198\u0199\u0001\u0000\u0000"+ - "\u0000\u0199\u0197\u0001\u0000\u0000\u0000\u0199\u019a\u0001\u0000\u0000"+ - "\u0000\u019a)\u0001\u0000\u0000\u0000\u019b\u019e\u0005W\u0000\u0000\u019c"+ - "\u019f\u0005\u000b\u0000\u0000\u019d\u019f\u0003H$\u0000\u019e\u019c\u0001"+ - "\u0000\u0000\u0000\u019e\u019d\u0001\u0000\u0000\u0000\u019f\u01a7\u0001"+ - "\u0000\u0000\u0000\u01a0\u01a3\u0005\f\u0000\u0000\u01a1\u01a4\u0005\u000b"+ - "\u0000\u0000\u01a2\u01a4\u0003H$\u0000\u01a3\u01a1\u0001\u0000\u0000\u0000"+ - "\u01a3\u01a2\u0001\u0000\u0000\u0000\u01a4\u01a6\u0001\u0000\u0000\u0000"+ - "\u01a5\u01a0\u0001\u0000\u0000\u0000\u01a6\u01a9\u0001\u0000\u0000\u0000"+ - "\u01a7\u01a5\u0001\u0000\u0000\u0000\u01a7\u01a8\u0001\u0000\u0000\u0000"+ - "\u01a8\u01aa\u0001\u0000\u0000\u0000\u01a9\u01a7\u0001\u0000\u0000\u0000"+ - "\u01aa\u01ab\u0003\u0018\f\u0000\u01ab+\u0001\u0000\u0000\u0000\u01ac"+ - "\u01ad\u0005[\u0000\u0000\u01ad\u01ae\u0005\t\u0000\u0000\u01ae\u01af"+ - "\u0003\\.\u0000\u01af\u01b1\u0005\n\u0000\u0000\u01b0\u01b2\u0003.\u0017"+ - "\u0000\u01b1\u01b0\u0001\u0000\u0000\u0000\u01b2\u01b3\u0001\u0000\u0000"+ - "\u0000\u01b3\u01b1\u0001\u0000\u0000\u0000\u01b3\u01b4\u0001\u0000\u0000"+ - "\u0000\u01b4\u01b5\u0001\u0000\u0000\u0000\u01b5\u01b7\u0005X\u0000\u0000"+ - "\u01b6\u01b8\u0003\u00c0`\u0000\u01b7\u01b6\u0001\u0000\u0000\u0000\u01b7"+ - "\u01b8\u0001\u0000\u0000\u0000\u01b8\u01b9\u0001\u0000\u0000\u0000\u01b9"+ - "\u01ba\u0005C\u0000\u0000\u01ba\u01bb\u0003\u0012\t\u0000\u01bb-\u0001"+ - "\u0000\u0000\u0000\u01bc\u01c0\u0005U\u0000\u0000\u01bd\u01be\u0003\u00c0"+ - "`\u0000\u01be\u01bf\u0005F\u0000\u0000\u01bf\u01c1\u0001\u0000\u0000\u0000"+ - "\u01c0\u01bd\u0001\u0000\u0000\u0000\u01c0\u01c1\u0001\u0000\u0000\u0000"+ - "\u01c1\u01c2\u0001\u0000\u0000\u0000\u01c2\u01c7\u0003\u00e6s\u0000\u01c3"+ - "\u01c4\u0005\f\u0000\u0000\u01c4\u01c6\u0003\u00e6s\u0000\u01c5\u01c3"+ - "\u0001\u0000\u0000\u0000\u01c6\u01c9\u0001\u0000\u0000\u0000\u01c7\u01c5"+ - "\u0001\u0000\u0000\u0000\u01c7\u01c8\u0001\u0000\u0000\u0000\u01c8\u01ca"+ - "\u0001\u0000\u0000\u0000\u01c9\u01c7\u0001\u0000\u0000\u0000\u01ca\u01cb"+ - "\u0005C\u0000\u0000\u01cb\u01cc\u0003\u0012\t\u0000\u01cc/\u0001\u0000"+ - "\u0000\u0000\u01cd\u01ce\u0005\r\u0000\u0000\u01ce\u01d9\u0003H$\u0000"+ - "\u01cf\u01d0\u0005\t\u0000\u0000\u01d0\u01d5\u0005\u0088\u0000\u0000\u01d1"+ - "\u01d2\u0005\u000e\u0000\u0000\u01d2\u01d4\u0005\u0088\u0000\u0000\u01d3"+ - "\u01d1\u0001\u0000\u0000\u0000\u01d4\u01d7\u0001\u0000\u0000\u0000\u01d5"+ - "\u01d3\u0001\u0000\u0000\u0000\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6"+ - "\u01d8\u0001\u0000\u0000\u0000\u01d7\u01d5\u0001\u0000\u0000\u0000\u01d8"+ - "\u01da\u0005\n\u0000\u0000\u01d9\u01cf\u0001\u0000\u0000\u0000\u01d9\u01da"+ - "\u0001\u0000\u0000\u0000\u01da1\u0001\u0000\u0000\u0000\u01db\u01dd\u0003"+ - "0\u0018\u0000\u01dc\u01db\u0001\u0000\u0000\u0000\u01dd\u01e0\u0001\u0000"+ - "\u0000\u0000\u01de\u01dc\u0001\u0000\u0000\u0000\u01de\u01df\u0001\u0000"+ - "\u0000\u0000\u01df3\u0001\u0000\u0000\u0000\u01e0\u01de\u0001\u0000\u0000"+ - "\u0000\u01e1\u01e2\u00032\u0019\u0000\u01e2\u01e3\u0005r\u0000\u0000\u01e3"+ - "\u01e8\u00036\u001b\u0000\u01e4\u01e5\u0005\u000e\u0000\u0000\u01e5\u01e7"+ - "\u00036\u001b\u0000\u01e6\u01e4\u0001\u0000\u0000\u0000\u01e7\u01ea\u0001"+ - "\u0000\u0000\u0000\u01e8\u01e6\u0001\u0000\u0000\u0000\u01e8\u01e9\u0001"+ - "\u0000\u0000\u0000\u01e9\u01eb\u0001\u0000\u0000\u0000\u01ea\u01e8\u0001"+ - "\u0000\u0000\u0000\u01eb\u01ec\u0005\u0001\u0000\u0000\u01ec5\u0001\u0000"+ - "\u0000\u0000\u01ed\u01f0\u0003\u00c0`\u0000\u01ee\u01ef\u0005F\u0000\u0000"+ - "\u01ef\u01f1\u0003\u00e6s\u0000\u01f0\u01ee\u0001\u0000\u0000\u0000\u01f0"+ - "\u01f1\u0001\u0000\u0000\u0000\u01f1\u01f4\u0001\u0000\u0000\u0000\u01f2"+ - "\u01f3\u0005\u0006\u0000\u0000\u01f3\u01f5\u0003^/\u0000\u01f4\u01f2\u0001"+ - "\u0000\u0000\u0000\u01f4\u01f5\u0001\u0000\u0000\u0000\u01f57\u0001\u0000"+ - "\u0000\u0000\u01f6\u01f7\u0005\u0084\u0000\u0000\u01f7\u01f8\u0005\t\u0000"+ - "\u0000\u01f8\u01f9\u0003\\.\u0000\u01f9\u01fa\u0005\n\u0000\u0000\u01fa"+ - "\u01fb\u0003\u0012\t\u0000\u01fb9\u0001\u0000\u0000\u0000\u01fc\u0201"+ - "\u0003@ \u0000\u01fd\u0201\u0003B!\u0000\u01fe\u0201\u0003D\"\u0000\u01ff"+ - "\u0201\u0003F#\u0000\u0200\u01fc\u0001\u0000\u0000\u0000\u0200\u01fd\u0001"+ - "\u0000\u0000\u0000\u0200\u01fe\u0001\u0000\u0000\u0000\u0200\u01ff\u0001"+ - "\u0000\u0000\u0000\u0201;\u0001\u0000\u0000\u0000\u0202\u0203\u0005o\u0000"+ - "\u0000\u0203\u0204\u0005\u0003\u0000\u0000\u0204\u0205\u0005\u008e\u0000"+ - "\u0000\u0205\u0206\u0005\u0004\u0000\u0000\u0206\u0207\u0003\u00f8|\u0000"+ - "\u0207=\u0001\u0000\u0000\u0000\u0208\u020d\u0003R)\u0000\u0209\u020d"+ - "\u0003N\'\u0000\u020a\u020d\u0003T*\u0000\u020b\u020d\u0003P(\u0000\u020c"+ - "\u0208\u0001\u0000\u0000\u0000\u020c\u0209\u0001\u0000\u0000\u0000\u020c"+ - "\u020a\u0001\u0000\u0000\u0000\u020c\u020b\u0001\u0000\u0000\u0000\u020d"+ - "?\u0001\u0000\u0000\u0000\u020e\u020f\u0005o\u0000\u0000\u020f\u0210\u0005"+ - "X\u0000\u0000\u0210\u0211\u0005Q\u0000\u0000\u0211\u0212\u0003\u00f8|"+ - "\u0000\u0212A\u0001\u0000\u0000\u0000\u0213\u0214\u0005o\u0000\u0000\u0214"+ - "\u0215\u0005\u000f\u0000\u0000\u0215\u0216\u0007\u0000\u0000\u0000\u0216"+ - "C\u0001\u0000\u0000\u0000\u0217\u0218\u0005o\u0000\u0000\u0218\u0219\u0005"+ - "X\u0000\u0000\u0219\u021a\u0005B\u0000\u0000\u021a\u021b\u0005I\u0000"+ - "\u0000\u021b\u021c\u0007\u0001\u0000\u0000\u021cE\u0001\u0000\u0000\u0000"+ - "\u021d\u0222\u0005o\u0000\u0000\u021e\u021f\u0005\u0011\u0000\u0000\u021f"+ - "\u0223\u0003H$\u0000\u0220\u0221\u0005X\u0000\u0000\u0221\u0223\u0005"+ - "\u0011\u0000\u0000\u0222\u021e\u0001\u0000\u0000\u0000\u0222\u0220\u0001"+ - "\u0000\u0000\u0000\u0223\u022a\u0001\u0000\u0000\u0000\u0224\u0225\u0003"+ - "J%\u0000\u0225\u0226\u0005\u0004\u0000\u0000\u0226\u0227\u0003\u00fa}"+ - "\u0000\u0227\u0229\u0001\u0000\u0000\u0000\u0228\u0224\u0001\u0000\u0000"+ - "\u0000\u0229\u022c\u0001\u0000\u0000\u0000\u022a\u0228\u0001\u0000\u0000"+ - "\u0000\u022a\u022b\u0001\u0000\u0000\u0000\u022bG\u0001\u0000\u0000\u0000"+ - "\u022c\u022a\u0001\u0000\u0000\u0000\u022d\u0230\u0005\u008e\u0000\u0000"+ - "\u022e\u0230\u0003\u00fc~\u0000\u022f\u022d\u0001\u0000\u0000\u0000\u022f"+ - "\u022e\u0001\u0000\u0000\u0000\u0230\u0231\u0001\u0000\u0000\u0000\u0231"+ - "\u0233\u0005\u0012\u0000\u0000\u0232\u022f\u0001\u0000\u0000\u0000\u0232"+ - "\u0233\u0001\u0000\u0000\u0000\u0233\u0236\u0001\u0000\u0000\u0000\u0234"+ - "\u0237\u0005\u008e\u0000\u0000\u0235\u0237\u0003\u00fc~\u0000\u0236\u0234"+ - "\u0001\u0000\u0000\u0000\u0236\u0235\u0001\u0000\u0000\u0000\u0237I\u0001"+ - "\u0000\u0000\u0000\u0238\u0239\u0007\u0002\u0000\u0000\u0239K\u0001\u0000"+ - "\u0000\u0000\u023a\u023b\u0005\u001d\u0000\u0000\u023b\u023f\u0005\u0002"+ - "\u0000\u0000\u023c\u023d\u0005\u0003\u0000\u0000\u023d\u023e\u0005\u008e"+ - "\u0000\u0000\u023e\u0240\u0005\u0004\u0000\u0000\u023f\u023c\u0001\u0000"+ - "\u0000\u0000\u023f\u0240\u0001\u0000\u0000\u0000\u0240\u0241\u0001\u0000"+ - "\u0000\u0000\u0241\u024b\u0003\u00f8|\u0000\u0242\u0243\u0005G\u0000\u0000"+ - "\u0243\u0248\u0003\u00f8|\u0000\u0244\u0245\u0005\u000e\u0000\u0000\u0245"+ - "\u0247\u0003\u00f8|\u0000\u0246\u0244\u0001\u0000\u0000\u0000\u0247\u024a"+ - "\u0001\u0000\u0000\u0000\u0248\u0246\u0001\u0000\u0000\u0000\u0248\u0249"+ - "\u0001\u0000\u0000\u0000\u0249\u024c\u0001\u0000\u0000\u0000\u024a\u0248"+ - "\u0001\u0000\u0000\u0000\u024b\u0242\u0001\u0000\u0000\u0000\u024b\u024c"+ - "\u0001\u0000\u0000\u0000\u024cM\u0001\u0000\u0000\u0000\u024d\u024e\u0005"+ - "o\u0000\u0000\u024e\u024f\u00032\u0019\u0000\u024f\u0250\u0005r\u0000"+ - "\u0000\u0250\u0253\u0003\u00c0`\u0000\u0251\u0252\u0005F\u0000\u0000\u0252"+ - "\u0254\u0003\u00e6s\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253\u0254"+ - "\u0001\u0000\u0000\u0000\u0254\u025c\u0001\u0000\u0000\u0000\u0255\u0256"+ - "\u0005\u0006\u0000\u0000\u0256\u025d\u0003^/\u0000\u0257\u025a\u0005\u001e"+ - "\u0000\u0000\u0258\u0259\u0005\u0006\u0000\u0000\u0259\u025b\u0003^/\u0000"+ - "\u025a\u0258\u0001\u0000\u0000\u0000\u025a\u025b\u0001\u0000\u0000\u0000"+ - "\u025b\u025d\u0001\u0000\u0000\u0000\u025c\u0255\u0001\u0000\u0000\u0000"+ - "\u025c\u0257\u0001\u0000\u0000\u0000\u025dO\u0001\u0000\u0000\u0000\u025e"+ - "\u025f\u0005o\u0000\u0000\u025f\u0260\u0005p\u0000\u0000\u0260\u0263\u0005"+ - "q\u0000\u0000\u0261\u0262\u0005F\u0000\u0000\u0262\u0264\u0003\u00e6s"+ - "\u0000\u0263\u0261\u0001\u0000\u0000\u0000\u0263\u0264\u0001\u0000\u0000"+ - "\u0000\u0264\u026c\u0001\u0000\u0000\u0000\u0265\u0266\u0005\u0006\u0000"+ - "\u0000\u0266\u026d\u0003^/\u0000\u0267\u026a\u0005\u001e\u0000\u0000\u0268"+ - "\u0269\u0005\u0006\u0000\u0000\u0269\u026b\u0003^/\u0000\u026a\u0268\u0001"+ - "\u0000\u0000\u0000\u026a\u026b\u0001\u0000\u0000\u0000\u026b\u026d\u0001"+ - "\u0000\u0000\u0000\u026c\u0265\u0001\u0000\u0000\u0000\u026c\u0267\u0001"+ - "\u0000\u0000\u0000\u026dQ\u0001\u0000\u0000\u0000\u026e\u026f\u0005o\u0000"+ - "\u0000\u026f\u0270\u00032\u0019\u0000\u0270\u0271\u0005\u001f\u0000\u0000"+ - "\u0271\u0272\u0003H$\u0000\u0272\u0274\u0005\t\u0000\u0000\u0273\u0275"+ - "\u0003X,\u0000\u0274\u0273\u0001\u0000\u0000\u0000\u0274\u0275\u0001\u0000"+ - "\u0000\u0000\u0275\u0276\u0001\u0000\u0000\u0000\u0276\u0279\u0005\n\u0000"+ - "\u0000\u0277\u0278\u0005F\u0000\u0000\u0278\u027a\u0003\u00e6s\u0000\u0279"+ - "\u0277\u0001\u0000\u0000\u0000\u0279\u027a\u0001\u0000\u0000\u0000\u027a"+ - "\u0280\u0001\u0000\u0000\u0000\u027b\u027c\u0005\u0007\u0000\u0000\u027c"+ - "\u027d\u0003\u0010\b\u0000\u027d\u027e\u0005\b\u0000\u0000\u027e\u0281"+ - "\u0001\u0000\u0000\u0000\u027f\u0281\u0005\u001e\u0000\u0000\u0280\u027b"+ - "\u0001\u0000\u0000\u0000\u0280\u027f\u0001\u0000\u0000\u0000\u0281S\u0001"+ - "\u0000\u0000\u0000\u0282\u0283\u0005o\u0000\u0000\u0283\u0284\u0005l\u0000"+ - "\u0000\u0284\u0285\u0003H$\u0000\u0285\u0287\u0005F\u0000\u0000\u0286"+ - "\u0288\u0003V+\u0000\u0287\u0286\u0001\u0000\u0000\u0000\u0287\u0288\u0001"+ - "\u0000\u0000\u0000\u0288\u0289\u0001\u0000\u0000\u0000\u0289\u028a\u0003"+ - "^/\u0000\u028aU\u0001\u0000\u0000\u0000\u028b\u028c\u0005 \u0000\u0000"+ - "\u028c\u0292\u0005!\u0000\u0000\u028d\u028e\u0005 \u0000\u0000\u028e\u0292"+ - "\u0005\"\u0000\u0000\u028f\u0290\u0005|\u0000\u0000\u0290\u0292\u0005"+ - "#\u0000\u0000\u0291\u028b\u0001\u0000\u0000\u0000\u0291\u028d\u0001\u0000"+ - "\u0000\u0000\u0291\u028f\u0001\u0000\u0000\u0000\u0292W\u0001\u0000\u0000"+ - "\u0000\u0293\u0298\u0003Z-\u0000\u0294\u0295\u0005\u000e\u0000\u0000\u0295"+ - "\u0297\u0003Z-\u0000\u0296\u0294\u0001\u0000\u0000\u0000\u0297\u029a\u0001"+ - "\u0000\u0000\u0000\u0298\u0296\u0001\u0000\u0000\u0000\u0298\u0299\u0001"+ - "\u0000\u0000\u0000\u0299Y\u0001\u0000\u0000\u0000\u029a\u0298\u0001\u0000"+ - "\u0000\u0000\u029b\u029c\u0005\u0005\u0000\u0000\u029c\u029f\u0003H$\u0000"+ - "\u029d\u029e\u0005F\u0000\u0000\u029e\u02a0\u0003\u00e6s\u0000\u029f\u029d"+ - "\u0001\u0000\u0000\u0000\u029f\u02a0\u0001\u0000\u0000\u0000\u02a0[\u0001"+ - "\u0000\u0000\u0000\u02a1\u02a6\u0003^/\u0000\u02a2\u02a3\u0005\u000e\u0000"+ - "\u0000\u02a3\u02a5\u0003^/\u0000\u02a4\u02a2\u0001\u0000\u0000\u0000\u02a5"+ - "\u02a8\u0001\u0000\u0000\u0000\u02a6\u02a4\u0001\u0000\u0000\u0000\u02a6"+ - "\u02a7\u0001\u0000\u0000\u0000\u02a7]\u0001\u0000\u0000\u0000\u02a8\u02a6"+ - "\u0001\u0000\u0000\u0000\u02a9\u02b0\u0003`0\u0000\u02aa\u02b0\u0003b"+ - "1\u0000\u02ab\u02b0\u0003|>\u0000\u02ac\u02b0\u0003\u0080@\u0000\u02ad"+ - "\u02b0\u0003\u0084B\u0000\u02ae\u02b0\u0003\u0086C\u0000\u02af\u02a9\u0001"+ - "\u0000\u0000\u0000\u02af\u02aa\u0001\u0000\u0000\u0000\u02af\u02ab\u0001"+ - "\u0000\u0000\u0000\u02af\u02ac\u0001\u0000\u0000\u0000\u02af\u02ad\u0001"+ - "\u0000\u0000\u0000\u02af\u02ae\u0001\u0000\u0000\u0000\u02b0_\u0001\u0000"+ - "\u0000\u0000\u02b1\u02ba\u0003x<\u0000\u02b2\u02ba\u0003\u008aE\u0000"+ - "\u02b3\u02ba\u0003\u00d6k\u0000\u02b4\u02ba\u0003\u00d8l\u0000\u02b5\u02ba"+ - "\u0003\u00dam\u0000\u02b6\u02ba\u0003\u00dcn\u0000\u02b7\u02ba\u0003\u00de"+ - "o\u0000\u02b8\u02ba\u0003\u00e0p\u0000\u02b9\u02b1\u0001\u0000\u0000\u0000"+ - "\u02b9\u02b2\u0001\u0000\u0000\u0000\u02b9\u02b3\u0001\u0000\u0000\u0000"+ - "\u02b9\u02b4\u0001\u0000\u0000\u0000\u02b9\u02b5\u0001\u0000\u0000\u0000"+ - "\u02b9\u02b6\u0001\u0000\u0000\u0000\u02b9\u02b7\u0001\u0000\u0000\u0000"+ - "\u02b9\u02b8\u0001\u0000\u0000\u0000\u02baa\u0001\u0000\u0000\u0000\u02bb"+ - "\u02be\u0003d2\u0000\u02bc\u02be\u0003h4\u0000\u02bd\u02bb\u0001\u0000"+ - "\u0000\u0000\u02bd\u02bc\u0001\u0000\u0000\u0000\u02be\u02c7\u0001\u0000"+ - "\u0000\u0000\u02bf\u02c6\u0003d2\u0000\u02c0\u02c6\u0003h4\u0000\u02c1"+ - "\u02c6\u0003l6\u0000\u02c2\u02c6\u0003n7\u0000\u02c3\u02c6\u0003r9\u0000"+ - "\u02c4\u02c6\u0003v;\u0000\u02c5\u02bf\u0001\u0000\u0000\u0000\u02c5\u02c0"+ - "\u0001\u0000\u0000\u0000\u02c5\u02c1\u0001\u0000\u0000\u0000\u02c5\u02c2"+ - "\u0001\u0000\u0000\u0000\u02c5\u02c3\u0001\u0000\u0000\u0000\u02c5\u02c4"+ - "\u0001\u0000\u0000\u0000\u02c6\u02c9\u0001\u0000\u0000\u0000\u02c7\u02c5"+ - "\u0001\u0000\u0000\u0000\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8\u02ca"+ - "\u0001\u0000\u0000\u0000\u02c9\u02c7\u0001\u0000\u0000\u0000\u02ca\u02cb"+ - "\u0005C\u0000\u0000\u02cb\u02cc\u0003^/\u0000\u02ccc\u0001\u0000\u0000"+ - "\u0000\u02cd\u02ce\u0005=\u0000\u0000\u02ce\u02d3\u0003f3\u0000\u02cf"+ - "\u02d0\u0005\u000e\u0000\u0000\u02d0\u02d2\u0003f3\u0000\u02d1\u02cf\u0001"+ - "\u0000\u0000\u0000\u02d2\u02d5\u0001\u0000\u0000\u0000\u02d3\u02d1\u0001"+ - "\u0000\u0000\u0000\u02d3\u02d4\u0001\u0000\u0000\u0000\u02d4e\u0001\u0000"+ - "\u0000\u0000\u02d5\u02d3\u0001\u0000\u0000\u0000\u02d6\u02d9\u0003\u00c0"+ - "`\u0000\u02d7\u02d8\u0005F\u0000\u0000\u02d8\u02da\u0003\u00e6s\u0000"+ - "\u02d9\u02d7\u0001\u0000\u0000\u0000\u02d9\u02da\u0001\u0000\u0000\u0000"+ - "\u02da\u02dd\u0001\u0000\u0000\u0000\u02db\u02dc\u0005H\u0000\u0000\u02dc"+ - "\u02de\u0005I\u0000\u0000\u02dd\u02db\u0001\u0000\u0000\u0000\u02dd\u02de"+ - "\u0001\u0000\u0000\u0000\u02de\u02e1\u0001\u0000\u0000\u0000\u02df\u02e0"+ - "\u0005G\u0000\u0000\u02e0\u02e2\u0003\u00c0`\u0000\u02e1\u02df\u0001\u0000"+ - "\u0000\u0000\u02e1\u02e2\u0001\u0000\u0000\u0000\u02e2\u02e3\u0001\u0000"+ - "\u0000\u0000\u02e3\u02e4\u0005E\u0000\u0000\u02e4\u02e5\u0003^/\u0000"+ - "\u02e5g\u0001\u0000\u0000\u0000\u02e6\u02e7\u0005>\u0000\u0000\u02e7\u02ec"+ - "\u0003j5\u0000\u02e8\u02e9\u0005\u000e\u0000\u0000\u02e9\u02eb\u0003j"+ - "5\u0000\u02ea\u02e8\u0001\u0000\u0000\u0000\u02eb\u02ee\u0001\u0000\u0000"+ - "\u0000\u02ec\u02ea\u0001\u0000\u0000\u0000\u02ec\u02ed\u0001\u0000\u0000"+ - "\u0000\u02edi\u0001\u0000\u0000\u0000\u02ee\u02ec\u0001\u0000\u0000\u0000"+ - "\u02ef\u02f2\u0003\u00c0`\u0000\u02f0\u02f1\u0005F\u0000\u0000\u02f1\u02f3"+ - "\u0003\u00e6s\u0000\u02f2\u02f0\u0001\u0000\u0000\u0000\u02f2\u02f3\u0001"+ - "\u0000\u0000\u0000\u02f3\u02f4\u0001\u0000\u0000\u0000\u02f4\u02f5\u0005"+ - "\u0006\u0000\u0000\u02f5\u02f6\u0003^/\u0000\u02f6k\u0001\u0000\u0000"+ - "\u0000\u02f7\u02f8\u0005?\u0000\u0000\u02f8\u02f9\u0003^/\u0000\u02f9"+ - "m\u0001\u0000\u0000\u0000\u02fa\u02fb\u0005@\u0000\u0000\u02fb\u02fc\u0005"+ - "A\u0000\u0000\u02fc\u0301\u0003p8\u0000\u02fd\u02fe\u0005\u000e\u0000"+ - "\u0000\u02fe\u0300\u0003p8\u0000\u02ff\u02fd\u0001\u0000\u0000\u0000\u0300"+ - "\u0303\u0001\u0000\u0000\u0000\u0301\u02ff\u0001\u0000\u0000\u0000\u0301"+ - "\u0302\u0001\u0000\u0000\u0000\u0302o\u0001\u0000\u0000\u0000\u0303\u0301"+ - "\u0001\u0000\u0000\u0000\u0304\u030b\u0003\u00c0`\u0000\u0305\u0306\u0005"+ - "F\u0000\u0000\u0306\u0308\u0003\u00e6s\u0000\u0307\u0305\u0001\u0000\u0000"+ - "\u0000\u0307\u0308\u0001\u0000\u0000\u0000\u0308\u0309\u0001\u0000\u0000"+ - "\u0000\u0309\u030a\u0005\u0006\u0000\u0000\u030a\u030c\u0003^/\u0000\u030b"+ - "\u0307\u0001\u0000\u0000\u0000\u030b\u030c\u0001\u0000\u0000\u0000\u030c"+ - "\u030f\u0001\u0000\u0000\u0000\u030d\u030e\u0005Q\u0000\u0000\u030e\u0310"+ - "\u0003\u00f8|\u0000\u030f\u030d\u0001\u0000\u0000\u0000\u030f\u0310\u0001"+ - "\u0000\u0000\u0000\u0310q\u0001\u0000\u0000\u0000\u0311\u0312\u0005B\u0000"+ - "\u0000\u0312\u0317\u0005A\u0000\u0000\u0313\u0314\u0005K\u0000\u0000\u0314"+ - "\u0315\u0005B\u0000\u0000\u0315\u0317\u0005A\u0000\u0000\u0316\u0311\u0001"+ - "\u0000\u0000\u0000\u0316\u0313\u0001\u0000\u0000\u0000\u0317\u0318\u0001"+ - "\u0000\u0000\u0000\u0318\u031d\u0003t:\u0000\u0319\u031a\u0005\u000e\u0000"+ - "\u0000\u031a\u031c\u0003t:\u0000\u031b\u0319\u0001\u0000\u0000\u0000\u031c"+ - "\u031f\u0001\u0000\u0000\u0000\u031d\u031b\u0001\u0000\u0000\u0000\u031d"+ - "\u031e\u0001\u0000\u0000\u0000\u031es\u0001\u0000\u0000\u0000\u031f\u031d"+ - "\u0001\u0000\u0000\u0000\u0320\u0323\u0003^/\u0000\u0321\u0324\u0005L"+ - "\u0000\u0000\u0322\u0324\u0005M\u0000\u0000\u0323\u0321\u0001\u0000\u0000"+ - "\u0000\u0323\u0322\u0001\u0000\u0000\u0000\u0323\u0324\u0001\u0000\u0000"+ - "\u0000\u0324\u032a\u0001\u0000\u0000\u0000\u0325\u0328\u0005I\u0000\u0000"+ - "\u0326\u0329\u0005R\u0000\u0000\u0327\u0329\u0005S\u0000\u0000\u0328\u0326"+ - "\u0001\u0000\u0000\u0000\u0328\u0327\u0001\u0000\u0000\u0000\u0329\u032b"+ - "\u0001\u0000\u0000\u0000\u032a\u0325\u0001\u0000\u0000\u0000\u032a\u032b"+ - "\u0001\u0000\u0000\u0000\u032b\u032e\u0001\u0000\u0000\u0000\u032c\u032d"+ - "\u0005Q\u0000\u0000\u032d\u032f\u0003\u00f8|\u0000\u032e\u032c\u0001\u0000"+ - "\u0000\u0000\u032e\u032f\u0001\u0000\u0000\u0000\u032fu\u0001\u0000\u0000"+ - "\u0000\u0330\u0331\u0005J\u0000\u0000\u0331\u0332\u0003\u00c0`\u0000\u0332"+ - "w\u0001\u0000\u0000\u0000\u0333\u0336\u0005N\u0000\u0000\u0334\u0336\u0005"+ - "O\u0000\u0000\u0335\u0333\u0001\u0000\u0000\u0000\u0335\u0334\u0001\u0000"+ - "\u0000\u0000\u0336\u0337\u0001\u0000\u0000\u0000\u0337\u033c\u0003z=\u0000"+ - "\u0338\u0339\u0005\u000e\u0000\u0000\u0339\u033b\u0003z=\u0000\u033a\u0338"+ - "\u0001\u0000\u0000\u0000\u033b\u033e\u0001\u0000\u0000\u0000\u033c\u033a"+ - "\u0001\u0000\u0000\u0000\u033c\u033d\u0001\u0000\u0000\u0000\u033d\u033f"+ - "\u0001\u0000\u0000\u0000\u033e\u033c\u0001\u0000\u0000\u0000\u033f\u0340"+ - "\u0005P\u0000\u0000\u0340\u0341\u0003^/\u0000\u0341y\u0001\u0000\u0000"+ - "\u0000\u0342\u0345\u0003\u00c0`\u0000\u0343\u0344\u0005F\u0000\u0000\u0344"+ - "\u0346\u0003\u00e6s\u0000\u0345\u0343\u0001\u0000\u0000\u0000\u0345\u0346"+ - "\u0001\u0000\u0000\u0000\u0346\u0347\u0001\u0000\u0000\u0000\u0347\u0348"+ - "\u0005E\u0000\u0000\u0348\u0349\u0003^/\u0000\u0349{\u0001\u0000\u0000"+ - "\u0000\u034a\u034b\u0005T\u0000\u0000\u034b\u034c\u0005\t\u0000\u0000"+ - "\u034c\u034d\u0003\\.\u0000\u034d\u034f\u0005\n\u0000\u0000\u034e\u0350"+ - "\u0003~?\u0000\u034f\u034e\u0001\u0000\u0000\u0000\u0350\u0351\u0001\u0000"+ - "\u0000\u0000\u0351\u034f\u0001\u0000\u0000\u0000\u0351\u0352\u0001\u0000"+ - "\u0000\u0000\u0352\u0353\u0001\u0000\u0000\u0000\u0353\u0354\u0005X\u0000"+ - "\u0000\u0354\u0355\u0005C\u0000\u0000\u0355\u0356\u0003^/\u0000\u0356"+ - "}\u0001\u0000\u0000\u0000\u0357\u0358\u0005U\u0000\u0000\u0358\u035a\u0003"+ - "^/\u0000\u0359\u0357\u0001\u0000\u0000\u0000\u035a\u035b\u0001\u0000\u0000"+ - "\u0000\u035b\u0359\u0001\u0000\u0000\u0000\u035b\u035c\u0001\u0000\u0000"+ - "\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u035e\u0005C\u0000\u0000"+ - "\u035e\u035f\u0003^/\u0000\u035f\u007f\u0001\u0000\u0000\u0000\u0360\u0361"+ - "\u0005[\u0000\u0000\u0361\u0362\u0005\t\u0000\u0000\u0362\u0363\u0003"+ - "\\.\u0000\u0363\u0365\u0005\n\u0000\u0000\u0364\u0366\u0003\u0082A\u0000"+ - "\u0365\u0364\u0001\u0000\u0000\u0000\u0366\u0367\u0001\u0000\u0000\u0000"+ - "\u0367\u0365\u0001\u0000\u0000\u0000\u0367\u0368\u0001\u0000\u0000\u0000"+ - "\u0368\u0369\u0001\u0000\u0000\u0000\u0369\u036b\u0005X\u0000\u0000\u036a"+ - "\u036c\u0003\u00c0`\u0000\u036b\u036a\u0001\u0000\u0000\u0000\u036b\u036c"+ - "\u0001\u0000\u0000\u0000\u036c\u036d\u0001\u0000\u0000\u0000\u036d\u036e"+ - "\u0005C\u0000\u0000\u036e\u036f\u0003^/\u0000\u036f\u0081\u0001\u0000"+ - "\u0000\u0000\u0370\u0374\u0005U\u0000\u0000\u0371\u0372\u0003\u00c0`\u0000"+ - "\u0372\u0373\u0005F\u0000\u0000\u0373\u0375\u0001\u0000\u0000\u0000\u0374"+ - "\u0371\u0001\u0000\u0000\u0000\u0374\u0375\u0001\u0000\u0000\u0000\u0375"+ - "\u0376\u0001\u0000\u0000\u0000\u0376\u037b\u0003\u00e6s\u0000\u0377\u0378"+ - "\u0005\f\u0000\u0000\u0378\u037a\u0003\u00e6s\u0000\u0379\u0377\u0001"+ - "\u0000\u0000\u0000\u037a\u037d\u0001\u0000\u0000\u0000\u037b\u0379\u0001"+ - "\u0000\u0000\u0000\u037b\u037c\u0001\u0000\u0000\u0000\u037c\u037e\u0001"+ - "\u0000\u0000\u0000\u037d\u037b\u0001\u0000\u0000\u0000\u037e\u037f\u0005"+ - "C\u0000\u0000\u037f\u0380\u0003^/\u0000\u0380\u0083\u0001\u0000\u0000"+ - "\u0000\u0381\u0382\u0005D\u0000\u0000\u0382\u0383\u0005\t\u0000\u0000"+ - "\u0383\u0384\u0003\\.\u0000\u0384\u0385\u0005\n\u0000\u0000\u0385\u0386"+ - "\u0005Y\u0000\u0000\u0386\u0387\u0003^/\u0000\u0387\u0388\u0005Z\u0000"+ - "\u0000\u0388\u0389\u0003^/\u0000\u0389\u0085\u0001\u0000\u0000\u0000\u038a"+ - "\u038b\u0005V\u0000\u0000\u038b\u038c\u0005\u0007\u0000\u0000\u038c\u038d"+ - "\u0003\\.\u0000\u038d\u038f\u0005\b\u0000\u0000\u038e\u0390\u0003\u0088"+ - "D\u0000\u038f\u038e\u0001\u0000\u0000\u0000\u0390\u0391\u0001\u0000\u0000"+ - "\u0000\u0391\u038f\u0001\u0000\u0000\u0000\u0391\u0392\u0001\u0000\u0000"+ - "\u0000\u0392\u0087\u0001\u0000\u0000\u0000\u0393\u0396\u0005W\u0000\u0000"+ - "\u0394\u0397\u0005\u000b\u0000\u0000\u0395\u0397\u0003H$\u0000\u0396\u0394"+ - "\u0001\u0000\u0000\u0000\u0396\u0395\u0001\u0000\u0000\u0000\u0397\u039f"+ - "\u0001\u0000\u0000\u0000\u0398\u039b\u0005\f\u0000\u0000\u0399\u039c\u0005"+ - "\u000b\u0000\u0000\u039a\u039c\u0003H$\u0000\u039b\u0399\u0001\u0000\u0000"+ - "\u0000\u039b\u039a\u0001\u0000\u0000\u0000\u039c\u039e\u0001\u0000\u0000"+ - "\u0000\u039d\u0398\u0001\u0000\u0000\u0000\u039e\u03a1\u0001\u0000\u0000"+ - "\u0000\u039f\u039d\u0001\u0000\u0000\u0000\u039f\u03a0\u0001\u0000\u0000"+ - "\u0000\u03a0\u03a2\u0001\u0000\u0000\u0000\u03a1\u039f\u0001\u0000\u0000"+ - "\u0000\u03a2\u03a3\u0005\u0007\u0000\u0000\u03a3\u03a4\u0003\\.\u0000"+ - "\u03a4\u03a5\u0005\b\u0000\u0000\u03a5\u0089\u0001\u0000\u0000\u0000\u03a6"+ - "\u03ab\u0003\u008cF\u0000\u03a7\u03a8\u0005\\\u0000\u0000\u03a8\u03aa"+ - "\u0003\u008cF\u0000\u03a9\u03a7\u0001\u0000\u0000\u0000\u03aa\u03ad\u0001"+ - "\u0000\u0000\u0000\u03ab\u03a9\u0001\u0000\u0000\u0000\u03ab\u03ac\u0001"+ - "\u0000\u0000\u0000\u03ac\u008b\u0001\u0000\u0000\u0000\u03ad\u03ab\u0001"+ - "\u0000\u0000\u0000\u03ae\u03b3\u0003\u008eG\u0000\u03af\u03b0\u0005]\u0000"+ - "\u0000\u03b0\u03b2\u0003\u008eG\u0000\u03b1\u03af\u0001\u0000\u0000\u0000"+ - "\u03b2\u03b5\u0001\u0000\u0000\u0000\u03b3\u03b1\u0001\u0000\u0000\u0000"+ - "\u03b3\u03b4\u0001\u0000\u0000\u0000\u03b4\u008d\u0001\u0000\u0000\u0000"+ - "\u03b5\u03b3\u0001\u0000\u0000\u0000\u03b6\u03b8\u0005^\u0000\u0000\u03b7"+ - "\u03b6\u0001\u0000\u0000\u0000\u03b7\u03b8\u0001\u0000\u0000\u0000\u03b8"+ - "\u03b9\u0001\u0000\u0000\u0000\u03b9\u03ba\u0003\u0090H\u0000\u03ba\u008f"+ - "\u0001\u0000\u0000\u0000\u03bb\u03be\u0003\u0092I\u0000\u03bc\u03bd\u0007"+ - "\u0003\u0000\u0000\u03bd\u03bf\u0003\u0092I\u0000\u03be\u03bc\u0001\u0000"+ - "\u0000\u0000\u03be\u03bf\u0001\u0000\u0000\u0000\u03bf\u0091\u0001\u0000"+ - "\u0000\u0000\u03c0\u03c5\u0003\u0094J\u0000\u03c1\u03c2\u0005/\u0000\u0000"+ - "\u03c2\u03c4\u0003\u0094J\u0000\u03c3\u03c1\u0001\u0000\u0000\u0000\u03c4"+ - "\u03c7\u0001\u0000\u0000\u0000\u03c5\u03c3\u0001\u0000\u0000\u0000\u03c5"+ - "\u03c6\u0001\u0000\u0000\u0000\u03c6\u0093\u0001\u0000\u0000\u0000\u03c7"+ - "\u03c5\u0001\u0000\u0000\u0000\u03c8\u03cb\u0003\u0096K\u0000\u03c9\u03ca"+ - "\u0005_\u0000\u0000\u03ca\u03cc\u0003\u0096K\u0000\u03cb\u03c9\u0001\u0000"+ - "\u0000\u0000\u03cb\u03cc\u0001\u0000\u0000\u0000\u03cc\u0095\u0001\u0000"+ - "\u0000\u0000\u03cd\u03d2\u0003\u0098L\u0000\u03ce\u03cf\u0007\u0004\u0000"+ - "\u0000\u03cf\u03d1\u0003\u0098L\u0000\u03d0\u03ce\u0001\u0000\u0000\u0000"+ - "\u03d1\u03d4\u0001\u0000\u0000\u0000\u03d2\u03d0\u0001\u0000\u0000\u0000"+ - "\u03d2\u03d3\u0001\u0000\u0000\u0000\u03d3\u0097\u0001\u0000\u0000\u0000"+ - "\u03d4\u03d2\u0001\u0000\u0000\u0000\u03d5\u03da\u0003\u009aM\u0000\u03d6"+ - "\u03d7\u0007\u0005\u0000\u0000\u03d7\u03d9\u0003\u009aM\u0000\u03d8\u03d6"+ - "\u0001\u0000\u0000\u0000\u03d9\u03dc\u0001\u0000\u0000\u0000\u03da\u03d8"+ - "\u0001\u0000\u0000\u0000\u03da\u03db\u0001\u0000\u0000\u0000\u03db\u0099"+ - "\u0001\u0000\u0000\u0000\u03dc\u03da\u0001\u0000\u0000\u0000\u03dd\u03e1"+ - "\u0003\u009cN\u0000\u03de\u03df\u0005`\u0000\u0000\u03df\u03e0\u0005a"+ - "\u0000\u0000\u03e0\u03e2\u0003\u00e6s\u0000\u03e1\u03de\u0001\u0000\u0000"+ - "\u0000\u03e1\u03e2\u0001\u0000\u0000\u0000\u03e2\u009b\u0001\u0000\u0000"+ - "\u0000\u03e3\u03e7\u0003\u009eO\u0000\u03e4\u03e5\u0005c\u0000\u0000\u03e5"+ - "\u03e6\u0005b\u0000\u0000\u03e6\u03e8\u0003\u00e6s\u0000\u03e7\u03e4\u0001"+ - "\u0000\u0000\u0000\u03e7\u03e8\u0001\u0000\u0000\u0000\u03e8\u009d\u0001"+ - "\u0000\u0000\u0000\u03e9\u03ed\u0003\u00a0P\u0000\u03ea\u03eb\u0005d\u0000"+ - "\u0000\u03eb\u03ec\u0005F\u0000\u0000\u03ec\u03ee\u0003\u00e6s\u0000\u03ed"+ - "\u03ea\u0001\u0000\u0000\u0000\u03ed\u03ee\u0001\u0000\u0000\u0000\u03ee"+ - "\u009f\u0001\u0000\u0000\u0000\u03ef\u03f3\u0003\u00a2Q\u0000\u03f0\u03f1"+ - "\u0005f\u0000\u0000\u03f1\u03f2\u0005F\u0000\u0000\u03f2\u03f4\u0003\u00f2"+ - "y\u0000\u03f3\u03f0\u0001\u0000\u0000\u0000\u03f3\u03f4\u0001\u0000\u0000"+ - "\u0000\u03f4\u00a1\u0001\u0000\u0000\u0000\u03f5\u03f9\u0003\u00a4R\u0000"+ - "\u03f6\u03f7\u0005e\u0000\u0000\u03f7\u03f8\u0005F\u0000\u0000\u03f8\u03fa"+ - "\u0003\u00f2y\u0000\u03f9\u03f6\u0001\u0000\u0000\u0000\u03f9\u03fa\u0001"+ - "\u0000\u0000\u0000\u03fa\u00a3\u0001\u0000\u0000\u0000\u03fb\u0404\u0003"+ - "\u00a8T\u0000\u03fc\u03fd\u0005\u0004\u0000\u0000\u03fd\u03fe\u0005-\u0000"+ - "\u0000\u03fe\u03ff\u0001\u0000\u0000\u0000\u03ff\u0400\u0003\u00a6S\u0000"+ - "\u0400\u0401\u0003\u00ccf\u0000\u0401\u0403\u0001\u0000\u0000\u0000\u0402"+ - "\u03fc\u0001\u0000\u0000\u0000\u0403\u0406\u0001\u0000\u0000\u0000\u0404"+ - "\u0402\u0001\u0000\u0000\u0000\u0404\u0405\u0001\u0000\u0000\u0000\u0405"+ - "\u00a5\u0001\u0000\u0000\u0000\u0406\u0404\u0001\u0000\u0000\u0000\u0407"+ - "\u040b\u0003H$\u0000\u0408\u040b\u0003\u00c0`\u0000\u0409\u040b\u0003"+ - "\u00c2a\u0000\u040a\u0407\u0001\u0000\u0000\u0000\u040a\u0408\u0001\u0000"+ - "\u0000\u0000\u040a\u0409\u0001\u0000\u0000\u0000\u040b\u00a7\u0001\u0000"+ - "\u0000\u0000\u040c\u040e\u0007\u0004\u0000\u0000\u040d\u040c\u0001\u0000"+ - "\u0000\u0000\u040e\u0411\u0001\u0000\u0000\u0000\u040f\u040d\u0001\u0000"+ - "\u0000\u0000\u040f\u0410\u0001\u0000\u0000\u0000\u0410\u0412\u0001\u0000"+ - "\u0000\u0000\u0411\u040f\u0001\u0000\u0000\u0000\u0412\u0413\u0003\u00aa"+ - "U\u0000\u0413\u00a9\u0001\u0000\u0000\u0000\u0414\u0418\u0003\u00b0X\u0000"+ - "\u0415\u0418\u0003\u00acV\u0000\u0416\u0418\u0003\u00aeW\u0000\u0417\u0414"+ - "\u0001\u0000\u0000\u0000\u0417\u0415\u0001\u0000\u0000\u0000\u0417\u0416"+ - "\u0001\u0000\u0000\u0000\u0418\u00ab\u0001\u0000\u0000\u0000\u0419\u041a"+ - "\u0005m\u0000\u0000\u041a\u041b\u0005l\u0000\u0000\u041b\u041c\u0003\u00e6"+ - "s\u0000\u041c\u041d\u0005\u0007\u0000\u0000\u041d\u041e\u0003\\.\u0000"+ - "\u041e\u041f\u0005\b\u0000\u0000\u041f\u00ad\u0001\u0000\u0000\u0000\u0420"+ - "\u0421\u0005n\u0000\u0000\u0421\u0422\u0005l\u0000\u0000\u0422\u0423\u0003"+ - "\u00e6s\u0000\u0423\u0424\u0005\u0007\u0000\u0000\u0424\u0425\u0003\\"+ - ".\u0000\u0425\u0426\u0005\b\u0000\u0000\u0426\u00af\u0001\u0000\u0000"+ - "\u0000\u0427\u042c\u0003\u00b2Y\u0000\u0428\u0429\u00055\u0000\u0000\u0429"+ - "\u042b\u0003\u00b2Y\u0000\u042a\u0428\u0001\u0000\u0000\u0000\u042b\u042e"+ - "\u0001\u0000\u0000\u0000\u042c\u042a\u0001\u0000\u0000\u0000\u042c\u042d"+ - "\u0001\u0000\u0000\u0000\u042d\u00b1\u0001\u0000\u0000\u0000\u042e\u042c"+ - "\u0001\u0000\u0000\u0000\u042f\u0437\u0003\u00bc^\u0000\u0430\u0436\u0003"+ - "\u00b4Z\u0000\u0431\u0436\u0003\u00b8\\\u0000\u0432\u0436\u0003\u00ba"+ - "]\u0000\u0433\u0436\u0003\u00b6[\u0000\u0434\u0436\u0003\u00ccf\u0000"+ - "\u0435\u0430\u0001\u0000\u0000\u0000\u0435\u0431\u0001\u0000\u0000\u0000"+ - "\u0435\u0432\u0001\u0000\u0000\u0000\u0435\u0433\u0001\u0000\u0000\u0000"+ - "\u0435\u0434\u0001\u0000\u0000\u0000\u0436\u0439\u0001\u0000\u0000\u0000"+ - "\u0437\u0435\u0001\u0000\u0000\u0000\u0437\u0438\u0001\u0000\u0000\u0000"+ - "\u0438\u00b3\u0001\u0000\u0000\u0000\u0439\u0437\u0001\u0000\u0000\u0000"+ - "\u043a\u043b\u00056\u0000\u0000\u043b\u043c\u00056\u0000\u0000\u043c\u043d"+ - "\u0003\\.\u0000\u043d\u043e\u00057\u0000\u0000\u043e\u043f\u00057\u0000"+ - "\u0000\u043f\u00b5\u0001\u0000\u0000\u0000\u0440\u0441\u00056\u0000\u0000"+ - "\u0441\u0442\u00057\u0000\u0000\u0442\u00b7\u0001\u0000\u0000\u0000\u0443"+ - "\u0444\u00056\u0000\u0000\u0444\u0445\u0003\\.\u0000\u0445\u0446\u0005"+ - "7\u0000\u0000\u0446\u00b9\u0001\u0000\u0000\u0000\u0447\u044e\u00058\u0000"+ - "\u0000\u0448\u044f\u0003\u00fc~\u0000\u0449\u044f\u0003\u00fa}\u0000\u044a"+ - "\u044f\u0005\u008e\u0000\u0000\u044b\u044f\u0003\u00c2a\u0000\u044c\u044f"+ - "\u0003\u00c0`\u0000\u044d\u044f\u0003\u00c4b\u0000\u044e\u0448\u0001\u0000"+ - "\u0000\u0000\u044e\u0449\u0001\u0000\u0000\u0000\u044e\u044a\u0001\u0000"+ - "\u0000\u0000\u044e\u044b\u0001\u0000\u0000\u0000\u044e\u044c\u0001\u0000"+ - "\u0000\u0000\u044e\u044d\u0001\u0000\u0000\u0000\u044f\u00bb\u0001\u0000"+ - "\u0000\u0000\u0450\u0460\u0005\u0087\u0000\u0000\u0451\u0460\u0005j\u0000"+ - "\u0000\u0452\u0460\u0005k\u0000\u0000\u0453\u0460\u0005\u0088\u0000\u0000"+ - "\u0454\u0460\u0003\u00fa}\u0000\u0455\u0460\u0003\u00c0`\u0000\u0456\u0460"+ - "\u0003\u00c2a\u0000\u0457\u0460\u0003\u00c4b\u0000\u0458\u0460\u0003\u00e8"+ - "t\u0000\u0459\u0460\u0003\u00cae\u0000\u045a\u0460\u0003\u00c6c\u0000"+ - "\u045b\u0460\u0003\u00c8d\u0000\u045c\u0460\u0003\u00f6{\u0000\u045d\u0460"+ - "\u0003\u00d0h\u0000\u045e\u0460\u0003\u00be_\u0000\u045f\u0450\u0001\u0000"+ - "\u0000\u0000\u045f\u0451\u0001\u0000\u0000\u0000\u045f\u0452\u0001\u0000"+ - "\u0000\u0000\u045f\u0453\u0001\u0000\u0000\u0000\u045f\u0454\u0001\u0000"+ - "\u0000\u0000\u045f\u0455\u0001\u0000\u0000\u0000\u045f\u0456\u0001\u0000"+ - "\u0000\u0000\u045f\u0457\u0001\u0000\u0000\u0000\u045f\u0458\u0001\u0000"+ - "\u0000\u0000\u045f\u0459\u0001\u0000\u0000\u0000\u045f\u045a\u0001\u0000"+ - "\u0000\u0000\u045f\u045b\u0001\u0000\u0000\u0000\u045f\u045c\u0001\u0000"+ - "\u0000\u0000\u045f\u045d\u0001\u0000\u0000\u0000\u045f\u045e\u0001\u0000"+ - "\u0000\u0000\u0460\u00bd\u0001\u0000\u0000\u0000\u0461\u0462\u0005\u0007"+ - "\u0000\u0000\u0462\u0463\u0003\u000e\u0007\u0000\u0463\u0464\u0005\b\u0000"+ - "\u0000\u0464\u00bf\u0001\u0000\u0000\u0000\u0465\u0466\u0005\u0005\u0000"+ - "\u0000\u0466\u0467\u0003H$\u0000\u0467\u00c1\u0001\u0000\u0000\u0000\u0468"+ - "\u046a\u0005\t\u0000\u0000\u0469\u046b\u0003\\.\u0000\u046a\u0469\u0001"+ - "\u0000\u0000\u0000\u046a\u046b\u0001\u0000\u0000\u0000\u046b\u046c\u0001"+ - "\u0000\u0000\u0000\u046c\u046d\u0005\n\u0000\u0000\u046d\u00c3\u0001\u0000"+ - "\u0000\u0000\u046e\u046f\u00059\u0000\u0000\u046f\u00c5\u0001\u0000\u0000"+ - "\u0000\u0470\u0471\u0005\u0010\u0000\u0000\u0471\u0472\u0005\u0007\u0000"+ - "\u0000\u0472\u0473\u0003\\.\u0000\u0473\u0474\u0005\b\u0000\u0000\u0474"+ - "\u00c7\u0001\u0000\u0000\u0000\u0475\u0476\u0005i\u0000\u0000\u0476\u0477"+ - "\u0005\u0007\u0000\u0000\u0477\u0478\u0003\\.\u0000\u0478\u0479\u0005"+ - "\b\u0000\u0000\u0479\u00c9\u0001\u0000\u0000\u0000\u047a\u047b\u0003H"+ - "$\u0000\u047b\u047c\u0003\u00ccf\u0000\u047c\u00cb\u0001\u0000\u0000\u0000"+ - "\u047d\u0484\u0005\t\u0000\u0000\u047e\u0480\u0003\u00ceg\u0000\u047f"+ - "\u0481\u0005\u000e\u0000\u0000\u0480\u047f\u0001\u0000\u0000\u0000\u0480"+ - "\u0481\u0001\u0000\u0000\u0000\u0481\u0483\u0001\u0000\u0000\u0000\u0482"+ - "\u047e\u0001\u0000\u0000\u0000\u0483\u0486\u0001\u0000\u0000\u0000\u0484"+ - "\u0482\u0001\u0000\u0000\u0000\u0484\u0485\u0001\u0000\u0000\u0000\u0485"+ - "\u0487\u0001\u0000\u0000\u0000\u0486\u0484\u0001\u0000\u0000\u0000\u0487"+ - "\u0488\u0005\n\u0000\u0000\u0488\u00cd\u0001\u0000\u0000\u0000\u0489\u048c"+ - "\u0003^/\u0000\u048a\u048c\u0005\u0086\u0000\u0000\u048b\u0489\u0001\u0000"+ - "\u0000\u0000\u048b\u048a\u0001\u0000\u0000\u0000\u048c\u00cf\u0001\u0000"+ - "\u0000\u0000\u048d\u0490\u0003\u00d2i\u0000\u048e\u0490\u0003\u00d4j\u0000"+ - "\u048f\u048d\u0001\u0000\u0000\u0000\u048f\u048e\u0001\u0000\u0000\u0000"+ - "\u0490\u00d1\u0001\u0000\u0000\u0000\u0491\u0492\u0003H$\u0000\u0492\u0493"+ - "\u0005:\u0000\u0000\u0493\u0494\u0005\u0088\u0000\u0000\u0494\u00d3\u0001"+ - "\u0000\u0000\u0000\u0495\u0496\u00032\u0019\u0000\u0496\u0497\u0005\u001f"+ - "\u0000\u0000\u0497\u0499\u0005\t\u0000\u0000\u0498\u049a\u0003X,\u0000"+ - "\u0499\u0498\u0001\u0000\u0000\u0000\u0499\u049a\u0001\u0000\u0000\u0000"+ - "\u049a\u049b\u0001\u0000\u0000\u0000\u049b\u049e\u0005\n\u0000\u0000\u049c"+ - "\u049d\u0005F\u0000\u0000\u049d\u049f\u0003\u00e6s\u0000\u049e\u049c\u0001"+ - "\u0000\u0000\u0000\u049e\u049f\u0001\u0000\u0000\u0000\u049f\u04a0\u0001"+ - "\u0000\u0000\u0000\u04a0\u04a1\u0005\u0007\u0000\u0000\u04a1\u04a2\u0003"+ - "\u0010\b\u0000\u04a2\u04a3\u0005\b\u0000\u0000\u04a3\u00d5\u0001\u0000"+ - "\u0000\u0000\u04a4\u04a5\u0005s\u0000\u0000\u04a5\u04a6\u0005|\u0000\u0000"+ - "\u04a6\u04a7\u0003^/\u0000\u04a7\u04a8\u0005z\u0000\u0000\u04a8\u04ac"+ - "\u0003^/\u0000\u04a9\u04aa\u0005G\u0000\u0000\u04aa\u04ab\u0005~\u0000"+ - "\u0000\u04ab\u04ad\u0003^/\u0000\u04ac\u04a9\u0001\u0000\u0000\u0000\u04ac"+ - "\u04ad\u0001\u0000\u0000\u0000\u04ad\u04bc\u0001\u0000\u0000\u0000\u04ae"+ - "\u04af\u0005s\u0000\u0000\u04af\u04b0\u0005|\u0000\u0000\u04b0\u04b5\u0003"+ - "\u00f4z\u0000\u04b1\u04b2\u0005\u000e\u0000\u0000\u04b2\u04b4\u0003\u00f4"+ - "z\u0000\u04b3\u04b1\u0001\u0000\u0000\u0000\u04b4\u04b7\u0001\u0000\u0000"+ - "\u0000\u04b5\u04b3\u0001\u0000\u0000\u0000\u04b5\u04b6\u0001\u0000\u0000"+ - "\u0000\u04b6\u04b8\u0001\u0000\u0000\u0000\u04b7\u04b5\u0001\u0000\u0000"+ - "\u0000\u04b8\u04b9\u0005z\u0000\u0000\u04b9\u04ba\u0003^/\u0000\u04ba"+ - "\u04bc\u0001\u0000\u0000\u0000\u04bb\u04a4\u0001\u0000\u0000\u0000\u04bb"+ - "\u04ae\u0001\u0000\u0000\u0000\u04bc\u00d7\u0001\u0000\u0000\u0000\u04bd"+ - "\u04be\u0005t\u0000\u0000\u04be\u04bf\u0005|\u0000\u0000\u04bf\u04c0\u0003"+ - "\u00e2q\u0000\u04c0\u00d9\u0001\u0000\u0000\u0000\u04c1\u04c2\u0005u\u0000"+ - "\u0000\u04c2\u04c3\u0005|\u0000\u0000\u04c3\u04c4\u0003\u00e2q\u0000\u04c4"+ - "\u04c5\u0005F\u0000\u0000\u04c5\u04c6\u0003^/\u0000\u04c6\u00db\u0001"+ - "\u0000\u0000\u0000\u04c7\u04c8\u0005v\u0000\u0000\u04c8\u04c9\u0005{\u0000"+ - "\u0000\u04c9\u04ca\u0005a\u0000\u0000\u04ca\u04cb\u0005|\u0000\u0000\u04cb"+ - "\u04cc\u0003\u00e2q\u0000\u04cc\u04cd\u0005}\u0000\u0000\u04cd\u04ce\u0003"+ - "^/\u0000\u04ce\u00dd\u0001\u0000\u0000\u0000\u04cf\u04d0\u0005w\u0000"+ - "\u0000\u04d0\u04d5\u0003\u00e4r\u0000\u04d1\u04d2\u0005\u000e\u0000\u0000"+ - "\u04d2\u04d4\u0003\u00e4r\u0000\u04d3\u04d1\u0001\u0000\u0000\u0000\u04d4"+ - "\u04d7\u0001\u0000\u0000\u0000\u04d5\u04d3\u0001\u0000\u0000\u0000\u04d5"+ - "\u04d6\u0001\u0000\u0000\u0000\u04d6\u04d8\u0001\u0000\u0000\u0000\u04d7"+ - "\u04d5\u0001\u0000\u0000\u0000\u04d8\u04d9\u0005x\u0000\u0000\u04d9\u04da"+ - "\u0003^/\u0000\u04da\u04db\u0005C\u0000\u0000\u04db\u04dc\u0003^/\u0000"+ - "\u04dc\u00df\u0001\u0000\u0000\u0000\u04dd\u04de\u0005y\u0000\u0000\u04de"+ - "\u04df\u0005|\u0000\u0000\u04df\u04e0\u0003^/\u0000\u04e0\u04e1\u0005"+ - "z\u0000\u0000\u04e1\u04e2\u0003^/\u0000\u04e2\u00e1\u0001\u0000\u0000"+ - "\u0000\u04e3\u04e6\u0003\u00bc^\u0000\u04e4\u04e7\u0003\u00b4Z\u0000\u04e5"+ - "\u04e7\u0003\u00ba]\u0000\u04e6\u04e4\u0001\u0000\u0000\u0000\u04e6\u04e5"+ - "\u0001\u0000\u0000\u0000\u04e7\u04e8\u0001\u0000\u0000\u0000\u04e8\u04e6"+ - "\u0001\u0000\u0000\u0000\u04e8\u04e9\u0001\u0000\u0000\u0000\u04e9\u00e3"+ - "\u0001\u0000\u0000\u0000\u04ea\u04eb\u0003\u00c0`\u0000\u04eb\u04ec\u0005"+ - "\u0006\u0000\u0000\u04ec\u04ed\u0003^/\u0000\u04ed\u00e5\u0001\u0000\u0000"+ - "\u0000\u04ee\u04ef\u0005\t\u0000\u0000\u04ef\u04f7\u0005\n\u0000\u0000"+ - "\u04f0\u04f4\u0003\u00eau\u0000\u04f1\u04f5\u0005\u0086\u0000\u0000\u04f2"+ - "\u04f5\u0005\u000b\u0000\u0000\u04f3\u04f5\u00050\u0000\u0000\u04f4\u04f1"+ - "\u0001\u0000\u0000\u0000\u04f4\u04f2\u0001\u0000\u0000\u0000\u04f4\u04f3"+ - "\u0001\u0000\u0000\u0000\u04f4\u04f5\u0001\u0000\u0000\u0000\u04f5\u04f7"+ - "\u0001\u0000\u0000\u0000\u04f6\u04ee\u0001\u0000\u0000\u0000\u04f6\u04f0"+ - "\u0001\u0000\u0000\u0000\u04f7\u00e7\u0001\u0000\u0000\u0000\u04f8\u0501"+ - "\u0005\u0007\u0000\u0000\u04f9\u04fe\u0003\u00f4z\u0000\u04fa\u04fb\u0005"+ - "\u000e\u0000\u0000\u04fb\u04fd\u0003\u00f4z\u0000\u04fc\u04fa\u0001\u0000"+ - "\u0000\u0000\u04fd\u0500\u0001\u0000\u0000\u0000\u04fe\u04fc\u0001\u0000"+ - "\u0000\u0000\u04fe\u04ff\u0001\u0000\u0000\u0000\u04ff\u0502\u0001\u0000"+ - "\u0000\u0000\u0500\u04fe\u0001\u0000\u0000\u0000\u0501\u04f9\u0001\u0000"+ - "\u0000\u0000\u0501\u0502\u0001\u0000\u0000\u0000\u0502\u0503\u0001\u0000"+ - "\u0000\u0000\u0503\u0509\u0005\b\u0000\u0000\u0504\u0505\u0005;\u0000"+ - "\u0000\u0505\u0506\u0003\\.\u0000\u0506\u0507\u0005<\u0000\u0000\u0507"+ - "\u0509\u0001\u0000\u0000\u0000\u0508\u04f8\u0001\u0000\u0000\u0000\u0508"+ - "\u0504\u0001\u0000\u0000\u0000\u0509\u00e9\u0001\u0000\u0000\u0000\u050a"+ - "\u050e\u0003H$\u0000\u050b\u050e\u0005\u0087\u0000\u0000\u050c\u050e\u0003"+ - "\u00ecv\u0000\u050d\u050a\u0001\u0000\u0000\u0000\u050d\u050b\u0001\u0000"+ - "\u0000\u0000\u050d\u050c\u0001\u0000\u0000\u0000\u050e\u00eb\u0001\u0000"+ - "\u0000\u0000\u050f\u0512\u0003\u00eew\u0000\u0510\u0512\u0003\u00f0x\u0000"+ - "\u0511\u050f\u0001\u0000\u0000\u0000\u0511\u0510\u0001\u0000\u0000\u0000"+ - "\u0512\u00ed\u0001\u0000\u0000\u0000\u0513\u0514\u0005\u001f\u0000\u0000"+ - "\u0514\u0515\u0005\t\u0000\u0000\u0515\u0516\u0005\u000b\u0000\u0000\u0516"+ - "\u0517\u0005\n\u0000\u0000\u0517\u00ef\u0001\u0000\u0000\u0000\u0518\u0519"+ - "\u0005\u001f\u0000\u0000\u0519\u0522\u0005\t\u0000\u0000\u051a\u051f\u0003"+ - "\u00e6s\u0000\u051b\u051c\u0005\u000e\u0000\u0000\u051c\u051e\u0003\u00e6"+ - "s\u0000\u051d\u051b\u0001\u0000\u0000\u0000\u051e\u0521\u0001\u0000\u0000"+ - "\u0000\u051f\u051d\u0001\u0000\u0000\u0000\u051f\u0520\u0001\u0000\u0000"+ - "\u0000\u0520\u0523\u0001\u0000\u0000\u0000\u0521\u051f\u0001\u0000\u0000"+ - "\u0000\u0522\u051a\u0001\u0000\u0000\u0000\u0522\u0523\u0001\u0000\u0000"+ - "\u0000\u0523\u0524\u0001\u0000\u0000\u0000\u0524\u0525\u0005\n\u0000\u0000"+ - "\u0525\u0526\u0005F\u0000\u0000\u0526\u0527\u0003\u00e6s\u0000\u0527\u00f1"+ - "\u0001\u0000\u0000\u0000\u0528\u052a\u0003\u00eau\u0000\u0529\u052b\u0005"+ - "\u0086\u0000\u0000\u052a\u0529\u0001\u0000\u0000\u0000\u052a\u052b\u0001"+ - "\u0000\u0000\u0000\u052b\u00f3\u0001\u0000\u0000\u0000\u052c\u052f\u0003"+ - "^/\u0000\u052d\u052f\u0005\u008e\u0000\u0000\u052e\u052c\u0001\u0000\u0000"+ - "\u0000\u052e\u052d\u0001\u0000\u0000\u0000\u052f\u0530\u0001\u0000\u0000"+ - "\u0000\u0530\u0531\u0007\u0006\u0000\u0000\u0531\u0532\u0003^/\u0000\u0532"+ - "\u00f5\u0001\u0000\u0000\u0000\u0533\u0535\u00056\u0000\u0000\u0534\u0536"+ - "\u0003\\.\u0000\u0535\u0534\u0001\u0000\u0000\u0000\u0535\u0536\u0001"+ - "\u0000\u0000\u0000\u0536\u0537\u0001\u0000\u0000\u0000\u0537\u0538\u0005"+ - "7\u0000\u0000\u0538\u00f7\u0001\u0000\u0000\u0000\u0539\u053a\u0003\u00fa"+ - "}\u0000\u053a\u00f9\u0001\u0000\u0000\u0000\u053b\u053c\u0005\u0085\u0000"+ - "\u0000\u053c\u00fb\u0001\u0000\u0000\u0000\u053d\u053e\u0007\u0007\u0000"+ - "\u0000\u053e\u00fd\u0001\u0000\u0000\u0000\u0084\u0106\u010a\u011a\u0120"+ + "\u0018\u0003\u0018\u01da\b\u0018\u0001\u0018\u0003\u0018\u01dd\b\u0018"+ + "\u0001\u0019\u0005\u0019\u01e0\b\u0019\n\u0019\f\u0019\u01e3\t\u0019\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0005\u001a\u01ea"+ + "\b\u001a\n\u001a\f\u001a\u01ed\t\u001a\u0001\u001a\u0001\u001a\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0003\u001b\u01f4\b\u001b\u0001\u001b\u0001\u001b"+ + "\u0003\u001b\u01f8\b\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0003\u001d\u0204\b\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0003\u001f\u0210\b\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001"+ + "!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0003#\u0226\b#\u0001#\u0001#\u0001#\u0001"+ + "#\u0005#\u022c\b#\n#\f#\u022f\t#\u0001$\u0001$\u0003$\u0233\b$\u0001$"+ + "\u0003$\u0236\b$\u0001$\u0001$\u0003$\u023a\b$\u0001%\u0001%\u0001&\u0001"+ + "&\u0001&\u0001&\u0001&\u0003&\u0243\b&\u0001&\u0001&\u0001&\u0001&\u0001"+ + "&\u0005&\u024a\b&\n&\f&\u024d\t&\u0003&\u024f\b&\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0003\'\u0257\b\'\u0001\'\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0003\'\u025e\b\'\u0003\'\u0260\b\'\u0001(\u0001(\u0001(\u0001"+ + "(\u0001(\u0003(\u0267\b(\u0001(\u0001(\u0001(\u0001(\u0001(\u0003(\u026e"+ + "\b(\u0003(\u0270\b(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0003)\u0278"+ + "\b)\u0001)\u0001)\u0001)\u0003)\u027d\b)\u0001)\u0001)\u0001)\u0001)\u0001"+ + ")\u0003)\u0284\b)\u0001*\u0001*\u0001*\u0001*\u0001*\u0003*\u028b\b*\u0001"+ + "*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0003+\u0295\b+\u0001"+ + ",\u0001,\u0001,\u0005,\u029a\b,\n,\f,\u029d\t,\u0001-\u0001-\u0001-\u0001"+ + "-\u0003-\u02a3\b-\u0001.\u0001.\u0001.\u0005.\u02a8\b.\n.\f.\u02ab\t."+ + "\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0003/\u02b3\b/\u00010\u0001"+ + "0\u00010\u00010\u00010\u00010\u00010\u00010\u00030\u02bd\b0\u00011\u0001"+ + "1\u00031\u02c1\b1\u00011\u00011\u00011\u00011\u00011\u00011\u00051\u02c9"+ + "\b1\n1\f1\u02cc\t1\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u0005"+ + "2\u02d5\b2\n2\f2\u02d8\t2\u00013\u00013\u00013\u00033\u02dd\b3\u00013"+ + "\u00013\u00033\u02e1\b3\u00013\u00013\u00033\u02e5\b3\u00013\u00013\u0001"+ + "3\u00014\u00014\u00014\u00014\u00054\u02ee\b4\n4\f4\u02f1\t4\u00015\u0001"+ + "5\u00015\u00035\u02f6\b5\u00015\u00015\u00015\u00016\u00016\u00016\u0001"+ + "7\u00017\u00017\u00017\u00017\u00057\u0303\b7\n7\f7\u0306\t7\u00018\u0001"+ + "8\u00018\u00038\u030b\b8\u00018\u00018\u00038\u030f\b8\u00018\u00018\u0003"+ + "8\u0313\b8\u00019\u00019\u00019\u00019\u00019\u00039\u031a\b9\u00019\u0001"+ + "9\u00019\u00059\u031f\b9\n9\f9\u0322\t9\u0001:\u0001:\u0001:\u0003:\u0327"+ + "\b:\u0001:\u0001:\u0001:\u0003:\u032c\b:\u0003:\u032e\b:\u0001:\u0001"+ + ":\u0003:\u0332\b:\u0001;\u0001;\u0001;\u0001<\u0001<\u0003<\u0339\b<\u0001"+ + "<\u0001<\u0001<\u0005<\u033e\b<\n<\f<\u0341\t<\u0001<\u0001<\u0001<\u0001"+ + "=\u0001=\u0001=\u0003=\u0349\b=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001"+ + ">\u0001>\u0001>\u0004>\u0353\b>\u000b>\f>\u0354\u0001>\u0001>\u0001>\u0001"+ + ">\u0001?\u0001?\u0004?\u035d\b?\u000b?\f?\u035e\u0001?\u0001?\u0001?\u0001"+ + "@\u0001@\u0001@\u0001@\u0001@\u0004@\u0369\b@\u000b@\f@\u036a\u0001@\u0001"+ + "@\u0003@\u036f\b@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0003"+ + "A\u0378\bA\u0001A\u0001A\u0001A\u0005A\u037d\bA\nA\fA\u0380\tA\u0001A"+ + "\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0004C\u0393\bC\u000bC\fC"+ + "\u0394\u0001D\u0001D\u0001D\u0003D\u039a\bD\u0001D\u0001D\u0001D\u0003"+ + "D\u039f\bD\u0005D\u03a1\bD\nD\fD\u03a4\tD\u0001D\u0001D\u0001D\u0001D"+ + "\u0001E\u0001E\u0001E\u0005E\u03ad\bE\nE\fE\u03b0\tE\u0001F\u0001F\u0001"+ + "F\u0005F\u03b5\bF\nF\fF\u03b8\tF\u0001G\u0003G\u03bb\bG\u0001G\u0001G"+ + "\u0001H\u0001H\u0001H\u0003H\u03c2\bH\u0001I\u0001I\u0001I\u0005I\u03c7"+ + "\bI\nI\fI\u03ca\tI\u0001J\u0001J\u0001J\u0003J\u03cf\bJ\u0001K\u0001K"+ + "\u0001K\u0005K\u03d4\bK\nK\fK\u03d7\tK\u0001L\u0001L\u0001L\u0005L\u03dc"+ + "\bL\nL\fL\u03df\tL\u0001M\u0001M\u0001M\u0001M\u0003M\u03e5\bM\u0001N"+ + "\u0001N\u0001N\u0001N\u0003N\u03eb\bN\u0001O\u0001O\u0001O\u0001O\u0003"+ + "O\u03f1\bO\u0001P\u0001P\u0001P\u0001P\u0003P\u03f7\bP\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0003Q\u03fd\bQ\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0005R\u0406\bR\nR\fR\u0409\tR\u0001S\u0001S\u0001S\u0003S\u040e\bS"+ + "\u0001T\u0005T\u0411\bT\nT\fT\u0414\tT\u0001T\u0001T\u0001U\u0001U\u0001"+ + "U\u0003U\u041b\bU\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ + "W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0005"+ + "X\u042e\bX\nX\fX\u0431\tX\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0005"+ + "Y\u0439\bY\nY\fY\u043c\tY\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001"+ + "]\u0001]\u0001]\u0001]\u0003]\u0452\b]\u0001^\u0001^\u0001^\u0001^\u0001"+ + "^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+ + "^\u0003^\u0463\b^\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001"+ + "a\u0001a\u0003a\u046e\ba\u0001a\u0001a\u0001b\u0001b\u0001c\u0001c\u0001"+ + "c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001"+ + "e\u0001f\u0001f\u0001f\u0003f\u0484\bf\u0005f\u0486\bf\nf\ff\u0489\tf"+ + "\u0001f\u0001f\u0001g\u0001g\u0003g\u048f\bg\u0001h\u0001h\u0003h\u0493"+ + "\bh\u0001i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0003j\u049d"+ + "\bj\u0001j\u0001j\u0001j\u0003j\u04a2\bj\u0001j\u0001j\u0001j\u0001j\u0001"+ + "k\u0001k\u0001k\u0001k\u0001k\u0001k\u0001k\u0001k\u0003k\u04b0\bk\u0001"+ + "k\u0001k\u0001k\u0001k\u0001k\u0005k\u04b7\bk\nk\fk\u04ba\tk\u0001k\u0001"+ + "k\u0001k\u0003k\u04bf\bk\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001"+ + "m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001"+ + "n\u0001n\u0001o\u0001o\u0001o\u0001o\u0005o\u04d7\bo\no\fo\u04da\to\u0001"+ + "o\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001p\u0001"+ + "p\u0001q\u0001q\u0001q\u0004q\u04ea\bq\u000bq\fq\u04eb\u0001r\u0001r\u0001"+ + "r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001s\u0001s\u0003s\u04f8\bs\u0003"+ + "s\u04fa\bs\u0001t\u0001t\u0001t\u0001t\u0005t\u0500\bt\nt\ft\u0503\tt"+ + "\u0003t\u0505\bt\u0001t\u0001t\u0001t\u0001t\u0001t\u0003t\u050c\bt\u0001"+ + "u\u0001u\u0001u\u0003u\u0511\bu\u0001v\u0001v\u0003v\u0515\bv\u0001w\u0001"+ + "w\u0001w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001x\u0001x\u0005x\u0521"+ + "\bx\nx\fx\u0524\tx\u0003x\u0526\bx\u0001x\u0001x\u0001x\u0001x\u0001y"+ + "\u0001y\u0003y\u052e\by\u0001z\u0001z\u0003z\u0532\bz\u0001z\u0001z\u0001"+ + "z\u0001{\u0001{\u0003{\u0539\b{\u0001{\u0001{\u0001|\u0001|\u0001}\u0001"+ + "}\u0001~\u0001~\u0001~\u0000\u0000\u007f\u0000\u0002\u0004\u0006\b\n\f"+ + "\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:"+ + "<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a"+ + "\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2"+ + "\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\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\u0000\b\u0002\u0000"+ + "\u0010\u0010ii\u0001\u0000RS\u0001\u0000\u0013\u001c\u0002\u0000\u0004"+ + "\u0004$.\u0001\u000001\u0002\u0000\u000b\u000b24\u0002\u0000\u0012\u0012"+ + "\u0087\u0087\u0002\u0000=\u0085\u0088\u0088\u0585\u0000\u00fe\u0001\u0000"+ + "\u0000\u0000\u0002\u0106\u0001\u0000\u0000\u0000\u0004\u010c\u0001\u0000"+ + "\u0000\u0000\u0006\u010f\u0001\u0000\u0000\u0000\b\u0120\u0001\u0000\u0000"+ + "\u0000\n\u012b\u0001\u0000\u0000\u0000\f\u0130\u0001\u0000\u0000\u0000"+ + "\u000e\u0133\u0001\u0000\u0000\u0000\u0010\u0136\u0001\u0000\u0000\u0000"+ + "\u0012\u0147\u0001\u0000\u0000\u0000\u0014\u0149\u0001\u0000\u0000\u0000"+ + "\u0016\u014c\u0001\u0000\u0000\u0000\u0018\u0152\u0001\u0000\u0000\u0000"+ + "\u001a\u0156\u0001\u0000\u0000\u0000\u001c\u015a\u0001\u0000\u0000\u0000"+ + "\u001e\u015e\u0001\u0000\u0000\u0000 \u0165\u0001\u0000\u0000\u0000\""+ + "\u0175\u0001\u0000\u0000\u0000$\u017e\u0001\u0000\u0000\u0000&\u018d\u0001"+ + "\u0000\u0000\u0000(\u0194\u0001\u0000\u0000\u0000*\u019b\u0001\u0000\u0000"+ + "\u0000,\u01ac\u0001\u0000\u0000\u0000.\u01bc\u0001\u0000\u0000\u00000"+ + "\u01dc\u0001\u0000\u0000\u00002\u01e1\u0001\u0000\u0000\u00004\u01e4\u0001"+ + "\u0000\u0000\u00006\u01f0\u0001\u0000\u0000\u00008\u01f9\u0001\u0000\u0000"+ + "\u0000:\u0203\u0001\u0000\u0000\u0000<\u0205\u0001\u0000\u0000\u0000>"+ + "\u020f\u0001\u0000\u0000\u0000@\u0211\u0001\u0000\u0000\u0000B\u0216\u0001"+ + "\u0000\u0000\u0000D\u021a\u0001\u0000\u0000\u0000F\u0220\u0001\u0000\u0000"+ + "\u0000H\u0235\u0001\u0000\u0000\u0000J\u023b\u0001\u0000\u0000\u0000L"+ + "\u023d\u0001\u0000\u0000\u0000N\u0250\u0001\u0000\u0000\u0000P\u0261\u0001"+ + "\u0000\u0000\u0000R\u0271\u0001\u0000\u0000\u0000T\u0285\u0001\u0000\u0000"+ + "\u0000V\u0294\u0001\u0000\u0000\u0000X\u0296\u0001\u0000\u0000\u0000Z"+ + "\u029e\u0001\u0000\u0000\u0000\\\u02a4\u0001\u0000\u0000\u0000^\u02b2"+ + "\u0001\u0000\u0000\u0000`\u02bc\u0001\u0000\u0000\u0000b\u02c0\u0001\u0000"+ + "\u0000\u0000d\u02d0\u0001\u0000\u0000\u0000f\u02d9\u0001\u0000\u0000\u0000"+ + "h\u02e9\u0001\u0000\u0000\u0000j\u02f2\u0001\u0000\u0000\u0000l\u02fa"+ + "\u0001\u0000\u0000\u0000n\u02fd\u0001\u0000\u0000\u0000p\u0307\u0001\u0000"+ + "\u0000\u0000r\u0319\u0001\u0000\u0000\u0000t\u0323\u0001\u0000\u0000\u0000"+ + "v\u0333\u0001\u0000\u0000\u0000x\u0338\u0001\u0000\u0000\u0000z\u0345"+ + "\u0001\u0000\u0000\u0000|\u034d\u0001\u0000\u0000\u0000~\u035c\u0001\u0000"+ + "\u0000\u0000\u0080\u0363\u0001\u0000\u0000\u0000\u0082\u0373\u0001\u0000"+ + "\u0000\u0000\u0084\u0384\u0001\u0000\u0000\u0000\u0086\u038d\u0001\u0000"+ + "\u0000\u0000\u0088\u0396\u0001\u0000\u0000\u0000\u008a\u03a9\u0001\u0000"+ + "\u0000\u0000\u008c\u03b1\u0001\u0000\u0000\u0000\u008e\u03ba\u0001\u0000"+ + "\u0000\u0000\u0090\u03be\u0001\u0000\u0000\u0000\u0092\u03c3\u0001\u0000"+ + "\u0000\u0000\u0094\u03cb\u0001\u0000\u0000\u0000\u0096\u03d0\u0001\u0000"+ + "\u0000\u0000\u0098\u03d8\u0001\u0000\u0000\u0000\u009a\u03e0\u0001\u0000"+ + "\u0000\u0000\u009c\u03e6\u0001\u0000\u0000\u0000\u009e\u03ec\u0001\u0000"+ + "\u0000\u0000\u00a0\u03f2\u0001\u0000\u0000\u0000\u00a2\u03f8\u0001\u0000"+ + "\u0000\u0000\u00a4\u03fe\u0001\u0000\u0000\u0000\u00a6\u040d\u0001\u0000"+ + "\u0000\u0000\u00a8\u0412\u0001\u0000\u0000\u0000\u00aa\u041a\u0001\u0000"+ + "\u0000\u0000\u00ac\u041c\u0001\u0000\u0000\u0000\u00ae\u0423\u0001\u0000"+ + "\u0000\u0000\u00b0\u042a\u0001\u0000\u0000\u0000\u00b2\u0432\u0001\u0000"+ + "\u0000\u0000\u00b4\u043d\u0001\u0000\u0000\u0000\u00b6\u0443\u0001\u0000"+ + "\u0000\u0000\u00b8\u0446\u0001\u0000\u0000\u0000\u00ba\u044a\u0001\u0000"+ + "\u0000\u0000\u00bc\u0462\u0001\u0000\u0000\u0000\u00be\u0464\u0001\u0000"+ + "\u0000\u0000\u00c0\u0468\u0001\u0000\u0000\u0000\u00c2\u046b\u0001\u0000"+ + "\u0000\u0000\u00c4\u0471\u0001\u0000\u0000\u0000\u00c6\u0473\u0001\u0000"+ + "\u0000\u0000\u00c8\u0478\u0001\u0000\u0000\u0000\u00ca\u047d\u0001\u0000"+ + "\u0000\u0000\u00cc\u0480\u0001\u0000\u0000\u0000\u00ce\u048e\u0001\u0000"+ + "\u0000\u0000\u00d0\u0492\u0001\u0000\u0000\u0000\u00d2\u0494\u0001\u0000"+ + "\u0000\u0000\u00d4\u0498\u0001\u0000\u0000\u0000\u00d6\u04be\u0001\u0000"+ + "\u0000\u0000\u00d8\u04c0\u0001\u0000\u0000\u0000\u00da\u04c4\u0001\u0000"+ + "\u0000\u0000\u00dc\u04ca\u0001\u0000\u0000\u0000\u00de\u04d2\u0001\u0000"+ + "\u0000\u0000\u00e0\u04e0\u0001\u0000\u0000\u0000\u00e2\u04e6\u0001\u0000"+ + "\u0000\u0000\u00e4\u04ed\u0001\u0000\u0000\u0000\u00e6\u04f9\u0001\u0000"+ + "\u0000\u0000\u00e8\u050b\u0001\u0000\u0000\u0000\u00ea\u0510\u0001\u0000"+ + "\u0000\u0000\u00ec\u0514\u0001\u0000\u0000\u0000\u00ee\u0516\u0001\u0000"+ + "\u0000\u0000\u00f0\u051b\u0001\u0000\u0000\u0000\u00f2\u052b\u0001\u0000"+ + "\u0000\u0000\u00f4\u0531\u0001\u0000\u0000\u0000\u00f6\u0536\u0001\u0000"+ + "\u0000\u0000\u00f8\u053c\u0001\u0000\u0000\u0000\u00fa\u053e\u0001\u0000"+ + "\u0000\u0000\u00fc\u0540\u0001\u0000\u0000\u0000\u00fe\u00ff\u0003\u0002"+ + "\u0001\u0000\u00ff\u0100\u0005\u0000\u0000\u0001\u0100\u0001\u0001\u0000"+ + "\u0000\u0000\u0101\u0102\u0005h\u0000\u0000\u0102\u0103\u0005g\u0000\u0000"+ + "\u0103\u0104\u0003\u00fa}\u0000\u0104\u0105\u0005\u0001\u0000\u0000\u0105"+ + "\u0107\u0001\u0000\u0000\u0000\u0106\u0101\u0001\u0000\u0000\u0000\u0106"+ + "\u0107\u0001\u0000\u0000\u0000\u0107\u010a\u0001\u0000\u0000\u0000\u0108"+ + "\u010b\u0003\u0006\u0003\u0000\u0109\u010b\u0003\u0004\u0002\u0000\u010a"+ + "\u0108\u0001\u0000\u0000\u0000\u010a\u0109\u0001\u0000\u0000\u0000\u010b"+ + "\u0003\u0001\u0000\u0000\u0000\u010c\u010d\u0003\b\u0004\u0000\u010d\u010e"+ + "\u0003\n\u0005\u0000\u010e\u0005\u0001\u0000\u0000\u0000\u010f\u0110\u0005"+ + "\u0002\u0000\u0000\u0110\u0111\u0005\u0003\u0000\u0000\u0111\u0112\u0005"+ + "\u008f\u0000\u0000\u0112\u0113\u0005\u0004\u0000\u0000\u0113\u0114\u0003"+ + "\u00f8|\u0000\u0114\u0115\u0005\u0001\u0000\u0000\u0115\u0116\u0003\b"+ + "\u0004\u0000\u0116\u0007\u0001\u0000\u0000\u0000\u0117\u011b\u0003:\u001d"+ + "\u0000\u0118\u011b\u0003<\u001e\u0000\u0119\u011b\u0003L&\u0000\u011a"+ + "\u0117\u0001\u0000\u0000\u0000\u011a\u0118\u0001\u0000\u0000\u0000\u011a"+ + "\u0119\u0001\u0000\u0000\u0000\u011b\u011c\u0001\u0000\u0000\u0000\u011c"+ + "\u011d\u0005\u0001\u0000\u0000\u011d\u011f\u0001\u0000\u0000\u0000\u011e"+ + "\u011a\u0001\u0000\u0000\u0000\u011f\u0122\u0001\u0000\u0000\u0000\u0120"+ + "\u011e\u0001\u0000\u0000\u0000\u0120\u0121\u0001\u0000\u0000\u0000\u0121"+ + "\u0128\u0001\u0000\u0000\u0000\u0122\u0120\u0001\u0000\u0000\u0000\u0123"+ + "\u0124\u0003>\u001f\u0000\u0124\u0125\u0005\u0001\u0000\u0000\u0125\u0127"+ + "\u0001\u0000\u0000\u0000\u0126\u0123\u0001\u0000\u0000\u0000\u0127\u012a"+ + "\u0001\u0000\u0000\u0000\u0128\u0126\u0001\u0000\u0000\u0000\u0128\u0129"+ + "\u0001\u0000\u0000\u0000\u0129\t\u0001\u0000\u0000\u0000\u012a\u0128\u0001"+ + "\u0000\u0000\u0000\u012b\u012c\u0003\u0010\b\u0000\u012c\u000b\u0001\u0000"+ + "\u0000\u0000\u012d\u012f\u0003\u0012\t\u0000\u012e\u012d\u0001\u0000\u0000"+ + "\u0000\u012f\u0132\u0001\u0000\u0000\u0000\u0130\u012e\u0001\u0000\u0000"+ + "\u0000\u0130\u0131\u0001\u0000\u0000\u0000\u0131\r\u0001\u0000\u0000\u0000"+ + "\u0132\u0130\u0001\u0000\u0000\u0000\u0133\u0134\u0003\f\u0006\u0000\u0134"+ + "\u0135\u0003\\.\u0000\u0135\u000f\u0001\u0000\u0000\u0000\u0136\u0138"+ + "\u0003\f\u0006\u0000\u0137\u0139\u0003\\.\u0000\u0138\u0137\u0001\u0000"+ + "\u0000\u0000\u0138\u0139\u0001\u0000\u0000\u0000\u0139\u0011\u0001\u0000"+ + "\u0000\u0000\u013a\u0148\u0003\u0014\n\u0000\u013b\u0148\u0003\u0016\u000b"+ + "\u0000\u013c\u0148\u0003\u0018\f\u0000\u013d\u0148\u0003\u001a\r\u0000"+ + "\u013e\u0148\u0003\u001c\u000e\u0000\u013f\u0148\u0003\u001e\u000f\u0000"+ + "\u0140\u0148\u0003 \u0010\u0000\u0141\u0148\u0003\"\u0011\u0000\u0142"+ + "\u0148\u0003$\u0012\u0000\u0143\u0148\u0003(\u0014\u0000\u0144\u0148\u0003"+ + ",\u0016\u0000\u0145\u0148\u00034\u001a\u0000\u0146\u0148\u00038\u001c"+ + "\u0000\u0147\u013a\u0001\u0000\u0000\u0000\u0147\u013b\u0001\u0000\u0000"+ + "\u0000\u0147\u013c\u0001\u0000\u0000\u0000\u0147\u013d\u0001\u0000\u0000"+ + "\u0000\u0147\u013e\u0001\u0000\u0000\u0000\u0147\u013f\u0001\u0000\u0000"+ + "\u0000\u0147\u0140\u0001\u0000\u0000\u0000\u0147\u0141\u0001\u0000\u0000"+ + "\u0000\u0147\u0142\u0001\u0000\u0000\u0000\u0147\u0143\u0001\u0000\u0000"+ + "\u0000\u0147\u0144\u0001\u0000\u0000\u0000\u0147\u0145\u0001\u0000\u0000"+ + "\u0000\u0147\u0146\u0001\u0000\u0000\u0000\u0148\u0013\u0001\u0000\u0000"+ + "\u0000\u0149\u014a\u0003`0\u0000\u014a\u014b\u0005\u0001\u0000\u0000\u014b"+ + "\u0015\u0001\u0000\u0000\u0000\u014c\u014d\u0005\u0005\u0000\u0000\u014d"+ + "\u014e\u0003H$\u0000\u014e\u014f\u0005\u0006\u0000\u0000\u014f\u0150\u0003"+ + "^/\u0000\u0150\u0151\u0005\u0001\u0000\u0000\u0151\u0017\u0001\u0000\u0000"+ + "\u0000\u0152\u0153\u0005\u0007\u0000\u0000\u0153\u0154\u0003\f\u0006\u0000"+ + "\u0154\u0155\u0005\b\u0000\u0000\u0155\u0019\u0001\u0000\u0000\u0000\u0156"+ + "\u0157\u0005\u0080\u0000\u0000\u0157\u0158\u0005\u0081\u0000\u0000\u0158"+ + "\u0159\u0005\u0001\u0000\u0000\u0159\u001b\u0001\u0000\u0000\u0000\u015a"+ + "\u015b\u0005\u0082\u0000\u0000\u015b\u015c\u0005\u0081\u0000\u0000\u015c"+ + "\u015d\u0005\u0001\u0000\u0000\u015d\u001d\u0001\u0000\u0000\u0000\u015e"+ + "\u015f\u0005\u0083\u0000\u0000\u015f\u0160\u0005\u0084\u0000\u0000\u0160"+ + "\u0161\u0003^/\u0000\u0161\u0162\u0005\u0001\u0000\u0000\u0162\u001f\u0001"+ + "\u0000\u0000\u0000\u0163\u0166\u0003d2\u0000\u0164\u0166\u0003h4\u0000"+ + "\u0165\u0163\u0001\u0000\u0000\u0000\u0165\u0164\u0001\u0000\u0000\u0000"+ + "\u0166\u016f\u0001\u0000\u0000\u0000\u0167\u016e\u0003d2\u0000\u0168\u016e"+ + "\u0003h4\u0000\u0169\u016e\u0003l6\u0000\u016a\u016e\u0003n7\u0000\u016b"+ + "\u016e\u0003r9\u0000\u016c\u016e\u0003v;\u0000\u016d\u0167\u0001\u0000"+ + "\u0000\u0000\u016d\u0168\u0001\u0000\u0000\u0000\u016d\u0169\u0001\u0000"+ + "\u0000\u0000\u016d\u016a\u0001\u0000\u0000\u0000\u016d\u016b\u0001\u0000"+ + "\u0000\u0000\u016d\u016c\u0001\u0000\u0000\u0000\u016e\u0171\u0001\u0000"+ + "\u0000\u0000\u016f\u016d\u0001\u0000\u0000\u0000\u016f\u0170\u0001\u0000"+ + "\u0000\u0000\u0170\u0172\u0001\u0000\u0000\u0000\u0171\u016f\u0001\u0000"+ + "\u0000\u0000\u0172\u0173\u0005C\u0000\u0000\u0173\u0174\u0003\u0012\t"+ + "\u0000\u0174!\u0001\u0000\u0000\u0000\u0175\u0176\u0005D\u0000\u0000\u0176"+ + "\u0177\u0005\t\u0000\u0000\u0177\u0178\u0003\\.\u0000\u0178\u0179\u0005"+ + "\n\u0000\u0000\u0179\u017a\u0005Y\u0000\u0000\u017a\u017b\u0003\u0012"+ + "\t\u0000\u017b\u017c\u0005Z\u0000\u0000\u017c\u017d\u0003\u0012\t\u0000"+ + "\u017d#\u0001\u0000\u0000\u0000\u017e\u017f\u0005T\u0000\u0000\u017f\u0180"+ + "\u0005\t\u0000\u0000\u0180\u0181\u0003\\.\u0000\u0181\u0183\u0005\n\u0000"+ + "\u0000\u0182\u0184\u0003&\u0013\u0000\u0183\u0182\u0001\u0000\u0000\u0000"+ + "\u0184\u0185\u0001\u0000\u0000\u0000\u0185\u0183\u0001\u0000\u0000\u0000"+ + "\u0185\u0186\u0001\u0000\u0000\u0000\u0186\u0187\u0001\u0000\u0000\u0000"+ + "\u0187\u0188\u0005X\u0000\u0000\u0188\u0189\u0005C\u0000\u0000\u0189\u018a"+ + "\u0003\u0012\t\u0000\u018a%\u0001\u0000\u0000\u0000\u018b\u018c\u0005"+ + "U\u0000\u0000\u018c\u018e\u0003^/\u0000\u018d\u018b\u0001\u0000\u0000"+ + "\u0000\u018e\u018f\u0001\u0000\u0000\u0000\u018f\u018d\u0001\u0000\u0000"+ + "\u0000\u018f\u0190\u0001\u0000\u0000\u0000\u0190\u0191\u0001\u0000\u0000"+ + "\u0000\u0191\u0192\u0005C\u0000\u0000\u0192\u0193\u0003\u0012\t\u0000"+ + "\u0193\'\u0001\u0000\u0000\u0000\u0194\u0195\u0005V\u0000\u0000\u0195"+ + "\u0197\u0003\u0018\f\u0000\u0196\u0198\u0003*\u0015\u0000\u0197\u0196"+ + "\u0001\u0000\u0000\u0000\u0198\u0199\u0001\u0000\u0000\u0000\u0199\u0197"+ + "\u0001\u0000\u0000\u0000\u0199\u019a\u0001\u0000\u0000\u0000\u019a)\u0001"+ + "\u0000\u0000\u0000\u019b\u019e\u0005W\u0000\u0000\u019c\u019f\u0005\u000b"+ + "\u0000\u0000\u019d\u019f\u0003H$\u0000\u019e\u019c\u0001\u0000\u0000\u0000"+ + "\u019e\u019d\u0001\u0000\u0000\u0000\u019f\u01a7\u0001\u0000\u0000\u0000"+ + "\u01a0\u01a3\u0005\f\u0000\u0000\u01a1\u01a4\u0005\u000b\u0000\u0000\u01a2"+ + "\u01a4\u0003H$\u0000\u01a3\u01a1\u0001\u0000\u0000\u0000\u01a3\u01a2\u0001"+ + "\u0000\u0000\u0000\u01a4\u01a6\u0001\u0000\u0000\u0000\u01a5\u01a0\u0001"+ + "\u0000\u0000\u0000\u01a6\u01a9\u0001\u0000\u0000\u0000\u01a7\u01a5\u0001"+ + "\u0000\u0000\u0000\u01a7\u01a8\u0001\u0000\u0000\u0000\u01a8\u01aa\u0001"+ + "\u0000\u0000\u0000\u01a9\u01a7\u0001\u0000\u0000\u0000\u01aa\u01ab\u0003"+ + "\u0018\f\u0000\u01ab+\u0001\u0000\u0000\u0000\u01ac\u01ad\u0005[\u0000"+ + "\u0000\u01ad\u01ae\u0005\t\u0000\u0000\u01ae\u01af\u0003\\.\u0000\u01af"+ + "\u01b1\u0005\n\u0000\u0000\u01b0\u01b2\u0003.\u0017\u0000\u01b1\u01b0"+ + "\u0001\u0000\u0000\u0000\u01b2\u01b3\u0001\u0000\u0000\u0000\u01b3\u01b1"+ + "\u0001\u0000\u0000\u0000\u01b3\u01b4\u0001\u0000\u0000\u0000\u01b4\u01b5"+ + "\u0001\u0000\u0000\u0000\u01b5\u01b7\u0005X\u0000\u0000\u01b6\u01b8\u0003"+ + "\u00c0`\u0000\u01b7\u01b6\u0001\u0000\u0000\u0000\u01b7\u01b8\u0001\u0000"+ + "\u0000\u0000\u01b8\u01b9\u0001\u0000\u0000\u0000\u01b9\u01ba\u0005C\u0000"+ + "\u0000\u01ba\u01bb\u0003\u0012\t\u0000\u01bb-\u0001\u0000\u0000\u0000"+ + "\u01bc\u01c0\u0005U\u0000\u0000\u01bd\u01be\u0003\u00c0`\u0000\u01be\u01bf"+ + "\u0005F\u0000\u0000\u01bf\u01c1\u0001\u0000\u0000\u0000\u01c0\u01bd\u0001"+ + "\u0000\u0000\u0000\u01c0\u01c1\u0001\u0000\u0000\u0000\u01c1\u01c2\u0001"+ + "\u0000\u0000\u0000\u01c2\u01c7\u0003\u00e6s\u0000\u01c3\u01c4\u0005\f"+ + "\u0000\u0000\u01c4\u01c6\u0003\u00e6s\u0000\u01c5\u01c3\u0001\u0000\u0000"+ + "\u0000\u01c6\u01c9\u0001\u0000\u0000\u0000\u01c7\u01c5\u0001\u0000\u0000"+ + "\u0000\u01c7\u01c8\u0001\u0000\u0000\u0000\u01c8\u01ca\u0001\u0000\u0000"+ + "\u0000\u01c9\u01c7\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005C\u0000\u0000"+ + "\u01cb\u01cc\u0003\u0012\t\u0000\u01cc/\u0001\u0000\u0000\u0000\u01cd"+ + "\u01ce\u0005\r\u0000\u0000\u01ce\u01d9\u0003H$\u0000\u01cf\u01d0\u0005"+ + "\t\u0000\u0000\u01d0\u01d5\u0005\u0089\u0000\u0000\u01d1\u01d2\u0005\u000e"+ + "\u0000\u0000\u01d2\u01d4\u0005\u0089\u0000\u0000\u01d3\u01d1\u0001\u0000"+ + "\u0000\u0000\u01d4\u01d7\u0001\u0000\u0000\u0000\u01d5\u01d3\u0001\u0000"+ + "\u0000\u0000\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6\u01d8\u0001\u0000"+ + "\u0000\u0000\u01d7\u01d5\u0001\u0000\u0000\u0000\u01d8\u01da\u0005\n\u0000"+ + "\u0000\u01d9\u01cf\u0001\u0000\u0000\u0000\u01d9\u01da\u0001\u0000\u0000"+ + "\u0000\u01da\u01dd\u0001\u0000\u0000\u0000\u01db\u01dd\u0005\u007f\u0000"+ + "\u0000\u01dc\u01cd\u0001\u0000\u0000\u0000\u01dc\u01db\u0001\u0000\u0000"+ + "\u0000\u01dd1\u0001\u0000\u0000\u0000\u01de\u01e0\u00030\u0018\u0000\u01df"+ + "\u01de\u0001\u0000\u0000\u0000\u01e0\u01e3\u0001\u0000\u0000\u0000\u01e1"+ + "\u01df\u0001\u0000\u0000\u0000\u01e1\u01e2\u0001\u0000\u0000\u0000\u01e2"+ + "3\u0001\u0000\u0000\u0000\u01e3\u01e1\u0001\u0000\u0000\u0000\u01e4\u01e5"+ + "\u00032\u0019\u0000\u01e5\u01e6\u0005r\u0000\u0000\u01e6\u01eb\u00036"+ + "\u001b\u0000\u01e7\u01e8\u0005\u000e\u0000\u0000\u01e8\u01ea\u00036\u001b"+ + "\u0000\u01e9\u01e7\u0001\u0000\u0000\u0000\u01ea\u01ed\u0001\u0000\u0000"+ + "\u0000\u01eb\u01e9\u0001\u0000\u0000\u0000\u01eb\u01ec\u0001\u0000\u0000"+ + "\u0000\u01ec\u01ee\u0001\u0000\u0000\u0000\u01ed\u01eb\u0001\u0000\u0000"+ + "\u0000\u01ee\u01ef\u0005\u0001\u0000\u0000\u01ef5\u0001\u0000\u0000\u0000"+ + "\u01f0\u01f3\u0003\u00c0`\u0000\u01f1\u01f2\u0005F\u0000\u0000\u01f2\u01f4"+ + "\u0003\u00e6s\u0000\u01f3\u01f1\u0001\u0000\u0000\u0000\u01f3\u01f4\u0001"+ + "\u0000\u0000\u0000\u01f4\u01f7\u0001\u0000\u0000\u0000\u01f5\u01f6\u0005"+ + "\u0006\u0000\u0000\u01f6\u01f8\u0003^/\u0000\u01f7\u01f5\u0001\u0000\u0000"+ + "\u0000\u01f7\u01f8\u0001\u0000\u0000\u0000\u01f87\u0001\u0000\u0000\u0000"+ + "\u01f9\u01fa\u0005\u0085\u0000\u0000\u01fa\u01fb\u0005\t\u0000\u0000\u01fb"+ + "\u01fc\u0003\\.\u0000\u01fc\u01fd\u0005\n\u0000\u0000\u01fd\u01fe\u0003"+ + "\u0012\t\u0000\u01fe9\u0001\u0000\u0000\u0000\u01ff\u0204\u0003@ \u0000"+ + "\u0200\u0204\u0003B!\u0000\u0201\u0204\u0003D\"\u0000\u0202\u0204\u0003"+ + "F#\u0000\u0203\u01ff\u0001\u0000\u0000\u0000\u0203\u0200\u0001\u0000\u0000"+ + "\u0000\u0203\u0201\u0001\u0000\u0000\u0000\u0203\u0202\u0001\u0000\u0000"+ + "\u0000\u0204;\u0001\u0000\u0000\u0000\u0205\u0206\u0005o\u0000\u0000\u0206"+ + "\u0207\u0005\u0003\u0000\u0000\u0207\u0208\u0005\u008f\u0000\u0000\u0208"+ + "\u0209\u0005\u0004\u0000\u0000\u0209\u020a\u0003\u00f8|\u0000\u020a=\u0001"+ + "\u0000\u0000\u0000\u020b\u0210\u0003R)\u0000\u020c\u0210\u0003N\'\u0000"+ + "\u020d\u0210\u0003T*\u0000\u020e\u0210\u0003P(\u0000\u020f\u020b\u0001"+ + "\u0000\u0000\u0000\u020f\u020c\u0001\u0000\u0000\u0000\u020f\u020d\u0001"+ + "\u0000\u0000\u0000\u020f\u020e\u0001\u0000\u0000\u0000\u0210?\u0001\u0000"+ + "\u0000\u0000\u0211\u0212\u0005o\u0000\u0000\u0212\u0213\u0005X\u0000\u0000"+ + "\u0213\u0214\u0005Q\u0000\u0000\u0214\u0215\u0003\u00f8|\u0000\u0215A"+ + "\u0001\u0000\u0000\u0000\u0216\u0217\u0005o\u0000\u0000\u0217\u0218\u0005"+ + "\u000f\u0000\u0000\u0218\u0219\u0007\u0000\u0000\u0000\u0219C\u0001\u0000"+ + "\u0000\u0000\u021a\u021b\u0005o\u0000\u0000\u021b\u021c\u0005X\u0000\u0000"+ + "\u021c\u021d\u0005B\u0000\u0000\u021d\u021e\u0005I\u0000\u0000\u021e\u021f"+ + "\u0007\u0001\u0000\u0000\u021fE\u0001\u0000\u0000\u0000\u0220\u0225\u0005"+ + "o\u0000\u0000\u0221\u0222\u0005\u0011\u0000\u0000\u0222\u0226\u0003H$"+ + "\u0000\u0223\u0224\u0005X\u0000\u0000\u0224\u0226\u0005\u0011\u0000\u0000"+ + "\u0225\u0221\u0001\u0000\u0000\u0000\u0225\u0223\u0001\u0000\u0000\u0000"+ + "\u0226\u022d\u0001\u0000\u0000\u0000\u0227\u0228\u0003J%\u0000\u0228\u0229"+ + "\u0005\u0004\u0000\u0000\u0229\u022a\u0003\u00fa}\u0000\u022a\u022c\u0001"+ + "\u0000\u0000\u0000\u022b\u0227\u0001\u0000\u0000\u0000\u022c\u022f\u0001"+ + "\u0000\u0000\u0000\u022d\u022b\u0001\u0000\u0000\u0000\u022d\u022e\u0001"+ + "\u0000\u0000\u0000\u022eG\u0001\u0000\u0000\u0000\u022f\u022d\u0001\u0000"+ + "\u0000\u0000\u0230\u0233\u0005\u008f\u0000\u0000\u0231\u0233\u0003\u00fc"+ + "~\u0000\u0232\u0230\u0001\u0000\u0000\u0000\u0232\u0231\u0001\u0000\u0000"+ + "\u0000\u0233\u0234\u0001\u0000\u0000\u0000\u0234\u0236\u0005\u0012\u0000"+ + "\u0000\u0235\u0232\u0001\u0000\u0000\u0000\u0235\u0236\u0001\u0000\u0000"+ + "\u0000\u0236\u0239\u0001\u0000\u0000\u0000\u0237\u023a\u0005\u008f\u0000"+ + "\u0000\u0238\u023a\u0003\u00fc~\u0000\u0239\u0237\u0001\u0000\u0000\u0000"+ + "\u0239\u0238\u0001\u0000\u0000\u0000\u023aI\u0001\u0000\u0000\u0000\u023b"+ + "\u023c\u0007\u0002\u0000\u0000\u023cK\u0001\u0000\u0000\u0000\u023d\u023e"+ + "\u0005\u001d\u0000\u0000\u023e\u0242\u0005\u0002\u0000\u0000\u023f\u0240"+ + "\u0005\u0003\u0000\u0000\u0240\u0241\u0005\u008f\u0000\u0000\u0241\u0243"+ + "\u0005\u0004\u0000\u0000\u0242\u023f\u0001\u0000\u0000\u0000\u0242\u0243"+ + "\u0001\u0000\u0000\u0000\u0243\u0244\u0001\u0000\u0000\u0000\u0244\u024e"+ + "\u0003\u00f8|\u0000\u0245\u0246\u0005G\u0000\u0000\u0246\u024b\u0003\u00f8"+ + "|\u0000\u0247\u0248\u0005\u000e\u0000\u0000\u0248\u024a\u0003\u00f8|\u0000"+ + "\u0249\u0247\u0001\u0000\u0000\u0000\u024a\u024d\u0001\u0000\u0000\u0000"+ + "\u024b\u0249\u0001\u0000\u0000\u0000\u024b\u024c\u0001\u0000\u0000\u0000"+ + "\u024c\u024f\u0001\u0000\u0000\u0000\u024d\u024b\u0001\u0000\u0000\u0000"+ + "\u024e\u0245\u0001\u0000\u0000\u0000\u024e\u024f\u0001\u0000\u0000\u0000"+ + "\u024fM\u0001\u0000\u0000\u0000\u0250\u0251\u0005o\u0000\u0000\u0251\u0252"+ + "\u00032\u0019\u0000\u0252\u0253\u0005r\u0000\u0000\u0253\u0256\u0003\u00c0"+ + "`\u0000\u0254\u0255\u0005F\u0000\u0000\u0255\u0257\u0003\u00e6s\u0000"+ + "\u0256\u0254\u0001\u0000\u0000\u0000\u0256\u0257\u0001\u0000\u0000\u0000"+ + "\u0257\u025f\u0001\u0000\u0000\u0000\u0258\u0259\u0005\u0006\u0000\u0000"+ + "\u0259\u0260\u0003^/\u0000\u025a\u025d\u0005\u001e\u0000\u0000\u025b\u025c"+ + "\u0005\u0006\u0000\u0000\u025c\u025e\u0003^/\u0000\u025d\u025b\u0001\u0000"+ + "\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u0260\u0001\u0000"+ + "\u0000\u0000\u025f\u0258\u0001\u0000\u0000\u0000\u025f\u025a\u0001\u0000"+ + "\u0000\u0000\u0260O\u0001\u0000\u0000\u0000\u0261\u0262\u0005o\u0000\u0000"+ + "\u0262\u0263\u0005p\u0000\u0000\u0263\u0266\u0005q\u0000\u0000\u0264\u0265"+ + "\u0005F\u0000\u0000\u0265\u0267\u0003\u00e6s\u0000\u0266\u0264\u0001\u0000"+ + "\u0000\u0000\u0266\u0267\u0001\u0000\u0000\u0000\u0267\u026f\u0001\u0000"+ + "\u0000\u0000\u0268\u0269\u0005\u0006\u0000\u0000\u0269\u0270\u0003^/\u0000"+ + "\u026a\u026d\u0005\u001e\u0000\u0000\u026b\u026c\u0005\u0006\u0000\u0000"+ + "\u026c\u026e\u0003^/\u0000\u026d\u026b\u0001\u0000\u0000\u0000\u026d\u026e"+ + "\u0001\u0000\u0000\u0000\u026e\u0270\u0001\u0000\u0000\u0000\u026f\u0268"+ + "\u0001\u0000\u0000\u0000\u026f\u026a\u0001\u0000\u0000\u0000\u0270Q\u0001"+ + "\u0000\u0000\u0000\u0271\u0272\u0005o\u0000\u0000\u0272\u0273\u00032\u0019"+ + "\u0000\u0273\u0274\u0005\u001f\u0000\u0000\u0274\u0275\u0003H$\u0000\u0275"+ + "\u0277\u0005\t\u0000\u0000\u0276\u0278\u0003X,\u0000\u0277\u0276\u0001"+ + "\u0000\u0000\u0000\u0277\u0278\u0001\u0000\u0000\u0000\u0278\u0279\u0001"+ + "\u0000\u0000\u0000\u0279\u027c\u0005\n\u0000\u0000\u027a\u027b\u0005F"+ + "\u0000\u0000\u027b\u027d\u0003\u00e6s\u0000\u027c\u027a\u0001\u0000\u0000"+ + "\u0000\u027c\u027d\u0001\u0000\u0000\u0000\u027d\u0283\u0001\u0000\u0000"+ + "\u0000\u027e\u027f\u0005\u0007\u0000\u0000\u027f\u0280\u0003\u0010\b\u0000"+ + "\u0280\u0281\u0005\b\u0000\u0000\u0281\u0284\u0001\u0000\u0000\u0000\u0282"+ + "\u0284\u0005\u001e\u0000\u0000\u0283\u027e\u0001\u0000\u0000\u0000\u0283"+ + "\u0282\u0001\u0000\u0000\u0000\u0284S\u0001\u0000\u0000\u0000\u0285\u0286"+ + "\u0005o\u0000\u0000\u0286\u0287\u0005l\u0000\u0000\u0287\u0288\u0003H"+ + "$\u0000\u0288\u028a\u0005F\u0000\u0000\u0289\u028b\u0003V+\u0000\u028a"+ + "\u0289\u0001\u0000\u0000\u0000\u028a\u028b\u0001\u0000\u0000\u0000\u028b"+ + "\u028c\u0001\u0000\u0000\u0000\u028c\u028d\u0003^/\u0000\u028dU\u0001"+ + "\u0000\u0000\u0000\u028e\u028f\u0005 \u0000\u0000\u028f\u0295\u0005!\u0000"+ + "\u0000\u0290\u0291\u0005 \u0000\u0000\u0291\u0295\u0005\"\u0000\u0000"+ + "\u0292\u0293\u0005~\u0000\u0000\u0293\u0295\u0005#\u0000\u0000\u0294\u028e"+ + "\u0001\u0000\u0000\u0000\u0294\u0290\u0001\u0000\u0000\u0000\u0294\u0292"+ + "\u0001\u0000\u0000\u0000\u0295W\u0001\u0000\u0000\u0000\u0296\u029b\u0003"+ + "Z-\u0000\u0297\u0298\u0005\u000e\u0000\u0000\u0298\u029a\u0003Z-\u0000"+ + "\u0299\u0297\u0001\u0000\u0000\u0000\u029a\u029d\u0001\u0000\u0000\u0000"+ + "\u029b\u0299\u0001\u0000\u0000\u0000\u029b\u029c\u0001\u0000\u0000\u0000"+ + "\u029cY\u0001\u0000\u0000\u0000\u029d\u029b\u0001\u0000\u0000\u0000\u029e"+ + "\u029f\u0005\u0005\u0000\u0000\u029f\u02a2\u0003H$\u0000\u02a0\u02a1\u0005"+ + "F\u0000\u0000\u02a1\u02a3\u0003\u00e6s\u0000\u02a2\u02a0\u0001\u0000\u0000"+ + "\u0000\u02a2\u02a3\u0001\u0000\u0000\u0000\u02a3[\u0001\u0000\u0000\u0000"+ + "\u02a4\u02a9\u0003^/\u0000\u02a5\u02a6\u0005\u000e\u0000\u0000\u02a6\u02a8"+ + "\u0003^/\u0000\u02a7\u02a5\u0001\u0000\u0000\u0000\u02a8\u02ab\u0001\u0000"+ + "\u0000\u0000\u02a9\u02a7\u0001\u0000\u0000\u0000\u02a9\u02aa\u0001\u0000"+ + "\u0000\u0000\u02aa]\u0001\u0000\u0000\u0000\u02ab\u02a9\u0001\u0000\u0000"+ + "\u0000\u02ac\u02b3\u0003`0\u0000\u02ad\u02b3\u0003b1\u0000\u02ae\u02b3"+ + "\u0003|>\u0000\u02af\u02b3\u0003\u0080@\u0000\u02b0\u02b3\u0003\u0084"+ + "B\u0000\u02b1\u02b3\u0003\u0086C\u0000\u02b2\u02ac\u0001\u0000\u0000\u0000"+ + "\u02b2\u02ad\u0001\u0000\u0000\u0000\u02b2\u02ae\u0001\u0000\u0000\u0000"+ + "\u02b2\u02af\u0001\u0000\u0000\u0000\u02b2\u02b0\u0001\u0000\u0000\u0000"+ + "\u02b2\u02b1\u0001\u0000\u0000\u0000\u02b3_\u0001\u0000\u0000\u0000\u02b4"+ + "\u02bd\u0003x<\u0000\u02b5\u02bd\u0003\u008aE\u0000\u02b6\u02bd\u0003"+ + "\u00d6k\u0000\u02b7\u02bd\u0003\u00d8l\u0000\u02b8\u02bd\u0003\u00dam"+ + "\u0000\u02b9\u02bd\u0003\u00dcn\u0000\u02ba\u02bd\u0003\u00deo\u0000\u02bb"+ + "\u02bd\u0003\u00e0p\u0000\u02bc\u02b4\u0001\u0000\u0000\u0000\u02bc\u02b5"+ + "\u0001\u0000\u0000\u0000\u02bc\u02b6\u0001\u0000\u0000\u0000\u02bc\u02b7"+ + "\u0001\u0000\u0000\u0000\u02bc\u02b8\u0001\u0000\u0000\u0000\u02bc\u02b9"+ + "\u0001\u0000\u0000\u0000\u02bc\u02ba\u0001\u0000\u0000\u0000\u02bc\u02bb"+ + "\u0001\u0000\u0000\u0000\u02bda\u0001\u0000\u0000\u0000\u02be\u02c1\u0003"+ + "d2\u0000\u02bf\u02c1\u0003h4\u0000\u02c0\u02be\u0001\u0000\u0000\u0000"+ + "\u02c0\u02bf\u0001\u0000\u0000\u0000\u02c1\u02ca\u0001\u0000\u0000\u0000"+ + "\u02c2\u02c9\u0003d2\u0000\u02c3\u02c9\u0003h4\u0000\u02c4\u02c9\u0003"+ + "l6\u0000\u02c5\u02c9\u0003n7\u0000\u02c6\u02c9\u0003r9\u0000\u02c7\u02c9"+ + "\u0003v;\u0000\u02c8\u02c2\u0001\u0000\u0000\u0000\u02c8\u02c3\u0001\u0000"+ + "\u0000\u0000\u02c8\u02c4\u0001\u0000\u0000\u0000\u02c8\u02c5\u0001\u0000"+ + "\u0000\u0000\u02c8\u02c6\u0001\u0000\u0000\u0000\u02c8\u02c7\u0001\u0000"+ + "\u0000\u0000\u02c9\u02cc\u0001\u0000\u0000\u0000\u02ca\u02c8\u0001\u0000"+ + "\u0000\u0000\u02ca\u02cb\u0001\u0000\u0000\u0000\u02cb\u02cd\u0001\u0000"+ + "\u0000\u0000\u02cc\u02ca\u0001\u0000\u0000\u0000\u02cd\u02ce\u0005C\u0000"+ + "\u0000\u02ce\u02cf\u0003^/\u0000\u02cfc\u0001\u0000\u0000\u0000\u02d0"+ + "\u02d1\u0005=\u0000\u0000\u02d1\u02d6\u0003f3\u0000\u02d2\u02d3\u0005"+ + "\u000e\u0000\u0000\u02d3\u02d5\u0003f3\u0000\u02d4\u02d2\u0001\u0000\u0000"+ + "\u0000\u02d5\u02d8\u0001\u0000\u0000\u0000\u02d6\u02d4\u0001\u0000\u0000"+ + "\u0000\u02d6\u02d7\u0001\u0000\u0000\u0000\u02d7e\u0001\u0000\u0000\u0000"+ + "\u02d8\u02d6\u0001\u0000\u0000\u0000\u02d9\u02dc\u0003\u00c0`\u0000\u02da"+ + "\u02db\u0005F\u0000\u0000\u02db\u02dd\u0003\u00e6s\u0000\u02dc\u02da\u0001"+ + "\u0000\u0000\u0000\u02dc\u02dd\u0001\u0000\u0000\u0000\u02dd\u02e0\u0001"+ + "\u0000\u0000\u0000\u02de\u02df\u0005H\u0000\u0000\u02df\u02e1\u0005I\u0000"+ + "\u0000\u02e0\u02de\u0001\u0000\u0000\u0000\u02e0\u02e1\u0001\u0000\u0000"+ + "\u0000\u02e1\u02e4\u0001\u0000\u0000\u0000\u02e2\u02e3\u0005G\u0000\u0000"+ + "\u02e3\u02e5\u0003\u00c0`\u0000\u02e4\u02e2\u0001\u0000\u0000\u0000\u02e4"+ + "\u02e5\u0001\u0000\u0000\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000\u02e6"+ + "\u02e7\u0005E\u0000\u0000\u02e7\u02e8\u0003^/\u0000\u02e8g\u0001\u0000"+ + "\u0000\u0000\u02e9\u02ea\u0005>\u0000\u0000\u02ea\u02ef\u0003j5\u0000"+ + "\u02eb\u02ec\u0005\u000e\u0000\u0000\u02ec\u02ee\u0003j5\u0000\u02ed\u02eb"+ + "\u0001\u0000\u0000\u0000\u02ee\u02f1\u0001\u0000\u0000\u0000\u02ef\u02ed"+ + "\u0001\u0000\u0000\u0000\u02ef\u02f0\u0001\u0000\u0000\u0000\u02f0i\u0001"+ + "\u0000\u0000\u0000\u02f1\u02ef\u0001\u0000\u0000\u0000\u02f2\u02f5\u0003"+ + "\u00c0`\u0000\u02f3\u02f4\u0005F\u0000\u0000\u02f4\u02f6\u0003\u00e6s"+ + "\u0000\u02f5\u02f3\u0001\u0000\u0000\u0000\u02f5\u02f6\u0001\u0000\u0000"+ + "\u0000\u02f6\u02f7\u0001\u0000\u0000\u0000\u02f7\u02f8\u0005\u0006\u0000"+ + "\u0000\u02f8\u02f9\u0003^/\u0000\u02f9k\u0001\u0000\u0000\u0000\u02fa"+ + "\u02fb\u0005?\u0000\u0000\u02fb\u02fc\u0003^/\u0000\u02fcm\u0001\u0000"+ + "\u0000\u0000\u02fd\u02fe\u0005@\u0000\u0000\u02fe\u02ff\u0005A\u0000\u0000"+ + "\u02ff\u0304\u0003p8\u0000\u0300\u0301\u0005\u000e\u0000\u0000\u0301\u0303"+ + "\u0003p8\u0000\u0302\u0300\u0001\u0000\u0000\u0000\u0303\u0306\u0001\u0000"+ + "\u0000\u0000\u0304\u0302\u0001\u0000\u0000\u0000\u0304\u0305\u0001\u0000"+ + "\u0000\u0000\u0305o\u0001\u0000\u0000\u0000\u0306\u0304\u0001\u0000\u0000"+ + "\u0000\u0307\u030e\u0003\u00c0`\u0000\u0308\u0309\u0005F\u0000\u0000\u0309"+ + "\u030b\u0003\u00e6s\u0000\u030a\u0308\u0001\u0000\u0000\u0000\u030a\u030b"+ + "\u0001\u0000\u0000\u0000\u030b\u030c\u0001\u0000\u0000\u0000\u030c\u030d"+ + "\u0005\u0006\u0000\u0000\u030d\u030f\u0003^/\u0000\u030e\u030a\u0001\u0000"+ + "\u0000\u0000\u030e\u030f\u0001\u0000\u0000\u0000\u030f\u0312\u0001\u0000"+ + "\u0000\u0000\u0310\u0311\u0005Q\u0000\u0000\u0311\u0313\u0003\u00f8|\u0000"+ + "\u0312\u0310\u0001\u0000\u0000\u0000\u0312\u0313\u0001\u0000\u0000\u0000"+ + "\u0313q\u0001\u0000\u0000\u0000\u0314\u0315\u0005B\u0000\u0000\u0315\u031a"+ + "\u0005A\u0000\u0000\u0316\u0317\u0005K\u0000\u0000\u0317\u0318\u0005B"+ + "\u0000\u0000\u0318\u031a\u0005A\u0000\u0000\u0319\u0314\u0001\u0000\u0000"+ + "\u0000\u0319\u0316\u0001\u0000\u0000\u0000\u031a\u031b\u0001\u0000\u0000"+ + "\u0000\u031b\u0320\u0003t:\u0000\u031c\u031d\u0005\u000e\u0000\u0000\u031d"+ + "\u031f\u0003t:\u0000\u031e\u031c\u0001\u0000\u0000\u0000\u031f\u0322\u0001"+ + "\u0000\u0000\u0000\u0320\u031e\u0001\u0000\u0000\u0000\u0320\u0321\u0001"+ + "\u0000\u0000\u0000\u0321s\u0001\u0000\u0000\u0000\u0322\u0320\u0001\u0000"+ + "\u0000\u0000\u0323\u0326\u0003^/\u0000\u0324\u0327\u0005L\u0000\u0000"+ + "\u0325\u0327\u0005M\u0000\u0000\u0326\u0324\u0001\u0000\u0000\u0000\u0326"+ + "\u0325\u0001\u0000\u0000\u0000\u0326\u0327\u0001\u0000\u0000\u0000\u0327"+ + "\u032d\u0001\u0000\u0000\u0000\u0328\u032b\u0005I\u0000\u0000\u0329\u032c"+ + "\u0005R\u0000\u0000\u032a\u032c\u0005S\u0000\u0000\u032b\u0329\u0001\u0000"+ + "\u0000\u0000\u032b\u032a\u0001\u0000\u0000\u0000\u032c\u032e\u0001\u0000"+ + "\u0000\u0000\u032d\u0328\u0001\u0000\u0000\u0000\u032d\u032e\u0001\u0000"+ + "\u0000\u0000\u032e\u0331\u0001\u0000\u0000\u0000\u032f\u0330\u0005Q\u0000"+ + "\u0000\u0330\u0332\u0003\u00f8|\u0000\u0331\u032f\u0001\u0000\u0000\u0000"+ + "\u0331\u0332\u0001\u0000\u0000\u0000\u0332u\u0001\u0000\u0000\u0000\u0333"+ + "\u0334\u0005J\u0000\u0000\u0334\u0335\u0003\u00c0`\u0000\u0335w\u0001"+ + "\u0000\u0000\u0000\u0336\u0339\u0005N\u0000\u0000\u0337\u0339\u0005O\u0000"+ + "\u0000\u0338\u0336\u0001\u0000\u0000\u0000\u0338\u0337\u0001\u0000\u0000"+ + "\u0000\u0339\u033a\u0001\u0000\u0000\u0000\u033a\u033f\u0003z=\u0000\u033b"+ + "\u033c\u0005\u000e\u0000\u0000\u033c\u033e\u0003z=\u0000\u033d\u033b\u0001"+ + "\u0000\u0000\u0000\u033e\u0341\u0001\u0000\u0000\u0000\u033f\u033d\u0001"+ + "\u0000\u0000\u0000\u033f\u0340\u0001\u0000\u0000\u0000\u0340\u0342\u0001"+ + "\u0000\u0000\u0000\u0341\u033f\u0001\u0000\u0000\u0000\u0342\u0343\u0005"+ + "P\u0000\u0000\u0343\u0344\u0003^/\u0000\u0344y\u0001\u0000\u0000\u0000"+ + "\u0345\u0348\u0003\u00c0`\u0000\u0346\u0347\u0005F\u0000\u0000\u0347\u0349"+ + "\u0003\u00e6s\u0000\u0348\u0346\u0001\u0000\u0000\u0000\u0348\u0349\u0001"+ + "\u0000\u0000\u0000\u0349\u034a\u0001\u0000\u0000\u0000\u034a\u034b\u0005"+ + "E\u0000\u0000\u034b\u034c\u0003^/\u0000\u034c{\u0001\u0000\u0000\u0000"+ + "\u034d\u034e\u0005T\u0000\u0000\u034e\u034f\u0005\t\u0000\u0000\u034f"+ + "\u0350\u0003\\.\u0000\u0350\u0352\u0005\n\u0000\u0000\u0351\u0353\u0003"+ + "~?\u0000\u0352\u0351\u0001\u0000\u0000\u0000\u0353\u0354\u0001\u0000\u0000"+ + "\u0000\u0354\u0352\u0001\u0000\u0000\u0000\u0354\u0355\u0001\u0000\u0000"+ + "\u0000\u0355\u0356\u0001\u0000\u0000\u0000\u0356\u0357\u0005X\u0000\u0000"+ + "\u0357\u0358\u0005C\u0000\u0000\u0358\u0359\u0003^/\u0000\u0359}\u0001"+ + "\u0000\u0000\u0000\u035a\u035b\u0005U\u0000\u0000\u035b\u035d\u0003^/"+ + "\u0000\u035c\u035a\u0001\u0000\u0000\u0000\u035d\u035e\u0001\u0000\u0000"+ + "\u0000\u035e\u035c\u0001\u0000\u0000\u0000\u035e\u035f\u0001\u0000\u0000"+ + "\u0000\u035f\u0360\u0001\u0000\u0000\u0000\u0360\u0361\u0005C\u0000\u0000"+ + "\u0361\u0362\u0003^/\u0000\u0362\u007f\u0001\u0000\u0000\u0000\u0363\u0364"+ + "\u0005[\u0000\u0000\u0364\u0365\u0005\t\u0000\u0000\u0365\u0366\u0003"+ + "\\.\u0000\u0366\u0368\u0005\n\u0000\u0000\u0367\u0369\u0003\u0082A\u0000"+ + "\u0368\u0367\u0001\u0000\u0000\u0000\u0369\u036a\u0001\u0000\u0000\u0000"+ + "\u036a\u0368\u0001\u0000\u0000\u0000\u036a\u036b\u0001\u0000\u0000\u0000"+ + "\u036b\u036c\u0001\u0000\u0000\u0000\u036c\u036e\u0005X\u0000\u0000\u036d"+ + "\u036f\u0003\u00c0`\u0000\u036e\u036d\u0001\u0000\u0000\u0000\u036e\u036f"+ + "\u0001\u0000\u0000\u0000\u036f\u0370\u0001\u0000\u0000\u0000\u0370\u0371"+ + "\u0005C\u0000\u0000\u0371\u0372\u0003^/\u0000\u0372\u0081\u0001\u0000"+ + "\u0000\u0000\u0373\u0377\u0005U\u0000\u0000\u0374\u0375\u0003\u00c0`\u0000"+ + "\u0375\u0376\u0005F\u0000\u0000\u0376\u0378\u0001\u0000\u0000\u0000\u0377"+ + "\u0374\u0001\u0000\u0000\u0000\u0377\u0378\u0001\u0000\u0000\u0000\u0378"+ + "\u0379\u0001\u0000\u0000\u0000\u0379\u037e\u0003\u00e6s\u0000\u037a\u037b"+ + "\u0005\f\u0000\u0000\u037b\u037d\u0003\u00e6s\u0000\u037c\u037a\u0001"+ + "\u0000\u0000\u0000\u037d\u0380\u0001\u0000\u0000\u0000\u037e\u037c\u0001"+ + "\u0000\u0000\u0000\u037e\u037f\u0001\u0000\u0000\u0000\u037f\u0381\u0001"+ + "\u0000\u0000\u0000\u0380\u037e\u0001\u0000\u0000\u0000\u0381\u0382\u0005"+ + "C\u0000\u0000\u0382\u0383\u0003^/\u0000\u0383\u0083\u0001\u0000\u0000"+ + "\u0000\u0384\u0385\u0005D\u0000\u0000\u0385\u0386\u0005\t\u0000\u0000"+ + "\u0386\u0387\u0003\\.\u0000\u0387\u0388\u0005\n\u0000\u0000\u0388\u0389"+ + "\u0005Y\u0000\u0000\u0389\u038a\u0003^/\u0000\u038a\u038b\u0005Z\u0000"+ + "\u0000\u038b\u038c\u0003^/\u0000\u038c\u0085\u0001\u0000\u0000\u0000\u038d"+ + "\u038e\u0005V\u0000\u0000\u038e\u038f\u0005\u0007\u0000\u0000\u038f\u0390"+ + "\u0003\\.\u0000\u0390\u0392\u0005\b\u0000\u0000\u0391\u0393\u0003\u0088"+ + "D\u0000\u0392\u0391\u0001\u0000\u0000\u0000\u0393\u0394\u0001\u0000\u0000"+ + "\u0000\u0394\u0392\u0001\u0000\u0000\u0000\u0394\u0395\u0001\u0000\u0000"+ + "\u0000\u0395\u0087\u0001\u0000\u0000\u0000\u0396\u0399\u0005W\u0000\u0000"+ + "\u0397\u039a\u0005\u000b\u0000\u0000\u0398\u039a\u0003H$\u0000\u0399\u0397"+ + "\u0001\u0000\u0000\u0000\u0399\u0398\u0001\u0000\u0000\u0000\u039a\u03a2"+ + "\u0001\u0000\u0000\u0000\u039b\u039e\u0005\f\u0000\u0000\u039c\u039f\u0005"+ + "\u000b\u0000\u0000\u039d\u039f\u0003H$\u0000\u039e\u039c\u0001\u0000\u0000"+ + "\u0000\u039e\u039d\u0001\u0000\u0000\u0000\u039f\u03a1\u0001\u0000\u0000"+ + "\u0000\u03a0\u039b\u0001\u0000\u0000\u0000\u03a1\u03a4\u0001\u0000\u0000"+ + "\u0000\u03a2\u03a0\u0001\u0000\u0000\u0000\u03a2\u03a3\u0001\u0000\u0000"+ + "\u0000\u03a3\u03a5\u0001\u0000\u0000\u0000\u03a4\u03a2\u0001\u0000\u0000"+ + "\u0000\u03a5\u03a6\u0005\u0007\u0000\u0000\u03a6\u03a7\u0003\\.\u0000"+ + "\u03a7\u03a8\u0005\b\u0000\u0000\u03a8\u0089\u0001\u0000\u0000\u0000\u03a9"+ + "\u03ae\u0003\u008cF\u0000\u03aa\u03ab\u0005\\\u0000\u0000\u03ab\u03ad"+ + "\u0003\u008cF\u0000\u03ac\u03aa\u0001\u0000\u0000\u0000\u03ad\u03b0\u0001"+ + "\u0000\u0000\u0000\u03ae\u03ac\u0001\u0000\u0000\u0000\u03ae\u03af\u0001"+ + "\u0000\u0000\u0000\u03af\u008b\u0001\u0000\u0000\u0000\u03b0\u03ae\u0001"+ + "\u0000\u0000\u0000\u03b1\u03b6\u0003\u008eG\u0000\u03b2\u03b3\u0005]\u0000"+ + "\u0000\u03b3\u03b5\u0003\u008eG\u0000\u03b4\u03b2\u0001\u0000\u0000\u0000"+ + "\u03b5\u03b8\u0001\u0000\u0000\u0000\u03b6\u03b4\u0001\u0000\u0000\u0000"+ + "\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u008d\u0001\u0000\u0000\u0000"+ + "\u03b8\u03b6\u0001\u0000\u0000\u0000\u03b9\u03bb\u0005^\u0000\u0000\u03ba"+ + "\u03b9\u0001\u0000\u0000\u0000\u03ba\u03bb\u0001\u0000\u0000\u0000\u03bb"+ + "\u03bc\u0001\u0000\u0000\u0000\u03bc\u03bd\u0003\u0090H\u0000\u03bd\u008f"+ + "\u0001\u0000\u0000\u0000\u03be\u03c1\u0003\u0092I\u0000\u03bf\u03c0\u0007"+ + "\u0003\u0000\u0000\u03c0\u03c2\u0003\u0092I\u0000\u03c1\u03bf\u0001\u0000"+ + "\u0000\u0000\u03c1\u03c2\u0001\u0000\u0000\u0000\u03c2\u0091\u0001\u0000"+ + "\u0000\u0000\u03c3\u03c8\u0003\u0094J\u0000\u03c4\u03c5\u0005/\u0000\u0000"+ + "\u03c5\u03c7\u0003\u0094J\u0000\u03c6\u03c4\u0001\u0000\u0000\u0000\u03c7"+ + "\u03ca\u0001\u0000\u0000\u0000\u03c8\u03c6\u0001\u0000\u0000\u0000\u03c8"+ + "\u03c9\u0001\u0000\u0000\u0000\u03c9\u0093\u0001\u0000\u0000\u0000\u03ca"+ + "\u03c8\u0001\u0000\u0000\u0000\u03cb\u03ce\u0003\u0096K\u0000\u03cc\u03cd"+ + "\u0005_\u0000\u0000\u03cd\u03cf\u0003\u0096K\u0000\u03ce\u03cc\u0001\u0000"+ + "\u0000\u0000\u03ce\u03cf\u0001\u0000\u0000\u0000\u03cf\u0095\u0001\u0000"+ + "\u0000\u0000\u03d0\u03d5\u0003\u0098L\u0000\u03d1\u03d2\u0007\u0004\u0000"+ + "\u0000\u03d2\u03d4\u0003\u0098L\u0000\u03d3\u03d1\u0001\u0000\u0000\u0000"+ + "\u03d4\u03d7\u0001\u0000\u0000\u0000\u03d5\u03d3\u0001\u0000\u0000\u0000"+ + "\u03d5\u03d6\u0001\u0000\u0000\u0000\u03d6\u0097\u0001\u0000\u0000\u0000"+ + "\u03d7\u03d5\u0001\u0000\u0000\u0000\u03d8\u03dd\u0003\u009aM\u0000\u03d9"+ + "\u03da\u0007\u0005\u0000\u0000\u03da\u03dc\u0003\u009aM\u0000\u03db\u03d9"+ + "\u0001\u0000\u0000\u0000\u03dc\u03df\u0001\u0000\u0000\u0000\u03dd\u03db"+ + "\u0001\u0000\u0000\u0000\u03dd\u03de\u0001\u0000\u0000\u0000\u03de\u0099"+ + "\u0001\u0000\u0000\u0000\u03df\u03dd\u0001\u0000\u0000\u0000\u03e0\u03e4"+ + "\u0003\u009cN\u0000\u03e1\u03e2\u0005`\u0000\u0000\u03e2\u03e3\u0005a"+ + "\u0000\u0000\u03e3\u03e5\u0003\u00e6s\u0000\u03e4\u03e1\u0001\u0000\u0000"+ + "\u0000\u03e4\u03e5\u0001\u0000\u0000\u0000\u03e5\u009b\u0001\u0000\u0000"+ + "\u0000\u03e6\u03ea\u0003\u009eO\u0000\u03e7\u03e8\u0005c\u0000\u0000\u03e8"+ + "\u03e9\u0005b\u0000\u0000\u03e9\u03eb\u0003\u00e6s\u0000\u03ea\u03e7\u0001"+ + "\u0000\u0000\u0000\u03ea\u03eb\u0001\u0000\u0000\u0000\u03eb\u009d\u0001"+ + "\u0000\u0000\u0000\u03ec\u03f0\u0003\u00a0P\u0000\u03ed\u03ee\u0005d\u0000"+ + "\u0000\u03ee\u03ef\u0005F\u0000\u0000\u03ef\u03f1\u0003\u00e6s\u0000\u03f0"+ + "\u03ed\u0001\u0000\u0000\u0000\u03f0\u03f1\u0001\u0000\u0000\u0000\u03f1"+ + "\u009f\u0001\u0000\u0000\u0000\u03f2\u03f6\u0003\u00a2Q\u0000\u03f3\u03f4"+ + "\u0005f\u0000\u0000\u03f4\u03f5\u0005F\u0000\u0000\u03f5\u03f7\u0003\u00f2"+ + "y\u0000\u03f6\u03f3\u0001\u0000\u0000\u0000\u03f6\u03f7\u0001\u0000\u0000"+ + "\u0000\u03f7\u00a1\u0001\u0000\u0000\u0000\u03f8\u03fc\u0003\u00a4R\u0000"+ + "\u03f9\u03fa\u0005e\u0000\u0000\u03fa\u03fb\u0005F\u0000\u0000\u03fb\u03fd"+ + "\u0003\u00f2y\u0000\u03fc\u03f9\u0001\u0000\u0000\u0000\u03fc\u03fd\u0001"+ + "\u0000\u0000\u0000\u03fd\u00a3\u0001\u0000\u0000\u0000\u03fe\u0407\u0003"+ + "\u00a8T\u0000\u03ff\u0400\u0005\u0004\u0000\u0000\u0400\u0401\u0005-\u0000"+ + "\u0000\u0401\u0402\u0001\u0000\u0000\u0000\u0402\u0403\u0003\u00a6S\u0000"+ + "\u0403\u0404\u0003\u00ccf\u0000\u0404\u0406\u0001\u0000\u0000\u0000\u0405"+ + "\u03ff\u0001\u0000\u0000\u0000\u0406\u0409\u0001\u0000\u0000\u0000\u0407"+ + "\u0405\u0001\u0000\u0000\u0000\u0407\u0408\u0001\u0000\u0000\u0000\u0408"+ + "\u00a5\u0001\u0000\u0000\u0000\u0409\u0407\u0001\u0000\u0000\u0000\u040a"+ + "\u040e\u0003H$\u0000\u040b\u040e\u0003\u00c0`\u0000\u040c\u040e\u0003"+ + "\u00c2a\u0000\u040d\u040a\u0001\u0000\u0000\u0000\u040d\u040b\u0001\u0000"+ + "\u0000\u0000\u040d\u040c\u0001\u0000\u0000\u0000\u040e\u00a7\u0001\u0000"+ + "\u0000\u0000\u040f\u0411\u0007\u0004\u0000\u0000\u0410\u040f\u0001\u0000"+ + "\u0000\u0000\u0411\u0414\u0001\u0000\u0000\u0000\u0412\u0410\u0001\u0000"+ + "\u0000\u0000\u0412\u0413\u0001\u0000\u0000\u0000\u0413\u0415\u0001\u0000"+ + "\u0000\u0000\u0414\u0412\u0001\u0000\u0000\u0000\u0415\u0416\u0003\u00aa"+ + "U\u0000\u0416\u00a9\u0001\u0000\u0000\u0000\u0417\u041b\u0003\u00b0X\u0000"+ + "\u0418\u041b\u0003\u00acV\u0000\u0419\u041b\u0003\u00aeW\u0000\u041a\u0417"+ + "\u0001\u0000\u0000\u0000\u041a\u0418\u0001\u0000\u0000\u0000\u041a\u0419"+ + "\u0001\u0000\u0000\u0000\u041b\u00ab\u0001\u0000\u0000\u0000\u041c\u041d"+ + "\u0005m\u0000\u0000\u041d\u041e\u0005l\u0000\u0000\u041e\u041f\u0003\u00e6"+ + "s\u0000\u041f\u0420\u0005\u0007\u0000\u0000\u0420\u0421\u0003\\.\u0000"+ + "\u0421\u0422\u0005\b\u0000\u0000\u0422\u00ad\u0001\u0000\u0000\u0000\u0423"+ + "\u0424\u0005n\u0000\u0000\u0424\u0425\u0005l\u0000\u0000\u0425\u0426\u0003"+ + "\u00e6s\u0000\u0426\u0427\u0005\u0007\u0000\u0000\u0427\u0428\u0003\\"+ + ".\u0000\u0428\u0429\u0005\b\u0000\u0000\u0429\u00af\u0001\u0000\u0000"+ + "\u0000\u042a\u042f\u0003\u00b2Y\u0000\u042b\u042c\u00055\u0000\u0000\u042c"+ + "\u042e\u0003\u00b2Y\u0000\u042d\u042b\u0001\u0000\u0000\u0000\u042e\u0431"+ + "\u0001\u0000\u0000\u0000\u042f\u042d\u0001\u0000\u0000\u0000\u042f\u0430"+ + "\u0001\u0000\u0000\u0000\u0430\u00b1\u0001\u0000\u0000\u0000\u0431\u042f"+ + "\u0001\u0000\u0000\u0000\u0432\u043a\u0003\u00bc^\u0000\u0433\u0439\u0003"+ + "\u00b4Z\u0000\u0434\u0439\u0003\u00b8\\\u0000\u0435\u0439\u0003\u00ba"+ + "]\u0000\u0436\u0439\u0003\u00b6[\u0000\u0437\u0439\u0003\u00ccf\u0000"+ + "\u0438\u0433\u0001\u0000\u0000\u0000\u0438\u0434\u0001\u0000\u0000\u0000"+ + "\u0438\u0435\u0001\u0000\u0000\u0000\u0438\u0436\u0001\u0000\u0000\u0000"+ + "\u0438\u0437\u0001\u0000\u0000\u0000\u0439\u043c\u0001\u0000\u0000\u0000"+ + "\u043a\u0438\u0001\u0000\u0000\u0000\u043a\u043b\u0001\u0000\u0000\u0000"+ + "\u043b\u00b3\u0001\u0000\u0000\u0000\u043c\u043a\u0001\u0000\u0000\u0000"+ + "\u043d\u043e\u00056\u0000\u0000\u043e\u043f\u00056\u0000\u0000\u043f\u0440"+ + "\u0003\\.\u0000\u0440\u0441\u00057\u0000\u0000\u0441\u0442\u00057\u0000"+ + "\u0000\u0442\u00b5\u0001\u0000\u0000\u0000\u0443\u0444\u00056\u0000\u0000"+ + "\u0444\u0445\u00057\u0000\u0000\u0445\u00b7\u0001\u0000\u0000\u0000\u0446"+ + "\u0447\u00056\u0000\u0000\u0447\u0448\u0003\\.\u0000\u0448\u0449\u0005"+ + "7\u0000\u0000\u0449\u00b9\u0001\u0000\u0000\u0000\u044a\u0451\u00058\u0000"+ + "\u0000\u044b\u0452\u0003\u00fc~\u0000\u044c\u0452\u0003\u00fa}\u0000\u044d"+ + "\u0452\u0005\u008f\u0000\u0000\u044e\u0452\u0003\u00c2a\u0000\u044f\u0452"+ + "\u0003\u00c0`\u0000\u0450\u0452\u0003\u00c4b\u0000\u0451\u044b\u0001\u0000"+ + "\u0000\u0000\u0451\u044c\u0001\u0000\u0000\u0000\u0451\u044d\u0001\u0000"+ + "\u0000\u0000\u0451\u044e\u0001\u0000\u0000\u0000\u0451\u044f\u0001\u0000"+ + "\u0000\u0000\u0451\u0450\u0001\u0000\u0000\u0000\u0452\u00bb\u0001\u0000"+ + "\u0000\u0000\u0453\u0463\u0005\u0088\u0000\u0000\u0454\u0463\u0005j\u0000"+ + "\u0000\u0455\u0463\u0005k\u0000\u0000\u0456\u0463\u0005\u0089\u0000\u0000"+ + "\u0457\u0463\u0003\u00fa}\u0000\u0458\u0463\u0003\u00c0`\u0000\u0459\u0463"+ + "\u0003\u00c2a\u0000\u045a\u0463\u0003\u00c4b\u0000\u045b\u0463\u0003\u00e8"+ + "t\u0000\u045c\u0463\u0003\u00cae\u0000\u045d\u0463\u0003\u00c6c\u0000"+ + "\u045e\u0463\u0003\u00c8d\u0000\u045f\u0463\u0003\u00f6{\u0000\u0460\u0463"+ + "\u0003\u00d0h\u0000\u0461\u0463\u0003\u00be_\u0000\u0462\u0453\u0001\u0000"+ + "\u0000\u0000\u0462\u0454\u0001\u0000\u0000\u0000\u0462\u0455\u0001\u0000"+ + "\u0000\u0000\u0462\u0456\u0001\u0000\u0000\u0000\u0462\u0457\u0001\u0000"+ + "\u0000\u0000\u0462\u0458\u0001\u0000\u0000\u0000\u0462\u0459\u0001\u0000"+ + "\u0000\u0000\u0462\u045a\u0001\u0000\u0000\u0000\u0462\u045b\u0001\u0000"+ + "\u0000\u0000\u0462\u045c\u0001\u0000\u0000\u0000\u0462\u045d\u0001\u0000"+ + "\u0000\u0000\u0462\u045e\u0001\u0000\u0000\u0000\u0462\u045f\u0001\u0000"+ + "\u0000\u0000\u0462\u0460\u0001\u0000\u0000\u0000\u0462\u0461\u0001\u0000"+ + "\u0000\u0000\u0463\u00bd\u0001\u0000\u0000\u0000\u0464\u0465\u0005\u0007"+ + "\u0000\u0000\u0465\u0466\u0003\u000e\u0007\u0000\u0466\u0467\u0005\b\u0000"+ + "\u0000\u0467\u00bf\u0001\u0000\u0000\u0000\u0468\u0469\u0005\u0005\u0000"+ + "\u0000\u0469\u046a\u0003H$\u0000\u046a\u00c1\u0001\u0000\u0000\u0000\u046b"+ + "\u046d\u0005\t\u0000\u0000\u046c\u046e\u0003\\.\u0000\u046d\u046c\u0001"+ + "\u0000\u0000\u0000\u046d\u046e\u0001\u0000\u0000\u0000\u046e\u046f\u0001"+ + "\u0000\u0000\u0000\u046f\u0470\u0005\n\u0000\u0000\u0470\u00c3\u0001\u0000"+ + "\u0000\u0000\u0471\u0472\u00059\u0000\u0000\u0472\u00c5\u0001\u0000\u0000"+ + "\u0000\u0473\u0474\u0005\u0010\u0000\u0000\u0474\u0475\u0005\u0007\u0000"+ + "\u0000\u0475\u0476\u0003\\.\u0000\u0476\u0477\u0005\b\u0000\u0000\u0477"+ + "\u00c7\u0001\u0000\u0000\u0000\u0478\u0479\u0005i\u0000\u0000\u0479\u047a"+ + "\u0005\u0007\u0000\u0000\u047a\u047b\u0003\\.\u0000\u047b\u047c\u0005"+ + "\b\u0000\u0000\u047c\u00c9\u0001\u0000\u0000\u0000\u047d\u047e\u0003H"+ + "$\u0000\u047e\u047f\u0003\u00ccf\u0000\u047f\u00cb\u0001\u0000\u0000\u0000"+ + "\u0480\u0487\u0005\t\u0000\u0000\u0481\u0483\u0003\u00ceg\u0000\u0482"+ + "\u0484\u0005\u000e\u0000\u0000\u0483\u0482\u0001\u0000\u0000\u0000\u0483"+ + "\u0484\u0001\u0000\u0000\u0000\u0484\u0486\u0001\u0000\u0000\u0000\u0485"+ + "\u0481\u0001\u0000\u0000\u0000\u0486\u0489\u0001\u0000\u0000\u0000\u0487"+ + "\u0485\u0001\u0000\u0000\u0000\u0487\u0488\u0001\u0000\u0000\u0000\u0488"+ + "\u048a\u0001\u0000\u0000\u0000\u0489\u0487\u0001\u0000\u0000\u0000\u048a"+ + "\u048b\u0005\n\u0000\u0000\u048b\u00cd\u0001\u0000\u0000\u0000\u048c\u048f"+ + "\u0003^/\u0000\u048d\u048f\u0005\u0087\u0000\u0000\u048e\u048c\u0001\u0000"+ + "\u0000\u0000\u048e\u048d\u0001\u0000\u0000\u0000\u048f\u00cf\u0001\u0000"+ + "\u0000\u0000\u0490\u0493\u0003\u00d2i\u0000\u0491\u0493\u0003\u00d4j\u0000"+ + "\u0492\u0490\u0001\u0000\u0000\u0000\u0492\u0491\u0001\u0000\u0000\u0000"+ + "\u0493\u00d1\u0001\u0000\u0000\u0000\u0494\u0495\u0003H$\u0000\u0495\u0496"+ + "\u0005:\u0000\u0000\u0496\u0497\u0005\u0089\u0000\u0000\u0497\u00d3\u0001"+ + "\u0000\u0000\u0000\u0498\u0499\u00032\u0019\u0000\u0499\u049a\u0005\u001f"+ + "\u0000\u0000\u049a\u049c\u0005\t\u0000\u0000\u049b\u049d\u0003X,\u0000"+ + "\u049c\u049b\u0001\u0000\u0000\u0000\u049c\u049d\u0001\u0000\u0000\u0000"+ + "\u049d\u049e\u0001\u0000\u0000\u0000\u049e\u04a1\u0005\n\u0000\u0000\u049f"+ + "\u04a0\u0005F\u0000\u0000\u04a0\u04a2\u0003\u00e6s\u0000\u04a1\u049f\u0001"+ + "\u0000\u0000\u0000\u04a1\u04a2\u0001\u0000\u0000\u0000\u04a2\u04a3\u0001"+ + "\u0000\u0000\u0000\u04a3\u04a4\u0005\u0007\u0000\u0000\u04a4\u04a5\u0003"+ + "\u0010\b\u0000\u04a5\u04a6\u0005\b\u0000\u0000\u04a6\u00d5\u0001\u0000"+ + "\u0000\u0000\u04a7\u04a8\u0005s\u0000\u0000\u04a8\u04a9\u0005~\u0000\u0000"+ + "\u04a9\u04aa\u0003^/\u0000\u04aa\u04ab\u0005z\u0000\u0000\u04ab\u04af"+ + "\u0003^/\u0000\u04ac\u04ad\u0005G\u0000\u0000\u04ad\u04ae\u0005}\u0000"+ + "\u0000\u04ae\u04b0\u0003^/\u0000\u04af\u04ac\u0001\u0000\u0000\u0000\u04af"+ + "\u04b0\u0001\u0000\u0000\u0000\u04b0\u04bf\u0001\u0000\u0000\u0000\u04b1"+ + "\u04b2\u0005s\u0000\u0000\u04b2\u04b3\u0005~\u0000\u0000\u04b3\u04b8\u0003"+ + "\u00f4z\u0000\u04b4\u04b5\u0005\u000e\u0000\u0000\u04b5\u04b7\u0003\u00f4"+ + "z\u0000\u04b6\u04b4\u0001\u0000\u0000\u0000\u04b7\u04ba\u0001\u0000\u0000"+ + "\u0000\u04b8\u04b6\u0001\u0000\u0000\u0000\u04b8\u04b9\u0001\u0000\u0000"+ + "\u0000\u04b9\u04bb\u0001\u0000\u0000\u0000\u04ba\u04b8\u0001\u0000\u0000"+ + "\u0000\u04bb\u04bc\u0005z\u0000\u0000\u04bc\u04bd\u0003^/\u0000\u04bd"+ + "\u04bf\u0001\u0000\u0000\u0000\u04be\u04a7\u0001\u0000\u0000\u0000\u04be"+ + "\u04b1\u0001\u0000\u0000\u0000\u04bf\u00d7\u0001\u0000\u0000\u0000\u04c0"+ + "\u04c1\u0005t\u0000\u0000\u04c1\u04c2\u0005~\u0000\u0000\u04c2\u04c3\u0003"+ + "\u00e2q\u0000\u04c3\u00d9\u0001\u0000\u0000\u0000\u04c4\u04c5\u0005u\u0000"+ + "\u0000\u04c5\u04c6\u0005~\u0000\u0000\u04c6\u04c7\u0003\u00e2q\u0000\u04c7"+ + "\u04c8\u0005F\u0000\u0000\u04c8\u04c9\u0003^/\u0000\u04c9\u00db\u0001"+ + "\u0000\u0000\u0000\u04ca\u04cb\u0005v\u0000\u0000\u04cb\u04cc\u0005{\u0000"+ + "\u0000\u04cc\u04cd\u0005a\u0000\u0000\u04cd\u04ce\u0005~\u0000\u0000\u04ce"+ + "\u04cf\u0003\u00e2q\u0000\u04cf\u04d0\u0005|\u0000\u0000\u04d0\u04d1\u0003"+ + "^/\u0000\u04d1\u00dd\u0001\u0000\u0000\u0000\u04d2\u04d3\u0005w\u0000"+ + "\u0000\u04d3\u04d8\u0003\u00e4r\u0000\u04d4\u04d5\u0005\u000e\u0000\u0000"+ + "\u04d5\u04d7\u0003\u00e4r\u0000\u04d6\u04d4\u0001\u0000\u0000\u0000\u04d7"+ + "\u04da\u0001\u0000\u0000\u0000\u04d8\u04d6\u0001\u0000\u0000\u0000\u04d8"+ + "\u04d9\u0001\u0000\u0000\u0000\u04d9\u04db\u0001\u0000\u0000\u0000\u04da"+ + "\u04d8\u0001\u0000\u0000\u0000\u04db\u04dc\u0005x\u0000\u0000\u04dc\u04dd"+ + "\u0003^/\u0000\u04dd\u04de\u0005C\u0000\u0000\u04de\u04df\u0003^/\u0000"+ + "\u04df\u00df\u0001\u0000\u0000\u0000\u04e0\u04e1\u0005y\u0000\u0000\u04e1"+ + "\u04e2\u0005~\u0000\u0000\u04e2\u04e3\u0003^/\u0000\u04e3\u04e4\u0005"+ + "z\u0000\u0000\u04e4\u04e5\u0003^/\u0000\u04e5\u00e1\u0001\u0000\u0000"+ + "\u0000\u04e6\u04e9\u0003\u00bc^\u0000\u04e7\u04ea\u0003\u00b4Z\u0000\u04e8"+ + "\u04ea\u0003\u00ba]\u0000\u04e9\u04e7\u0001\u0000\u0000\u0000\u04e9\u04e8"+ + "\u0001\u0000\u0000\u0000\u04ea\u04eb\u0001\u0000\u0000\u0000\u04eb\u04e9"+ + "\u0001\u0000\u0000\u0000\u04eb\u04ec\u0001\u0000\u0000\u0000\u04ec\u00e3"+ + "\u0001\u0000\u0000\u0000\u04ed\u04ee\u0003\u00c0`\u0000\u04ee\u04ef\u0005"+ + "\u0006\u0000\u0000\u04ef\u04f0\u0003^/\u0000\u04f0\u00e5\u0001\u0000\u0000"+ + "\u0000\u04f1\u04f2\u0005\t\u0000\u0000\u04f2\u04fa\u0005\n\u0000\u0000"+ + "\u04f3\u04f7\u0003\u00eau\u0000\u04f4\u04f8\u0005\u0087\u0000\u0000\u04f5"+ + "\u04f8\u0005\u000b\u0000\u0000\u04f6\u04f8\u00050\u0000\u0000\u04f7\u04f4"+ + "\u0001\u0000\u0000\u0000\u04f7\u04f5\u0001\u0000\u0000\u0000\u04f7\u04f6"+ + "\u0001\u0000\u0000\u0000\u04f7\u04f8\u0001\u0000\u0000\u0000\u04f8\u04fa"+ + "\u0001\u0000\u0000\u0000\u04f9\u04f1\u0001\u0000\u0000\u0000\u04f9\u04f3"+ + "\u0001\u0000\u0000\u0000\u04fa\u00e7\u0001\u0000\u0000\u0000\u04fb\u0504"+ + "\u0005\u0007\u0000\u0000\u04fc\u0501\u0003\u00f4z\u0000\u04fd\u04fe\u0005"+ + "\u000e\u0000\u0000\u04fe\u0500\u0003\u00f4z\u0000\u04ff\u04fd\u0001\u0000"+ + "\u0000\u0000\u0500\u0503\u0001\u0000\u0000\u0000\u0501\u04ff\u0001\u0000"+ + "\u0000\u0000\u0501\u0502\u0001\u0000\u0000\u0000\u0502\u0505\u0001\u0000"+ + "\u0000\u0000\u0503\u0501\u0001\u0000\u0000\u0000\u0504\u04fc\u0001\u0000"+ + "\u0000\u0000\u0504\u0505\u0001\u0000\u0000\u0000\u0505\u0506\u0001\u0000"+ + "\u0000\u0000\u0506\u050c\u0005\b\u0000\u0000\u0507\u0508\u0005;\u0000"+ + "\u0000\u0508\u0509\u0003\\.\u0000\u0509\u050a\u0005<\u0000\u0000\u050a"+ + "\u050c\u0001\u0000\u0000\u0000\u050b\u04fb\u0001\u0000\u0000\u0000\u050b"+ + "\u0507\u0001\u0000\u0000\u0000\u050c\u00e9\u0001\u0000\u0000\u0000\u050d"+ + "\u0511\u0003H$\u0000\u050e\u0511\u0005\u0088\u0000\u0000\u050f\u0511\u0003"+ + "\u00ecv\u0000\u0510\u050d\u0001\u0000\u0000\u0000\u0510\u050e\u0001\u0000"+ + "\u0000\u0000\u0510\u050f\u0001\u0000\u0000\u0000\u0511\u00eb\u0001\u0000"+ + "\u0000\u0000\u0512\u0515\u0003\u00eew\u0000\u0513\u0515\u0003\u00f0x\u0000"+ + "\u0514\u0512\u0001\u0000\u0000\u0000\u0514\u0513\u0001\u0000\u0000\u0000"+ + "\u0515\u00ed\u0001\u0000\u0000\u0000\u0516\u0517\u0005\u001f\u0000\u0000"+ + "\u0517\u0518\u0005\t\u0000\u0000\u0518\u0519\u0005\u000b\u0000\u0000\u0519"+ + "\u051a\u0005\n\u0000\u0000\u051a\u00ef\u0001\u0000\u0000\u0000\u051b\u051c"+ + "\u0005\u001f\u0000\u0000\u051c\u0525\u0005\t\u0000\u0000\u051d\u0522\u0003"+ + "\u00e6s\u0000\u051e\u051f\u0005\u000e\u0000\u0000\u051f\u0521\u0003\u00e6"+ + "s\u0000\u0520\u051e\u0001\u0000\u0000\u0000\u0521\u0524\u0001\u0000\u0000"+ + "\u0000\u0522\u0520\u0001\u0000\u0000\u0000\u0522\u0523\u0001\u0000\u0000"+ + "\u0000\u0523\u0526\u0001\u0000\u0000\u0000\u0524\u0522\u0001\u0000\u0000"+ + "\u0000\u0525\u051d\u0001\u0000\u0000\u0000\u0525\u0526\u0001\u0000\u0000"+ + "\u0000\u0526\u0527\u0001\u0000\u0000\u0000\u0527\u0528\u0005\n\u0000\u0000"+ + "\u0528\u0529\u0005F\u0000\u0000\u0529\u052a\u0003\u00e6s\u0000\u052a\u00f1"+ + "\u0001\u0000\u0000\u0000\u052b\u052d\u0003\u00eau\u0000\u052c\u052e\u0005"+ + "\u0087\u0000\u0000\u052d\u052c\u0001\u0000\u0000\u0000\u052d\u052e\u0001"+ + "\u0000\u0000\u0000\u052e\u00f3\u0001\u0000\u0000\u0000\u052f\u0532\u0003"+ + "^/\u0000\u0530\u0532\u0005\u008f\u0000\u0000\u0531\u052f\u0001\u0000\u0000"+ + "\u0000\u0531\u0530\u0001\u0000\u0000\u0000\u0532\u0533\u0001\u0000\u0000"+ + "\u0000\u0533\u0534\u0007\u0006\u0000\u0000\u0534\u0535\u0003^/\u0000\u0535"+ + "\u00f5\u0001\u0000\u0000\u0000\u0536\u0538\u00056\u0000\u0000\u0537\u0539"+ + "\u0003\\.\u0000\u0538\u0537\u0001\u0000\u0000\u0000\u0538\u0539\u0001"+ + "\u0000\u0000\u0000\u0539\u053a\u0001\u0000\u0000\u0000\u053a\u053b\u0005"+ + "7\u0000\u0000\u053b\u00f7\u0001\u0000\u0000\u0000\u053c\u053d\u0003\u00fa"+ + "}\u0000\u053d\u00f9\u0001\u0000\u0000\u0000\u053e\u053f\u0005\u0086\u0000"+ + "\u0000\u053f\u00fb\u0001\u0000\u0000\u0000\u0540\u0541\u0007\u0007\u0000"+ + "\u0000\u0541\u00fd\u0001\u0000\u0000\u0000\u0085\u0106\u010a\u011a\u0120"+ "\u0128\u0130\u0138\u0147\u0165\u016d\u016f\u0185\u018f\u0199\u019e\u01a3"+ - "\u01a7\u01b3\u01b7\u01c0\u01c7\u01d5\u01d9\u01de\u01e8\u01f0\u01f4\u0200"+ - "\u020c\u0222\u022a\u022f\u0232\u0236\u023f\u0248\u024b\u0253\u025a\u025c"+ - "\u0263\u026a\u026c\u0274\u0279\u0280\u0287\u0291\u0298\u029f\u02a6\u02af"+ - "\u02b9\u02bd\u02c5\u02c7\u02d3\u02d9\u02dd\u02e1\u02ec\u02f2\u0301\u0307"+ - "\u030b\u030f\u0316\u031d\u0323\u0328\u032a\u032e\u0335\u033c\u0345\u0351"+ - "\u035b\u0367\u036b\u0374\u037b\u0391\u0396\u039b\u039f\u03ab\u03b3\u03b7"+ - "\u03be\u03c5\u03cb\u03d2\u03da\u03e1\u03e7\u03ed\u03f3\u03f9\u0404\u040a"+ - "\u040f\u0417\u042c\u0435\u0437\u044e\u045f\u046a\u0480\u0484\u048b\u048f"+ - "\u0499\u049e\u04ac\u04b5\u04bb\u04d5\u04e6\u04e8\u04f4\u04f6\u04fe\u0501"+ - "\u0508\u050d\u0511\u051f\u0522\u052a\u052e\u0535"; + "\u01a7\u01b3\u01b7\u01c0\u01c7\u01d5\u01d9\u01dc\u01e1\u01eb\u01f3\u01f7"+ + "\u0203\u020f\u0225\u022d\u0232\u0235\u0239\u0242\u024b\u024e\u0256\u025d"+ + "\u025f\u0266\u026d\u026f\u0277\u027c\u0283\u028a\u0294\u029b\u02a2\u02a9"+ + "\u02b2\u02bc\u02c0\u02c8\u02ca\u02d6\u02dc\u02e0\u02e4\u02ef\u02f5\u0304"+ + "\u030a\u030e\u0312\u0319\u0320\u0326\u032b\u032d\u0331\u0338\u033f\u0348"+ + "\u0354\u035e\u036a\u036e\u0377\u037e\u0394\u0399\u039e\u03a2\u03ae\u03b6"+ + "\u03ba\u03c1\u03c8\u03ce\u03d5\u03dd\u03e4\u03ea\u03f0\u03f6\u03fc\u0407"+ + "\u040d\u0412\u041a\u042f\u0438\u043a\u0451\u0462\u046d\u0483\u0487\u048e"+ + "\u0492\u049c\u04a1\u04af\u04b8\u04be\u04d8\u04e9\u04eb\u04f7\u04f9\u0501"+ + "\u0504\u050b\u0510\u0514\u0522\u0525\u052d\u0531\u0538"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/org/rumbledb/parser/XQueryLexer.interp b/src/main/java/org/rumbledb/parser/XQueryLexer.interp new file mode 100644 index 0000000000..f2c9eb2158 --- /dev/null +++ b/src/main/java/org/rumbledb/parser/XQueryLexer.interp @@ -0,0 +1,1035 @@ +token literal names: +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 +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 +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 +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 +null +null +null +null +null +null +null +null + +token symbolic names: +null +EscapeQuot +EscapeApos +DOUBLE_LBRACE +DOUBLE_RBRACE +IntegerLiteral +DecimalLiteral +DoubleLiteral +DFPropertyName +PredefinedEntityRef +CharRef +Quot +Apos +COMMENT +XMLDECL +PI +CDATA +PRAGMA +WS +EQUAL +NOT_EQUAL +LPAREN +RPAREN +LBRACKET +RBRACKET +LBRACE +RBRACE +STAR +PLUS +MINUS +COMMA +DOT +DDOT +COLON +COLON_EQ +SEMICOLON +SLASH +DSLASH +BACKSLASH +VBAR +LANGLE +RANGLE +QUESTION +AT +DOLLAR +MOD +BANG +HASH +CARAT +ARROW +GRAVE +CONCATENATION +TILDE +KW_ALLOWING +KW_ANCESTOR +KW_ANCESTOR_OR_SELF +KW_AND +KW_ARRAY +KW_AS +KW_ASCENDING +KW_AT +KW_ATTRIBUTE +KW_BASE_URI +KW_BOUNDARY_SPACE +KW_BINARY +KW_BY +KW_CASE +KW_CAST +KW_CASTABLE +KW_CATCH +KW_CHILD +KW_COLLATION +KW_COMMENT +KW_CONSTRUCTION +KW_CONTEXT +KW_COPY_NS +KW_COUNT +KW_DECLARE +KW_DEFAULT +KW_DESCENDANT +KW_DESCENDANT_OR_SELF +KW_DESCENDING +KW_DECIMAL_FORMAT +KW_DIV +KW_DOCUMENT +KW_DOCUMENT_NODE +KW_ELEMENT +KW_ELSE +KW_EMPTY +KW_EMPTY_SEQUENCE +KW_ENCODING +KW_END +KW_EQ +KW_EVERY +KW_EXCEPT +KW_EXTERNAL +KW_FOLLOWING +KW_FOLLOWING_SIBLING +KW_FOR +KW_FUNCTION +KW_GE +KW_GREATEST +KW_GROUP +KW_GT +KW_IDIV +KW_IF +KW_IMPORT +KW_IN +KW_INHERIT +KW_INSTANCE +KW_INTERSECT +KW_IS +KW_ITEM +KW_LAX +KW_LE +KW_LEAST +KW_LET +KW_LT +KW_MAP +KW_MOD +KW_MODULE +KW_NAMESPACE +KW_NE +KW_NEXT +KW_NAMESPACE_NODE +KW_NO_INHERIT +KW_NO_PRESERVE +KW_NODE +KW_OF +KW_ONLY +KW_OPTION +KW_OR +KW_ORDER +KW_ORDERED +KW_ORDERING +KW_PARENT +KW_PRECEDING +KW_PRECEDING_SIBLING +KW_PRESERVE +KW_PREVIOUS +KW_PI +KW_RETURN +KW_SATISFIES +KW_SCHEMA +KW_SCHEMA_ATTR +KW_SCHEMA_ELEM +KW_SELF +KW_SLIDING +KW_SOME +KW_STABLE +KW_START +KW_STRICT +KW_STRIP +KW_SWITCH +KW_TEXT +KW_THEN +KW_TO +KW_TREAT +KW_TRY +KW_TUMBLING +KW_TYPE +KW_TYPESWITCH +KW_UNION +KW_UNORDERED +KW_UPDATE +KW_VALIDATE +KW_VARIABLE +KW_VERSION +KW_WHEN +KW_WHERE +KW_WINDOW +KW_XQUERY +KW_ARRAY_NODE +KW_BOOLEAN_NODE +KW_NULL_NODE +KW_NUMBER_NODE +KW_OBJECT_NODE +KW_REPLACE +KW_WITH +KW_VALUE +KW_INSERT +KW_INTO +KW_DELETE +KW_RENAME +URIQualifiedName +FullQName +NCNameWithLocalWildcard +NCNameWithPrefixWildcard +NCName +XQDOC_COMMENT_START +XQDOC_COMMENT_END +XQDocComment +XQComment +CHAR +ENTER_STRING +EXIT_INTERPOLATION +ContentChar +BASIC_CHAR +ENTER_INTERPOLATION +EXIT_STRING +EscapeQuot_QuotString +DOUBLE_LBRACE_QuotString +DOUBLE_RBRACE_QuotString +EscapeApos_AposString + +rule names: +IntegerLiteral +DecimalLiteral +DoubleLiteral +DFPropertyName +Digits +PredefinedEntityRef +CharRef +Quot +Apos +COMMENT +XMLDECL +PI +CDATA +PRAGMA +WS +EQUAL +NOT_EQUAL +LPAREN +RPAREN +LBRACKET +RBRACKET +LBRACE +RBRACE +STAR +PLUS +MINUS +COMMA +DOT +DDOT +COLON +COLON_EQ +SEMICOLON +SLASH +DSLASH +BACKSLASH +VBAR +LANGLE +RANGLE +QUESTION +AT +DOLLAR +MOD +BANG +HASH +CARAT +ARROW +GRAVE +CONCATENATION +TILDE +KW_ALLOWING +KW_ANCESTOR +KW_ANCESTOR_OR_SELF +KW_AND +KW_ARRAY +KW_AS +KW_ASCENDING +KW_AT +KW_ATTRIBUTE +KW_BASE_URI +KW_BOUNDARY_SPACE +KW_BINARY +KW_BY +KW_CASE +KW_CAST +KW_CASTABLE +KW_CATCH +KW_CHILD +KW_COLLATION +KW_COMMENT +KW_CONSTRUCTION +KW_CONTEXT +KW_COPY_NS +KW_COUNT +KW_DECLARE +KW_DEFAULT +KW_DESCENDANT +KW_DESCENDANT_OR_SELF +KW_DESCENDING +KW_DECIMAL_FORMAT +KW_DIV +KW_DOCUMENT +KW_DOCUMENT_NODE +KW_ELEMENT +KW_ELSE +KW_EMPTY +KW_EMPTY_SEQUENCE +KW_ENCODING +KW_END +KW_EQ +KW_EVERY +KW_EXCEPT +KW_EXTERNAL +KW_FOLLOWING +KW_FOLLOWING_SIBLING +KW_FOR +KW_FUNCTION +KW_GE +KW_GREATEST +KW_GROUP +KW_GT +KW_IDIV +KW_IF +KW_IMPORT +KW_IN +KW_INHERIT +KW_INSTANCE +KW_INTERSECT +KW_IS +KW_ITEM +KW_LAX +KW_LE +KW_LEAST +KW_LET +KW_LT +KW_MAP +KW_MOD +KW_MODULE +KW_NAMESPACE +KW_NE +KW_NEXT +KW_NAMESPACE_NODE +KW_NO_INHERIT +KW_NO_PRESERVE +KW_NODE +KW_OF +KW_ONLY +KW_OPTION +KW_OR +KW_ORDER +KW_ORDERED +KW_ORDERING +KW_PARENT +KW_PRECEDING +KW_PRECEDING_SIBLING +KW_PRESERVE +KW_PREVIOUS +KW_PI +KW_RETURN +KW_SATISFIES +KW_SCHEMA +KW_SCHEMA_ATTR +KW_SCHEMA_ELEM +KW_SELF +KW_SLIDING +KW_SOME +KW_STABLE +KW_START +KW_STRICT +KW_STRIP +KW_SWITCH +KW_TEXT +KW_THEN +KW_TO +KW_TREAT +KW_TRY +KW_TUMBLING +KW_TYPE +KW_TYPESWITCH +KW_UNION +KW_UNORDERED +KW_UPDATE +KW_VALIDATE +KW_VARIABLE +KW_VERSION +KW_WHEN +KW_WHERE +KW_WINDOW +KW_XQUERY +KW_ARRAY_NODE +KW_BOOLEAN_NODE +KW_NULL_NODE +KW_NUMBER_NODE +KW_OBJECT_NODE +KW_REPLACE +KW_WITH +KW_VALUE +KW_INSERT +KW_INTO +KW_DELETE +KW_RENAME +URIQualifiedName +FullQName +NCNameWithLocalWildcard +NCNameWithPrefixWildcard +NCName +NameStartChar +NameChar +XQDOC_COMMENT_START +XQDOC_COMMENT_END +XQDocComment +XQComment +CHAR +ENTER_STRING +EXIT_INTERPOLATION +ContentChar +BASIC_CHAR +GRAVE_STRING +RBRACKET_STRING +LBRACE_STRING +ENTER_INTERPOLATION +EXIT_STRING +EscapeQuot_QuotString +Quot_QuotString +DOUBLE_LBRACE_QuotString +DOUBLE_RBRACE_QuotString +LBRACE_QuotString +RBRACE_QuotString +PredefinedEntityRef_QuotString +CharRef_QuotString +ContentChar_QuotString +EscapeApos_AposString +Apos_AposString +DOUBLE_LBRACE_AposString +DOUBLE_RBRACE_AposString +LBRACE_AposString +RBRACE_AposString +PredefinedEntityRef_AposString +CharRef_AposString +ContentChar_AposString +INT_QUOT_IntegerLiteral +INT_QUOT_DecimalLiteral +INT_QUOT_DoubleLiteral +INT_QUOT_DFPropertyName +INT_QUOT_PredefinedEntityRef +INT_QUOT_CharRef +INT_QUOT_EscapeQuot +INT_QUOT_Apos +INT_QUOT_Quot +INT_QUOT_COMMENT +INT_QUOT_XMLDECL +INT_QUOT_PI +INT_QUOT_CDATA +INT_QUOT_PRAGMA +INT_QUOT_WS +INT_QUOT_EQUAL +INT_QUOT_NOT_EQUAL +INT_QUOT_LPAREN +INT_QUOT_RPAREN +INT_QUOT_LBRACKET +INT_QUOT_RBRACKET +INT_QUOT_LBRACE +INT_QUOT_RBRACE_EXIT +INT_QUOT_RBRACE +INT_QUOT_STAR +INT_QUOT_PLUS +INT_QUOT_MINUS +INT_QUOT_COMMA +INT_QUOT_DOT +INT_QUOT_DDOT +INT_QUOT_COLON +INT_QUOT_COLON_EQ +INT_QUOT_SEMICOLON +INT_QUOT_SLASH +INT_QUOT_DSLASH +INT_QUOT_BACKSLASH +INT_QUOT_VBAR +INT_QUOT_LANGLE +INT_QUOT_RANGLE +INT_QUOT_QUESTION +INT_QUOT_AT +INT_QUOT_DOLLAR +INT_QUOT_MOD +INT_QUOT_BANG +INT_QUOT_HASH +INT_QUOT_CARAT +INT_QUOT_ARROW +INT_QUOT_GRAVE +INT_QUOT_CONCATENATION +INT_QUOT_TILDE +INT_QUOT_KW_ALLOWING +INT_QUOT_KW_ANCESTOR +INT_QUOT_KW_ANCESTOR_OR_SELF +INT_QUOT_KW_AND +INT_QUOT_KW_ARRAY +INT_QUOT_KW_AS +INT_QUOT_KW_ASCENDING +INT_QUOT_KW_AT +INT_QUOT_KW_ATTRIBUTE +INT_QUOT_KW_BASE_URI +INT_QUOT_KW_BOUNDARY_SPACE +INT_QUOT_KW_BINARY +INT_QUOT_KW_BY +INT_QUOT_KW_CASE +INT_QUOT_KW_CAST +INT_QUOT_KW_CASTABLE +INT_QUOT_KW_CATCH +INT_QUOT_KW_CHILD +INT_QUOT_KW_COLLATION +INT_QUOT_KW_COMMENT +INT_QUOT_KW_CONSTRUCTION +INT_QUOT_KW_CONTEXT +INT_QUOT_KW_COPY_NS +INT_QUOT_KW_COUNT +INT_QUOT_KW_DECLARE +INT_QUOT_KW_DEFAULT +INT_QUOT_KW_DESCENDANT +INT_QUOT_KW_DESCENDANT_OR_SELF +INT_QUOT_KW_DESCENDING +INT_QUOT_KW_DECIMAL_FORMAT +INT_QUOT_KW_DIV +INT_QUOT_KW_DOCUMENT +INT_QUOT_KW_DOCUMENT_NODE +INT_QUOT_KW_ELEMENT +INT_QUOT_KW_ELSE +INT_QUOT_KW_EMPTY +INT_QUOT_KW_EMPTY_SEQUENCE +INT_QUOT_KW_ENCODING +INT_QUOT_KW_END +INT_QUOT_KW_EQ +INT_QUOT_KW_EVERY +INT_QUOT_KW_EXCEPT +INT_QUOT_KW_EXTERNAL +INT_QUOT_KW_FOLLOWING +INT_QUOT_KW_FOLLOWING_SIBLING +INT_QUOT_KW_FOR +INT_QUOT_KW_FUNCTION +INT_QUOT_KW_GE +INT_QUOT_KW_GREATEST +INT_QUOT_KW_GROUP +INT_QUOT_KW_GT +INT_QUOT_KW_IDIV +INT_QUOT_KW_IF +INT_QUOT_KW_IMPORT +INT_QUOT_KW_IN +INT_QUOT_KW_INHERIT +INT_QUOT_KW_INSTANCE +INT_QUOT_KW_INTERSECT +INT_QUOT_KW_IS +INT_QUOT_KW_ITEM +INT_QUOT_KW_LAX +INT_QUOT_KW_LE +INT_QUOT_KW_LEAST +INT_QUOT_KW_LET +INT_QUOT_KW_LT +INT_QUOT_KW_MAP +INT_QUOT_KW_MOD +INT_QUOT_KW_MODULE +INT_QUOT_KW_NAMESPACE +INT_QUOT_KW_NE +INT_QUOT_KW_NEXT +INT_QUOT_KW_NAMESPACE_NODE +INT_QUOT_KW_NO_INHERIT +INT_QUOT_KW_NO_PRESERVE +INT_QUOT_KW_NODE +INT_QUOT_KW_OF +INT_QUOT_KW_ONLY +INT_QUOT_KW_OPTION +INT_QUOT_KW_OR +INT_QUOT_KW_ORDER +INT_QUOT_KW_ORDERED +INT_QUOT_KW_ORDERING +INT_QUOT_KW_PARENT +INT_QUOT_KW_PRECEDING +INT_QUOT_KW_PRECEDING_SIBLING +INT_QUOT_KW_PRESERVE +INT_QUOT_KW_PREVIOUS +INT_QUOT_KW_PI +INT_QUOT_KW_RETURN +INT_QUOT_KW_SATISFIES +INT_QUOT_KW_SCHEMA +INT_QUOT_KW_SCHEMA_ATTR +INT_QUOT_KW_SCHEMA_ELEM +INT_QUOT_KW_SELF +INT_QUOT_KW_SLIDING +INT_QUOT_KW_SOME +INT_QUOT_KW_STABLE +INT_QUOT_KW_START +INT_QUOT_KW_STRICT +INT_QUOT_KW_STRIP +INT_QUOT_KW_SWITCH +INT_QUOT_KW_TEXT +INT_QUOT_KW_THEN +INT_QUOT_KW_TO +INT_QUOT_KW_TREAT +INT_QUOT_KW_TRY +INT_QUOT_KW_TUMBLING +INT_QUOT_KW_TYPE +INT_QUOT_KW_TYPESWITCH +INT_QUOT_KW_UNION +INT_QUOT_KW_UNORDERED +INT_QUOT_KW_UPDATE +INT_QUOT_KW_VALIDATE +INT_QUOT_KW_VARIABLE +INT_QUOT_KW_VERSION +INT_QUOT_KW_WHEN +INT_QUOT_KW_WHERE +INT_QUOT_KW_WINDOW +INT_QUOT_KW_XQUERY +INT_QUOT_KW_ARRAY_NODE +INT_QUOT_KW_BOOLEAN_NODE +INT_QUOT_KW_NULL_NODE +INT_QUOT_KW_NUMBER_NODE +INT_QUOT_KW_OBJECT_NODE +INT_QUOT_KW_REPLACE +INT_QUOT_KW_WITH +INT_QUOT_KW_VALUE +INT_QUOT_KW_INSERT +INT_QUOT_KW_INTO +INT_QUOT_KW_DELETE +INT_QUOT_KW_RENAME +INT_QUOT_URIQualifiedName +INT_QUOT_FullQName +INT_QUOT_NCNameWithLocalWildcard +INT_QUOT_NCNameWithPrefixWildcard +INT_QUOT_NCName +INT_QUOT_XQDOC_COMMENT_START +INT_QUOT_XQDOC_COMMENT_END +INT_QUOT_XQDocComment +INT_QUOT_XQComment +INT_QUOT_CHAR +INT_QUOT_ENTER_STRING +INT_QUOT_EXIT_INTERPOLATION +INT_ContentChar +INT_APOS_IntegerLiteral +INT_APOS_DecimalLiteral +INT_APOS_DoubleLiteral +INT_APOS_DFPropertyName +INT_APOS_PredefinedEntityRef +INT_APOS_CharRef +INT_APOS_EscapeApos +INT_APOS_Quot +INT_APOS_Apos +INT_APOS_COMMENT +INT_APOS_XMLDECL +INT_APOS_PI +INT_APOS_CDATA +INT_APOS_PRAGMA +INT_APOS_WS +INT_APOS_EQUAL +INT_APOS_NOT_EQUAL +INT_APOS_LPAREN +INT_APOS_RPAREN +INT_APOS_LBRACKET +INT_APOS_RBRACKET +INT_APOS_LBRACE +INT_APOS_RBRACE_EXIT +INT_APOS_RBRACE +INT_APOS_STAR +INT_APOS_PLUS +INT_APOS_MINUS +INT_APOS_COMMA +INT_APOS_DOT +INT_APOS_DDOT +INT_APOS_COLON +INT_APOS_COLON_EQ +INT_APOS_SEMICOLON +INT_APOS_SLASH +INT_APOS_DSLASH +INT_APOS_BACKSLASH +INT_APOS_VBAR +INT_APOS_LANGLE +INT_APOS_RANGLE +INT_APOS_QUESTION +INT_APOS_AT +INT_APOS_DOLLAR +INT_APOS_MOD +INT_APOS_BANG +INT_APOS_HASH +INT_APOS_CARAT +INT_APOS_ARROW +INT_APOS_GRAVE +INT_APOS_CONCATENATION +INT_APOS_TILDE +INT_APOS_KW_ALLOWING +INT_APOS_KW_ANCESTOR +INT_APOS_KW_ANCESTOR_OR_SELF +INT_APOS_KW_AND +INT_APOS_KW_ARRAY +INT_APOS_KW_AS +INT_APOS_KW_ASCENDING +INT_APOS_KW_AT +INT_APOS_KW_ATTRIBUTE +INT_APOS_KW_BASE_URI +INT_APOS_KW_BOUNDARY_SPACE +INT_APOS_KW_BINARY +INT_APOS_KW_BY +INT_APOS_KW_CASE +INT_APOS_KW_CAST +INT_APOS_KW_CASTABLE +INT_APOS_KW_CATCH +INT_APOS_KW_CHILD +INT_APOS_KW_COLLATION +INT_APOS_KW_COMMENT +INT_APOS_KW_CONSTRUCTION +INT_APOS_KW_CONTEXT +INT_APOS_KW_COPY_NS +INT_APOS_KW_COUNT +INT_APOS_KW_DECLARE +INT_APOS_KW_DEFAULT +INT_APOS_KW_DESCENDANT +INT_APOS_KW_DESCENDANT_OR_SELF +INT_APOS_KW_DESCENDING +INT_APOS_KW_DECIMAL_FORMAT +INT_APOS_KW_DIV +INT_APOS_KW_DOCUMENT +INT_APOS_KW_DOCUMENT_NODE +INT_APOS_KW_ELEMENT +INT_APOS_KW_ELSE +INT_APOS_KW_EMPTY +INT_APOS_KW_EMPTY_SEQUENCE +INT_APOS_KW_ENCODING +INT_APOS_KW_END +INT_APOS_KW_EQ +INT_APOS_KW_EVERY +INT_APOS_KW_EXCEPT +INT_APOS_KW_EXTERNAL +INT_APOS_KW_FOLLOWING +INT_APOS_KW_FOLLOWING_SIBLING +INT_APOS_KW_FOR +INT_APOS_KW_FUNCTION +INT_APOS_KW_GE +INT_APOS_KW_GREATEST +INT_APOS_KW_GROUP +INT_APOS_KW_GT +INT_APOS_KW_IDIV +INT_APOS_KW_IF +INT_APOS_KW_IMPORT +INT_APOS_KW_IN +INT_APOS_KW_INHERIT +INT_APOS_KW_INSTANCE +INT_APOS_KW_INTERSECT +INT_APOS_KW_IS +INT_APOS_KW_ITEM +INT_APOS_KW_LAX +INT_APOS_KW_LE +INT_APOS_KW_LEAST +INT_APOS_KW_LET +INT_APOS_KW_LT +INT_APOS_KW_MAP +INT_APOS_KW_MOD +INT_APOS_KW_MODULE +INT_APOS_KW_NAMESPACE +INT_APOS_KW_NE +INT_APOS_KW_NEXT +INT_APOS_KW_NAMESPACE_NODE +INT_APOS_KW_NO_INHERIT +INT_APOS_KW_NO_PRESERVE +INT_APOS_KW_NODE +INT_APOS_KW_OF +INT_APOS_KW_ONLY +INT_APOS_KW_OPTION +INT_APOS_KW_OR +INT_APOS_KW_ORDER +INT_APOS_KW_ORDERED +INT_APOS_KW_ORDERING +INT_APOS_KW_PARENT +INT_APOS_KW_PRECEDING +INT_APOS_KW_PRECEDING_SIBLING +INT_APOS_KW_PRESERVE +INT_APOS_KW_PREVIOUS +INT_APOS_KW_PI +INT_APOS_KW_RETURN +INT_APOS_KW_SATISFIES +INT_APOS_KW_SCHEMA +INT_APOS_KW_SCHEMA_ATTR +INT_APOS_KW_SCHEMA_ELEM +INT_APOS_KW_SELF +INT_APOS_KW_SLIDING +INT_APOS_KW_SOME +INT_APOS_KW_STABLE +INT_APOS_KW_START +INT_APOS_KW_STRICT +INT_APOS_KW_STRIP +INT_APOS_KW_SWITCH +INT_APOS_KW_TEXT +INT_APOS_KW_THEN +INT_APOS_KW_TO +INT_APOS_KW_TREAT +INT_APOS_KW_TRY +INT_APOS_KW_TUMBLING +INT_APOS_KW_TYPE +INT_APOS_KW_TYPESWITCH +INT_APOS_KW_UNION +INT_APOS_KW_UNORDERED +INT_APOS_KW_UPDATE +INT_APOS_KW_VALIDATE +INT_APOS_KW_VARIABLE +INT_APOS_KW_VERSION +INT_APOS_KW_WHEN +INT_APOS_KW_WHERE +INT_APOS_KW_WINDOW +INT_APOS_KW_XQUERY +INT_APOS_KW_ARRAY_NODE +INT_APOS_KW_BOOLEAN_NODE +INT_APOS_KW_NULL_NODE +INT_APOS_KW_NUMBER_NODE +INT_APOS_KW_OBJECT_NODE +INT_APOS_KW_REPLACE +INT_APOS_KW_WITH +INT_APOS_KW_VALUE +INT_APOS_KW_INSERT +INT_APOS_KW_INTO +INT_APOS_KW_DELETE +INT_APOS_KW_RENAME +INT_APOS_URIQualifiedName +INT_APOS_FullQName +INT_APOS_NCNameWithLocalWildcard +INT_APOS_NCNameWithPrefixWildcard +INT_APOS_NCName +INT_APOS_XQDOC_COMMENT_START +INT_APOS_XQDOC_COMMENT_END +INT_APOS_XQDocComment +INT_APOS_XQComment +INT_APOS_CHAR +INT_APOS_ENTER_STRING +INT_APOS_EXIT_INTERPOLATION +INT_APOS_ContentChar + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE +STRING_MODE +QUOT_LITERAL_STRING +APOS_LITERAL_STRING +STRING_INTERPOLATION_MODE_QUOT +STRING_INTERPOLATION_MODE_APOS + +atn: +[4, 0, 203, 6735, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 2, 285, 7, 285, 2, 286, 7, 286, 2, 287, 7, 287, 2, 288, 7, 288, 2, 289, 7, 289, 2, 290, 7, 290, 2, 291, 7, 291, 2, 292, 7, 292, 2, 293, 7, 293, 2, 294, 7, 294, 2, 295, 7, 295, 2, 296, 7, 296, 2, 297, 7, 297, 2, 298, 7, 298, 2, 299, 7, 299, 2, 300, 7, 300, 2, 301, 7, 301, 2, 302, 7, 302, 2, 303, 7, 303, 2, 304, 7, 304, 2, 305, 7, 305, 2, 306, 7, 306, 2, 307, 7, 307, 2, 308, 7, 308, 2, 309, 7, 309, 2, 310, 7, 310, 2, 311, 7, 311, 2, 312, 7, 312, 2, 313, 7, 313, 2, 314, 7, 314, 2, 315, 7, 315, 2, 316, 7, 316, 2, 317, 7, 317, 2, 318, 7, 318, 2, 319, 7, 319, 2, 320, 7, 320, 2, 321, 7, 321, 2, 322, 7, 322, 2, 323, 7, 323, 2, 324, 7, 324, 2, 325, 7, 325, 2, 326, 7, 326, 2, 327, 7, 327, 2, 328, 7, 328, 2, 329, 7, 329, 2, 330, 7, 330, 2, 331, 7, 331, 2, 332, 7, 332, 2, 333, 7, 333, 2, 334, 7, 334, 2, 335, 7, 335, 2, 336, 7, 336, 2, 337, 7, 337, 2, 338, 7, 338, 2, 339, 7, 339, 2, 340, 7, 340, 2, 341, 7, 341, 2, 342, 7, 342, 2, 343, 7, 343, 2, 344, 7, 344, 2, 345, 7, 345, 2, 346, 7, 346, 2, 347, 7, 347, 2, 348, 7, 348, 2, 349, 7, 349, 2, 350, 7, 350, 2, 351, 7, 351, 2, 352, 7, 352, 2, 353, 7, 353, 2, 354, 7, 354, 2, 355, 7, 355, 2, 356, 7, 356, 2, 357, 7, 357, 2, 358, 7, 358, 2, 359, 7, 359, 2, 360, 7, 360, 2, 361, 7, 361, 2, 362, 7, 362, 2, 363, 7, 363, 2, 364, 7, 364, 2, 365, 7, 365, 2, 366, 7, 366, 2, 367, 7, 367, 2, 368, 7, 368, 2, 369, 7, 369, 2, 370, 7, 370, 2, 371, 7, 371, 2, 372, 7, 372, 2, 373, 7, 373, 2, 374, 7, 374, 2, 375, 7, 375, 2, 376, 7, 376, 2, 377, 7, 377, 2, 378, 7, 378, 2, 379, 7, 379, 2, 380, 7, 380, 2, 381, 7, 381, 2, 382, 7, 382, 2, 383, 7, 383, 2, 384, 7, 384, 2, 385, 7, 385, 2, 386, 7, 386, 2, 387, 7, 387, 2, 388, 7, 388, 2, 389, 7, 389, 2, 390, 7, 390, 2, 391, 7, 391, 2, 392, 7, 392, 2, 393, 7, 393, 2, 394, 7, 394, 2, 395, 7, 395, 2, 396, 7, 396, 2, 397, 7, 397, 2, 398, 7, 398, 2, 399, 7, 399, 2, 400, 7, 400, 2, 401, 7, 401, 2, 402, 7, 402, 2, 403, 7, 403, 2, 404, 7, 404, 2, 405, 7, 405, 2, 406, 7, 406, 2, 407, 7, 407, 2, 408, 7, 408, 2, 409, 7, 409, 2, 410, 7, 410, 2, 411, 7, 411, 2, 412, 7, 412, 2, 413, 7, 413, 2, 414, 7, 414, 2, 415, 7, 415, 2, 416, 7, 416, 2, 417, 7, 417, 2, 418, 7, 418, 2, 419, 7, 419, 2, 420, 7, 420, 2, 421, 7, 421, 2, 422, 7, 422, 2, 423, 7, 423, 2, 424, 7, 424, 2, 425, 7, 425, 2, 426, 7, 426, 2, 427, 7, 427, 2, 428, 7, 428, 2, 429, 7, 429, 2, 430, 7, 430, 2, 431, 7, 431, 2, 432, 7, 432, 2, 433, 7, 433, 2, 434, 7, 434, 2, 435, 7, 435, 2, 436, 7, 436, 2, 437, 7, 437, 2, 438, 7, 438, 2, 439, 7, 439, 2, 440, 7, 440, 2, 441, 7, 441, 2, 442, 7, 442, 2, 443, 7, 443, 2, 444, 7, 444, 2, 445, 7, 445, 2, 446, 7, 446, 2, 447, 7, 447, 2, 448, 7, 448, 2, 449, 7, 449, 2, 450, 7, 450, 2, 451, 7, 451, 2, 452, 7, 452, 2, 453, 7, 453, 2, 454, 7, 454, 2, 455, 7, 455, 2, 456, 7, 456, 2, 457, 7, 457, 2, 458, 7, 458, 2, 459, 7, 459, 2, 460, 7, 460, 2, 461, 7, 461, 2, 462, 7, 462, 2, 463, 7, 463, 2, 464, 7, 464, 2, 465, 7, 465, 2, 466, 7, 466, 2, 467, 7, 467, 2, 468, 7, 468, 2, 469, 7, 469, 2, 470, 7, 470, 2, 471, 7, 471, 2, 472, 7, 472, 2, 473, 7, 473, 2, 474, 7, 474, 2, 475, 7, 475, 2, 476, 7, 476, 2, 477, 7, 477, 2, 478, 7, 478, 2, 479, 7, 479, 2, 480, 7, 480, 2, 481, 7, 481, 2, 482, 7, 482, 2, 483, 7, 483, 2, 484, 7, 484, 2, 485, 7, 485, 2, 486, 7, 486, 2, 487, 7, 487, 2, 488, 7, 488, 2, 489, 7, 489, 2, 490, 7, 490, 2, 491, 7, 491, 2, 492, 7, 492, 2, 493, 7, 493, 2, 494, 7, 494, 2, 495, 7, 495, 2, 496, 7, 496, 2, 497, 7, 497, 2, 498, 7, 498, 2, 499, 7, 499, 2, 500, 7, 500, 2, 501, 7, 501, 2, 502, 7, 502, 2, 503, 7, 503, 2, 504, 7, 504, 2, 505, 7, 505, 2, 506, 7, 506, 2, 507, 7, 507, 2, 508, 7, 508, 2, 509, 7, 509, 2, 510, 7, 510, 2, 511, 7, 511, 2, 512, 7, 512, 2, 513, 7, 513, 2, 514, 7, 514, 2, 515, 7, 515, 2, 516, 7, 516, 2, 517, 7, 517, 2, 518, 7, 518, 2, 519, 7, 519, 2, 520, 7, 520, 2, 521, 7, 521, 2, 522, 7, 522, 2, 523, 7, 523, 2, 524, 7, 524, 2, 525, 7, 525, 2, 526, 7, 526, 2, 527, 7, 527, 2, 528, 7, 528, 2, 529, 7, 529, 2, 530, 7, 530, 2, 531, 7, 531, 2, 532, 7, 532, 2, 533, 7, 533, 2, 534, 7, 534, 2, 535, 7, 535, 2, 536, 7, 536, 2, 537, 7, 537, 2, 538, 7, 538, 2, 539, 7, 539, 2, 540, 7, 540, 2, 541, 7, 541, 2, 542, 7, 542, 2, 543, 7, 543, 2, 544, 7, 544, 2, 545, 7, 545, 2, 546, 7, 546, 2, 547, 7, 547, 2, 548, 7, 548, 2, 549, 7, 549, 2, 550, 7, 550, 2, 551, 7, 551, 2, 552, 7, 552, 2, 553, 7, 553, 2, 554, 7, 554, 2, 555, 7, 555, 2, 556, 7, 556, 2, 557, 7, 557, 2, 558, 7, 558, 2, 559, 7, 559, 2, 560, 7, 560, 2, 561, 7, 561, 2, 562, 7, 562, 2, 563, 7, 563, 2, 564, 7, 564, 2, 565, 7, 565, 2, 566, 7, 566, 2, 567, 7, 567, 2, 568, 7, 568, 2, 569, 7, 569, 2, 570, 7, 570, 2, 571, 7, 571, 2, 572, 7, 572, 2, 573, 7, 573, 2, 574, 7, 574, 2, 575, 7, 575, 2, 576, 7, 576, 2, 577, 7, 577, 2, 578, 7, 578, 2, 579, 7, 579, 2, 580, 7, 580, 2, 581, 7, 581, 2, 582, 7, 582, 2, 583, 7, 583, 2, 584, 7, 584, 2, 585, 7, 585, 2, 586, 7, 586, 2, 587, 7, 587, 2, 588, 7, 588, 2, 589, 7, 589, 2, 590, 7, 590, 2, 591, 7, 591, 2, 592, 7, 592, 2, 593, 7, 593, 2, 594, 7, 594, 2, 595, 7, 595, 2, 596, 7, 596, 2, 597, 7, 597, 2, 598, 7, 598, 2, 599, 7, 599, 2, 600, 7, 600, 2, 601, 7, 601, 2, 602, 7, 602, 2, 603, 7, 603, 2, 604, 7, 604, 2, 605, 7, 605, 2, 606, 7, 606, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1228, 8, 1, 10, 1, 12, 1, 1231, 9, 1, 3, 1, 1233, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 1240, 8, 2, 10, 2, 12, 2, 1243, 9, 2, 3, 2, 1245, 8, 2, 3, 2, 1247, 8, 2, 1, 2, 1, 2, 3, 2, 1251, 8, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 1377, 8, 3, 1, 4, 4, 4, 1380, 8, 4, 11, 4, 12, 4, 1381, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 1400, 8, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 1408, 8, 6, 11, 6, 12, 6, 1409, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 1418, 8, 6, 11, 6, 12, 6, 1419, 1, 6, 3, 6, 1423, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 1441, 8, 9, 10, 9, 12, 9, 1444, 9, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 1458, 8, 10, 10, 10, 12, 10, 1461, 9, 10, 3, 10, 1463, 8, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 1474, 8, 11, 10, 11, 12, 11, 1477, 9, 11, 3, 11, 1479, 8, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 1495, 8, 12, 10, 12, 12, 12, 1498, 9, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 1508, 8, 13, 1, 13, 1, 13, 1, 13, 3, 13, 1513, 8, 13, 1, 13, 1, 13, 1, 13, 5, 13, 1518, 8, 13, 10, 13, 12, 13, 1521, 9, 13, 3, 13, 1523, 8, 13, 1, 13, 1, 13, 1, 13, 1, 14, 4, 14, 1529, 8, 14, 11, 14, 12, 14, 1530, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 5, 180, 2642, 8, 180, 10, 180, 12, 180, 2645, 9, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 5, 184, 2664, 8, 184, 10, 184, 12, 184, 2667, 9, 184, 1, 185, 3, 185, 2670, 8, 185, 1, 186, 1, 186, 3, 186, 2674, 8, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 4, 188, 2681, 8, 188, 11, 188, 12, 188, 2682, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 5, 189, 2693, 8, 189, 10, 189, 12, 189, 2696, 9, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 5, 190, 2710, 8, 190, 10, 190, 12, 190, 2713, 9, 190, 1, 190, 5, 190, 2716, 8, 190, 10, 190, 12, 190, 2719, 9, 190, 1, 190, 4, 190, 2722, 8, 190, 11, 190, 12, 190, 2723, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 206, 1, 206, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 3, 207, 2815, 8, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 208, 1, 208, 4, 208, 2825, 8, 208, 11, 208, 12, 208, 2826, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 4, 208, 2835, 8, 208, 11, 208, 12, 208, 2836, 1, 208, 3, 208, 2840, 8, 208, 1, 208, 1, 208, 1, 209, 1, 209, 1, 209, 1, 209, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 211, 1, 211, 1, 211, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 3, 216, 2893, 8, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 4, 217, 2903, 8, 217, 11, 217, 12, 217, 2904, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 4, 217, 2913, 8, 217, 11, 217, 12, 217, 2914, 1, 217, 3, 217, 2918, 8, 217, 1, 217, 1, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 5, 220, 2935, 8, 220, 10, 220, 12, 220, 2938, 9, 220, 3, 220, 2940, 8, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 5, 221, 2949, 8, 221, 10, 221, 12, 221, 2952, 9, 221, 3, 221, 2954, 8, 221, 3, 221, 2956, 8, 221, 1, 221, 1, 221, 3, 221, 2960, 8, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 3, 222, 3088, 8, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 3, 223, 3108, 8, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 4, 224, 3118, 8, 224, 11, 224, 12, 224, 3119, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 4, 224, 3128, 8, 224, 11, 224, 12, 224, 3129, 1, 224, 3, 224, 3133, 8, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 5, 228, 3161, 8, 228, 10, 228, 12, 228, 3164, 9, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 5, 229, 3180, 8, 229, 10, 229, 12, 229, 3183, 9, 229, 3, 229, 3185, 8, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 5, 230, 3198, 8, 230, 10, 230, 12, 230, 3201, 9, 230, 3, 230, 3203, 8, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 5, 231, 3221, 8, 231, 10, 231, 12, 231, 3224, 9, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 232, 3, 232, 3236, 8, 232, 1, 232, 1, 232, 1, 232, 3, 232, 3241, 8, 232, 1, 232, 1, 232, 1, 232, 5, 232, 3246, 8, 232, 10, 232, 12, 232, 3249, 9, 232, 3, 232, 3251, 8, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 233, 4, 233, 3259, 8, 233, 11, 233, 12, 233, 3260, 1, 233, 1, 233, 1, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 238, 1, 238, 1, 238, 1, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 259, 1, 259, 1, 259, 1, 259, 1, 260, 1, 260, 1, 260, 1, 260, 1, 261, 1, 261, 1, 261, 1, 261, 1, 262, 1, 262, 1, 262, 1, 262, 1, 263, 1, 263, 1, 263, 1, 263, 1, 264, 1, 264, 1, 264, 1, 264, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 266, 1, 266, 1, 266, 1, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 314, 1, 314, 1, 314, 1, 314, 1, 314, 1, 314, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 316, 1, 316, 1, 316, 1, 316, 1, 316, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 319, 1, 319, 1, 319, 1, 319, 1, 319, 1, 320, 1, 320, 1, 320, 1, 320, 1, 320, 1, 320, 1, 320, 1, 321, 1, 321, 1, 321, 1, 321, 1, 321, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 327, 1, 327, 1, 327, 1, 327, 1, 327, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 1, 330, 1, 330, 1, 330, 1, 330, 1, 330, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 332, 1, 332, 1, 332, 1, 332, 1, 332, 1, 332, 1, 333, 1, 333, 1, 333, 1, 333, 1, 333, 1, 334, 1, 334, 1, 334, 1, 334, 1, 334, 1, 334, 1, 335, 1, 335, 1, 335, 1, 335, 1, 335, 1, 335, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 343, 1, 343, 1, 343, 1, 343, 1, 343, 1, 343, 1, 343, 1, 344, 1, 344, 1, 344, 1, 344, 1, 344, 1, 345, 1, 345, 1, 345, 1, 345, 1, 345, 1, 345, 1, 345, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 347, 1, 347, 1, 347, 1, 347, 1, 347, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 362, 1, 362, 1, 362, 1, 362, 1, 362, 1, 362, 1, 362, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 370, 1, 370, 1, 370, 1, 370, 1, 370, 1, 370, 1, 370, 1, 371, 1, 371, 1, 371, 1, 371, 1, 371, 1, 371, 1, 371, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 374, 1, 374, 1, 374, 1, 374, 1, 374, 1, 374, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 384, 1, 384, 1, 384, 1, 384, 1, 384, 1, 384, 1, 384, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 394, 1, 394, 1, 394, 1, 394, 1, 394, 1, 394, 1, 394, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 397, 1, 397, 1, 397, 1, 397, 1, 397, 1, 397, 1, 397, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 400, 1, 400, 1, 400, 1, 400, 1, 400, 5, 400, 4712, 8, 400, 10, 400, 12, 400, 4715, 9, 400, 1, 400, 1, 400, 1, 400, 1, 400, 1, 400, 1, 401, 1, 401, 1, 401, 1, 401, 1, 401, 1, 401, 1, 402, 1, 402, 1, 402, 1, 402, 1, 402, 1, 402, 1, 403, 1, 403, 1, 403, 1, 403, 1, 403, 1, 403, 1, 404, 1, 404, 5, 404, 4742, 8, 404, 10, 404, 12, 404, 4745, 9, 404, 1, 404, 1, 404, 1, 405, 1, 405, 1, 405, 1, 405, 1, 405, 1, 405, 1, 406, 4, 406, 4756, 8, 406, 11, 406, 12, 406, 4757, 1, 406, 1, 406, 1, 406, 1, 406, 1, 407, 1, 407, 1, 407, 1, 407, 1, 407, 1, 407, 5, 407, 4770, 8, 407, 10, 407, 12, 407, 4773, 9, 407, 1, 407, 1, 407, 1, 407, 1, 407, 1, 407, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 5, 408, 4789, 8, 408, 10, 408, 12, 408, 4792, 9, 408, 1, 408, 5, 408, 4795, 8, 408, 10, 408, 12, 408, 4798, 9, 408, 1, 408, 4, 408, 4801, 8, 408, 11, 408, 12, 408, 4802, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 409, 1, 409, 1, 409, 1, 409, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 411, 1, 411, 1, 411, 1, 411, 1, 411, 1, 411, 1, 412, 1, 412, 1, 412, 1, 412, 1, 413, 1, 413, 1, 413, 1, 413, 1, 414, 1, 414, 1, 414, 1, 414, 1, 414, 5, 414, 4840, 8, 414, 10, 414, 12, 414, 4843, 9, 414, 3, 414, 4845, 8, 414, 1, 414, 1, 414, 1, 415, 1, 415, 1, 415, 1, 415, 1, 415, 5, 415, 4854, 8, 415, 10, 415, 12, 415, 4857, 9, 415, 3, 415, 4859, 8, 415, 3, 415, 4861, 8, 415, 1, 415, 1, 415, 3, 415, 4865, 8, 415, 1, 415, 1, 415, 1, 415, 1, 415, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 3, 416, 4993, 8, 416, 1, 416, 1, 416, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 3, 417, 5013, 8, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 418, 1, 418, 1, 418, 1, 418, 4, 418, 5023, 8, 418, 11, 418, 12, 418, 5024, 1, 418, 1, 418, 1, 418, 1, 418, 1, 418, 1, 418, 4, 418, 5033, 8, 418, 11, 418, 12, 418, 5034, 1, 418, 3, 418, 5038, 8, 418, 1, 418, 1, 418, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 420, 1, 420, 1, 420, 1, 420, 1, 420, 1, 421, 1, 421, 1, 421, 1, 421, 1, 421, 1, 421, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 5, 422, 5066, 8, 422, 10, 422, 12, 422, 5069, 9, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 5, 423, 5085, 8, 423, 10, 423, 12, 423, 5088, 9, 423, 3, 423, 5090, 8, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 5, 424, 5103, 8, 424, 10, 424, 12, 424, 5106, 9, 424, 3, 424, 5108, 8, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 5, 425, 5126, 8, 425, 10, 425, 12, 425, 5129, 9, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 426, 1, 426, 1, 426, 1, 426, 3, 426, 5141, 8, 426, 1, 426, 1, 426, 1, 426, 3, 426, 5146, 8, 426, 1, 426, 1, 426, 1, 426, 5, 426, 5151, 8, 426, 10, 426, 12, 426, 5154, 9, 426, 3, 426, 5156, 8, 426, 1, 426, 1, 426, 1, 426, 1, 426, 1, 426, 1, 427, 4, 427, 5164, 8, 427, 11, 427, 12, 427, 5165, 1, 427, 1, 427, 1, 427, 1, 428, 1, 428, 1, 428, 1, 428, 1, 429, 1, 429, 1, 429, 1, 429, 1, 429, 1, 430, 1, 430, 1, 430, 1, 430, 1, 431, 1, 431, 1, 431, 1, 431, 1, 432, 1, 432, 1, 432, 1, 432, 1, 433, 1, 433, 1, 433, 1, 433, 1, 434, 1, 434, 1, 434, 1, 434, 1, 434, 1, 435, 1, 435, 1, 435, 1, 435, 1, 435, 1, 435, 1, 436, 1, 436, 1, 436, 1, 436, 1, 436, 1, 436, 1, 437, 1, 437, 1, 437, 1, 437, 1, 438, 1, 438, 1, 438, 1, 438, 1, 439, 1, 439, 1, 439, 1, 439, 1, 440, 1, 440, 1, 440, 1, 440, 1, 441, 1, 441, 1, 441, 1, 441, 1, 442, 1, 442, 1, 442, 1, 442, 1, 442, 1, 443, 1, 443, 1, 443, 1, 443, 1, 444, 1, 444, 1, 444, 1, 444, 1, 444, 1, 445, 1, 445, 1, 445, 1, 445, 1, 446, 1, 446, 1, 446, 1, 446, 1, 447, 1, 447, 1, 447, 1, 447, 1, 447, 1, 448, 1, 448, 1, 448, 1, 448, 1, 449, 1, 449, 1, 449, 1, 449, 1, 450, 1, 450, 1, 450, 1, 450, 1, 451, 1, 451, 1, 451, 1, 451, 1, 452, 1, 452, 1, 452, 1, 452, 1, 453, 1, 453, 1, 453, 1, 453, 1, 454, 1, 454, 1, 454, 1, 454, 1, 455, 1, 455, 1, 455, 1, 455, 1, 456, 1, 456, 1, 456, 1, 456, 1, 457, 1, 457, 1, 457, 1, 457, 1, 458, 1, 458, 1, 458, 1, 458, 1, 459, 1, 459, 1, 459, 1, 459, 1, 459, 1, 460, 1, 460, 1, 460, 1, 460, 1, 461, 1, 461, 1, 461, 1, 461, 1, 461, 1, 462, 1, 462, 1, 462, 1, 462, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 466, 1, 466, 1, 466, 1, 466, 1, 466, 1, 466, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 468, 1, 468, 1, 468, 1, 468, 1, 468, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 470, 1, 470, 1, 470, 1, 470, 1, 470, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 475, 1, 475, 1, 475, 1, 475, 1, 475, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 477, 1, 477, 1, 477, 1, 477, 1, 477, 1, 477, 1, 477, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 493, 1, 493, 1, 493, 1, 493, 1, 493, 1, 493, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 501, 1, 501, 1, 501, 1, 501, 1, 501, 1, 501, 1, 502, 1, 502, 1, 502, 1, 502, 1, 502, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 508, 1, 508, 1, 508, 1, 508, 1, 508, 1, 508, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 510, 1, 510, 1, 510, 1, 510, 1, 510, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 513, 1, 513, 1, 513, 1, 513, 1, 513, 1, 514, 1, 514, 1, 514, 1, 514, 1, 514, 1, 514, 1, 514, 1, 515, 1, 515, 1, 515, 1, 515, 1, 515, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 517, 1, 517, 1, 517, 1, 517, 1, 517, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 521, 1, 521, 1, 521, 1, 521, 1, 521, 1, 522, 1, 522, 1, 522, 1, 522, 1, 522, 1, 522, 1, 522, 1, 523, 1, 523, 1, 523, 1, 523, 1, 523, 1, 523, 1, 524, 1, 524, 1, 524, 1, 524, 1, 524, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 526, 1, 526, 1, 526, 1, 526, 1, 526, 1, 526, 1, 527, 1, 527, 1, 527, 1, 527, 1, 527, 1, 528, 1, 528, 1, 528, 1, 528, 1, 528, 1, 528, 1, 529, 1, 529, 1, 529, 1, 529, 1, 529, 1, 529, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 532, 1, 532, 1, 532, 1, 532, 1, 532, 1, 533, 1, 533, 1, 533, 1, 533, 1, 533, 1, 533, 1, 533, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 538, 1, 538, 1, 538, 1, 538, 1, 538, 1, 539, 1, 539, 1, 539, 1, 539, 1, 539, 1, 539, 1, 539, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 541, 1, 541, 1, 541, 1, 541, 1, 541, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 556, 1, 556, 1, 556, 1, 556, 1, 556, 1, 556, 1, 556, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 558, 1, 558, 1, 558, 1, 558, 1, 558, 1, 558, 1, 558, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 564, 1, 564, 1, 564, 1, 564, 1, 564, 1, 564, 1, 564, 1, 565, 1, 565, 1, 565, 1, 565, 1, 565, 1, 565, 1, 565, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 568, 1, 568, 1, 568, 1, 568, 1, 568, 1, 568, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 588, 1, 588, 1, 588, 1, 588, 1, 588, 1, 588, 1, 588, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 594, 1, 594, 1, 594, 1, 594, 1, 594, 5, 594, 6617, 8, 594, 10, 594, 12, 594, 6620, 9, 594, 1, 594, 1, 594, 1, 594, 1, 594, 1, 594, 1, 595, 1, 595, 1, 595, 1, 595, 1, 595, 1, 595, 1, 596, 1, 596, 1, 596, 1, 596, 1, 596, 1, 596, 1, 597, 1, 597, 1, 597, 1, 597, 1, 597, 1, 597, 1, 598, 1, 598, 5, 598, 6647, 8, 598, 10, 598, 12, 598, 6650, 9, 598, 1, 598, 1, 598, 1, 599, 1, 599, 1, 599, 1, 599, 1, 599, 1, 599, 1, 600, 4, 600, 6661, 8, 600, 11, 600, 12, 600, 6662, 1, 600, 1, 600, 1, 600, 1, 600, 1, 601, 1, 601, 1, 601, 1, 601, 1, 601, 1, 601, 5, 601, 6675, 8, 601, 10, 601, 12, 601, 6678, 9, 601, 1, 601, 1, 601, 1, 601, 1, 601, 1, 601, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 5, 602, 6694, 8, 602, 10, 602, 12, 602, 6697, 9, 602, 1, 602, 5, 602, 6700, 8, 602, 10, 602, 12, 602, 6703, 9, 602, 1, 602, 4, 602, 6706, 8, 602, 11, 602, 12, 602, 6707, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 603, 1, 603, 1, 603, 1, 603, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 605, 1, 605, 1, 605, 1, 605, 1, 605, 1, 605, 1, 606, 1, 606, 1, 606, 1, 606, 12, 1459, 1475, 1496, 1519, 3181, 3199, 3222, 3247, 5086, 5104, 5127, 5152, 0, 607, 6, 5, 8, 6, 10, 7, 12, 8, 14, 0, 16, 9, 18, 10, 20, 11, 22, 12, 24, 13, 26, 14, 28, 15, 30, 16, 32, 17, 34, 18, 36, 19, 38, 20, 40, 21, 42, 22, 44, 23, 46, 24, 48, 25, 50, 26, 52, 27, 54, 28, 56, 29, 58, 30, 60, 31, 62, 32, 64, 33, 66, 34, 68, 35, 70, 36, 72, 37, 74, 38, 76, 39, 78, 40, 80, 41, 82, 42, 84, 43, 86, 44, 88, 45, 90, 46, 92, 47, 94, 48, 96, 49, 98, 50, 100, 51, 102, 52, 104, 53, 106, 54, 108, 55, 110, 56, 112, 57, 114, 58, 116, 59, 118, 60, 120, 61, 122, 62, 124, 63, 126, 64, 128, 65, 130, 66, 132, 67, 134, 68, 136, 69, 138, 70, 140, 71, 142, 72, 144, 73, 146, 74, 148, 75, 150, 76, 152, 77, 154, 78, 156, 79, 158, 80, 160, 81, 162, 82, 164, 83, 166, 84, 168, 85, 170, 86, 172, 87, 174, 88, 176, 89, 178, 90, 180, 91, 182, 92, 184, 93, 186, 94, 188, 95, 190, 96, 192, 97, 194, 98, 196, 99, 198, 100, 200, 101, 202, 102, 204, 103, 206, 104, 208, 105, 210, 106, 212, 107, 214, 108, 216, 109, 218, 110, 220, 111, 222, 112, 224, 113, 226, 114, 228, 115, 230, 116, 232, 117, 234, 118, 236, 119, 238, 120, 240, 121, 242, 122, 244, 123, 246, 124, 248, 125, 250, 126, 252, 127, 254, 128, 256, 129, 258, 130, 260, 131, 262, 132, 264, 133, 266, 134, 268, 135, 270, 136, 272, 137, 274, 138, 276, 139, 278, 140, 280, 141, 282, 142, 284, 143, 286, 144, 288, 145, 290, 146, 292, 147, 294, 148, 296, 149, 298, 150, 300, 151, 302, 152, 304, 153, 306, 154, 308, 155, 310, 156, 312, 157, 314, 158, 316, 159, 318, 160, 320, 161, 322, 162, 324, 163, 326, 164, 328, 165, 330, 166, 332, 167, 334, 168, 336, 169, 338, 170, 340, 171, 342, 172, 344, 173, 346, 174, 348, 175, 350, 176, 352, 177, 354, 178, 356, 179, 358, 180, 360, 181, 362, 182, 364, 183, 366, 184, 368, 185, 370, 186, 372, 187, 374, 188, 376, 0, 378, 0, 380, 189, 382, 190, 384, 191, 386, 192, 388, 193, 390, 194, 392, 195, 394, 196, 396, 197, 398, 0, 400, 0, 402, 0, 404, 198, 406, 199, 408, 200, 410, 0, 412, 201, 414, 202, 416, 0, 418, 0, 420, 0, 422, 0, 424, 0, 426, 203, 428, 0, 430, 0, 432, 0, 434, 0, 436, 0, 438, 0, 440, 0, 442, 0, 444, 0, 446, 0, 448, 0, 450, 0, 452, 0, 454, 0, 456, 0, 458, 0, 460, 0, 462, 0, 464, 0, 466, 0, 468, 0, 470, 0, 472, 0, 474, 0, 476, 0, 478, 0, 480, 0, 482, 0, 484, 0, 486, 0, 488, 0, 490, 0, 492, 0, 494, 0, 496, 0, 498, 0, 500, 0, 502, 0, 504, 0, 506, 0, 508, 0, 510, 0, 512, 0, 514, 0, 516, 0, 518, 0, 520, 0, 522, 0, 524, 0, 526, 0, 528, 0, 530, 0, 532, 0, 534, 0, 536, 0, 538, 0, 540, 0, 542, 0, 544, 0, 546, 0, 548, 0, 550, 0, 552, 0, 554, 0, 556, 0, 558, 0, 560, 0, 562, 0, 564, 0, 566, 0, 568, 0, 570, 0, 572, 0, 574, 0, 576, 0, 578, 0, 580, 0, 582, 0, 584, 0, 586, 0, 588, 0, 590, 0, 592, 0, 594, 0, 596, 0, 598, 0, 600, 0, 602, 0, 604, 0, 606, 0, 608, 0, 610, 0, 612, 0, 614, 0, 616, 0, 618, 0, 620, 0, 622, 0, 624, 0, 626, 0, 628, 0, 630, 0, 632, 0, 634, 0, 636, 0, 638, 0, 640, 0, 642, 0, 644, 0, 646, 0, 648, 0, 650, 0, 652, 0, 654, 0, 656, 0, 658, 0, 660, 0, 662, 0, 664, 0, 666, 0, 668, 0, 670, 0, 672, 0, 674, 0, 676, 0, 678, 0, 680, 0, 682, 0, 684, 0, 686, 0, 688, 0, 690, 0, 692, 0, 694, 0, 696, 0, 698, 0, 700, 0, 702, 0, 704, 0, 706, 0, 708, 0, 710, 0, 712, 0, 714, 0, 716, 0, 718, 0, 720, 0, 722, 0, 724, 0, 726, 0, 728, 0, 730, 0, 732, 0, 734, 0, 736, 0, 738, 0, 740, 0, 742, 0, 744, 0, 746, 0, 748, 0, 750, 0, 752, 0, 754, 0, 756, 0, 758, 0, 760, 0, 762, 0, 764, 0, 766, 0, 768, 0, 770, 0, 772, 0, 774, 0, 776, 0, 778, 0, 780, 0, 782, 0, 784, 0, 786, 0, 788, 0, 790, 0, 792, 0, 794, 0, 796, 0, 798, 0, 800, 0, 802, 0, 804, 0, 806, 0, 808, 0, 810, 0, 812, 0, 814, 0, 816, 0, 818, 0, 820, 0, 822, 0, 824, 0, 826, 0, 828, 0, 830, 0, 832, 0, 834, 0, 836, 0, 838, 0, 840, 0, 842, 0, 844, 0, 846, 0, 848, 0, 850, 0, 852, 0, 854, 0, 856, 0, 858, 0, 860, 0, 862, 0, 864, 0, 866, 0, 868, 0, 870, 0, 872, 0, 874, 0, 876, 0, 878, 0, 880, 0, 882, 0, 884, 0, 886, 0, 888, 0, 890, 0, 892, 0, 894, 0, 896, 0, 898, 0, 900, 0, 902, 0, 904, 0, 906, 0, 908, 0, 910, 0, 912, 0, 914, 0, 916, 0, 918, 0, 920, 0, 922, 0, 924, 0, 926, 0, 928, 0, 930, 0, 932, 0, 934, 0, 936, 0, 938, 0, 940, 0, 942, 0, 944, 0, 946, 0, 948, 0, 950, 0, 952, 0, 954, 0, 956, 0, 958, 0, 960, 0, 962, 0, 964, 0, 966, 0, 968, 0, 970, 0, 972, 0, 974, 0, 976, 0, 978, 0, 980, 0, 982, 0, 984, 0, 986, 0, 988, 0, 990, 0, 992, 0, 994, 0, 996, 0, 998, 0, 1000, 0, 1002, 0, 1004, 0, 1006, 0, 1008, 0, 1010, 0, 1012, 0, 1014, 0, 1016, 0, 1018, 0, 1020, 0, 1022, 0, 1024, 0, 1026, 0, 1028, 0, 1030, 0, 1032, 0, 1034, 0, 1036, 0, 1038, 0, 1040, 0, 1042, 0, 1044, 0, 1046, 0, 1048, 0, 1050, 0, 1052, 0, 1054, 0, 1056, 0, 1058, 0, 1060, 0, 1062, 0, 1064, 0, 1066, 0, 1068, 0, 1070, 0, 1072, 0, 1074, 0, 1076, 0, 1078, 0, 1080, 0, 1082, 0, 1084, 0, 1086, 0, 1088, 0, 1090, 0, 1092, 0, 1094, 0, 1096, 0, 1098, 0, 1100, 0, 1102, 0, 1104, 0, 1106, 0, 1108, 0, 1110, 0, 1112, 0, 1114, 0, 1116, 0, 1118, 0, 1120, 0, 1122, 0, 1124, 0, 1126, 0, 1128, 0, 1130, 0, 1132, 0, 1134, 0, 1136, 0, 1138, 0, 1140, 0, 1142, 0, 1144, 0, 1146, 0, 1148, 0, 1150, 0, 1152, 0, 1154, 0, 1156, 0, 1158, 0, 1160, 0, 1162, 0, 1164, 0, 1166, 0, 1168, 0, 1170, 0, 1172, 0, 1174, 0, 1176, 0, 1178, 0, 1180, 0, 1182, 0, 1184, 0, 1186, 0, 1188, 0, 1190, 0, 1192, 0, 1194, 0, 1196, 0, 1198, 0, 1200, 0, 1202, 0, 1204, 0, 1206, 0, 1208, 0, 1210, 0, 1212, 0, 1214, 0, 1216, 0, 1218, 0, 6, 0, 1, 2, 3, 4, 5, 21, 1, 0, 48, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 45, 45, 2, 0, 88, 88, 120, 120, 2, 0, 77, 77, 109, 109, 2, 0, 76, 76, 108, 108, 3, 0, 9, 10, 13, 13, 32, 32, 3, 0, 38, 38, 123, 123, 125, 125, 14, 0, 65, 90, 95, 95, 97, 122, 192, 214, 216, 246, 248, 767, 880, 893, 895, 8191, 8204, 8205, 8304, 8591, 11264, 12271, 12289, 55295, 63744, 64975, 65008, 65533, 5, 0, 45, 46, 48, 57, 161, 191, 768, 879, 8255, 8256, 1, 0, 41, 41, 1, 0, 126, 126, 1, 0, 58, 58, 2, 0, 40, 40, 58, 58, 5, 0, 9, 10, 13, 13, 32, 57, 59, 55295, 57344, 65533, 5, 0, 34, 34, 38, 39, 60, 60, 123, 123, 125, 125, 8, 0, 9, 10, 13, 13, 32, 92, 94, 95, 97, 122, 124, 55295, 57344, 65533, 65536, 1114111, 4, 0, 34, 34, 38, 38, 123, 123, 125, 125, 3, 0, 38, 39, 123, 123, 125, 125, 6886, 0, 6, 1, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 90, 1, 0, 0, 0, 0, 92, 1, 0, 0, 0, 0, 94, 1, 0, 0, 0, 0, 96, 1, 0, 0, 0, 0, 98, 1, 0, 0, 0, 0, 100, 1, 0, 0, 0, 0, 102, 1, 0, 0, 0, 0, 104, 1, 0, 0, 0, 0, 106, 1, 0, 0, 0, 0, 108, 1, 0, 0, 0, 0, 110, 1, 0, 0, 0, 0, 112, 1, 0, 0, 0, 0, 114, 1, 0, 0, 0, 0, 116, 1, 0, 0, 0, 0, 118, 1, 0, 0, 0, 0, 120, 1, 0, 0, 0, 0, 122, 1, 0, 0, 0, 0, 124, 1, 0, 0, 0, 0, 126, 1, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 130, 1, 0, 0, 0, 0, 132, 1, 0, 0, 0, 0, 134, 1, 0, 0, 0, 0, 136, 1, 0, 0, 0, 0, 138, 1, 0, 0, 0, 0, 140, 1, 0, 0, 0, 0, 142, 1, 0, 0, 0, 0, 144, 1, 0, 0, 0, 0, 146, 1, 0, 0, 0, 0, 148, 1, 0, 0, 0, 0, 150, 1, 0, 0, 0, 0, 152, 1, 0, 0, 0, 0, 154, 1, 0, 0, 0, 0, 156, 1, 0, 0, 0, 0, 158, 1, 0, 0, 0, 0, 160, 1, 0, 0, 0, 0, 162, 1, 0, 0, 0, 0, 164, 1, 0, 0, 0, 0, 166, 1, 0, 0, 0, 0, 168, 1, 0, 0, 0, 0, 170, 1, 0, 0, 0, 0, 172, 1, 0, 0, 0, 0, 174, 1, 0, 0, 0, 0, 176, 1, 0, 0, 0, 0, 178, 1, 0, 0, 0, 0, 180, 1, 0, 0, 0, 0, 182, 1, 0, 0, 0, 0, 184, 1, 0, 0, 0, 0, 186, 1, 0, 0, 0, 0, 188, 1, 0, 0, 0, 0, 190, 1, 0, 0, 0, 0, 192, 1, 0, 0, 0, 0, 194, 1, 0, 0, 0, 0, 196, 1, 0, 0, 0, 0, 198, 1, 0, 0, 0, 0, 200, 1, 0, 0, 0, 0, 202, 1, 0, 0, 0, 0, 204, 1, 0, 0, 0, 0, 206, 1, 0, 0, 0, 0, 208, 1, 0, 0, 0, 0, 210, 1, 0, 0, 0, 0, 212, 1, 0, 0, 0, 0, 214, 1, 0, 0, 0, 0, 216, 1, 0, 0, 0, 0, 218, 1, 0, 0, 0, 0, 220, 1, 0, 0, 0, 0, 222, 1, 0, 0, 0, 0, 224, 1, 0, 0, 0, 0, 226, 1, 0, 0, 0, 0, 228, 1, 0, 0, 0, 0, 230, 1, 0, 0, 0, 0, 232, 1, 0, 0, 0, 0, 234, 1, 0, 0, 0, 0, 236, 1, 0, 0, 0, 0, 238, 1, 0, 0, 0, 0, 240, 1, 0, 0, 0, 0, 242, 1, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 246, 1, 0, 0, 0, 0, 248, 1, 0, 0, 0, 0, 250, 1, 0, 0, 0, 0, 252, 1, 0, 0, 0, 0, 254, 1, 0, 0, 0, 0, 256, 1, 0, 0, 0, 0, 258, 1, 0, 0, 0, 0, 260, 1, 0, 0, 0, 0, 262, 1, 0, 0, 0, 0, 264, 1, 0, 0, 0, 0, 266, 1, 0, 0, 0, 0, 268, 1, 0, 0, 0, 0, 270, 1, 0, 0, 0, 0, 272, 1, 0, 0, 0, 0, 274, 1, 0, 0, 0, 0, 276, 1, 0, 0, 0, 0, 278, 1, 0, 0, 0, 0, 280, 1, 0, 0, 0, 0, 282, 1, 0, 0, 0, 0, 284, 1, 0, 0, 0, 0, 286, 1, 0, 0, 0, 0, 288, 1, 0, 0, 0, 0, 290, 1, 0, 0, 0, 0, 292, 1, 0, 0, 0, 0, 294, 1, 0, 0, 0, 0, 296, 1, 0, 0, 0, 0, 298, 1, 0, 0, 0, 0, 300, 1, 0, 0, 0, 0, 302, 1, 0, 0, 0, 0, 304, 1, 0, 0, 0, 0, 306, 1, 0, 0, 0, 0, 308, 1, 0, 0, 0, 0, 310, 1, 0, 0, 0, 0, 312, 1, 0, 0, 0, 0, 314, 1, 0, 0, 0, 0, 316, 1, 0, 0, 0, 0, 318, 1, 0, 0, 0, 0, 320, 1, 0, 0, 0, 0, 322, 1, 0, 0, 0, 0, 324, 1, 0, 0, 0, 0, 326, 1, 0, 0, 0, 0, 328, 1, 0, 0, 0, 0, 330, 1, 0, 0, 0, 0, 332, 1, 0, 0, 0, 0, 334, 1, 0, 0, 0, 0, 336, 1, 0, 0, 0, 0, 338, 1, 0, 0, 0, 0, 340, 1, 0, 0, 0, 0, 342, 1, 0, 0, 0, 0, 344, 1, 0, 0, 0, 0, 346, 1, 0, 0, 0, 0, 348, 1, 0, 0, 0, 0, 350, 1, 0, 0, 0, 0, 352, 1, 0, 0, 0, 0, 354, 1, 0, 0, 0, 0, 356, 1, 0, 0, 0, 0, 358, 1, 0, 0, 0, 0, 360, 1, 0, 0, 0, 0, 362, 1, 0, 0, 0, 0, 364, 1, 0, 0, 0, 0, 366, 1, 0, 0, 0, 0, 368, 1, 0, 0, 0, 0, 370, 1, 0, 0, 0, 0, 372, 1, 0, 0, 0, 0, 374, 1, 0, 0, 0, 0, 380, 1, 0, 0, 0, 0, 382, 1, 0, 0, 0, 0, 384, 1, 0, 0, 0, 0, 386, 1, 0, 0, 0, 0, 388, 1, 0, 0, 0, 0, 390, 1, 0, 0, 0, 0, 392, 1, 0, 0, 0, 0, 394, 1, 0, 0, 0, 1, 396, 1, 0, 0, 0, 1, 398, 1, 0, 0, 0, 1, 400, 1, 0, 0, 0, 1, 402, 1, 0, 0, 0, 1, 404, 1, 0, 0, 0, 1, 406, 1, 0, 0, 0, 2, 408, 1, 0, 0, 0, 2, 410, 1, 0, 0, 0, 2, 412, 1, 0, 0, 0, 2, 414, 1, 0, 0, 0, 2, 416, 1, 0, 0, 0, 2, 418, 1, 0, 0, 0, 2, 420, 1, 0, 0, 0, 2, 422, 1, 0, 0, 0, 2, 424, 1, 0, 0, 0, 3, 426, 1, 0, 0, 0, 3, 428, 1, 0, 0, 0, 3, 430, 1, 0, 0, 0, 3, 432, 1, 0, 0, 0, 3, 434, 1, 0, 0, 0, 3, 436, 1, 0, 0, 0, 3, 438, 1, 0, 0, 0, 3, 440, 1, 0, 0, 0, 3, 442, 1, 0, 0, 0, 4, 444, 1, 0, 0, 0, 4, 446, 1, 0, 0, 0, 4, 448, 1, 0, 0, 0, 4, 450, 1, 0, 0, 0, 4, 452, 1, 0, 0, 0, 4, 454, 1, 0, 0, 0, 4, 456, 1, 0, 0, 0, 4, 458, 1, 0, 0, 0, 4, 460, 1, 0, 0, 0, 4, 462, 1, 0, 0, 0, 4, 464, 1, 0, 0, 0, 4, 466, 1, 0, 0, 0, 4, 468, 1, 0, 0, 0, 4, 470, 1, 0, 0, 0, 4, 472, 1, 0, 0, 0, 4, 474, 1, 0, 0, 0, 4, 476, 1, 0, 0, 0, 4, 478, 1, 0, 0, 0, 4, 480, 1, 0, 0, 0, 4, 482, 1, 0, 0, 0, 4, 484, 1, 0, 0, 0, 4, 486, 1, 0, 0, 0, 4, 488, 1, 0, 0, 0, 4, 490, 1, 0, 0, 0, 4, 492, 1, 0, 0, 0, 4, 494, 1, 0, 0, 0, 4, 496, 1, 0, 0, 0, 4, 498, 1, 0, 0, 0, 4, 500, 1, 0, 0, 0, 4, 502, 1, 0, 0, 0, 4, 504, 1, 0, 0, 0, 4, 506, 1, 0, 0, 0, 4, 508, 1, 0, 0, 0, 4, 510, 1, 0, 0, 0, 4, 512, 1, 0, 0, 0, 4, 514, 1, 0, 0, 0, 4, 516, 1, 0, 0, 0, 4, 518, 1, 0, 0, 0, 4, 520, 1, 0, 0, 0, 4, 522, 1, 0, 0, 0, 4, 524, 1, 0, 0, 0, 4, 526, 1, 0, 0, 0, 4, 528, 1, 0, 0, 0, 4, 530, 1, 0, 0, 0, 4, 532, 1, 0, 0, 0, 4, 534, 1, 0, 0, 0, 4, 536, 1, 0, 0, 0, 4, 538, 1, 0, 0, 0, 4, 540, 1, 0, 0, 0, 4, 542, 1, 0, 0, 0, 4, 544, 1, 0, 0, 0, 4, 546, 1, 0, 0, 0, 4, 548, 1, 0, 0, 0, 4, 550, 1, 0, 0, 0, 4, 552, 1, 0, 0, 0, 4, 554, 1, 0, 0, 0, 4, 556, 1, 0, 0, 0, 4, 558, 1, 0, 0, 0, 4, 560, 1, 0, 0, 0, 4, 562, 1, 0, 0, 0, 4, 564, 1, 0, 0, 0, 4, 566, 1, 0, 0, 0, 4, 568, 1, 0, 0, 0, 4, 570, 1, 0, 0, 0, 4, 572, 1, 0, 0, 0, 4, 574, 1, 0, 0, 0, 4, 576, 1, 0, 0, 0, 4, 578, 1, 0, 0, 0, 4, 580, 1, 0, 0, 0, 4, 582, 1, 0, 0, 0, 4, 584, 1, 0, 0, 0, 4, 586, 1, 0, 0, 0, 4, 588, 1, 0, 0, 0, 4, 590, 1, 0, 0, 0, 4, 592, 1, 0, 0, 0, 4, 594, 1, 0, 0, 0, 4, 596, 1, 0, 0, 0, 4, 598, 1, 0, 0, 0, 4, 600, 1, 0, 0, 0, 4, 602, 1, 0, 0, 0, 4, 604, 1, 0, 0, 0, 4, 606, 1, 0, 0, 0, 4, 608, 1, 0, 0, 0, 4, 610, 1, 0, 0, 0, 4, 612, 1, 0, 0, 0, 4, 614, 1, 0, 0, 0, 4, 616, 1, 0, 0, 0, 4, 618, 1, 0, 0, 0, 4, 620, 1, 0, 0, 0, 4, 622, 1, 0, 0, 0, 4, 624, 1, 0, 0, 0, 4, 626, 1, 0, 0, 0, 4, 628, 1, 0, 0, 0, 4, 630, 1, 0, 0, 0, 4, 632, 1, 0, 0, 0, 4, 634, 1, 0, 0, 0, 4, 636, 1, 0, 0, 0, 4, 638, 1, 0, 0, 0, 4, 640, 1, 0, 0, 0, 4, 642, 1, 0, 0, 0, 4, 644, 1, 0, 0, 0, 4, 646, 1, 0, 0, 0, 4, 648, 1, 0, 0, 0, 4, 650, 1, 0, 0, 0, 4, 652, 1, 0, 0, 0, 4, 654, 1, 0, 0, 0, 4, 656, 1, 0, 0, 0, 4, 658, 1, 0, 0, 0, 4, 660, 1, 0, 0, 0, 4, 662, 1, 0, 0, 0, 4, 664, 1, 0, 0, 0, 4, 666, 1, 0, 0, 0, 4, 668, 1, 0, 0, 0, 4, 670, 1, 0, 0, 0, 4, 672, 1, 0, 0, 0, 4, 674, 1, 0, 0, 0, 4, 676, 1, 0, 0, 0, 4, 678, 1, 0, 0, 0, 4, 680, 1, 0, 0, 0, 4, 682, 1, 0, 0, 0, 4, 684, 1, 0, 0, 0, 4, 686, 1, 0, 0, 0, 4, 688, 1, 0, 0, 0, 4, 690, 1, 0, 0, 0, 4, 692, 1, 0, 0, 0, 4, 694, 1, 0, 0, 0, 4, 696, 1, 0, 0, 0, 4, 698, 1, 0, 0, 0, 4, 700, 1, 0, 0, 0, 4, 702, 1, 0, 0, 0, 4, 704, 1, 0, 0, 0, 4, 706, 1, 0, 0, 0, 4, 708, 1, 0, 0, 0, 4, 710, 1, 0, 0, 0, 4, 712, 1, 0, 0, 0, 4, 714, 1, 0, 0, 0, 4, 716, 1, 0, 0, 0, 4, 718, 1, 0, 0, 0, 4, 720, 1, 0, 0, 0, 4, 722, 1, 0, 0, 0, 4, 724, 1, 0, 0, 0, 4, 726, 1, 0, 0, 0, 4, 728, 1, 0, 0, 0, 4, 730, 1, 0, 0, 0, 4, 732, 1, 0, 0, 0, 4, 734, 1, 0, 0, 0, 4, 736, 1, 0, 0, 0, 4, 738, 1, 0, 0, 0, 4, 740, 1, 0, 0, 0, 4, 742, 1, 0, 0, 0, 4, 744, 1, 0, 0, 0, 4, 746, 1, 0, 0, 0, 4, 748, 1, 0, 0, 0, 4, 750, 1, 0, 0, 0, 4, 752, 1, 0, 0, 0, 4, 754, 1, 0, 0, 0, 4, 756, 1, 0, 0, 0, 4, 758, 1, 0, 0, 0, 4, 760, 1, 0, 0, 0, 4, 762, 1, 0, 0, 0, 4, 764, 1, 0, 0, 0, 4, 766, 1, 0, 0, 0, 4, 768, 1, 0, 0, 0, 4, 770, 1, 0, 0, 0, 4, 772, 1, 0, 0, 0, 4, 774, 1, 0, 0, 0, 4, 776, 1, 0, 0, 0, 4, 778, 1, 0, 0, 0, 4, 780, 1, 0, 0, 0, 4, 782, 1, 0, 0, 0, 4, 784, 1, 0, 0, 0, 4, 786, 1, 0, 0, 0, 4, 788, 1, 0, 0, 0, 4, 790, 1, 0, 0, 0, 4, 792, 1, 0, 0, 0, 4, 794, 1, 0, 0, 0, 4, 796, 1, 0, 0, 0, 4, 798, 1, 0, 0, 0, 4, 800, 1, 0, 0, 0, 4, 802, 1, 0, 0, 0, 4, 804, 1, 0, 0, 0, 4, 806, 1, 0, 0, 0, 4, 808, 1, 0, 0, 0, 4, 810, 1, 0, 0, 0, 4, 812, 1, 0, 0, 0, 4, 814, 1, 0, 0, 0, 4, 816, 1, 0, 0, 0, 4, 818, 1, 0, 0, 0, 4, 820, 1, 0, 0, 0, 4, 822, 1, 0, 0, 0, 4, 824, 1, 0, 0, 0, 4, 826, 1, 0, 0, 0, 4, 828, 1, 0, 0, 0, 4, 830, 1, 0, 0, 0, 5, 832, 1, 0, 0, 0, 5, 834, 1, 0, 0, 0, 5, 836, 1, 0, 0, 0, 5, 838, 1, 0, 0, 0, 5, 840, 1, 0, 0, 0, 5, 842, 1, 0, 0, 0, 5, 844, 1, 0, 0, 0, 5, 846, 1, 0, 0, 0, 5, 848, 1, 0, 0, 0, 5, 850, 1, 0, 0, 0, 5, 852, 1, 0, 0, 0, 5, 854, 1, 0, 0, 0, 5, 856, 1, 0, 0, 0, 5, 858, 1, 0, 0, 0, 5, 860, 1, 0, 0, 0, 5, 862, 1, 0, 0, 0, 5, 864, 1, 0, 0, 0, 5, 866, 1, 0, 0, 0, 5, 868, 1, 0, 0, 0, 5, 870, 1, 0, 0, 0, 5, 872, 1, 0, 0, 0, 5, 874, 1, 0, 0, 0, 5, 876, 1, 0, 0, 0, 5, 878, 1, 0, 0, 0, 5, 880, 1, 0, 0, 0, 5, 882, 1, 0, 0, 0, 5, 884, 1, 0, 0, 0, 5, 886, 1, 0, 0, 0, 5, 888, 1, 0, 0, 0, 5, 890, 1, 0, 0, 0, 5, 892, 1, 0, 0, 0, 5, 894, 1, 0, 0, 0, 5, 896, 1, 0, 0, 0, 5, 898, 1, 0, 0, 0, 5, 900, 1, 0, 0, 0, 5, 902, 1, 0, 0, 0, 5, 904, 1, 0, 0, 0, 5, 906, 1, 0, 0, 0, 5, 908, 1, 0, 0, 0, 5, 910, 1, 0, 0, 0, 5, 912, 1, 0, 0, 0, 5, 914, 1, 0, 0, 0, 5, 916, 1, 0, 0, 0, 5, 918, 1, 0, 0, 0, 5, 920, 1, 0, 0, 0, 5, 922, 1, 0, 0, 0, 5, 924, 1, 0, 0, 0, 5, 926, 1, 0, 0, 0, 5, 928, 1, 0, 0, 0, 5, 930, 1, 0, 0, 0, 5, 932, 1, 0, 0, 0, 5, 934, 1, 0, 0, 0, 5, 936, 1, 0, 0, 0, 5, 938, 1, 0, 0, 0, 5, 940, 1, 0, 0, 0, 5, 942, 1, 0, 0, 0, 5, 944, 1, 0, 0, 0, 5, 946, 1, 0, 0, 0, 5, 948, 1, 0, 0, 0, 5, 950, 1, 0, 0, 0, 5, 952, 1, 0, 0, 0, 5, 954, 1, 0, 0, 0, 5, 956, 1, 0, 0, 0, 5, 958, 1, 0, 0, 0, 5, 960, 1, 0, 0, 0, 5, 962, 1, 0, 0, 0, 5, 964, 1, 0, 0, 0, 5, 966, 1, 0, 0, 0, 5, 968, 1, 0, 0, 0, 5, 970, 1, 0, 0, 0, 5, 972, 1, 0, 0, 0, 5, 974, 1, 0, 0, 0, 5, 976, 1, 0, 0, 0, 5, 978, 1, 0, 0, 0, 5, 980, 1, 0, 0, 0, 5, 982, 1, 0, 0, 0, 5, 984, 1, 0, 0, 0, 5, 986, 1, 0, 0, 0, 5, 988, 1, 0, 0, 0, 5, 990, 1, 0, 0, 0, 5, 992, 1, 0, 0, 0, 5, 994, 1, 0, 0, 0, 5, 996, 1, 0, 0, 0, 5, 998, 1, 0, 0, 0, 5, 1000, 1, 0, 0, 0, 5, 1002, 1, 0, 0, 0, 5, 1004, 1, 0, 0, 0, 5, 1006, 1, 0, 0, 0, 5, 1008, 1, 0, 0, 0, 5, 1010, 1, 0, 0, 0, 5, 1012, 1, 0, 0, 0, 5, 1014, 1, 0, 0, 0, 5, 1016, 1, 0, 0, 0, 5, 1018, 1, 0, 0, 0, 5, 1020, 1, 0, 0, 0, 5, 1022, 1, 0, 0, 0, 5, 1024, 1, 0, 0, 0, 5, 1026, 1, 0, 0, 0, 5, 1028, 1, 0, 0, 0, 5, 1030, 1, 0, 0, 0, 5, 1032, 1, 0, 0, 0, 5, 1034, 1, 0, 0, 0, 5, 1036, 1, 0, 0, 0, 5, 1038, 1, 0, 0, 0, 5, 1040, 1, 0, 0, 0, 5, 1042, 1, 0, 0, 0, 5, 1044, 1, 0, 0, 0, 5, 1046, 1, 0, 0, 0, 5, 1048, 1, 0, 0, 0, 5, 1050, 1, 0, 0, 0, 5, 1052, 1, 0, 0, 0, 5, 1054, 1, 0, 0, 0, 5, 1056, 1, 0, 0, 0, 5, 1058, 1, 0, 0, 0, 5, 1060, 1, 0, 0, 0, 5, 1062, 1, 0, 0, 0, 5, 1064, 1, 0, 0, 0, 5, 1066, 1, 0, 0, 0, 5, 1068, 1, 0, 0, 0, 5, 1070, 1, 0, 0, 0, 5, 1072, 1, 0, 0, 0, 5, 1074, 1, 0, 0, 0, 5, 1076, 1, 0, 0, 0, 5, 1078, 1, 0, 0, 0, 5, 1080, 1, 0, 0, 0, 5, 1082, 1, 0, 0, 0, 5, 1084, 1, 0, 0, 0, 5, 1086, 1, 0, 0, 0, 5, 1088, 1, 0, 0, 0, 5, 1090, 1, 0, 0, 0, 5, 1092, 1, 0, 0, 0, 5, 1094, 1, 0, 0, 0, 5, 1096, 1, 0, 0, 0, 5, 1098, 1, 0, 0, 0, 5, 1100, 1, 0, 0, 0, 5, 1102, 1, 0, 0, 0, 5, 1104, 1, 0, 0, 0, 5, 1106, 1, 0, 0, 0, 5, 1108, 1, 0, 0, 0, 5, 1110, 1, 0, 0, 0, 5, 1112, 1, 0, 0, 0, 5, 1114, 1, 0, 0, 0, 5, 1116, 1, 0, 0, 0, 5, 1118, 1, 0, 0, 0, 5, 1120, 1, 0, 0, 0, 5, 1122, 1, 0, 0, 0, 5, 1124, 1, 0, 0, 0, 5, 1126, 1, 0, 0, 0, 5, 1128, 1, 0, 0, 0, 5, 1130, 1, 0, 0, 0, 5, 1132, 1, 0, 0, 0, 5, 1134, 1, 0, 0, 0, 5, 1136, 1, 0, 0, 0, 5, 1138, 1, 0, 0, 0, 5, 1140, 1, 0, 0, 0, 5, 1142, 1, 0, 0, 0, 5, 1144, 1, 0, 0, 0, 5, 1146, 1, 0, 0, 0, 5, 1148, 1, 0, 0, 0, 5, 1150, 1, 0, 0, 0, 5, 1152, 1, 0, 0, 0, 5, 1154, 1, 0, 0, 0, 5, 1156, 1, 0, 0, 0, 5, 1158, 1, 0, 0, 0, 5, 1160, 1, 0, 0, 0, 5, 1162, 1, 0, 0, 0, 5, 1164, 1, 0, 0, 0, 5, 1166, 1, 0, 0, 0, 5, 1168, 1, 0, 0, 0, 5, 1170, 1, 0, 0, 0, 5, 1172, 1, 0, 0, 0, 5, 1174, 1, 0, 0, 0, 5, 1176, 1, 0, 0, 0, 5, 1178, 1, 0, 0, 0, 5, 1180, 1, 0, 0, 0, 5, 1182, 1, 0, 0, 0, 5, 1184, 1, 0, 0, 0, 5, 1186, 1, 0, 0, 0, 5, 1188, 1, 0, 0, 0, 5, 1190, 1, 0, 0, 0, 5, 1192, 1, 0, 0, 0, 5, 1194, 1, 0, 0, 0, 5, 1196, 1, 0, 0, 0, 5, 1198, 1, 0, 0, 0, 5, 1200, 1, 0, 0, 0, 5, 1202, 1, 0, 0, 0, 5, 1204, 1, 0, 0, 0, 5, 1206, 1, 0, 0, 0, 5, 1208, 1, 0, 0, 0, 5, 1210, 1, 0, 0, 0, 5, 1212, 1, 0, 0, 0, 5, 1214, 1, 0, 0, 0, 5, 1216, 1, 0, 0, 0, 5, 1218, 1, 0, 0, 0, 6, 1220, 1, 0, 0, 0, 8, 1232, 1, 0, 0, 0, 10, 1246, 1, 0, 0, 0, 12, 1376, 1, 0, 0, 0, 14, 1379, 1, 0, 0, 0, 16, 1383, 1, 0, 0, 0, 18, 1422, 1, 0, 0, 0, 20, 1424, 1, 0, 0, 0, 22, 1428, 1, 0, 0, 0, 24, 1432, 1, 0, 0, 0, 26, 1449, 1, 0, 0, 0, 28, 1467, 1, 0, 0, 0, 30, 1483, 1, 0, 0, 0, 32, 1503, 1, 0, 0, 0, 34, 1528, 1, 0, 0, 0, 36, 1534, 1, 0, 0, 0, 38, 1536, 1, 0, 0, 0, 40, 1539, 1, 0, 0, 0, 42, 1541, 1, 0, 0, 0, 44, 1543, 1, 0, 0, 0, 46, 1545, 1, 0, 0, 0, 48, 1547, 1, 0, 0, 0, 50, 1549, 1, 0, 0, 0, 52, 1551, 1, 0, 0, 0, 54, 1553, 1, 0, 0, 0, 56, 1555, 1, 0, 0, 0, 58, 1557, 1, 0, 0, 0, 60, 1559, 1, 0, 0, 0, 62, 1561, 1, 0, 0, 0, 64, 1564, 1, 0, 0, 0, 66, 1566, 1, 0, 0, 0, 68, 1569, 1, 0, 0, 0, 70, 1571, 1, 0, 0, 0, 72, 1573, 1, 0, 0, 0, 74, 1576, 1, 0, 0, 0, 76, 1578, 1, 0, 0, 0, 78, 1580, 1, 0, 0, 0, 80, 1582, 1, 0, 0, 0, 82, 1584, 1, 0, 0, 0, 84, 1586, 1, 0, 0, 0, 86, 1588, 1, 0, 0, 0, 88, 1590, 1, 0, 0, 0, 90, 1592, 1, 0, 0, 0, 92, 1594, 1, 0, 0, 0, 94, 1596, 1, 0, 0, 0, 96, 1598, 1, 0, 0, 0, 98, 1601, 1, 0, 0, 0, 100, 1603, 1, 0, 0, 0, 102, 1606, 1, 0, 0, 0, 104, 1608, 1, 0, 0, 0, 106, 1617, 1, 0, 0, 0, 108, 1626, 1, 0, 0, 0, 110, 1643, 1, 0, 0, 0, 112, 1647, 1, 0, 0, 0, 114, 1653, 1, 0, 0, 0, 116, 1656, 1, 0, 0, 0, 118, 1666, 1, 0, 0, 0, 120, 1669, 1, 0, 0, 0, 122, 1679, 1, 0, 0, 0, 124, 1688, 1, 0, 0, 0, 126, 1703, 1, 0, 0, 0, 128, 1710, 1, 0, 0, 0, 130, 1713, 1, 0, 0, 0, 132, 1718, 1, 0, 0, 0, 134, 1723, 1, 0, 0, 0, 136, 1732, 1, 0, 0, 0, 138, 1738, 1, 0, 0, 0, 140, 1744, 1, 0, 0, 0, 142, 1754, 1, 0, 0, 0, 144, 1762, 1, 0, 0, 0, 146, 1775, 1, 0, 0, 0, 148, 1783, 1, 0, 0, 0, 150, 1799, 1, 0, 0, 0, 152, 1805, 1, 0, 0, 0, 154, 1813, 1, 0, 0, 0, 156, 1821, 1, 0, 0, 0, 158, 1832, 1, 0, 0, 0, 160, 1851, 1, 0, 0, 0, 162, 1862, 1, 0, 0, 0, 164, 1877, 1, 0, 0, 0, 166, 1881, 1, 0, 0, 0, 168, 1890, 1, 0, 0, 0, 170, 1904, 1, 0, 0, 0, 172, 1912, 1, 0, 0, 0, 174, 1917, 1, 0, 0, 0, 176, 1923, 1, 0, 0, 0, 178, 1938, 1, 0, 0, 0, 180, 1947, 1, 0, 0, 0, 182, 1951, 1, 0, 0, 0, 184, 1954, 1, 0, 0, 0, 186, 1960, 1, 0, 0, 0, 188, 1967, 1, 0, 0, 0, 190, 1976, 1, 0, 0, 0, 192, 1986, 1, 0, 0, 0, 194, 2004, 1, 0, 0, 0, 196, 2008, 1, 0, 0, 0, 198, 2017, 1, 0, 0, 0, 200, 2020, 1, 0, 0, 0, 202, 2029, 1, 0, 0, 0, 204, 2035, 1, 0, 0, 0, 206, 2038, 1, 0, 0, 0, 208, 2043, 1, 0, 0, 0, 210, 2046, 1, 0, 0, 0, 212, 2053, 1, 0, 0, 0, 214, 2056, 1, 0, 0, 0, 216, 2064, 1, 0, 0, 0, 218, 2073, 1, 0, 0, 0, 220, 2083, 1, 0, 0, 0, 222, 2086, 1, 0, 0, 0, 224, 2091, 1, 0, 0, 0, 226, 2095, 1, 0, 0, 0, 228, 2098, 1, 0, 0, 0, 230, 2104, 1, 0, 0, 0, 232, 2108, 1, 0, 0, 0, 234, 2111, 1, 0, 0, 0, 236, 2115, 1, 0, 0, 0, 238, 2119, 1, 0, 0, 0, 240, 2126, 1, 0, 0, 0, 242, 2136, 1, 0, 0, 0, 244, 2139, 1, 0, 0, 0, 246, 2144, 1, 0, 0, 0, 248, 2159, 1, 0, 0, 0, 250, 2170, 1, 0, 0, 0, 252, 2182, 1, 0, 0, 0, 254, 2187, 1, 0, 0, 0, 256, 2190, 1, 0, 0, 0, 258, 2195, 1, 0, 0, 0, 260, 2202, 1, 0, 0, 0, 262, 2205, 1, 0, 0, 0, 264, 2211, 1, 0, 0, 0, 266, 2219, 1, 0, 0, 0, 268, 2228, 1, 0, 0, 0, 270, 2235, 1, 0, 0, 0, 272, 2245, 1, 0, 0, 0, 274, 2263, 1, 0, 0, 0, 276, 2272, 1, 0, 0, 0, 278, 2281, 1, 0, 0, 0, 280, 2304, 1, 0, 0, 0, 282, 2311, 1, 0, 0, 0, 284, 2321, 1, 0, 0, 0, 286, 2328, 1, 0, 0, 0, 288, 2345, 1, 0, 0, 0, 290, 2360, 1, 0, 0, 0, 292, 2365, 1, 0, 0, 0, 294, 2373, 1, 0, 0, 0, 296, 2378, 1, 0, 0, 0, 298, 2385, 1, 0, 0, 0, 300, 2391, 1, 0, 0, 0, 302, 2398, 1, 0, 0, 0, 304, 2404, 1, 0, 0, 0, 306, 2411, 1, 0, 0, 0, 308, 2416, 1, 0, 0, 0, 310, 2421, 1, 0, 0, 0, 312, 2424, 1, 0, 0, 0, 314, 2430, 1, 0, 0, 0, 316, 2434, 1, 0, 0, 0, 318, 2443, 1, 0, 0, 0, 320, 2448, 1, 0, 0, 0, 322, 2459, 1, 0, 0, 0, 324, 2465, 1, 0, 0, 0, 326, 2475, 1, 0, 0, 0, 328, 2482, 1, 0, 0, 0, 330, 2491, 1, 0, 0, 0, 332, 2500, 1, 0, 0, 0, 334, 2508, 1, 0, 0, 0, 336, 2513, 1, 0, 0, 0, 338, 2519, 1, 0, 0, 0, 340, 2526, 1, 0, 0, 0, 342, 2533, 1, 0, 0, 0, 344, 2544, 1, 0, 0, 0, 346, 2557, 1, 0, 0, 0, 348, 2567, 1, 0, 0, 0, 350, 2579, 1, 0, 0, 0, 352, 2591, 1, 0, 0, 0, 354, 2599, 1, 0, 0, 0, 356, 2604, 1, 0, 0, 0, 358, 2610, 1, 0, 0, 0, 360, 2617, 1, 0, 0, 0, 362, 2622, 1, 0, 0, 0, 364, 2629, 1, 0, 0, 0, 366, 2636, 1, 0, 0, 0, 368, 2649, 1, 0, 0, 0, 370, 2653, 1, 0, 0, 0, 372, 2657, 1, 0, 0, 0, 374, 2661, 1, 0, 0, 0, 376, 2669, 1, 0, 0, 0, 378, 2673, 1, 0, 0, 0, 380, 2675, 1, 0, 0, 0, 382, 2680, 1, 0, 0, 0, 384, 2686, 1, 0, 0, 0, 386, 2700, 1, 0, 0, 0, 388, 2729, 1, 0, 0, 0, 390, 2731, 1, 0, 0, 0, 392, 2737, 1, 0, 0, 0, 394, 2742, 1, 0, 0, 0, 396, 2744, 1, 0, 0, 0, 398, 2746, 1, 0, 0, 0, 400, 2750, 1, 0, 0, 0, 402, 2754, 1, 0, 0, 0, 404, 2758, 1, 0, 0, 0, 406, 2763, 1, 0, 0, 0, 408, 2769, 1, 0, 0, 0, 410, 2774, 1, 0, 0, 0, 412, 2779, 1, 0, 0, 0, 414, 2784, 1, 0, 0, 0, 416, 2789, 1, 0, 0, 0, 418, 2794, 1, 0, 0, 0, 420, 2798, 1, 0, 0, 0, 422, 2839, 1, 0, 0, 0, 424, 2843, 1, 0, 0, 0, 426, 2847, 1, 0, 0, 0, 428, 2852, 1, 0, 0, 0, 430, 2857, 1, 0, 0, 0, 432, 2862, 1, 0, 0, 0, 434, 2867, 1, 0, 0, 0, 436, 2872, 1, 0, 0, 0, 438, 2876, 1, 0, 0, 0, 440, 2917, 1, 0, 0, 0, 442, 2921, 1, 0, 0, 0, 444, 2925, 1, 0, 0, 0, 446, 2939, 1, 0, 0, 0, 448, 2955, 1, 0, 0, 0, 450, 3087, 1, 0, 0, 0, 452, 3091, 1, 0, 0, 0, 454, 3132, 1, 0, 0, 0, 456, 3136, 1, 0, 0, 0, 458, 3141, 1, 0, 0, 0, 460, 3146, 1, 0, 0, 0, 462, 3152, 1, 0, 0, 0, 464, 3171, 1, 0, 0, 0, 466, 3191, 1, 0, 0, 0, 468, 3209, 1, 0, 0, 0, 470, 3231, 1, 0, 0, 0, 472, 3258, 1, 0, 0, 0, 474, 3265, 1, 0, 0, 0, 476, 3269, 1, 0, 0, 0, 478, 3274, 1, 0, 0, 0, 480, 3278, 1, 0, 0, 0, 482, 3282, 1, 0, 0, 0, 484, 3286, 1, 0, 0, 0, 486, 3290, 1, 0, 0, 0, 488, 3295, 1, 0, 0, 0, 490, 3301, 1, 0, 0, 0, 492, 3307, 1, 0, 0, 0, 494, 3311, 1, 0, 0, 0, 496, 3315, 1, 0, 0, 0, 498, 3319, 1, 0, 0, 0, 500, 3323, 1, 0, 0, 0, 502, 3327, 1, 0, 0, 0, 504, 3332, 1, 0, 0, 0, 506, 3336, 1, 0, 0, 0, 508, 3341, 1, 0, 0, 0, 510, 3345, 1, 0, 0, 0, 512, 3349, 1, 0, 0, 0, 514, 3354, 1, 0, 0, 0, 516, 3358, 1, 0, 0, 0, 518, 3362, 1, 0, 0, 0, 520, 3366, 1, 0, 0, 0, 522, 3370, 1, 0, 0, 0, 524, 3374, 1, 0, 0, 0, 526, 3378, 1, 0, 0, 0, 528, 3382, 1, 0, 0, 0, 530, 3386, 1, 0, 0, 0, 532, 3390, 1, 0, 0, 0, 534, 3394, 1, 0, 0, 0, 536, 3398, 1, 0, 0, 0, 538, 3403, 1, 0, 0, 0, 540, 3407, 1, 0, 0, 0, 542, 3412, 1, 0, 0, 0, 544, 3416, 1, 0, 0, 0, 546, 3427, 1, 0, 0, 0, 548, 3438, 1, 0, 0, 0, 550, 3457, 1, 0, 0, 0, 552, 3463, 1, 0, 0, 0, 554, 3471, 1, 0, 0, 0, 556, 3476, 1, 0, 0, 0, 558, 3488, 1, 0, 0, 0, 560, 3493, 1, 0, 0, 0, 562, 3505, 1, 0, 0, 0, 564, 3516, 1, 0, 0, 0, 566, 3533, 1, 0, 0, 0, 568, 3542, 1, 0, 0, 0, 570, 3547, 1, 0, 0, 0, 572, 3554, 1, 0, 0, 0, 574, 3561, 1, 0, 0, 0, 576, 3572, 1, 0, 0, 0, 578, 3580, 1, 0, 0, 0, 580, 3588, 1, 0, 0, 0, 582, 3600, 1, 0, 0, 0, 584, 3610, 1, 0, 0, 0, 586, 3625, 1, 0, 0, 0, 588, 3635, 1, 0, 0, 0, 590, 3653, 1, 0, 0, 0, 592, 3661, 1, 0, 0, 0, 594, 3671, 1, 0, 0, 0, 596, 3681, 1, 0, 0, 0, 598, 3694, 1, 0, 0, 0, 600, 3715, 1, 0, 0, 0, 602, 3728, 1, 0, 0, 0, 604, 3745, 1, 0, 0, 0, 606, 3751, 1, 0, 0, 0, 608, 3762, 1, 0, 0, 0, 610, 3778, 1, 0, 0, 0, 612, 3788, 1, 0, 0, 0, 614, 3795, 1, 0, 0, 0, 616, 3803, 1, 0, 0, 0, 618, 3820, 1, 0, 0, 0, 620, 3831, 1, 0, 0, 0, 622, 3837, 1, 0, 0, 0, 624, 3842, 1, 0, 0, 0, 626, 3850, 1, 0, 0, 0, 628, 3859, 1, 0, 0, 0, 630, 3870, 1, 0, 0, 0, 632, 3882, 1, 0, 0, 0, 634, 3902, 1, 0, 0, 0, 636, 3908, 1, 0, 0, 0, 638, 3919, 1, 0, 0, 0, 640, 3924, 1, 0, 0, 0, 642, 3935, 1, 0, 0, 0, 644, 3943, 1, 0, 0, 0, 646, 3948, 1, 0, 0, 0, 648, 3955, 1, 0, 0, 0, 650, 3960, 1, 0, 0, 0, 652, 3969, 1, 0, 0, 0, 654, 3974, 1, 0, 0, 0, 656, 3984, 1, 0, 0, 0, 658, 3995, 1, 0, 0, 0, 660, 4007, 1, 0, 0, 0, 662, 4012, 1, 0, 0, 0, 664, 4019, 1, 0, 0, 0, 666, 4025, 1, 0, 0, 0, 668, 4030, 1, 0, 0, 0, 670, 4038, 1, 0, 0, 0, 672, 4044, 1, 0, 0, 0, 674, 4049, 1, 0, 0, 0, 676, 4055, 1, 0, 0, 0, 678, 4061, 1, 0, 0, 0, 680, 4070, 1, 0, 0, 0, 682, 4082, 1, 0, 0, 0, 684, 4087, 1, 0, 0, 0, 686, 4094, 1, 0, 0, 0, 688, 4111, 1, 0, 0, 0, 690, 4124, 1, 0, 0, 0, 692, 4138, 1, 0, 0, 0, 694, 4145, 1, 0, 0, 0, 696, 4150, 1, 0, 0, 0, 698, 4157, 1, 0, 0, 0, 700, 4166, 1, 0, 0, 0, 702, 4171, 1, 0, 0, 0, 704, 4179, 1, 0, 0, 0, 706, 4189, 1, 0, 0, 0, 708, 4200, 1, 0, 0, 0, 710, 4209, 1, 0, 0, 0, 712, 4221, 1, 0, 0, 0, 714, 4241, 1, 0, 0, 0, 716, 4252, 1, 0, 0, 0, 718, 4263, 1, 0, 0, 0, 720, 4288, 1, 0, 0, 0, 722, 4297, 1, 0, 0, 0, 724, 4309, 1, 0, 0, 0, 726, 4318, 1, 0, 0, 0, 728, 4337, 1, 0, 0, 0, 730, 4354, 1, 0, 0, 0, 732, 4361, 1, 0, 0, 0, 734, 4371, 1, 0, 0, 0, 736, 4378, 1, 0, 0, 0, 738, 4387, 1, 0, 0, 0, 740, 4395, 1, 0, 0, 0, 742, 4404, 1, 0, 0, 0, 744, 4412, 1, 0, 0, 0, 746, 4421, 1, 0, 0, 0, 748, 4428, 1, 0, 0, 0, 750, 4435, 1, 0, 0, 0, 752, 4440, 1, 0, 0, 0, 754, 4448, 1, 0, 0, 0, 756, 4454, 1, 0, 0, 0, 758, 4465, 1, 0, 0, 0, 760, 4472, 1, 0, 0, 0, 762, 4485, 1, 0, 0, 0, 764, 4493, 1, 0, 0, 0, 766, 4505, 1, 0, 0, 0, 768, 4514, 1, 0, 0, 0, 770, 4525, 1, 0, 0, 0, 772, 4536, 1, 0, 0, 0, 774, 4546, 1, 0, 0, 0, 776, 4553, 1, 0, 0, 0, 778, 4561, 1, 0, 0, 0, 780, 4570, 1, 0, 0, 0, 782, 4579, 1, 0, 0, 0, 784, 4592, 1, 0, 0, 0, 786, 4607, 1, 0, 0, 0, 788, 4619, 1, 0, 0, 0, 790, 4633, 1, 0, 0, 0, 792, 4647, 1, 0, 0, 0, 794, 4657, 1, 0, 0, 0, 796, 4664, 1, 0, 0, 0, 798, 4672, 1, 0, 0, 0, 800, 4681, 1, 0, 0, 0, 802, 4688, 1, 0, 0, 0, 804, 4697, 1, 0, 0, 0, 806, 4706, 1, 0, 0, 0, 808, 4721, 1, 0, 0, 0, 810, 4727, 1, 0, 0, 0, 812, 4733, 1, 0, 0, 0, 814, 4739, 1, 0, 0, 0, 816, 4748, 1, 0, 0, 0, 818, 4755, 1, 0, 0, 0, 820, 4763, 1, 0, 0, 0, 822, 4779, 1, 0, 0, 0, 824, 4809, 1, 0, 0, 0, 826, 4813, 1, 0, 0, 0, 828, 4820, 1, 0, 0, 0, 830, 4826, 1, 0, 0, 0, 832, 4830, 1, 0, 0, 0, 834, 4844, 1, 0, 0, 0, 836, 4860, 1, 0, 0, 0, 838, 4992, 1, 0, 0, 0, 840, 4996, 1, 0, 0, 0, 842, 5037, 1, 0, 0, 0, 844, 5041, 1, 0, 0, 0, 846, 5046, 1, 0, 0, 0, 848, 5051, 1, 0, 0, 0, 850, 5057, 1, 0, 0, 0, 852, 5076, 1, 0, 0, 0, 854, 5096, 1, 0, 0, 0, 856, 5114, 1, 0, 0, 0, 858, 5136, 1, 0, 0, 0, 860, 5163, 1, 0, 0, 0, 862, 5170, 1, 0, 0, 0, 864, 5174, 1, 0, 0, 0, 866, 5179, 1, 0, 0, 0, 868, 5183, 1, 0, 0, 0, 870, 5187, 1, 0, 0, 0, 872, 5191, 1, 0, 0, 0, 874, 5195, 1, 0, 0, 0, 876, 5200, 1, 0, 0, 0, 878, 5206, 1, 0, 0, 0, 880, 5212, 1, 0, 0, 0, 882, 5216, 1, 0, 0, 0, 884, 5220, 1, 0, 0, 0, 886, 5224, 1, 0, 0, 0, 888, 5228, 1, 0, 0, 0, 890, 5232, 1, 0, 0, 0, 892, 5237, 1, 0, 0, 0, 894, 5241, 1, 0, 0, 0, 896, 5246, 1, 0, 0, 0, 898, 5250, 1, 0, 0, 0, 900, 5254, 1, 0, 0, 0, 902, 5259, 1, 0, 0, 0, 904, 5263, 1, 0, 0, 0, 906, 5267, 1, 0, 0, 0, 908, 5271, 1, 0, 0, 0, 910, 5275, 1, 0, 0, 0, 912, 5279, 1, 0, 0, 0, 914, 5283, 1, 0, 0, 0, 916, 5287, 1, 0, 0, 0, 918, 5291, 1, 0, 0, 0, 920, 5295, 1, 0, 0, 0, 922, 5299, 1, 0, 0, 0, 924, 5303, 1, 0, 0, 0, 926, 5308, 1, 0, 0, 0, 928, 5312, 1, 0, 0, 0, 930, 5317, 1, 0, 0, 0, 932, 5321, 1, 0, 0, 0, 934, 5332, 1, 0, 0, 0, 936, 5343, 1, 0, 0, 0, 938, 5362, 1, 0, 0, 0, 940, 5368, 1, 0, 0, 0, 942, 5376, 1, 0, 0, 0, 944, 5381, 1, 0, 0, 0, 946, 5393, 1, 0, 0, 0, 948, 5398, 1, 0, 0, 0, 950, 5410, 1, 0, 0, 0, 952, 5421, 1, 0, 0, 0, 954, 5438, 1, 0, 0, 0, 956, 5447, 1, 0, 0, 0, 958, 5452, 1, 0, 0, 0, 960, 5459, 1, 0, 0, 0, 962, 5466, 1, 0, 0, 0, 964, 5477, 1, 0, 0, 0, 966, 5485, 1, 0, 0, 0, 968, 5493, 1, 0, 0, 0, 970, 5505, 1, 0, 0, 0, 972, 5515, 1, 0, 0, 0, 974, 5530, 1, 0, 0, 0, 976, 5540, 1, 0, 0, 0, 978, 5558, 1, 0, 0, 0, 980, 5566, 1, 0, 0, 0, 982, 5576, 1, 0, 0, 0, 984, 5586, 1, 0, 0, 0, 986, 5599, 1, 0, 0, 0, 988, 5620, 1, 0, 0, 0, 990, 5633, 1, 0, 0, 0, 992, 5650, 1, 0, 0, 0, 994, 5656, 1, 0, 0, 0, 996, 5667, 1, 0, 0, 0, 998, 5683, 1, 0, 0, 0, 1000, 5693, 1, 0, 0, 0, 1002, 5700, 1, 0, 0, 0, 1004, 5708, 1, 0, 0, 0, 1006, 5725, 1, 0, 0, 0, 1008, 5736, 1, 0, 0, 0, 1010, 5742, 1, 0, 0, 0, 1012, 5747, 1, 0, 0, 0, 1014, 5755, 1, 0, 0, 0, 1016, 5764, 1, 0, 0, 0, 1018, 5775, 1, 0, 0, 0, 1020, 5787, 1, 0, 0, 0, 1022, 5807, 1, 0, 0, 0, 1024, 5813, 1, 0, 0, 0, 1026, 5824, 1, 0, 0, 0, 1028, 5829, 1, 0, 0, 0, 1030, 5840, 1, 0, 0, 0, 1032, 5848, 1, 0, 0, 0, 1034, 5853, 1, 0, 0, 0, 1036, 5860, 1, 0, 0, 0, 1038, 5865, 1, 0, 0, 0, 1040, 5874, 1, 0, 0, 0, 1042, 5879, 1, 0, 0, 0, 1044, 5889, 1, 0, 0, 0, 1046, 5900, 1, 0, 0, 0, 1048, 5912, 1, 0, 0, 0, 1050, 5917, 1, 0, 0, 0, 1052, 5924, 1, 0, 0, 0, 1054, 5930, 1, 0, 0, 0, 1056, 5935, 1, 0, 0, 0, 1058, 5943, 1, 0, 0, 0, 1060, 5949, 1, 0, 0, 0, 1062, 5954, 1, 0, 0, 0, 1064, 5960, 1, 0, 0, 0, 1066, 5966, 1, 0, 0, 0, 1068, 5975, 1, 0, 0, 0, 1070, 5987, 1, 0, 0, 0, 1072, 5992, 1, 0, 0, 0, 1074, 5999, 1, 0, 0, 0, 1076, 6016, 1, 0, 0, 0, 1078, 6029, 1, 0, 0, 0, 1080, 6043, 1, 0, 0, 0, 1082, 6050, 1, 0, 0, 0, 1084, 6055, 1, 0, 0, 0, 1086, 6062, 1, 0, 0, 0, 1088, 6071, 1, 0, 0, 0, 1090, 6076, 1, 0, 0, 0, 1092, 6084, 1, 0, 0, 0, 1094, 6094, 1, 0, 0, 0, 1096, 6105, 1, 0, 0, 0, 1098, 6114, 1, 0, 0, 0, 1100, 6126, 1, 0, 0, 0, 1102, 6146, 1, 0, 0, 0, 1104, 6157, 1, 0, 0, 0, 1106, 6168, 1, 0, 0, 0, 1108, 6193, 1, 0, 0, 0, 1110, 6202, 1, 0, 0, 0, 1112, 6214, 1, 0, 0, 0, 1114, 6223, 1, 0, 0, 0, 1116, 6242, 1, 0, 0, 0, 1118, 6259, 1, 0, 0, 0, 1120, 6266, 1, 0, 0, 0, 1122, 6276, 1, 0, 0, 0, 1124, 6283, 1, 0, 0, 0, 1126, 6292, 1, 0, 0, 0, 1128, 6300, 1, 0, 0, 0, 1130, 6309, 1, 0, 0, 0, 1132, 6317, 1, 0, 0, 0, 1134, 6326, 1, 0, 0, 0, 1136, 6333, 1, 0, 0, 0, 1138, 6340, 1, 0, 0, 0, 1140, 6345, 1, 0, 0, 0, 1142, 6353, 1, 0, 0, 0, 1144, 6359, 1, 0, 0, 0, 1146, 6370, 1, 0, 0, 0, 1148, 6377, 1, 0, 0, 0, 1150, 6390, 1, 0, 0, 0, 1152, 6398, 1, 0, 0, 0, 1154, 6410, 1, 0, 0, 0, 1156, 6419, 1, 0, 0, 0, 1158, 6430, 1, 0, 0, 0, 1160, 6441, 1, 0, 0, 0, 1162, 6451, 1, 0, 0, 0, 1164, 6458, 1, 0, 0, 0, 1166, 6466, 1, 0, 0, 0, 1168, 6475, 1, 0, 0, 0, 1170, 6484, 1, 0, 0, 0, 1172, 6497, 1, 0, 0, 0, 1174, 6512, 1, 0, 0, 0, 1176, 6524, 1, 0, 0, 0, 1178, 6538, 1, 0, 0, 0, 1180, 6552, 1, 0, 0, 0, 1182, 6562, 1, 0, 0, 0, 1184, 6569, 1, 0, 0, 0, 1186, 6577, 1, 0, 0, 0, 1188, 6586, 1, 0, 0, 0, 1190, 6593, 1, 0, 0, 0, 1192, 6602, 1, 0, 0, 0, 1194, 6611, 1, 0, 0, 0, 1196, 6626, 1, 0, 0, 0, 1198, 6632, 1, 0, 0, 0, 1200, 6638, 1, 0, 0, 0, 1202, 6644, 1, 0, 0, 0, 1204, 6653, 1, 0, 0, 0, 1206, 6660, 1, 0, 0, 0, 1208, 6668, 1, 0, 0, 0, 1210, 6684, 1, 0, 0, 0, 1212, 6714, 1, 0, 0, 0, 1214, 6718, 1, 0, 0, 0, 1216, 6725, 1, 0, 0, 0, 1218, 6731, 1, 0, 0, 0, 1220, 1221, 3, 14, 4, 0, 1221, 7, 1, 0, 0, 0, 1222, 1223, 5, 46, 0, 0, 1223, 1233, 3, 14, 4, 0, 1224, 1225, 3, 14, 4, 0, 1225, 1229, 5, 46, 0, 0, 1226, 1228, 7, 0, 0, 0, 1227, 1226, 1, 0, 0, 0, 1228, 1231, 1, 0, 0, 0, 1229, 1227, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1233, 1, 0, 0, 0, 1231, 1229, 1, 0, 0, 0, 1232, 1222, 1, 0, 0, 0, 1232, 1224, 1, 0, 0, 0, 1233, 9, 1, 0, 0, 0, 1234, 1235, 5, 46, 0, 0, 1235, 1247, 3, 14, 4, 0, 1236, 1244, 3, 14, 4, 0, 1237, 1241, 5, 46, 0, 0, 1238, 1240, 7, 0, 0, 0, 1239, 1238, 1, 0, 0, 0, 1240, 1243, 1, 0, 0, 0, 1241, 1239, 1, 0, 0, 0, 1241, 1242, 1, 0, 0, 0, 1242, 1245, 1, 0, 0, 0, 1243, 1241, 1, 0, 0, 0, 1244, 1237, 1, 0, 0, 0, 1244, 1245, 1, 0, 0, 0, 1245, 1247, 1, 0, 0, 0, 1246, 1234, 1, 0, 0, 0, 1246, 1236, 1, 0, 0, 0, 1247, 1248, 1, 0, 0, 0, 1248, 1250, 7, 1, 0, 0, 1249, 1251, 7, 2, 0, 0, 1250, 1249, 1, 0, 0, 0, 1250, 1251, 1, 0, 0, 0, 1251, 1252, 1, 0, 0, 0, 1252, 1253, 3, 14, 4, 0, 1253, 11, 1, 0, 0, 0, 1254, 1255, 5, 100, 0, 0, 1255, 1256, 5, 101, 0, 0, 1256, 1257, 5, 99, 0, 0, 1257, 1258, 5, 105, 0, 0, 1258, 1259, 5, 109, 0, 0, 1259, 1260, 5, 97, 0, 0, 1260, 1261, 5, 108, 0, 0, 1261, 1262, 5, 45, 0, 0, 1262, 1263, 5, 115, 0, 0, 1263, 1264, 5, 101, 0, 0, 1264, 1265, 5, 112, 0, 0, 1265, 1266, 5, 97, 0, 0, 1266, 1267, 5, 114, 0, 0, 1267, 1268, 5, 97, 0, 0, 1268, 1269, 5, 116, 0, 0, 1269, 1270, 5, 111, 0, 0, 1270, 1377, 5, 114, 0, 0, 1271, 1272, 5, 103, 0, 0, 1272, 1273, 5, 114, 0, 0, 1273, 1274, 5, 111, 0, 0, 1274, 1275, 5, 117, 0, 0, 1275, 1276, 5, 112, 0, 0, 1276, 1277, 5, 105, 0, 0, 1277, 1278, 5, 110, 0, 0, 1278, 1279, 5, 103, 0, 0, 1279, 1280, 5, 45, 0, 0, 1280, 1281, 5, 115, 0, 0, 1281, 1282, 5, 101, 0, 0, 1282, 1283, 5, 112, 0, 0, 1283, 1284, 5, 97, 0, 0, 1284, 1285, 5, 114, 0, 0, 1285, 1286, 5, 97, 0, 0, 1286, 1287, 5, 116, 0, 0, 1287, 1288, 5, 111, 0, 0, 1288, 1377, 5, 114, 0, 0, 1289, 1290, 5, 105, 0, 0, 1290, 1291, 5, 110, 0, 0, 1291, 1292, 5, 102, 0, 0, 1292, 1293, 5, 105, 0, 0, 1293, 1294, 5, 110, 0, 0, 1294, 1295, 5, 105, 0, 0, 1295, 1296, 5, 116, 0, 0, 1296, 1377, 5, 121, 0, 0, 1297, 1298, 5, 109, 0, 0, 1298, 1299, 5, 105, 0, 0, 1299, 1300, 5, 110, 0, 0, 1300, 1301, 5, 117, 0, 0, 1301, 1302, 5, 115, 0, 0, 1302, 1303, 5, 45, 0, 0, 1303, 1304, 5, 115, 0, 0, 1304, 1305, 5, 105, 0, 0, 1305, 1306, 5, 103, 0, 0, 1306, 1377, 5, 110, 0, 0, 1307, 1308, 5, 78, 0, 0, 1308, 1309, 5, 97, 0, 0, 1309, 1377, 5, 78, 0, 0, 1310, 1311, 5, 112, 0, 0, 1311, 1312, 5, 101, 0, 0, 1312, 1313, 5, 114, 0, 0, 1313, 1314, 5, 99, 0, 0, 1314, 1315, 5, 101, 0, 0, 1315, 1316, 5, 110, 0, 0, 1316, 1377, 5, 116, 0, 0, 1317, 1318, 5, 112, 0, 0, 1318, 1319, 5, 101, 0, 0, 1319, 1320, 5, 114, 0, 0, 1320, 1321, 5, 45, 0, 0, 1321, 1322, 5, 109, 0, 0, 1322, 1323, 5, 105, 0, 0, 1323, 1324, 5, 108, 0, 0, 1324, 1325, 5, 108, 0, 0, 1325, 1377, 5, 101, 0, 0, 1326, 1327, 5, 122, 0, 0, 1327, 1328, 5, 101, 0, 0, 1328, 1329, 5, 114, 0, 0, 1329, 1330, 5, 111, 0, 0, 1330, 1331, 5, 45, 0, 0, 1331, 1332, 5, 100, 0, 0, 1332, 1333, 5, 105, 0, 0, 1333, 1334, 5, 103, 0, 0, 1334, 1335, 5, 105, 0, 0, 1335, 1377, 5, 116, 0, 0, 1336, 1337, 5, 100, 0, 0, 1337, 1338, 5, 105, 0, 0, 1338, 1339, 5, 103, 0, 0, 1339, 1340, 5, 105, 0, 0, 1340, 1377, 5, 116, 0, 0, 1341, 1342, 5, 112, 0, 0, 1342, 1343, 5, 97, 0, 0, 1343, 1344, 5, 116, 0, 0, 1344, 1345, 5, 116, 0, 0, 1345, 1346, 5, 101, 0, 0, 1346, 1347, 5, 114, 0, 0, 1347, 1348, 5, 110, 0, 0, 1348, 1349, 5, 45, 0, 0, 1349, 1350, 5, 115, 0, 0, 1350, 1351, 5, 101, 0, 0, 1351, 1352, 5, 112, 0, 0, 1352, 1353, 5, 97, 0, 0, 1353, 1354, 5, 114, 0, 0, 1354, 1355, 5, 97, 0, 0, 1355, 1356, 5, 116, 0, 0, 1356, 1357, 5, 111, 0, 0, 1357, 1377, 5, 114, 0, 0, 1358, 1359, 5, 101, 0, 0, 1359, 1360, 5, 120, 0, 0, 1360, 1361, 5, 112, 0, 0, 1361, 1362, 5, 111, 0, 0, 1362, 1363, 5, 110, 0, 0, 1363, 1364, 5, 101, 0, 0, 1364, 1365, 5, 110, 0, 0, 1365, 1366, 5, 116, 0, 0, 1366, 1367, 5, 45, 0, 0, 1367, 1368, 5, 115, 0, 0, 1368, 1369, 5, 101, 0, 0, 1369, 1370, 5, 112, 0, 0, 1370, 1371, 5, 97, 0, 0, 1371, 1372, 5, 114, 0, 0, 1372, 1373, 5, 97, 0, 0, 1373, 1374, 5, 116, 0, 0, 1374, 1375, 5, 111, 0, 0, 1375, 1377, 5, 114, 0, 0, 1376, 1254, 1, 0, 0, 0, 1376, 1271, 1, 0, 0, 0, 1376, 1289, 1, 0, 0, 0, 1376, 1297, 1, 0, 0, 0, 1376, 1307, 1, 0, 0, 0, 1376, 1310, 1, 0, 0, 0, 1376, 1317, 1, 0, 0, 0, 1376, 1326, 1, 0, 0, 0, 1376, 1336, 1, 0, 0, 0, 1376, 1341, 1, 0, 0, 0, 1376, 1358, 1, 0, 0, 0, 1377, 13, 1, 0, 0, 0, 1378, 1380, 7, 0, 0, 0, 1379, 1378, 1, 0, 0, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1379, 1, 0, 0, 0, 1381, 1382, 1, 0, 0, 0, 1382, 15, 1, 0, 0, 0, 1383, 1399, 5, 38, 0, 0, 1384, 1385, 5, 108, 0, 0, 1385, 1400, 5, 116, 0, 0, 1386, 1387, 5, 103, 0, 0, 1387, 1400, 5, 116, 0, 0, 1388, 1389, 5, 97, 0, 0, 1389, 1390, 5, 109, 0, 0, 1390, 1400, 5, 112, 0, 0, 1391, 1392, 5, 113, 0, 0, 1392, 1393, 5, 117, 0, 0, 1393, 1394, 5, 111, 0, 0, 1394, 1400, 5, 116, 0, 0, 1395, 1396, 5, 97, 0, 0, 1396, 1397, 5, 112, 0, 0, 1397, 1398, 5, 111, 0, 0, 1398, 1400, 5, 115, 0, 0, 1399, 1384, 1, 0, 0, 0, 1399, 1386, 1, 0, 0, 0, 1399, 1388, 1, 0, 0, 0, 1399, 1391, 1, 0, 0, 0, 1399, 1395, 1, 0, 0, 0, 1400, 1401, 1, 0, 0, 0, 1401, 1402, 5, 59, 0, 0, 1402, 17, 1, 0, 0, 0, 1403, 1404, 5, 38, 0, 0, 1404, 1405, 5, 35, 0, 0, 1405, 1407, 1, 0, 0, 0, 1406, 1408, 7, 0, 0, 0, 1407, 1406, 1, 0, 0, 0, 1408, 1409, 1, 0, 0, 0, 1409, 1407, 1, 0, 0, 0, 1409, 1410, 1, 0, 0, 0, 1410, 1411, 1, 0, 0, 0, 1411, 1423, 5, 59, 0, 0, 1412, 1413, 5, 38, 0, 0, 1413, 1414, 5, 35, 0, 0, 1414, 1415, 5, 120, 0, 0, 1415, 1417, 1, 0, 0, 0, 1416, 1418, 7, 3, 0, 0, 1417, 1416, 1, 0, 0, 0, 1418, 1419, 1, 0, 0, 0, 1419, 1417, 1, 0, 0, 0, 1419, 1420, 1, 0, 0, 0, 1420, 1421, 1, 0, 0, 0, 1421, 1423, 5, 59, 0, 0, 1422, 1403, 1, 0, 0, 0, 1422, 1412, 1, 0, 0, 0, 1423, 19, 1, 0, 0, 0, 1424, 1425, 5, 34, 0, 0, 1425, 1426, 1, 0, 0, 0, 1426, 1427, 6, 7, 0, 0, 1427, 21, 1, 0, 0, 0, 1428, 1429, 5, 39, 0, 0, 1429, 1430, 1, 0, 0, 0, 1430, 1431, 6, 8, 1, 0, 1431, 23, 1, 0, 0, 0, 1432, 1433, 5, 60, 0, 0, 1433, 1434, 5, 33, 0, 0, 1434, 1435, 5, 45, 0, 0, 1435, 1436, 5, 45, 0, 0, 1436, 1442, 1, 0, 0, 0, 1437, 1438, 5, 45, 0, 0, 1438, 1441, 8, 4, 0, 0, 1439, 1441, 8, 4, 0, 0, 1440, 1437, 1, 0, 0, 0, 1440, 1439, 1, 0, 0, 0, 1441, 1444, 1, 0, 0, 0, 1442, 1440, 1, 0, 0, 0, 1442, 1443, 1, 0, 0, 0, 1443, 1445, 1, 0, 0, 0, 1444, 1442, 1, 0, 0, 0, 1445, 1446, 5, 45, 0, 0, 1446, 1447, 5, 45, 0, 0, 1447, 1448, 5, 62, 0, 0, 1448, 25, 1, 0, 0, 0, 1449, 1450, 5, 60, 0, 0, 1450, 1451, 5, 63, 0, 0, 1451, 1452, 1, 0, 0, 0, 1452, 1453, 7, 5, 0, 0, 1453, 1454, 7, 6, 0, 0, 1454, 1462, 7, 7, 0, 0, 1455, 1459, 7, 8, 0, 0, 1456, 1458, 9, 0, 0, 0, 1457, 1456, 1, 0, 0, 0, 1458, 1461, 1, 0, 0, 0, 1459, 1460, 1, 0, 0, 0, 1459, 1457, 1, 0, 0, 0, 1460, 1463, 1, 0, 0, 0, 1461, 1459, 1, 0, 0, 0, 1462, 1455, 1, 0, 0, 0, 1462, 1463, 1, 0, 0, 0, 1463, 1464, 1, 0, 0, 0, 1464, 1465, 5, 63, 0, 0, 1465, 1466, 5, 62, 0, 0, 1466, 27, 1, 0, 0, 0, 1467, 1468, 5, 60, 0, 0, 1468, 1469, 5, 63, 0, 0, 1469, 1470, 1, 0, 0, 0, 1470, 1478, 3, 374, 184, 0, 1471, 1475, 7, 8, 0, 0, 1472, 1474, 9, 0, 0, 0, 1473, 1472, 1, 0, 0, 0, 1474, 1477, 1, 0, 0, 0, 1475, 1476, 1, 0, 0, 0, 1475, 1473, 1, 0, 0, 0, 1476, 1479, 1, 0, 0, 0, 1477, 1475, 1, 0, 0, 0, 1478, 1471, 1, 0, 0, 0, 1478, 1479, 1, 0, 0, 0, 1479, 1480, 1, 0, 0, 0, 1480, 1481, 5, 63, 0, 0, 1481, 1482, 5, 62, 0, 0, 1482, 29, 1, 0, 0, 0, 1483, 1484, 5, 60, 0, 0, 1484, 1485, 5, 33, 0, 0, 1485, 1486, 5, 91, 0, 0, 1486, 1487, 5, 67, 0, 0, 1487, 1488, 5, 68, 0, 0, 1488, 1489, 5, 65, 0, 0, 1489, 1490, 5, 84, 0, 0, 1490, 1491, 5, 65, 0, 0, 1491, 1492, 5, 91, 0, 0, 1492, 1496, 1, 0, 0, 0, 1493, 1495, 9, 0, 0, 0, 1494, 1493, 1, 0, 0, 0, 1495, 1498, 1, 0, 0, 0, 1496, 1497, 1, 0, 0, 0, 1496, 1494, 1, 0, 0, 0, 1497, 1499, 1, 0, 0, 0, 1498, 1496, 1, 0, 0, 0, 1499, 1500, 5, 93, 0, 0, 1500, 1501, 5, 93, 0, 0, 1501, 1502, 5, 62, 0, 0, 1502, 31, 1, 0, 0, 0, 1503, 1504, 5, 40, 0, 0, 1504, 1505, 5, 35, 0, 0, 1505, 1507, 1, 0, 0, 0, 1506, 1508, 3, 34, 14, 0, 1507, 1506, 1, 0, 0, 0, 1507, 1508, 1, 0, 0, 0, 1508, 1512, 1, 0, 0, 0, 1509, 1510, 3, 374, 184, 0, 1510, 1511, 5, 58, 0, 0, 1511, 1513, 1, 0, 0, 0, 1512, 1509, 1, 0, 0, 0, 1512, 1513, 1, 0, 0, 0, 1513, 1514, 1, 0, 0, 0, 1514, 1522, 3, 374, 184, 0, 1515, 1519, 3, 34, 14, 0, 1516, 1518, 9, 0, 0, 0, 1517, 1516, 1, 0, 0, 0, 1518, 1521, 1, 0, 0, 0, 1519, 1520, 1, 0, 0, 0, 1519, 1517, 1, 0, 0, 0, 1520, 1523, 1, 0, 0, 0, 1521, 1519, 1, 0, 0, 0, 1522, 1515, 1, 0, 0, 0, 1522, 1523, 1, 0, 0, 0, 1523, 1524, 1, 0, 0, 0, 1524, 1525, 5, 35, 0, 0, 1525, 1526, 5, 41, 0, 0, 1526, 33, 1, 0, 0, 0, 1527, 1529, 7, 8, 0, 0, 1528, 1527, 1, 0, 0, 0, 1529, 1530, 1, 0, 0, 0, 1530, 1528, 1, 0, 0, 0, 1530, 1531, 1, 0, 0, 0, 1531, 1532, 1, 0, 0, 0, 1532, 1533, 6, 14, 2, 0, 1533, 35, 1, 0, 0, 0, 1534, 1535, 5, 61, 0, 0, 1535, 37, 1, 0, 0, 0, 1536, 1537, 5, 33, 0, 0, 1537, 1538, 5, 61, 0, 0, 1538, 39, 1, 0, 0, 0, 1539, 1540, 5, 40, 0, 0, 1540, 41, 1, 0, 0, 0, 1541, 1542, 5, 41, 0, 0, 1542, 43, 1, 0, 0, 0, 1543, 1544, 5, 91, 0, 0, 1544, 45, 1, 0, 0, 0, 1545, 1546, 5, 93, 0, 0, 1546, 47, 1, 0, 0, 0, 1547, 1548, 5, 123, 0, 0, 1548, 49, 1, 0, 0, 0, 1549, 1550, 5, 125, 0, 0, 1550, 51, 1, 0, 0, 0, 1551, 1552, 5, 42, 0, 0, 1552, 53, 1, 0, 0, 0, 1553, 1554, 5, 43, 0, 0, 1554, 55, 1, 0, 0, 0, 1555, 1556, 5, 45, 0, 0, 1556, 57, 1, 0, 0, 0, 1557, 1558, 5, 44, 0, 0, 1558, 59, 1, 0, 0, 0, 1559, 1560, 5, 46, 0, 0, 1560, 61, 1, 0, 0, 0, 1561, 1562, 5, 46, 0, 0, 1562, 1563, 5, 46, 0, 0, 1563, 63, 1, 0, 0, 0, 1564, 1565, 5, 58, 0, 0, 1565, 65, 1, 0, 0, 0, 1566, 1567, 5, 58, 0, 0, 1567, 1568, 5, 61, 0, 0, 1568, 67, 1, 0, 0, 0, 1569, 1570, 5, 59, 0, 0, 1570, 69, 1, 0, 0, 0, 1571, 1572, 5, 47, 0, 0, 1572, 71, 1, 0, 0, 0, 1573, 1574, 5, 47, 0, 0, 1574, 1575, 5, 47, 0, 0, 1575, 73, 1, 0, 0, 0, 1576, 1577, 5, 92, 0, 0, 1577, 75, 1, 0, 0, 0, 1578, 1579, 5, 124, 0, 0, 1579, 77, 1, 0, 0, 0, 1580, 1581, 5, 60, 0, 0, 1581, 79, 1, 0, 0, 0, 1582, 1583, 5, 62, 0, 0, 1583, 81, 1, 0, 0, 0, 1584, 1585, 5, 63, 0, 0, 1585, 83, 1, 0, 0, 0, 1586, 1587, 5, 64, 0, 0, 1587, 85, 1, 0, 0, 0, 1588, 1589, 5, 36, 0, 0, 1589, 87, 1, 0, 0, 0, 1590, 1591, 5, 37, 0, 0, 1591, 89, 1, 0, 0, 0, 1592, 1593, 5, 33, 0, 0, 1593, 91, 1, 0, 0, 0, 1594, 1595, 5, 35, 0, 0, 1595, 93, 1, 0, 0, 0, 1596, 1597, 5, 94, 0, 0, 1597, 95, 1, 0, 0, 0, 1598, 1599, 5, 61, 0, 0, 1599, 1600, 5, 62, 0, 0, 1600, 97, 1, 0, 0, 0, 1601, 1602, 5, 96, 0, 0, 1602, 99, 1, 0, 0, 0, 1603, 1604, 5, 124, 0, 0, 1604, 1605, 5, 124, 0, 0, 1605, 101, 1, 0, 0, 0, 1606, 1607, 5, 126, 0, 0, 1607, 103, 1, 0, 0, 0, 1608, 1609, 5, 97, 0, 0, 1609, 1610, 5, 108, 0, 0, 1610, 1611, 5, 108, 0, 0, 1611, 1612, 5, 111, 0, 0, 1612, 1613, 5, 119, 0, 0, 1613, 1614, 5, 105, 0, 0, 1614, 1615, 5, 110, 0, 0, 1615, 1616, 5, 103, 0, 0, 1616, 105, 1, 0, 0, 0, 1617, 1618, 5, 97, 0, 0, 1618, 1619, 5, 110, 0, 0, 1619, 1620, 5, 99, 0, 0, 1620, 1621, 5, 101, 0, 0, 1621, 1622, 5, 115, 0, 0, 1622, 1623, 5, 116, 0, 0, 1623, 1624, 5, 111, 0, 0, 1624, 1625, 5, 114, 0, 0, 1625, 107, 1, 0, 0, 0, 1626, 1627, 5, 97, 0, 0, 1627, 1628, 5, 110, 0, 0, 1628, 1629, 5, 99, 0, 0, 1629, 1630, 5, 101, 0, 0, 1630, 1631, 5, 115, 0, 0, 1631, 1632, 5, 116, 0, 0, 1632, 1633, 5, 111, 0, 0, 1633, 1634, 5, 114, 0, 0, 1634, 1635, 5, 45, 0, 0, 1635, 1636, 5, 111, 0, 0, 1636, 1637, 5, 114, 0, 0, 1637, 1638, 5, 45, 0, 0, 1638, 1639, 5, 115, 0, 0, 1639, 1640, 5, 101, 0, 0, 1640, 1641, 5, 108, 0, 0, 1641, 1642, 5, 102, 0, 0, 1642, 109, 1, 0, 0, 0, 1643, 1644, 5, 97, 0, 0, 1644, 1645, 5, 110, 0, 0, 1645, 1646, 5, 100, 0, 0, 1646, 111, 1, 0, 0, 0, 1647, 1648, 5, 97, 0, 0, 1648, 1649, 5, 114, 0, 0, 1649, 1650, 5, 114, 0, 0, 1650, 1651, 5, 97, 0, 0, 1651, 1652, 5, 121, 0, 0, 1652, 113, 1, 0, 0, 0, 1653, 1654, 5, 97, 0, 0, 1654, 1655, 5, 115, 0, 0, 1655, 115, 1, 0, 0, 0, 1656, 1657, 5, 97, 0, 0, 1657, 1658, 5, 115, 0, 0, 1658, 1659, 5, 99, 0, 0, 1659, 1660, 5, 101, 0, 0, 1660, 1661, 5, 110, 0, 0, 1661, 1662, 5, 100, 0, 0, 1662, 1663, 5, 105, 0, 0, 1663, 1664, 5, 110, 0, 0, 1664, 1665, 5, 103, 0, 0, 1665, 117, 1, 0, 0, 0, 1666, 1667, 5, 97, 0, 0, 1667, 1668, 5, 116, 0, 0, 1668, 119, 1, 0, 0, 0, 1669, 1670, 5, 97, 0, 0, 1670, 1671, 5, 116, 0, 0, 1671, 1672, 5, 116, 0, 0, 1672, 1673, 5, 114, 0, 0, 1673, 1674, 5, 105, 0, 0, 1674, 1675, 5, 98, 0, 0, 1675, 1676, 5, 117, 0, 0, 1676, 1677, 5, 116, 0, 0, 1677, 1678, 5, 101, 0, 0, 1678, 121, 1, 0, 0, 0, 1679, 1680, 5, 98, 0, 0, 1680, 1681, 5, 97, 0, 0, 1681, 1682, 5, 115, 0, 0, 1682, 1683, 5, 101, 0, 0, 1683, 1684, 5, 45, 0, 0, 1684, 1685, 5, 117, 0, 0, 1685, 1686, 5, 114, 0, 0, 1686, 1687, 5, 105, 0, 0, 1687, 123, 1, 0, 0, 0, 1688, 1689, 5, 98, 0, 0, 1689, 1690, 5, 111, 0, 0, 1690, 1691, 5, 117, 0, 0, 1691, 1692, 5, 110, 0, 0, 1692, 1693, 5, 100, 0, 0, 1693, 1694, 5, 97, 0, 0, 1694, 1695, 5, 114, 0, 0, 1695, 1696, 5, 121, 0, 0, 1696, 1697, 5, 45, 0, 0, 1697, 1698, 5, 115, 0, 0, 1698, 1699, 5, 112, 0, 0, 1699, 1700, 5, 97, 0, 0, 1700, 1701, 5, 99, 0, 0, 1701, 1702, 5, 101, 0, 0, 1702, 125, 1, 0, 0, 0, 1703, 1704, 5, 98, 0, 0, 1704, 1705, 5, 105, 0, 0, 1705, 1706, 5, 110, 0, 0, 1706, 1707, 5, 97, 0, 0, 1707, 1708, 5, 114, 0, 0, 1708, 1709, 5, 121, 0, 0, 1709, 127, 1, 0, 0, 0, 1710, 1711, 5, 98, 0, 0, 1711, 1712, 5, 121, 0, 0, 1712, 129, 1, 0, 0, 0, 1713, 1714, 5, 99, 0, 0, 1714, 1715, 5, 97, 0, 0, 1715, 1716, 5, 115, 0, 0, 1716, 1717, 5, 101, 0, 0, 1717, 131, 1, 0, 0, 0, 1718, 1719, 5, 99, 0, 0, 1719, 1720, 5, 97, 0, 0, 1720, 1721, 5, 115, 0, 0, 1721, 1722, 5, 116, 0, 0, 1722, 133, 1, 0, 0, 0, 1723, 1724, 5, 99, 0, 0, 1724, 1725, 5, 97, 0, 0, 1725, 1726, 5, 115, 0, 0, 1726, 1727, 5, 116, 0, 0, 1727, 1728, 5, 97, 0, 0, 1728, 1729, 5, 98, 0, 0, 1729, 1730, 5, 108, 0, 0, 1730, 1731, 5, 101, 0, 0, 1731, 135, 1, 0, 0, 0, 1732, 1733, 5, 99, 0, 0, 1733, 1734, 5, 97, 0, 0, 1734, 1735, 5, 116, 0, 0, 1735, 1736, 5, 99, 0, 0, 1736, 1737, 5, 104, 0, 0, 1737, 137, 1, 0, 0, 0, 1738, 1739, 5, 99, 0, 0, 1739, 1740, 5, 104, 0, 0, 1740, 1741, 5, 105, 0, 0, 1741, 1742, 5, 108, 0, 0, 1742, 1743, 5, 100, 0, 0, 1743, 139, 1, 0, 0, 0, 1744, 1745, 5, 99, 0, 0, 1745, 1746, 5, 111, 0, 0, 1746, 1747, 5, 108, 0, 0, 1747, 1748, 5, 108, 0, 0, 1748, 1749, 5, 97, 0, 0, 1749, 1750, 5, 116, 0, 0, 1750, 1751, 5, 105, 0, 0, 1751, 1752, 5, 111, 0, 0, 1752, 1753, 5, 110, 0, 0, 1753, 141, 1, 0, 0, 0, 1754, 1755, 5, 99, 0, 0, 1755, 1756, 5, 111, 0, 0, 1756, 1757, 5, 109, 0, 0, 1757, 1758, 5, 109, 0, 0, 1758, 1759, 5, 101, 0, 0, 1759, 1760, 5, 110, 0, 0, 1760, 1761, 5, 116, 0, 0, 1761, 143, 1, 0, 0, 0, 1762, 1763, 5, 99, 0, 0, 1763, 1764, 5, 111, 0, 0, 1764, 1765, 5, 110, 0, 0, 1765, 1766, 5, 115, 0, 0, 1766, 1767, 5, 116, 0, 0, 1767, 1768, 5, 114, 0, 0, 1768, 1769, 5, 117, 0, 0, 1769, 1770, 5, 99, 0, 0, 1770, 1771, 5, 116, 0, 0, 1771, 1772, 5, 105, 0, 0, 1772, 1773, 5, 111, 0, 0, 1773, 1774, 5, 110, 0, 0, 1774, 145, 1, 0, 0, 0, 1775, 1776, 5, 99, 0, 0, 1776, 1777, 5, 111, 0, 0, 1777, 1778, 5, 110, 0, 0, 1778, 1779, 5, 116, 0, 0, 1779, 1780, 5, 101, 0, 0, 1780, 1781, 5, 120, 0, 0, 1781, 1782, 5, 116, 0, 0, 1782, 147, 1, 0, 0, 0, 1783, 1784, 5, 99, 0, 0, 1784, 1785, 5, 111, 0, 0, 1785, 1786, 5, 112, 0, 0, 1786, 1787, 5, 121, 0, 0, 1787, 1788, 5, 45, 0, 0, 1788, 1789, 5, 110, 0, 0, 1789, 1790, 5, 97, 0, 0, 1790, 1791, 5, 109, 0, 0, 1791, 1792, 5, 101, 0, 0, 1792, 1793, 5, 115, 0, 0, 1793, 1794, 5, 112, 0, 0, 1794, 1795, 5, 97, 0, 0, 1795, 1796, 5, 99, 0, 0, 1796, 1797, 5, 101, 0, 0, 1797, 1798, 5, 115, 0, 0, 1798, 149, 1, 0, 0, 0, 1799, 1800, 5, 99, 0, 0, 1800, 1801, 5, 111, 0, 0, 1801, 1802, 5, 117, 0, 0, 1802, 1803, 5, 110, 0, 0, 1803, 1804, 5, 116, 0, 0, 1804, 151, 1, 0, 0, 0, 1805, 1806, 5, 100, 0, 0, 1806, 1807, 5, 101, 0, 0, 1807, 1808, 5, 99, 0, 0, 1808, 1809, 5, 108, 0, 0, 1809, 1810, 5, 97, 0, 0, 1810, 1811, 5, 114, 0, 0, 1811, 1812, 5, 101, 0, 0, 1812, 153, 1, 0, 0, 0, 1813, 1814, 5, 100, 0, 0, 1814, 1815, 5, 101, 0, 0, 1815, 1816, 5, 102, 0, 0, 1816, 1817, 5, 97, 0, 0, 1817, 1818, 5, 117, 0, 0, 1818, 1819, 5, 108, 0, 0, 1819, 1820, 5, 116, 0, 0, 1820, 155, 1, 0, 0, 0, 1821, 1822, 5, 100, 0, 0, 1822, 1823, 5, 101, 0, 0, 1823, 1824, 5, 115, 0, 0, 1824, 1825, 5, 99, 0, 0, 1825, 1826, 5, 101, 0, 0, 1826, 1827, 5, 110, 0, 0, 1827, 1828, 5, 100, 0, 0, 1828, 1829, 5, 97, 0, 0, 1829, 1830, 5, 110, 0, 0, 1830, 1831, 5, 116, 0, 0, 1831, 157, 1, 0, 0, 0, 1832, 1833, 5, 100, 0, 0, 1833, 1834, 5, 101, 0, 0, 1834, 1835, 5, 115, 0, 0, 1835, 1836, 5, 99, 0, 0, 1836, 1837, 5, 101, 0, 0, 1837, 1838, 5, 110, 0, 0, 1838, 1839, 5, 100, 0, 0, 1839, 1840, 5, 97, 0, 0, 1840, 1841, 5, 110, 0, 0, 1841, 1842, 5, 116, 0, 0, 1842, 1843, 5, 45, 0, 0, 1843, 1844, 5, 111, 0, 0, 1844, 1845, 5, 114, 0, 0, 1845, 1846, 5, 45, 0, 0, 1846, 1847, 5, 115, 0, 0, 1847, 1848, 5, 101, 0, 0, 1848, 1849, 5, 108, 0, 0, 1849, 1850, 5, 102, 0, 0, 1850, 159, 1, 0, 0, 0, 1851, 1852, 5, 100, 0, 0, 1852, 1853, 5, 101, 0, 0, 1853, 1854, 5, 115, 0, 0, 1854, 1855, 5, 99, 0, 0, 1855, 1856, 5, 101, 0, 0, 1856, 1857, 5, 110, 0, 0, 1857, 1858, 5, 100, 0, 0, 1858, 1859, 5, 105, 0, 0, 1859, 1860, 5, 110, 0, 0, 1860, 1861, 5, 103, 0, 0, 1861, 161, 1, 0, 0, 0, 1862, 1863, 5, 100, 0, 0, 1863, 1864, 5, 101, 0, 0, 1864, 1865, 5, 99, 0, 0, 1865, 1866, 5, 105, 0, 0, 1866, 1867, 5, 109, 0, 0, 1867, 1868, 5, 97, 0, 0, 1868, 1869, 5, 108, 0, 0, 1869, 1870, 5, 45, 0, 0, 1870, 1871, 5, 102, 0, 0, 1871, 1872, 5, 111, 0, 0, 1872, 1873, 5, 114, 0, 0, 1873, 1874, 5, 109, 0, 0, 1874, 1875, 5, 97, 0, 0, 1875, 1876, 5, 116, 0, 0, 1876, 163, 1, 0, 0, 0, 1877, 1878, 5, 100, 0, 0, 1878, 1879, 5, 105, 0, 0, 1879, 1880, 5, 118, 0, 0, 1880, 165, 1, 0, 0, 0, 1881, 1882, 5, 100, 0, 0, 1882, 1883, 5, 111, 0, 0, 1883, 1884, 5, 99, 0, 0, 1884, 1885, 5, 117, 0, 0, 1885, 1886, 5, 109, 0, 0, 1886, 1887, 5, 101, 0, 0, 1887, 1888, 5, 110, 0, 0, 1888, 1889, 5, 116, 0, 0, 1889, 167, 1, 0, 0, 0, 1890, 1891, 5, 100, 0, 0, 1891, 1892, 5, 111, 0, 0, 1892, 1893, 5, 99, 0, 0, 1893, 1894, 5, 117, 0, 0, 1894, 1895, 5, 109, 0, 0, 1895, 1896, 5, 101, 0, 0, 1896, 1897, 5, 110, 0, 0, 1897, 1898, 5, 116, 0, 0, 1898, 1899, 5, 45, 0, 0, 1899, 1900, 5, 110, 0, 0, 1900, 1901, 5, 111, 0, 0, 1901, 1902, 5, 100, 0, 0, 1902, 1903, 5, 101, 0, 0, 1903, 169, 1, 0, 0, 0, 1904, 1905, 5, 101, 0, 0, 1905, 1906, 5, 108, 0, 0, 1906, 1907, 5, 101, 0, 0, 1907, 1908, 5, 109, 0, 0, 1908, 1909, 5, 101, 0, 0, 1909, 1910, 5, 110, 0, 0, 1910, 1911, 5, 116, 0, 0, 1911, 171, 1, 0, 0, 0, 1912, 1913, 5, 101, 0, 0, 1913, 1914, 5, 108, 0, 0, 1914, 1915, 5, 115, 0, 0, 1915, 1916, 5, 101, 0, 0, 1916, 173, 1, 0, 0, 0, 1917, 1918, 5, 101, 0, 0, 1918, 1919, 5, 109, 0, 0, 1919, 1920, 5, 112, 0, 0, 1920, 1921, 5, 116, 0, 0, 1921, 1922, 5, 121, 0, 0, 1922, 175, 1, 0, 0, 0, 1923, 1924, 5, 101, 0, 0, 1924, 1925, 5, 109, 0, 0, 1925, 1926, 5, 112, 0, 0, 1926, 1927, 5, 116, 0, 0, 1927, 1928, 5, 121, 0, 0, 1928, 1929, 5, 45, 0, 0, 1929, 1930, 5, 115, 0, 0, 1930, 1931, 5, 101, 0, 0, 1931, 1932, 5, 113, 0, 0, 1932, 1933, 5, 117, 0, 0, 1933, 1934, 5, 101, 0, 0, 1934, 1935, 5, 110, 0, 0, 1935, 1936, 5, 99, 0, 0, 1936, 1937, 5, 101, 0, 0, 1937, 177, 1, 0, 0, 0, 1938, 1939, 5, 101, 0, 0, 1939, 1940, 5, 110, 0, 0, 1940, 1941, 5, 99, 0, 0, 1941, 1942, 5, 111, 0, 0, 1942, 1943, 5, 100, 0, 0, 1943, 1944, 5, 105, 0, 0, 1944, 1945, 5, 110, 0, 0, 1945, 1946, 5, 103, 0, 0, 1946, 179, 1, 0, 0, 0, 1947, 1948, 5, 101, 0, 0, 1948, 1949, 5, 110, 0, 0, 1949, 1950, 5, 100, 0, 0, 1950, 181, 1, 0, 0, 0, 1951, 1952, 5, 101, 0, 0, 1952, 1953, 5, 113, 0, 0, 1953, 183, 1, 0, 0, 0, 1954, 1955, 5, 101, 0, 0, 1955, 1956, 5, 118, 0, 0, 1956, 1957, 5, 101, 0, 0, 1957, 1958, 5, 114, 0, 0, 1958, 1959, 5, 121, 0, 0, 1959, 185, 1, 0, 0, 0, 1960, 1961, 5, 101, 0, 0, 1961, 1962, 5, 120, 0, 0, 1962, 1963, 5, 99, 0, 0, 1963, 1964, 5, 101, 0, 0, 1964, 1965, 5, 112, 0, 0, 1965, 1966, 5, 116, 0, 0, 1966, 187, 1, 0, 0, 0, 1967, 1968, 5, 101, 0, 0, 1968, 1969, 5, 120, 0, 0, 1969, 1970, 5, 116, 0, 0, 1970, 1971, 5, 101, 0, 0, 1971, 1972, 5, 114, 0, 0, 1972, 1973, 5, 110, 0, 0, 1973, 1974, 5, 97, 0, 0, 1974, 1975, 5, 108, 0, 0, 1975, 189, 1, 0, 0, 0, 1976, 1977, 5, 102, 0, 0, 1977, 1978, 5, 111, 0, 0, 1978, 1979, 5, 108, 0, 0, 1979, 1980, 5, 108, 0, 0, 1980, 1981, 5, 111, 0, 0, 1981, 1982, 5, 119, 0, 0, 1982, 1983, 5, 105, 0, 0, 1983, 1984, 5, 110, 0, 0, 1984, 1985, 5, 103, 0, 0, 1985, 191, 1, 0, 0, 0, 1986, 1987, 5, 102, 0, 0, 1987, 1988, 5, 111, 0, 0, 1988, 1989, 5, 108, 0, 0, 1989, 1990, 5, 108, 0, 0, 1990, 1991, 5, 111, 0, 0, 1991, 1992, 5, 119, 0, 0, 1992, 1993, 5, 105, 0, 0, 1993, 1994, 5, 110, 0, 0, 1994, 1995, 5, 103, 0, 0, 1995, 1996, 5, 45, 0, 0, 1996, 1997, 5, 115, 0, 0, 1997, 1998, 5, 105, 0, 0, 1998, 1999, 5, 98, 0, 0, 1999, 2000, 5, 108, 0, 0, 2000, 2001, 5, 105, 0, 0, 2001, 2002, 5, 110, 0, 0, 2002, 2003, 5, 103, 0, 0, 2003, 193, 1, 0, 0, 0, 2004, 2005, 5, 102, 0, 0, 2005, 2006, 5, 111, 0, 0, 2006, 2007, 5, 114, 0, 0, 2007, 195, 1, 0, 0, 0, 2008, 2009, 5, 102, 0, 0, 2009, 2010, 5, 117, 0, 0, 2010, 2011, 5, 110, 0, 0, 2011, 2012, 5, 99, 0, 0, 2012, 2013, 5, 116, 0, 0, 2013, 2014, 5, 105, 0, 0, 2014, 2015, 5, 111, 0, 0, 2015, 2016, 5, 110, 0, 0, 2016, 197, 1, 0, 0, 0, 2017, 2018, 5, 103, 0, 0, 2018, 2019, 5, 101, 0, 0, 2019, 199, 1, 0, 0, 0, 2020, 2021, 5, 103, 0, 0, 2021, 2022, 5, 114, 0, 0, 2022, 2023, 5, 101, 0, 0, 2023, 2024, 5, 97, 0, 0, 2024, 2025, 5, 116, 0, 0, 2025, 2026, 5, 101, 0, 0, 2026, 2027, 5, 115, 0, 0, 2027, 2028, 5, 116, 0, 0, 2028, 201, 1, 0, 0, 0, 2029, 2030, 5, 103, 0, 0, 2030, 2031, 5, 114, 0, 0, 2031, 2032, 5, 111, 0, 0, 2032, 2033, 5, 117, 0, 0, 2033, 2034, 5, 112, 0, 0, 2034, 203, 1, 0, 0, 0, 2035, 2036, 5, 103, 0, 0, 2036, 2037, 5, 116, 0, 0, 2037, 205, 1, 0, 0, 0, 2038, 2039, 5, 105, 0, 0, 2039, 2040, 5, 100, 0, 0, 2040, 2041, 5, 105, 0, 0, 2041, 2042, 5, 118, 0, 0, 2042, 207, 1, 0, 0, 0, 2043, 2044, 5, 105, 0, 0, 2044, 2045, 5, 102, 0, 0, 2045, 209, 1, 0, 0, 0, 2046, 2047, 5, 105, 0, 0, 2047, 2048, 5, 109, 0, 0, 2048, 2049, 5, 112, 0, 0, 2049, 2050, 5, 111, 0, 0, 2050, 2051, 5, 114, 0, 0, 2051, 2052, 5, 116, 0, 0, 2052, 211, 1, 0, 0, 0, 2053, 2054, 5, 105, 0, 0, 2054, 2055, 5, 110, 0, 0, 2055, 213, 1, 0, 0, 0, 2056, 2057, 5, 105, 0, 0, 2057, 2058, 5, 110, 0, 0, 2058, 2059, 5, 104, 0, 0, 2059, 2060, 5, 101, 0, 0, 2060, 2061, 5, 114, 0, 0, 2061, 2062, 5, 105, 0, 0, 2062, 2063, 5, 116, 0, 0, 2063, 215, 1, 0, 0, 0, 2064, 2065, 5, 105, 0, 0, 2065, 2066, 5, 110, 0, 0, 2066, 2067, 5, 115, 0, 0, 2067, 2068, 5, 116, 0, 0, 2068, 2069, 5, 97, 0, 0, 2069, 2070, 5, 110, 0, 0, 2070, 2071, 5, 99, 0, 0, 2071, 2072, 5, 101, 0, 0, 2072, 217, 1, 0, 0, 0, 2073, 2074, 5, 105, 0, 0, 2074, 2075, 5, 110, 0, 0, 2075, 2076, 5, 116, 0, 0, 2076, 2077, 5, 101, 0, 0, 2077, 2078, 5, 114, 0, 0, 2078, 2079, 5, 115, 0, 0, 2079, 2080, 5, 101, 0, 0, 2080, 2081, 5, 99, 0, 0, 2081, 2082, 5, 116, 0, 0, 2082, 219, 1, 0, 0, 0, 2083, 2084, 5, 105, 0, 0, 2084, 2085, 5, 115, 0, 0, 2085, 221, 1, 0, 0, 0, 2086, 2087, 5, 105, 0, 0, 2087, 2088, 5, 116, 0, 0, 2088, 2089, 5, 101, 0, 0, 2089, 2090, 5, 109, 0, 0, 2090, 223, 1, 0, 0, 0, 2091, 2092, 5, 108, 0, 0, 2092, 2093, 5, 97, 0, 0, 2093, 2094, 5, 120, 0, 0, 2094, 225, 1, 0, 0, 0, 2095, 2096, 5, 108, 0, 0, 2096, 2097, 5, 101, 0, 0, 2097, 227, 1, 0, 0, 0, 2098, 2099, 5, 108, 0, 0, 2099, 2100, 5, 101, 0, 0, 2100, 2101, 5, 97, 0, 0, 2101, 2102, 5, 115, 0, 0, 2102, 2103, 5, 116, 0, 0, 2103, 229, 1, 0, 0, 0, 2104, 2105, 5, 108, 0, 0, 2105, 2106, 5, 101, 0, 0, 2106, 2107, 5, 116, 0, 0, 2107, 231, 1, 0, 0, 0, 2108, 2109, 5, 108, 0, 0, 2109, 2110, 5, 116, 0, 0, 2110, 233, 1, 0, 0, 0, 2111, 2112, 5, 109, 0, 0, 2112, 2113, 5, 97, 0, 0, 2113, 2114, 5, 112, 0, 0, 2114, 235, 1, 0, 0, 0, 2115, 2116, 5, 109, 0, 0, 2116, 2117, 5, 111, 0, 0, 2117, 2118, 5, 100, 0, 0, 2118, 237, 1, 0, 0, 0, 2119, 2120, 5, 109, 0, 0, 2120, 2121, 5, 111, 0, 0, 2121, 2122, 5, 100, 0, 0, 2122, 2123, 5, 117, 0, 0, 2123, 2124, 5, 108, 0, 0, 2124, 2125, 5, 101, 0, 0, 2125, 239, 1, 0, 0, 0, 2126, 2127, 5, 110, 0, 0, 2127, 2128, 5, 97, 0, 0, 2128, 2129, 5, 109, 0, 0, 2129, 2130, 5, 101, 0, 0, 2130, 2131, 5, 115, 0, 0, 2131, 2132, 5, 112, 0, 0, 2132, 2133, 5, 97, 0, 0, 2133, 2134, 5, 99, 0, 0, 2134, 2135, 5, 101, 0, 0, 2135, 241, 1, 0, 0, 0, 2136, 2137, 5, 110, 0, 0, 2137, 2138, 5, 101, 0, 0, 2138, 243, 1, 0, 0, 0, 2139, 2140, 5, 110, 0, 0, 2140, 2141, 5, 101, 0, 0, 2141, 2142, 5, 120, 0, 0, 2142, 2143, 5, 116, 0, 0, 2143, 245, 1, 0, 0, 0, 2144, 2145, 5, 110, 0, 0, 2145, 2146, 5, 97, 0, 0, 2146, 2147, 5, 109, 0, 0, 2147, 2148, 5, 101, 0, 0, 2148, 2149, 5, 115, 0, 0, 2149, 2150, 5, 112, 0, 0, 2150, 2151, 5, 97, 0, 0, 2151, 2152, 5, 99, 0, 0, 2152, 2153, 5, 101, 0, 0, 2153, 2154, 5, 45, 0, 0, 2154, 2155, 5, 110, 0, 0, 2155, 2156, 5, 111, 0, 0, 2156, 2157, 5, 100, 0, 0, 2157, 2158, 5, 101, 0, 0, 2158, 247, 1, 0, 0, 0, 2159, 2160, 5, 110, 0, 0, 2160, 2161, 5, 111, 0, 0, 2161, 2162, 5, 45, 0, 0, 2162, 2163, 5, 105, 0, 0, 2163, 2164, 5, 110, 0, 0, 2164, 2165, 5, 104, 0, 0, 2165, 2166, 5, 101, 0, 0, 2166, 2167, 5, 114, 0, 0, 2167, 2168, 5, 105, 0, 0, 2168, 2169, 5, 116, 0, 0, 2169, 249, 1, 0, 0, 0, 2170, 2171, 5, 110, 0, 0, 2171, 2172, 5, 111, 0, 0, 2172, 2173, 5, 45, 0, 0, 2173, 2174, 5, 112, 0, 0, 2174, 2175, 5, 114, 0, 0, 2175, 2176, 5, 101, 0, 0, 2176, 2177, 5, 115, 0, 0, 2177, 2178, 5, 101, 0, 0, 2178, 2179, 5, 114, 0, 0, 2179, 2180, 5, 118, 0, 0, 2180, 2181, 5, 101, 0, 0, 2181, 251, 1, 0, 0, 0, 2182, 2183, 5, 110, 0, 0, 2183, 2184, 5, 111, 0, 0, 2184, 2185, 5, 100, 0, 0, 2185, 2186, 5, 101, 0, 0, 2186, 253, 1, 0, 0, 0, 2187, 2188, 5, 111, 0, 0, 2188, 2189, 5, 102, 0, 0, 2189, 255, 1, 0, 0, 0, 2190, 2191, 5, 111, 0, 0, 2191, 2192, 5, 110, 0, 0, 2192, 2193, 5, 108, 0, 0, 2193, 2194, 5, 121, 0, 0, 2194, 257, 1, 0, 0, 0, 2195, 2196, 5, 111, 0, 0, 2196, 2197, 5, 112, 0, 0, 2197, 2198, 5, 116, 0, 0, 2198, 2199, 5, 105, 0, 0, 2199, 2200, 5, 111, 0, 0, 2200, 2201, 5, 110, 0, 0, 2201, 259, 1, 0, 0, 0, 2202, 2203, 5, 111, 0, 0, 2203, 2204, 5, 114, 0, 0, 2204, 261, 1, 0, 0, 0, 2205, 2206, 5, 111, 0, 0, 2206, 2207, 5, 114, 0, 0, 2207, 2208, 5, 100, 0, 0, 2208, 2209, 5, 101, 0, 0, 2209, 2210, 5, 114, 0, 0, 2210, 263, 1, 0, 0, 0, 2211, 2212, 5, 111, 0, 0, 2212, 2213, 5, 114, 0, 0, 2213, 2214, 5, 100, 0, 0, 2214, 2215, 5, 101, 0, 0, 2215, 2216, 5, 114, 0, 0, 2216, 2217, 5, 101, 0, 0, 2217, 2218, 5, 100, 0, 0, 2218, 265, 1, 0, 0, 0, 2219, 2220, 5, 111, 0, 0, 2220, 2221, 5, 114, 0, 0, 2221, 2222, 5, 100, 0, 0, 2222, 2223, 5, 101, 0, 0, 2223, 2224, 5, 114, 0, 0, 2224, 2225, 5, 105, 0, 0, 2225, 2226, 5, 110, 0, 0, 2226, 2227, 5, 103, 0, 0, 2227, 267, 1, 0, 0, 0, 2228, 2229, 5, 112, 0, 0, 2229, 2230, 5, 97, 0, 0, 2230, 2231, 5, 114, 0, 0, 2231, 2232, 5, 101, 0, 0, 2232, 2233, 5, 110, 0, 0, 2233, 2234, 5, 116, 0, 0, 2234, 269, 1, 0, 0, 0, 2235, 2236, 5, 112, 0, 0, 2236, 2237, 5, 114, 0, 0, 2237, 2238, 5, 101, 0, 0, 2238, 2239, 5, 99, 0, 0, 2239, 2240, 5, 101, 0, 0, 2240, 2241, 5, 100, 0, 0, 2241, 2242, 5, 105, 0, 0, 2242, 2243, 5, 110, 0, 0, 2243, 2244, 5, 103, 0, 0, 2244, 271, 1, 0, 0, 0, 2245, 2246, 5, 112, 0, 0, 2246, 2247, 5, 114, 0, 0, 2247, 2248, 5, 101, 0, 0, 2248, 2249, 5, 99, 0, 0, 2249, 2250, 5, 101, 0, 0, 2250, 2251, 5, 100, 0, 0, 2251, 2252, 5, 105, 0, 0, 2252, 2253, 5, 110, 0, 0, 2253, 2254, 5, 103, 0, 0, 2254, 2255, 5, 45, 0, 0, 2255, 2256, 5, 115, 0, 0, 2256, 2257, 5, 105, 0, 0, 2257, 2258, 5, 98, 0, 0, 2258, 2259, 5, 108, 0, 0, 2259, 2260, 5, 105, 0, 0, 2260, 2261, 5, 110, 0, 0, 2261, 2262, 5, 103, 0, 0, 2262, 273, 1, 0, 0, 0, 2263, 2264, 5, 112, 0, 0, 2264, 2265, 5, 114, 0, 0, 2265, 2266, 5, 101, 0, 0, 2266, 2267, 5, 115, 0, 0, 2267, 2268, 5, 101, 0, 0, 2268, 2269, 5, 114, 0, 0, 2269, 2270, 5, 118, 0, 0, 2270, 2271, 5, 101, 0, 0, 2271, 275, 1, 0, 0, 0, 2272, 2273, 5, 112, 0, 0, 2273, 2274, 5, 114, 0, 0, 2274, 2275, 5, 101, 0, 0, 2275, 2276, 5, 118, 0, 0, 2276, 2277, 5, 105, 0, 0, 2277, 2278, 5, 111, 0, 0, 2278, 2279, 5, 117, 0, 0, 2279, 2280, 5, 115, 0, 0, 2280, 277, 1, 0, 0, 0, 2281, 2282, 5, 112, 0, 0, 2282, 2283, 5, 114, 0, 0, 2283, 2284, 5, 111, 0, 0, 2284, 2285, 5, 99, 0, 0, 2285, 2286, 5, 101, 0, 0, 2286, 2287, 5, 115, 0, 0, 2287, 2288, 5, 115, 0, 0, 2288, 2289, 5, 105, 0, 0, 2289, 2290, 5, 110, 0, 0, 2290, 2291, 5, 103, 0, 0, 2291, 2292, 5, 45, 0, 0, 2292, 2293, 5, 105, 0, 0, 2293, 2294, 5, 110, 0, 0, 2294, 2295, 5, 115, 0, 0, 2295, 2296, 5, 116, 0, 0, 2296, 2297, 5, 114, 0, 0, 2297, 2298, 5, 117, 0, 0, 2298, 2299, 5, 99, 0, 0, 2299, 2300, 5, 116, 0, 0, 2300, 2301, 5, 105, 0, 0, 2301, 2302, 5, 111, 0, 0, 2302, 2303, 5, 110, 0, 0, 2303, 279, 1, 0, 0, 0, 2304, 2305, 5, 114, 0, 0, 2305, 2306, 5, 101, 0, 0, 2306, 2307, 5, 116, 0, 0, 2307, 2308, 5, 117, 0, 0, 2308, 2309, 5, 114, 0, 0, 2309, 2310, 5, 110, 0, 0, 2310, 281, 1, 0, 0, 0, 2311, 2312, 5, 115, 0, 0, 2312, 2313, 5, 97, 0, 0, 2313, 2314, 5, 116, 0, 0, 2314, 2315, 5, 105, 0, 0, 2315, 2316, 5, 115, 0, 0, 2316, 2317, 5, 102, 0, 0, 2317, 2318, 5, 105, 0, 0, 2318, 2319, 5, 101, 0, 0, 2319, 2320, 5, 115, 0, 0, 2320, 283, 1, 0, 0, 0, 2321, 2322, 5, 115, 0, 0, 2322, 2323, 5, 99, 0, 0, 2323, 2324, 5, 104, 0, 0, 2324, 2325, 5, 101, 0, 0, 2325, 2326, 5, 109, 0, 0, 2326, 2327, 5, 97, 0, 0, 2327, 285, 1, 0, 0, 0, 2328, 2329, 5, 115, 0, 0, 2329, 2330, 5, 99, 0, 0, 2330, 2331, 5, 104, 0, 0, 2331, 2332, 5, 101, 0, 0, 2332, 2333, 5, 109, 0, 0, 2333, 2334, 5, 97, 0, 0, 2334, 2335, 5, 45, 0, 0, 2335, 2336, 5, 97, 0, 0, 2336, 2337, 5, 116, 0, 0, 2337, 2338, 5, 116, 0, 0, 2338, 2339, 5, 114, 0, 0, 2339, 2340, 5, 105, 0, 0, 2340, 2341, 5, 98, 0, 0, 2341, 2342, 5, 117, 0, 0, 2342, 2343, 5, 116, 0, 0, 2343, 2344, 5, 101, 0, 0, 2344, 287, 1, 0, 0, 0, 2345, 2346, 5, 115, 0, 0, 2346, 2347, 5, 99, 0, 0, 2347, 2348, 5, 104, 0, 0, 2348, 2349, 5, 101, 0, 0, 2349, 2350, 5, 109, 0, 0, 2350, 2351, 5, 97, 0, 0, 2351, 2352, 5, 45, 0, 0, 2352, 2353, 5, 101, 0, 0, 2353, 2354, 5, 108, 0, 0, 2354, 2355, 5, 101, 0, 0, 2355, 2356, 5, 109, 0, 0, 2356, 2357, 5, 101, 0, 0, 2357, 2358, 5, 110, 0, 0, 2358, 2359, 5, 116, 0, 0, 2359, 289, 1, 0, 0, 0, 2360, 2361, 5, 115, 0, 0, 2361, 2362, 5, 101, 0, 0, 2362, 2363, 5, 108, 0, 0, 2363, 2364, 5, 102, 0, 0, 2364, 291, 1, 0, 0, 0, 2365, 2366, 5, 115, 0, 0, 2366, 2367, 5, 108, 0, 0, 2367, 2368, 5, 105, 0, 0, 2368, 2369, 5, 100, 0, 0, 2369, 2370, 5, 105, 0, 0, 2370, 2371, 5, 110, 0, 0, 2371, 2372, 5, 103, 0, 0, 2372, 293, 1, 0, 0, 0, 2373, 2374, 5, 115, 0, 0, 2374, 2375, 5, 111, 0, 0, 2375, 2376, 5, 109, 0, 0, 2376, 2377, 5, 101, 0, 0, 2377, 295, 1, 0, 0, 0, 2378, 2379, 5, 115, 0, 0, 2379, 2380, 5, 116, 0, 0, 2380, 2381, 5, 97, 0, 0, 2381, 2382, 5, 98, 0, 0, 2382, 2383, 5, 108, 0, 0, 2383, 2384, 5, 101, 0, 0, 2384, 297, 1, 0, 0, 0, 2385, 2386, 5, 115, 0, 0, 2386, 2387, 5, 116, 0, 0, 2387, 2388, 5, 97, 0, 0, 2388, 2389, 5, 114, 0, 0, 2389, 2390, 5, 116, 0, 0, 2390, 299, 1, 0, 0, 0, 2391, 2392, 5, 115, 0, 0, 2392, 2393, 5, 116, 0, 0, 2393, 2394, 5, 114, 0, 0, 2394, 2395, 5, 105, 0, 0, 2395, 2396, 5, 99, 0, 0, 2396, 2397, 5, 116, 0, 0, 2397, 301, 1, 0, 0, 0, 2398, 2399, 5, 115, 0, 0, 2399, 2400, 5, 116, 0, 0, 2400, 2401, 5, 114, 0, 0, 2401, 2402, 5, 105, 0, 0, 2402, 2403, 5, 112, 0, 0, 2403, 303, 1, 0, 0, 0, 2404, 2405, 5, 115, 0, 0, 2405, 2406, 5, 119, 0, 0, 2406, 2407, 5, 105, 0, 0, 2407, 2408, 5, 116, 0, 0, 2408, 2409, 5, 99, 0, 0, 2409, 2410, 5, 104, 0, 0, 2410, 305, 1, 0, 0, 0, 2411, 2412, 5, 116, 0, 0, 2412, 2413, 5, 101, 0, 0, 2413, 2414, 5, 120, 0, 0, 2414, 2415, 5, 116, 0, 0, 2415, 307, 1, 0, 0, 0, 2416, 2417, 5, 116, 0, 0, 2417, 2418, 5, 104, 0, 0, 2418, 2419, 5, 101, 0, 0, 2419, 2420, 5, 110, 0, 0, 2420, 309, 1, 0, 0, 0, 2421, 2422, 5, 116, 0, 0, 2422, 2423, 5, 111, 0, 0, 2423, 311, 1, 0, 0, 0, 2424, 2425, 5, 116, 0, 0, 2425, 2426, 5, 114, 0, 0, 2426, 2427, 5, 101, 0, 0, 2427, 2428, 5, 97, 0, 0, 2428, 2429, 5, 116, 0, 0, 2429, 313, 1, 0, 0, 0, 2430, 2431, 5, 116, 0, 0, 2431, 2432, 5, 114, 0, 0, 2432, 2433, 5, 121, 0, 0, 2433, 315, 1, 0, 0, 0, 2434, 2435, 5, 116, 0, 0, 2435, 2436, 5, 117, 0, 0, 2436, 2437, 5, 109, 0, 0, 2437, 2438, 5, 98, 0, 0, 2438, 2439, 5, 108, 0, 0, 2439, 2440, 5, 105, 0, 0, 2440, 2441, 5, 110, 0, 0, 2441, 2442, 5, 103, 0, 0, 2442, 317, 1, 0, 0, 0, 2443, 2444, 5, 116, 0, 0, 2444, 2445, 5, 121, 0, 0, 2445, 2446, 5, 112, 0, 0, 2446, 2447, 5, 101, 0, 0, 2447, 319, 1, 0, 0, 0, 2448, 2449, 5, 116, 0, 0, 2449, 2450, 5, 121, 0, 0, 2450, 2451, 5, 112, 0, 0, 2451, 2452, 5, 101, 0, 0, 2452, 2453, 5, 115, 0, 0, 2453, 2454, 5, 119, 0, 0, 2454, 2455, 5, 105, 0, 0, 2455, 2456, 5, 116, 0, 0, 2456, 2457, 5, 99, 0, 0, 2457, 2458, 5, 104, 0, 0, 2458, 321, 1, 0, 0, 0, 2459, 2460, 5, 117, 0, 0, 2460, 2461, 5, 110, 0, 0, 2461, 2462, 5, 105, 0, 0, 2462, 2463, 5, 111, 0, 0, 2463, 2464, 5, 110, 0, 0, 2464, 323, 1, 0, 0, 0, 2465, 2466, 5, 117, 0, 0, 2466, 2467, 5, 110, 0, 0, 2467, 2468, 5, 111, 0, 0, 2468, 2469, 5, 114, 0, 0, 2469, 2470, 5, 100, 0, 0, 2470, 2471, 5, 101, 0, 0, 2471, 2472, 5, 114, 0, 0, 2472, 2473, 5, 101, 0, 0, 2473, 2474, 5, 100, 0, 0, 2474, 325, 1, 0, 0, 0, 2475, 2476, 5, 117, 0, 0, 2476, 2477, 5, 112, 0, 0, 2477, 2478, 5, 100, 0, 0, 2478, 2479, 5, 97, 0, 0, 2479, 2480, 5, 116, 0, 0, 2480, 2481, 5, 101, 0, 0, 2481, 327, 1, 0, 0, 0, 2482, 2483, 5, 118, 0, 0, 2483, 2484, 5, 97, 0, 0, 2484, 2485, 5, 108, 0, 0, 2485, 2486, 5, 105, 0, 0, 2486, 2487, 5, 100, 0, 0, 2487, 2488, 5, 97, 0, 0, 2488, 2489, 5, 116, 0, 0, 2489, 2490, 5, 101, 0, 0, 2490, 329, 1, 0, 0, 0, 2491, 2492, 5, 118, 0, 0, 2492, 2493, 5, 97, 0, 0, 2493, 2494, 5, 114, 0, 0, 2494, 2495, 5, 105, 0, 0, 2495, 2496, 5, 97, 0, 0, 2496, 2497, 5, 98, 0, 0, 2497, 2498, 5, 108, 0, 0, 2498, 2499, 5, 101, 0, 0, 2499, 331, 1, 0, 0, 0, 2500, 2501, 5, 118, 0, 0, 2501, 2502, 5, 101, 0, 0, 2502, 2503, 5, 114, 0, 0, 2503, 2504, 5, 115, 0, 0, 2504, 2505, 5, 105, 0, 0, 2505, 2506, 5, 111, 0, 0, 2506, 2507, 5, 110, 0, 0, 2507, 333, 1, 0, 0, 0, 2508, 2509, 5, 119, 0, 0, 2509, 2510, 5, 104, 0, 0, 2510, 2511, 5, 101, 0, 0, 2511, 2512, 5, 110, 0, 0, 2512, 335, 1, 0, 0, 0, 2513, 2514, 5, 119, 0, 0, 2514, 2515, 5, 104, 0, 0, 2515, 2516, 5, 101, 0, 0, 2516, 2517, 5, 114, 0, 0, 2517, 2518, 5, 101, 0, 0, 2518, 337, 1, 0, 0, 0, 2519, 2520, 5, 119, 0, 0, 2520, 2521, 5, 105, 0, 0, 2521, 2522, 5, 110, 0, 0, 2522, 2523, 5, 100, 0, 0, 2523, 2524, 5, 111, 0, 0, 2524, 2525, 5, 119, 0, 0, 2525, 339, 1, 0, 0, 0, 2526, 2527, 5, 120, 0, 0, 2527, 2528, 5, 113, 0, 0, 2528, 2529, 5, 117, 0, 0, 2529, 2530, 5, 101, 0, 0, 2530, 2531, 5, 114, 0, 0, 2531, 2532, 5, 121, 0, 0, 2532, 341, 1, 0, 0, 0, 2533, 2534, 5, 97, 0, 0, 2534, 2535, 5, 114, 0, 0, 2535, 2536, 5, 114, 0, 0, 2536, 2537, 5, 97, 0, 0, 2537, 2538, 5, 121, 0, 0, 2538, 2539, 5, 45, 0, 0, 2539, 2540, 5, 110, 0, 0, 2540, 2541, 5, 111, 0, 0, 2541, 2542, 5, 100, 0, 0, 2542, 2543, 5, 101, 0, 0, 2543, 343, 1, 0, 0, 0, 2544, 2545, 5, 98, 0, 0, 2545, 2546, 5, 111, 0, 0, 2546, 2547, 5, 111, 0, 0, 2547, 2548, 5, 108, 0, 0, 2548, 2549, 5, 101, 0, 0, 2549, 2550, 5, 97, 0, 0, 2550, 2551, 5, 110, 0, 0, 2551, 2552, 5, 45, 0, 0, 2552, 2553, 5, 110, 0, 0, 2553, 2554, 5, 111, 0, 0, 2554, 2555, 5, 100, 0, 0, 2555, 2556, 5, 101, 0, 0, 2556, 345, 1, 0, 0, 0, 2557, 2558, 5, 110, 0, 0, 2558, 2559, 5, 117, 0, 0, 2559, 2560, 5, 108, 0, 0, 2560, 2561, 5, 108, 0, 0, 2561, 2562, 5, 45, 0, 0, 2562, 2563, 5, 110, 0, 0, 2563, 2564, 5, 111, 0, 0, 2564, 2565, 5, 100, 0, 0, 2565, 2566, 5, 101, 0, 0, 2566, 347, 1, 0, 0, 0, 2567, 2568, 5, 110, 0, 0, 2568, 2569, 5, 117, 0, 0, 2569, 2570, 5, 109, 0, 0, 2570, 2571, 5, 98, 0, 0, 2571, 2572, 5, 101, 0, 0, 2572, 2573, 5, 114, 0, 0, 2573, 2574, 5, 45, 0, 0, 2574, 2575, 5, 110, 0, 0, 2575, 2576, 5, 111, 0, 0, 2576, 2577, 5, 100, 0, 0, 2577, 2578, 5, 101, 0, 0, 2578, 349, 1, 0, 0, 0, 2579, 2580, 5, 111, 0, 0, 2580, 2581, 5, 98, 0, 0, 2581, 2582, 5, 106, 0, 0, 2582, 2583, 5, 101, 0, 0, 2583, 2584, 5, 99, 0, 0, 2584, 2585, 5, 116, 0, 0, 2585, 2586, 5, 45, 0, 0, 2586, 2587, 5, 110, 0, 0, 2587, 2588, 5, 111, 0, 0, 2588, 2589, 5, 100, 0, 0, 2589, 2590, 5, 101, 0, 0, 2590, 351, 1, 0, 0, 0, 2591, 2592, 5, 114, 0, 0, 2592, 2593, 5, 101, 0, 0, 2593, 2594, 5, 112, 0, 0, 2594, 2595, 5, 108, 0, 0, 2595, 2596, 5, 97, 0, 0, 2596, 2597, 5, 99, 0, 0, 2597, 2598, 5, 101, 0, 0, 2598, 353, 1, 0, 0, 0, 2599, 2600, 5, 119, 0, 0, 2600, 2601, 5, 105, 0, 0, 2601, 2602, 5, 116, 0, 0, 2602, 2603, 5, 104, 0, 0, 2603, 355, 1, 0, 0, 0, 2604, 2605, 5, 118, 0, 0, 2605, 2606, 5, 97, 0, 0, 2606, 2607, 5, 108, 0, 0, 2607, 2608, 5, 117, 0, 0, 2608, 2609, 5, 101, 0, 0, 2609, 357, 1, 0, 0, 0, 2610, 2611, 5, 105, 0, 0, 2611, 2612, 5, 110, 0, 0, 2612, 2613, 5, 115, 0, 0, 2613, 2614, 5, 101, 0, 0, 2614, 2615, 5, 114, 0, 0, 2615, 2616, 5, 116, 0, 0, 2616, 359, 1, 0, 0, 0, 2617, 2618, 5, 105, 0, 0, 2618, 2619, 5, 110, 0, 0, 2619, 2620, 5, 116, 0, 0, 2620, 2621, 5, 111, 0, 0, 2621, 361, 1, 0, 0, 0, 2622, 2623, 5, 100, 0, 0, 2623, 2624, 5, 101, 0, 0, 2624, 2625, 5, 108, 0, 0, 2625, 2626, 5, 101, 0, 0, 2626, 2627, 5, 116, 0, 0, 2627, 2628, 5, 101, 0, 0, 2628, 363, 1, 0, 0, 0, 2629, 2630, 5, 114, 0, 0, 2630, 2631, 5, 101, 0, 0, 2631, 2632, 5, 110, 0, 0, 2632, 2633, 5, 97, 0, 0, 2633, 2634, 5, 109, 0, 0, 2634, 2635, 5, 101, 0, 0, 2635, 365, 1, 0, 0, 0, 2636, 2637, 5, 81, 0, 0, 2637, 2643, 5, 123, 0, 0, 2638, 2642, 3, 16, 5, 0, 2639, 2642, 3, 18, 6, 0, 2640, 2642, 8, 9, 0, 0, 2641, 2638, 1, 0, 0, 0, 2641, 2639, 1, 0, 0, 0, 2641, 2640, 1, 0, 0, 0, 2642, 2645, 1, 0, 0, 0, 2643, 2641, 1, 0, 0, 0, 2643, 2644, 1, 0, 0, 0, 2644, 2646, 1, 0, 0, 0, 2645, 2643, 1, 0, 0, 0, 2646, 2647, 5, 125, 0, 0, 2647, 2648, 3, 374, 184, 0, 2648, 367, 1, 0, 0, 0, 2649, 2650, 3, 374, 184, 0, 2650, 2651, 5, 58, 0, 0, 2651, 2652, 3, 374, 184, 0, 2652, 369, 1, 0, 0, 0, 2653, 2654, 3, 374, 184, 0, 2654, 2655, 5, 58, 0, 0, 2655, 2656, 5, 42, 0, 0, 2656, 371, 1, 0, 0, 0, 2657, 2658, 5, 42, 0, 0, 2658, 2659, 5, 58, 0, 0, 2659, 2660, 3, 374, 184, 0, 2660, 373, 1, 0, 0, 0, 2661, 2665, 3, 376, 185, 0, 2662, 2664, 3, 378, 186, 0, 2663, 2662, 1, 0, 0, 0, 2664, 2667, 1, 0, 0, 0, 2665, 2663, 1, 0, 0, 0, 2665, 2666, 1, 0, 0, 0, 2666, 375, 1, 0, 0, 0, 2667, 2665, 1, 0, 0, 0, 2668, 2670, 7, 10, 0, 0, 2669, 2668, 1, 0, 0, 0, 2670, 377, 1, 0, 0, 0, 2671, 2674, 3, 376, 185, 0, 2672, 2674, 7, 11, 0, 0, 2673, 2671, 1, 0, 0, 0, 2673, 2672, 1, 0, 0, 0, 2674, 379, 1, 0, 0, 0, 2675, 2676, 5, 40, 0, 0, 2676, 2677, 5, 58, 0, 0, 2677, 2678, 5, 126, 0, 0, 2678, 381, 1, 0, 0, 0, 2679, 2681, 5, 58, 0, 0, 2680, 2679, 1, 0, 0, 0, 2681, 2682, 1, 0, 0, 0, 2682, 2680, 1, 0, 0, 0, 2682, 2683, 1, 0, 0, 0, 2683, 2684, 1, 0, 0, 0, 2684, 2685, 5, 41, 0, 0, 2685, 383, 1, 0, 0, 0, 2686, 2687, 5, 40, 0, 0, 2687, 2688, 5, 58, 0, 0, 2688, 2694, 5, 126, 0, 0, 2689, 2693, 3, 388, 191, 0, 2690, 2691, 5, 58, 0, 0, 2691, 2693, 8, 12, 0, 0, 2692, 2689, 1, 0, 0, 0, 2692, 2690, 1, 0, 0, 0, 2693, 2696, 1, 0, 0, 0, 2694, 2692, 1, 0, 0, 0, 2694, 2695, 1, 0, 0, 0, 2695, 2697, 1, 0, 0, 0, 2696, 2694, 1, 0, 0, 0, 2697, 2698, 5, 58, 0, 0, 2698, 2699, 5, 41, 0, 0, 2699, 385, 1, 0, 0, 0, 2700, 2701, 5, 40, 0, 0, 2701, 2702, 5, 58, 0, 0, 2702, 2711, 8, 13, 0, 0, 2703, 2710, 3, 386, 190, 0, 2704, 2705, 5, 40, 0, 0, 2705, 2710, 8, 14, 0, 0, 2706, 2707, 5, 58, 0, 0, 2707, 2710, 8, 12, 0, 0, 2708, 2710, 8, 15, 0, 0, 2709, 2703, 1, 0, 0, 0, 2709, 2704, 1, 0, 0, 0, 2709, 2706, 1, 0, 0, 0, 2709, 2708, 1, 0, 0, 0, 2710, 2713, 1, 0, 0, 0, 2711, 2709, 1, 0, 0, 0, 2711, 2712, 1, 0, 0, 0, 2712, 2717, 1, 0, 0, 0, 2713, 2711, 1, 0, 0, 0, 2714, 2716, 5, 58, 0, 0, 2715, 2714, 1, 0, 0, 0, 2716, 2719, 1, 0, 0, 0, 2717, 2715, 1, 0, 0, 0, 2717, 2718, 1, 0, 0, 0, 2718, 2721, 1, 0, 0, 0, 2719, 2717, 1, 0, 0, 0, 2720, 2722, 5, 58, 0, 0, 2721, 2720, 1, 0, 0, 0, 2722, 2723, 1, 0, 0, 0, 2723, 2721, 1, 0, 0, 0, 2723, 2724, 1, 0, 0, 0, 2724, 2725, 1, 0, 0, 0, 2725, 2726, 5, 41, 0, 0, 2726, 2727, 1, 0, 0, 0, 2727, 2728, 6, 190, 2, 0, 2728, 387, 1, 0, 0, 0, 2729, 2730, 7, 16, 0, 0, 2730, 389, 1, 0, 0, 0, 2731, 2732, 3, 98, 46, 0, 2732, 2733, 3, 98, 46, 0, 2733, 2734, 3, 44, 19, 0, 2734, 2735, 1, 0, 0, 0, 2735, 2736, 6, 192, 3, 0, 2736, 391, 1, 0, 0, 0, 2737, 2738, 3, 50, 22, 0, 2738, 2739, 3, 98, 46, 0, 2739, 2740, 1, 0, 0, 0, 2740, 2741, 6, 193, 4, 0, 2741, 393, 1, 0, 0, 0, 2742, 2743, 8, 17, 0, 0, 2743, 395, 1, 0, 0, 0, 2744, 2745, 7, 18, 0, 0, 2745, 397, 1, 0, 0, 0, 2746, 2747, 5, 96, 0, 0, 2747, 2748, 1, 0, 0, 0, 2748, 2749, 6, 196, 5, 0, 2749, 399, 1, 0, 0, 0, 2750, 2751, 5, 93, 0, 0, 2751, 2752, 1, 0, 0, 0, 2752, 2753, 6, 197, 6, 0, 2753, 401, 1, 0, 0, 0, 2754, 2755, 5, 123, 0, 0, 2755, 2756, 1, 0, 0, 0, 2756, 2757, 6, 198, 7, 0, 2757, 403, 1, 0, 0, 0, 2758, 2759, 3, 98, 46, 0, 2759, 2760, 3, 48, 21, 0, 2760, 2761, 1, 0, 0, 0, 2761, 2762, 6, 199, 8, 0, 2762, 405, 1, 0, 0, 0, 2763, 2764, 3, 46, 20, 0, 2764, 2765, 3, 98, 46, 0, 2765, 2766, 3, 98, 46, 0, 2766, 2767, 1, 0, 0, 0, 2767, 2768, 6, 200, 4, 0, 2768, 407, 1, 0, 0, 0, 2769, 2770, 5, 34, 0, 0, 2770, 2771, 5, 34, 0, 0, 2771, 2772, 1, 0, 0, 0, 2772, 2773, 6, 201, 9, 0, 2773, 409, 1, 0, 0, 0, 2774, 2775, 5, 34, 0, 0, 2775, 2776, 1, 0, 0, 0, 2776, 2777, 6, 202, 10, 0, 2777, 2778, 6, 202, 4, 0, 2778, 411, 1, 0, 0, 0, 2779, 2780, 5, 123, 0, 0, 2780, 2781, 5, 123, 0, 0, 2781, 2782, 1, 0, 0, 0, 2782, 2783, 6, 203, 11, 0, 2783, 413, 1, 0, 0, 0, 2784, 2785, 5, 125, 0, 0, 2785, 2786, 5, 125, 0, 0, 2786, 2787, 1, 0, 0, 0, 2787, 2788, 6, 204, 12, 0, 2788, 415, 1, 0, 0, 0, 2789, 2790, 5, 123, 0, 0, 2790, 2791, 1, 0, 0, 0, 2791, 2792, 6, 205, 7, 0, 2792, 2793, 6, 205, 13, 0, 2793, 417, 1, 0, 0, 0, 2794, 2795, 5, 125, 0, 0, 2795, 2796, 1, 0, 0, 0, 2796, 2797, 6, 206, 14, 0, 2797, 419, 1, 0, 0, 0, 2798, 2814, 5, 38, 0, 0, 2799, 2800, 5, 108, 0, 0, 2800, 2815, 5, 116, 0, 0, 2801, 2802, 5, 103, 0, 0, 2802, 2815, 5, 116, 0, 0, 2803, 2804, 5, 97, 0, 0, 2804, 2805, 5, 109, 0, 0, 2805, 2815, 5, 112, 0, 0, 2806, 2807, 5, 113, 0, 0, 2807, 2808, 5, 117, 0, 0, 2808, 2809, 5, 111, 0, 0, 2809, 2815, 5, 116, 0, 0, 2810, 2811, 5, 97, 0, 0, 2811, 2812, 5, 112, 0, 0, 2812, 2813, 5, 111, 0, 0, 2813, 2815, 5, 115, 0, 0, 2814, 2799, 1, 0, 0, 0, 2814, 2801, 1, 0, 0, 0, 2814, 2803, 1, 0, 0, 0, 2814, 2806, 1, 0, 0, 0, 2814, 2810, 1, 0, 0, 0, 2815, 2816, 1, 0, 0, 0, 2816, 2817, 5, 59, 0, 0, 2817, 2818, 1, 0, 0, 0, 2818, 2819, 6, 207, 15, 0, 2819, 421, 1, 0, 0, 0, 2820, 2821, 5, 38, 0, 0, 2821, 2822, 5, 35, 0, 0, 2822, 2824, 1, 0, 0, 0, 2823, 2825, 7, 0, 0, 0, 2824, 2823, 1, 0, 0, 0, 2825, 2826, 1, 0, 0, 0, 2826, 2824, 1, 0, 0, 0, 2826, 2827, 1, 0, 0, 0, 2827, 2828, 1, 0, 0, 0, 2828, 2840, 5, 59, 0, 0, 2829, 2830, 5, 38, 0, 0, 2830, 2831, 5, 35, 0, 0, 2831, 2832, 5, 120, 0, 0, 2832, 2834, 1, 0, 0, 0, 2833, 2835, 7, 3, 0, 0, 2834, 2833, 1, 0, 0, 0, 2835, 2836, 1, 0, 0, 0, 2836, 2834, 1, 0, 0, 0, 2836, 2837, 1, 0, 0, 0, 2837, 2838, 1, 0, 0, 0, 2838, 2840, 5, 59, 0, 0, 2839, 2820, 1, 0, 0, 0, 2839, 2829, 1, 0, 0, 0, 2840, 2841, 1, 0, 0, 0, 2841, 2842, 6, 208, 16, 0, 2842, 423, 1, 0, 0, 0, 2843, 2844, 8, 19, 0, 0, 2844, 2845, 1, 0, 0, 0, 2845, 2846, 6, 209, 17, 0, 2846, 425, 1, 0, 0, 0, 2847, 2848, 5, 39, 0, 0, 2848, 2849, 5, 39, 0, 0, 2849, 2850, 1, 0, 0, 0, 2850, 2851, 6, 210, 18, 0, 2851, 427, 1, 0, 0, 0, 2852, 2853, 5, 39, 0, 0, 2853, 2854, 1, 0, 0, 0, 2854, 2855, 6, 211, 19, 0, 2855, 2856, 6, 211, 4, 0, 2856, 429, 1, 0, 0, 0, 2857, 2858, 5, 123, 0, 0, 2858, 2859, 5, 123, 0, 0, 2859, 2860, 1, 0, 0, 0, 2860, 2861, 6, 212, 11, 0, 2861, 431, 1, 0, 0, 0, 2862, 2863, 5, 125, 0, 0, 2863, 2864, 5, 125, 0, 0, 2864, 2865, 1, 0, 0, 0, 2865, 2866, 6, 213, 12, 0, 2866, 433, 1, 0, 0, 0, 2867, 2868, 5, 123, 0, 0, 2868, 2869, 1, 0, 0, 0, 2869, 2870, 6, 214, 7, 0, 2870, 2871, 6, 214, 20, 0, 2871, 435, 1, 0, 0, 0, 2872, 2873, 5, 125, 0, 0, 2873, 2874, 1, 0, 0, 0, 2874, 2875, 6, 215, 14, 0, 2875, 437, 1, 0, 0, 0, 2876, 2892, 5, 38, 0, 0, 2877, 2878, 5, 108, 0, 0, 2878, 2893, 5, 116, 0, 0, 2879, 2880, 5, 103, 0, 0, 2880, 2893, 5, 116, 0, 0, 2881, 2882, 5, 97, 0, 0, 2882, 2883, 5, 109, 0, 0, 2883, 2893, 5, 112, 0, 0, 2884, 2885, 5, 113, 0, 0, 2885, 2886, 5, 117, 0, 0, 2886, 2887, 5, 111, 0, 0, 2887, 2893, 5, 116, 0, 0, 2888, 2889, 5, 97, 0, 0, 2889, 2890, 5, 112, 0, 0, 2890, 2891, 5, 111, 0, 0, 2891, 2893, 5, 115, 0, 0, 2892, 2877, 1, 0, 0, 0, 2892, 2879, 1, 0, 0, 0, 2892, 2881, 1, 0, 0, 0, 2892, 2884, 1, 0, 0, 0, 2892, 2888, 1, 0, 0, 0, 2893, 2894, 1, 0, 0, 0, 2894, 2895, 5, 59, 0, 0, 2895, 2896, 1, 0, 0, 0, 2896, 2897, 6, 216, 15, 0, 2897, 439, 1, 0, 0, 0, 2898, 2899, 5, 38, 0, 0, 2899, 2900, 5, 35, 0, 0, 2900, 2902, 1, 0, 0, 0, 2901, 2903, 7, 0, 0, 0, 2902, 2901, 1, 0, 0, 0, 2903, 2904, 1, 0, 0, 0, 2904, 2902, 1, 0, 0, 0, 2904, 2905, 1, 0, 0, 0, 2905, 2906, 1, 0, 0, 0, 2906, 2918, 5, 59, 0, 0, 2907, 2908, 5, 38, 0, 0, 2908, 2909, 5, 35, 0, 0, 2909, 2910, 5, 120, 0, 0, 2910, 2912, 1, 0, 0, 0, 2911, 2913, 7, 3, 0, 0, 2912, 2911, 1, 0, 0, 0, 2913, 2914, 1, 0, 0, 0, 2914, 2912, 1, 0, 0, 0, 2914, 2915, 1, 0, 0, 0, 2915, 2916, 1, 0, 0, 0, 2916, 2918, 5, 59, 0, 0, 2917, 2898, 1, 0, 0, 0, 2917, 2907, 1, 0, 0, 0, 2918, 2919, 1, 0, 0, 0, 2919, 2920, 6, 217, 16, 0, 2920, 441, 1, 0, 0, 0, 2921, 2922, 8, 20, 0, 0, 2922, 2923, 1, 0, 0, 0, 2923, 2924, 6, 218, 17, 0, 2924, 443, 1, 0, 0, 0, 2925, 2926, 3, 14, 4, 0, 2926, 2927, 1, 0, 0, 0, 2927, 2928, 6, 219, 21, 0, 2928, 445, 1, 0, 0, 0, 2929, 2930, 5, 46, 0, 0, 2930, 2940, 3, 14, 4, 0, 2931, 2932, 3, 14, 4, 0, 2932, 2936, 5, 46, 0, 0, 2933, 2935, 7, 0, 0, 0, 2934, 2933, 1, 0, 0, 0, 2935, 2938, 1, 0, 0, 0, 2936, 2934, 1, 0, 0, 0, 2936, 2937, 1, 0, 0, 0, 2937, 2940, 1, 0, 0, 0, 2938, 2936, 1, 0, 0, 0, 2939, 2929, 1, 0, 0, 0, 2939, 2931, 1, 0, 0, 0, 2940, 2941, 1, 0, 0, 0, 2941, 2942, 6, 220, 22, 0, 2942, 447, 1, 0, 0, 0, 2943, 2944, 5, 46, 0, 0, 2944, 2956, 3, 14, 4, 0, 2945, 2953, 3, 14, 4, 0, 2946, 2950, 5, 46, 0, 0, 2947, 2949, 7, 0, 0, 0, 2948, 2947, 1, 0, 0, 0, 2949, 2952, 1, 0, 0, 0, 2950, 2948, 1, 0, 0, 0, 2950, 2951, 1, 0, 0, 0, 2951, 2954, 1, 0, 0, 0, 2952, 2950, 1, 0, 0, 0, 2953, 2946, 1, 0, 0, 0, 2953, 2954, 1, 0, 0, 0, 2954, 2956, 1, 0, 0, 0, 2955, 2943, 1, 0, 0, 0, 2955, 2945, 1, 0, 0, 0, 2956, 2957, 1, 0, 0, 0, 2957, 2959, 7, 1, 0, 0, 2958, 2960, 7, 2, 0, 0, 2959, 2958, 1, 0, 0, 0, 2959, 2960, 1, 0, 0, 0, 2960, 2961, 1, 0, 0, 0, 2961, 2962, 3, 14, 4, 0, 2962, 2963, 1, 0, 0, 0, 2963, 2964, 6, 221, 23, 0, 2964, 449, 1, 0, 0, 0, 2965, 2966, 5, 100, 0, 0, 2966, 2967, 5, 101, 0, 0, 2967, 2968, 5, 99, 0, 0, 2968, 2969, 5, 105, 0, 0, 2969, 2970, 5, 109, 0, 0, 2970, 2971, 5, 97, 0, 0, 2971, 2972, 5, 108, 0, 0, 2972, 2973, 5, 45, 0, 0, 2973, 2974, 5, 115, 0, 0, 2974, 2975, 5, 101, 0, 0, 2975, 2976, 5, 112, 0, 0, 2976, 2977, 5, 97, 0, 0, 2977, 2978, 5, 114, 0, 0, 2978, 2979, 5, 97, 0, 0, 2979, 2980, 5, 116, 0, 0, 2980, 2981, 5, 111, 0, 0, 2981, 3088, 5, 114, 0, 0, 2982, 2983, 5, 103, 0, 0, 2983, 2984, 5, 114, 0, 0, 2984, 2985, 5, 111, 0, 0, 2985, 2986, 5, 117, 0, 0, 2986, 2987, 5, 112, 0, 0, 2987, 2988, 5, 105, 0, 0, 2988, 2989, 5, 110, 0, 0, 2989, 2990, 5, 103, 0, 0, 2990, 2991, 5, 45, 0, 0, 2991, 2992, 5, 115, 0, 0, 2992, 2993, 5, 101, 0, 0, 2993, 2994, 5, 112, 0, 0, 2994, 2995, 5, 97, 0, 0, 2995, 2996, 5, 114, 0, 0, 2996, 2997, 5, 97, 0, 0, 2997, 2998, 5, 116, 0, 0, 2998, 2999, 5, 111, 0, 0, 2999, 3088, 5, 114, 0, 0, 3000, 3001, 5, 105, 0, 0, 3001, 3002, 5, 110, 0, 0, 3002, 3003, 5, 102, 0, 0, 3003, 3004, 5, 105, 0, 0, 3004, 3005, 5, 110, 0, 0, 3005, 3006, 5, 105, 0, 0, 3006, 3007, 5, 116, 0, 0, 3007, 3088, 5, 121, 0, 0, 3008, 3009, 5, 109, 0, 0, 3009, 3010, 5, 105, 0, 0, 3010, 3011, 5, 110, 0, 0, 3011, 3012, 5, 117, 0, 0, 3012, 3013, 5, 115, 0, 0, 3013, 3014, 5, 45, 0, 0, 3014, 3015, 5, 115, 0, 0, 3015, 3016, 5, 105, 0, 0, 3016, 3017, 5, 103, 0, 0, 3017, 3088, 5, 110, 0, 0, 3018, 3019, 5, 78, 0, 0, 3019, 3020, 5, 97, 0, 0, 3020, 3088, 5, 78, 0, 0, 3021, 3022, 5, 112, 0, 0, 3022, 3023, 5, 101, 0, 0, 3023, 3024, 5, 114, 0, 0, 3024, 3025, 5, 99, 0, 0, 3025, 3026, 5, 101, 0, 0, 3026, 3027, 5, 110, 0, 0, 3027, 3088, 5, 116, 0, 0, 3028, 3029, 5, 112, 0, 0, 3029, 3030, 5, 101, 0, 0, 3030, 3031, 5, 114, 0, 0, 3031, 3032, 5, 45, 0, 0, 3032, 3033, 5, 109, 0, 0, 3033, 3034, 5, 105, 0, 0, 3034, 3035, 5, 108, 0, 0, 3035, 3036, 5, 108, 0, 0, 3036, 3088, 5, 101, 0, 0, 3037, 3038, 5, 122, 0, 0, 3038, 3039, 5, 101, 0, 0, 3039, 3040, 5, 114, 0, 0, 3040, 3041, 5, 111, 0, 0, 3041, 3042, 5, 45, 0, 0, 3042, 3043, 5, 100, 0, 0, 3043, 3044, 5, 105, 0, 0, 3044, 3045, 5, 103, 0, 0, 3045, 3046, 5, 105, 0, 0, 3046, 3088, 5, 116, 0, 0, 3047, 3048, 5, 100, 0, 0, 3048, 3049, 5, 105, 0, 0, 3049, 3050, 5, 103, 0, 0, 3050, 3051, 5, 105, 0, 0, 3051, 3088, 5, 116, 0, 0, 3052, 3053, 5, 112, 0, 0, 3053, 3054, 5, 97, 0, 0, 3054, 3055, 5, 116, 0, 0, 3055, 3056, 5, 116, 0, 0, 3056, 3057, 5, 101, 0, 0, 3057, 3058, 5, 114, 0, 0, 3058, 3059, 5, 110, 0, 0, 3059, 3060, 5, 45, 0, 0, 3060, 3061, 5, 115, 0, 0, 3061, 3062, 5, 101, 0, 0, 3062, 3063, 5, 112, 0, 0, 3063, 3064, 5, 97, 0, 0, 3064, 3065, 5, 114, 0, 0, 3065, 3066, 5, 97, 0, 0, 3066, 3067, 5, 116, 0, 0, 3067, 3068, 5, 111, 0, 0, 3068, 3088, 5, 114, 0, 0, 3069, 3070, 5, 101, 0, 0, 3070, 3071, 5, 120, 0, 0, 3071, 3072, 5, 112, 0, 0, 3072, 3073, 5, 111, 0, 0, 3073, 3074, 5, 110, 0, 0, 3074, 3075, 5, 101, 0, 0, 3075, 3076, 5, 110, 0, 0, 3076, 3077, 5, 116, 0, 0, 3077, 3078, 5, 45, 0, 0, 3078, 3079, 5, 115, 0, 0, 3079, 3080, 5, 101, 0, 0, 3080, 3081, 5, 112, 0, 0, 3081, 3082, 5, 97, 0, 0, 3082, 3083, 5, 114, 0, 0, 3083, 3084, 5, 97, 0, 0, 3084, 3085, 5, 116, 0, 0, 3085, 3086, 5, 111, 0, 0, 3086, 3088, 5, 114, 0, 0, 3087, 2965, 1, 0, 0, 0, 3087, 2982, 1, 0, 0, 0, 3087, 3000, 1, 0, 0, 0, 3087, 3008, 1, 0, 0, 0, 3087, 3018, 1, 0, 0, 0, 3087, 3021, 1, 0, 0, 0, 3087, 3028, 1, 0, 0, 0, 3087, 3037, 1, 0, 0, 0, 3087, 3047, 1, 0, 0, 0, 3087, 3052, 1, 0, 0, 0, 3087, 3069, 1, 0, 0, 0, 3088, 3089, 1, 0, 0, 0, 3089, 3090, 6, 222, 24, 0, 3090, 451, 1, 0, 0, 0, 3091, 3107, 5, 38, 0, 0, 3092, 3093, 5, 108, 0, 0, 3093, 3108, 5, 116, 0, 0, 3094, 3095, 5, 103, 0, 0, 3095, 3108, 5, 116, 0, 0, 3096, 3097, 5, 97, 0, 0, 3097, 3098, 5, 109, 0, 0, 3098, 3108, 5, 112, 0, 0, 3099, 3100, 5, 113, 0, 0, 3100, 3101, 5, 117, 0, 0, 3101, 3102, 5, 111, 0, 0, 3102, 3108, 5, 116, 0, 0, 3103, 3104, 5, 97, 0, 0, 3104, 3105, 5, 112, 0, 0, 3105, 3106, 5, 111, 0, 0, 3106, 3108, 5, 115, 0, 0, 3107, 3092, 1, 0, 0, 0, 3107, 3094, 1, 0, 0, 0, 3107, 3096, 1, 0, 0, 0, 3107, 3099, 1, 0, 0, 0, 3107, 3103, 1, 0, 0, 0, 3108, 3109, 1, 0, 0, 0, 3109, 3110, 5, 59, 0, 0, 3110, 3111, 1, 0, 0, 0, 3111, 3112, 6, 223, 15, 0, 3112, 453, 1, 0, 0, 0, 3113, 3114, 5, 38, 0, 0, 3114, 3115, 5, 35, 0, 0, 3115, 3117, 1, 0, 0, 0, 3116, 3118, 7, 0, 0, 0, 3117, 3116, 1, 0, 0, 0, 3118, 3119, 1, 0, 0, 0, 3119, 3117, 1, 0, 0, 0, 3119, 3120, 1, 0, 0, 0, 3120, 3121, 1, 0, 0, 0, 3121, 3133, 5, 59, 0, 0, 3122, 3123, 5, 38, 0, 0, 3123, 3124, 5, 35, 0, 0, 3124, 3125, 5, 120, 0, 0, 3125, 3127, 1, 0, 0, 0, 3126, 3128, 7, 3, 0, 0, 3127, 3126, 1, 0, 0, 0, 3128, 3129, 1, 0, 0, 0, 3129, 3127, 1, 0, 0, 0, 3129, 3130, 1, 0, 0, 0, 3130, 3131, 1, 0, 0, 0, 3131, 3133, 5, 59, 0, 0, 3132, 3113, 1, 0, 0, 0, 3132, 3122, 1, 0, 0, 0, 3133, 3134, 1, 0, 0, 0, 3134, 3135, 6, 224, 16, 0, 3135, 455, 1, 0, 0, 0, 3136, 3137, 5, 34, 0, 0, 3137, 3138, 5, 34, 0, 0, 3138, 3139, 1, 0, 0, 0, 3139, 3140, 6, 225, 9, 0, 3140, 457, 1, 0, 0, 0, 3141, 3142, 5, 39, 0, 0, 3142, 3143, 1, 0, 0, 0, 3143, 3144, 6, 226, 1, 0, 3144, 3145, 6, 226, 19, 0, 3145, 459, 1, 0, 0, 0, 3146, 3147, 5, 34, 0, 0, 3147, 3148, 1, 0, 0, 0, 3148, 3149, 6, 227, 10, 0, 3149, 3150, 6, 227, 4, 0, 3150, 3151, 6, 227, 4, 0, 3151, 461, 1, 0, 0, 0, 3152, 3153, 5, 60, 0, 0, 3153, 3154, 5, 33, 0, 0, 3154, 3155, 5, 45, 0, 0, 3155, 3156, 5, 45, 0, 0, 3156, 3162, 1, 0, 0, 0, 3157, 3158, 5, 45, 0, 0, 3158, 3161, 8, 4, 0, 0, 3159, 3161, 8, 4, 0, 0, 3160, 3157, 1, 0, 0, 0, 3160, 3159, 1, 0, 0, 0, 3161, 3164, 1, 0, 0, 0, 3162, 3160, 1, 0, 0, 0, 3162, 3163, 1, 0, 0, 0, 3163, 3165, 1, 0, 0, 0, 3164, 3162, 1, 0, 0, 0, 3165, 3166, 5, 45, 0, 0, 3166, 3167, 5, 45, 0, 0, 3167, 3168, 5, 62, 0, 0, 3168, 3169, 1, 0, 0, 0, 3169, 3170, 6, 228, 25, 0, 3170, 463, 1, 0, 0, 0, 3171, 3172, 5, 60, 0, 0, 3172, 3173, 5, 63, 0, 0, 3173, 3174, 1, 0, 0, 0, 3174, 3175, 7, 5, 0, 0, 3175, 3176, 7, 6, 0, 0, 3176, 3184, 7, 7, 0, 0, 3177, 3181, 7, 8, 0, 0, 3178, 3180, 9, 0, 0, 0, 3179, 3178, 1, 0, 0, 0, 3180, 3183, 1, 0, 0, 0, 3181, 3182, 1, 0, 0, 0, 3181, 3179, 1, 0, 0, 0, 3182, 3185, 1, 0, 0, 0, 3183, 3181, 1, 0, 0, 0, 3184, 3177, 1, 0, 0, 0, 3184, 3185, 1, 0, 0, 0, 3185, 3186, 1, 0, 0, 0, 3186, 3187, 5, 63, 0, 0, 3187, 3188, 5, 62, 0, 0, 3188, 3189, 1, 0, 0, 0, 3189, 3190, 6, 229, 26, 0, 3190, 465, 1, 0, 0, 0, 3191, 3192, 5, 60, 0, 0, 3192, 3193, 5, 63, 0, 0, 3193, 3194, 1, 0, 0, 0, 3194, 3202, 3, 374, 184, 0, 3195, 3199, 7, 8, 0, 0, 3196, 3198, 9, 0, 0, 0, 3197, 3196, 1, 0, 0, 0, 3198, 3201, 1, 0, 0, 0, 3199, 3200, 1, 0, 0, 0, 3199, 3197, 1, 0, 0, 0, 3200, 3203, 1, 0, 0, 0, 3201, 3199, 1, 0, 0, 0, 3202, 3195, 1, 0, 0, 0, 3202, 3203, 1, 0, 0, 0, 3203, 3204, 1, 0, 0, 0, 3204, 3205, 5, 63, 0, 0, 3205, 3206, 5, 62, 0, 0, 3206, 3207, 1, 0, 0, 0, 3207, 3208, 6, 230, 27, 0, 3208, 467, 1, 0, 0, 0, 3209, 3210, 5, 60, 0, 0, 3210, 3211, 5, 33, 0, 0, 3211, 3212, 5, 91, 0, 0, 3212, 3213, 5, 67, 0, 0, 3213, 3214, 5, 68, 0, 0, 3214, 3215, 5, 65, 0, 0, 3215, 3216, 5, 84, 0, 0, 3216, 3217, 5, 65, 0, 0, 3217, 3218, 5, 91, 0, 0, 3218, 3222, 1, 0, 0, 0, 3219, 3221, 9, 0, 0, 0, 3220, 3219, 1, 0, 0, 0, 3221, 3224, 1, 0, 0, 0, 3222, 3223, 1, 0, 0, 0, 3222, 3220, 1, 0, 0, 0, 3223, 3225, 1, 0, 0, 0, 3224, 3222, 1, 0, 0, 0, 3225, 3226, 5, 93, 0, 0, 3226, 3227, 5, 93, 0, 0, 3227, 3228, 5, 62, 0, 0, 3228, 3229, 1, 0, 0, 0, 3229, 3230, 6, 231, 28, 0, 3230, 469, 1, 0, 0, 0, 3231, 3232, 5, 40, 0, 0, 3232, 3233, 5, 35, 0, 0, 3233, 3235, 1, 0, 0, 0, 3234, 3236, 3, 34, 14, 0, 3235, 3234, 1, 0, 0, 0, 3235, 3236, 1, 0, 0, 0, 3236, 3240, 1, 0, 0, 0, 3237, 3238, 3, 374, 184, 0, 3238, 3239, 5, 58, 0, 0, 3239, 3241, 1, 0, 0, 0, 3240, 3237, 1, 0, 0, 0, 3240, 3241, 1, 0, 0, 0, 3241, 3242, 1, 0, 0, 0, 3242, 3250, 3, 374, 184, 0, 3243, 3247, 3, 34, 14, 0, 3244, 3246, 9, 0, 0, 0, 3245, 3244, 1, 0, 0, 0, 3246, 3249, 1, 0, 0, 0, 3247, 3248, 1, 0, 0, 0, 3247, 3245, 1, 0, 0, 0, 3248, 3251, 1, 0, 0, 0, 3249, 3247, 1, 0, 0, 0, 3250, 3243, 1, 0, 0, 0, 3250, 3251, 1, 0, 0, 0, 3251, 3252, 1, 0, 0, 0, 3252, 3253, 5, 35, 0, 0, 3253, 3254, 5, 41, 0, 0, 3254, 3255, 1, 0, 0, 0, 3255, 3256, 6, 232, 29, 0, 3256, 471, 1, 0, 0, 0, 3257, 3259, 7, 8, 0, 0, 3258, 3257, 1, 0, 0, 0, 3259, 3260, 1, 0, 0, 0, 3260, 3258, 1, 0, 0, 0, 3260, 3261, 1, 0, 0, 0, 3261, 3262, 1, 0, 0, 0, 3262, 3263, 6, 233, 2, 0, 3263, 3264, 6, 233, 30, 0, 3264, 473, 1, 0, 0, 0, 3265, 3266, 5, 61, 0, 0, 3266, 3267, 1, 0, 0, 0, 3267, 3268, 6, 234, 31, 0, 3268, 475, 1, 0, 0, 0, 3269, 3270, 5, 33, 0, 0, 3270, 3271, 5, 61, 0, 0, 3271, 3272, 1, 0, 0, 0, 3272, 3273, 6, 235, 32, 0, 3273, 477, 1, 0, 0, 0, 3274, 3275, 5, 40, 0, 0, 3275, 3276, 1, 0, 0, 0, 3276, 3277, 6, 236, 33, 0, 3277, 479, 1, 0, 0, 0, 3278, 3279, 5, 41, 0, 0, 3279, 3280, 1, 0, 0, 0, 3280, 3281, 6, 237, 34, 0, 3281, 481, 1, 0, 0, 0, 3282, 3283, 5, 91, 0, 0, 3283, 3284, 1, 0, 0, 0, 3284, 3285, 6, 238, 35, 0, 3285, 483, 1, 0, 0, 0, 3286, 3287, 5, 93, 0, 0, 3287, 3288, 1, 0, 0, 0, 3288, 3289, 6, 239, 6, 0, 3289, 485, 1, 0, 0, 0, 3290, 3291, 5, 123, 0, 0, 3291, 3292, 6, 240, 36, 0, 3292, 3293, 1, 0, 0, 0, 3293, 3294, 6, 240, 7, 0, 3294, 487, 1, 0, 0, 0, 3295, 3296, 4, 241, 0, 0, 3296, 3297, 5, 125, 0, 0, 3297, 3298, 1, 0, 0, 0, 3298, 3299, 6, 241, 14, 0, 3299, 3300, 6, 241, 4, 0, 3300, 489, 1, 0, 0, 0, 3301, 3302, 4, 242, 1, 0, 3302, 3303, 5, 125, 0, 0, 3303, 3304, 6, 242, 37, 0, 3304, 3305, 1, 0, 0, 0, 3305, 3306, 6, 242, 14, 0, 3306, 491, 1, 0, 0, 0, 3307, 3308, 5, 42, 0, 0, 3308, 3309, 1, 0, 0, 0, 3309, 3310, 6, 243, 38, 0, 3310, 493, 1, 0, 0, 0, 3311, 3312, 5, 43, 0, 0, 3312, 3313, 1, 0, 0, 0, 3313, 3314, 6, 244, 39, 0, 3314, 495, 1, 0, 0, 0, 3315, 3316, 5, 45, 0, 0, 3316, 3317, 1, 0, 0, 0, 3317, 3318, 6, 245, 40, 0, 3318, 497, 1, 0, 0, 0, 3319, 3320, 5, 44, 0, 0, 3320, 3321, 1, 0, 0, 0, 3321, 3322, 6, 246, 41, 0, 3322, 499, 1, 0, 0, 0, 3323, 3324, 5, 46, 0, 0, 3324, 3325, 1, 0, 0, 0, 3325, 3326, 6, 247, 42, 0, 3326, 501, 1, 0, 0, 0, 3327, 3328, 5, 46, 0, 0, 3328, 3329, 5, 46, 0, 0, 3329, 3330, 1, 0, 0, 0, 3330, 3331, 6, 248, 43, 0, 3331, 503, 1, 0, 0, 0, 3332, 3333, 5, 58, 0, 0, 3333, 3334, 1, 0, 0, 0, 3334, 3335, 6, 249, 44, 0, 3335, 505, 1, 0, 0, 0, 3336, 3337, 5, 58, 0, 0, 3337, 3338, 5, 61, 0, 0, 3338, 3339, 1, 0, 0, 0, 3339, 3340, 6, 250, 45, 0, 3340, 507, 1, 0, 0, 0, 3341, 3342, 5, 59, 0, 0, 3342, 3343, 1, 0, 0, 0, 3343, 3344, 6, 251, 46, 0, 3344, 509, 1, 0, 0, 0, 3345, 3346, 5, 47, 0, 0, 3346, 3347, 1, 0, 0, 0, 3347, 3348, 6, 252, 47, 0, 3348, 511, 1, 0, 0, 0, 3349, 3350, 5, 47, 0, 0, 3350, 3351, 5, 47, 0, 0, 3351, 3352, 1, 0, 0, 0, 3352, 3353, 6, 253, 48, 0, 3353, 513, 1, 0, 0, 0, 3354, 3355, 5, 92, 0, 0, 3355, 3356, 1, 0, 0, 0, 3356, 3357, 6, 254, 49, 0, 3357, 515, 1, 0, 0, 0, 3358, 3359, 5, 124, 0, 0, 3359, 3360, 1, 0, 0, 0, 3360, 3361, 6, 255, 50, 0, 3361, 517, 1, 0, 0, 0, 3362, 3363, 5, 60, 0, 0, 3363, 3364, 1, 0, 0, 0, 3364, 3365, 6, 256, 51, 0, 3365, 519, 1, 0, 0, 0, 3366, 3367, 5, 62, 0, 0, 3367, 3368, 1, 0, 0, 0, 3368, 3369, 6, 257, 52, 0, 3369, 521, 1, 0, 0, 0, 3370, 3371, 5, 63, 0, 0, 3371, 3372, 1, 0, 0, 0, 3372, 3373, 6, 258, 53, 0, 3373, 523, 1, 0, 0, 0, 3374, 3375, 5, 64, 0, 0, 3375, 3376, 1, 0, 0, 0, 3376, 3377, 6, 259, 54, 0, 3377, 525, 1, 0, 0, 0, 3378, 3379, 5, 36, 0, 0, 3379, 3380, 1, 0, 0, 0, 3380, 3381, 6, 260, 55, 0, 3381, 527, 1, 0, 0, 0, 3382, 3383, 5, 37, 0, 0, 3383, 3384, 1, 0, 0, 0, 3384, 3385, 6, 261, 56, 0, 3385, 529, 1, 0, 0, 0, 3386, 3387, 5, 33, 0, 0, 3387, 3388, 1, 0, 0, 0, 3388, 3389, 6, 262, 57, 0, 3389, 531, 1, 0, 0, 0, 3390, 3391, 5, 35, 0, 0, 3391, 3392, 1, 0, 0, 0, 3392, 3393, 6, 263, 58, 0, 3393, 533, 1, 0, 0, 0, 3394, 3395, 5, 94, 0, 0, 3395, 3396, 1, 0, 0, 0, 3396, 3397, 6, 264, 59, 0, 3397, 535, 1, 0, 0, 0, 3398, 3399, 5, 61, 0, 0, 3399, 3400, 5, 62, 0, 0, 3400, 3401, 1, 0, 0, 0, 3401, 3402, 6, 265, 60, 0, 3402, 537, 1, 0, 0, 0, 3403, 3404, 5, 96, 0, 0, 3404, 3405, 1, 0, 0, 0, 3405, 3406, 6, 266, 5, 0, 3406, 539, 1, 0, 0, 0, 3407, 3408, 5, 124, 0, 0, 3408, 3409, 5, 124, 0, 0, 3409, 3410, 1, 0, 0, 0, 3410, 3411, 6, 267, 61, 0, 3411, 541, 1, 0, 0, 0, 3412, 3413, 5, 126, 0, 0, 3413, 3414, 1, 0, 0, 0, 3414, 3415, 6, 268, 62, 0, 3415, 543, 1, 0, 0, 0, 3416, 3417, 5, 97, 0, 0, 3417, 3418, 5, 108, 0, 0, 3418, 3419, 5, 108, 0, 0, 3419, 3420, 5, 111, 0, 0, 3420, 3421, 5, 119, 0, 0, 3421, 3422, 5, 105, 0, 0, 3422, 3423, 5, 110, 0, 0, 3423, 3424, 5, 103, 0, 0, 3424, 3425, 1, 0, 0, 0, 3425, 3426, 6, 269, 63, 0, 3426, 545, 1, 0, 0, 0, 3427, 3428, 5, 97, 0, 0, 3428, 3429, 5, 110, 0, 0, 3429, 3430, 5, 99, 0, 0, 3430, 3431, 5, 101, 0, 0, 3431, 3432, 5, 115, 0, 0, 3432, 3433, 5, 116, 0, 0, 3433, 3434, 5, 111, 0, 0, 3434, 3435, 5, 114, 0, 0, 3435, 3436, 1, 0, 0, 0, 3436, 3437, 6, 270, 64, 0, 3437, 547, 1, 0, 0, 0, 3438, 3439, 5, 97, 0, 0, 3439, 3440, 5, 110, 0, 0, 3440, 3441, 5, 99, 0, 0, 3441, 3442, 5, 101, 0, 0, 3442, 3443, 5, 115, 0, 0, 3443, 3444, 5, 116, 0, 0, 3444, 3445, 5, 111, 0, 0, 3445, 3446, 5, 114, 0, 0, 3446, 3447, 5, 45, 0, 0, 3447, 3448, 5, 111, 0, 0, 3448, 3449, 5, 114, 0, 0, 3449, 3450, 5, 45, 0, 0, 3450, 3451, 5, 115, 0, 0, 3451, 3452, 5, 101, 0, 0, 3452, 3453, 5, 108, 0, 0, 3453, 3454, 5, 102, 0, 0, 3454, 3455, 1, 0, 0, 0, 3455, 3456, 6, 271, 65, 0, 3456, 549, 1, 0, 0, 0, 3457, 3458, 5, 97, 0, 0, 3458, 3459, 5, 110, 0, 0, 3459, 3460, 5, 100, 0, 0, 3460, 3461, 1, 0, 0, 0, 3461, 3462, 6, 272, 66, 0, 3462, 551, 1, 0, 0, 0, 3463, 3464, 5, 97, 0, 0, 3464, 3465, 5, 114, 0, 0, 3465, 3466, 5, 114, 0, 0, 3466, 3467, 5, 97, 0, 0, 3467, 3468, 5, 121, 0, 0, 3468, 3469, 1, 0, 0, 0, 3469, 3470, 6, 273, 67, 0, 3470, 553, 1, 0, 0, 0, 3471, 3472, 5, 97, 0, 0, 3472, 3473, 5, 115, 0, 0, 3473, 3474, 1, 0, 0, 0, 3474, 3475, 6, 274, 68, 0, 3475, 555, 1, 0, 0, 0, 3476, 3477, 5, 97, 0, 0, 3477, 3478, 5, 115, 0, 0, 3478, 3479, 5, 99, 0, 0, 3479, 3480, 5, 101, 0, 0, 3480, 3481, 5, 110, 0, 0, 3481, 3482, 5, 100, 0, 0, 3482, 3483, 5, 105, 0, 0, 3483, 3484, 5, 110, 0, 0, 3484, 3485, 5, 103, 0, 0, 3485, 3486, 1, 0, 0, 0, 3486, 3487, 6, 275, 69, 0, 3487, 557, 1, 0, 0, 0, 3488, 3489, 5, 97, 0, 0, 3489, 3490, 5, 116, 0, 0, 3490, 3491, 1, 0, 0, 0, 3491, 3492, 6, 276, 70, 0, 3492, 559, 1, 0, 0, 0, 3493, 3494, 5, 97, 0, 0, 3494, 3495, 5, 116, 0, 0, 3495, 3496, 5, 116, 0, 0, 3496, 3497, 5, 114, 0, 0, 3497, 3498, 5, 105, 0, 0, 3498, 3499, 5, 98, 0, 0, 3499, 3500, 5, 117, 0, 0, 3500, 3501, 5, 116, 0, 0, 3501, 3502, 5, 101, 0, 0, 3502, 3503, 1, 0, 0, 0, 3503, 3504, 6, 277, 71, 0, 3504, 561, 1, 0, 0, 0, 3505, 3506, 5, 98, 0, 0, 3506, 3507, 5, 97, 0, 0, 3507, 3508, 5, 115, 0, 0, 3508, 3509, 5, 101, 0, 0, 3509, 3510, 5, 45, 0, 0, 3510, 3511, 5, 117, 0, 0, 3511, 3512, 5, 114, 0, 0, 3512, 3513, 5, 105, 0, 0, 3513, 3514, 1, 0, 0, 0, 3514, 3515, 6, 278, 72, 0, 3515, 563, 1, 0, 0, 0, 3516, 3517, 5, 98, 0, 0, 3517, 3518, 5, 111, 0, 0, 3518, 3519, 5, 117, 0, 0, 3519, 3520, 5, 110, 0, 0, 3520, 3521, 5, 100, 0, 0, 3521, 3522, 5, 97, 0, 0, 3522, 3523, 5, 114, 0, 0, 3523, 3524, 5, 121, 0, 0, 3524, 3525, 5, 45, 0, 0, 3525, 3526, 5, 115, 0, 0, 3526, 3527, 5, 112, 0, 0, 3527, 3528, 5, 97, 0, 0, 3528, 3529, 5, 99, 0, 0, 3529, 3530, 5, 101, 0, 0, 3530, 3531, 1, 0, 0, 0, 3531, 3532, 6, 279, 73, 0, 3532, 565, 1, 0, 0, 0, 3533, 3534, 5, 98, 0, 0, 3534, 3535, 5, 105, 0, 0, 3535, 3536, 5, 110, 0, 0, 3536, 3537, 5, 97, 0, 0, 3537, 3538, 5, 114, 0, 0, 3538, 3539, 5, 121, 0, 0, 3539, 3540, 1, 0, 0, 0, 3540, 3541, 6, 280, 74, 0, 3541, 567, 1, 0, 0, 0, 3542, 3543, 5, 98, 0, 0, 3543, 3544, 5, 121, 0, 0, 3544, 3545, 1, 0, 0, 0, 3545, 3546, 6, 281, 75, 0, 3546, 569, 1, 0, 0, 0, 3547, 3548, 5, 99, 0, 0, 3548, 3549, 5, 97, 0, 0, 3549, 3550, 5, 115, 0, 0, 3550, 3551, 5, 101, 0, 0, 3551, 3552, 1, 0, 0, 0, 3552, 3553, 6, 282, 76, 0, 3553, 571, 1, 0, 0, 0, 3554, 3555, 5, 99, 0, 0, 3555, 3556, 5, 97, 0, 0, 3556, 3557, 5, 115, 0, 0, 3557, 3558, 5, 116, 0, 0, 3558, 3559, 1, 0, 0, 0, 3559, 3560, 6, 283, 77, 0, 3560, 573, 1, 0, 0, 0, 3561, 3562, 5, 99, 0, 0, 3562, 3563, 5, 97, 0, 0, 3563, 3564, 5, 115, 0, 0, 3564, 3565, 5, 116, 0, 0, 3565, 3566, 5, 97, 0, 0, 3566, 3567, 5, 98, 0, 0, 3567, 3568, 5, 108, 0, 0, 3568, 3569, 5, 101, 0, 0, 3569, 3570, 1, 0, 0, 0, 3570, 3571, 6, 284, 78, 0, 3571, 575, 1, 0, 0, 0, 3572, 3573, 5, 99, 0, 0, 3573, 3574, 5, 97, 0, 0, 3574, 3575, 5, 116, 0, 0, 3575, 3576, 5, 99, 0, 0, 3576, 3577, 5, 104, 0, 0, 3577, 3578, 1, 0, 0, 0, 3578, 3579, 6, 285, 79, 0, 3579, 577, 1, 0, 0, 0, 3580, 3581, 5, 99, 0, 0, 3581, 3582, 5, 104, 0, 0, 3582, 3583, 5, 105, 0, 0, 3583, 3584, 5, 108, 0, 0, 3584, 3585, 5, 100, 0, 0, 3585, 3586, 1, 0, 0, 0, 3586, 3587, 6, 286, 80, 0, 3587, 579, 1, 0, 0, 0, 3588, 3589, 5, 99, 0, 0, 3589, 3590, 5, 111, 0, 0, 3590, 3591, 5, 108, 0, 0, 3591, 3592, 5, 108, 0, 0, 3592, 3593, 5, 97, 0, 0, 3593, 3594, 5, 116, 0, 0, 3594, 3595, 5, 105, 0, 0, 3595, 3596, 5, 111, 0, 0, 3596, 3597, 5, 110, 0, 0, 3597, 3598, 1, 0, 0, 0, 3598, 3599, 6, 287, 81, 0, 3599, 581, 1, 0, 0, 0, 3600, 3601, 5, 99, 0, 0, 3601, 3602, 5, 111, 0, 0, 3602, 3603, 5, 109, 0, 0, 3603, 3604, 5, 109, 0, 0, 3604, 3605, 5, 101, 0, 0, 3605, 3606, 5, 110, 0, 0, 3606, 3607, 5, 116, 0, 0, 3607, 3608, 1, 0, 0, 0, 3608, 3609, 6, 288, 82, 0, 3609, 583, 1, 0, 0, 0, 3610, 3611, 5, 99, 0, 0, 3611, 3612, 5, 111, 0, 0, 3612, 3613, 5, 110, 0, 0, 3613, 3614, 5, 115, 0, 0, 3614, 3615, 5, 116, 0, 0, 3615, 3616, 5, 114, 0, 0, 3616, 3617, 5, 117, 0, 0, 3617, 3618, 5, 99, 0, 0, 3618, 3619, 5, 116, 0, 0, 3619, 3620, 5, 105, 0, 0, 3620, 3621, 5, 111, 0, 0, 3621, 3622, 5, 110, 0, 0, 3622, 3623, 1, 0, 0, 0, 3623, 3624, 6, 289, 83, 0, 3624, 585, 1, 0, 0, 0, 3625, 3626, 5, 99, 0, 0, 3626, 3627, 5, 111, 0, 0, 3627, 3628, 5, 110, 0, 0, 3628, 3629, 5, 116, 0, 0, 3629, 3630, 5, 101, 0, 0, 3630, 3631, 5, 120, 0, 0, 3631, 3632, 5, 116, 0, 0, 3632, 3633, 1, 0, 0, 0, 3633, 3634, 6, 290, 84, 0, 3634, 587, 1, 0, 0, 0, 3635, 3636, 5, 99, 0, 0, 3636, 3637, 5, 111, 0, 0, 3637, 3638, 5, 112, 0, 0, 3638, 3639, 5, 121, 0, 0, 3639, 3640, 5, 45, 0, 0, 3640, 3641, 5, 110, 0, 0, 3641, 3642, 5, 97, 0, 0, 3642, 3643, 5, 109, 0, 0, 3643, 3644, 5, 101, 0, 0, 3644, 3645, 5, 115, 0, 0, 3645, 3646, 5, 112, 0, 0, 3646, 3647, 5, 97, 0, 0, 3647, 3648, 5, 99, 0, 0, 3648, 3649, 5, 101, 0, 0, 3649, 3650, 5, 115, 0, 0, 3650, 3651, 1, 0, 0, 0, 3651, 3652, 6, 291, 85, 0, 3652, 589, 1, 0, 0, 0, 3653, 3654, 5, 99, 0, 0, 3654, 3655, 5, 111, 0, 0, 3655, 3656, 5, 117, 0, 0, 3656, 3657, 5, 110, 0, 0, 3657, 3658, 5, 116, 0, 0, 3658, 3659, 1, 0, 0, 0, 3659, 3660, 6, 292, 86, 0, 3660, 591, 1, 0, 0, 0, 3661, 3662, 5, 100, 0, 0, 3662, 3663, 5, 101, 0, 0, 3663, 3664, 5, 99, 0, 0, 3664, 3665, 5, 108, 0, 0, 3665, 3666, 5, 97, 0, 0, 3666, 3667, 5, 114, 0, 0, 3667, 3668, 5, 101, 0, 0, 3668, 3669, 1, 0, 0, 0, 3669, 3670, 6, 293, 87, 0, 3670, 593, 1, 0, 0, 0, 3671, 3672, 5, 100, 0, 0, 3672, 3673, 5, 101, 0, 0, 3673, 3674, 5, 102, 0, 0, 3674, 3675, 5, 97, 0, 0, 3675, 3676, 5, 117, 0, 0, 3676, 3677, 5, 108, 0, 0, 3677, 3678, 5, 116, 0, 0, 3678, 3679, 1, 0, 0, 0, 3679, 3680, 6, 294, 88, 0, 3680, 595, 1, 0, 0, 0, 3681, 3682, 5, 100, 0, 0, 3682, 3683, 5, 101, 0, 0, 3683, 3684, 5, 115, 0, 0, 3684, 3685, 5, 99, 0, 0, 3685, 3686, 5, 101, 0, 0, 3686, 3687, 5, 110, 0, 0, 3687, 3688, 5, 100, 0, 0, 3688, 3689, 5, 97, 0, 0, 3689, 3690, 5, 110, 0, 0, 3690, 3691, 5, 116, 0, 0, 3691, 3692, 1, 0, 0, 0, 3692, 3693, 6, 295, 89, 0, 3693, 597, 1, 0, 0, 0, 3694, 3695, 5, 100, 0, 0, 3695, 3696, 5, 101, 0, 0, 3696, 3697, 5, 115, 0, 0, 3697, 3698, 5, 99, 0, 0, 3698, 3699, 5, 101, 0, 0, 3699, 3700, 5, 110, 0, 0, 3700, 3701, 5, 100, 0, 0, 3701, 3702, 5, 97, 0, 0, 3702, 3703, 5, 110, 0, 0, 3703, 3704, 5, 116, 0, 0, 3704, 3705, 5, 45, 0, 0, 3705, 3706, 5, 111, 0, 0, 3706, 3707, 5, 114, 0, 0, 3707, 3708, 5, 45, 0, 0, 3708, 3709, 5, 115, 0, 0, 3709, 3710, 5, 101, 0, 0, 3710, 3711, 5, 108, 0, 0, 3711, 3712, 5, 102, 0, 0, 3712, 3713, 1, 0, 0, 0, 3713, 3714, 6, 296, 90, 0, 3714, 599, 1, 0, 0, 0, 3715, 3716, 5, 100, 0, 0, 3716, 3717, 5, 101, 0, 0, 3717, 3718, 5, 115, 0, 0, 3718, 3719, 5, 99, 0, 0, 3719, 3720, 5, 101, 0, 0, 3720, 3721, 5, 110, 0, 0, 3721, 3722, 5, 100, 0, 0, 3722, 3723, 5, 105, 0, 0, 3723, 3724, 5, 110, 0, 0, 3724, 3725, 5, 103, 0, 0, 3725, 3726, 1, 0, 0, 0, 3726, 3727, 6, 297, 91, 0, 3727, 601, 1, 0, 0, 0, 3728, 3729, 5, 100, 0, 0, 3729, 3730, 5, 101, 0, 0, 3730, 3731, 5, 99, 0, 0, 3731, 3732, 5, 105, 0, 0, 3732, 3733, 5, 109, 0, 0, 3733, 3734, 5, 97, 0, 0, 3734, 3735, 5, 108, 0, 0, 3735, 3736, 5, 45, 0, 0, 3736, 3737, 5, 102, 0, 0, 3737, 3738, 5, 111, 0, 0, 3738, 3739, 5, 114, 0, 0, 3739, 3740, 5, 109, 0, 0, 3740, 3741, 5, 97, 0, 0, 3741, 3742, 5, 116, 0, 0, 3742, 3743, 1, 0, 0, 0, 3743, 3744, 6, 298, 92, 0, 3744, 603, 1, 0, 0, 0, 3745, 3746, 5, 100, 0, 0, 3746, 3747, 5, 105, 0, 0, 3747, 3748, 5, 118, 0, 0, 3748, 3749, 1, 0, 0, 0, 3749, 3750, 6, 299, 93, 0, 3750, 605, 1, 0, 0, 0, 3751, 3752, 5, 100, 0, 0, 3752, 3753, 5, 111, 0, 0, 3753, 3754, 5, 99, 0, 0, 3754, 3755, 5, 117, 0, 0, 3755, 3756, 5, 109, 0, 0, 3756, 3757, 5, 101, 0, 0, 3757, 3758, 5, 110, 0, 0, 3758, 3759, 5, 116, 0, 0, 3759, 3760, 1, 0, 0, 0, 3760, 3761, 6, 300, 94, 0, 3761, 607, 1, 0, 0, 0, 3762, 3763, 5, 100, 0, 0, 3763, 3764, 5, 111, 0, 0, 3764, 3765, 5, 99, 0, 0, 3765, 3766, 5, 117, 0, 0, 3766, 3767, 5, 109, 0, 0, 3767, 3768, 5, 101, 0, 0, 3768, 3769, 5, 110, 0, 0, 3769, 3770, 5, 116, 0, 0, 3770, 3771, 5, 45, 0, 0, 3771, 3772, 5, 110, 0, 0, 3772, 3773, 5, 111, 0, 0, 3773, 3774, 5, 100, 0, 0, 3774, 3775, 5, 101, 0, 0, 3775, 3776, 1, 0, 0, 0, 3776, 3777, 6, 301, 95, 0, 3777, 609, 1, 0, 0, 0, 3778, 3779, 5, 101, 0, 0, 3779, 3780, 5, 108, 0, 0, 3780, 3781, 5, 101, 0, 0, 3781, 3782, 5, 109, 0, 0, 3782, 3783, 5, 101, 0, 0, 3783, 3784, 5, 110, 0, 0, 3784, 3785, 5, 116, 0, 0, 3785, 3786, 1, 0, 0, 0, 3786, 3787, 6, 302, 96, 0, 3787, 611, 1, 0, 0, 0, 3788, 3789, 5, 101, 0, 0, 3789, 3790, 5, 108, 0, 0, 3790, 3791, 5, 115, 0, 0, 3791, 3792, 5, 101, 0, 0, 3792, 3793, 1, 0, 0, 0, 3793, 3794, 6, 303, 97, 0, 3794, 613, 1, 0, 0, 0, 3795, 3796, 5, 101, 0, 0, 3796, 3797, 5, 109, 0, 0, 3797, 3798, 5, 112, 0, 0, 3798, 3799, 5, 116, 0, 0, 3799, 3800, 5, 121, 0, 0, 3800, 3801, 1, 0, 0, 0, 3801, 3802, 6, 304, 98, 0, 3802, 615, 1, 0, 0, 0, 3803, 3804, 5, 101, 0, 0, 3804, 3805, 5, 109, 0, 0, 3805, 3806, 5, 112, 0, 0, 3806, 3807, 5, 116, 0, 0, 3807, 3808, 5, 121, 0, 0, 3808, 3809, 5, 45, 0, 0, 3809, 3810, 5, 115, 0, 0, 3810, 3811, 5, 101, 0, 0, 3811, 3812, 5, 113, 0, 0, 3812, 3813, 5, 117, 0, 0, 3813, 3814, 5, 101, 0, 0, 3814, 3815, 5, 110, 0, 0, 3815, 3816, 5, 99, 0, 0, 3816, 3817, 5, 101, 0, 0, 3817, 3818, 1, 0, 0, 0, 3818, 3819, 6, 305, 99, 0, 3819, 617, 1, 0, 0, 0, 3820, 3821, 5, 101, 0, 0, 3821, 3822, 5, 110, 0, 0, 3822, 3823, 5, 99, 0, 0, 3823, 3824, 5, 111, 0, 0, 3824, 3825, 5, 100, 0, 0, 3825, 3826, 5, 105, 0, 0, 3826, 3827, 5, 110, 0, 0, 3827, 3828, 5, 103, 0, 0, 3828, 3829, 1, 0, 0, 0, 3829, 3830, 6, 306, 100, 0, 3830, 619, 1, 0, 0, 0, 3831, 3832, 5, 101, 0, 0, 3832, 3833, 5, 110, 0, 0, 3833, 3834, 5, 100, 0, 0, 3834, 3835, 1, 0, 0, 0, 3835, 3836, 6, 307, 101, 0, 3836, 621, 1, 0, 0, 0, 3837, 3838, 5, 101, 0, 0, 3838, 3839, 5, 113, 0, 0, 3839, 3840, 1, 0, 0, 0, 3840, 3841, 6, 308, 102, 0, 3841, 623, 1, 0, 0, 0, 3842, 3843, 5, 101, 0, 0, 3843, 3844, 5, 118, 0, 0, 3844, 3845, 5, 101, 0, 0, 3845, 3846, 5, 114, 0, 0, 3846, 3847, 5, 121, 0, 0, 3847, 3848, 1, 0, 0, 0, 3848, 3849, 6, 309, 103, 0, 3849, 625, 1, 0, 0, 0, 3850, 3851, 5, 101, 0, 0, 3851, 3852, 5, 120, 0, 0, 3852, 3853, 5, 99, 0, 0, 3853, 3854, 5, 101, 0, 0, 3854, 3855, 5, 112, 0, 0, 3855, 3856, 5, 116, 0, 0, 3856, 3857, 1, 0, 0, 0, 3857, 3858, 6, 310, 104, 0, 3858, 627, 1, 0, 0, 0, 3859, 3860, 5, 101, 0, 0, 3860, 3861, 5, 120, 0, 0, 3861, 3862, 5, 116, 0, 0, 3862, 3863, 5, 101, 0, 0, 3863, 3864, 5, 114, 0, 0, 3864, 3865, 5, 110, 0, 0, 3865, 3866, 5, 97, 0, 0, 3866, 3867, 5, 108, 0, 0, 3867, 3868, 1, 0, 0, 0, 3868, 3869, 6, 311, 105, 0, 3869, 629, 1, 0, 0, 0, 3870, 3871, 5, 102, 0, 0, 3871, 3872, 5, 111, 0, 0, 3872, 3873, 5, 108, 0, 0, 3873, 3874, 5, 108, 0, 0, 3874, 3875, 5, 111, 0, 0, 3875, 3876, 5, 119, 0, 0, 3876, 3877, 5, 105, 0, 0, 3877, 3878, 5, 110, 0, 0, 3878, 3879, 5, 103, 0, 0, 3879, 3880, 1, 0, 0, 0, 3880, 3881, 6, 312, 106, 0, 3881, 631, 1, 0, 0, 0, 3882, 3883, 5, 102, 0, 0, 3883, 3884, 5, 111, 0, 0, 3884, 3885, 5, 108, 0, 0, 3885, 3886, 5, 108, 0, 0, 3886, 3887, 5, 111, 0, 0, 3887, 3888, 5, 119, 0, 0, 3888, 3889, 5, 105, 0, 0, 3889, 3890, 5, 110, 0, 0, 3890, 3891, 5, 103, 0, 0, 3891, 3892, 5, 45, 0, 0, 3892, 3893, 5, 115, 0, 0, 3893, 3894, 5, 105, 0, 0, 3894, 3895, 5, 98, 0, 0, 3895, 3896, 5, 108, 0, 0, 3896, 3897, 5, 105, 0, 0, 3897, 3898, 5, 110, 0, 0, 3898, 3899, 5, 103, 0, 0, 3899, 3900, 1, 0, 0, 0, 3900, 3901, 6, 313, 107, 0, 3901, 633, 1, 0, 0, 0, 3902, 3903, 5, 102, 0, 0, 3903, 3904, 5, 111, 0, 0, 3904, 3905, 5, 114, 0, 0, 3905, 3906, 1, 0, 0, 0, 3906, 3907, 6, 314, 108, 0, 3907, 635, 1, 0, 0, 0, 3908, 3909, 5, 102, 0, 0, 3909, 3910, 5, 117, 0, 0, 3910, 3911, 5, 110, 0, 0, 3911, 3912, 5, 99, 0, 0, 3912, 3913, 5, 116, 0, 0, 3913, 3914, 5, 105, 0, 0, 3914, 3915, 5, 111, 0, 0, 3915, 3916, 5, 110, 0, 0, 3916, 3917, 1, 0, 0, 0, 3917, 3918, 6, 315, 109, 0, 3918, 637, 1, 0, 0, 0, 3919, 3920, 5, 103, 0, 0, 3920, 3921, 5, 101, 0, 0, 3921, 3922, 1, 0, 0, 0, 3922, 3923, 6, 316, 110, 0, 3923, 639, 1, 0, 0, 0, 3924, 3925, 5, 103, 0, 0, 3925, 3926, 5, 114, 0, 0, 3926, 3927, 5, 101, 0, 0, 3927, 3928, 5, 97, 0, 0, 3928, 3929, 5, 116, 0, 0, 3929, 3930, 5, 101, 0, 0, 3930, 3931, 5, 115, 0, 0, 3931, 3932, 5, 116, 0, 0, 3932, 3933, 1, 0, 0, 0, 3933, 3934, 6, 317, 111, 0, 3934, 641, 1, 0, 0, 0, 3935, 3936, 5, 103, 0, 0, 3936, 3937, 5, 114, 0, 0, 3937, 3938, 5, 111, 0, 0, 3938, 3939, 5, 117, 0, 0, 3939, 3940, 5, 112, 0, 0, 3940, 3941, 1, 0, 0, 0, 3941, 3942, 6, 318, 112, 0, 3942, 643, 1, 0, 0, 0, 3943, 3944, 5, 103, 0, 0, 3944, 3945, 5, 116, 0, 0, 3945, 3946, 1, 0, 0, 0, 3946, 3947, 6, 319, 113, 0, 3947, 645, 1, 0, 0, 0, 3948, 3949, 5, 105, 0, 0, 3949, 3950, 5, 100, 0, 0, 3950, 3951, 5, 105, 0, 0, 3951, 3952, 5, 118, 0, 0, 3952, 3953, 1, 0, 0, 0, 3953, 3954, 6, 320, 114, 0, 3954, 647, 1, 0, 0, 0, 3955, 3956, 5, 105, 0, 0, 3956, 3957, 5, 102, 0, 0, 3957, 3958, 1, 0, 0, 0, 3958, 3959, 6, 321, 115, 0, 3959, 649, 1, 0, 0, 0, 3960, 3961, 5, 105, 0, 0, 3961, 3962, 5, 109, 0, 0, 3962, 3963, 5, 112, 0, 0, 3963, 3964, 5, 111, 0, 0, 3964, 3965, 5, 114, 0, 0, 3965, 3966, 5, 116, 0, 0, 3966, 3967, 1, 0, 0, 0, 3967, 3968, 6, 322, 116, 0, 3968, 651, 1, 0, 0, 0, 3969, 3970, 5, 105, 0, 0, 3970, 3971, 5, 110, 0, 0, 3971, 3972, 1, 0, 0, 0, 3972, 3973, 6, 323, 117, 0, 3973, 653, 1, 0, 0, 0, 3974, 3975, 5, 105, 0, 0, 3975, 3976, 5, 110, 0, 0, 3976, 3977, 5, 104, 0, 0, 3977, 3978, 5, 101, 0, 0, 3978, 3979, 5, 114, 0, 0, 3979, 3980, 5, 105, 0, 0, 3980, 3981, 5, 116, 0, 0, 3981, 3982, 1, 0, 0, 0, 3982, 3983, 6, 324, 118, 0, 3983, 655, 1, 0, 0, 0, 3984, 3985, 5, 105, 0, 0, 3985, 3986, 5, 110, 0, 0, 3986, 3987, 5, 115, 0, 0, 3987, 3988, 5, 116, 0, 0, 3988, 3989, 5, 97, 0, 0, 3989, 3990, 5, 110, 0, 0, 3990, 3991, 5, 99, 0, 0, 3991, 3992, 5, 101, 0, 0, 3992, 3993, 1, 0, 0, 0, 3993, 3994, 6, 325, 119, 0, 3994, 657, 1, 0, 0, 0, 3995, 3996, 5, 105, 0, 0, 3996, 3997, 5, 110, 0, 0, 3997, 3998, 5, 116, 0, 0, 3998, 3999, 5, 101, 0, 0, 3999, 4000, 5, 114, 0, 0, 4000, 4001, 5, 115, 0, 0, 4001, 4002, 5, 101, 0, 0, 4002, 4003, 5, 99, 0, 0, 4003, 4004, 5, 116, 0, 0, 4004, 4005, 1, 0, 0, 0, 4005, 4006, 6, 326, 120, 0, 4006, 659, 1, 0, 0, 0, 4007, 4008, 5, 105, 0, 0, 4008, 4009, 5, 115, 0, 0, 4009, 4010, 1, 0, 0, 0, 4010, 4011, 6, 327, 121, 0, 4011, 661, 1, 0, 0, 0, 4012, 4013, 5, 105, 0, 0, 4013, 4014, 5, 116, 0, 0, 4014, 4015, 5, 101, 0, 0, 4015, 4016, 5, 109, 0, 0, 4016, 4017, 1, 0, 0, 0, 4017, 4018, 6, 328, 122, 0, 4018, 663, 1, 0, 0, 0, 4019, 4020, 5, 108, 0, 0, 4020, 4021, 5, 97, 0, 0, 4021, 4022, 5, 120, 0, 0, 4022, 4023, 1, 0, 0, 0, 4023, 4024, 6, 329, 123, 0, 4024, 665, 1, 0, 0, 0, 4025, 4026, 5, 108, 0, 0, 4026, 4027, 5, 101, 0, 0, 4027, 4028, 1, 0, 0, 0, 4028, 4029, 6, 330, 124, 0, 4029, 667, 1, 0, 0, 0, 4030, 4031, 5, 108, 0, 0, 4031, 4032, 5, 101, 0, 0, 4032, 4033, 5, 97, 0, 0, 4033, 4034, 5, 115, 0, 0, 4034, 4035, 5, 116, 0, 0, 4035, 4036, 1, 0, 0, 0, 4036, 4037, 6, 331, 125, 0, 4037, 669, 1, 0, 0, 0, 4038, 4039, 5, 108, 0, 0, 4039, 4040, 5, 101, 0, 0, 4040, 4041, 5, 116, 0, 0, 4041, 4042, 1, 0, 0, 0, 4042, 4043, 6, 332, 126, 0, 4043, 671, 1, 0, 0, 0, 4044, 4045, 5, 108, 0, 0, 4045, 4046, 5, 116, 0, 0, 4046, 4047, 1, 0, 0, 0, 4047, 4048, 6, 333, 127, 0, 4048, 673, 1, 0, 0, 0, 4049, 4050, 5, 109, 0, 0, 4050, 4051, 5, 97, 0, 0, 4051, 4052, 5, 112, 0, 0, 4052, 4053, 1, 0, 0, 0, 4053, 4054, 6, 334, 128, 0, 4054, 675, 1, 0, 0, 0, 4055, 4056, 5, 109, 0, 0, 4056, 4057, 5, 111, 0, 0, 4057, 4058, 5, 100, 0, 0, 4058, 4059, 1, 0, 0, 0, 4059, 4060, 6, 335, 129, 0, 4060, 677, 1, 0, 0, 0, 4061, 4062, 5, 109, 0, 0, 4062, 4063, 5, 111, 0, 0, 4063, 4064, 5, 100, 0, 0, 4064, 4065, 5, 117, 0, 0, 4065, 4066, 5, 108, 0, 0, 4066, 4067, 5, 101, 0, 0, 4067, 4068, 1, 0, 0, 0, 4068, 4069, 6, 336, 130, 0, 4069, 679, 1, 0, 0, 0, 4070, 4071, 5, 110, 0, 0, 4071, 4072, 5, 97, 0, 0, 4072, 4073, 5, 109, 0, 0, 4073, 4074, 5, 101, 0, 0, 4074, 4075, 5, 115, 0, 0, 4075, 4076, 5, 112, 0, 0, 4076, 4077, 5, 97, 0, 0, 4077, 4078, 5, 99, 0, 0, 4078, 4079, 5, 101, 0, 0, 4079, 4080, 1, 0, 0, 0, 4080, 4081, 6, 337, 131, 0, 4081, 681, 1, 0, 0, 0, 4082, 4083, 5, 110, 0, 0, 4083, 4084, 5, 101, 0, 0, 4084, 4085, 1, 0, 0, 0, 4085, 4086, 6, 338, 132, 0, 4086, 683, 1, 0, 0, 0, 4087, 4088, 5, 110, 0, 0, 4088, 4089, 5, 101, 0, 0, 4089, 4090, 5, 120, 0, 0, 4090, 4091, 5, 116, 0, 0, 4091, 4092, 1, 0, 0, 0, 4092, 4093, 6, 339, 133, 0, 4093, 685, 1, 0, 0, 0, 4094, 4095, 5, 110, 0, 0, 4095, 4096, 5, 97, 0, 0, 4096, 4097, 5, 109, 0, 0, 4097, 4098, 5, 101, 0, 0, 4098, 4099, 5, 115, 0, 0, 4099, 4100, 5, 112, 0, 0, 4100, 4101, 5, 97, 0, 0, 4101, 4102, 5, 99, 0, 0, 4102, 4103, 5, 101, 0, 0, 4103, 4104, 5, 45, 0, 0, 4104, 4105, 5, 110, 0, 0, 4105, 4106, 5, 111, 0, 0, 4106, 4107, 5, 100, 0, 0, 4107, 4108, 5, 101, 0, 0, 4108, 4109, 1, 0, 0, 0, 4109, 4110, 6, 340, 134, 0, 4110, 687, 1, 0, 0, 0, 4111, 4112, 5, 110, 0, 0, 4112, 4113, 5, 111, 0, 0, 4113, 4114, 5, 45, 0, 0, 4114, 4115, 5, 105, 0, 0, 4115, 4116, 5, 110, 0, 0, 4116, 4117, 5, 104, 0, 0, 4117, 4118, 5, 101, 0, 0, 4118, 4119, 5, 114, 0, 0, 4119, 4120, 5, 105, 0, 0, 4120, 4121, 5, 116, 0, 0, 4121, 4122, 1, 0, 0, 0, 4122, 4123, 6, 341, 135, 0, 4123, 689, 1, 0, 0, 0, 4124, 4125, 5, 110, 0, 0, 4125, 4126, 5, 111, 0, 0, 4126, 4127, 5, 45, 0, 0, 4127, 4128, 5, 112, 0, 0, 4128, 4129, 5, 114, 0, 0, 4129, 4130, 5, 101, 0, 0, 4130, 4131, 5, 115, 0, 0, 4131, 4132, 5, 101, 0, 0, 4132, 4133, 5, 114, 0, 0, 4133, 4134, 5, 118, 0, 0, 4134, 4135, 5, 101, 0, 0, 4135, 4136, 1, 0, 0, 0, 4136, 4137, 6, 342, 136, 0, 4137, 691, 1, 0, 0, 0, 4138, 4139, 5, 110, 0, 0, 4139, 4140, 5, 111, 0, 0, 4140, 4141, 5, 100, 0, 0, 4141, 4142, 5, 101, 0, 0, 4142, 4143, 1, 0, 0, 0, 4143, 4144, 6, 343, 137, 0, 4144, 693, 1, 0, 0, 0, 4145, 4146, 5, 111, 0, 0, 4146, 4147, 5, 102, 0, 0, 4147, 4148, 1, 0, 0, 0, 4148, 4149, 6, 344, 138, 0, 4149, 695, 1, 0, 0, 0, 4150, 4151, 5, 111, 0, 0, 4151, 4152, 5, 110, 0, 0, 4152, 4153, 5, 108, 0, 0, 4153, 4154, 5, 121, 0, 0, 4154, 4155, 1, 0, 0, 0, 4155, 4156, 6, 345, 139, 0, 4156, 697, 1, 0, 0, 0, 4157, 4158, 5, 111, 0, 0, 4158, 4159, 5, 112, 0, 0, 4159, 4160, 5, 116, 0, 0, 4160, 4161, 5, 105, 0, 0, 4161, 4162, 5, 111, 0, 0, 4162, 4163, 5, 110, 0, 0, 4163, 4164, 1, 0, 0, 0, 4164, 4165, 6, 346, 140, 0, 4165, 699, 1, 0, 0, 0, 4166, 4167, 5, 111, 0, 0, 4167, 4168, 5, 114, 0, 0, 4168, 4169, 1, 0, 0, 0, 4169, 4170, 6, 347, 141, 0, 4170, 701, 1, 0, 0, 0, 4171, 4172, 5, 111, 0, 0, 4172, 4173, 5, 114, 0, 0, 4173, 4174, 5, 100, 0, 0, 4174, 4175, 5, 101, 0, 0, 4175, 4176, 5, 114, 0, 0, 4176, 4177, 1, 0, 0, 0, 4177, 4178, 6, 348, 142, 0, 4178, 703, 1, 0, 0, 0, 4179, 4180, 5, 111, 0, 0, 4180, 4181, 5, 114, 0, 0, 4181, 4182, 5, 100, 0, 0, 4182, 4183, 5, 101, 0, 0, 4183, 4184, 5, 114, 0, 0, 4184, 4185, 5, 101, 0, 0, 4185, 4186, 5, 100, 0, 0, 4186, 4187, 1, 0, 0, 0, 4187, 4188, 6, 349, 143, 0, 4188, 705, 1, 0, 0, 0, 4189, 4190, 5, 111, 0, 0, 4190, 4191, 5, 114, 0, 0, 4191, 4192, 5, 100, 0, 0, 4192, 4193, 5, 101, 0, 0, 4193, 4194, 5, 114, 0, 0, 4194, 4195, 5, 105, 0, 0, 4195, 4196, 5, 110, 0, 0, 4196, 4197, 5, 103, 0, 0, 4197, 4198, 1, 0, 0, 0, 4198, 4199, 6, 350, 144, 0, 4199, 707, 1, 0, 0, 0, 4200, 4201, 5, 112, 0, 0, 4201, 4202, 5, 97, 0, 0, 4202, 4203, 5, 114, 0, 0, 4203, 4204, 5, 101, 0, 0, 4204, 4205, 5, 110, 0, 0, 4205, 4206, 5, 116, 0, 0, 4206, 4207, 1, 0, 0, 0, 4207, 4208, 6, 351, 145, 0, 4208, 709, 1, 0, 0, 0, 4209, 4210, 5, 112, 0, 0, 4210, 4211, 5, 114, 0, 0, 4211, 4212, 5, 101, 0, 0, 4212, 4213, 5, 99, 0, 0, 4213, 4214, 5, 101, 0, 0, 4214, 4215, 5, 100, 0, 0, 4215, 4216, 5, 105, 0, 0, 4216, 4217, 5, 110, 0, 0, 4217, 4218, 5, 103, 0, 0, 4218, 4219, 1, 0, 0, 0, 4219, 4220, 6, 352, 146, 0, 4220, 711, 1, 0, 0, 0, 4221, 4222, 5, 112, 0, 0, 4222, 4223, 5, 114, 0, 0, 4223, 4224, 5, 101, 0, 0, 4224, 4225, 5, 99, 0, 0, 4225, 4226, 5, 101, 0, 0, 4226, 4227, 5, 100, 0, 0, 4227, 4228, 5, 105, 0, 0, 4228, 4229, 5, 110, 0, 0, 4229, 4230, 5, 103, 0, 0, 4230, 4231, 5, 45, 0, 0, 4231, 4232, 5, 115, 0, 0, 4232, 4233, 5, 105, 0, 0, 4233, 4234, 5, 98, 0, 0, 4234, 4235, 5, 108, 0, 0, 4235, 4236, 5, 105, 0, 0, 4236, 4237, 5, 110, 0, 0, 4237, 4238, 5, 103, 0, 0, 4238, 4239, 1, 0, 0, 0, 4239, 4240, 6, 353, 147, 0, 4240, 713, 1, 0, 0, 0, 4241, 4242, 5, 112, 0, 0, 4242, 4243, 5, 114, 0, 0, 4243, 4244, 5, 101, 0, 0, 4244, 4245, 5, 115, 0, 0, 4245, 4246, 5, 101, 0, 0, 4246, 4247, 5, 114, 0, 0, 4247, 4248, 5, 118, 0, 0, 4248, 4249, 5, 101, 0, 0, 4249, 4250, 1, 0, 0, 0, 4250, 4251, 6, 354, 148, 0, 4251, 715, 1, 0, 0, 0, 4252, 4253, 5, 112, 0, 0, 4253, 4254, 5, 114, 0, 0, 4254, 4255, 5, 101, 0, 0, 4255, 4256, 5, 118, 0, 0, 4256, 4257, 5, 105, 0, 0, 4257, 4258, 5, 111, 0, 0, 4258, 4259, 5, 117, 0, 0, 4259, 4260, 5, 115, 0, 0, 4260, 4261, 1, 0, 0, 0, 4261, 4262, 6, 355, 149, 0, 4262, 717, 1, 0, 0, 0, 4263, 4264, 5, 112, 0, 0, 4264, 4265, 5, 114, 0, 0, 4265, 4266, 5, 111, 0, 0, 4266, 4267, 5, 99, 0, 0, 4267, 4268, 5, 101, 0, 0, 4268, 4269, 5, 115, 0, 0, 4269, 4270, 5, 115, 0, 0, 4270, 4271, 5, 105, 0, 0, 4271, 4272, 5, 110, 0, 0, 4272, 4273, 5, 103, 0, 0, 4273, 4274, 5, 45, 0, 0, 4274, 4275, 5, 105, 0, 0, 4275, 4276, 5, 110, 0, 0, 4276, 4277, 5, 115, 0, 0, 4277, 4278, 5, 116, 0, 0, 4278, 4279, 5, 114, 0, 0, 4279, 4280, 5, 117, 0, 0, 4280, 4281, 5, 99, 0, 0, 4281, 4282, 5, 116, 0, 0, 4282, 4283, 5, 105, 0, 0, 4283, 4284, 5, 111, 0, 0, 4284, 4285, 5, 110, 0, 0, 4285, 4286, 1, 0, 0, 0, 4286, 4287, 6, 356, 150, 0, 4287, 719, 1, 0, 0, 0, 4288, 4289, 5, 114, 0, 0, 4289, 4290, 5, 101, 0, 0, 4290, 4291, 5, 116, 0, 0, 4291, 4292, 5, 117, 0, 0, 4292, 4293, 5, 114, 0, 0, 4293, 4294, 5, 110, 0, 0, 4294, 4295, 1, 0, 0, 0, 4295, 4296, 6, 357, 151, 0, 4296, 721, 1, 0, 0, 0, 4297, 4298, 5, 115, 0, 0, 4298, 4299, 5, 97, 0, 0, 4299, 4300, 5, 116, 0, 0, 4300, 4301, 5, 105, 0, 0, 4301, 4302, 5, 115, 0, 0, 4302, 4303, 5, 102, 0, 0, 4303, 4304, 5, 105, 0, 0, 4304, 4305, 5, 101, 0, 0, 4305, 4306, 5, 115, 0, 0, 4306, 4307, 1, 0, 0, 0, 4307, 4308, 6, 358, 152, 0, 4308, 723, 1, 0, 0, 0, 4309, 4310, 5, 115, 0, 0, 4310, 4311, 5, 99, 0, 0, 4311, 4312, 5, 104, 0, 0, 4312, 4313, 5, 101, 0, 0, 4313, 4314, 5, 109, 0, 0, 4314, 4315, 5, 97, 0, 0, 4315, 4316, 1, 0, 0, 0, 4316, 4317, 6, 359, 153, 0, 4317, 725, 1, 0, 0, 0, 4318, 4319, 5, 115, 0, 0, 4319, 4320, 5, 99, 0, 0, 4320, 4321, 5, 104, 0, 0, 4321, 4322, 5, 101, 0, 0, 4322, 4323, 5, 109, 0, 0, 4323, 4324, 5, 97, 0, 0, 4324, 4325, 5, 45, 0, 0, 4325, 4326, 5, 97, 0, 0, 4326, 4327, 5, 116, 0, 0, 4327, 4328, 5, 116, 0, 0, 4328, 4329, 5, 114, 0, 0, 4329, 4330, 5, 105, 0, 0, 4330, 4331, 5, 98, 0, 0, 4331, 4332, 5, 117, 0, 0, 4332, 4333, 5, 116, 0, 0, 4333, 4334, 5, 101, 0, 0, 4334, 4335, 1, 0, 0, 0, 4335, 4336, 6, 360, 154, 0, 4336, 727, 1, 0, 0, 0, 4337, 4338, 5, 115, 0, 0, 4338, 4339, 5, 99, 0, 0, 4339, 4340, 5, 104, 0, 0, 4340, 4341, 5, 101, 0, 0, 4341, 4342, 5, 109, 0, 0, 4342, 4343, 5, 97, 0, 0, 4343, 4344, 5, 45, 0, 0, 4344, 4345, 5, 101, 0, 0, 4345, 4346, 5, 108, 0, 0, 4346, 4347, 5, 101, 0, 0, 4347, 4348, 5, 109, 0, 0, 4348, 4349, 5, 101, 0, 0, 4349, 4350, 5, 110, 0, 0, 4350, 4351, 5, 116, 0, 0, 4351, 4352, 1, 0, 0, 0, 4352, 4353, 6, 361, 155, 0, 4353, 729, 1, 0, 0, 0, 4354, 4355, 5, 115, 0, 0, 4355, 4356, 5, 101, 0, 0, 4356, 4357, 5, 108, 0, 0, 4357, 4358, 5, 102, 0, 0, 4358, 4359, 1, 0, 0, 0, 4359, 4360, 6, 362, 156, 0, 4360, 731, 1, 0, 0, 0, 4361, 4362, 5, 115, 0, 0, 4362, 4363, 5, 108, 0, 0, 4363, 4364, 5, 105, 0, 0, 4364, 4365, 5, 100, 0, 0, 4365, 4366, 5, 105, 0, 0, 4366, 4367, 5, 110, 0, 0, 4367, 4368, 5, 103, 0, 0, 4368, 4369, 1, 0, 0, 0, 4369, 4370, 6, 363, 157, 0, 4370, 733, 1, 0, 0, 0, 4371, 4372, 5, 115, 0, 0, 4372, 4373, 5, 111, 0, 0, 4373, 4374, 5, 109, 0, 0, 4374, 4375, 5, 101, 0, 0, 4375, 4376, 1, 0, 0, 0, 4376, 4377, 6, 364, 158, 0, 4377, 735, 1, 0, 0, 0, 4378, 4379, 5, 115, 0, 0, 4379, 4380, 5, 116, 0, 0, 4380, 4381, 5, 97, 0, 0, 4381, 4382, 5, 98, 0, 0, 4382, 4383, 5, 108, 0, 0, 4383, 4384, 5, 101, 0, 0, 4384, 4385, 1, 0, 0, 0, 4385, 4386, 6, 365, 159, 0, 4386, 737, 1, 0, 0, 0, 4387, 4388, 5, 115, 0, 0, 4388, 4389, 5, 116, 0, 0, 4389, 4390, 5, 97, 0, 0, 4390, 4391, 5, 114, 0, 0, 4391, 4392, 5, 116, 0, 0, 4392, 4393, 1, 0, 0, 0, 4393, 4394, 6, 366, 160, 0, 4394, 739, 1, 0, 0, 0, 4395, 4396, 5, 115, 0, 0, 4396, 4397, 5, 116, 0, 0, 4397, 4398, 5, 114, 0, 0, 4398, 4399, 5, 105, 0, 0, 4399, 4400, 5, 99, 0, 0, 4400, 4401, 5, 116, 0, 0, 4401, 4402, 1, 0, 0, 0, 4402, 4403, 6, 367, 161, 0, 4403, 741, 1, 0, 0, 0, 4404, 4405, 5, 115, 0, 0, 4405, 4406, 5, 116, 0, 0, 4406, 4407, 5, 114, 0, 0, 4407, 4408, 5, 105, 0, 0, 4408, 4409, 5, 112, 0, 0, 4409, 4410, 1, 0, 0, 0, 4410, 4411, 6, 368, 162, 0, 4411, 743, 1, 0, 0, 0, 4412, 4413, 5, 115, 0, 0, 4413, 4414, 5, 119, 0, 0, 4414, 4415, 5, 105, 0, 0, 4415, 4416, 5, 116, 0, 0, 4416, 4417, 5, 99, 0, 0, 4417, 4418, 5, 104, 0, 0, 4418, 4419, 1, 0, 0, 0, 4419, 4420, 6, 369, 163, 0, 4420, 745, 1, 0, 0, 0, 4421, 4422, 5, 116, 0, 0, 4422, 4423, 5, 101, 0, 0, 4423, 4424, 5, 120, 0, 0, 4424, 4425, 5, 116, 0, 0, 4425, 4426, 1, 0, 0, 0, 4426, 4427, 6, 370, 164, 0, 4427, 747, 1, 0, 0, 0, 4428, 4429, 5, 116, 0, 0, 4429, 4430, 5, 104, 0, 0, 4430, 4431, 5, 101, 0, 0, 4431, 4432, 5, 110, 0, 0, 4432, 4433, 1, 0, 0, 0, 4433, 4434, 6, 371, 165, 0, 4434, 749, 1, 0, 0, 0, 4435, 4436, 5, 116, 0, 0, 4436, 4437, 5, 111, 0, 0, 4437, 4438, 1, 0, 0, 0, 4438, 4439, 6, 372, 166, 0, 4439, 751, 1, 0, 0, 0, 4440, 4441, 5, 116, 0, 0, 4441, 4442, 5, 114, 0, 0, 4442, 4443, 5, 101, 0, 0, 4443, 4444, 5, 97, 0, 0, 4444, 4445, 5, 116, 0, 0, 4445, 4446, 1, 0, 0, 0, 4446, 4447, 6, 373, 167, 0, 4447, 753, 1, 0, 0, 0, 4448, 4449, 5, 116, 0, 0, 4449, 4450, 5, 114, 0, 0, 4450, 4451, 5, 121, 0, 0, 4451, 4452, 1, 0, 0, 0, 4452, 4453, 6, 374, 168, 0, 4453, 755, 1, 0, 0, 0, 4454, 4455, 5, 116, 0, 0, 4455, 4456, 5, 117, 0, 0, 4456, 4457, 5, 109, 0, 0, 4457, 4458, 5, 98, 0, 0, 4458, 4459, 5, 108, 0, 0, 4459, 4460, 5, 105, 0, 0, 4460, 4461, 5, 110, 0, 0, 4461, 4462, 5, 103, 0, 0, 4462, 4463, 1, 0, 0, 0, 4463, 4464, 6, 375, 169, 0, 4464, 757, 1, 0, 0, 0, 4465, 4466, 5, 116, 0, 0, 4466, 4467, 5, 121, 0, 0, 4467, 4468, 5, 112, 0, 0, 4468, 4469, 5, 101, 0, 0, 4469, 4470, 1, 0, 0, 0, 4470, 4471, 6, 376, 170, 0, 4471, 759, 1, 0, 0, 0, 4472, 4473, 5, 116, 0, 0, 4473, 4474, 5, 121, 0, 0, 4474, 4475, 5, 112, 0, 0, 4475, 4476, 5, 101, 0, 0, 4476, 4477, 5, 115, 0, 0, 4477, 4478, 5, 119, 0, 0, 4478, 4479, 5, 105, 0, 0, 4479, 4480, 5, 116, 0, 0, 4480, 4481, 5, 99, 0, 0, 4481, 4482, 5, 104, 0, 0, 4482, 4483, 1, 0, 0, 0, 4483, 4484, 6, 377, 171, 0, 4484, 761, 1, 0, 0, 0, 4485, 4486, 5, 117, 0, 0, 4486, 4487, 5, 110, 0, 0, 4487, 4488, 5, 105, 0, 0, 4488, 4489, 5, 111, 0, 0, 4489, 4490, 5, 110, 0, 0, 4490, 4491, 1, 0, 0, 0, 4491, 4492, 6, 378, 172, 0, 4492, 763, 1, 0, 0, 0, 4493, 4494, 5, 117, 0, 0, 4494, 4495, 5, 110, 0, 0, 4495, 4496, 5, 111, 0, 0, 4496, 4497, 5, 114, 0, 0, 4497, 4498, 5, 100, 0, 0, 4498, 4499, 5, 101, 0, 0, 4499, 4500, 5, 114, 0, 0, 4500, 4501, 5, 101, 0, 0, 4501, 4502, 5, 100, 0, 0, 4502, 4503, 1, 0, 0, 0, 4503, 4504, 6, 379, 173, 0, 4504, 765, 1, 0, 0, 0, 4505, 4506, 5, 117, 0, 0, 4506, 4507, 5, 112, 0, 0, 4507, 4508, 5, 100, 0, 0, 4508, 4509, 5, 97, 0, 0, 4509, 4510, 5, 116, 0, 0, 4510, 4511, 5, 101, 0, 0, 4511, 4512, 1, 0, 0, 0, 4512, 4513, 6, 380, 174, 0, 4513, 767, 1, 0, 0, 0, 4514, 4515, 5, 118, 0, 0, 4515, 4516, 5, 97, 0, 0, 4516, 4517, 5, 108, 0, 0, 4517, 4518, 5, 105, 0, 0, 4518, 4519, 5, 100, 0, 0, 4519, 4520, 5, 97, 0, 0, 4520, 4521, 5, 116, 0, 0, 4521, 4522, 5, 101, 0, 0, 4522, 4523, 1, 0, 0, 0, 4523, 4524, 6, 381, 175, 0, 4524, 769, 1, 0, 0, 0, 4525, 4526, 5, 118, 0, 0, 4526, 4527, 5, 97, 0, 0, 4527, 4528, 5, 114, 0, 0, 4528, 4529, 5, 105, 0, 0, 4529, 4530, 5, 97, 0, 0, 4530, 4531, 5, 98, 0, 0, 4531, 4532, 5, 108, 0, 0, 4532, 4533, 5, 101, 0, 0, 4533, 4534, 1, 0, 0, 0, 4534, 4535, 6, 382, 176, 0, 4535, 771, 1, 0, 0, 0, 4536, 4537, 5, 118, 0, 0, 4537, 4538, 5, 101, 0, 0, 4538, 4539, 5, 114, 0, 0, 4539, 4540, 5, 115, 0, 0, 4540, 4541, 5, 105, 0, 0, 4541, 4542, 5, 111, 0, 0, 4542, 4543, 5, 110, 0, 0, 4543, 4544, 1, 0, 0, 0, 4544, 4545, 6, 383, 177, 0, 4545, 773, 1, 0, 0, 0, 4546, 4547, 5, 119, 0, 0, 4547, 4548, 5, 104, 0, 0, 4548, 4549, 5, 101, 0, 0, 4549, 4550, 5, 110, 0, 0, 4550, 4551, 1, 0, 0, 0, 4551, 4552, 6, 384, 178, 0, 4552, 775, 1, 0, 0, 0, 4553, 4554, 5, 119, 0, 0, 4554, 4555, 5, 104, 0, 0, 4555, 4556, 5, 101, 0, 0, 4556, 4557, 5, 114, 0, 0, 4557, 4558, 5, 101, 0, 0, 4558, 4559, 1, 0, 0, 0, 4559, 4560, 6, 385, 179, 0, 4560, 777, 1, 0, 0, 0, 4561, 4562, 5, 119, 0, 0, 4562, 4563, 5, 105, 0, 0, 4563, 4564, 5, 110, 0, 0, 4564, 4565, 5, 100, 0, 0, 4565, 4566, 5, 111, 0, 0, 4566, 4567, 5, 119, 0, 0, 4567, 4568, 1, 0, 0, 0, 4568, 4569, 6, 386, 180, 0, 4569, 779, 1, 0, 0, 0, 4570, 4571, 5, 120, 0, 0, 4571, 4572, 5, 113, 0, 0, 4572, 4573, 5, 117, 0, 0, 4573, 4574, 5, 101, 0, 0, 4574, 4575, 5, 114, 0, 0, 4575, 4576, 5, 121, 0, 0, 4576, 4577, 1, 0, 0, 0, 4577, 4578, 6, 387, 181, 0, 4578, 781, 1, 0, 0, 0, 4579, 4580, 5, 97, 0, 0, 4580, 4581, 5, 114, 0, 0, 4581, 4582, 5, 114, 0, 0, 4582, 4583, 5, 97, 0, 0, 4583, 4584, 5, 121, 0, 0, 4584, 4585, 5, 45, 0, 0, 4585, 4586, 5, 110, 0, 0, 4586, 4587, 5, 111, 0, 0, 4587, 4588, 5, 100, 0, 0, 4588, 4589, 5, 101, 0, 0, 4589, 4590, 1, 0, 0, 0, 4590, 4591, 6, 388, 182, 0, 4591, 783, 1, 0, 0, 0, 4592, 4593, 5, 98, 0, 0, 4593, 4594, 5, 111, 0, 0, 4594, 4595, 5, 111, 0, 0, 4595, 4596, 5, 108, 0, 0, 4596, 4597, 5, 101, 0, 0, 4597, 4598, 5, 97, 0, 0, 4598, 4599, 5, 110, 0, 0, 4599, 4600, 5, 45, 0, 0, 4600, 4601, 5, 110, 0, 0, 4601, 4602, 5, 111, 0, 0, 4602, 4603, 5, 100, 0, 0, 4603, 4604, 5, 101, 0, 0, 4604, 4605, 1, 0, 0, 0, 4605, 4606, 6, 389, 183, 0, 4606, 785, 1, 0, 0, 0, 4607, 4608, 5, 110, 0, 0, 4608, 4609, 5, 117, 0, 0, 4609, 4610, 5, 108, 0, 0, 4610, 4611, 5, 108, 0, 0, 4611, 4612, 5, 45, 0, 0, 4612, 4613, 5, 110, 0, 0, 4613, 4614, 5, 111, 0, 0, 4614, 4615, 5, 100, 0, 0, 4615, 4616, 5, 101, 0, 0, 4616, 4617, 1, 0, 0, 0, 4617, 4618, 6, 390, 184, 0, 4618, 787, 1, 0, 0, 0, 4619, 4620, 5, 110, 0, 0, 4620, 4621, 5, 117, 0, 0, 4621, 4622, 5, 109, 0, 0, 4622, 4623, 5, 98, 0, 0, 4623, 4624, 5, 101, 0, 0, 4624, 4625, 5, 114, 0, 0, 4625, 4626, 5, 45, 0, 0, 4626, 4627, 5, 110, 0, 0, 4627, 4628, 5, 111, 0, 0, 4628, 4629, 5, 100, 0, 0, 4629, 4630, 5, 101, 0, 0, 4630, 4631, 1, 0, 0, 0, 4631, 4632, 6, 391, 185, 0, 4632, 789, 1, 0, 0, 0, 4633, 4634, 5, 111, 0, 0, 4634, 4635, 5, 98, 0, 0, 4635, 4636, 5, 106, 0, 0, 4636, 4637, 5, 101, 0, 0, 4637, 4638, 5, 99, 0, 0, 4638, 4639, 5, 116, 0, 0, 4639, 4640, 5, 45, 0, 0, 4640, 4641, 5, 110, 0, 0, 4641, 4642, 5, 111, 0, 0, 4642, 4643, 5, 100, 0, 0, 4643, 4644, 5, 101, 0, 0, 4644, 4645, 1, 0, 0, 0, 4645, 4646, 6, 392, 186, 0, 4646, 791, 1, 0, 0, 0, 4647, 4648, 5, 114, 0, 0, 4648, 4649, 5, 101, 0, 0, 4649, 4650, 5, 112, 0, 0, 4650, 4651, 5, 108, 0, 0, 4651, 4652, 5, 97, 0, 0, 4652, 4653, 5, 99, 0, 0, 4653, 4654, 5, 101, 0, 0, 4654, 4655, 1, 0, 0, 0, 4655, 4656, 6, 393, 187, 0, 4656, 793, 1, 0, 0, 0, 4657, 4658, 5, 119, 0, 0, 4658, 4659, 5, 105, 0, 0, 4659, 4660, 5, 116, 0, 0, 4660, 4661, 5, 104, 0, 0, 4661, 4662, 1, 0, 0, 0, 4662, 4663, 6, 394, 188, 0, 4663, 795, 1, 0, 0, 0, 4664, 4665, 5, 118, 0, 0, 4665, 4666, 5, 97, 0, 0, 4666, 4667, 5, 108, 0, 0, 4667, 4668, 5, 117, 0, 0, 4668, 4669, 5, 101, 0, 0, 4669, 4670, 1, 0, 0, 0, 4670, 4671, 6, 395, 189, 0, 4671, 797, 1, 0, 0, 0, 4672, 4673, 5, 105, 0, 0, 4673, 4674, 5, 110, 0, 0, 4674, 4675, 5, 115, 0, 0, 4675, 4676, 5, 101, 0, 0, 4676, 4677, 5, 114, 0, 0, 4677, 4678, 5, 116, 0, 0, 4678, 4679, 1, 0, 0, 0, 4679, 4680, 6, 396, 190, 0, 4680, 799, 1, 0, 0, 0, 4681, 4682, 5, 105, 0, 0, 4682, 4683, 5, 110, 0, 0, 4683, 4684, 5, 116, 0, 0, 4684, 4685, 5, 111, 0, 0, 4685, 4686, 1, 0, 0, 0, 4686, 4687, 6, 397, 191, 0, 4687, 801, 1, 0, 0, 0, 4688, 4689, 5, 100, 0, 0, 4689, 4690, 5, 101, 0, 0, 4690, 4691, 5, 108, 0, 0, 4691, 4692, 5, 101, 0, 0, 4692, 4693, 5, 116, 0, 0, 4693, 4694, 5, 101, 0, 0, 4694, 4695, 1, 0, 0, 0, 4695, 4696, 6, 398, 192, 0, 4696, 803, 1, 0, 0, 0, 4697, 4698, 5, 114, 0, 0, 4698, 4699, 5, 101, 0, 0, 4699, 4700, 5, 110, 0, 0, 4700, 4701, 5, 97, 0, 0, 4701, 4702, 5, 109, 0, 0, 4702, 4703, 5, 101, 0, 0, 4703, 4704, 1, 0, 0, 0, 4704, 4705, 6, 399, 193, 0, 4705, 805, 1, 0, 0, 0, 4706, 4707, 5, 81, 0, 0, 4707, 4713, 5, 123, 0, 0, 4708, 4712, 3, 16, 5, 0, 4709, 4712, 3, 18, 6, 0, 4710, 4712, 8, 9, 0, 0, 4711, 4708, 1, 0, 0, 0, 4711, 4709, 1, 0, 0, 0, 4711, 4710, 1, 0, 0, 0, 4712, 4715, 1, 0, 0, 0, 4713, 4711, 1, 0, 0, 0, 4713, 4714, 1, 0, 0, 0, 4714, 4716, 1, 0, 0, 0, 4715, 4713, 1, 0, 0, 0, 4716, 4717, 5, 125, 0, 0, 4717, 4718, 3, 374, 184, 0, 4718, 4719, 1, 0, 0, 0, 4719, 4720, 6, 400, 194, 0, 4720, 807, 1, 0, 0, 0, 4721, 4722, 3, 374, 184, 0, 4722, 4723, 5, 58, 0, 0, 4723, 4724, 3, 374, 184, 0, 4724, 4725, 1, 0, 0, 0, 4725, 4726, 6, 401, 195, 0, 4726, 809, 1, 0, 0, 0, 4727, 4728, 3, 374, 184, 0, 4728, 4729, 5, 58, 0, 0, 4729, 4730, 5, 42, 0, 0, 4730, 4731, 1, 0, 0, 0, 4731, 4732, 6, 402, 196, 0, 4732, 811, 1, 0, 0, 0, 4733, 4734, 5, 42, 0, 0, 4734, 4735, 5, 58, 0, 0, 4735, 4736, 3, 374, 184, 0, 4736, 4737, 1, 0, 0, 0, 4737, 4738, 6, 403, 197, 0, 4738, 813, 1, 0, 0, 0, 4739, 4743, 3, 376, 185, 0, 4740, 4742, 3, 378, 186, 0, 4741, 4740, 1, 0, 0, 0, 4742, 4745, 1, 0, 0, 0, 4743, 4741, 1, 0, 0, 0, 4743, 4744, 1, 0, 0, 0, 4744, 4746, 1, 0, 0, 0, 4745, 4743, 1, 0, 0, 0, 4746, 4747, 6, 404, 198, 0, 4747, 815, 1, 0, 0, 0, 4748, 4749, 5, 40, 0, 0, 4749, 4750, 5, 58, 0, 0, 4750, 4751, 5, 126, 0, 0, 4751, 4752, 1, 0, 0, 0, 4752, 4753, 6, 405, 199, 0, 4753, 817, 1, 0, 0, 0, 4754, 4756, 5, 58, 0, 0, 4755, 4754, 1, 0, 0, 0, 4756, 4757, 1, 0, 0, 0, 4757, 4755, 1, 0, 0, 0, 4757, 4758, 1, 0, 0, 0, 4758, 4759, 1, 0, 0, 0, 4759, 4760, 5, 41, 0, 0, 4760, 4761, 1, 0, 0, 0, 4761, 4762, 6, 406, 200, 0, 4762, 819, 1, 0, 0, 0, 4763, 4764, 5, 40, 0, 0, 4764, 4765, 5, 58, 0, 0, 4765, 4771, 5, 126, 0, 0, 4766, 4770, 3, 388, 191, 0, 4767, 4768, 5, 58, 0, 0, 4768, 4770, 8, 12, 0, 0, 4769, 4766, 1, 0, 0, 0, 4769, 4767, 1, 0, 0, 0, 4770, 4773, 1, 0, 0, 0, 4771, 4769, 1, 0, 0, 0, 4771, 4772, 1, 0, 0, 0, 4772, 4774, 1, 0, 0, 0, 4773, 4771, 1, 0, 0, 0, 4774, 4775, 5, 58, 0, 0, 4775, 4776, 5, 41, 0, 0, 4776, 4777, 1, 0, 0, 0, 4777, 4778, 6, 407, 201, 0, 4778, 821, 1, 0, 0, 0, 4779, 4780, 5, 40, 0, 0, 4780, 4781, 5, 58, 0, 0, 4781, 4790, 8, 13, 0, 0, 4782, 4789, 3, 386, 190, 0, 4783, 4784, 5, 40, 0, 0, 4784, 4789, 8, 14, 0, 0, 4785, 4786, 5, 58, 0, 0, 4786, 4789, 8, 12, 0, 0, 4787, 4789, 8, 15, 0, 0, 4788, 4782, 1, 0, 0, 0, 4788, 4783, 1, 0, 0, 0, 4788, 4785, 1, 0, 0, 0, 4788, 4787, 1, 0, 0, 0, 4789, 4792, 1, 0, 0, 0, 4790, 4788, 1, 0, 0, 0, 4790, 4791, 1, 0, 0, 0, 4791, 4796, 1, 0, 0, 0, 4792, 4790, 1, 0, 0, 0, 4793, 4795, 5, 58, 0, 0, 4794, 4793, 1, 0, 0, 0, 4795, 4798, 1, 0, 0, 0, 4796, 4794, 1, 0, 0, 0, 4796, 4797, 1, 0, 0, 0, 4797, 4800, 1, 0, 0, 0, 4798, 4796, 1, 0, 0, 0, 4799, 4801, 5, 58, 0, 0, 4800, 4799, 1, 0, 0, 0, 4801, 4802, 1, 0, 0, 0, 4802, 4800, 1, 0, 0, 0, 4802, 4803, 1, 0, 0, 0, 4803, 4804, 1, 0, 0, 0, 4804, 4805, 5, 41, 0, 0, 4805, 4806, 1, 0, 0, 0, 4806, 4807, 6, 408, 2, 0, 4807, 4808, 6, 408, 202, 0, 4808, 823, 1, 0, 0, 0, 4809, 4810, 7, 16, 0, 0, 4810, 4811, 1, 0, 0, 0, 4811, 4812, 6, 409, 203, 0, 4812, 825, 1, 0, 0, 0, 4813, 4814, 3, 98, 46, 0, 4814, 4815, 3, 98, 46, 0, 4815, 4816, 3, 44, 19, 0, 4816, 4817, 1, 0, 0, 0, 4817, 4818, 6, 410, 3, 0, 4818, 4819, 6, 410, 204, 0, 4819, 827, 1, 0, 0, 0, 4820, 4821, 3, 50, 22, 0, 4821, 4822, 3, 98, 46, 0, 4822, 4823, 1, 0, 0, 0, 4823, 4824, 6, 411, 4, 0, 4824, 4825, 6, 411, 205, 0, 4825, 829, 1, 0, 0, 0, 4826, 4827, 8, 17, 0, 0, 4827, 4828, 1, 0, 0, 0, 4828, 4829, 6, 412, 17, 0, 4829, 831, 1, 0, 0, 0, 4830, 4831, 3, 14, 4, 0, 4831, 4832, 1, 0, 0, 0, 4832, 4833, 6, 413, 21, 0, 4833, 833, 1, 0, 0, 0, 4834, 4835, 5, 46, 0, 0, 4835, 4845, 3, 14, 4, 0, 4836, 4837, 3, 14, 4, 0, 4837, 4841, 5, 46, 0, 0, 4838, 4840, 7, 0, 0, 0, 4839, 4838, 1, 0, 0, 0, 4840, 4843, 1, 0, 0, 0, 4841, 4839, 1, 0, 0, 0, 4841, 4842, 1, 0, 0, 0, 4842, 4845, 1, 0, 0, 0, 4843, 4841, 1, 0, 0, 0, 4844, 4834, 1, 0, 0, 0, 4844, 4836, 1, 0, 0, 0, 4845, 4846, 1, 0, 0, 0, 4846, 4847, 6, 414, 22, 0, 4847, 835, 1, 0, 0, 0, 4848, 4849, 5, 46, 0, 0, 4849, 4861, 3, 14, 4, 0, 4850, 4858, 3, 14, 4, 0, 4851, 4855, 5, 46, 0, 0, 4852, 4854, 7, 0, 0, 0, 4853, 4852, 1, 0, 0, 0, 4854, 4857, 1, 0, 0, 0, 4855, 4853, 1, 0, 0, 0, 4855, 4856, 1, 0, 0, 0, 4856, 4859, 1, 0, 0, 0, 4857, 4855, 1, 0, 0, 0, 4858, 4851, 1, 0, 0, 0, 4858, 4859, 1, 0, 0, 0, 4859, 4861, 1, 0, 0, 0, 4860, 4848, 1, 0, 0, 0, 4860, 4850, 1, 0, 0, 0, 4861, 4862, 1, 0, 0, 0, 4862, 4864, 7, 1, 0, 0, 4863, 4865, 7, 2, 0, 0, 4864, 4863, 1, 0, 0, 0, 4864, 4865, 1, 0, 0, 0, 4865, 4866, 1, 0, 0, 0, 4866, 4867, 3, 14, 4, 0, 4867, 4868, 1, 0, 0, 0, 4868, 4869, 6, 415, 23, 0, 4869, 837, 1, 0, 0, 0, 4870, 4871, 5, 100, 0, 0, 4871, 4872, 5, 101, 0, 0, 4872, 4873, 5, 99, 0, 0, 4873, 4874, 5, 105, 0, 0, 4874, 4875, 5, 109, 0, 0, 4875, 4876, 5, 97, 0, 0, 4876, 4877, 5, 108, 0, 0, 4877, 4878, 5, 45, 0, 0, 4878, 4879, 5, 115, 0, 0, 4879, 4880, 5, 101, 0, 0, 4880, 4881, 5, 112, 0, 0, 4881, 4882, 5, 97, 0, 0, 4882, 4883, 5, 114, 0, 0, 4883, 4884, 5, 97, 0, 0, 4884, 4885, 5, 116, 0, 0, 4885, 4886, 5, 111, 0, 0, 4886, 4993, 5, 114, 0, 0, 4887, 4888, 5, 103, 0, 0, 4888, 4889, 5, 114, 0, 0, 4889, 4890, 5, 111, 0, 0, 4890, 4891, 5, 117, 0, 0, 4891, 4892, 5, 112, 0, 0, 4892, 4893, 5, 105, 0, 0, 4893, 4894, 5, 110, 0, 0, 4894, 4895, 5, 103, 0, 0, 4895, 4896, 5, 45, 0, 0, 4896, 4897, 5, 115, 0, 0, 4897, 4898, 5, 101, 0, 0, 4898, 4899, 5, 112, 0, 0, 4899, 4900, 5, 97, 0, 0, 4900, 4901, 5, 114, 0, 0, 4901, 4902, 5, 97, 0, 0, 4902, 4903, 5, 116, 0, 0, 4903, 4904, 5, 111, 0, 0, 4904, 4993, 5, 114, 0, 0, 4905, 4906, 5, 105, 0, 0, 4906, 4907, 5, 110, 0, 0, 4907, 4908, 5, 102, 0, 0, 4908, 4909, 5, 105, 0, 0, 4909, 4910, 5, 110, 0, 0, 4910, 4911, 5, 105, 0, 0, 4911, 4912, 5, 116, 0, 0, 4912, 4993, 5, 121, 0, 0, 4913, 4914, 5, 109, 0, 0, 4914, 4915, 5, 105, 0, 0, 4915, 4916, 5, 110, 0, 0, 4916, 4917, 5, 117, 0, 0, 4917, 4918, 5, 115, 0, 0, 4918, 4919, 5, 45, 0, 0, 4919, 4920, 5, 115, 0, 0, 4920, 4921, 5, 105, 0, 0, 4921, 4922, 5, 103, 0, 0, 4922, 4993, 5, 110, 0, 0, 4923, 4924, 5, 78, 0, 0, 4924, 4925, 5, 97, 0, 0, 4925, 4993, 5, 78, 0, 0, 4926, 4927, 5, 112, 0, 0, 4927, 4928, 5, 101, 0, 0, 4928, 4929, 5, 114, 0, 0, 4929, 4930, 5, 99, 0, 0, 4930, 4931, 5, 101, 0, 0, 4931, 4932, 5, 110, 0, 0, 4932, 4993, 5, 116, 0, 0, 4933, 4934, 5, 112, 0, 0, 4934, 4935, 5, 101, 0, 0, 4935, 4936, 5, 114, 0, 0, 4936, 4937, 5, 45, 0, 0, 4937, 4938, 5, 109, 0, 0, 4938, 4939, 5, 105, 0, 0, 4939, 4940, 5, 108, 0, 0, 4940, 4941, 5, 108, 0, 0, 4941, 4993, 5, 101, 0, 0, 4942, 4943, 5, 122, 0, 0, 4943, 4944, 5, 101, 0, 0, 4944, 4945, 5, 114, 0, 0, 4945, 4946, 5, 111, 0, 0, 4946, 4947, 5, 45, 0, 0, 4947, 4948, 5, 100, 0, 0, 4948, 4949, 5, 105, 0, 0, 4949, 4950, 5, 103, 0, 0, 4950, 4951, 5, 105, 0, 0, 4951, 4993, 5, 116, 0, 0, 4952, 4953, 5, 100, 0, 0, 4953, 4954, 5, 105, 0, 0, 4954, 4955, 5, 103, 0, 0, 4955, 4956, 5, 105, 0, 0, 4956, 4993, 5, 116, 0, 0, 4957, 4958, 5, 112, 0, 0, 4958, 4959, 5, 97, 0, 0, 4959, 4960, 5, 116, 0, 0, 4960, 4961, 5, 116, 0, 0, 4961, 4962, 5, 101, 0, 0, 4962, 4963, 5, 114, 0, 0, 4963, 4964, 5, 110, 0, 0, 4964, 4965, 5, 45, 0, 0, 4965, 4966, 5, 115, 0, 0, 4966, 4967, 5, 101, 0, 0, 4967, 4968, 5, 112, 0, 0, 4968, 4969, 5, 97, 0, 0, 4969, 4970, 5, 114, 0, 0, 4970, 4971, 5, 97, 0, 0, 4971, 4972, 5, 116, 0, 0, 4972, 4973, 5, 111, 0, 0, 4973, 4993, 5, 114, 0, 0, 4974, 4975, 5, 101, 0, 0, 4975, 4976, 5, 120, 0, 0, 4976, 4977, 5, 112, 0, 0, 4977, 4978, 5, 111, 0, 0, 4978, 4979, 5, 110, 0, 0, 4979, 4980, 5, 101, 0, 0, 4980, 4981, 5, 110, 0, 0, 4981, 4982, 5, 116, 0, 0, 4982, 4983, 5, 45, 0, 0, 4983, 4984, 5, 115, 0, 0, 4984, 4985, 5, 101, 0, 0, 4985, 4986, 5, 112, 0, 0, 4986, 4987, 5, 97, 0, 0, 4987, 4988, 5, 114, 0, 0, 4988, 4989, 5, 97, 0, 0, 4989, 4990, 5, 116, 0, 0, 4990, 4991, 5, 111, 0, 0, 4991, 4993, 5, 114, 0, 0, 4992, 4870, 1, 0, 0, 0, 4992, 4887, 1, 0, 0, 0, 4992, 4905, 1, 0, 0, 0, 4992, 4913, 1, 0, 0, 0, 4992, 4923, 1, 0, 0, 0, 4992, 4926, 1, 0, 0, 0, 4992, 4933, 1, 0, 0, 0, 4992, 4942, 1, 0, 0, 0, 4992, 4952, 1, 0, 0, 0, 4992, 4957, 1, 0, 0, 0, 4992, 4974, 1, 0, 0, 0, 4993, 4994, 1, 0, 0, 0, 4994, 4995, 6, 416, 24, 0, 4995, 839, 1, 0, 0, 0, 4996, 5012, 5, 38, 0, 0, 4997, 4998, 5, 108, 0, 0, 4998, 5013, 5, 116, 0, 0, 4999, 5000, 5, 103, 0, 0, 5000, 5013, 5, 116, 0, 0, 5001, 5002, 5, 97, 0, 0, 5002, 5003, 5, 109, 0, 0, 5003, 5013, 5, 112, 0, 0, 5004, 5005, 5, 113, 0, 0, 5005, 5006, 5, 117, 0, 0, 5006, 5007, 5, 111, 0, 0, 5007, 5013, 5, 116, 0, 0, 5008, 5009, 5, 97, 0, 0, 5009, 5010, 5, 112, 0, 0, 5010, 5011, 5, 111, 0, 0, 5011, 5013, 5, 115, 0, 0, 5012, 4997, 1, 0, 0, 0, 5012, 4999, 1, 0, 0, 0, 5012, 5001, 1, 0, 0, 0, 5012, 5004, 1, 0, 0, 0, 5012, 5008, 1, 0, 0, 0, 5013, 5014, 1, 0, 0, 0, 5014, 5015, 5, 59, 0, 0, 5015, 5016, 1, 0, 0, 0, 5016, 5017, 6, 417, 15, 0, 5017, 841, 1, 0, 0, 0, 5018, 5019, 5, 38, 0, 0, 5019, 5020, 5, 35, 0, 0, 5020, 5022, 1, 0, 0, 0, 5021, 5023, 7, 0, 0, 0, 5022, 5021, 1, 0, 0, 0, 5023, 5024, 1, 0, 0, 0, 5024, 5022, 1, 0, 0, 0, 5024, 5025, 1, 0, 0, 0, 5025, 5026, 1, 0, 0, 0, 5026, 5038, 5, 59, 0, 0, 5027, 5028, 5, 38, 0, 0, 5028, 5029, 5, 35, 0, 0, 5029, 5030, 5, 120, 0, 0, 5030, 5032, 1, 0, 0, 0, 5031, 5033, 7, 3, 0, 0, 5032, 5031, 1, 0, 0, 0, 5033, 5034, 1, 0, 0, 0, 5034, 5032, 1, 0, 0, 0, 5034, 5035, 1, 0, 0, 0, 5035, 5036, 1, 0, 0, 0, 5036, 5038, 5, 59, 0, 0, 5037, 5018, 1, 0, 0, 0, 5037, 5027, 1, 0, 0, 0, 5038, 5039, 1, 0, 0, 0, 5039, 5040, 6, 418, 16, 0, 5040, 843, 1, 0, 0, 0, 5041, 5042, 5, 39, 0, 0, 5042, 5043, 5, 39, 0, 0, 5043, 5044, 1, 0, 0, 0, 5044, 5045, 6, 419, 18, 0, 5045, 845, 1, 0, 0, 0, 5046, 5047, 5, 34, 0, 0, 5047, 5048, 1, 0, 0, 0, 5048, 5049, 6, 420, 0, 0, 5049, 5050, 6, 420, 10, 0, 5050, 847, 1, 0, 0, 0, 5051, 5052, 5, 39, 0, 0, 5052, 5053, 1, 0, 0, 0, 5053, 5054, 6, 421, 19, 0, 5054, 5055, 6, 421, 4, 0, 5055, 5056, 6, 421, 4, 0, 5056, 849, 1, 0, 0, 0, 5057, 5058, 5, 60, 0, 0, 5058, 5059, 5, 33, 0, 0, 5059, 5060, 5, 45, 0, 0, 5060, 5061, 5, 45, 0, 0, 5061, 5067, 1, 0, 0, 0, 5062, 5063, 5, 45, 0, 0, 5063, 5066, 8, 4, 0, 0, 5064, 5066, 8, 4, 0, 0, 5065, 5062, 1, 0, 0, 0, 5065, 5064, 1, 0, 0, 0, 5066, 5069, 1, 0, 0, 0, 5067, 5065, 1, 0, 0, 0, 5067, 5068, 1, 0, 0, 0, 5068, 5070, 1, 0, 0, 0, 5069, 5067, 1, 0, 0, 0, 5070, 5071, 5, 45, 0, 0, 5071, 5072, 5, 45, 0, 0, 5072, 5073, 5, 62, 0, 0, 5073, 5074, 1, 0, 0, 0, 5074, 5075, 6, 422, 25, 0, 5075, 851, 1, 0, 0, 0, 5076, 5077, 5, 60, 0, 0, 5077, 5078, 5, 63, 0, 0, 5078, 5079, 1, 0, 0, 0, 5079, 5080, 7, 5, 0, 0, 5080, 5081, 7, 6, 0, 0, 5081, 5089, 7, 7, 0, 0, 5082, 5086, 7, 8, 0, 0, 5083, 5085, 9, 0, 0, 0, 5084, 5083, 1, 0, 0, 0, 5085, 5088, 1, 0, 0, 0, 5086, 5087, 1, 0, 0, 0, 5086, 5084, 1, 0, 0, 0, 5087, 5090, 1, 0, 0, 0, 5088, 5086, 1, 0, 0, 0, 5089, 5082, 1, 0, 0, 0, 5089, 5090, 1, 0, 0, 0, 5090, 5091, 1, 0, 0, 0, 5091, 5092, 5, 63, 0, 0, 5092, 5093, 5, 62, 0, 0, 5093, 5094, 1, 0, 0, 0, 5094, 5095, 6, 423, 26, 0, 5095, 853, 1, 0, 0, 0, 5096, 5097, 5, 60, 0, 0, 5097, 5098, 5, 63, 0, 0, 5098, 5099, 1, 0, 0, 0, 5099, 5107, 3, 374, 184, 0, 5100, 5104, 7, 8, 0, 0, 5101, 5103, 9, 0, 0, 0, 5102, 5101, 1, 0, 0, 0, 5103, 5106, 1, 0, 0, 0, 5104, 5105, 1, 0, 0, 0, 5104, 5102, 1, 0, 0, 0, 5105, 5108, 1, 0, 0, 0, 5106, 5104, 1, 0, 0, 0, 5107, 5100, 1, 0, 0, 0, 5107, 5108, 1, 0, 0, 0, 5108, 5109, 1, 0, 0, 0, 5109, 5110, 5, 63, 0, 0, 5110, 5111, 5, 62, 0, 0, 5111, 5112, 1, 0, 0, 0, 5112, 5113, 6, 424, 27, 0, 5113, 855, 1, 0, 0, 0, 5114, 5115, 5, 60, 0, 0, 5115, 5116, 5, 33, 0, 0, 5116, 5117, 5, 91, 0, 0, 5117, 5118, 5, 67, 0, 0, 5118, 5119, 5, 68, 0, 0, 5119, 5120, 5, 65, 0, 0, 5120, 5121, 5, 84, 0, 0, 5121, 5122, 5, 65, 0, 0, 5122, 5123, 5, 91, 0, 0, 5123, 5127, 1, 0, 0, 0, 5124, 5126, 9, 0, 0, 0, 5125, 5124, 1, 0, 0, 0, 5126, 5129, 1, 0, 0, 0, 5127, 5128, 1, 0, 0, 0, 5127, 5125, 1, 0, 0, 0, 5128, 5130, 1, 0, 0, 0, 5129, 5127, 1, 0, 0, 0, 5130, 5131, 5, 93, 0, 0, 5131, 5132, 5, 93, 0, 0, 5132, 5133, 5, 62, 0, 0, 5133, 5134, 1, 0, 0, 0, 5134, 5135, 6, 425, 28, 0, 5135, 857, 1, 0, 0, 0, 5136, 5137, 5, 40, 0, 0, 5137, 5138, 5, 35, 0, 0, 5138, 5140, 1, 0, 0, 0, 5139, 5141, 3, 34, 14, 0, 5140, 5139, 1, 0, 0, 0, 5140, 5141, 1, 0, 0, 0, 5141, 5145, 1, 0, 0, 0, 5142, 5143, 3, 374, 184, 0, 5143, 5144, 5, 58, 0, 0, 5144, 5146, 1, 0, 0, 0, 5145, 5142, 1, 0, 0, 0, 5145, 5146, 1, 0, 0, 0, 5146, 5147, 1, 0, 0, 0, 5147, 5155, 3, 374, 184, 0, 5148, 5152, 3, 34, 14, 0, 5149, 5151, 9, 0, 0, 0, 5150, 5149, 1, 0, 0, 0, 5151, 5154, 1, 0, 0, 0, 5152, 5153, 1, 0, 0, 0, 5152, 5150, 1, 0, 0, 0, 5153, 5156, 1, 0, 0, 0, 5154, 5152, 1, 0, 0, 0, 5155, 5148, 1, 0, 0, 0, 5155, 5156, 1, 0, 0, 0, 5156, 5157, 1, 0, 0, 0, 5157, 5158, 5, 35, 0, 0, 5158, 5159, 5, 41, 0, 0, 5159, 5160, 1, 0, 0, 0, 5160, 5161, 6, 426, 29, 0, 5161, 859, 1, 0, 0, 0, 5162, 5164, 7, 8, 0, 0, 5163, 5162, 1, 0, 0, 0, 5164, 5165, 1, 0, 0, 0, 5165, 5163, 1, 0, 0, 0, 5165, 5166, 1, 0, 0, 0, 5166, 5167, 1, 0, 0, 0, 5167, 5168, 6, 427, 2, 0, 5168, 5169, 6, 427, 30, 0, 5169, 861, 1, 0, 0, 0, 5170, 5171, 5, 61, 0, 0, 5171, 5172, 1, 0, 0, 0, 5172, 5173, 6, 428, 31, 0, 5173, 863, 1, 0, 0, 0, 5174, 5175, 5, 33, 0, 0, 5175, 5176, 5, 61, 0, 0, 5176, 5177, 1, 0, 0, 0, 5177, 5178, 6, 429, 32, 0, 5178, 865, 1, 0, 0, 0, 5179, 5180, 5, 40, 0, 0, 5180, 5181, 1, 0, 0, 0, 5181, 5182, 6, 430, 33, 0, 5182, 867, 1, 0, 0, 0, 5183, 5184, 5, 41, 0, 0, 5184, 5185, 1, 0, 0, 0, 5185, 5186, 6, 431, 34, 0, 5186, 869, 1, 0, 0, 0, 5187, 5188, 5, 91, 0, 0, 5188, 5189, 1, 0, 0, 0, 5189, 5190, 6, 432, 35, 0, 5190, 871, 1, 0, 0, 0, 5191, 5192, 5, 93, 0, 0, 5192, 5193, 1, 0, 0, 0, 5193, 5194, 6, 433, 6, 0, 5194, 873, 1, 0, 0, 0, 5195, 5196, 5, 123, 0, 0, 5196, 5197, 6, 434, 206, 0, 5197, 5198, 1, 0, 0, 0, 5198, 5199, 6, 434, 7, 0, 5199, 875, 1, 0, 0, 0, 5200, 5201, 4, 435, 2, 0, 5201, 5202, 5, 125, 0, 0, 5202, 5203, 1, 0, 0, 0, 5203, 5204, 6, 435, 14, 0, 5204, 5205, 6, 435, 4, 0, 5205, 877, 1, 0, 0, 0, 5206, 5207, 4, 436, 3, 0, 5207, 5208, 5, 125, 0, 0, 5208, 5209, 6, 436, 207, 0, 5209, 5210, 1, 0, 0, 0, 5210, 5211, 6, 436, 14, 0, 5211, 879, 1, 0, 0, 0, 5212, 5213, 5, 42, 0, 0, 5213, 5214, 1, 0, 0, 0, 5214, 5215, 6, 437, 38, 0, 5215, 881, 1, 0, 0, 0, 5216, 5217, 5, 43, 0, 0, 5217, 5218, 1, 0, 0, 0, 5218, 5219, 6, 438, 39, 0, 5219, 883, 1, 0, 0, 0, 5220, 5221, 5, 45, 0, 0, 5221, 5222, 1, 0, 0, 0, 5222, 5223, 6, 439, 40, 0, 5223, 885, 1, 0, 0, 0, 5224, 5225, 5, 44, 0, 0, 5225, 5226, 1, 0, 0, 0, 5226, 5227, 6, 440, 41, 0, 5227, 887, 1, 0, 0, 0, 5228, 5229, 5, 46, 0, 0, 5229, 5230, 1, 0, 0, 0, 5230, 5231, 6, 441, 42, 0, 5231, 889, 1, 0, 0, 0, 5232, 5233, 5, 46, 0, 0, 5233, 5234, 5, 46, 0, 0, 5234, 5235, 1, 0, 0, 0, 5235, 5236, 6, 442, 43, 0, 5236, 891, 1, 0, 0, 0, 5237, 5238, 5, 58, 0, 0, 5238, 5239, 1, 0, 0, 0, 5239, 5240, 6, 443, 44, 0, 5240, 893, 1, 0, 0, 0, 5241, 5242, 5, 58, 0, 0, 5242, 5243, 5, 61, 0, 0, 5243, 5244, 1, 0, 0, 0, 5244, 5245, 6, 444, 45, 0, 5245, 895, 1, 0, 0, 0, 5246, 5247, 5, 59, 0, 0, 5247, 5248, 1, 0, 0, 0, 5248, 5249, 6, 445, 46, 0, 5249, 897, 1, 0, 0, 0, 5250, 5251, 5, 47, 0, 0, 5251, 5252, 1, 0, 0, 0, 5252, 5253, 6, 446, 47, 0, 5253, 899, 1, 0, 0, 0, 5254, 5255, 5, 47, 0, 0, 5255, 5256, 5, 47, 0, 0, 5256, 5257, 1, 0, 0, 0, 5257, 5258, 6, 447, 48, 0, 5258, 901, 1, 0, 0, 0, 5259, 5260, 5, 92, 0, 0, 5260, 5261, 1, 0, 0, 0, 5261, 5262, 6, 448, 49, 0, 5262, 903, 1, 0, 0, 0, 5263, 5264, 5, 124, 0, 0, 5264, 5265, 1, 0, 0, 0, 5265, 5266, 6, 449, 50, 0, 5266, 905, 1, 0, 0, 0, 5267, 5268, 5, 60, 0, 0, 5268, 5269, 1, 0, 0, 0, 5269, 5270, 6, 450, 51, 0, 5270, 907, 1, 0, 0, 0, 5271, 5272, 5, 62, 0, 0, 5272, 5273, 1, 0, 0, 0, 5273, 5274, 6, 451, 52, 0, 5274, 909, 1, 0, 0, 0, 5275, 5276, 5, 63, 0, 0, 5276, 5277, 1, 0, 0, 0, 5277, 5278, 6, 452, 53, 0, 5278, 911, 1, 0, 0, 0, 5279, 5280, 5, 64, 0, 0, 5280, 5281, 1, 0, 0, 0, 5281, 5282, 6, 453, 54, 0, 5282, 913, 1, 0, 0, 0, 5283, 5284, 5, 36, 0, 0, 5284, 5285, 1, 0, 0, 0, 5285, 5286, 6, 454, 55, 0, 5286, 915, 1, 0, 0, 0, 5287, 5288, 5, 37, 0, 0, 5288, 5289, 1, 0, 0, 0, 5289, 5290, 6, 455, 56, 0, 5290, 917, 1, 0, 0, 0, 5291, 5292, 5, 33, 0, 0, 5292, 5293, 1, 0, 0, 0, 5293, 5294, 6, 456, 57, 0, 5294, 919, 1, 0, 0, 0, 5295, 5296, 5, 35, 0, 0, 5296, 5297, 1, 0, 0, 0, 5297, 5298, 6, 457, 58, 0, 5298, 921, 1, 0, 0, 0, 5299, 5300, 5, 94, 0, 0, 5300, 5301, 1, 0, 0, 0, 5301, 5302, 6, 458, 59, 0, 5302, 923, 1, 0, 0, 0, 5303, 5304, 5, 61, 0, 0, 5304, 5305, 5, 62, 0, 0, 5305, 5306, 1, 0, 0, 0, 5306, 5307, 6, 459, 60, 0, 5307, 925, 1, 0, 0, 0, 5308, 5309, 5, 96, 0, 0, 5309, 5310, 1, 0, 0, 0, 5310, 5311, 6, 460, 5, 0, 5311, 927, 1, 0, 0, 0, 5312, 5313, 5, 124, 0, 0, 5313, 5314, 5, 124, 0, 0, 5314, 5315, 1, 0, 0, 0, 5315, 5316, 6, 461, 61, 0, 5316, 929, 1, 0, 0, 0, 5317, 5318, 5, 126, 0, 0, 5318, 5319, 1, 0, 0, 0, 5319, 5320, 6, 462, 62, 0, 5320, 931, 1, 0, 0, 0, 5321, 5322, 5, 97, 0, 0, 5322, 5323, 5, 108, 0, 0, 5323, 5324, 5, 108, 0, 0, 5324, 5325, 5, 111, 0, 0, 5325, 5326, 5, 119, 0, 0, 5326, 5327, 5, 105, 0, 0, 5327, 5328, 5, 110, 0, 0, 5328, 5329, 5, 103, 0, 0, 5329, 5330, 1, 0, 0, 0, 5330, 5331, 6, 463, 63, 0, 5331, 933, 1, 0, 0, 0, 5332, 5333, 5, 97, 0, 0, 5333, 5334, 5, 110, 0, 0, 5334, 5335, 5, 99, 0, 0, 5335, 5336, 5, 101, 0, 0, 5336, 5337, 5, 115, 0, 0, 5337, 5338, 5, 116, 0, 0, 5338, 5339, 5, 111, 0, 0, 5339, 5340, 5, 114, 0, 0, 5340, 5341, 1, 0, 0, 0, 5341, 5342, 6, 464, 64, 0, 5342, 935, 1, 0, 0, 0, 5343, 5344, 5, 97, 0, 0, 5344, 5345, 5, 110, 0, 0, 5345, 5346, 5, 99, 0, 0, 5346, 5347, 5, 101, 0, 0, 5347, 5348, 5, 115, 0, 0, 5348, 5349, 5, 116, 0, 0, 5349, 5350, 5, 111, 0, 0, 5350, 5351, 5, 114, 0, 0, 5351, 5352, 5, 45, 0, 0, 5352, 5353, 5, 111, 0, 0, 5353, 5354, 5, 114, 0, 0, 5354, 5355, 5, 45, 0, 0, 5355, 5356, 5, 115, 0, 0, 5356, 5357, 5, 101, 0, 0, 5357, 5358, 5, 108, 0, 0, 5358, 5359, 5, 102, 0, 0, 5359, 5360, 1, 0, 0, 0, 5360, 5361, 6, 465, 65, 0, 5361, 937, 1, 0, 0, 0, 5362, 5363, 5, 97, 0, 0, 5363, 5364, 5, 110, 0, 0, 5364, 5365, 5, 100, 0, 0, 5365, 5366, 1, 0, 0, 0, 5366, 5367, 6, 466, 66, 0, 5367, 939, 1, 0, 0, 0, 5368, 5369, 5, 97, 0, 0, 5369, 5370, 5, 114, 0, 0, 5370, 5371, 5, 114, 0, 0, 5371, 5372, 5, 97, 0, 0, 5372, 5373, 5, 121, 0, 0, 5373, 5374, 1, 0, 0, 0, 5374, 5375, 6, 467, 67, 0, 5375, 941, 1, 0, 0, 0, 5376, 5377, 5, 97, 0, 0, 5377, 5378, 5, 115, 0, 0, 5378, 5379, 1, 0, 0, 0, 5379, 5380, 6, 468, 68, 0, 5380, 943, 1, 0, 0, 0, 5381, 5382, 5, 97, 0, 0, 5382, 5383, 5, 115, 0, 0, 5383, 5384, 5, 99, 0, 0, 5384, 5385, 5, 101, 0, 0, 5385, 5386, 5, 110, 0, 0, 5386, 5387, 5, 100, 0, 0, 5387, 5388, 5, 105, 0, 0, 5388, 5389, 5, 110, 0, 0, 5389, 5390, 5, 103, 0, 0, 5390, 5391, 1, 0, 0, 0, 5391, 5392, 6, 469, 69, 0, 5392, 945, 1, 0, 0, 0, 5393, 5394, 5, 97, 0, 0, 5394, 5395, 5, 116, 0, 0, 5395, 5396, 1, 0, 0, 0, 5396, 5397, 6, 470, 70, 0, 5397, 947, 1, 0, 0, 0, 5398, 5399, 5, 97, 0, 0, 5399, 5400, 5, 116, 0, 0, 5400, 5401, 5, 116, 0, 0, 5401, 5402, 5, 114, 0, 0, 5402, 5403, 5, 105, 0, 0, 5403, 5404, 5, 98, 0, 0, 5404, 5405, 5, 117, 0, 0, 5405, 5406, 5, 116, 0, 0, 5406, 5407, 5, 101, 0, 0, 5407, 5408, 1, 0, 0, 0, 5408, 5409, 6, 471, 71, 0, 5409, 949, 1, 0, 0, 0, 5410, 5411, 5, 98, 0, 0, 5411, 5412, 5, 97, 0, 0, 5412, 5413, 5, 115, 0, 0, 5413, 5414, 5, 101, 0, 0, 5414, 5415, 5, 45, 0, 0, 5415, 5416, 5, 117, 0, 0, 5416, 5417, 5, 114, 0, 0, 5417, 5418, 5, 105, 0, 0, 5418, 5419, 1, 0, 0, 0, 5419, 5420, 6, 472, 72, 0, 5420, 951, 1, 0, 0, 0, 5421, 5422, 5, 98, 0, 0, 5422, 5423, 5, 111, 0, 0, 5423, 5424, 5, 117, 0, 0, 5424, 5425, 5, 110, 0, 0, 5425, 5426, 5, 100, 0, 0, 5426, 5427, 5, 97, 0, 0, 5427, 5428, 5, 114, 0, 0, 5428, 5429, 5, 121, 0, 0, 5429, 5430, 5, 45, 0, 0, 5430, 5431, 5, 115, 0, 0, 5431, 5432, 5, 112, 0, 0, 5432, 5433, 5, 97, 0, 0, 5433, 5434, 5, 99, 0, 0, 5434, 5435, 5, 101, 0, 0, 5435, 5436, 1, 0, 0, 0, 5436, 5437, 6, 473, 73, 0, 5437, 953, 1, 0, 0, 0, 5438, 5439, 5, 98, 0, 0, 5439, 5440, 5, 105, 0, 0, 5440, 5441, 5, 110, 0, 0, 5441, 5442, 5, 97, 0, 0, 5442, 5443, 5, 114, 0, 0, 5443, 5444, 5, 121, 0, 0, 5444, 5445, 1, 0, 0, 0, 5445, 5446, 6, 474, 74, 0, 5446, 955, 1, 0, 0, 0, 5447, 5448, 5, 98, 0, 0, 5448, 5449, 5, 121, 0, 0, 5449, 5450, 1, 0, 0, 0, 5450, 5451, 6, 475, 75, 0, 5451, 957, 1, 0, 0, 0, 5452, 5453, 5, 99, 0, 0, 5453, 5454, 5, 97, 0, 0, 5454, 5455, 5, 115, 0, 0, 5455, 5456, 5, 101, 0, 0, 5456, 5457, 1, 0, 0, 0, 5457, 5458, 6, 476, 76, 0, 5458, 959, 1, 0, 0, 0, 5459, 5460, 5, 99, 0, 0, 5460, 5461, 5, 97, 0, 0, 5461, 5462, 5, 115, 0, 0, 5462, 5463, 5, 116, 0, 0, 5463, 5464, 1, 0, 0, 0, 5464, 5465, 6, 477, 77, 0, 5465, 961, 1, 0, 0, 0, 5466, 5467, 5, 99, 0, 0, 5467, 5468, 5, 97, 0, 0, 5468, 5469, 5, 115, 0, 0, 5469, 5470, 5, 116, 0, 0, 5470, 5471, 5, 97, 0, 0, 5471, 5472, 5, 98, 0, 0, 5472, 5473, 5, 108, 0, 0, 5473, 5474, 5, 101, 0, 0, 5474, 5475, 1, 0, 0, 0, 5475, 5476, 6, 478, 78, 0, 5476, 963, 1, 0, 0, 0, 5477, 5478, 5, 99, 0, 0, 5478, 5479, 5, 97, 0, 0, 5479, 5480, 5, 116, 0, 0, 5480, 5481, 5, 99, 0, 0, 5481, 5482, 5, 104, 0, 0, 5482, 5483, 1, 0, 0, 0, 5483, 5484, 6, 479, 79, 0, 5484, 965, 1, 0, 0, 0, 5485, 5486, 5, 99, 0, 0, 5486, 5487, 5, 104, 0, 0, 5487, 5488, 5, 105, 0, 0, 5488, 5489, 5, 108, 0, 0, 5489, 5490, 5, 100, 0, 0, 5490, 5491, 1, 0, 0, 0, 5491, 5492, 6, 480, 80, 0, 5492, 967, 1, 0, 0, 0, 5493, 5494, 5, 99, 0, 0, 5494, 5495, 5, 111, 0, 0, 5495, 5496, 5, 108, 0, 0, 5496, 5497, 5, 108, 0, 0, 5497, 5498, 5, 97, 0, 0, 5498, 5499, 5, 116, 0, 0, 5499, 5500, 5, 105, 0, 0, 5500, 5501, 5, 111, 0, 0, 5501, 5502, 5, 110, 0, 0, 5502, 5503, 1, 0, 0, 0, 5503, 5504, 6, 481, 81, 0, 5504, 969, 1, 0, 0, 0, 5505, 5506, 5, 99, 0, 0, 5506, 5507, 5, 111, 0, 0, 5507, 5508, 5, 109, 0, 0, 5508, 5509, 5, 109, 0, 0, 5509, 5510, 5, 101, 0, 0, 5510, 5511, 5, 110, 0, 0, 5511, 5512, 5, 116, 0, 0, 5512, 5513, 1, 0, 0, 0, 5513, 5514, 6, 482, 82, 0, 5514, 971, 1, 0, 0, 0, 5515, 5516, 5, 99, 0, 0, 5516, 5517, 5, 111, 0, 0, 5517, 5518, 5, 110, 0, 0, 5518, 5519, 5, 115, 0, 0, 5519, 5520, 5, 116, 0, 0, 5520, 5521, 5, 114, 0, 0, 5521, 5522, 5, 117, 0, 0, 5522, 5523, 5, 99, 0, 0, 5523, 5524, 5, 116, 0, 0, 5524, 5525, 5, 105, 0, 0, 5525, 5526, 5, 111, 0, 0, 5526, 5527, 5, 110, 0, 0, 5527, 5528, 1, 0, 0, 0, 5528, 5529, 6, 483, 83, 0, 5529, 973, 1, 0, 0, 0, 5530, 5531, 5, 99, 0, 0, 5531, 5532, 5, 111, 0, 0, 5532, 5533, 5, 110, 0, 0, 5533, 5534, 5, 116, 0, 0, 5534, 5535, 5, 101, 0, 0, 5535, 5536, 5, 120, 0, 0, 5536, 5537, 5, 116, 0, 0, 5537, 5538, 1, 0, 0, 0, 5538, 5539, 6, 484, 84, 0, 5539, 975, 1, 0, 0, 0, 5540, 5541, 5, 99, 0, 0, 5541, 5542, 5, 111, 0, 0, 5542, 5543, 5, 112, 0, 0, 5543, 5544, 5, 121, 0, 0, 5544, 5545, 5, 45, 0, 0, 5545, 5546, 5, 110, 0, 0, 5546, 5547, 5, 97, 0, 0, 5547, 5548, 5, 109, 0, 0, 5548, 5549, 5, 101, 0, 0, 5549, 5550, 5, 115, 0, 0, 5550, 5551, 5, 112, 0, 0, 5551, 5552, 5, 97, 0, 0, 5552, 5553, 5, 99, 0, 0, 5553, 5554, 5, 101, 0, 0, 5554, 5555, 5, 115, 0, 0, 5555, 5556, 1, 0, 0, 0, 5556, 5557, 6, 485, 85, 0, 5557, 977, 1, 0, 0, 0, 5558, 5559, 5, 99, 0, 0, 5559, 5560, 5, 111, 0, 0, 5560, 5561, 5, 117, 0, 0, 5561, 5562, 5, 110, 0, 0, 5562, 5563, 5, 116, 0, 0, 5563, 5564, 1, 0, 0, 0, 5564, 5565, 6, 486, 86, 0, 5565, 979, 1, 0, 0, 0, 5566, 5567, 5, 100, 0, 0, 5567, 5568, 5, 101, 0, 0, 5568, 5569, 5, 99, 0, 0, 5569, 5570, 5, 108, 0, 0, 5570, 5571, 5, 97, 0, 0, 5571, 5572, 5, 114, 0, 0, 5572, 5573, 5, 101, 0, 0, 5573, 5574, 1, 0, 0, 0, 5574, 5575, 6, 487, 87, 0, 5575, 981, 1, 0, 0, 0, 5576, 5577, 5, 100, 0, 0, 5577, 5578, 5, 101, 0, 0, 5578, 5579, 5, 102, 0, 0, 5579, 5580, 5, 97, 0, 0, 5580, 5581, 5, 117, 0, 0, 5581, 5582, 5, 108, 0, 0, 5582, 5583, 5, 116, 0, 0, 5583, 5584, 1, 0, 0, 0, 5584, 5585, 6, 488, 88, 0, 5585, 983, 1, 0, 0, 0, 5586, 5587, 5, 100, 0, 0, 5587, 5588, 5, 101, 0, 0, 5588, 5589, 5, 115, 0, 0, 5589, 5590, 5, 99, 0, 0, 5590, 5591, 5, 101, 0, 0, 5591, 5592, 5, 110, 0, 0, 5592, 5593, 5, 100, 0, 0, 5593, 5594, 5, 97, 0, 0, 5594, 5595, 5, 110, 0, 0, 5595, 5596, 5, 116, 0, 0, 5596, 5597, 1, 0, 0, 0, 5597, 5598, 6, 489, 89, 0, 5598, 985, 1, 0, 0, 0, 5599, 5600, 5, 100, 0, 0, 5600, 5601, 5, 101, 0, 0, 5601, 5602, 5, 115, 0, 0, 5602, 5603, 5, 99, 0, 0, 5603, 5604, 5, 101, 0, 0, 5604, 5605, 5, 110, 0, 0, 5605, 5606, 5, 100, 0, 0, 5606, 5607, 5, 97, 0, 0, 5607, 5608, 5, 110, 0, 0, 5608, 5609, 5, 116, 0, 0, 5609, 5610, 5, 45, 0, 0, 5610, 5611, 5, 111, 0, 0, 5611, 5612, 5, 114, 0, 0, 5612, 5613, 5, 45, 0, 0, 5613, 5614, 5, 115, 0, 0, 5614, 5615, 5, 101, 0, 0, 5615, 5616, 5, 108, 0, 0, 5616, 5617, 5, 102, 0, 0, 5617, 5618, 1, 0, 0, 0, 5618, 5619, 6, 490, 90, 0, 5619, 987, 1, 0, 0, 0, 5620, 5621, 5, 100, 0, 0, 5621, 5622, 5, 101, 0, 0, 5622, 5623, 5, 115, 0, 0, 5623, 5624, 5, 99, 0, 0, 5624, 5625, 5, 101, 0, 0, 5625, 5626, 5, 110, 0, 0, 5626, 5627, 5, 100, 0, 0, 5627, 5628, 5, 105, 0, 0, 5628, 5629, 5, 110, 0, 0, 5629, 5630, 5, 103, 0, 0, 5630, 5631, 1, 0, 0, 0, 5631, 5632, 6, 491, 91, 0, 5632, 989, 1, 0, 0, 0, 5633, 5634, 5, 100, 0, 0, 5634, 5635, 5, 101, 0, 0, 5635, 5636, 5, 99, 0, 0, 5636, 5637, 5, 105, 0, 0, 5637, 5638, 5, 109, 0, 0, 5638, 5639, 5, 97, 0, 0, 5639, 5640, 5, 108, 0, 0, 5640, 5641, 5, 45, 0, 0, 5641, 5642, 5, 102, 0, 0, 5642, 5643, 5, 111, 0, 0, 5643, 5644, 5, 114, 0, 0, 5644, 5645, 5, 109, 0, 0, 5645, 5646, 5, 97, 0, 0, 5646, 5647, 5, 116, 0, 0, 5647, 5648, 1, 0, 0, 0, 5648, 5649, 6, 492, 92, 0, 5649, 991, 1, 0, 0, 0, 5650, 5651, 5, 100, 0, 0, 5651, 5652, 5, 105, 0, 0, 5652, 5653, 5, 118, 0, 0, 5653, 5654, 1, 0, 0, 0, 5654, 5655, 6, 493, 93, 0, 5655, 993, 1, 0, 0, 0, 5656, 5657, 5, 100, 0, 0, 5657, 5658, 5, 111, 0, 0, 5658, 5659, 5, 99, 0, 0, 5659, 5660, 5, 117, 0, 0, 5660, 5661, 5, 109, 0, 0, 5661, 5662, 5, 101, 0, 0, 5662, 5663, 5, 110, 0, 0, 5663, 5664, 5, 116, 0, 0, 5664, 5665, 1, 0, 0, 0, 5665, 5666, 6, 494, 94, 0, 5666, 995, 1, 0, 0, 0, 5667, 5668, 5, 100, 0, 0, 5668, 5669, 5, 111, 0, 0, 5669, 5670, 5, 99, 0, 0, 5670, 5671, 5, 117, 0, 0, 5671, 5672, 5, 109, 0, 0, 5672, 5673, 5, 101, 0, 0, 5673, 5674, 5, 110, 0, 0, 5674, 5675, 5, 116, 0, 0, 5675, 5676, 5, 45, 0, 0, 5676, 5677, 5, 110, 0, 0, 5677, 5678, 5, 111, 0, 0, 5678, 5679, 5, 100, 0, 0, 5679, 5680, 5, 101, 0, 0, 5680, 5681, 1, 0, 0, 0, 5681, 5682, 6, 495, 95, 0, 5682, 997, 1, 0, 0, 0, 5683, 5684, 5, 101, 0, 0, 5684, 5685, 5, 108, 0, 0, 5685, 5686, 5, 101, 0, 0, 5686, 5687, 5, 109, 0, 0, 5687, 5688, 5, 101, 0, 0, 5688, 5689, 5, 110, 0, 0, 5689, 5690, 5, 116, 0, 0, 5690, 5691, 1, 0, 0, 0, 5691, 5692, 6, 496, 96, 0, 5692, 999, 1, 0, 0, 0, 5693, 5694, 5, 101, 0, 0, 5694, 5695, 5, 108, 0, 0, 5695, 5696, 5, 115, 0, 0, 5696, 5697, 5, 101, 0, 0, 5697, 5698, 1, 0, 0, 0, 5698, 5699, 6, 497, 97, 0, 5699, 1001, 1, 0, 0, 0, 5700, 5701, 5, 101, 0, 0, 5701, 5702, 5, 109, 0, 0, 5702, 5703, 5, 112, 0, 0, 5703, 5704, 5, 116, 0, 0, 5704, 5705, 5, 121, 0, 0, 5705, 5706, 1, 0, 0, 0, 5706, 5707, 6, 498, 98, 0, 5707, 1003, 1, 0, 0, 0, 5708, 5709, 5, 101, 0, 0, 5709, 5710, 5, 109, 0, 0, 5710, 5711, 5, 112, 0, 0, 5711, 5712, 5, 116, 0, 0, 5712, 5713, 5, 121, 0, 0, 5713, 5714, 5, 45, 0, 0, 5714, 5715, 5, 115, 0, 0, 5715, 5716, 5, 101, 0, 0, 5716, 5717, 5, 113, 0, 0, 5717, 5718, 5, 117, 0, 0, 5718, 5719, 5, 101, 0, 0, 5719, 5720, 5, 110, 0, 0, 5720, 5721, 5, 99, 0, 0, 5721, 5722, 5, 101, 0, 0, 5722, 5723, 1, 0, 0, 0, 5723, 5724, 6, 499, 99, 0, 5724, 1005, 1, 0, 0, 0, 5725, 5726, 5, 101, 0, 0, 5726, 5727, 5, 110, 0, 0, 5727, 5728, 5, 99, 0, 0, 5728, 5729, 5, 111, 0, 0, 5729, 5730, 5, 100, 0, 0, 5730, 5731, 5, 105, 0, 0, 5731, 5732, 5, 110, 0, 0, 5732, 5733, 5, 103, 0, 0, 5733, 5734, 1, 0, 0, 0, 5734, 5735, 6, 500, 100, 0, 5735, 1007, 1, 0, 0, 0, 5736, 5737, 5, 101, 0, 0, 5737, 5738, 5, 110, 0, 0, 5738, 5739, 5, 100, 0, 0, 5739, 5740, 1, 0, 0, 0, 5740, 5741, 6, 501, 101, 0, 5741, 1009, 1, 0, 0, 0, 5742, 5743, 5, 101, 0, 0, 5743, 5744, 5, 113, 0, 0, 5744, 5745, 1, 0, 0, 0, 5745, 5746, 6, 502, 102, 0, 5746, 1011, 1, 0, 0, 0, 5747, 5748, 5, 101, 0, 0, 5748, 5749, 5, 118, 0, 0, 5749, 5750, 5, 101, 0, 0, 5750, 5751, 5, 114, 0, 0, 5751, 5752, 5, 121, 0, 0, 5752, 5753, 1, 0, 0, 0, 5753, 5754, 6, 503, 103, 0, 5754, 1013, 1, 0, 0, 0, 5755, 5756, 5, 101, 0, 0, 5756, 5757, 5, 120, 0, 0, 5757, 5758, 5, 99, 0, 0, 5758, 5759, 5, 101, 0, 0, 5759, 5760, 5, 112, 0, 0, 5760, 5761, 5, 116, 0, 0, 5761, 5762, 1, 0, 0, 0, 5762, 5763, 6, 504, 104, 0, 5763, 1015, 1, 0, 0, 0, 5764, 5765, 5, 101, 0, 0, 5765, 5766, 5, 120, 0, 0, 5766, 5767, 5, 116, 0, 0, 5767, 5768, 5, 101, 0, 0, 5768, 5769, 5, 114, 0, 0, 5769, 5770, 5, 110, 0, 0, 5770, 5771, 5, 97, 0, 0, 5771, 5772, 5, 108, 0, 0, 5772, 5773, 1, 0, 0, 0, 5773, 5774, 6, 505, 105, 0, 5774, 1017, 1, 0, 0, 0, 5775, 5776, 5, 102, 0, 0, 5776, 5777, 5, 111, 0, 0, 5777, 5778, 5, 108, 0, 0, 5778, 5779, 5, 108, 0, 0, 5779, 5780, 5, 111, 0, 0, 5780, 5781, 5, 119, 0, 0, 5781, 5782, 5, 105, 0, 0, 5782, 5783, 5, 110, 0, 0, 5783, 5784, 5, 103, 0, 0, 5784, 5785, 1, 0, 0, 0, 5785, 5786, 6, 506, 106, 0, 5786, 1019, 1, 0, 0, 0, 5787, 5788, 5, 102, 0, 0, 5788, 5789, 5, 111, 0, 0, 5789, 5790, 5, 108, 0, 0, 5790, 5791, 5, 108, 0, 0, 5791, 5792, 5, 111, 0, 0, 5792, 5793, 5, 119, 0, 0, 5793, 5794, 5, 105, 0, 0, 5794, 5795, 5, 110, 0, 0, 5795, 5796, 5, 103, 0, 0, 5796, 5797, 5, 45, 0, 0, 5797, 5798, 5, 115, 0, 0, 5798, 5799, 5, 105, 0, 0, 5799, 5800, 5, 98, 0, 0, 5800, 5801, 5, 108, 0, 0, 5801, 5802, 5, 105, 0, 0, 5802, 5803, 5, 110, 0, 0, 5803, 5804, 5, 103, 0, 0, 5804, 5805, 1, 0, 0, 0, 5805, 5806, 6, 507, 107, 0, 5806, 1021, 1, 0, 0, 0, 5807, 5808, 5, 102, 0, 0, 5808, 5809, 5, 111, 0, 0, 5809, 5810, 5, 114, 0, 0, 5810, 5811, 1, 0, 0, 0, 5811, 5812, 6, 508, 108, 0, 5812, 1023, 1, 0, 0, 0, 5813, 5814, 5, 102, 0, 0, 5814, 5815, 5, 117, 0, 0, 5815, 5816, 5, 110, 0, 0, 5816, 5817, 5, 99, 0, 0, 5817, 5818, 5, 116, 0, 0, 5818, 5819, 5, 105, 0, 0, 5819, 5820, 5, 111, 0, 0, 5820, 5821, 5, 110, 0, 0, 5821, 5822, 1, 0, 0, 0, 5822, 5823, 6, 509, 109, 0, 5823, 1025, 1, 0, 0, 0, 5824, 5825, 5, 103, 0, 0, 5825, 5826, 5, 101, 0, 0, 5826, 5827, 1, 0, 0, 0, 5827, 5828, 6, 510, 110, 0, 5828, 1027, 1, 0, 0, 0, 5829, 5830, 5, 103, 0, 0, 5830, 5831, 5, 114, 0, 0, 5831, 5832, 5, 101, 0, 0, 5832, 5833, 5, 97, 0, 0, 5833, 5834, 5, 116, 0, 0, 5834, 5835, 5, 101, 0, 0, 5835, 5836, 5, 115, 0, 0, 5836, 5837, 5, 116, 0, 0, 5837, 5838, 1, 0, 0, 0, 5838, 5839, 6, 511, 111, 0, 5839, 1029, 1, 0, 0, 0, 5840, 5841, 5, 103, 0, 0, 5841, 5842, 5, 114, 0, 0, 5842, 5843, 5, 111, 0, 0, 5843, 5844, 5, 117, 0, 0, 5844, 5845, 5, 112, 0, 0, 5845, 5846, 1, 0, 0, 0, 5846, 5847, 6, 512, 112, 0, 5847, 1031, 1, 0, 0, 0, 5848, 5849, 5, 103, 0, 0, 5849, 5850, 5, 116, 0, 0, 5850, 5851, 1, 0, 0, 0, 5851, 5852, 6, 513, 113, 0, 5852, 1033, 1, 0, 0, 0, 5853, 5854, 5, 105, 0, 0, 5854, 5855, 5, 100, 0, 0, 5855, 5856, 5, 105, 0, 0, 5856, 5857, 5, 118, 0, 0, 5857, 5858, 1, 0, 0, 0, 5858, 5859, 6, 514, 114, 0, 5859, 1035, 1, 0, 0, 0, 5860, 5861, 5, 105, 0, 0, 5861, 5862, 5, 102, 0, 0, 5862, 5863, 1, 0, 0, 0, 5863, 5864, 6, 515, 115, 0, 5864, 1037, 1, 0, 0, 0, 5865, 5866, 5, 105, 0, 0, 5866, 5867, 5, 109, 0, 0, 5867, 5868, 5, 112, 0, 0, 5868, 5869, 5, 111, 0, 0, 5869, 5870, 5, 114, 0, 0, 5870, 5871, 5, 116, 0, 0, 5871, 5872, 1, 0, 0, 0, 5872, 5873, 6, 516, 116, 0, 5873, 1039, 1, 0, 0, 0, 5874, 5875, 5, 105, 0, 0, 5875, 5876, 5, 110, 0, 0, 5876, 5877, 1, 0, 0, 0, 5877, 5878, 6, 517, 117, 0, 5878, 1041, 1, 0, 0, 0, 5879, 5880, 5, 105, 0, 0, 5880, 5881, 5, 110, 0, 0, 5881, 5882, 5, 104, 0, 0, 5882, 5883, 5, 101, 0, 0, 5883, 5884, 5, 114, 0, 0, 5884, 5885, 5, 105, 0, 0, 5885, 5886, 5, 116, 0, 0, 5886, 5887, 1, 0, 0, 0, 5887, 5888, 6, 518, 118, 0, 5888, 1043, 1, 0, 0, 0, 5889, 5890, 5, 105, 0, 0, 5890, 5891, 5, 110, 0, 0, 5891, 5892, 5, 115, 0, 0, 5892, 5893, 5, 116, 0, 0, 5893, 5894, 5, 97, 0, 0, 5894, 5895, 5, 110, 0, 0, 5895, 5896, 5, 99, 0, 0, 5896, 5897, 5, 101, 0, 0, 5897, 5898, 1, 0, 0, 0, 5898, 5899, 6, 519, 119, 0, 5899, 1045, 1, 0, 0, 0, 5900, 5901, 5, 105, 0, 0, 5901, 5902, 5, 110, 0, 0, 5902, 5903, 5, 116, 0, 0, 5903, 5904, 5, 101, 0, 0, 5904, 5905, 5, 114, 0, 0, 5905, 5906, 5, 115, 0, 0, 5906, 5907, 5, 101, 0, 0, 5907, 5908, 5, 99, 0, 0, 5908, 5909, 5, 116, 0, 0, 5909, 5910, 1, 0, 0, 0, 5910, 5911, 6, 520, 120, 0, 5911, 1047, 1, 0, 0, 0, 5912, 5913, 5, 105, 0, 0, 5913, 5914, 5, 115, 0, 0, 5914, 5915, 1, 0, 0, 0, 5915, 5916, 6, 521, 121, 0, 5916, 1049, 1, 0, 0, 0, 5917, 5918, 5, 105, 0, 0, 5918, 5919, 5, 116, 0, 0, 5919, 5920, 5, 101, 0, 0, 5920, 5921, 5, 109, 0, 0, 5921, 5922, 1, 0, 0, 0, 5922, 5923, 6, 522, 122, 0, 5923, 1051, 1, 0, 0, 0, 5924, 5925, 5, 108, 0, 0, 5925, 5926, 5, 97, 0, 0, 5926, 5927, 5, 120, 0, 0, 5927, 5928, 1, 0, 0, 0, 5928, 5929, 6, 523, 123, 0, 5929, 1053, 1, 0, 0, 0, 5930, 5931, 5, 108, 0, 0, 5931, 5932, 5, 101, 0, 0, 5932, 5933, 1, 0, 0, 0, 5933, 5934, 6, 524, 124, 0, 5934, 1055, 1, 0, 0, 0, 5935, 5936, 5, 108, 0, 0, 5936, 5937, 5, 101, 0, 0, 5937, 5938, 5, 97, 0, 0, 5938, 5939, 5, 115, 0, 0, 5939, 5940, 5, 116, 0, 0, 5940, 5941, 1, 0, 0, 0, 5941, 5942, 6, 525, 125, 0, 5942, 1057, 1, 0, 0, 0, 5943, 5944, 5, 108, 0, 0, 5944, 5945, 5, 101, 0, 0, 5945, 5946, 5, 116, 0, 0, 5946, 5947, 1, 0, 0, 0, 5947, 5948, 6, 526, 126, 0, 5948, 1059, 1, 0, 0, 0, 5949, 5950, 5, 108, 0, 0, 5950, 5951, 5, 116, 0, 0, 5951, 5952, 1, 0, 0, 0, 5952, 5953, 6, 527, 127, 0, 5953, 1061, 1, 0, 0, 0, 5954, 5955, 5, 109, 0, 0, 5955, 5956, 5, 97, 0, 0, 5956, 5957, 5, 112, 0, 0, 5957, 5958, 1, 0, 0, 0, 5958, 5959, 6, 528, 128, 0, 5959, 1063, 1, 0, 0, 0, 5960, 5961, 5, 109, 0, 0, 5961, 5962, 5, 111, 0, 0, 5962, 5963, 5, 100, 0, 0, 5963, 5964, 1, 0, 0, 0, 5964, 5965, 6, 529, 129, 0, 5965, 1065, 1, 0, 0, 0, 5966, 5967, 5, 109, 0, 0, 5967, 5968, 5, 111, 0, 0, 5968, 5969, 5, 100, 0, 0, 5969, 5970, 5, 117, 0, 0, 5970, 5971, 5, 108, 0, 0, 5971, 5972, 5, 101, 0, 0, 5972, 5973, 1, 0, 0, 0, 5973, 5974, 6, 530, 130, 0, 5974, 1067, 1, 0, 0, 0, 5975, 5976, 5, 110, 0, 0, 5976, 5977, 5, 97, 0, 0, 5977, 5978, 5, 109, 0, 0, 5978, 5979, 5, 101, 0, 0, 5979, 5980, 5, 115, 0, 0, 5980, 5981, 5, 112, 0, 0, 5981, 5982, 5, 97, 0, 0, 5982, 5983, 5, 99, 0, 0, 5983, 5984, 5, 101, 0, 0, 5984, 5985, 1, 0, 0, 0, 5985, 5986, 6, 531, 131, 0, 5986, 1069, 1, 0, 0, 0, 5987, 5988, 5, 110, 0, 0, 5988, 5989, 5, 101, 0, 0, 5989, 5990, 1, 0, 0, 0, 5990, 5991, 6, 532, 132, 0, 5991, 1071, 1, 0, 0, 0, 5992, 5993, 5, 110, 0, 0, 5993, 5994, 5, 101, 0, 0, 5994, 5995, 5, 120, 0, 0, 5995, 5996, 5, 116, 0, 0, 5996, 5997, 1, 0, 0, 0, 5997, 5998, 6, 533, 133, 0, 5998, 1073, 1, 0, 0, 0, 5999, 6000, 5, 110, 0, 0, 6000, 6001, 5, 97, 0, 0, 6001, 6002, 5, 109, 0, 0, 6002, 6003, 5, 101, 0, 0, 6003, 6004, 5, 115, 0, 0, 6004, 6005, 5, 112, 0, 0, 6005, 6006, 5, 97, 0, 0, 6006, 6007, 5, 99, 0, 0, 6007, 6008, 5, 101, 0, 0, 6008, 6009, 5, 45, 0, 0, 6009, 6010, 5, 110, 0, 0, 6010, 6011, 5, 111, 0, 0, 6011, 6012, 5, 100, 0, 0, 6012, 6013, 5, 101, 0, 0, 6013, 6014, 1, 0, 0, 0, 6014, 6015, 6, 534, 134, 0, 6015, 1075, 1, 0, 0, 0, 6016, 6017, 5, 110, 0, 0, 6017, 6018, 5, 111, 0, 0, 6018, 6019, 5, 45, 0, 0, 6019, 6020, 5, 105, 0, 0, 6020, 6021, 5, 110, 0, 0, 6021, 6022, 5, 104, 0, 0, 6022, 6023, 5, 101, 0, 0, 6023, 6024, 5, 114, 0, 0, 6024, 6025, 5, 105, 0, 0, 6025, 6026, 5, 116, 0, 0, 6026, 6027, 1, 0, 0, 0, 6027, 6028, 6, 535, 135, 0, 6028, 1077, 1, 0, 0, 0, 6029, 6030, 5, 110, 0, 0, 6030, 6031, 5, 111, 0, 0, 6031, 6032, 5, 45, 0, 0, 6032, 6033, 5, 112, 0, 0, 6033, 6034, 5, 114, 0, 0, 6034, 6035, 5, 101, 0, 0, 6035, 6036, 5, 115, 0, 0, 6036, 6037, 5, 101, 0, 0, 6037, 6038, 5, 114, 0, 0, 6038, 6039, 5, 118, 0, 0, 6039, 6040, 5, 101, 0, 0, 6040, 6041, 1, 0, 0, 0, 6041, 6042, 6, 536, 136, 0, 6042, 1079, 1, 0, 0, 0, 6043, 6044, 5, 110, 0, 0, 6044, 6045, 5, 111, 0, 0, 6045, 6046, 5, 100, 0, 0, 6046, 6047, 5, 101, 0, 0, 6047, 6048, 1, 0, 0, 0, 6048, 6049, 6, 537, 137, 0, 6049, 1081, 1, 0, 0, 0, 6050, 6051, 5, 111, 0, 0, 6051, 6052, 5, 102, 0, 0, 6052, 6053, 1, 0, 0, 0, 6053, 6054, 6, 538, 138, 0, 6054, 1083, 1, 0, 0, 0, 6055, 6056, 5, 111, 0, 0, 6056, 6057, 5, 110, 0, 0, 6057, 6058, 5, 108, 0, 0, 6058, 6059, 5, 121, 0, 0, 6059, 6060, 1, 0, 0, 0, 6060, 6061, 6, 539, 139, 0, 6061, 1085, 1, 0, 0, 0, 6062, 6063, 5, 111, 0, 0, 6063, 6064, 5, 112, 0, 0, 6064, 6065, 5, 116, 0, 0, 6065, 6066, 5, 105, 0, 0, 6066, 6067, 5, 111, 0, 0, 6067, 6068, 5, 110, 0, 0, 6068, 6069, 1, 0, 0, 0, 6069, 6070, 6, 540, 140, 0, 6070, 1087, 1, 0, 0, 0, 6071, 6072, 5, 111, 0, 0, 6072, 6073, 5, 114, 0, 0, 6073, 6074, 1, 0, 0, 0, 6074, 6075, 6, 541, 141, 0, 6075, 1089, 1, 0, 0, 0, 6076, 6077, 5, 111, 0, 0, 6077, 6078, 5, 114, 0, 0, 6078, 6079, 5, 100, 0, 0, 6079, 6080, 5, 101, 0, 0, 6080, 6081, 5, 114, 0, 0, 6081, 6082, 1, 0, 0, 0, 6082, 6083, 6, 542, 142, 0, 6083, 1091, 1, 0, 0, 0, 6084, 6085, 5, 111, 0, 0, 6085, 6086, 5, 114, 0, 0, 6086, 6087, 5, 100, 0, 0, 6087, 6088, 5, 101, 0, 0, 6088, 6089, 5, 114, 0, 0, 6089, 6090, 5, 101, 0, 0, 6090, 6091, 5, 100, 0, 0, 6091, 6092, 1, 0, 0, 0, 6092, 6093, 6, 543, 143, 0, 6093, 1093, 1, 0, 0, 0, 6094, 6095, 5, 111, 0, 0, 6095, 6096, 5, 114, 0, 0, 6096, 6097, 5, 100, 0, 0, 6097, 6098, 5, 101, 0, 0, 6098, 6099, 5, 114, 0, 0, 6099, 6100, 5, 105, 0, 0, 6100, 6101, 5, 110, 0, 0, 6101, 6102, 5, 103, 0, 0, 6102, 6103, 1, 0, 0, 0, 6103, 6104, 6, 544, 144, 0, 6104, 1095, 1, 0, 0, 0, 6105, 6106, 5, 112, 0, 0, 6106, 6107, 5, 97, 0, 0, 6107, 6108, 5, 114, 0, 0, 6108, 6109, 5, 101, 0, 0, 6109, 6110, 5, 110, 0, 0, 6110, 6111, 5, 116, 0, 0, 6111, 6112, 1, 0, 0, 0, 6112, 6113, 6, 545, 145, 0, 6113, 1097, 1, 0, 0, 0, 6114, 6115, 5, 112, 0, 0, 6115, 6116, 5, 114, 0, 0, 6116, 6117, 5, 101, 0, 0, 6117, 6118, 5, 99, 0, 0, 6118, 6119, 5, 101, 0, 0, 6119, 6120, 5, 100, 0, 0, 6120, 6121, 5, 105, 0, 0, 6121, 6122, 5, 110, 0, 0, 6122, 6123, 5, 103, 0, 0, 6123, 6124, 1, 0, 0, 0, 6124, 6125, 6, 546, 146, 0, 6125, 1099, 1, 0, 0, 0, 6126, 6127, 5, 112, 0, 0, 6127, 6128, 5, 114, 0, 0, 6128, 6129, 5, 101, 0, 0, 6129, 6130, 5, 99, 0, 0, 6130, 6131, 5, 101, 0, 0, 6131, 6132, 5, 100, 0, 0, 6132, 6133, 5, 105, 0, 0, 6133, 6134, 5, 110, 0, 0, 6134, 6135, 5, 103, 0, 0, 6135, 6136, 5, 45, 0, 0, 6136, 6137, 5, 115, 0, 0, 6137, 6138, 5, 105, 0, 0, 6138, 6139, 5, 98, 0, 0, 6139, 6140, 5, 108, 0, 0, 6140, 6141, 5, 105, 0, 0, 6141, 6142, 5, 110, 0, 0, 6142, 6143, 5, 103, 0, 0, 6143, 6144, 1, 0, 0, 0, 6144, 6145, 6, 547, 147, 0, 6145, 1101, 1, 0, 0, 0, 6146, 6147, 5, 112, 0, 0, 6147, 6148, 5, 114, 0, 0, 6148, 6149, 5, 101, 0, 0, 6149, 6150, 5, 115, 0, 0, 6150, 6151, 5, 101, 0, 0, 6151, 6152, 5, 114, 0, 0, 6152, 6153, 5, 118, 0, 0, 6153, 6154, 5, 101, 0, 0, 6154, 6155, 1, 0, 0, 0, 6155, 6156, 6, 548, 148, 0, 6156, 1103, 1, 0, 0, 0, 6157, 6158, 5, 112, 0, 0, 6158, 6159, 5, 114, 0, 0, 6159, 6160, 5, 101, 0, 0, 6160, 6161, 5, 118, 0, 0, 6161, 6162, 5, 105, 0, 0, 6162, 6163, 5, 111, 0, 0, 6163, 6164, 5, 117, 0, 0, 6164, 6165, 5, 115, 0, 0, 6165, 6166, 1, 0, 0, 0, 6166, 6167, 6, 549, 149, 0, 6167, 1105, 1, 0, 0, 0, 6168, 6169, 5, 112, 0, 0, 6169, 6170, 5, 114, 0, 0, 6170, 6171, 5, 111, 0, 0, 6171, 6172, 5, 99, 0, 0, 6172, 6173, 5, 101, 0, 0, 6173, 6174, 5, 115, 0, 0, 6174, 6175, 5, 115, 0, 0, 6175, 6176, 5, 105, 0, 0, 6176, 6177, 5, 110, 0, 0, 6177, 6178, 5, 103, 0, 0, 6178, 6179, 5, 45, 0, 0, 6179, 6180, 5, 105, 0, 0, 6180, 6181, 5, 110, 0, 0, 6181, 6182, 5, 115, 0, 0, 6182, 6183, 5, 116, 0, 0, 6183, 6184, 5, 114, 0, 0, 6184, 6185, 5, 117, 0, 0, 6185, 6186, 5, 99, 0, 0, 6186, 6187, 5, 116, 0, 0, 6187, 6188, 5, 105, 0, 0, 6188, 6189, 5, 111, 0, 0, 6189, 6190, 5, 110, 0, 0, 6190, 6191, 1, 0, 0, 0, 6191, 6192, 6, 550, 150, 0, 6192, 1107, 1, 0, 0, 0, 6193, 6194, 5, 114, 0, 0, 6194, 6195, 5, 101, 0, 0, 6195, 6196, 5, 116, 0, 0, 6196, 6197, 5, 117, 0, 0, 6197, 6198, 5, 114, 0, 0, 6198, 6199, 5, 110, 0, 0, 6199, 6200, 1, 0, 0, 0, 6200, 6201, 6, 551, 151, 0, 6201, 1109, 1, 0, 0, 0, 6202, 6203, 5, 115, 0, 0, 6203, 6204, 5, 97, 0, 0, 6204, 6205, 5, 116, 0, 0, 6205, 6206, 5, 105, 0, 0, 6206, 6207, 5, 115, 0, 0, 6207, 6208, 5, 102, 0, 0, 6208, 6209, 5, 105, 0, 0, 6209, 6210, 5, 101, 0, 0, 6210, 6211, 5, 115, 0, 0, 6211, 6212, 1, 0, 0, 0, 6212, 6213, 6, 552, 152, 0, 6213, 1111, 1, 0, 0, 0, 6214, 6215, 5, 115, 0, 0, 6215, 6216, 5, 99, 0, 0, 6216, 6217, 5, 104, 0, 0, 6217, 6218, 5, 101, 0, 0, 6218, 6219, 5, 109, 0, 0, 6219, 6220, 5, 97, 0, 0, 6220, 6221, 1, 0, 0, 0, 6221, 6222, 6, 553, 153, 0, 6222, 1113, 1, 0, 0, 0, 6223, 6224, 5, 115, 0, 0, 6224, 6225, 5, 99, 0, 0, 6225, 6226, 5, 104, 0, 0, 6226, 6227, 5, 101, 0, 0, 6227, 6228, 5, 109, 0, 0, 6228, 6229, 5, 97, 0, 0, 6229, 6230, 5, 45, 0, 0, 6230, 6231, 5, 97, 0, 0, 6231, 6232, 5, 116, 0, 0, 6232, 6233, 5, 116, 0, 0, 6233, 6234, 5, 114, 0, 0, 6234, 6235, 5, 105, 0, 0, 6235, 6236, 5, 98, 0, 0, 6236, 6237, 5, 117, 0, 0, 6237, 6238, 5, 116, 0, 0, 6238, 6239, 5, 101, 0, 0, 6239, 6240, 1, 0, 0, 0, 6240, 6241, 6, 554, 154, 0, 6241, 1115, 1, 0, 0, 0, 6242, 6243, 5, 115, 0, 0, 6243, 6244, 5, 99, 0, 0, 6244, 6245, 5, 104, 0, 0, 6245, 6246, 5, 101, 0, 0, 6246, 6247, 5, 109, 0, 0, 6247, 6248, 5, 97, 0, 0, 6248, 6249, 5, 45, 0, 0, 6249, 6250, 5, 101, 0, 0, 6250, 6251, 5, 108, 0, 0, 6251, 6252, 5, 101, 0, 0, 6252, 6253, 5, 109, 0, 0, 6253, 6254, 5, 101, 0, 0, 6254, 6255, 5, 110, 0, 0, 6255, 6256, 5, 116, 0, 0, 6256, 6257, 1, 0, 0, 0, 6257, 6258, 6, 555, 155, 0, 6258, 1117, 1, 0, 0, 0, 6259, 6260, 5, 115, 0, 0, 6260, 6261, 5, 101, 0, 0, 6261, 6262, 5, 108, 0, 0, 6262, 6263, 5, 102, 0, 0, 6263, 6264, 1, 0, 0, 0, 6264, 6265, 6, 556, 156, 0, 6265, 1119, 1, 0, 0, 0, 6266, 6267, 5, 115, 0, 0, 6267, 6268, 5, 108, 0, 0, 6268, 6269, 5, 105, 0, 0, 6269, 6270, 5, 100, 0, 0, 6270, 6271, 5, 105, 0, 0, 6271, 6272, 5, 110, 0, 0, 6272, 6273, 5, 103, 0, 0, 6273, 6274, 1, 0, 0, 0, 6274, 6275, 6, 557, 157, 0, 6275, 1121, 1, 0, 0, 0, 6276, 6277, 5, 115, 0, 0, 6277, 6278, 5, 111, 0, 0, 6278, 6279, 5, 109, 0, 0, 6279, 6280, 5, 101, 0, 0, 6280, 6281, 1, 0, 0, 0, 6281, 6282, 6, 558, 158, 0, 6282, 1123, 1, 0, 0, 0, 6283, 6284, 5, 115, 0, 0, 6284, 6285, 5, 116, 0, 0, 6285, 6286, 5, 97, 0, 0, 6286, 6287, 5, 98, 0, 0, 6287, 6288, 5, 108, 0, 0, 6288, 6289, 5, 101, 0, 0, 6289, 6290, 1, 0, 0, 0, 6290, 6291, 6, 559, 159, 0, 6291, 1125, 1, 0, 0, 0, 6292, 6293, 5, 115, 0, 0, 6293, 6294, 5, 116, 0, 0, 6294, 6295, 5, 97, 0, 0, 6295, 6296, 5, 114, 0, 0, 6296, 6297, 5, 116, 0, 0, 6297, 6298, 1, 0, 0, 0, 6298, 6299, 6, 560, 160, 0, 6299, 1127, 1, 0, 0, 0, 6300, 6301, 5, 115, 0, 0, 6301, 6302, 5, 116, 0, 0, 6302, 6303, 5, 114, 0, 0, 6303, 6304, 5, 105, 0, 0, 6304, 6305, 5, 99, 0, 0, 6305, 6306, 5, 116, 0, 0, 6306, 6307, 1, 0, 0, 0, 6307, 6308, 6, 561, 161, 0, 6308, 1129, 1, 0, 0, 0, 6309, 6310, 5, 115, 0, 0, 6310, 6311, 5, 116, 0, 0, 6311, 6312, 5, 114, 0, 0, 6312, 6313, 5, 105, 0, 0, 6313, 6314, 5, 112, 0, 0, 6314, 6315, 1, 0, 0, 0, 6315, 6316, 6, 562, 162, 0, 6316, 1131, 1, 0, 0, 0, 6317, 6318, 5, 115, 0, 0, 6318, 6319, 5, 119, 0, 0, 6319, 6320, 5, 105, 0, 0, 6320, 6321, 5, 116, 0, 0, 6321, 6322, 5, 99, 0, 0, 6322, 6323, 5, 104, 0, 0, 6323, 6324, 1, 0, 0, 0, 6324, 6325, 6, 563, 163, 0, 6325, 1133, 1, 0, 0, 0, 6326, 6327, 5, 116, 0, 0, 6327, 6328, 5, 101, 0, 0, 6328, 6329, 5, 120, 0, 0, 6329, 6330, 5, 116, 0, 0, 6330, 6331, 1, 0, 0, 0, 6331, 6332, 6, 564, 164, 0, 6332, 1135, 1, 0, 0, 0, 6333, 6334, 5, 116, 0, 0, 6334, 6335, 5, 104, 0, 0, 6335, 6336, 5, 101, 0, 0, 6336, 6337, 5, 110, 0, 0, 6337, 6338, 1, 0, 0, 0, 6338, 6339, 6, 565, 165, 0, 6339, 1137, 1, 0, 0, 0, 6340, 6341, 5, 116, 0, 0, 6341, 6342, 5, 111, 0, 0, 6342, 6343, 1, 0, 0, 0, 6343, 6344, 6, 566, 166, 0, 6344, 1139, 1, 0, 0, 0, 6345, 6346, 5, 116, 0, 0, 6346, 6347, 5, 114, 0, 0, 6347, 6348, 5, 101, 0, 0, 6348, 6349, 5, 97, 0, 0, 6349, 6350, 5, 116, 0, 0, 6350, 6351, 1, 0, 0, 0, 6351, 6352, 6, 567, 167, 0, 6352, 1141, 1, 0, 0, 0, 6353, 6354, 5, 116, 0, 0, 6354, 6355, 5, 114, 0, 0, 6355, 6356, 5, 121, 0, 0, 6356, 6357, 1, 0, 0, 0, 6357, 6358, 6, 568, 168, 0, 6358, 1143, 1, 0, 0, 0, 6359, 6360, 5, 116, 0, 0, 6360, 6361, 5, 117, 0, 0, 6361, 6362, 5, 109, 0, 0, 6362, 6363, 5, 98, 0, 0, 6363, 6364, 5, 108, 0, 0, 6364, 6365, 5, 105, 0, 0, 6365, 6366, 5, 110, 0, 0, 6366, 6367, 5, 103, 0, 0, 6367, 6368, 1, 0, 0, 0, 6368, 6369, 6, 569, 169, 0, 6369, 1145, 1, 0, 0, 0, 6370, 6371, 5, 116, 0, 0, 6371, 6372, 5, 121, 0, 0, 6372, 6373, 5, 112, 0, 0, 6373, 6374, 5, 101, 0, 0, 6374, 6375, 1, 0, 0, 0, 6375, 6376, 6, 570, 170, 0, 6376, 1147, 1, 0, 0, 0, 6377, 6378, 5, 116, 0, 0, 6378, 6379, 5, 121, 0, 0, 6379, 6380, 5, 112, 0, 0, 6380, 6381, 5, 101, 0, 0, 6381, 6382, 5, 115, 0, 0, 6382, 6383, 5, 119, 0, 0, 6383, 6384, 5, 105, 0, 0, 6384, 6385, 5, 116, 0, 0, 6385, 6386, 5, 99, 0, 0, 6386, 6387, 5, 104, 0, 0, 6387, 6388, 1, 0, 0, 0, 6388, 6389, 6, 571, 171, 0, 6389, 1149, 1, 0, 0, 0, 6390, 6391, 5, 117, 0, 0, 6391, 6392, 5, 110, 0, 0, 6392, 6393, 5, 105, 0, 0, 6393, 6394, 5, 111, 0, 0, 6394, 6395, 5, 110, 0, 0, 6395, 6396, 1, 0, 0, 0, 6396, 6397, 6, 572, 172, 0, 6397, 1151, 1, 0, 0, 0, 6398, 6399, 5, 117, 0, 0, 6399, 6400, 5, 110, 0, 0, 6400, 6401, 5, 111, 0, 0, 6401, 6402, 5, 114, 0, 0, 6402, 6403, 5, 100, 0, 0, 6403, 6404, 5, 101, 0, 0, 6404, 6405, 5, 114, 0, 0, 6405, 6406, 5, 101, 0, 0, 6406, 6407, 5, 100, 0, 0, 6407, 6408, 1, 0, 0, 0, 6408, 6409, 6, 573, 173, 0, 6409, 1153, 1, 0, 0, 0, 6410, 6411, 5, 117, 0, 0, 6411, 6412, 5, 112, 0, 0, 6412, 6413, 5, 100, 0, 0, 6413, 6414, 5, 97, 0, 0, 6414, 6415, 5, 116, 0, 0, 6415, 6416, 5, 101, 0, 0, 6416, 6417, 1, 0, 0, 0, 6417, 6418, 6, 574, 174, 0, 6418, 1155, 1, 0, 0, 0, 6419, 6420, 5, 118, 0, 0, 6420, 6421, 5, 97, 0, 0, 6421, 6422, 5, 108, 0, 0, 6422, 6423, 5, 105, 0, 0, 6423, 6424, 5, 100, 0, 0, 6424, 6425, 5, 97, 0, 0, 6425, 6426, 5, 116, 0, 0, 6426, 6427, 5, 101, 0, 0, 6427, 6428, 1, 0, 0, 0, 6428, 6429, 6, 575, 175, 0, 6429, 1157, 1, 0, 0, 0, 6430, 6431, 5, 118, 0, 0, 6431, 6432, 5, 97, 0, 0, 6432, 6433, 5, 114, 0, 0, 6433, 6434, 5, 105, 0, 0, 6434, 6435, 5, 97, 0, 0, 6435, 6436, 5, 98, 0, 0, 6436, 6437, 5, 108, 0, 0, 6437, 6438, 5, 101, 0, 0, 6438, 6439, 1, 0, 0, 0, 6439, 6440, 6, 576, 176, 0, 6440, 1159, 1, 0, 0, 0, 6441, 6442, 5, 118, 0, 0, 6442, 6443, 5, 101, 0, 0, 6443, 6444, 5, 114, 0, 0, 6444, 6445, 5, 115, 0, 0, 6445, 6446, 5, 105, 0, 0, 6446, 6447, 5, 111, 0, 0, 6447, 6448, 5, 110, 0, 0, 6448, 6449, 1, 0, 0, 0, 6449, 6450, 6, 577, 177, 0, 6450, 1161, 1, 0, 0, 0, 6451, 6452, 5, 119, 0, 0, 6452, 6453, 5, 104, 0, 0, 6453, 6454, 5, 101, 0, 0, 6454, 6455, 5, 110, 0, 0, 6455, 6456, 1, 0, 0, 0, 6456, 6457, 6, 578, 178, 0, 6457, 1163, 1, 0, 0, 0, 6458, 6459, 5, 119, 0, 0, 6459, 6460, 5, 104, 0, 0, 6460, 6461, 5, 101, 0, 0, 6461, 6462, 5, 114, 0, 0, 6462, 6463, 5, 101, 0, 0, 6463, 6464, 1, 0, 0, 0, 6464, 6465, 6, 579, 179, 0, 6465, 1165, 1, 0, 0, 0, 6466, 6467, 5, 119, 0, 0, 6467, 6468, 5, 105, 0, 0, 6468, 6469, 5, 110, 0, 0, 6469, 6470, 5, 100, 0, 0, 6470, 6471, 5, 111, 0, 0, 6471, 6472, 5, 119, 0, 0, 6472, 6473, 1, 0, 0, 0, 6473, 6474, 6, 580, 180, 0, 6474, 1167, 1, 0, 0, 0, 6475, 6476, 5, 120, 0, 0, 6476, 6477, 5, 113, 0, 0, 6477, 6478, 5, 117, 0, 0, 6478, 6479, 5, 101, 0, 0, 6479, 6480, 5, 114, 0, 0, 6480, 6481, 5, 121, 0, 0, 6481, 6482, 1, 0, 0, 0, 6482, 6483, 6, 581, 181, 0, 6483, 1169, 1, 0, 0, 0, 6484, 6485, 5, 97, 0, 0, 6485, 6486, 5, 114, 0, 0, 6486, 6487, 5, 114, 0, 0, 6487, 6488, 5, 97, 0, 0, 6488, 6489, 5, 121, 0, 0, 6489, 6490, 5, 45, 0, 0, 6490, 6491, 5, 110, 0, 0, 6491, 6492, 5, 111, 0, 0, 6492, 6493, 5, 100, 0, 0, 6493, 6494, 5, 101, 0, 0, 6494, 6495, 1, 0, 0, 0, 6495, 6496, 6, 582, 182, 0, 6496, 1171, 1, 0, 0, 0, 6497, 6498, 5, 98, 0, 0, 6498, 6499, 5, 111, 0, 0, 6499, 6500, 5, 111, 0, 0, 6500, 6501, 5, 108, 0, 0, 6501, 6502, 5, 101, 0, 0, 6502, 6503, 5, 97, 0, 0, 6503, 6504, 5, 110, 0, 0, 6504, 6505, 5, 45, 0, 0, 6505, 6506, 5, 110, 0, 0, 6506, 6507, 5, 111, 0, 0, 6507, 6508, 5, 100, 0, 0, 6508, 6509, 5, 101, 0, 0, 6509, 6510, 1, 0, 0, 0, 6510, 6511, 6, 583, 183, 0, 6511, 1173, 1, 0, 0, 0, 6512, 6513, 5, 110, 0, 0, 6513, 6514, 5, 117, 0, 0, 6514, 6515, 5, 108, 0, 0, 6515, 6516, 5, 108, 0, 0, 6516, 6517, 5, 45, 0, 0, 6517, 6518, 5, 110, 0, 0, 6518, 6519, 5, 111, 0, 0, 6519, 6520, 5, 100, 0, 0, 6520, 6521, 5, 101, 0, 0, 6521, 6522, 1, 0, 0, 0, 6522, 6523, 6, 584, 184, 0, 6523, 1175, 1, 0, 0, 0, 6524, 6525, 5, 110, 0, 0, 6525, 6526, 5, 117, 0, 0, 6526, 6527, 5, 109, 0, 0, 6527, 6528, 5, 98, 0, 0, 6528, 6529, 5, 101, 0, 0, 6529, 6530, 5, 114, 0, 0, 6530, 6531, 5, 45, 0, 0, 6531, 6532, 5, 110, 0, 0, 6532, 6533, 5, 111, 0, 0, 6533, 6534, 5, 100, 0, 0, 6534, 6535, 5, 101, 0, 0, 6535, 6536, 1, 0, 0, 0, 6536, 6537, 6, 585, 185, 0, 6537, 1177, 1, 0, 0, 0, 6538, 6539, 5, 111, 0, 0, 6539, 6540, 5, 98, 0, 0, 6540, 6541, 5, 106, 0, 0, 6541, 6542, 5, 101, 0, 0, 6542, 6543, 5, 99, 0, 0, 6543, 6544, 5, 116, 0, 0, 6544, 6545, 5, 45, 0, 0, 6545, 6546, 5, 110, 0, 0, 6546, 6547, 5, 111, 0, 0, 6547, 6548, 5, 100, 0, 0, 6548, 6549, 5, 101, 0, 0, 6549, 6550, 1, 0, 0, 0, 6550, 6551, 6, 586, 186, 0, 6551, 1179, 1, 0, 0, 0, 6552, 6553, 5, 114, 0, 0, 6553, 6554, 5, 101, 0, 0, 6554, 6555, 5, 112, 0, 0, 6555, 6556, 5, 108, 0, 0, 6556, 6557, 5, 97, 0, 0, 6557, 6558, 5, 99, 0, 0, 6558, 6559, 5, 101, 0, 0, 6559, 6560, 1, 0, 0, 0, 6560, 6561, 6, 587, 187, 0, 6561, 1181, 1, 0, 0, 0, 6562, 6563, 5, 119, 0, 0, 6563, 6564, 5, 105, 0, 0, 6564, 6565, 5, 116, 0, 0, 6565, 6566, 5, 104, 0, 0, 6566, 6567, 1, 0, 0, 0, 6567, 6568, 6, 588, 188, 0, 6568, 1183, 1, 0, 0, 0, 6569, 6570, 5, 118, 0, 0, 6570, 6571, 5, 97, 0, 0, 6571, 6572, 5, 108, 0, 0, 6572, 6573, 5, 117, 0, 0, 6573, 6574, 5, 101, 0, 0, 6574, 6575, 1, 0, 0, 0, 6575, 6576, 6, 589, 189, 0, 6576, 1185, 1, 0, 0, 0, 6577, 6578, 5, 105, 0, 0, 6578, 6579, 5, 110, 0, 0, 6579, 6580, 5, 115, 0, 0, 6580, 6581, 5, 101, 0, 0, 6581, 6582, 5, 114, 0, 0, 6582, 6583, 5, 116, 0, 0, 6583, 6584, 1, 0, 0, 0, 6584, 6585, 6, 590, 190, 0, 6585, 1187, 1, 0, 0, 0, 6586, 6587, 5, 105, 0, 0, 6587, 6588, 5, 110, 0, 0, 6588, 6589, 5, 116, 0, 0, 6589, 6590, 5, 111, 0, 0, 6590, 6591, 1, 0, 0, 0, 6591, 6592, 6, 591, 191, 0, 6592, 1189, 1, 0, 0, 0, 6593, 6594, 5, 100, 0, 0, 6594, 6595, 5, 101, 0, 0, 6595, 6596, 5, 108, 0, 0, 6596, 6597, 5, 101, 0, 0, 6597, 6598, 5, 116, 0, 0, 6598, 6599, 5, 101, 0, 0, 6599, 6600, 1, 0, 0, 0, 6600, 6601, 6, 592, 192, 0, 6601, 1191, 1, 0, 0, 0, 6602, 6603, 5, 114, 0, 0, 6603, 6604, 5, 101, 0, 0, 6604, 6605, 5, 110, 0, 0, 6605, 6606, 5, 97, 0, 0, 6606, 6607, 5, 109, 0, 0, 6607, 6608, 5, 101, 0, 0, 6608, 6609, 1, 0, 0, 0, 6609, 6610, 6, 593, 193, 0, 6610, 1193, 1, 0, 0, 0, 6611, 6612, 5, 81, 0, 0, 6612, 6618, 5, 123, 0, 0, 6613, 6617, 3, 16, 5, 0, 6614, 6617, 3, 18, 6, 0, 6615, 6617, 8, 9, 0, 0, 6616, 6613, 1, 0, 0, 0, 6616, 6614, 1, 0, 0, 0, 6616, 6615, 1, 0, 0, 0, 6617, 6620, 1, 0, 0, 0, 6618, 6616, 1, 0, 0, 0, 6618, 6619, 1, 0, 0, 0, 6619, 6621, 1, 0, 0, 0, 6620, 6618, 1, 0, 0, 0, 6621, 6622, 5, 125, 0, 0, 6622, 6623, 3, 374, 184, 0, 6623, 6624, 1, 0, 0, 0, 6624, 6625, 6, 594, 194, 0, 6625, 1195, 1, 0, 0, 0, 6626, 6627, 3, 374, 184, 0, 6627, 6628, 5, 58, 0, 0, 6628, 6629, 3, 374, 184, 0, 6629, 6630, 1, 0, 0, 0, 6630, 6631, 6, 595, 195, 0, 6631, 1197, 1, 0, 0, 0, 6632, 6633, 3, 374, 184, 0, 6633, 6634, 5, 58, 0, 0, 6634, 6635, 5, 42, 0, 0, 6635, 6636, 1, 0, 0, 0, 6636, 6637, 6, 596, 196, 0, 6637, 1199, 1, 0, 0, 0, 6638, 6639, 5, 42, 0, 0, 6639, 6640, 5, 58, 0, 0, 6640, 6641, 3, 374, 184, 0, 6641, 6642, 1, 0, 0, 0, 6642, 6643, 6, 597, 197, 0, 6643, 1201, 1, 0, 0, 0, 6644, 6648, 3, 376, 185, 0, 6645, 6647, 3, 378, 186, 0, 6646, 6645, 1, 0, 0, 0, 6647, 6650, 1, 0, 0, 0, 6648, 6646, 1, 0, 0, 0, 6648, 6649, 1, 0, 0, 0, 6649, 6651, 1, 0, 0, 0, 6650, 6648, 1, 0, 0, 0, 6651, 6652, 6, 598, 198, 0, 6652, 1203, 1, 0, 0, 0, 6653, 6654, 5, 40, 0, 0, 6654, 6655, 5, 58, 0, 0, 6655, 6656, 5, 126, 0, 0, 6656, 6657, 1, 0, 0, 0, 6657, 6658, 6, 599, 199, 0, 6658, 1205, 1, 0, 0, 0, 6659, 6661, 5, 58, 0, 0, 6660, 6659, 1, 0, 0, 0, 6661, 6662, 1, 0, 0, 0, 6662, 6660, 1, 0, 0, 0, 6662, 6663, 1, 0, 0, 0, 6663, 6664, 1, 0, 0, 0, 6664, 6665, 5, 41, 0, 0, 6665, 6666, 1, 0, 0, 0, 6666, 6667, 6, 600, 200, 0, 6667, 1207, 1, 0, 0, 0, 6668, 6669, 5, 40, 0, 0, 6669, 6670, 5, 58, 0, 0, 6670, 6676, 5, 126, 0, 0, 6671, 6675, 3, 388, 191, 0, 6672, 6673, 5, 58, 0, 0, 6673, 6675, 8, 12, 0, 0, 6674, 6671, 1, 0, 0, 0, 6674, 6672, 1, 0, 0, 0, 6675, 6678, 1, 0, 0, 0, 6676, 6674, 1, 0, 0, 0, 6676, 6677, 1, 0, 0, 0, 6677, 6679, 1, 0, 0, 0, 6678, 6676, 1, 0, 0, 0, 6679, 6680, 5, 58, 0, 0, 6680, 6681, 5, 41, 0, 0, 6681, 6682, 1, 0, 0, 0, 6682, 6683, 6, 601, 201, 0, 6683, 1209, 1, 0, 0, 0, 6684, 6685, 5, 40, 0, 0, 6685, 6686, 5, 58, 0, 0, 6686, 6695, 8, 13, 0, 0, 6687, 6694, 3, 386, 190, 0, 6688, 6689, 5, 40, 0, 0, 6689, 6694, 8, 14, 0, 0, 6690, 6691, 5, 58, 0, 0, 6691, 6694, 8, 12, 0, 0, 6692, 6694, 8, 15, 0, 0, 6693, 6687, 1, 0, 0, 0, 6693, 6688, 1, 0, 0, 0, 6693, 6690, 1, 0, 0, 0, 6693, 6692, 1, 0, 0, 0, 6694, 6697, 1, 0, 0, 0, 6695, 6693, 1, 0, 0, 0, 6695, 6696, 1, 0, 0, 0, 6696, 6701, 1, 0, 0, 0, 6697, 6695, 1, 0, 0, 0, 6698, 6700, 5, 58, 0, 0, 6699, 6698, 1, 0, 0, 0, 6700, 6703, 1, 0, 0, 0, 6701, 6699, 1, 0, 0, 0, 6701, 6702, 1, 0, 0, 0, 6702, 6705, 1, 0, 0, 0, 6703, 6701, 1, 0, 0, 0, 6704, 6706, 5, 58, 0, 0, 6705, 6704, 1, 0, 0, 0, 6706, 6707, 1, 0, 0, 0, 6707, 6705, 1, 0, 0, 0, 6707, 6708, 1, 0, 0, 0, 6708, 6709, 1, 0, 0, 0, 6709, 6710, 5, 41, 0, 0, 6710, 6711, 1, 0, 0, 0, 6711, 6712, 6, 602, 2, 0, 6712, 6713, 6, 602, 202, 0, 6713, 1211, 1, 0, 0, 0, 6714, 6715, 7, 16, 0, 0, 6715, 6716, 1, 0, 0, 0, 6716, 6717, 6, 603, 203, 0, 6717, 1213, 1, 0, 0, 0, 6718, 6719, 3, 98, 46, 0, 6719, 6720, 3, 98, 46, 0, 6720, 6721, 3, 44, 19, 0, 6721, 6722, 1, 0, 0, 0, 6722, 6723, 6, 604, 3, 0, 6723, 6724, 6, 604, 204, 0, 6724, 1215, 1, 0, 0, 0, 6725, 6726, 3, 50, 22, 0, 6726, 6727, 3, 98, 46, 0, 6727, 6728, 1, 0, 0, 0, 6728, 6729, 6, 605, 4, 0, 6729, 6730, 6, 605, 205, 0, 6730, 1217, 1, 0, 0, 0, 6731, 6732, 8, 17, 0, 0, 6732, 6733, 1, 0, 0, 0, 6733, 6734, 6, 606, 17, 0, 6734, 1219, 1, 0, 0, 0, 116, 0, 1, 2, 3, 4, 5, 1229, 1232, 1241, 1244, 1246, 1250, 1376, 1381, 1399, 1409, 1419, 1422, 1440, 1442, 1459, 1462, 1475, 1478, 1496, 1507, 1512, 1519, 1522, 1530, 2641, 2643, 2665, 2669, 2673, 2682, 2692, 2694, 2709, 2711, 2717, 2723, 2814, 2826, 2836, 2839, 2892, 2904, 2914, 2917, 2936, 2939, 2950, 2953, 2955, 2959, 3087, 3107, 3119, 3129, 3132, 3160, 3162, 3181, 3184, 3199, 3202, 3222, 3235, 3240, 3247, 3250, 3260, 4711, 4713, 4743, 4757, 4769, 4771, 4788, 4790, 4796, 4802, 4841, 4844, 4855, 4858, 4860, 4864, 4992, 5012, 5024, 5034, 5037, 5065, 5067, 5086, 5089, 5104, 5107, 5127, 5140, 5145, 5152, 5155, 5165, 6616, 6618, 6648, 6662, 6674, 6676, 6693, 6695, 6701, 6707, 208, 5, 2, 0, 5, 3, 0, 0, 1, 0, 5, 1, 0, 4, 0, 0, 7, 50, 0, 7, 24, 0, 7, 25, 0, 5, 0, 0, 7, 1, 0, 7, 11, 0, 7, 3, 0, 7, 4, 0, 5, 4, 0, 7, 26, 0, 7, 9, 0, 7, 10, 0, 7, 196, 0, 7, 2, 0, 7, 12, 0, 5, 5, 0, 7, 5, 0, 7, 6, 0, 7, 7, 0, 7, 8, 0, 7, 13, 0, 7, 14, 0, 7, 15, 0, 7, 16, 0, 7, 17, 0, 7, 18, 0, 7, 19, 0, 7, 20, 0, 7, 21, 0, 7, 22, 0, 7, 23, 0, 1, 240, 0, 1, 242, 1, 7, 27, 0, 7, 28, 0, 7, 29, 0, 7, 30, 0, 7, 31, 0, 7, 32, 0, 7, 33, 0, 7, 34, 0, 7, 35, 0, 7, 36, 0, 7, 37, 0, 7, 38, 0, 7, 39, 0, 7, 40, 0, 7, 41, 0, 7, 42, 0, 7, 43, 0, 7, 44, 0, 7, 45, 0, 7, 46, 0, 7, 47, 0, 7, 48, 0, 7, 49, 0, 7, 51, 0, 7, 52, 0, 7, 53, 0, 7, 54, 0, 7, 55, 0, 7, 56, 0, 7, 57, 0, 7, 58, 0, 7, 59, 0, 7, 60, 0, 7, 61, 0, 7, 62, 0, 7, 63, 0, 7, 64, 0, 7, 65, 0, 7, 66, 0, 7, 67, 0, 7, 68, 0, 7, 69, 0, 7, 70, 0, 7, 71, 0, 7, 72, 0, 7, 73, 0, 7, 74, 0, 7, 75, 0, 7, 76, 0, 7, 77, 0, 7, 78, 0, 7, 79, 0, 7, 80, 0, 7, 81, 0, 7, 82, 0, 7, 83, 0, 7, 84, 0, 7, 85, 0, 7, 86, 0, 7, 87, 0, 7, 88, 0, 7, 89, 0, 7, 90, 0, 7, 91, 0, 7, 92, 0, 7, 93, 0, 7, 94, 0, 7, 95, 0, 7, 96, 0, 7, 97, 0, 7, 98, 0, 7, 99, 0, 7, 100, 0, 7, 101, 0, 7, 102, 0, 7, 103, 0, 7, 104, 0, 7, 105, 0, 7, 106, 0, 7, 107, 0, 7, 108, 0, 7, 109, 0, 7, 110, 0, 7, 111, 0, 7, 112, 0, 7, 113, 0, 7, 114, 0, 7, 115, 0, 7, 116, 0, 7, 117, 0, 7, 118, 0, 7, 119, 0, 7, 120, 0, 7, 121, 0, 7, 122, 0, 7, 123, 0, 7, 124, 0, 7, 125, 0, 7, 126, 0, 7, 127, 0, 7, 128, 0, 7, 129, 0, 7, 130, 0, 7, 131, 0, 7, 132, 0, 7, 133, 0, 7, 134, 0, 7, 135, 0, 7, 136, 0, 7, 137, 0, 7, 138, 0, 7, 139, 0, 7, 140, 0, 7, 141, 0, 7, 142, 0, 7, 143, 0, 7, 144, 0, 7, 145, 0, 7, 146, 0, 7, 147, 0, 7, 148, 0, 7, 149, 0, 7, 150, 0, 7, 151, 0, 7, 152, 0, 7, 153, 0, 7, 154, 0, 7, 155, 0, 7, 156, 0, 7, 157, 0, 7, 158, 0, 7, 159, 0, 7, 160, 0, 7, 161, 0, 7, 162, 0, 7, 163, 0, 7, 164, 0, 7, 165, 0, 7, 166, 0, 7, 167, 0, 7, 168, 0, 7, 169, 0, 7, 170, 0, 7, 171, 0, 7, 172, 0, 7, 173, 0, 7, 174, 0, 7, 175, 0, 7, 176, 0, 7, 177, 0, 7, 178, 0, 7, 179, 0, 7, 180, 0, 7, 181, 0, 7, 182, 0, 7, 183, 0, 7, 184, 0, 7, 185, 0, 7, 186, 0, 7, 187, 0, 7, 188, 0, 7, 189, 0, 7, 190, 0, 7, 191, 0, 7, 192, 0, 7, 193, 0, 7, 194, 0, 7, 198, 0, 1, 434, 2, 1, 436, 3] \ No newline at end of file diff --git a/src/main/java/org/rumbledb/parser/XQueryParser.interp b/src/main/java/org/rumbledb/parser/XQueryParser.interp new file mode 100644 index 0000000000..265dac8da9 --- /dev/null +++ b/src/main/java/org/rumbledb/parser/XQueryParser.interp @@ -0,0 +1,659 @@ +token literal names: +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 +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 +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 +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 +null +null +null +null +null +null +null +null + +token symbolic names: +null +EscapeQuot +EscapeApos +DOUBLE_LBRACE +DOUBLE_RBRACE +IntegerLiteral +DecimalLiteral +DoubleLiteral +DFPropertyName +PredefinedEntityRef +CharRef +Quot +Apos +COMMENT +XMLDECL +PI +CDATA +PRAGMA +WS +EQUAL +NOT_EQUAL +LPAREN +RPAREN +LBRACKET +RBRACKET +LBRACE +RBRACE +STAR +PLUS +MINUS +COMMA +DOT +DDOT +COLON +COLON_EQ +SEMICOLON +SLASH +DSLASH +BACKSLASH +VBAR +LANGLE +RANGLE +QUESTION +AT +DOLLAR +MOD +BANG +HASH +CARAT +ARROW +GRAVE +CONCATENATION +TILDE +KW_ALLOWING +KW_ANCESTOR +KW_ANCESTOR_OR_SELF +KW_AND +KW_ARRAY +KW_AS +KW_ASCENDING +KW_AT +KW_ATTRIBUTE +KW_BASE_URI +KW_BOUNDARY_SPACE +KW_BINARY +KW_BY +KW_CASE +KW_CAST +KW_CASTABLE +KW_CATCH +KW_CHILD +KW_COLLATION +KW_COMMENT +KW_CONSTRUCTION +KW_CONTEXT +KW_COPY_NS +KW_COUNT +KW_DECLARE +KW_DEFAULT +KW_DESCENDANT +KW_DESCENDANT_OR_SELF +KW_DESCENDING +KW_DECIMAL_FORMAT +KW_DIV +KW_DOCUMENT +KW_DOCUMENT_NODE +KW_ELEMENT +KW_ELSE +KW_EMPTY +KW_EMPTY_SEQUENCE +KW_ENCODING +KW_END +KW_EQ +KW_EVERY +KW_EXCEPT +KW_EXTERNAL +KW_FOLLOWING +KW_FOLLOWING_SIBLING +KW_FOR +KW_FUNCTION +KW_GE +KW_GREATEST +KW_GROUP +KW_GT +KW_IDIV +KW_IF +KW_IMPORT +KW_IN +KW_INHERIT +KW_INSTANCE +KW_INTERSECT +KW_IS +KW_ITEM +KW_LAX +KW_LE +KW_LEAST +KW_LET +KW_LT +KW_MAP +KW_MOD +KW_MODULE +KW_NAMESPACE +KW_NE +KW_NEXT +KW_NAMESPACE_NODE +KW_NO_INHERIT +KW_NO_PRESERVE +KW_NODE +KW_OF +KW_ONLY +KW_OPTION +KW_OR +KW_ORDER +KW_ORDERED +KW_ORDERING +KW_PARENT +KW_PRECEDING +KW_PRECEDING_SIBLING +KW_PRESERVE +KW_PREVIOUS +KW_PI +KW_RETURN +KW_SATISFIES +KW_SCHEMA +KW_SCHEMA_ATTR +KW_SCHEMA_ELEM +KW_SELF +KW_SLIDING +KW_SOME +KW_STABLE +KW_START +KW_STRICT +KW_STRIP +KW_SWITCH +KW_TEXT +KW_THEN +KW_TO +KW_TREAT +KW_TRY +KW_TUMBLING +KW_TYPE +KW_TYPESWITCH +KW_UNION +KW_UNORDERED +KW_UPDATE +KW_VALIDATE +KW_VARIABLE +KW_VERSION +KW_WHEN +KW_WHERE +KW_WINDOW +KW_XQUERY +KW_ARRAY_NODE +KW_BOOLEAN_NODE +KW_NULL_NODE +KW_NUMBER_NODE +KW_OBJECT_NODE +KW_REPLACE +KW_WITH +KW_VALUE +KW_INSERT +KW_INTO +KW_DELETE +KW_RENAME +URIQualifiedName +FullQName +NCNameWithLocalWildcard +NCNameWithPrefixWildcard +NCName +XQDOC_COMMENT_START +XQDOC_COMMENT_END +XQDocComment +XQComment +CHAR +ENTER_STRING +EXIT_INTERPOLATION +ContentChar +BASIC_CHAR +ENTER_INTERPOLATION +EXIT_STRING +EscapeQuot_QuotString +DOUBLE_LBRACE_QuotString +DOUBLE_RBRACE_QuotString +EscapeApos_AposString + +rule names: +module +xqDocComment +versionDecl +mainModule +queryBody +libraryModule +moduleDecl +prolog +annotatedDecl +defaultNamespaceDecl +setter +boundarySpaceDecl +defaultCollationDecl +baseURIDecl +constructionDecl +orderingModeDecl +emptyOrderDecl +copyNamespacesDecl +preserveMode +inheritMode +decimalFormatDecl +schemaImport +schemaPrefix +moduleImport +namespaceDecl +varDecl +varValue +varDefaultValue +contextItemDecl +functionDecl +functionParams +functionParam +annotations +annotation +annotList +annotationParam +functionReturn +optionDecl +expr +exprSingle +flworExpr +initialClause +intermediateClause +forClause +forBinding +allowingEmpty +positionalVar +letClause +letBinding +windowClause +tumblingWindowClause +slidingWindowClause +windowStartCondition +windowEndCondition +windowVars +countClause +whereClause +groupByClause +groupingSpecList +groupingSpec +orderByClause +orderSpec +returnClause +quantifiedExpr +quantifiedVar +switchExpr +switchCaseClause +switchCaseOperand +typeswitchExpr +caseClause +sequenceUnionType +ifExpr +tryCatchExpr +tryClause +enclosedTryTargetExpression +catchClause +enclosedExpression +catchErrorList +existUpdateExpr +existReplaceExpr +existValueExpr +existInsertExpr +existDeleteExpr +existRenameExpr +orExpr +andExpr +comparisonExpr +stringConcatExpr +rangeExpr +additiveExpr +multiplicativeExpr +unionExpr +intersectExceptExpr +instanceOfExpr +treatExpr +castableExpr +castExpr +arrowExpr +complexArrow +unaryExpr +valueExpr +generalComp +valueComp +nodeComp +validateExpr +validationMode +extensionExpr +simpleMapExpr +pathExpr +relativePathExpr +stepExpr +axisStep +forwardStep +forwardAxis +abbrevForwardStep +reverseStep +reverseAxis +abbrevReverseStep +nodeTest +nameTest +wildcard +postfixExpr +argumentList +predicateList +predicate +lookup +keySpecifier +arrowFunctionSpecifier +primaryExpr +literal +numericLiteral +varRef +varName +parenthesizedExpr +contextItemExpr +orderedExpr +unorderedExpr +functionCall +argument +nodeConstructor +directConstructor +dirElemConstructorOpenClose +dirElemConstructorSingleTag +dirAttributeList +dirAttributeValueApos +dirAttributeValueQuot +dirAttributeValue +dirAttributeContentQuot +dirAttributeContentApos +dirElemContent +commonContent +computedConstructor +compMLJSONConstructor +compMLJSONArrayConstructor +compMLJSONObjectConstructor +compMLJSONNumberConstructor +compMLJSONBooleanConstructor +compMLJSONNullConstructor +compBinaryConstructor +compDocConstructor +compElemConstructor +enclosedContentExpr +compAttrConstructor +compNamespaceConstructor +prefix +enclosedPrefixExpr +enclosedURIExpr +compTextConstructor +compCommentConstructor +compPIConstructor +functionItemExpr +namedFunctionRef +inlineFunctionRef +functionBody +mapConstructor +mapConstructorEntry +arrayConstructor +squareArrayConstructor +curlyArrayConstructor +stringConstructor +stringConstructorContent +charNoGrave +charNoLBrace +charNoRBrack +stringConstructorChars +stringConstructorInterpolation +unaryLookup +singleType +typeDeclaration +sequenceType +itemType +atomicOrUnionType +kindTest +anyKindTest +binaryNodeTest +documentTest +textTest +commentTest +namespaceNodeTest +piTest +attributeTest +attributeNameOrWildcard +schemaAttributeTest +elementTest +elementNameOrWildcard +schemaElementTest +elementDeclaration +attributeName +elementName +simpleTypeName +typeName +functionTest +anyFunctionTest +typedFunctionTest +mapTest +anyMapTest +typedMapTest +arrayTest +anyArrayTest +typedArrayTest +parenthesizedItemTest +attributeDeclaration +mlNodeTest +mlArrayNodeTest +mlObjectNodeTest +mlNumberNodeTest +mlBooleanNodeTest +mlNullNodeTest +eqName +qName +ncName +functionName +keyword +keywordNotOKForFunction +keywordOKForFunction +uriLiteral +stringLiteralQuot +stringLiteralApos +stringLiteral +stringContentQuot +stringContentApos +noQuotesNoBracesNoAmpNoLAng + + +atn: +[4, 1, 203, 2133, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 1, 0, 3, 0, 486, 8, 0, 1, 0, 3, 0, 489, 8, 0, 1, 0, 3, 0, 492, 8, 0, 1, 0, 1, 0, 3, 0, 496, 8, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 505, 8, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 529, 8, 7, 1, 7, 1, 7, 5, 7, 533, 8, 7, 10, 7, 12, 7, 536, 9, 7, 1, 7, 3, 7, 539, 8, 7, 1, 7, 1, 7, 1, 7, 5, 7, 544, 8, 7, 10, 7, 12, 7, 547, 9, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 553, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 569, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 613, 8, 20, 1, 20, 1, 20, 1, 20, 5, 20, 618, 8, 20, 10, 20, 12, 20, 621, 9, 20, 1, 21, 1, 21, 1, 21, 3, 21, 626, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 633, 8, 21, 10, 21, 12, 21, 636, 9, 21, 3, 21, 638, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 647, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 655, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 662, 8, 23, 10, 23, 12, 23, 665, 9, 23, 3, 23, 667, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 681, 8, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 688, 8, 25, 3, 25, 690, 8, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 701, 8, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 708, 8, 28, 3, 28, 710, 8, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 718, 8, 29, 1, 29, 1, 29, 3, 29, 722, 8, 29, 1, 29, 1, 29, 3, 29, 726, 8, 29, 1, 30, 1, 30, 1, 30, 5, 30, 731, 8, 30, 10, 30, 12, 30, 734, 9, 30, 1, 31, 1, 31, 1, 31, 3, 31, 739, 8, 31, 1, 32, 5, 32, 742, 8, 32, 10, 32, 12, 32, 745, 9, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 753, 8, 33, 1, 34, 1, 34, 1, 34, 5, 34, 758, 8, 34, 10, 34, 12, 34, 761, 9, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 5, 38, 776, 8, 38, 10, 38, 12, 38, 779, 9, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 789, 8, 39, 1, 40, 1, 40, 5, 40, 793, 8, 40, 10, 40, 12, 40, 796, 9, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 3, 41, 803, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 810, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 816, 8, 43, 10, 43, 12, 43, 819, 9, 43, 1, 44, 1, 44, 1, 44, 3, 44, 824, 8, 44, 1, 44, 3, 44, 827, 8, 44, 1, 44, 3, 44, 830, 8, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 5, 47, 846, 8, 47, 10, 47, 12, 47, 849, 9, 47, 1, 48, 1, 48, 1, 48, 3, 48, 854, 8, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 3, 49, 862, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 869, 8, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 875, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 882, 8, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 3, 53, 895, 8, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 3, 54, 904, 8, 54, 1, 54, 3, 54, 907, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 912, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 917, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 5, 58, 933, 8, 58, 10, 58, 12, 58, 936, 9, 58, 1, 59, 1, 59, 1, 59, 3, 59, 941, 8, 59, 1, 59, 1, 59, 3, 59, 945, 8, 59, 1, 59, 1, 59, 3, 59, 949, 8, 59, 1, 60, 3, 60, 952, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 959, 8, 60, 10, 60, 12, 60, 962, 9, 60, 1, 61, 1, 61, 1, 61, 3, 61, 967, 8, 61, 1, 61, 1, 61, 1, 61, 3, 61, 972, 8, 61, 3, 61, 974, 8, 61, 1, 61, 1, 61, 3, 61, 978, 8, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 3, 63, 985, 8, 63, 1, 63, 1, 63, 1, 63, 5, 63, 990, 8, 63, 10, 63, 12, 63, 993, 9, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 3, 64, 1001, 8, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 4, 65, 1011, 8, 65, 11, 65, 12, 65, 1012, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 4, 66, 1021, 8, 66, 11, 66, 12, 66, 1022, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 4, 68, 1035, 8, 68, 11, 68, 12, 68, 1036, 1, 68, 1, 68, 1, 68, 3, 68, 1042, 8, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1052, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1061, 8, 70, 10, 70, 12, 70, 1064, 9, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 4, 72, 1077, 8, 72, 11, 72, 12, 72, 1078, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 1093, 8, 75, 1, 75, 1, 75, 1, 76, 1, 76, 3, 76, 1099, 8, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 5, 77, 1106, 8, 77, 10, 77, 12, 77, 1109, 9, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 1117, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 5, 84, 1145, 8, 84, 10, 84, 12, 84, 1148, 9, 84, 1, 85, 1, 85, 1, 85, 5, 85, 1153, 8, 85, 10, 85, 12, 85, 1156, 9, 85, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 1162, 8, 86, 1, 86, 1, 86, 3, 86, 1166, 8, 86, 1, 87, 1, 87, 1, 87, 5, 87, 1171, 8, 87, 10, 87, 12, 87, 1174, 9, 87, 1, 88, 1, 88, 1, 88, 3, 88, 1179, 8, 88, 1, 89, 1, 89, 1, 89, 5, 89, 1184, 8, 89, 10, 89, 12, 89, 1187, 9, 89, 1, 90, 1, 90, 1, 90, 5, 90, 1192, 8, 90, 10, 90, 12, 90, 1195, 9, 90, 1, 91, 1, 91, 1, 91, 5, 91, 1200, 8, 91, 10, 91, 12, 91, 1203, 9, 91, 1, 92, 1, 92, 1, 92, 5, 92, 1208, 8, 92, 10, 92, 12, 92, 1211, 9, 92, 1, 93, 1, 93, 1, 93, 1, 93, 3, 93, 1217, 8, 93, 1, 94, 1, 94, 1, 94, 1, 94, 3, 94, 1223, 8, 94, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1229, 8, 95, 1, 96, 1, 96, 1, 96, 1, 96, 3, 96, 1235, 8, 96, 1, 97, 1, 97, 1, 97, 5, 97, 1240, 8, 97, 10, 97, 12, 97, 1243, 9, 97, 1, 98, 1, 98, 1, 98, 1, 99, 5, 99, 1249, 8, 99, 10, 99, 12, 99, 1252, 9, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 3, 100, 1259, 8, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 3, 101, 1269, 8, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1278, 8, 103, 1, 104, 1, 104, 1, 104, 1, 104, 3, 104, 1284, 8, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 4, 106, 1291, 8, 106, 11, 106, 12, 106, 1292, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 5, 107, 1302, 8, 107, 10, 107, 12, 107, 1305, 9, 107, 1, 108, 1, 108, 3, 108, 1309, 8, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1314, 8, 108, 1, 109, 1, 109, 1, 109, 5, 109, 1319, 8, 109, 10, 109, 12, 109, 1322, 9, 109, 1, 110, 1, 110, 3, 110, 1326, 8, 110, 1, 111, 1, 111, 3, 111, 1330, 8, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 3, 112, 1338, 8, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 3, 114, 1345, 8, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 3, 115, 1353, 8, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 3, 118, 1363, 8, 118, 1, 119, 1, 119, 3, 119, 1367, 8, 119, 1, 120, 1, 120, 1, 120, 3, 120, 1372, 8, 120, 1, 121, 1, 121, 1, 121, 1, 121, 5, 121, 1378, 8, 121, 10, 121, 12, 121, 1381, 9, 121, 1, 122, 1, 122, 1, 122, 1, 122, 5, 122, 1387, 8, 122, 10, 122, 12, 122, 1390, 9, 122, 3, 122, 1392, 8, 122, 1, 122, 1, 122, 1, 123, 5, 123, 1397, 8, 123, 10, 123, 12, 123, 1400, 9, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 3, 126, 1413, 8, 126, 1, 127, 1, 127, 1, 127, 3, 127, 1418, 8, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 3, 128, 1433, 8, 128, 1, 129, 1, 129, 3, 129, 1437, 8, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 3, 133, 1448, 8, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 3, 138, 1465, 8, 138, 1, 139, 1, 139, 3, 139, 1469, 8, 139, 1, 140, 1, 140, 1, 140, 3, 140, 1474, 8, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 5, 141, 1481, 8, 141, 10, 141, 12, 141, 1484, 9, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 5, 143, 1501, 8, 143, 10, 143, 12, 143, 1504, 9, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 5, 144, 1511, 8, 144, 10, 144, 12, 144, 1514, 9, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 5, 145, 1523, 8, 145, 10, 145, 12, 145, 1526, 9, 145, 1, 145, 1, 145, 1, 146, 1, 146, 3, 146, 1532, 8, 146, 1, 147, 4, 147, 1535, 8, 147, 11, 147, 12, 147, 1536, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 3, 147, 1544, 8, 147, 1, 147, 3, 147, 1547, 8, 147, 1, 148, 4, 148, 1550, 8, 148, 11, 148, 12, 148, 1551, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 3, 148, 1559, 8, 148, 1, 148, 3, 148, 1562, 8, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 3, 149, 1570, 8, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 3, 150, 1581, 8, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 3, 151, 1591, 8, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 3, 152, 1599, 8, 152, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 5, 154, 1614, 8, 154, 10, 154, 12, 154, 1617, 9, 154, 3, 154, 1619, 8, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 3, 160, 1647, 8, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 3, 162, 1659, 8, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 3, 163, 1666, 8, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 165, 1, 165, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 3, 169, 1688, 8, 169, 1, 169, 1, 169, 1, 170, 1, 170, 3, 170, 1694, 8, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 3, 172, 1704, 8, 172, 1, 172, 1, 172, 1, 172, 3, 172, 1709, 8, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 5, 174, 1720, 8, 174, 10, 174, 12, 174, 1723, 9, 174, 3, 174, 1725, 8, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 3, 176, 1735, 8, 176, 1, 177, 1, 177, 3, 177, 1739, 8, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 5, 180, 1754, 8, 180, 10, 180, 12, 180, 1757, 9, 180, 1, 181, 1, 181, 1, 182, 1, 182, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 5, 184, 1775, 8, 184, 10, 184, 12, 184, 1778, 9, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 3, 187, 1789, 8, 187, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 3, 189, 1801, 8, 189, 3, 189, 1803, 8, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 3, 190, 1814, 8, 190, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 3, 192, 1830, 8, 192, 1, 193, 1, 193, 1, 193, 3, 193, 1835, 8, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 3, 195, 1847, 8, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 3, 199, 1867, 8, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 3, 200, 1876, 8, 200, 3, 200, 1878, 8, 200, 1, 200, 1, 200, 1, 201, 1, 201, 3, 201, 1884, 8, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 3, 203, 1897, 8, 203, 3, 203, 1899, 8, 203, 3, 203, 1901, 8, 203, 1, 203, 1, 203, 1, 204, 1, 204, 3, 204, 1907, 8, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 207, 1, 207, 1, 208, 1, 208, 1, 209, 1, 209, 1, 210, 1, 210, 1, 211, 5, 211, 1925, 8, 211, 10, 211, 12, 211, 1928, 9, 211, 1, 211, 1, 211, 3, 211, 1932, 8, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 5, 213, 1944, 8, 213, 10, 213, 12, 213, 1947, 9, 213, 3, 213, 1949, 8, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 3, 214, 1957, 8, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 3, 217, 1973, 8, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 3, 222, 1996, 8, 222, 1, 223, 1, 223, 1, 223, 3, 223, 2001, 8, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 3, 224, 2008, 8, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 3, 225, 2015, 8, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 3, 226, 2022, 8, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 3, 227, 2029, 8, 227, 1, 227, 1, 227, 1, 228, 1, 228, 3, 228, 2035, 8, 228, 1, 229, 1, 229, 3, 229, 2039, 8, 229, 1, 230, 1, 230, 3, 230, 2043, 8, 230, 1, 231, 1, 231, 1, 231, 1, 231, 3, 231, 2049, 8, 231, 1, 232, 1, 232, 3, 232, 2053, 8, 232, 1, 233, 1, 233, 1, 234, 1, 234, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 5, 236, 2066, 8, 236, 10, 236, 12, 236, 2069, 9, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 5, 237, 2078, 8, 237, 10, 237, 12, 237, 2081, 9, 237, 1, 237, 1, 237, 1, 238, 1, 238, 3, 238, 2087, 8, 238, 1, 239, 4, 239, 2090, 8, 239, 11, 239, 12, 239, 2091, 1, 239, 1, 239, 3, 239, 2096, 8, 239, 1, 239, 3, 239, 2099, 8, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 3, 239, 2106, 8, 239, 1, 240, 4, 240, 2109, 8, 240, 11, 240, 12, 240, 2110, 1, 240, 1, 240, 3, 240, 2115, 8, 240, 1, 240, 3, 240, 2118, 8, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 3, 240, 2125, 8, 240, 1, 241, 1, 241, 4, 241, 2129, 8, 241, 11, 241, 12, 241, 2130, 1, 241, 0, 0, 242, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 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, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 360, 362, 364, 366, 368, 370, 372, 374, 376, 378, 380, 382, 384, 386, 388, 390, 392, 394, 396, 398, 400, 402, 404, 406, 408, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428, 430, 432, 434, 436, 438, 440, 442, 444, 446, 448, 450, 452, 454, 456, 458, 460, 462, 464, 466, 468, 470, 472, 474, 476, 478, 480, 482, 0, 27, 2, 0, 86, 86, 99, 99, 2, 0, 138, 138, 152, 152, 2, 0, 133, 133, 163, 163, 2, 0, 101, 101, 115, 115, 2, 0, 126, 126, 138, 138, 2, 0, 108, 108, 125, 125, 3, 0, 96, 96, 136, 136, 181, 181, 1, 0, 28, 29, 4, 0, 27, 27, 83, 83, 104, 104, 119, 119, 2, 0, 39, 39, 162, 162, 2, 0, 94, 94, 110, 110, 6, 0, 92, 92, 100, 100, 103, 103, 114, 114, 117, 117, 122, 122, 2, 0, 58, 58, 160, 160, 2, 0, 113, 113, 151, 151, 1, 0, 36, 37, 5, 0, 61, 61, 70, 70, 79, 80, 96, 97, 146, 146, 2, 0, 54, 55, 135, 137, 1, 0, 5, 7, 2, 0, 13, 13, 15, 15, 1, 0, 9, 10, 1, 0, 33, 34, 2, 0, 24, 25, 197, 197, 3, 0, 24, 24, 50, 50, 197, 197, 3, 0, 25, 25, 50, 50, 197, 197, 28, 0, 8, 8, 53, 53, 57, 57, 61, 61, 64, 64, 69, 69, 72, 72, 74, 74, 76, 76, 82, 82, 85, 86, 89, 89, 91, 91, 105, 105, 112, 112, 118, 118, 123, 124, 127, 127, 129, 129, 140, 140, 144, 145, 147, 147, 153, 154, 158, 161, 164, 164, 168, 168, 170, 170, 172, 183, 26, 0, 54, 56, 58, 60, 62, 63, 65, 68, 70, 71, 73, 73, 75, 75, 77, 81, 83, 84, 87, 88, 90, 90, 92, 104, 106, 111, 113, 117, 119, 122, 125, 126, 128, 128, 130, 138, 141, 143, 146, 146, 148, 152, 155, 157, 162, 163, 165, 167, 169, 169, 171, 171, 11, 0, 5, 7, 13, 13, 17, 17, 19, 24, 27, 39, 41, 50, 52, 52, 123, 123, 139, 139, 184, 189, 196, 196, 2212, 0, 485, 1, 0, 0, 0, 2, 497, 1, 0, 0, 0, 4, 499, 1, 0, 0, 0, 6, 508, 1, 0, 0, 0, 8, 511, 1, 0, 0, 0, 10, 513, 1, 0, 0, 0, 12, 516, 1, 0, 0, 0, 14, 534, 1, 0, 0, 0, 16, 552, 1, 0, 0, 0, 18, 554, 1, 0, 0, 0, 20, 568, 1, 0, 0, 0, 22, 570, 1, 0, 0, 0, 24, 574, 1, 0, 0, 0, 26, 579, 1, 0, 0, 0, 28, 583, 1, 0, 0, 0, 30, 587, 1, 0, 0, 0, 32, 591, 1, 0, 0, 0, 34, 597, 1, 0, 0, 0, 36, 603, 1, 0, 0, 0, 38, 605, 1, 0, 0, 0, 40, 607, 1, 0, 0, 0, 42, 622, 1, 0, 0, 0, 44, 646, 1, 0, 0, 0, 46, 648, 1, 0, 0, 0, 48, 668, 1, 0, 0, 0, 50, 674, 1, 0, 0, 0, 52, 691, 1, 0, 0, 0, 54, 693, 1, 0, 0, 0, 56, 695, 1, 0, 0, 0, 58, 711, 1, 0, 0, 0, 60, 727, 1, 0, 0, 0, 62, 735, 1, 0, 0, 0, 64, 743, 1, 0, 0, 0, 66, 746, 1, 0, 0, 0, 68, 754, 1, 0, 0, 0, 70, 762, 1, 0, 0, 0, 72, 764, 1, 0, 0, 0, 74, 767, 1, 0, 0, 0, 76, 772, 1, 0, 0, 0, 78, 788, 1, 0, 0, 0, 80, 790, 1, 0, 0, 0, 82, 802, 1, 0, 0, 0, 84, 809, 1, 0, 0, 0, 86, 811, 1, 0, 0, 0, 88, 820, 1, 0, 0, 0, 90, 834, 1, 0, 0, 0, 92, 837, 1, 0, 0, 0, 94, 841, 1, 0, 0, 0, 96, 850, 1, 0, 0, 0, 98, 858, 1, 0, 0, 0, 100, 863, 1, 0, 0, 0, 102, 876, 1, 0, 0, 0, 104, 888, 1, 0, 0, 0, 106, 894, 1, 0, 0, 0, 108, 903, 1, 0, 0, 0, 110, 918, 1, 0, 0, 0, 112, 922, 1, 0, 0, 0, 114, 925, 1, 0, 0, 0, 116, 929, 1, 0, 0, 0, 118, 937, 1, 0, 0, 0, 120, 951, 1, 0, 0, 0, 122, 963, 1, 0, 0, 0, 124, 979, 1, 0, 0, 0, 126, 984, 1, 0, 0, 0, 128, 997, 1, 0, 0, 0, 130, 1005, 1, 0, 0, 0, 132, 1020, 1, 0, 0, 0, 134, 1027, 1, 0, 0, 0, 136, 1029, 1, 0, 0, 0, 138, 1046, 1, 0, 0, 0, 140, 1057, 1, 0, 0, 0, 142, 1065, 1, 0, 0, 0, 144, 1074, 1, 0, 0, 0, 146, 1080, 1, 0, 0, 0, 148, 1083, 1, 0, 0, 0, 150, 1085, 1, 0, 0, 0, 152, 1096, 1, 0, 0, 0, 154, 1102, 1, 0, 0, 0, 156, 1110, 1, 0, 0, 0, 158, 1118, 1, 0, 0, 0, 160, 1123, 1, 0, 0, 0, 162, 1128, 1, 0, 0, 0, 164, 1133, 1, 0, 0, 0, 166, 1136, 1, 0, 0, 0, 168, 1141, 1, 0, 0, 0, 170, 1149, 1, 0, 0, 0, 172, 1157, 1, 0, 0, 0, 174, 1167, 1, 0, 0, 0, 176, 1175, 1, 0, 0, 0, 178, 1180, 1, 0, 0, 0, 180, 1188, 1, 0, 0, 0, 182, 1196, 1, 0, 0, 0, 184, 1204, 1, 0, 0, 0, 186, 1212, 1, 0, 0, 0, 188, 1218, 1, 0, 0, 0, 190, 1224, 1, 0, 0, 0, 192, 1230, 1, 0, 0, 0, 194, 1236, 1, 0, 0, 0, 196, 1244, 1, 0, 0, 0, 198, 1250, 1, 0, 0, 0, 200, 1258, 1, 0, 0, 0, 202, 1268, 1, 0, 0, 0, 204, 1270, 1, 0, 0, 0, 206, 1277, 1, 0, 0, 0, 208, 1279, 1, 0, 0, 0, 210, 1287, 1, 0, 0, 0, 212, 1290, 1, 0, 0, 0, 214, 1298, 1, 0, 0, 0, 216, 1313, 1, 0, 0, 0, 218, 1315, 1, 0, 0, 0, 220, 1325, 1, 0, 0, 0, 222, 1329, 1, 0, 0, 0, 224, 1337, 1, 0, 0, 0, 226, 1339, 1, 0, 0, 0, 228, 1344, 1, 0, 0, 0, 230, 1352, 1, 0, 0, 0, 232, 1354, 1, 0, 0, 0, 234, 1358, 1, 0, 0, 0, 236, 1362, 1, 0, 0, 0, 238, 1366, 1, 0, 0, 0, 240, 1371, 1, 0, 0, 0, 242, 1373, 1, 0, 0, 0, 244, 1382, 1, 0, 0, 0, 246, 1398, 1, 0, 0, 0, 248, 1401, 1, 0, 0, 0, 250, 1405, 1, 0, 0, 0, 252, 1412, 1, 0, 0, 0, 254, 1417, 1, 0, 0, 0, 256, 1432, 1, 0, 0, 0, 258, 1436, 1, 0, 0, 0, 260, 1438, 1, 0, 0, 0, 262, 1440, 1, 0, 0, 0, 264, 1443, 1, 0, 0, 0, 266, 1445, 1, 0, 0, 0, 268, 1451, 1, 0, 0, 0, 270, 1453, 1, 0, 0, 0, 272, 1456, 1, 0, 0, 0, 274, 1459, 1, 0, 0, 0, 276, 1464, 1, 0, 0, 0, 278, 1468, 1, 0, 0, 0, 280, 1473, 1, 0, 0, 0, 282, 1475, 1, 0, 0, 0, 284, 1490, 1, 0, 0, 0, 286, 1502, 1, 0, 0, 0, 288, 1505, 1, 0, 0, 0, 290, 1517, 1, 0, 0, 0, 292, 1531, 1, 0, 0, 0, 294, 1546, 1, 0, 0, 0, 296, 1561, 1, 0, 0, 0, 298, 1569, 1, 0, 0, 0, 300, 1580, 1, 0, 0, 0, 302, 1590, 1, 0, 0, 0, 304, 1598, 1, 0, 0, 0, 306, 1600, 1, 0, 0, 0, 308, 1603, 1, 0, 0, 0, 310, 1622, 1, 0, 0, 0, 312, 1625, 1, 0, 0, 0, 314, 1630, 1, 0, 0, 0, 316, 1634, 1, 0, 0, 0, 318, 1637, 1, 0, 0, 0, 320, 1640, 1, 0, 0, 0, 322, 1650, 1, 0, 0, 0, 324, 1652, 1, 0, 0, 0, 326, 1662, 1, 0, 0, 0, 328, 1669, 1, 0, 0, 0, 330, 1671, 1, 0, 0, 0, 332, 1673, 1, 0, 0, 0, 334, 1675, 1, 0, 0, 0, 336, 1678, 1, 0, 0, 0, 338, 1681, 1, 0, 0, 0, 340, 1693, 1, 0, 0, 0, 342, 1695, 1, 0, 0, 0, 344, 1699, 1, 0, 0, 0, 346, 1712, 1, 0, 0, 0, 348, 1714, 1, 0, 0, 0, 350, 1728, 1, 0, 0, 0, 352, 1734, 1, 0, 0, 0, 354, 1736, 1, 0, 0, 0, 356, 1742, 1, 0, 0, 0, 358, 1745, 1, 0, 0, 0, 360, 1749, 1, 0, 0, 0, 362, 1758, 1, 0, 0, 0, 364, 1760, 1, 0, 0, 0, 366, 1762, 1, 0, 0, 0, 368, 1776, 1, 0, 0, 0, 370, 1779, 1, 0, 0, 0, 372, 1783, 1, 0, 0, 0, 374, 1786, 1, 0, 0, 0, 376, 1790, 1, 0, 0, 0, 378, 1802, 1, 0, 0, 0, 380, 1813, 1, 0, 0, 0, 382, 1815, 1, 0, 0, 0, 384, 1829, 1, 0, 0, 0, 386, 1831, 1, 0, 0, 0, 388, 1838, 1, 0, 0, 0, 390, 1842, 1, 0, 0, 0, 392, 1850, 1, 0, 0, 0, 394, 1854, 1, 0, 0, 0, 396, 1858, 1, 0, 0, 0, 398, 1862, 1, 0, 0, 0, 400, 1870, 1, 0, 0, 0, 402, 1883, 1, 0, 0, 0, 404, 1885, 1, 0, 0, 0, 406, 1890, 1, 0, 0, 0, 408, 1906, 1, 0, 0, 0, 410, 1908, 1, 0, 0, 0, 412, 1913, 1, 0, 0, 0, 414, 1915, 1, 0, 0, 0, 416, 1917, 1, 0, 0, 0, 418, 1919, 1, 0, 0, 0, 420, 1921, 1, 0, 0, 0, 422, 1926, 1, 0, 0, 0, 424, 1933, 1, 0, 0, 0, 426, 1938, 1, 0, 0, 0, 428, 1956, 1, 0, 0, 0, 430, 1958, 1, 0, 0, 0, 432, 1963, 1, 0, 0, 0, 434, 1972, 1, 0, 0, 0, 436, 1974, 1, 0, 0, 0, 438, 1979, 1, 0, 0, 0, 440, 1984, 1, 0, 0, 0, 442, 1988, 1, 0, 0, 0, 444, 1995, 1, 0, 0, 0, 446, 1997, 1, 0, 0, 0, 448, 2004, 1, 0, 0, 0, 450, 2011, 1, 0, 0, 0, 452, 2018, 1, 0, 0, 0, 454, 2025, 1, 0, 0, 0, 456, 2034, 1, 0, 0, 0, 458, 2038, 1, 0, 0, 0, 460, 2042, 1, 0, 0, 0, 462, 2048, 1, 0, 0, 0, 464, 2052, 1, 0, 0, 0, 466, 2054, 1, 0, 0, 0, 468, 2056, 1, 0, 0, 0, 470, 2058, 1, 0, 0, 0, 472, 2060, 1, 0, 0, 0, 474, 2072, 1, 0, 0, 0, 476, 2086, 1, 0, 0, 0, 478, 2105, 1, 0, 0, 0, 480, 2124, 1, 0, 0, 0, 482, 2128, 1, 0, 0, 0, 484, 486, 3, 2, 1, 0, 485, 484, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 488, 1, 0, 0, 0, 487, 489, 3, 4, 2, 0, 488, 487, 1, 0, 0, 0, 488, 489, 1, 0, 0, 0, 489, 491, 1, 0, 0, 0, 490, 492, 3, 2, 1, 0, 491, 490, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 492, 495, 1, 0, 0, 0, 493, 496, 3, 10, 5, 0, 494, 496, 3, 6, 3, 0, 495, 493, 1, 0, 0, 0, 495, 494, 1, 0, 0, 0, 496, 1, 1, 0, 0, 0, 497, 498, 5, 191, 0, 0, 498, 3, 1, 0, 0, 0, 499, 500, 5, 171, 0, 0, 500, 501, 5, 167, 0, 0, 501, 504, 3, 476, 238, 0, 502, 503, 5, 90, 0, 0, 503, 505, 3, 476, 238, 0, 504, 502, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 5, 35, 0, 0, 507, 5, 1, 0, 0, 0, 508, 509, 3, 14, 7, 0, 509, 510, 3, 8, 4, 0, 510, 7, 1, 0, 0, 0, 511, 512, 3, 76, 38, 0, 512, 9, 1, 0, 0, 0, 513, 514, 3, 12, 6, 0, 514, 515, 3, 14, 7, 0, 515, 11, 1, 0, 0, 0, 516, 517, 5, 120, 0, 0, 517, 518, 5, 121, 0, 0, 518, 519, 3, 460, 230, 0, 519, 520, 5, 19, 0, 0, 520, 521, 3, 470, 235, 0, 521, 522, 5, 35, 0, 0, 522, 13, 1, 0, 0, 0, 523, 529, 3, 18, 9, 0, 524, 529, 3, 20, 10, 0, 525, 529, 3, 48, 24, 0, 526, 529, 3, 42, 21, 0, 527, 529, 3, 46, 23, 0, 528, 523, 1, 0, 0, 0, 528, 524, 1, 0, 0, 0, 528, 525, 1, 0, 0, 0, 528, 526, 1, 0, 0, 0, 528, 527, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 5, 35, 0, 0, 531, 533, 1, 0, 0, 0, 532, 528, 1, 0, 0, 0, 533, 536, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 545, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 537, 539, 3, 2, 1, 0, 538, 537, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 1, 0, 0, 0, 540, 541, 3, 16, 8, 0, 541, 542, 5, 35, 0, 0, 542, 544, 1, 0, 0, 0, 543, 538, 1, 0, 0, 0, 544, 547, 1, 0, 0, 0, 545, 543, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 15, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 548, 553, 3, 50, 25, 0, 549, 553, 3, 58, 29, 0, 550, 553, 3, 56, 28, 0, 551, 553, 3, 74, 37, 0, 552, 548, 1, 0, 0, 0, 552, 549, 1, 0, 0, 0, 552, 550, 1, 0, 0, 0, 552, 551, 1, 0, 0, 0, 553, 17, 1, 0, 0, 0, 554, 555, 5, 77, 0, 0, 555, 556, 5, 78, 0, 0, 556, 557, 7, 0, 0, 0, 557, 558, 5, 121, 0, 0, 558, 559, 3, 476, 238, 0, 559, 19, 1, 0, 0, 0, 560, 569, 3, 22, 11, 0, 561, 569, 3, 24, 12, 0, 562, 569, 3, 26, 13, 0, 563, 569, 3, 28, 14, 0, 564, 569, 3, 30, 15, 0, 565, 569, 3, 32, 16, 0, 566, 569, 3, 34, 17, 0, 567, 569, 3, 40, 20, 0, 568, 560, 1, 0, 0, 0, 568, 561, 1, 0, 0, 0, 568, 562, 1, 0, 0, 0, 568, 563, 1, 0, 0, 0, 568, 564, 1, 0, 0, 0, 568, 565, 1, 0, 0, 0, 568, 566, 1, 0, 0, 0, 568, 567, 1, 0, 0, 0, 569, 21, 1, 0, 0, 0, 570, 571, 5, 77, 0, 0, 571, 572, 5, 63, 0, 0, 572, 573, 7, 1, 0, 0, 573, 23, 1, 0, 0, 0, 574, 575, 5, 77, 0, 0, 575, 576, 5, 78, 0, 0, 576, 577, 5, 71, 0, 0, 577, 578, 3, 470, 235, 0, 578, 25, 1, 0, 0, 0, 579, 580, 5, 77, 0, 0, 580, 581, 5, 62, 0, 0, 581, 582, 3, 470, 235, 0, 582, 27, 1, 0, 0, 0, 583, 584, 5, 77, 0, 0, 584, 585, 5, 73, 0, 0, 585, 586, 7, 1, 0, 0, 586, 29, 1, 0, 0, 0, 587, 588, 5, 77, 0, 0, 588, 589, 5, 134, 0, 0, 589, 590, 7, 2, 0, 0, 590, 31, 1, 0, 0, 0, 591, 592, 5, 77, 0, 0, 592, 593, 5, 78, 0, 0, 593, 594, 5, 132, 0, 0, 594, 595, 5, 88, 0, 0, 595, 596, 7, 3, 0, 0, 596, 33, 1, 0, 0, 0, 597, 598, 5, 77, 0, 0, 598, 599, 5, 75, 0, 0, 599, 600, 3, 36, 18, 0, 600, 601, 5, 30, 0, 0, 601, 602, 3, 38, 19, 0, 602, 35, 1, 0, 0, 0, 603, 604, 7, 4, 0, 0, 604, 37, 1, 0, 0, 0, 605, 606, 7, 5, 0, 0, 606, 39, 1, 0, 0, 0, 607, 612, 5, 77, 0, 0, 608, 609, 5, 82, 0, 0, 609, 613, 3, 456, 228, 0, 610, 611, 5, 78, 0, 0, 611, 613, 5, 82, 0, 0, 612, 608, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 613, 619, 1, 0, 0, 0, 614, 615, 5, 8, 0, 0, 615, 616, 5, 19, 0, 0, 616, 618, 3, 476, 238, 0, 617, 614, 1, 0, 0, 0, 618, 621, 1, 0, 0, 0, 619, 617, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 41, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 622, 623, 5, 106, 0, 0, 623, 625, 5, 143, 0, 0, 624, 626, 3, 44, 22, 0, 625, 624, 1, 0, 0, 0, 625, 626, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 637, 3, 470, 235, 0, 628, 629, 5, 60, 0, 0, 629, 634, 3, 470, 235, 0, 630, 631, 5, 30, 0, 0, 631, 633, 3, 470, 235, 0, 632, 630, 1, 0, 0, 0, 633, 636, 1, 0, 0, 0, 634, 632, 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 638, 1, 0, 0, 0, 636, 634, 1, 0, 0, 0, 637, 628, 1, 0, 0, 0, 637, 638, 1, 0, 0, 0, 638, 43, 1, 0, 0, 0, 639, 640, 5, 121, 0, 0, 640, 641, 3, 460, 230, 0, 641, 642, 5, 19, 0, 0, 642, 647, 1, 0, 0, 0, 643, 644, 5, 78, 0, 0, 644, 645, 5, 86, 0, 0, 645, 647, 5, 121, 0, 0, 646, 639, 1, 0, 0, 0, 646, 643, 1, 0, 0, 0, 647, 45, 1, 0, 0, 0, 648, 649, 5, 106, 0, 0, 649, 654, 5, 120, 0, 0, 650, 651, 5, 121, 0, 0, 651, 652, 3, 460, 230, 0, 652, 653, 5, 19, 0, 0, 653, 655, 1, 0, 0, 0, 654, 650, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 666, 3, 470, 235, 0, 657, 658, 5, 60, 0, 0, 658, 663, 3, 470, 235, 0, 659, 660, 5, 30, 0, 0, 660, 662, 3, 470, 235, 0, 661, 659, 1, 0, 0, 0, 662, 665, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 663, 664, 1, 0, 0, 0, 664, 667, 1, 0, 0, 0, 665, 663, 1, 0, 0, 0, 666, 657, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 47, 1, 0, 0, 0, 668, 669, 5, 77, 0, 0, 669, 670, 5, 121, 0, 0, 670, 671, 3, 460, 230, 0, 671, 672, 5, 19, 0, 0, 672, 673, 3, 470, 235, 0, 673, 49, 1, 0, 0, 0, 674, 675, 5, 77, 0, 0, 675, 676, 3, 64, 32, 0, 676, 677, 5, 166, 0, 0, 677, 678, 5, 44, 0, 0, 678, 680, 3, 264, 132, 0, 679, 681, 3, 376, 188, 0, 680, 679, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 689, 1, 0, 0, 0, 682, 683, 5, 34, 0, 0, 683, 690, 3, 52, 26, 0, 684, 687, 5, 95, 0, 0, 685, 686, 5, 34, 0, 0, 686, 688, 3, 54, 27, 0, 687, 685, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 690, 1, 0, 0, 0, 689, 682, 1, 0, 0, 0, 689, 684, 1, 0, 0, 0, 690, 51, 1, 0, 0, 0, 691, 692, 3, 78, 39, 0, 692, 53, 1, 0, 0, 0, 693, 694, 3, 78, 39, 0, 694, 55, 1, 0, 0, 0, 695, 696, 5, 77, 0, 0, 696, 697, 5, 74, 0, 0, 697, 700, 5, 112, 0, 0, 698, 699, 5, 58, 0, 0, 699, 701, 3, 380, 190, 0, 700, 698, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 709, 1, 0, 0, 0, 702, 703, 5, 34, 0, 0, 703, 710, 3, 78, 39, 0, 704, 707, 5, 95, 0, 0, 705, 706, 5, 34, 0, 0, 706, 708, 3, 78, 39, 0, 707, 705, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 708, 710, 1, 0, 0, 0, 709, 702, 1, 0, 0, 0, 709, 704, 1, 0, 0, 0, 710, 57, 1, 0, 0, 0, 711, 712, 5, 77, 0, 0, 712, 713, 3, 64, 32, 0, 713, 714, 5, 99, 0, 0, 714, 715, 3, 456, 228, 0, 715, 717, 5, 21, 0, 0, 716, 718, 3, 60, 30, 0, 717, 716, 1, 0, 0, 0, 717, 718, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 721, 5, 22, 0, 0, 720, 722, 3, 72, 36, 0, 721, 720, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 726, 3, 346, 173, 0, 724, 726, 5, 95, 0, 0, 725, 723, 1, 0, 0, 0, 725, 724, 1, 0, 0, 0, 726, 59, 1, 0, 0, 0, 727, 732, 3, 62, 31, 0, 728, 729, 5, 30, 0, 0, 729, 731, 3, 62, 31, 0, 730, 728, 1, 0, 0, 0, 731, 734, 1, 0, 0, 0, 732, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 61, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 735, 736, 5, 44, 0, 0, 736, 738, 3, 458, 229, 0, 737, 739, 3, 376, 188, 0, 738, 737, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 63, 1, 0, 0, 0, 740, 742, 3, 66, 33, 0, 741, 740, 1, 0, 0, 0, 742, 745, 1, 0, 0, 0, 743, 741, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 65, 1, 0, 0, 0, 745, 743, 1, 0, 0, 0, 746, 747, 5, 45, 0, 0, 747, 752, 3, 458, 229, 0, 748, 749, 5, 21, 0, 0, 749, 750, 3, 68, 34, 0, 750, 751, 5, 22, 0, 0, 751, 753, 1, 0, 0, 0, 752, 748, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 67, 1, 0, 0, 0, 754, 759, 3, 70, 35, 0, 755, 756, 5, 30, 0, 0, 756, 758, 3, 70, 35, 0, 757, 755, 1, 0, 0, 0, 758, 761, 1, 0, 0, 0, 759, 757, 1, 0, 0, 0, 759, 760, 1, 0, 0, 0, 760, 69, 1, 0, 0, 0, 761, 759, 1, 0, 0, 0, 762, 763, 3, 258, 129, 0, 763, 71, 1, 0, 0, 0, 764, 765, 5, 58, 0, 0, 765, 766, 3, 378, 189, 0, 766, 73, 1, 0, 0, 0, 767, 768, 5, 77, 0, 0, 768, 769, 5, 130, 0, 0, 769, 770, 3, 458, 229, 0, 770, 771, 3, 476, 238, 0, 771, 75, 1, 0, 0, 0, 772, 777, 3, 78, 39, 0, 773, 774, 5, 30, 0, 0, 774, 776, 3, 78, 39, 0, 775, 773, 1, 0, 0, 0, 776, 779, 1, 0, 0, 0, 777, 775, 1, 0, 0, 0, 777, 778, 1, 0, 0, 0, 778, 77, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 780, 789, 3, 80, 40, 0, 781, 789, 3, 126, 63, 0, 782, 789, 3, 130, 65, 0, 783, 789, 3, 136, 68, 0, 784, 789, 3, 156, 78, 0, 785, 789, 3, 142, 71, 0, 786, 789, 3, 144, 72, 0, 787, 789, 3, 168, 84, 0, 788, 780, 1, 0, 0, 0, 788, 781, 1, 0, 0, 0, 788, 782, 1, 0, 0, 0, 788, 783, 1, 0, 0, 0, 788, 784, 1, 0, 0, 0, 788, 785, 1, 0, 0, 0, 788, 786, 1, 0, 0, 0, 788, 787, 1, 0, 0, 0, 789, 79, 1, 0, 0, 0, 790, 794, 3, 82, 41, 0, 791, 793, 3, 84, 42, 0, 792, 791, 1, 0, 0, 0, 793, 796, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 797, 1, 0, 0, 0, 796, 794, 1, 0, 0, 0, 797, 798, 3, 124, 62, 0, 798, 81, 1, 0, 0, 0, 799, 803, 3, 86, 43, 0, 800, 803, 3, 94, 47, 0, 801, 803, 3, 98, 49, 0, 802, 799, 1, 0, 0, 0, 802, 800, 1, 0, 0, 0, 802, 801, 1, 0, 0, 0, 803, 83, 1, 0, 0, 0, 804, 810, 3, 82, 41, 0, 805, 810, 3, 112, 56, 0, 806, 810, 3, 114, 57, 0, 807, 810, 3, 120, 60, 0, 808, 810, 3, 110, 55, 0, 809, 804, 1, 0, 0, 0, 809, 805, 1, 0, 0, 0, 809, 806, 1, 0, 0, 0, 809, 807, 1, 0, 0, 0, 809, 808, 1, 0, 0, 0, 810, 85, 1, 0, 0, 0, 811, 812, 5, 98, 0, 0, 812, 817, 3, 88, 44, 0, 813, 814, 5, 30, 0, 0, 814, 816, 3, 88, 44, 0, 815, 813, 1, 0, 0, 0, 816, 819, 1, 0, 0, 0, 817, 815, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 87, 1, 0, 0, 0, 819, 817, 1, 0, 0, 0, 820, 821, 5, 44, 0, 0, 821, 823, 3, 264, 132, 0, 822, 824, 3, 376, 188, 0, 823, 822, 1, 0, 0, 0, 823, 824, 1, 0, 0, 0, 824, 826, 1, 0, 0, 0, 825, 827, 3, 90, 45, 0, 826, 825, 1, 0, 0, 0, 826, 827, 1, 0, 0, 0, 827, 829, 1, 0, 0, 0, 828, 830, 3, 92, 46, 0, 829, 828, 1, 0, 0, 0, 829, 830, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 832, 5, 107, 0, 0, 832, 833, 3, 78, 39, 0, 833, 89, 1, 0, 0, 0, 834, 835, 5, 53, 0, 0, 835, 836, 5, 88, 0, 0, 836, 91, 1, 0, 0, 0, 837, 838, 5, 60, 0, 0, 838, 839, 5, 44, 0, 0, 839, 840, 3, 264, 132, 0, 840, 93, 1, 0, 0, 0, 841, 842, 5, 116, 0, 0, 842, 847, 3, 96, 48, 0, 843, 844, 5, 30, 0, 0, 844, 846, 3, 96, 48, 0, 845, 843, 1, 0, 0, 0, 846, 849, 1, 0, 0, 0, 847, 845, 1, 0, 0, 0, 847, 848, 1, 0, 0, 0, 848, 95, 1, 0, 0, 0, 849, 847, 1, 0, 0, 0, 850, 851, 5, 44, 0, 0, 851, 853, 3, 264, 132, 0, 852, 854, 3, 376, 188, 0, 853, 852, 1, 0, 0, 0, 853, 854, 1, 0, 0, 0, 854, 855, 1, 0, 0, 0, 855, 856, 5, 34, 0, 0, 856, 857, 3, 78, 39, 0, 857, 97, 1, 0, 0, 0, 858, 861, 5, 98, 0, 0, 859, 862, 3, 100, 50, 0, 860, 862, 3, 102, 51, 0, 861, 859, 1, 0, 0, 0, 861, 860, 1, 0, 0, 0, 862, 99, 1, 0, 0, 0, 863, 864, 5, 159, 0, 0, 864, 865, 5, 170, 0, 0, 865, 866, 5, 44, 0, 0, 866, 868, 3, 458, 229, 0, 867, 869, 3, 376, 188, 0, 868, 867, 1, 0, 0, 0, 868, 869, 1, 0, 0, 0, 869, 870, 1, 0, 0, 0, 870, 871, 5, 107, 0, 0, 871, 872, 3, 78, 39, 0, 872, 874, 3, 104, 52, 0, 873, 875, 3, 106, 53, 0, 874, 873, 1, 0, 0, 0, 874, 875, 1, 0, 0, 0, 875, 101, 1, 0, 0, 0, 876, 877, 5, 147, 0, 0, 877, 878, 5, 170, 0, 0, 878, 879, 5, 44, 0, 0, 879, 881, 3, 458, 229, 0, 880, 882, 3, 376, 188, 0, 881, 880, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 884, 5, 107, 0, 0, 884, 885, 3, 78, 39, 0, 885, 886, 3, 104, 52, 0, 886, 887, 3, 106, 53, 0, 887, 103, 1, 0, 0, 0, 888, 889, 5, 150, 0, 0, 889, 890, 3, 108, 54, 0, 890, 891, 5, 168, 0, 0, 891, 892, 3, 78, 39, 0, 892, 105, 1, 0, 0, 0, 893, 895, 5, 129, 0, 0, 894, 893, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 897, 5, 91, 0, 0, 897, 898, 3, 108, 54, 0, 898, 899, 5, 168, 0, 0, 899, 900, 3, 78, 39, 0, 900, 107, 1, 0, 0, 0, 901, 902, 5, 44, 0, 0, 902, 904, 3, 456, 228, 0, 903, 901, 1, 0, 0, 0, 903, 904, 1, 0, 0, 0, 904, 906, 1, 0, 0, 0, 905, 907, 3, 92, 46, 0, 906, 905, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 911, 1, 0, 0, 0, 908, 909, 5, 139, 0, 0, 909, 910, 5, 44, 0, 0, 910, 912, 3, 456, 228, 0, 911, 908, 1, 0, 0, 0, 911, 912, 1, 0, 0, 0, 912, 916, 1, 0, 0, 0, 913, 914, 5, 123, 0, 0, 914, 915, 5, 44, 0, 0, 915, 917, 3, 456, 228, 0, 916, 913, 1, 0, 0, 0, 916, 917, 1, 0, 0, 0, 917, 109, 1, 0, 0, 0, 918, 919, 5, 76, 0, 0, 919, 920, 5, 44, 0, 0, 920, 921, 3, 264, 132, 0, 921, 111, 1, 0, 0, 0, 922, 923, 5, 169, 0, 0, 923, 924, 3, 78, 39, 0, 924, 113, 1, 0, 0, 0, 925, 926, 5, 102, 0, 0, 926, 927, 5, 65, 0, 0, 927, 928, 3, 116, 58, 0, 928, 115, 1, 0, 0, 0, 929, 934, 3, 118, 59, 0, 930, 931, 5, 30, 0, 0, 931, 933, 3, 118, 59, 0, 932, 930, 1, 0, 0, 0, 933, 936, 1, 0, 0, 0, 934, 932, 1, 0, 0, 0, 934, 935, 1, 0, 0, 0, 935, 117, 1, 0, 0, 0, 936, 934, 1, 0, 0, 0, 937, 938, 5, 44, 0, 0, 938, 944, 3, 264, 132, 0, 939, 941, 3, 376, 188, 0, 940, 939, 1, 0, 0, 0, 940, 941, 1, 0, 0, 0, 941, 942, 1, 0, 0, 0, 942, 943, 5, 34, 0, 0, 943, 945, 3, 78, 39, 0, 944, 940, 1, 0, 0, 0, 944, 945, 1, 0, 0, 0, 945, 948, 1, 0, 0, 0, 946, 947, 5, 71, 0, 0, 947, 949, 3, 470, 235, 0, 948, 946, 1, 0, 0, 0, 948, 949, 1, 0, 0, 0, 949, 119, 1, 0, 0, 0, 950, 952, 5, 149, 0, 0, 951, 950, 1, 0, 0, 0, 951, 952, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 954, 5, 132, 0, 0, 954, 955, 5, 65, 0, 0, 955, 960, 3, 122, 61, 0, 956, 957, 5, 30, 0, 0, 957, 959, 3, 122, 61, 0, 958, 956, 1, 0, 0, 0, 959, 962, 1, 0, 0, 0, 960, 958, 1, 0, 0, 0, 960, 961, 1, 0, 0, 0, 961, 121, 1, 0, 0, 0, 962, 960, 1, 0, 0, 0, 963, 966, 3, 78, 39, 0, 964, 967, 5, 59, 0, 0, 965, 967, 5, 81, 0, 0, 966, 964, 1, 0, 0, 0, 966, 965, 1, 0, 0, 0, 966, 967, 1, 0, 0, 0, 967, 973, 1, 0, 0, 0, 968, 971, 5, 88, 0, 0, 969, 972, 5, 101, 0, 0, 970, 972, 5, 115, 0, 0, 971, 969, 1, 0, 0, 0, 971, 970, 1, 0, 0, 0, 972, 974, 1, 0, 0, 0, 973, 968, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 977, 1, 0, 0, 0, 975, 976, 5, 71, 0, 0, 976, 978, 3, 470, 235, 0, 977, 975, 1, 0, 0, 0, 977, 978, 1, 0, 0, 0, 978, 123, 1, 0, 0, 0, 979, 980, 5, 141, 0, 0, 980, 981, 3, 78, 39, 0, 981, 125, 1, 0, 0, 0, 982, 985, 5, 148, 0, 0, 983, 985, 5, 93, 0, 0, 984, 982, 1, 0, 0, 0, 984, 983, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 991, 3, 128, 64, 0, 987, 988, 5, 30, 0, 0, 988, 990, 3, 128, 64, 0, 989, 987, 1, 0, 0, 0, 990, 993, 1, 0, 0, 0, 991, 989, 1, 0, 0, 0, 991, 992, 1, 0, 0, 0, 992, 994, 1, 0, 0, 0, 993, 991, 1, 0, 0, 0, 994, 995, 5, 142, 0, 0, 995, 996, 3, 78, 39, 0, 996, 127, 1, 0, 0, 0, 997, 998, 5, 44, 0, 0, 998, 1000, 3, 264, 132, 0, 999, 1001, 3, 376, 188, 0, 1000, 999, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1003, 5, 107, 0, 0, 1003, 1004, 3, 78, 39, 0, 1004, 129, 1, 0, 0, 0, 1005, 1006, 5, 153, 0, 0, 1006, 1007, 5, 21, 0, 0, 1007, 1008, 3, 76, 38, 0, 1008, 1010, 5, 22, 0, 0, 1009, 1011, 3, 132, 66, 0, 1010, 1009, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1010, 1, 0, 0, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1015, 5, 78, 0, 0, 1015, 1016, 5, 141, 0, 0, 1016, 1017, 3, 78, 39, 0, 1017, 131, 1, 0, 0, 0, 1018, 1019, 5, 66, 0, 0, 1019, 1021, 3, 134, 67, 0, 1020, 1018, 1, 0, 0, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1020, 1, 0, 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 5, 141, 0, 0, 1025, 1026, 3, 78, 39, 0, 1026, 133, 1, 0, 0, 0, 1027, 1028, 3, 78, 39, 0, 1028, 135, 1, 0, 0, 0, 1029, 1030, 5, 161, 0, 0, 1030, 1031, 5, 21, 0, 0, 1031, 1032, 3, 76, 38, 0, 1032, 1034, 5, 22, 0, 0, 1033, 1035, 3, 138, 69, 0, 1034, 1033, 1, 0, 0, 0, 1035, 1036, 1, 0, 0, 0, 1036, 1034, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1041, 5, 78, 0, 0, 1039, 1040, 5, 44, 0, 0, 1040, 1042, 3, 264, 132, 0, 1041, 1039, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1044, 5, 141, 0, 0, 1044, 1045, 3, 78, 39, 0, 1045, 137, 1, 0, 0, 0, 1046, 1051, 5, 66, 0, 0, 1047, 1048, 5, 44, 0, 0, 1048, 1049, 3, 264, 132, 0, 1049, 1050, 5, 58, 0, 0, 1050, 1052, 1, 0, 0, 0, 1051, 1047, 1, 0, 0, 0, 1051, 1052, 1, 0, 0, 0, 1052, 1053, 1, 0, 0, 0, 1053, 1054, 3, 140, 70, 0, 1054, 1055, 5, 141, 0, 0, 1055, 1056, 3, 78, 39, 0, 1056, 139, 1, 0, 0, 0, 1057, 1062, 3, 378, 189, 0, 1058, 1059, 5, 39, 0, 0, 1059, 1061, 3, 378, 189, 0, 1060, 1058, 1, 0, 0, 0, 1061, 1064, 1, 0, 0, 0, 1062, 1060, 1, 0, 0, 0, 1062, 1063, 1, 0, 0, 0, 1063, 141, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1065, 1066, 5, 105, 0, 0, 1066, 1067, 5, 21, 0, 0, 1067, 1068, 3, 76, 38, 0, 1068, 1069, 5, 22, 0, 0, 1069, 1070, 5, 155, 0, 0, 1070, 1071, 3, 78, 39, 0, 1071, 1072, 5, 87, 0, 0, 1072, 1073, 3, 78, 39, 0, 1073, 143, 1, 0, 0, 0, 1074, 1076, 3, 146, 73, 0, 1075, 1077, 3, 150, 75, 0, 1076, 1075, 1, 0, 0, 0, 1077, 1078, 1, 0, 0, 0, 1078, 1076, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 145, 1, 0, 0, 0, 1080, 1081, 5, 158, 0, 0, 1081, 1082, 3, 148, 74, 0, 1082, 147, 1, 0, 0, 0, 1083, 1084, 3, 152, 76, 0, 1084, 149, 1, 0, 0, 0, 1085, 1092, 5, 69, 0, 0, 1086, 1093, 3, 154, 77, 0, 1087, 1088, 5, 21, 0, 0, 1088, 1089, 5, 44, 0, 0, 1089, 1090, 3, 264, 132, 0, 1090, 1091, 5, 22, 0, 0, 1091, 1093, 1, 0, 0, 0, 1092, 1086, 1, 0, 0, 0, 1092, 1087, 1, 0, 0, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1095, 3, 152, 76, 0, 1095, 151, 1, 0, 0, 0, 1096, 1098, 5, 25, 0, 0, 1097, 1099, 3, 76, 38, 0, 1098, 1097, 1, 0, 0, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 1, 0, 0, 0, 1100, 1101, 5, 26, 0, 0, 1101, 153, 1, 0, 0, 0, 1102, 1107, 3, 238, 119, 0, 1103, 1104, 5, 39, 0, 0, 1104, 1106, 3, 238, 119, 0, 1105, 1103, 1, 0, 0, 0, 1106, 1109, 1, 0, 0, 0, 1107, 1105, 1, 0, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 155, 1, 0, 0, 0, 1109, 1107, 1, 0, 0, 0, 1110, 1116, 5, 164, 0, 0, 1111, 1117, 3, 158, 79, 0, 1112, 1117, 3, 160, 80, 0, 1113, 1117, 3, 162, 81, 0, 1114, 1117, 3, 164, 82, 0, 1115, 1117, 3, 166, 83, 0, 1116, 1111, 1, 0, 0, 0, 1116, 1112, 1, 0, 0, 0, 1116, 1113, 1, 0, 0, 0, 1116, 1114, 1, 0, 0, 0, 1116, 1115, 1, 0, 0, 0, 1117, 157, 1, 0, 0, 0, 1118, 1119, 5, 177, 0, 0, 1119, 1120, 3, 76, 38, 0, 1120, 1121, 5, 178, 0, 0, 1121, 1122, 3, 78, 39, 0, 1122, 159, 1, 0, 0, 0, 1123, 1124, 5, 179, 0, 0, 1124, 1125, 3, 76, 38, 0, 1125, 1126, 5, 178, 0, 0, 1126, 1127, 3, 78, 39, 0, 1127, 161, 1, 0, 0, 0, 1128, 1129, 5, 180, 0, 0, 1129, 1130, 3, 78, 39, 0, 1130, 1131, 7, 6, 0, 0, 1131, 1132, 3, 78, 39, 0, 1132, 163, 1, 0, 0, 0, 1133, 1134, 5, 182, 0, 0, 1134, 1135, 3, 78, 39, 0, 1135, 165, 1, 0, 0, 0, 1136, 1137, 5, 183, 0, 0, 1137, 1138, 3, 78, 39, 0, 1138, 1139, 5, 58, 0, 0, 1139, 1140, 3, 78, 39, 0, 1140, 167, 1, 0, 0, 0, 1141, 1146, 3, 170, 85, 0, 1142, 1143, 5, 131, 0, 0, 1143, 1145, 3, 170, 85, 0, 1144, 1142, 1, 0, 0, 0, 1145, 1148, 1, 0, 0, 0, 1146, 1144, 1, 0, 0, 0, 1146, 1147, 1, 0, 0, 0, 1147, 169, 1, 0, 0, 0, 1148, 1146, 1, 0, 0, 0, 1149, 1154, 3, 172, 86, 0, 1150, 1151, 5, 56, 0, 0, 1151, 1153, 3, 172, 86, 0, 1152, 1150, 1, 0, 0, 0, 1153, 1156, 1, 0, 0, 0, 1154, 1152, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 171, 1, 0, 0, 0, 1156, 1154, 1, 0, 0, 0, 1157, 1165, 3, 174, 87, 0, 1158, 1162, 3, 204, 102, 0, 1159, 1162, 3, 202, 101, 0, 1160, 1162, 3, 206, 103, 0, 1161, 1158, 1, 0, 0, 0, 1161, 1159, 1, 0, 0, 0, 1161, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1164, 3, 174, 87, 0, 1164, 1166, 1, 0, 0, 0, 1165, 1161, 1, 0, 0, 0, 1165, 1166, 1, 0, 0, 0, 1166, 173, 1, 0, 0, 0, 1167, 1172, 3, 176, 88, 0, 1168, 1169, 5, 51, 0, 0, 1169, 1171, 3, 176, 88, 0, 1170, 1168, 1, 0, 0, 0, 1171, 1174, 1, 0, 0, 0, 1172, 1170, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 175, 1, 0, 0, 0, 1174, 1172, 1, 0, 0, 0, 1175, 1178, 3, 178, 89, 0, 1176, 1177, 5, 156, 0, 0, 1177, 1179, 3, 178, 89, 0, 1178, 1176, 1, 0, 0, 0, 1178, 1179, 1, 0, 0, 0, 1179, 177, 1, 0, 0, 0, 1180, 1185, 3, 180, 90, 0, 1181, 1182, 7, 7, 0, 0, 1182, 1184, 3, 180, 90, 0, 1183, 1181, 1, 0, 0, 0, 1184, 1187, 1, 0, 0, 0, 1185, 1183, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 179, 1, 0, 0, 0, 1187, 1185, 1, 0, 0, 0, 1188, 1193, 3, 182, 91, 0, 1189, 1190, 7, 8, 0, 0, 1190, 1192, 3, 182, 91, 0, 1191, 1189, 1, 0, 0, 0, 1192, 1195, 1, 0, 0, 0, 1193, 1191, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 181, 1, 0, 0, 0, 1195, 1193, 1, 0, 0, 0, 1196, 1201, 3, 184, 92, 0, 1197, 1198, 7, 9, 0, 0, 1198, 1200, 3, 184, 92, 0, 1199, 1197, 1, 0, 0, 0, 1200, 1203, 1, 0, 0, 0, 1201, 1199, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 183, 1, 0, 0, 0, 1203, 1201, 1, 0, 0, 0, 1204, 1209, 3, 186, 93, 0, 1205, 1206, 7, 10, 0, 0, 1206, 1208, 3, 186, 93, 0, 1207, 1205, 1, 0, 0, 0, 1208, 1211, 1, 0, 0, 0, 1209, 1207, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 185, 1, 0, 0, 0, 1211, 1209, 1, 0, 0, 0, 1212, 1216, 3, 188, 94, 0, 1213, 1214, 5, 109, 0, 0, 1214, 1215, 5, 128, 0, 0, 1215, 1217, 3, 378, 189, 0, 1216, 1213, 1, 0, 0, 0, 1216, 1217, 1, 0, 0, 0, 1217, 187, 1, 0, 0, 0, 1218, 1222, 3, 190, 95, 0, 1219, 1220, 5, 157, 0, 0, 1220, 1221, 5, 58, 0, 0, 1221, 1223, 3, 378, 189, 0, 1222, 1219, 1, 0, 0, 0, 1222, 1223, 1, 0, 0, 0, 1223, 189, 1, 0, 0, 0, 1224, 1228, 3, 192, 96, 0, 1225, 1226, 5, 68, 0, 0, 1226, 1227, 5, 58, 0, 0, 1227, 1229, 3, 374, 187, 0, 1228, 1225, 1, 0, 0, 0, 1228, 1229, 1, 0, 0, 0, 1229, 191, 1, 0, 0, 0, 1230, 1234, 3, 194, 97, 0, 1231, 1232, 5, 67, 0, 0, 1232, 1233, 5, 58, 0, 0, 1233, 1235, 3, 374, 187, 0, 1234, 1231, 1, 0, 0, 0, 1234, 1235, 1, 0, 0, 0, 1235, 193, 1, 0, 0, 0, 1236, 1241, 3, 198, 99, 0, 1237, 1238, 5, 49, 0, 0, 1238, 1240, 3, 196, 98, 0, 1239, 1237, 1, 0, 0, 0, 1240, 1243, 1, 0, 0, 0, 1241, 1239, 1, 0, 0, 0, 1241, 1242, 1, 0, 0, 0, 1242, 195, 1, 0, 0, 0, 1243, 1241, 1, 0, 0, 0, 1244, 1245, 3, 254, 127, 0, 1245, 1246, 3, 244, 122, 0, 1246, 197, 1, 0, 0, 0, 1247, 1249, 7, 7, 0, 0, 1248, 1247, 1, 0, 0, 0, 1249, 1252, 1, 0, 0, 0, 1250, 1248, 1, 0, 0, 0, 1250, 1251, 1, 0, 0, 0, 1251, 1253, 1, 0, 0, 0, 1252, 1250, 1, 0, 0, 0, 1253, 1254, 3, 200, 100, 0, 1254, 199, 1, 0, 0, 0, 1255, 1259, 3, 208, 104, 0, 1256, 1259, 3, 212, 106, 0, 1257, 1259, 3, 214, 107, 0, 1258, 1255, 1, 0, 0, 0, 1258, 1256, 1, 0, 0, 0, 1258, 1257, 1, 0, 0, 0, 1259, 201, 1, 0, 0, 0, 1260, 1269, 5, 19, 0, 0, 1261, 1269, 5, 20, 0, 0, 1262, 1269, 5, 40, 0, 0, 1263, 1264, 5, 40, 0, 0, 1264, 1269, 5, 19, 0, 0, 1265, 1269, 5, 41, 0, 0, 1266, 1267, 5, 41, 0, 0, 1267, 1269, 5, 19, 0, 0, 1268, 1260, 1, 0, 0, 0, 1268, 1261, 1, 0, 0, 0, 1268, 1262, 1, 0, 0, 0, 1268, 1263, 1, 0, 0, 0, 1268, 1265, 1, 0, 0, 0, 1268, 1266, 1, 0, 0, 0, 1269, 203, 1, 0, 0, 0, 1270, 1271, 7, 11, 0, 0, 1271, 205, 1, 0, 0, 0, 1272, 1278, 5, 111, 0, 0, 1273, 1274, 5, 40, 0, 0, 1274, 1278, 5, 40, 0, 0, 1275, 1276, 5, 41, 0, 0, 1276, 1278, 5, 41, 0, 0, 1277, 1272, 1, 0, 0, 0, 1277, 1273, 1, 0, 0, 0, 1277, 1275, 1, 0, 0, 0, 1278, 207, 1, 0, 0, 0, 1279, 1283, 5, 165, 0, 0, 1280, 1284, 3, 210, 105, 0, 1281, 1282, 7, 12, 0, 0, 1282, 1284, 3, 420, 210, 0, 1283, 1280, 1, 0, 0, 0, 1283, 1281, 1, 0, 0, 0, 1283, 1284, 1, 0, 0, 0, 1284, 1285, 1, 0, 0, 0, 1285, 1286, 3, 152, 76, 0, 1286, 209, 1, 0, 0, 0, 1287, 1288, 7, 13, 0, 0, 1288, 211, 1, 0, 0, 0, 1289, 1291, 5, 17, 0, 0, 1290, 1289, 1, 0, 0, 0, 1291, 1292, 1, 0, 0, 0, 1292, 1290, 1, 0, 0, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 5, 25, 0, 0, 1295, 1296, 3, 76, 38, 0, 1296, 1297, 5, 26, 0, 0, 1297, 213, 1, 0, 0, 0, 1298, 1303, 3, 216, 108, 0, 1299, 1300, 5, 46, 0, 0, 1300, 1302, 3, 216, 108, 0, 1301, 1299, 1, 0, 0, 0, 1302, 1305, 1, 0, 0, 0, 1303, 1301, 1, 0, 0, 0, 1303, 1304, 1, 0, 0, 0, 1304, 215, 1, 0, 0, 0, 1305, 1303, 1, 0, 0, 0, 1306, 1308, 5, 36, 0, 0, 1307, 1309, 3, 218, 109, 0, 1308, 1307, 1, 0, 0, 0, 1308, 1309, 1, 0, 0, 0, 1309, 1314, 1, 0, 0, 0, 1310, 1311, 5, 37, 0, 0, 1311, 1314, 3, 218, 109, 0, 1312, 1314, 3, 218, 109, 0, 1313, 1306, 1, 0, 0, 0, 1313, 1310, 1, 0, 0, 0, 1313, 1312, 1, 0, 0, 0, 1314, 217, 1, 0, 0, 0, 1315, 1320, 3, 220, 110, 0, 1316, 1317, 7, 14, 0, 0, 1317, 1319, 3, 220, 110, 0, 1318, 1316, 1, 0, 0, 0, 1319, 1322, 1, 0, 0, 0, 1320, 1318, 1, 0, 0, 0, 1320, 1321, 1, 0, 0, 0, 1321, 219, 1, 0, 0, 0, 1322, 1320, 1, 0, 0, 0, 1323, 1326, 3, 242, 121, 0, 1324, 1326, 3, 222, 111, 0, 1325, 1323, 1, 0, 0, 0, 1325, 1324, 1, 0, 0, 0, 1326, 221, 1, 0, 0, 0, 1327, 1330, 3, 230, 115, 0, 1328, 1330, 3, 224, 112, 0, 1329, 1327, 1, 0, 0, 0, 1329, 1328, 1, 0, 0, 0, 1330, 1331, 1, 0, 0, 0, 1331, 1332, 3, 246, 123, 0, 1332, 223, 1, 0, 0, 0, 1333, 1334, 3, 226, 113, 0, 1334, 1335, 3, 236, 118, 0, 1335, 1338, 1, 0, 0, 0, 1336, 1338, 3, 228, 114, 0, 1337, 1333, 1, 0, 0, 0, 1337, 1336, 1, 0, 0, 0, 1338, 225, 1, 0, 0, 0, 1339, 1340, 7, 15, 0, 0, 1340, 1341, 5, 33, 0, 0, 1341, 1342, 5, 33, 0, 0, 1342, 227, 1, 0, 0, 0, 1343, 1345, 5, 43, 0, 0, 1344, 1343, 1, 0, 0, 0, 1344, 1345, 1, 0, 0, 0, 1345, 1346, 1, 0, 0, 0, 1346, 1347, 3, 236, 118, 0, 1347, 229, 1, 0, 0, 0, 1348, 1349, 3, 232, 116, 0, 1349, 1350, 3, 236, 118, 0, 1350, 1353, 1, 0, 0, 0, 1351, 1353, 3, 234, 117, 0, 1352, 1348, 1, 0, 0, 0, 1352, 1351, 1, 0, 0, 0, 1353, 231, 1, 0, 0, 0, 1354, 1355, 7, 16, 0, 0, 1355, 1356, 5, 33, 0, 0, 1356, 1357, 5, 33, 0, 0, 1357, 233, 1, 0, 0, 0, 1358, 1359, 5, 32, 0, 0, 1359, 235, 1, 0, 0, 0, 1360, 1363, 3, 238, 119, 0, 1361, 1363, 3, 384, 192, 0, 1362, 1360, 1, 0, 0, 0, 1362, 1361, 1, 0, 0, 0, 1363, 237, 1, 0, 0, 0, 1364, 1367, 3, 456, 228, 0, 1365, 1367, 3, 240, 120, 0, 1366, 1364, 1, 0, 0, 0, 1366, 1365, 1, 0, 0, 0, 1367, 239, 1, 0, 0, 0, 1368, 1372, 5, 27, 0, 0, 1369, 1372, 5, 186, 0, 0, 1370, 1372, 5, 187, 0, 0, 1371, 1368, 1, 0, 0, 0, 1371, 1369, 1, 0, 0, 0, 1371, 1370, 1, 0, 0, 0, 1372, 241, 1, 0, 0, 0, 1373, 1379, 3, 256, 128, 0, 1374, 1378, 3, 248, 124, 0, 1375, 1378, 3, 244, 122, 0, 1376, 1378, 3, 250, 125, 0, 1377, 1374, 1, 0, 0, 0, 1377, 1375, 1, 0, 0, 0, 1377, 1376, 1, 0, 0, 0, 1378, 1381, 1, 0, 0, 0, 1379, 1377, 1, 0, 0, 0, 1379, 1380, 1, 0, 0, 0, 1380, 243, 1, 0, 0, 0, 1381, 1379, 1, 0, 0, 0, 1382, 1391, 5, 21, 0, 0, 1383, 1388, 3, 276, 138, 0, 1384, 1385, 5, 30, 0, 0, 1385, 1387, 3, 276, 138, 0, 1386, 1384, 1, 0, 0, 0, 1387, 1390, 1, 0, 0, 0, 1388, 1386, 1, 0, 0, 0, 1388, 1389, 1, 0, 0, 0, 1389, 1392, 1, 0, 0, 0, 1390, 1388, 1, 0, 0, 0, 1391, 1383, 1, 0, 0, 0, 1391, 1392, 1, 0, 0, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1394, 5, 22, 0, 0, 1394, 245, 1, 0, 0, 0, 1395, 1397, 3, 248, 124, 0, 1396, 1395, 1, 0, 0, 0, 1397, 1400, 1, 0, 0, 0, 1398, 1396, 1, 0, 0, 0, 1398, 1399, 1, 0, 0, 0, 1399, 247, 1, 0, 0, 0, 1400, 1398, 1, 0, 0, 0, 1401, 1402, 5, 23, 0, 0, 1402, 1403, 3, 76, 38, 0, 1403, 1404, 5, 24, 0, 0, 1404, 249, 1, 0, 0, 0, 1405, 1406, 5, 42, 0, 0, 1406, 1407, 3, 252, 126, 0, 1407, 251, 1, 0, 0, 0, 1408, 1413, 3, 460, 230, 0, 1409, 1413, 5, 5, 0, 0, 1410, 1413, 3, 266, 133, 0, 1411, 1413, 5, 27, 0, 0, 1412, 1408, 1, 0, 0, 0, 1412, 1409, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1412, 1411, 1, 0, 0, 0, 1413, 253, 1, 0, 0, 0, 1414, 1418, 3, 456, 228, 0, 1415, 1418, 3, 262, 131, 0, 1416, 1418, 3, 266, 133, 0, 1417, 1414, 1, 0, 0, 0, 1417, 1415, 1, 0, 0, 0, 1417, 1416, 1, 0, 0, 0, 1418, 255, 1, 0, 0, 0, 1419, 1433, 3, 258, 129, 0, 1420, 1433, 3, 262, 131, 0, 1421, 1433, 3, 266, 133, 0, 1422, 1433, 3, 268, 134, 0, 1423, 1433, 3, 274, 137, 0, 1424, 1433, 3, 270, 135, 0, 1425, 1433, 3, 272, 136, 0, 1426, 1433, 3, 278, 139, 0, 1427, 1433, 3, 340, 170, 0, 1428, 1433, 3, 348, 174, 0, 1429, 1433, 3, 352, 176, 0, 1430, 1433, 3, 358, 179, 0, 1431, 1433, 3, 372, 186, 0, 1432, 1419, 1, 0, 0, 0, 1432, 1420, 1, 0, 0, 0, 1432, 1421, 1, 0, 0, 0, 1432, 1422, 1, 0, 0, 0, 1432, 1423, 1, 0, 0, 0, 1432, 1424, 1, 0, 0, 0, 1432, 1425, 1, 0, 0, 0, 1432, 1426, 1, 0, 0, 0, 1432, 1427, 1, 0, 0, 0, 1432, 1428, 1, 0, 0, 0, 1432, 1429, 1, 0, 0, 0, 1432, 1430, 1, 0, 0, 0, 1432, 1431, 1, 0, 0, 0, 1433, 257, 1, 0, 0, 0, 1434, 1437, 3, 260, 130, 0, 1435, 1437, 3, 476, 238, 0, 1436, 1434, 1, 0, 0, 0, 1436, 1435, 1, 0, 0, 0, 1437, 259, 1, 0, 0, 0, 1438, 1439, 7, 17, 0, 0, 1439, 261, 1, 0, 0, 0, 1440, 1441, 5, 44, 0, 0, 1441, 1442, 3, 456, 228, 0, 1442, 263, 1, 0, 0, 0, 1443, 1444, 3, 456, 228, 0, 1444, 265, 1, 0, 0, 0, 1445, 1447, 5, 21, 0, 0, 1446, 1448, 3, 76, 38, 0, 1447, 1446, 1, 0, 0, 0, 1447, 1448, 1, 0, 0, 0, 1448, 1449, 1, 0, 0, 0, 1449, 1450, 5, 22, 0, 0, 1450, 267, 1, 0, 0, 0, 1451, 1452, 5, 31, 0, 0, 1452, 269, 1, 0, 0, 0, 1453, 1454, 5, 133, 0, 0, 1454, 1455, 3, 152, 76, 0, 1455, 271, 1, 0, 0, 0, 1456, 1457, 5, 163, 0, 0, 1457, 1458, 3, 152, 76, 0, 1458, 273, 1, 0, 0, 0, 1459, 1460, 3, 456, 228, 0, 1460, 1461, 3, 244, 122, 0, 1461, 275, 1, 0, 0, 0, 1462, 1465, 3, 78, 39, 0, 1463, 1465, 5, 42, 0, 0, 1464, 1462, 1, 0, 0, 0, 1464, 1463, 1, 0, 0, 0, 1465, 277, 1, 0, 0, 0, 1466, 1469, 3, 280, 140, 0, 1467, 1469, 3, 302, 151, 0, 1468, 1466, 1, 0, 0, 0, 1468, 1467, 1, 0, 0, 0, 1469, 279, 1, 0, 0, 0, 1470, 1474, 3, 282, 141, 0, 1471, 1474, 3, 284, 142, 0, 1472, 1474, 7, 18, 0, 0, 1473, 1470, 1, 0, 0, 0, 1473, 1471, 1, 0, 0, 0, 1473, 1472, 1, 0, 0, 0, 1474, 281, 1, 0, 0, 0, 1475, 1476, 5, 40, 0, 0, 1476, 1477, 3, 458, 229, 0, 1477, 1478, 3, 286, 143, 0, 1478, 1482, 5, 41, 0, 0, 1479, 1481, 3, 298, 149, 0, 1480, 1479, 1, 0, 0, 0, 1481, 1484, 1, 0, 0, 0, 1482, 1480, 1, 0, 0, 0, 1482, 1483, 1, 0, 0, 0, 1483, 1485, 1, 0, 0, 0, 1484, 1482, 1, 0, 0, 0, 1485, 1486, 5, 40, 0, 0, 1486, 1487, 5, 36, 0, 0, 1487, 1488, 3, 458, 229, 0, 1488, 1489, 5, 41, 0, 0, 1489, 283, 1, 0, 0, 0, 1490, 1491, 5, 40, 0, 0, 1491, 1492, 3, 458, 229, 0, 1492, 1493, 3, 286, 143, 0, 1493, 1494, 5, 36, 0, 0, 1494, 1495, 5, 41, 0, 0, 1495, 285, 1, 0, 0, 0, 1496, 1497, 3, 458, 229, 0, 1497, 1498, 5, 19, 0, 0, 1498, 1499, 3, 292, 146, 0, 1499, 1501, 1, 0, 0, 0, 1500, 1496, 1, 0, 0, 0, 1501, 1504, 1, 0, 0, 0, 1502, 1500, 1, 0, 0, 0, 1502, 1503, 1, 0, 0, 0, 1503, 287, 1, 0, 0, 0, 1504, 1502, 1, 0, 0, 0, 1505, 1512, 5, 11, 0, 0, 1506, 1511, 5, 9, 0, 0, 1507, 1511, 5, 10, 0, 0, 1508, 1511, 5, 1, 0, 0, 1509, 1511, 3, 294, 147, 0, 1510, 1506, 1, 0, 0, 0, 1510, 1507, 1, 0, 0, 0, 1510, 1508, 1, 0, 0, 0, 1510, 1509, 1, 0, 0, 0, 1511, 1514, 1, 0, 0, 0, 1512, 1510, 1, 0, 0, 0, 1512, 1513, 1, 0, 0, 0, 1513, 1515, 1, 0, 0, 0, 1514, 1512, 1, 0, 0, 0, 1515, 1516, 5, 11, 0, 0, 1516, 289, 1, 0, 0, 0, 1517, 1524, 5, 12, 0, 0, 1518, 1523, 5, 9, 0, 0, 1519, 1523, 5, 10, 0, 0, 1520, 1523, 5, 2, 0, 0, 1521, 1523, 3, 296, 148, 0, 1522, 1518, 1, 0, 0, 0, 1522, 1519, 1, 0, 0, 0, 1522, 1520, 1, 0, 0, 0, 1522, 1521, 1, 0, 0, 0, 1523, 1526, 1, 0, 0, 0, 1524, 1522, 1, 0, 0, 0, 1524, 1525, 1, 0, 0, 0, 1525, 1527, 1, 0, 0, 0, 1526, 1524, 1, 0, 0, 0, 1527, 1528, 5, 12, 0, 0, 1528, 291, 1, 0, 0, 0, 1529, 1532, 3, 288, 144, 0, 1530, 1532, 3, 290, 145, 0, 1531, 1529, 1, 0, 0, 0, 1531, 1530, 1, 0, 0, 0, 1532, 293, 1, 0, 0, 0, 1533, 1535, 5, 196, 0, 0, 1534, 1533, 1, 0, 0, 0, 1535, 1536, 1, 0, 0, 0, 1536, 1534, 1, 0, 0, 0, 1536, 1537, 1, 0, 0, 0, 1537, 1547, 1, 0, 0, 0, 1538, 1547, 5, 3, 0, 0, 1539, 1547, 5, 4, 0, 0, 1540, 1547, 3, 288, 144, 0, 1541, 1543, 5, 25, 0, 0, 1542, 1544, 3, 76, 38, 0, 1543, 1542, 1, 0, 0, 0, 1543, 1544, 1, 0, 0, 0, 1544, 1545, 1, 0, 0, 0, 1545, 1547, 5, 26, 0, 0, 1546, 1534, 1, 0, 0, 0, 1546, 1538, 1, 0, 0, 0, 1546, 1539, 1, 0, 0, 0, 1546, 1540, 1, 0, 0, 0, 1546, 1541, 1, 0, 0, 0, 1547, 295, 1, 0, 0, 0, 1548, 1550, 5, 196, 0, 0, 1549, 1548, 1, 0, 0, 0, 1550, 1551, 1, 0, 0, 0, 1551, 1549, 1, 0, 0, 0, 1551, 1552, 1, 0, 0, 0, 1552, 1562, 1, 0, 0, 0, 1553, 1562, 5, 3, 0, 0, 1554, 1562, 5, 4, 0, 0, 1555, 1562, 3, 290, 145, 0, 1556, 1558, 5, 25, 0, 0, 1557, 1559, 3, 76, 38, 0, 1558, 1557, 1, 0, 0, 0, 1558, 1559, 1, 0, 0, 0, 1559, 1560, 1, 0, 0, 0, 1560, 1562, 5, 26, 0, 0, 1561, 1549, 1, 0, 0, 0, 1561, 1553, 1, 0, 0, 0, 1561, 1554, 1, 0, 0, 0, 1561, 1555, 1, 0, 0, 0, 1561, 1556, 1, 0, 0, 0, 1562, 297, 1, 0, 0, 0, 1563, 1570, 3, 280, 140, 0, 1564, 1570, 3, 300, 150, 0, 1565, 1570, 5, 16, 0, 0, 1566, 1570, 5, 11, 0, 0, 1567, 1570, 5, 12, 0, 0, 1568, 1570, 3, 482, 241, 0, 1569, 1563, 1, 0, 0, 0, 1569, 1564, 1, 0, 0, 0, 1569, 1565, 1, 0, 0, 0, 1569, 1566, 1, 0, 0, 0, 1569, 1567, 1, 0, 0, 0, 1569, 1568, 1, 0, 0, 0, 1570, 299, 1, 0, 0, 0, 1571, 1581, 7, 19, 0, 0, 1572, 1573, 5, 25, 0, 0, 1573, 1581, 5, 25, 0, 0, 1574, 1575, 5, 26, 0, 0, 1575, 1581, 5, 26, 0, 0, 1576, 1577, 5, 25, 0, 0, 1577, 1578, 3, 76, 38, 0, 1578, 1579, 5, 26, 0, 0, 1579, 1581, 1, 0, 0, 0, 1580, 1571, 1, 0, 0, 0, 1580, 1572, 1, 0, 0, 0, 1580, 1574, 1, 0, 0, 0, 1580, 1576, 1, 0, 0, 0, 1581, 301, 1, 0, 0, 0, 1582, 1591, 3, 318, 159, 0, 1583, 1591, 3, 320, 160, 0, 1584, 1591, 3, 324, 162, 0, 1585, 1591, 3, 326, 163, 0, 1586, 1591, 3, 334, 167, 0, 1587, 1591, 3, 336, 168, 0, 1588, 1591, 3, 338, 169, 0, 1589, 1591, 3, 304, 152, 0, 1590, 1582, 1, 0, 0, 0, 1590, 1583, 1, 0, 0, 0, 1590, 1584, 1, 0, 0, 0, 1590, 1585, 1, 0, 0, 0, 1590, 1586, 1, 0, 0, 0, 1590, 1587, 1, 0, 0, 0, 1590, 1588, 1, 0, 0, 0, 1590, 1589, 1, 0, 0, 0, 1591, 303, 1, 0, 0, 0, 1592, 1599, 3, 306, 153, 0, 1593, 1599, 3, 308, 154, 0, 1594, 1599, 3, 310, 155, 0, 1595, 1599, 3, 312, 156, 0, 1596, 1599, 3, 314, 157, 0, 1597, 1599, 3, 316, 158, 0, 1598, 1592, 1, 0, 0, 0, 1598, 1593, 1, 0, 0, 0, 1598, 1594, 1, 0, 0, 0, 1598, 1595, 1, 0, 0, 0, 1598, 1596, 1, 0, 0, 0, 1598, 1597, 1, 0, 0, 0, 1599, 305, 1, 0, 0, 0, 1600, 1601, 5, 172, 0, 0, 1601, 1602, 3, 322, 161, 0, 1602, 307, 1, 0, 0, 0, 1603, 1604, 5, 176, 0, 0, 1604, 1618, 5, 25, 0, 0, 1605, 1606, 3, 78, 39, 0, 1606, 1607, 5, 33, 0, 0, 1607, 1615, 3, 78, 39, 0, 1608, 1609, 5, 30, 0, 0, 1609, 1610, 3, 78, 39, 0, 1610, 1611, 5, 33, 0, 0, 1611, 1612, 3, 78, 39, 0, 1612, 1614, 1, 0, 0, 0, 1613, 1608, 1, 0, 0, 0, 1614, 1617, 1, 0, 0, 0, 1615, 1613, 1, 0, 0, 0, 1615, 1616, 1, 0, 0, 0, 1616, 1619, 1, 0, 0, 0, 1617, 1615, 1, 0, 0, 0, 1618, 1605, 1, 0, 0, 0, 1618, 1619, 1, 0, 0, 0, 1619, 1620, 1, 0, 0, 0, 1620, 1621, 5, 26, 0, 0, 1621, 309, 1, 0, 0, 0, 1622, 1623, 5, 175, 0, 0, 1623, 1624, 3, 322, 161, 0, 1624, 311, 1, 0, 0, 0, 1625, 1626, 5, 173, 0, 0, 1626, 1627, 5, 25, 0, 0, 1627, 1628, 3, 78, 39, 0, 1628, 1629, 5, 26, 0, 0, 1629, 313, 1, 0, 0, 0, 1630, 1631, 5, 174, 0, 0, 1631, 1632, 5, 25, 0, 0, 1632, 1633, 5, 26, 0, 0, 1633, 315, 1, 0, 0, 0, 1634, 1635, 5, 64, 0, 0, 1635, 1636, 3, 322, 161, 0, 1636, 317, 1, 0, 0, 0, 1637, 1638, 5, 84, 0, 0, 1638, 1639, 3, 152, 76, 0, 1639, 319, 1, 0, 0, 0, 1640, 1646, 5, 86, 0, 0, 1641, 1647, 3, 456, 228, 0, 1642, 1643, 5, 25, 0, 0, 1643, 1644, 3, 76, 38, 0, 1644, 1645, 5, 26, 0, 0, 1645, 1647, 1, 0, 0, 0, 1646, 1641, 1, 0, 0, 0, 1646, 1642, 1, 0, 0, 0, 1647, 1648, 1, 0, 0, 0, 1648, 1649, 3, 322, 161, 0, 1649, 321, 1, 0, 0, 0, 1650, 1651, 3, 152, 76, 0, 1651, 323, 1, 0, 0, 0, 1652, 1658, 5, 61, 0, 0, 1653, 1659, 3, 456, 228, 0, 1654, 1655, 5, 25, 0, 0, 1655, 1656, 3, 76, 38, 0, 1656, 1657, 5, 26, 0, 0, 1657, 1659, 1, 0, 0, 0, 1658, 1653, 1, 0, 0, 0, 1658, 1654, 1, 0, 0, 0, 1659, 1660, 1, 0, 0, 0, 1660, 1661, 3, 152, 76, 0, 1661, 325, 1, 0, 0, 0, 1662, 1665, 5, 121, 0, 0, 1663, 1666, 3, 328, 164, 0, 1664, 1666, 3, 330, 165, 0, 1665, 1663, 1, 0, 0, 0, 1665, 1664, 1, 0, 0, 0, 1666, 1667, 1, 0, 0, 0, 1667, 1668, 3, 332, 166, 0, 1668, 327, 1, 0, 0, 0, 1669, 1670, 3, 460, 230, 0, 1670, 329, 1, 0, 0, 0, 1671, 1672, 3, 152, 76, 0, 1672, 331, 1, 0, 0, 0, 1673, 1674, 3, 152, 76, 0, 1674, 333, 1, 0, 0, 0, 1675, 1676, 5, 154, 0, 0, 1676, 1677, 3, 152, 76, 0, 1677, 335, 1, 0, 0, 0, 1678, 1679, 5, 72, 0, 0, 1679, 1680, 3, 152, 76, 0, 1680, 337, 1, 0, 0, 0, 1681, 1687, 5, 140, 0, 0, 1682, 1688, 3, 460, 230, 0, 1683, 1684, 5, 25, 0, 0, 1684, 1685, 3, 76, 38, 0, 1685, 1686, 5, 26, 0, 0, 1686, 1688, 1, 0, 0, 0, 1687, 1682, 1, 0, 0, 0, 1687, 1683, 1, 0, 0, 0, 1688, 1689, 1, 0, 0, 0, 1689, 1690, 3, 152, 76, 0, 1690, 339, 1, 0, 0, 0, 1691, 1694, 3, 342, 171, 0, 1692, 1694, 3, 344, 172, 0, 1693, 1691, 1, 0, 0, 0, 1693, 1692, 1, 0, 0, 0, 1694, 341, 1, 0, 0, 0, 1695, 1696, 3, 456, 228, 0, 1696, 1697, 5, 47, 0, 0, 1697, 1698, 5, 5, 0, 0, 1698, 343, 1, 0, 0, 0, 1699, 1700, 3, 64, 32, 0, 1700, 1701, 5, 99, 0, 0, 1701, 1703, 5, 21, 0, 0, 1702, 1704, 3, 60, 30, 0, 1703, 1702, 1, 0, 0, 0, 1703, 1704, 1, 0, 0, 0, 1704, 1705, 1, 0, 0, 0, 1705, 1708, 5, 22, 0, 0, 1706, 1707, 5, 58, 0, 0, 1707, 1709, 3, 378, 189, 0, 1708, 1706, 1, 0, 0, 0, 1708, 1709, 1, 0, 0, 0, 1709, 1710, 1, 0, 0, 0, 1710, 1711, 3, 346, 173, 0, 1711, 345, 1, 0, 0, 0, 1712, 1713, 3, 152, 76, 0, 1713, 347, 1, 0, 0, 0, 1714, 1715, 5, 118, 0, 0, 1715, 1724, 5, 25, 0, 0, 1716, 1721, 3, 350, 175, 0, 1717, 1718, 5, 30, 0, 0, 1718, 1720, 3, 350, 175, 0, 1719, 1717, 1, 0, 0, 0, 1720, 1723, 1, 0, 0, 0, 1721, 1719, 1, 0, 0, 0, 1721, 1722, 1, 0, 0, 0, 1722, 1725, 1, 0, 0, 0, 1723, 1721, 1, 0, 0, 0, 1724, 1716, 1, 0, 0, 0, 1724, 1725, 1, 0, 0, 0, 1725, 1726, 1, 0, 0, 0, 1726, 1727, 5, 26, 0, 0, 1727, 349, 1, 0, 0, 0, 1728, 1729, 3, 78, 39, 0, 1729, 1730, 7, 20, 0, 0, 1730, 1731, 3, 78, 39, 0, 1731, 351, 1, 0, 0, 0, 1732, 1735, 3, 354, 177, 0, 1733, 1735, 3, 356, 178, 0, 1734, 1732, 1, 0, 0, 0, 1734, 1733, 1, 0, 0, 0, 1735, 353, 1, 0, 0, 0, 1736, 1738, 5, 23, 0, 0, 1737, 1739, 3, 76, 38, 0, 1738, 1737, 1, 0, 0, 0, 1738, 1739, 1, 0, 0, 0, 1739, 1740, 1, 0, 0, 0, 1740, 1741, 5, 24, 0, 0, 1741, 355, 1, 0, 0, 0, 1742, 1743, 5, 57, 0, 0, 1743, 1744, 3, 152, 76, 0, 1744, 357, 1, 0, 0, 0, 1745, 1746, 5, 194, 0, 0, 1746, 1747, 3, 360, 180, 0, 1747, 1748, 5, 199, 0, 0, 1748, 359, 1, 0, 0, 0, 1749, 1755, 3, 368, 184, 0, 1750, 1751, 3, 370, 185, 0, 1751, 1752, 3, 368, 184, 0, 1752, 1754, 1, 0, 0, 0, 1753, 1750, 1, 0, 0, 0, 1754, 1757, 1, 0, 0, 0, 1755, 1753, 1, 0, 0, 0, 1755, 1756, 1, 0, 0, 0, 1756, 361, 1, 0, 0, 0, 1757, 1755, 1, 0, 0, 0, 1758, 1759, 7, 21, 0, 0, 1759, 363, 1, 0, 0, 0, 1760, 1761, 7, 22, 0, 0, 1761, 365, 1, 0, 0, 0, 1762, 1763, 7, 23, 0, 0, 1763, 367, 1, 0, 0, 0, 1764, 1775, 5, 197, 0, 0, 1765, 1766, 3, 362, 181, 0, 1766, 1767, 3, 364, 182, 0, 1767, 1775, 1, 0, 0, 0, 1768, 1769, 3, 366, 183, 0, 1769, 1770, 3, 362, 181, 0, 1770, 1771, 3, 362, 181, 0, 1771, 1775, 1, 0, 0, 0, 1772, 1775, 3, 362, 181, 0, 1773, 1775, 5, 25, 0, 0, 1774, 1764, 1, 0, 0, 0, 1774, 1765, 1, 0, 0, 0, 1774, 1768, 1, 0, 0, 0, 1774, 1772, 1, 0, 0, 0, 1774, 1773, 1, 0, 0, 0, 1775, 1778, 1, 0, 0, 0, 1776, 1774, 1, 0, 0, 0, 1776, 1777, 1, 0, 0, 0, 1777, 369, 1, 0, 0, 0, 1778, 1776, 1, 0, 0, 0, 1779, 1780, 5, 198, 0, 0, 1780, 1781, 3, 76, 38, 0, 1781, 1782, 5, 195, 0, 0, 1782, 371, 1, 0, 0, 0, 1783, 1784, 5, 42, 0, 0, 1784, 1785, 3, 252, 126, 0, 1785, 373, 1, 0, 0, 0, 1786, 1788, 3, 418, 209, 0, 1787, 1789, 5, 42, 0, 0, 1788, 1787, 1, 0, 0, 0, 1788, 1789, 1, 0, 0, 0, 1789, 375, 1, 0, 0, 0, 1790, 1791, 5, 58, 0, 0, 1791, 1792, 3, 378, 189, 0, 1792, 377, 1, 0, 0, 0, 1793, 1794, 5, 89, 0, 0, 1794, 1795, 5, 21, 0, 0, 1795, 1803, 5, 22, 0, 0, 1796, 1800, 3, 380, 190, 0, 1797, 1801, 5, 42, 0, 0, 1798, 1801, 5, 27, 0, 0, 1799, 1801, 5, 28, 0, 0, 1800, 1797, 1, 0, 0, 0, 1800, 1798, 1, 0, 0, 0, 1800, 1799, 1, 0, 0, 0, 1800, 1801, 1, 0, 0, 0, 1801, 1803, 1, 0, 0, 0, 1802, 1793, 1, 0, 0, 0, 1802, 1796, 1, 0, 0, 0, 1803, 379, 1, 0, 0, 0, 1804, 1814, 3, 384, 192, 0, 1805, 1806, 5, 112, 0, 0, 1806, 1807, 5, 21, 0, 0, 1807, 1814, 5, 22, 0, 0, 1808, 1814, 3, 422, 211, 0, 1809, 1814, 3, 428, 214, 0, 1810, 1814, 3, 434, 217, 0, 1811, 1814, 3, 382, 191, 0, 1812, 1814, 3, 440, 220, 0, 1813, 1804, 1, 0, 0, 0, 1813, 1805, 1, 0, 0, 0, 1813, 1808, 1, 0, 0, 0, 1813, 1809, 1, 0, 0, 0, 1813, 1810, 1, 0, 0, 0, 1813, 1811, 1, 0, 0, 0, 1813, 1812, 1, 0, 0, 0, 1814, 381, 1, 0, 0, 0, 1815, 1816, 3, 456, 228, 0, 1816, 383, 1, 0, 0, 0, 1817, 1830, 3, 390, 195, 0, 1818, 1830, 3, 406, 203, 0, 1819, 1830, 3, 400, 200, 0, 1820, 1830, 3, 410, 205, 0, 1821, 1830, 3, 404, 202, 0, 1822, 1830, 3, 398, 199, 0, 1823, 1830, 3, 394, 197, 0, 1824, 1830, 3, 392, 196, 0, 1825, 1830, 3, 396, 198, 0, 1826, 1830, 3, 444, 222, 0, 1827, 1830, 3, 388, 194, 0, 1828, 1830, 3, 386, 193, 0, 1829, 1817, 1, 0, 0, 0, 1829, 1818, 1, 0, 0, 0, 1829, 1819, 1, 0, 0, 0, 1829, 1820, 1, 0, 0, 0, 1829, 1821, 1, 0, 0, 0, 1829, 1822, 1, 0, 0, 0, 1829, 1823, 1, 0, 0, 0, 1829, 1824, 1, 0, 0, 0, 1829, 1825, 1, 0, 0, 0, 1829, 1826, 1, 0, 0, 0, 1829, 1827, 1, 0, 0, 0, 1829, 1828, 1, 0, 0, 0, 1830, 385, 1, 0, 0, 0, 1831, 1832, 5, 127, 0, 0, 1832, 1834, 5, 21, 0, 0, 1833, 1835, 5, 27, 0, 0, 1834, 1833, 1, 0, 0, 0, 1834, 1835, 1, 0, 0, 0, 1835, 1836, 1, 0, 0, 0, 1836, 1837, 5, 22, 0, 0, 1837, 387, 1, 0, 0, 0, 1838, 1839, 5, 64, 0, 0, 1839, 1840, 5, 21, 0, 0, 1840, 1841, 5, 22, 0, 0, 1841, 389, 1, 0, 0, 0, 1842, 1843, 5, 85, 0, 0, 1843, 1846, 5, 21, 0, 0, 1844, 1847, 3, 406, 203, 0, 1845, 1847, 3, 410, 205, 0, 1846, 1844, 1, 0, 0, 0, 1846, 1845, 1, 0, 0, 0, 1846, 1847, 1, 0, 0, 0, 1847, 1848, 1, 0, 0, 0, 1848, 1849, 5, 22, 0, 0, 1849, 391, 1, 0, 0, 0, 1850, 1851, 5, 154, 0, 0, 1851, 1852, 5, 21, 0, 0, 1852, 1853, 5, 22, 0, 0, 1853, 393, 1, 0, 0, 0, 1854, 1855, 5, 72, 0, 0, 1855, 1856, 5, 21, 0, 0, 1856, 1857, 5, 22, 0, 0, 1857, 395, 1, 0, 0, 0, 1858, 1859, 5, 124, 0, 0, 1859, 1860, 5, 21, 0, 0, 1860, 1861, 5, 22, 0, 0, 1861, 397, 1, 0, 0, 0, 1862, 1863, 5, 140, 0, 0, 1863, 1866, 5, 21, 0, 0, 1864, 1867, 3, 460, 230, 0, 1865, 1867, 3, 476, 238, 0, 1866, 1864, 1, 0, 0, 0, 1866, 1865, 1, 0, 0, 0, 1866, 1867, 1, 0, 0, 0, 1867, 1868, 1, 0, 0, 0, 1868, 1869, 5, 22, 0, 0, 1869, 399, 1, 0, 0, 0, 1870, 1871, 5, 61, 0, 0, 1871, 1877, 5, 21, 0, 0, 1872, 1875, 3, 402, 201, 0, 1873, 1874, 5, 30, 0, 0, 1874, 1876, 3, 420, 210, 0, 1875, 1873, 1, 0, 0, 0, 1875, 1876, 1, 0, 0, 0, 1876, 1878, 1, 0, 0, 0, 1877, 1872, 1, 0, 0, 0, 1877, 1878, 1, 0, 0, 0, 1878, 1879, 1, 0, 0, 0, 1879, 1880, 5, 22, 0, 0, 1880, 401, 1, 0, 0, 0, 1881, 1884, 3, 414, 207, 0, 1882, 1884, 5, 27, 0, 0, 1883, 1881, 1, 0, 0, 0, 1883, 1882, 1, 0, 0, 0, 1884, 403, 1, 0, 0, 0, 1885, 1886, 5, 144, 0, 0, 1886, 1887, 5, 21, 0, 0, 1887, 1888, 3, 442, 221, 0, 1888, 1889, 5, 22, 0, 0, 1889, 405, 1, 0, 0, 0, 1890, 1891, 5, 86, 0, 0, 1891, 1900, 5, 21, 0, 0, 1892, 1898, 3, 408, 204, 0, 1893, 1894, 5, 30, 0, 0, 1894, 1896, 3, 420, 210, 0, 1895, 1897, 5, 42, 0, 0, 1896, 1895, 1, 0, 0, 0, 1896, 1897, 1, 0, 0, 0, 1897, 1899, 1, 0, 0, 0, 1898, 1893, 1, 0, 0, 0, 1898, 1899, 1, 0, 0, 0, 1899, 1901, 1, 0, 0, 0, 1900, 1892, 1, 0, 0, 0, 1900, 1901, 1, 0, 0, 0, 1901, 1902, 1, 0, 0, 0, 1902, 1903, 5, 22, 0, 0, 1903, 407, 1, 0, 0, 0, 1904, 1907, 3, 416, 208, 0, 1905, 1907, 5, 27, 0, 0, 1906, 1904, 1, 0, 0, 0, 1906, 1905, 1, 0, 0, 0, 1907, 409, 1, 0, 0, 0, 1908, 1909, 5, 145, 0, 0, 1909, 1910, 5, 21, 0, 0, 1910, 1911, 3, 412, 206, 0, 1911, 1912, 5, 22, 0, 0, 1912, 411, 1, 0, 0, 0, 1913, 1914, 3, 416, 208, 0, 1914, 413, 1, 0, 0, 0, 1915, 1916, 3, 456, 228, 0, 1916, 415, 1, 0, 0, 0, 1917, 1918, 3, 456, 228, 0, 1918, 417, 1, 0, 0, 0, 1919, 1920, 3, 420, 210, 0, 1920, 419, 1, 0, 0, 0, 1921, 1922, 3, 456, 228, 0, 1922, 421, 1, 0, 0, 0, 1923, 1925, 3, 66, 33, 0, 1924, 1923, 1, 0, 0, 0, 1925, 1928, 1, 0, 0, 0, 1926, 1924, 1, 0, 0, 0, 1926, 1927, 1, 0, 0, 0, 1927, 1931, 1, 0, 0, 0, 1928, 1926, 1, 0, 0, 0, 1929, 1932, 3, 424, 212, 0, 1930, 1932, 3, 426, 213, 0, 1931, 1929, 1, 0, 0, 0, 1931, 1930, 1, 0, 0, 0, 1932, 423, 1, 0, 0, 0, 1933, 1934, 5, 99, 0, 0, 1934, 1935, 5, 21, 0, 0, 1935, 1936, 5, 27, 0, 0, 1936, 1937, 5, 22, 0, 0, 1937, 425, 1, 0, 0, 0, 1938, 1939, 5, 99, 0, 0, 1939, 1948, 5, 21, 0, 0, 1940, 1945, 3, 378, 189, 0, 1941, 1942, 5, 30, 0, 0, 1942, 1944, 3, 378, 189, 0, 1943, 1941, 1, 0, 0, 0, 1944, 1947, 1, 0, 0, 0, 1945, 1943, 1, 0, 0, 0, 1945, 1946, 1, 0, 0, 0, 1946, 1949, 1, 0, 0, 0, 1947, 1945, 1, 0, 0, 0, 1948, 1940, 1, 0, 0, 0, 1948, 1949, 1, 0, 0, 0, 1949, 1950, 1, 0, 0, 0, 1950, 1951, 5, 22, 0, 0, 1951, 1952, 5, 58, 0, 0, 1952, 1953, 3, 378, 189, 0, 1953, 427, 1, 0, 0, 0, 1954, 1957, 3, 430, 215, 0, 1955, 1957, 3, 432, 216, 0, 1956, 1954, 1, 0, 0, 0, 1956, 1955, 1, 0, 0, 0, 1957, 429, 1, 0, 0, 0, 1958, 1959, 5, 118, 0, 0, 1959, 1960, 5, 21, 0, 0, 1960, 1961, 5, 27, 0, 0, 1961, 1962, 5, 22, 0, 0, 1962, 431, 1, 0, 0, 0, 1963, 1964, 5, 118, 0, 0, 1964, 1965, 5, 21, 0, 0, 1965, 1966, 3, 456, 228, 0, 1966, 1967, 5, 30, 0, 0, 1967, 1968, 3, 378, 189, 0, 1968, 1969, 5, 22, 0, 0, 1969, 433, 1, 0, 0, 0, 1970, 1973, 3, 436, 218, 0, 1971, 1973, 3, 438, 219, 0, 1972, 1970, 1, 0, 0, 0, 1972, 1971, 1, 0, 0, 0, 1973, 435, 1, 0, 0, 0, 1974, 1975, 5, 57, 0, 0, 1975, 1976, 5, 21, 0, 0, 1976, 1977, 5, 27, 0, 0, 1977, 1978, 5, 22, 0, 0, 1978, 437, 1, 0, 0, 0, 1979, 1980, 5, 57, 0, 0, 1980, 1981, 5, 21, 0, 0, 1981, 1982, 3, 378, 189, 0, 1982, 1983, 5, 22, 0, 0, 1983, 439, 1, 0, 0, 0, 1984, 1985, 5, 21, 0, 0, 1985, 1986, 3, 380, 190, 0, 1986, 1987, 5, 22, 0, 0, 1987, 441, 1, 0, 0, 0, 1988, 1989, 3, 414, 207, 0, 1989, 443, 1, 0, 0, 0, 1990, 1996, 3, 446, 223, 0, 1991, 1996, 3, 448, 224, 0, 1992, 1996, 3, 450, 225, 0, 1993, 1996, 3, 452, 226, 0, 1994, 1996, 3, 454, 227, 0, 1995, 1990, 1, 0, 0, 0, 1995, 1991, 1, 0, 0, 0, 1995, 1992, 1, 0, 0, 0, 1995, 1993, 1, 0, 0, 0, 1995, 1994, 1, 0, 0, 0, 1996, 445, 1, 0, 0, 0, 1997, 1998, 5, 172, 0, 0, 1998, 2000, 5, 21, 0, 0, 1999, 2001, 3, 476, 238, 0, 2000, 1999, 1, 0, 0, 0, 2000, 2001, 1, 0, 0, 0, 2001, 2002, 1, 0, 0, 0, 2002, 2003, 5, 22, 0, 0, 2003, 447, 1, 0, 0, 0, 2004, 2005, 5, 176, 0, 0, 2005, 2007, 5, 21, 0, 0, 2006, 2008, 3, 476, 238, 0, 2007, 2006, 1, 0, 0, 0, 2007, 2008, 1, 0, 0, 0, 2008, 2009, 1, 0, 0, 0, 2009, 2010, 5, 22, 0, 0, 2010, 449, 1, 0, 0, 0, 2011, 2012, 5, 175, 0, 0, 2012, 2014, 5, 21, 0, 0, 2013, 2015, 3, 476, 238, 0, 2014, 2013, 1, 0, 0, 0, 2014, 2015, 1, 0, 0, 0, 2015, 2016, 1, 0, 0, 0, 2016, 2017, 5, 22, 0, 0, 2017, 451, 1, 0, 0, 0, 2018, 2019, 5, 173, 0, 0, 2019, 2021, 5, 21, 0, 0, 2020, 2022, 3, 476, 238, 0, 2021, 2020, 1, 0, 0, 0, 2021, 2022, 1, 0, 0, 0, 2022, 2023, 1, 0, 0, 0, 2023, 2024, 5, 22, 0, 0, 2024, 453, 1, 0, 0, 0, 2025, 2026, 5, 174, 0, 0, 2026, 2028, 5, 21, 0, 0, 2027, 2029, 3, 476, 238, 0, 2028, 2027, 1, 0, 0, 0, 2028, 2029, 1, 0, 0, 0, 2029, 2030, 1, 0, 0, 0, 2030, 2031, 5, 22, 0, 0, 2031, 455, 1, 0, 0, 0, 2032, 2035, 3, 458, 229, 0, 2033, 2035, 5, 184, 0, 0, 2034, 2032, 1, 0, 0, 0, 2034, 2033, 1, 0, 0, 0, 2035, 457, 1, 0, 0, 0, 2036, 2039, 5, 185, 0, 0, 2037, 2039, 3, 460, 230, 0, 2038, 2036, 1, 0, 0, 0, 2038, 2037, 1, 0, 0, 0, 2039, 459, 1, 0, 0, 0, 2040, 2043, 5, 188, 0, 0, 2041, 2043, 3, 464, 232, 0, 2042, 2040, 1, 0, 0, 0, 2042, 2041, 1, 0, 0, 0, 2043, 461, 1, 0, 0, 0, 2044, 2049, 5, 185, 0, 0, 2045, 2049, 5, 188, 0, 0, 2046, 2049, 5, 184, 0, 0, 2047, 2049, 3, 468, 234, 0, 2048, 2044, 1, 0, 0, 0, 2048, 2045, 1, 0, 0, 0, 2048, 2046, 1, 0, 0, 0, 2048, 2047, 1, 0, 0, 0, 2049, 463, 1, 0, 0, 0, 2050, 2053, 3, 468, 234, 0, 2051, 2053, 3, 466, 233, 0, 2052, 2050, 1, 0, 0, 0, 2052, 2051, 1, 0, 0, 0, 2053, 465, 1, 0, 0, 0, 2054, 2055, 7, 24, 0, 0, 2055, 467, 1, 0, 0, 0, 2056, 2057, 7, 25, 0, 0, 2057, 469, 1, 0, 0, 0, 2058, 2059, 3, 476, 238, 0, 2059, 471, 1, 0, 0, 0, 2060, 2067, 5, 11, 0, 0, 2061, 2066, 5, 9, 0, 0, 2062, 2066, 5, 10, 0, 0, 2063, 2066, 5, 1, 0, 0, 2064, 2066, 3, 478, 239, 0, 2065, 2061, 1, 0, 0, 0, 2065, 2062, 1, 0, 0, 0, 2065, 2063, 1, 0, 0, 0, 2065, 2064, 1, 0, 0, 0, 2066, 2069, 1, 0, 0, 0, 2067, 2065, 1, 0, 0, 0, 2067, 2068, 1, 0, 0, 0, 2068, 2070, 1, 0, 0, 0, 2069, 2067, 1, 0, 0, 0, 2070, 2071, 5, 11, 0, 0, 2071, 473, 1, 0, 0, 0, 2072, 2079, 5, 12, 0, 0, 2073, 2078, 5, 9, 0, 0, 2074, 2078, 5, 10, 0, 0, 2075, 2078, 5, 2, 0, 0, 2076, 2078, 3, 480, 240, 0, 2077, 2073, 1, 0, 0, 0, 2077, 2074, 1, 0, 0, 0, 2077, 2075, 1, 0, 0, 0, 2077, 2076, 1, 0, 0, 0, 2078, 2081, 1, 0, 0, 0, 2079, 2077, 1, 0, 0, 0, 2079, 2080, 1, 0, 0, 0, 2080, 2082, 1, 0, 0, 0, 2081, 2079, 1, 0, 0, 0, 2082, 2083, 5, 12, 0, 0, 2083, 475, 1, 0, 0, 0, 2084, 2087, 3, 472, 236, 0, 2085, 2087, 3, 474, 237, 0, 2086, 2084, 1, 0, 0, 0, 2086, 2085, 1, 0, 0, 0, 2087, 477, 1, 0, 0, 0, 2088, 2090, 5, 196, 0, 0, 2089, 2088, 1, 0, 0, 0, 2090, 2091, 1, 0, 0, 0, 2091, 2089, 1, 0, 0, 0, 2091, 2092, 1, 0, 0, 0, 2092, 2106, 1, 0, 0, 0, 2093, 2095, 5, 25, 0, 0, 2094, 2096, 3, 76, 38, 0, 2095, 2094, 1, 0, 0, 0, 2095, 2096, 1, 0, 0, 0, 2096, 2098, 1, 0, 0, 0, 2097, 2099, 5, 26, 0, 0, 2098, 2097, 1, 0, 0, 0, 2098, 2099, 1, 0, 0, 0, 2099, 2106, 1, 0, 0, 0, 2100, 2106, 5, 26, 0, 0, 2101, 2106, 5, 3, 0, 0, 2102, 2106, 5, 4, 0, 0, 2103, 2106, 3, 482, 241, 0, 2104, 2106, 3, 474, 237, 0, 2105, 2089, 1, 0, 0, 0, 2105, 2093, 1, 0, 0, 0, 2105, 2100, 1, 0, 0, 0, 2105, 2101, 1, 0, 0, 0, 2105, 2102, 1, 0, 0, 0, 2105, 2103, 1, 0, 0, 0, 2105, 2104, 1, 0, 0, 0, 2106, 479, 1, 0, 0, 0, 2107, 2109, 5, 196, 0, 0, 2108, 2107, 1, 0, 0, 0, 2109, 2110, 1, 0, 0, 0, 2110, 2108, 1, 0, 0, 0, 2110, 2111, 1, 0, 0, 0, 2111, 2125, 1, 0, 0, 0, 2112, 2114, 5, 25, 0, 0, 2113, 2115, 3, 76, 38, 0, 2114, 2113, 1, 0, 0, 0, 2114, 2115, 1, 0, 0, 0, 2115, 2117, 1, 0, 0, 0, 2116, 2118, 5, 26, 0, 0, 2117, 2116, 1, 0, 0, 0, 2117, 2118, 1, 0, 0, 0, 2118, 2125, 1, 0, 0, 0, 2119, 2125, 5, 26, 0, 0, 2120, 2125, 5, 3, 0, 0, 2121, 2125, 5, 4, 0, 0, 2122, 2125, 3, 482, 241, 0, 2123, 2125, 3, 472, 236, 0, 2124, 2108, 1, 0, 0, 0, 2124, 2112, 1, 0, 0, 0, 2124, 2119, 1, 0, 0, 0, 2124, 2120, 1, 0, 0, 0, 2124, 2121, 1, 0, 0, 0, 2124, 2122, 1, 0, 0, 0, 2124, 2123, 1, 0, 0, 0, 2125, 481, 1, 0, 0, 0, 2126, 2129, 3, 464, 232, 0, 2127, 2129, 7, 26, 0, 0, 2128, 2126, 1, 0, 0, 0, 2128, 2127, 1, 0, 0, 0, 2129, 2130, 1, 0, 0, 0, 2130, 2128, 1, 0, 0, 0, 2130, 2131, 1, 0, 0, 0, 2131, 483, 1, 0, 0, 0, 204, 485, 488, 491, 495, 504, 528, 534, 538, 545, 552, 568, 612, 619, 625, 634, 637, 646, 654, 663, 666, 680, 687, 689, 700, 707, 709, 717, 721, 725, 732, 738, 743, 752, 759, 777, 788, 794, 802, 809, 817, 823, 826, 829, 847, 853, 861, 868, 874, 881, 894, 903, 906, 911, 916, 934, 940, 944, 948, 951, 960, 966, 971, 973, 977, 984, 991, 1000, 1012, 1022, 1036, 1041, 1051, 1062, 1078, 1092, 1098, 1107, 1116, 1146, 1154, 1161, 1165, 1172, 1178, 1185, 1193, 1201, 1209, 1216, 1222, 1228, 1234, 1241, 1250, 1258, 1268, 1277, 1283, 1292, 1303, 1308, 1313, 1320, 1325, 1329, 1337, 1344, 1352, 1362, 1366, 1371, 1377, 1379, 1388, 1391, 1398, 1412, 1417, 1432, 1436, 1447, 1464, 1468, 1473, 1482, 1502, 1510, 1512, 1522, 1524, 1531, 1536, 1543, 1546, 1551, 1558, 1561, 1569, 1580, 1590, 1598, 1615, 1618, 1646, 1658, 1665, 1687, 1693, 1703, 1708, 1721, 1724, 1734, 1738, 1755, 1774, 1776, 1788, 1800, 1802, 1813, 1829, 1834, 1846, 1866, 1875, 1877, 1883, 1896, 1898, 1900, 1906, 1926, 1931, 1945, 1948, 1956, 1972, 1995, 2000, 2007, 2014, 2021, 2028, 2034, 2038, 2042, 2048, 2052, 2065, 2067, 2077, 2079, 2086, 2091, 2095, 2098, 2105, 2110, 2114, 2117, 2124, 2128, 2130] \ No newline at end of file diff --git a/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java b/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java index c4c1263861..d58a597d98 100644 --- a/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java @@ -156,7 +156,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { PendingUpdateList pul = new PendingUpdateList(); for (RuntimeIterator child : this.children) { - pul = PendingUpdateList.mergeUpdates(pul, child.getPendingUpdateList(context), this.getMetadata()); + pul.mergeUpdates(child.getPendingUpdateList(context), this.getMetadata()); } return pul; } diff --git a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java index 131742fe57..f6dfc708ac 100644 --- a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java @@ -159,8 +159,7 @@ public JavaRDD getRDD(DynamicContext context) { public static JavaRDD dataFrameToRDDOfItems(JSoundDataFrame df, ExceptionMetadata metadata) { JavaRDD rowRDD = df.javaRDD(); - JavaRDD result = rowRDD.map(new RowToItemMapper(metadata, df.getItemType())); - return result; + return rowRDD.map(new RowToItemMapper(metadata, df.getItemType())); } public void materialize(DynamicContext context, List result) { diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java index 15ed99c538..b225b1bd35 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java @@ -391,7 +391,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { } PendingUpdateList result = new PendingUpdateList(); - if (!isRDDOrDataFrame()) { + if (!this.expression.isRDDOrDataFrame()) { this.child.open(context); this.tupleContext = new DynamicContext(context); // assign current context @@ -401,12 +401,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.tupleContext.getVariableValues().setBindingsFromTuple(tuple, getMetadata()); // assign new // variables // from new tuple - - result = PendingUpdateList.mergeUpdates( - result, - this.expression.getPendingUpdateList(this.tupleContext), - this.getMetadata() - ); + result.mergeUpdates(this.expression.getPendingUpdateList(this.tupleContext), this.getMetadata()); } this.child.close(); @@ -432,7 +427,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { // from new tuple PendingUpdateList intermediateResult = this.expression.getPendingUpdateList(dynamicContext); - result = PendingUpdateList.mergeUpdates(result, intermediateResult, this.getMetadata()); + result.mergeUpdates(intermediateResult, this.getMetadata()); } } return result; diff --git a/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java b/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java index 5e253d0d01..501d17953b 100644 --- a/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java @@ -37,6 +37,7 @@ import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.typing.AtMostOneItemTypePromotionIterator; import org.rumbledb.runtime.typing.TypePromotionIterator; +import org.rumbledb.runtime.update.PendingUpdateList; import org.rumbledb.types.FunctionSignature; import org.rumbledb.types.SequenceType; import org.rumbledb.types.SequenceType.Arity; @@ -78,6 +79,7 @@ public FunctionItemCallIterator( this.functionItem = functionItem; this.functionArguments = functionArguments; this.functionBodyIterator = null; + this.isUpdating = functionItem.getSignature().isUpdating(); this.validateNumberOfArguments(); this.wrapArgumentIteratorsWithTypeCheckingIterators(); @@ -232,7 +234,8 @@ private RuntimeIterator generatePartiallyAppliedFunction(DynamicContext context) partialApplicationParamNames, new FunctionSignature( partialApplicationParamTypes, - this.functionItem.getSignature().getReturnType() + this.functionItem.getSignature().getReturnType(), + this.functionItem.getSignature().isUpdating() ), this.functionItem.getModuleDynamicContext(), this.functionItem.getBodyIterator(), @@ -346,4 +349,16 @@ public JSoundDataFrame getDataFrame(DynamicContext dynamicContext) { this.functionBodyIterator = this.functionItem.getBodyIterator(); return this.functionBodyIterator.getDataFrame(this.dynamicContextForCalls); } + + @Override + public PendingUpdateList getPendingUpdateList(DynamicContext context) { + if (!isUpdating()) { + return new PendingUpdateList(); + } + this.populateDynamicContextWithArguments(context); + DynamicContext contextForUpdates = new DynamicContext(this.dynamicContextForCalls); + contextForUpdates.setCurrentMutabilityLevel(context.getCurrentMutabilityLevel()); + this.functionBodyIterator = this.functionItem.getBodyIterator(); + return this.functionBodyIterator.getPendingUpdateList(contextForUpdates); + } } diff --git a/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java index b4854d4fad..83ad520810 100644 --- a/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java @@ -44,13 +44,15 @@ public FunctionRuntimeIterator( Map paramNameToSequenceTypes, SequenceType returnType, RuntimeIterator bodyIterator, - RuntimeStaticContext staticContext + RuntimeStaticContext staticContext, + boolean isUpdating ) { super(null, staticContext); this.functionName = functionName; this.paramNameToSequenceTypes = paramNameToSequenceTypes; this.returnType = returnType; this.bodyIterator = bodyIterator; + this.isUpdating = isUpdating; } @Override @@ -61,7 +63,8 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) { this.paramNameToSequenceTypes, this.returnType, dynamicContext.getModuleContext(), - bodyIteratorCopy + bodyIteratorCopy, + this.isUpdating ); function.populateClosureFromDynamicContext(dynamicContext, getMetadata()); return function; diff --git a/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java b/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java index 6bf65e3b88..326e01ae76 100644 --- a/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java @@ -31,6 +31,7 @@ import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; +import org.rumbledb.runtime.update.PendingUpdateList; import java.util.List; import java.util.Map; @@ -55,13 +56,15 @@ public class StaticUserDefinedFunctionCallIterator extends HybridRuntimeIterator public StaticUserDefinedFunctionCallIterator( FunctionIdentifier functionIdentifier, List functionArguments, - RuntimeStaticContext staticContext + RuntimeStaticContext staticContext, + boolean isUpdating ) { super(null, staticContext); this.functionIdentifier = functionIdentifier; this.functionArguments = functionArguments; this.userDefinedFunctionCallIterator = null; this.nextExitStatementResult = 0; + this.isUpdating = isUpdating; } protected boolean implementsDataFrames() { @@ -199,4 +202,19 @@ public Map getVariableDependencies() { } return result; } + + @Override + public PendingUpdateList getPendingUpdateList(DynamicContext context) { + if (!isUpdating()) { + return new PendingUpdateList(); + } + this.userDefinedFunctionCallIterator = context.getNamedFunctions() + .getUserDefinedFunctionCallIterator( + this.functionIdentifier, + this.getHighestExecutionMode(), + getMetadata(), + this.functionArguments + ); + return this.userDefinedFunctionCallIterator.getPendingUpdateList(context); + } } diff --git a/src/main/java/org/rumbledb/runtime/functions/delta_lake/CreateDeltaLakeTableFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/delta_lake/CreateDeltaLakeTableFunctionIterator.java new file mode 100644 index 0000000000..50247351ca --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/delta_lake/CreateDeltaLakeTableFunctionIterator.java @@ -0,0 +1,89 @@ +package org.rumbledb.runtime.functions.delta_lake; + +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.RowFactory; +import org.apache.spark.sql.types.DataTypes; +import org.apache.spark.sql.types.StructType; +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.CannotRetrieveResourceException; +import org.rumbledb.items.BooleanItem; +import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; +import org.rumbledb.runtime.functions.input.FileSystemUtil; +import org.apache.spark.sql.Row; +import sparksoniq.spark.SparkSessionManager; + +import java.io.File; +import java.net.URI; +import java.util.List; + +import static org.apache.spark.sql.functions.lit; +import static org.apache.spark.sql.functions.monotonically_increasing_id; + +public class CreateDeltaLakeTableFunctionIterator extends AtMostOneItemLocalRuntimeIterator { + + public CreateDeltaLakeTableFunctionIterator( + List arguments, + RuntimeStaticContext staticContext + ) { + super(arguments, staticContext); + } + + @Override + public Item materializeFirstItemOrNull(DynamicContext context) { + RuntimeIterator urlIterator = this.children.get(0); + urlIterator.open(context); + String url = urlIterator.next().getStringValue(); + urlIterator.close(); + URI uri = FileSystemUtil.resolveURI(this.staticURI, url, getMetadata()); + if (FileSystemUtil.exists(uri, context.getRumbleRuntimeConfiguration(), getMetadata())) { + throw new CannotRetrieveResourceException( + "File " + uri + " already exists. Cannot create new delta lake table at this location.", + getMetadata() + ); + } + try { + File directory = new File(uri.getPath()); + if (!directory.exists()) { + boolean mkdirs = directory.mkdirs(); + if (!mkdirs) { + throw new RuntimeException("Failed to create directory " + directory); + } + } + Dataset dataFrame = SparkSessionManager.getInstance() + .getOrCreateSession() + .emptyDataFrame(); + dataFrame = dataFrame.withColumn(SparkSessionManager.mutabilityLevelColumnName, lit(0)); + dataFrame = dataFrame.withColumn(SparkSessionManager.rowIdColumnName, monotonically_increasing_id()); + dataFrame = dataFrame.withColumn(SparkSessionManager.pathInColumnName, lit("")); + dataFrame = dataFrame.withColumn(SparkSessionManager.tableLocationColumnName, lit(uri.toString())); + + StructType schema = new StructType() + .add(SparkSessionManager.mutabilityLevelColumnName, DataTypes.IntegerType, false) + .add(SparkSessionManager.rowIdColumnName, DataTypes.IntegerType, false) + .add(SparkSessionManager.pathInColumnName, DataTypes.StringType, false) + .add(SparkSessionManager.tableLocationColumnName, DataTypes.StringType, false); + + Row newRow = RowFactory.create( + 0, + 0, + "", + uri.toString() + ); + + Dataset newRowDataFrame = SparkSessionManager.getInstance() + .getOrCreateSession() + .createDataFrame(List.of(newRow), schema); + + Dataset combinedDataFrame = dataFrame.union(newRowDataFrame); + + combinedDataFrame.write().format("delta").mode("error").save(uri.toString()); + return new BooleanItem(true); + } catch (RuntimeException e) { + e.printStackTrace(); + return new BooleanItem(false); + } + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeleteDeltaLakeTableFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeleteDeltaLakeTableFunctionIterator.java new file mode 100644 index 0000000000..c62424558e --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeleteDeltaLakeTableFunctionIterator.java @@ -0,0 +1,53 @@ +package org.rumbledb.runtime.functions.delta_lake; + +import org.apache.commons.io.FileUtils; +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.CannotRetrieveResourceException; +import org.rumbledb.items.BooleanItem; +import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; +import org.rumbledb.runtime.functions.input.FileSystemUtil; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.util.List; + +public class DeleteDeltaLakeTableFunctionIterator extends AtMostOneItemLocalRuntimeIterator { + + public DeleteDeltaLakeTableFunctionIterator( + List arguments, + RuntimeStaticContext staticContext + ) { + super(arguments, staticContext); + } + + @Override + public Item materializeFirstItemOrNull(DynamicContext context) { + RuntimeIterator urlIterator = this.children.get(0); + urlIterator.open(context); + String url = urlIterator.next().getStringValue(); + urlIterator.close(); + URI uri = FileSystemUtil.resolveURI(this.staticURI, url, getMetadata()); + if (!FileSystemUtil.exists(uri, context.getRumbleRuntimeConfiguration(), getMetadata())) { + throw new CannotRetrieveResourceException("File " + uri + " not found.", getMetadata()); + } + + // URI tableURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + // this.currentAnnotation.getDeltaTablePath(), + // DeltaLakeConfigurationCatalogue.defaultDeltaLakeConfiguration, + // ExceptionMetadata.EMPTY_METADATA + // ); + + try { + File oldTable = new File(uri.getPath()); + FileUtils.deleteDirectory(oldTable); + return new BooleanItem(true); + } catch (IOException e) { + e.printStackTrace(); + return new BooleanItem(false); + } + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeltaLakeConfigurationCatalogue.java b/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeltaLakeConfigurationCatalogue.java new file mode 100644 index 0000000000..b06283ebcb --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeltaLakeConfigurationCatalogue.java @@ -0,0 +1,32 @@ +package org.rumbledb.runtime.functions.delta_lake; + +import org.rumbledb.config.RumbleRuntimeConfiguration; + +public class DeltaLakeConfigurationCatalogue { + static final RumbleRuntimeConfiguration defaultDeltaLakeConfiguration = new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--output-format", + "delta", + "--show-error-info", + "yes", + "--apply-updates", + "yes", + } + ); + + static final RumbleRuntimeConfiguration createDeltaLakeConfiguration = new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--output-format", + "delta", + "--show-error-info", + "yes", + "--apply-updates", + "yes", + } + ); + +} diff --git a/src/main/java/org/rumbledb/runtime/functions/input/DeltaFileFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/DeltaFileFunctionIterator.java new file mode 100644 index 0000000000..6934f3b13e --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/input/DeltaFileFunctionIterator.java @@ -0,0 +1,65 @@ +package org.rumbledb.runtime.functions.input; + +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.CannotRetrieveResourceException; +import org.rumbledb.items.structured.JSoundDataFrame; +import org.rumbledb.runtime.DataFrameRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; +import sparksoniq.spark.SparkSessionManager; + +import java.net.URI; +import java.util.List; + +import static org.apache.spark.sql.functions.lit; +import static org.apache.spark.sql.functions.monotonically_increasing_id; + +public class DeltaFileFunctionIterator extends DataFrameRuntimeIterator { + + private static final long serialVersionUID = 1L; + + public DeltaFileFunctionIterator( + List arguments, + RuntimeStaticContext staticContext + ) { + super(arguments, staticContext); + } + + @Override + public JSoundDataFrame getDataFrame(DynamicContext context) { + RuntimeIterator urlIterator = this.children.get(0); + urlIterator.open(context); + String url = urlIterator.next().getStringValue(); + urlIterator.close(); + URI uri = FileSystemUtil.resolveURI(this.staticURI, url, getMetadata()); + if (!FileSystemUtil.exists(uri, context.getRumbleRuntimeConfiguration(), getMetadata())) { + throw new CannotRetrieveResourceException("File " + uri + " not found.", getMetadata()); + } + // DeltaTable deltaTable = DeltaTable.forPath(SparkSessionManager.getInstance().getOrCreateSession(), + // uri.toString()); + SparkSessionManager.getInstance() + .getOrCreateSession() + .read() + .format("delta") + .load(uri.toString()) + .withColumn(SparkSessionManager.rowIdColumnName, monotonically_increasing_id()) + .write() + .format("delta") + .mode("overwrite") + .option("overwriteSchema", true) + .save(uri.toString()); + Dataset dataFrame = SparkSessionManager.getInstance() + .getOrCreateSession() + .read() + .format("delta") + .load(uri.toString()); + dataFrame = dataFrame.withColumn(SparkSessionManager.mutabilityLevelColumnName, lit(0)); + dataFrame = dataFrame.withColumn(SparkSessionManager.rowIdColumnName, monotonically_increasing_id()); + dataFrame = dataFrame.withColumn(SparkSessionManager.pathInColumnName, lit("")); + dataFrame = dataFrame.withColumn(SparkSessionManager.tableLocationColumnName, lit(uri.toString())); + // TODO: Make unique DeltaTable code + return new JSoundDataFrame(dataFrame); + } +} diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java index ae28047e8a..6e159fe805 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java @@ -73,7 +73,7 @@ public Item materializeFirstItemOrNull(DynamicContext context) { } } - Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs); + Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs, true); this.hasNext = false; return result; diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java index edf66d1b5e..4f5bf5b141 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java @@ -113,7 +113,7 @@ private void getDescendantPairs(List items) { List valueList = Collections.singletonList(value); Item result = ItemFactory.getInstance() - .createObjectItem(keyList, valueList, getMetadata()); + .createObjectItem(keyList, valueList, getMetadata(), true); this.nextResults.add(result); getDescendantPairs(valueList); } diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java index ee05ad56cb..2315c72ac0 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java @@ -88,7 +88,7 @@ public Item materializeFirstItemOrNull(DynamicContext context) { } } - Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs); + Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs, true); return result; } diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java index e64f62c6ad..922dd969be 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java @@ -45,10 +45,10 @@ public Item call(Item arg0) throws Exception { for (String key : arg0.getKeys()) { Item value = arg0.getItemByKey(key); Item arrayValue = ItemFactory.getInstance() - .createArrayItem(new ArrayList(Collections.singletonList(value))); + .createArrayItem(new ArrayList(Collections.singletonList(value)), false); keyValuePairs.put(key, new ArrayList(Collections.singletonList(arrayValue))); } - return ItemFactory.getInstance().createObjectItem(keyValuePairs); + return ItemFactory.getInstance().createObjectItem(keyValuePairs, true); } }; diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java index 48f44c314e..aa3cd8de4e 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java @@ -71,6 +71,6 @@ else if (!v2.isObject()) } } - return ItemFactory.getInstance().createObjectItem(keyValuePairs); + return ItemFactory.getInstance().createObjectItem(keyValuePairs, true); } }; diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java index 840c4f029a..4787501129 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java @@ -69,6 +69,18 @@ public void openLocal() { private void setResultsFromDF() { JSoundDataFrame childDF = this.iterator.getDataFrame(this.currentDynamicContextForLocalExecution); for (String key : childDF.getKeys()) { + if (key.equals(SparkSessionManager.mutabilityLevelColumnName)) { + continue; + } + if (key.equals(SparkSessionManager.rowIdColumnName)) { + continue; + } + if (key.equals(SparkSessionManager.tableLocationColumnName)) { + continue; + } + if (key.equals(SparkSessionManager.pathInColumnName)) { + continue; + } if ( !key.equals(SparkSessionManager.emptyObjectJSONiqItemColumnName) && !key.equals(SparkSessionManager.atomicJSONiqItemColumnName) diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java index 72a385ec29..f17a173d03 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java @@ -112,7 +112,7 @@ private Item getProjection(Item objItem, List keys) { } } return ItemFactory.getInstance() - .createObjectItem(finalKeylist, finalValueList, getMetadata()); + .createObjectItem(finalKeylist, finalValueList, getMetadata(), true); } @Override 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..0a1f967c24 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java @@ -120,7 +120,7 @@ private Item removeKeys(Item objItem, List removalKeys) { } } return ItemFactory.getInstance() - .createObjectItem(finalKeylist, finalValueList, getMetadata()); + .createObjectItem(finalKeylist, finalValueList, getMetadata(), true); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java index cbda4f4ad7..9ae3102bb6 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java @@ -470,6 +470,18 @@ public Item materializeFirstItemOrNull(DynamicContext context) { if (df.isEmptySequence()) { return null; } + ItemType maxType; + if ( + df.getItemType().isObjectItemType() + && df.getItemType().getObjectContentFacet().containsKey("tableLocation") + ) { + maxType = df.getItemType() + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType(); + } else { + maxType = df.getItemType(); + } String input = FlworDataFrameUtils.createTempView(df.getDataFrame()); JSoundDataFrame maxDF = df.evaluateSQL( String.format( @@ -478,7 +490,7 @@ public Item materializeFirstItemOrNull(DynamicContext context) { SparkSessionManager.atomicJSONiqItemColumnName, input ), - df.getItemType() + maxType ); return itemTypePromotion(maxDF.getExactlyOneItem()); } diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java index a79cc0bae6..4e22ef925a 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java @@ -23,6 +23,8 @@ import org.apache.log4j.LogManager; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.function.FlatMapFunction; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.apache.spark.sql.types.ArrayType; import org.apache.spark.sql.types.DataType; import org.apache.spark.sql.types.StructType; @@ -40,6 +42,7 @@ import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.ItemType; import org.rumbledb.types.SequenceType; +import org.rumbledb.types.ItemTypeFactory; import sparksoniq.spark.SparkSessionManager; @@ -237,6 +240,11 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { JSoundDataFrame childDataFrame = this.children.get(0).getDataFrame(context); initLookupPosition(context); String array = FlworDataFrameUtils.createTempView(childDataFrame.getDataFrame()); + boolean isObject = childDataFrame.getItemType().isObjectItemType(); + boolean hasAtomicJSONiqItem = isObject + && childDataFrame.getItemType() + .getObjectContentFacet() + .containsKey(SparkSessionManager.atomicJSONiqItemColumnName); if (childDataFrame.getItemType().isArrayItemType()) { ItemType elementType = childDataFrame.getItemType().getArrayContentFacet(); if (elementType.isObjectItemType()) { @@ -266,6 +274,66 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { ), elementType ); + } else if ( + hasAtomicJSONiqItem + && + childDataFrame.getItemType() + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType() + .isArrayItemType() + && childDataFrame.getItemType().getObjectContentFacet().containsKey("tableLocation") + ) { + ItemType elementType = childDataFrame.getItemType() + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType() + .getArrayContentFacet(); + String sql; + JSoundDataFrame res; + if (elementType.isObjectItemType()) { + sql = String.format( + "SELECT `%s`.*, `%s`, `%s`, `%s`, `%s` FROM (SELECT `%s`[%s] as `%s`, `%s`, `%s`, CONCAT(`%s`, '[%s]') AS `%s`, `%s` FROM %s WHERE size(`%s`) >= %s)", + SparkSessionManager.atomicJSONiqItemColumnName, + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + SparkSessionManager.atomicJSONiqItemColumnName, + this.lookup - 1, + SparkSessionManager.atomicJSONiqItemColumnName, + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + this.lookup - 1, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + array, + SparkSessionManager.atomicJSONiqItemColumnName, + this.lookup + ); + res = childDataFrame.evaluateSQL(sql, elementType); + } else { + sql = String.format( + "SELECT `%s`[%s] as `%s`, `%s`, `%s`, CONCAT(`%s`, '[%s]') AS `%s`, `%s` FROM %s WHERE size(`%s`) >= %s", + SparkSessionManager.atomicJSONiqItemColumnName, + this.lookup - 1, + SparkSessionManager.atomicJSONiqItemColumnName, + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + this.lookup - 1, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + array, + SparkSessionManager.atomicJSONiqItemColumnName, + this.lookup + ); + Dataset df = childDataFrame.getDataFrame().sparkSession().sql(sql); + ItemType deltaItemType = ItemTypeFactory.createItemType(df.schema()); + res = new JSoundDataFrame(df, deltaItemType); + } + return res; } if (getConfiguration().doStaticAnalysis()) { throw new UnexpectedStaticTypeException( diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java index ba12801d73..f88af52e11 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java @@ -23,6 +23,8 @@ import org.apache.log4j.LogManager; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.function.FlatMapFunction; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.apache.spark.sql.types.ArrayType; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; @@ -39,6 +41,7 @@ import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.ItemType; import org.rumbledb.types.SequenceType; +import org.rumbledb.types.ItemTypeFactory; import sparksoniq.spark.SparkSessionManager; @@ -182,6 +185,11 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC public JSoundDataFrame getDataFrame(DynamicContext context) { JSoundDataFrame childDataFrame = this.children.get(0).getDataFrame(context); String array = FlworDataFrameUtils.createTempView(childDataFrame.getDataFrame()); + boolean isObject = childDataFrame.getItemType().isObjectItemType(); + boolean hasAtomicJSONiqItem = isObject + && childDataFrame.getItemType() + .getObjectContentFacet() + .containsKey(SparkSessionManager.atomicJSONiqItemColumnName); if (childDataFrame.getItemType().isArrayItemType()) { ItemType elementType = childDataFrame.getItemType().getArrayContentFacet(); if (elementType.isObjectItemType()) { @@ -205,6 +213,59 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { ), elementType ); + } else if ( + hasAtomicJSONiqItem + && childDataFrame.getItemType() + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType() + .isArrayItemType() + && childDataFrame.getItemType().getObjectContentFacet().containsKey("tableLocation") + ) { + ItemType elementType = childDataFrame.getItemType() + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType() + .getArrayContentFacet(); + String sql; + JSoundDataFrame res; + // TODO: SORT OUT INDEXING DURING UNBOXING + if (elementType.isObjectItemType()) { + sql = String.format( + "SELECT col.*, `%s`, `%s`, CONCAT(CONCAT(CONCAT(`%s`, '['), pos), ']') AS `%s`, `%s` FROM (SELECT posexplode(`%s`), `%s`, `%s`, `%s`, `%s` FROM %s)", + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + SparkSessionManager.atomicJSONiqItemColumnName, + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + array + ); + res = childDataFrame.evaluateSQL(sql, elementType); + } else { + sql = String.format( + "SELECT col, `%s`, `%s`, CONCAT(CONCAT(CONCAT(`%s`, '['), pos), ']') AS `%s`, `%s` FROM (SELECT posexplode(`%s`), `%s`, `%s`, `%s`, `%s` FROM %s)", + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + SparkSessionManager.atomicJSONiqItemColumnName, + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + array + ); + Dataset df = childDataFrame.getDataFrame().sparkSession().sql(sql); + ItemType deltaItemType = ItemTypeFactory.createItemType(df.schema()); + res = new JSoundDataFrame(df, deltaItemType); + } + return res; } if (getConfiguration().doStaticAnalysis()) { throw new UnexpectedStaticTypeException( diff --git a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java index 1237e01e03..b66278c627 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java @@ -20,9 +20,16 @@ package org.rumbledb.runtime.navigation; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.Map; + import org.apache.log4j.LogManager; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.function.FlatMapFunction; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.apache.spark.sql.types.DataType; import org.apache.spark.sql.types.StructField; import org.apache.spark.sql.types.StructType; @@ -31,7 +38,12 @@ import org.rumbledb.context.Name; import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.errorcodes.ErrorCode; -import org.rumbledb.exceptions.*; +import org.rumbledb.exceptions.InvalidSelectorException; +import org.rumbledb.exceptions.IteratorFlowException; +import org.rumbledb.exceptions.MoreThanOneItemException; +import org.rumbledb.exceptions.NoItemException; +import org.rumbledb.exceptions.UnexpectedStaticTypeException; +import org.rumbledb.exceptions.UnexpectedTypeException; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.items.ItemFactory; import org.rumbledb.items.structured.JSoundDataFrame; @@ -44,17 +56,13 @@ import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.FieldDescriptor; import org.rumbledb.types.ItemType; +import org.rumbledb.types.ItemTypeFactory; import org.rumbledb.types.SequenceType; import org.rumbledb.types.SequenceType.Arity; import org.rumbledb.types.TypeMappings; import sparksoniq.spark.SparkSessionManager; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.Map; - public class ObjectLookupIterator extends HybridRuntimeIterator { private static final long serialVersionUID = 1L; @@ -351,21 +359,61 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { type = fieldDescriptor.getType(); } if (type.isObjectItemType()) { + // TODO: Find another way to check if delta dataframe -- e.g. flag and mutability level + // TODO: implement keyword vars to stop ust using strs + String sql; + if (childDataFrame.getKeys().contains("tableLocation")) { + sql = String.format( + "SELECT `%s`.*, `%s`, `%s`, CONCAT(`%s`, '.%s') AS `%s`, `%s` FROM %s", + key, + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + key, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + object + ); + + } else { + sql = String.format("SELECT `%s`.* FROM %s", key, object); + } JSoundDataFrame result = childDataFrame.evaluateSQL( - String.format("SELECT `%s`.* FROM %s", key, object), + sql, type ); return result; } else { - JSoundDataFrame result = childDataFrame.evaluateSQL( - String.format( + String sql; + JSoundDataFrame result; + if (childDataFrame.getKeys().contains("tableLocation")) { + sql = String.format( + "SELECT `%s` AS `%s`, `%s`, `%s`, CONCAT(`%s`, '.%s') AS `%s`, `%s` FROM %s", + key, + SparkSessionManager.atomicJSONiqItemColumnName, + SparkSessionManager.rowIdColumnName, + SparkSessionManager.mutabilityLevelColumnName, + SparkSessionManager.pathInColumnName, + key, + SparkSessionManager.pathInColumnName, + SparkSessionManager.tableLocationColumnName, + object + ); + Dataset df = childDataFrame.getDataFrame().sparkSession().sql(sql); + ItemType deltaItemType = ItemTypeFactory.createItemType(df.schema()); + result = new JSoundDataFrame(df, deltaItemType); + } else { + sql = String.format( "SELECT `%s` AS `%s` FROM %s", key, SparkSessionManager.atomicJSONiqItemColumnName, object - ), - type - ); + ); + result = childDataFrame.evaluateSQL( + sql, + type + ); + } return result; } } diff --git a/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java index 36b2d8b91d..d4e39c8d99 100644 --- a/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java @@ -51,7 +51,7 @@ public Item materializeFirstItemOrNull( if (!this.children.isEmpty()) { result.addAll(this.children.get(0).materialize(dynamicContext)); } - Item item = ItemFactory.getInstance().createArrayItem(result); + Item item = ItemFactory.getInstance().createArrayItem(result, true); return item; } } diff --git a/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java index 4c871ea861..cfa46df538 100644 --- a/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java @@ -77,7 +77,7 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) { } this.hasNext = false; return ItemFactory.getInstance() - .createObjectItem(keys, values, getMetadata()); + .createObjectItem(keys, values, getMetadata(), true); } else { @@ -90,7 +90,7 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) { valueIterator.close(); // SIMILAR TO ZORBA, if value is more than one item, wrap it in an array if (currentResults.size() > 1) { - values.add(ItemFactory.getInstance().createArrayItem(currentResults)); + values.add(ItemFactory.getInstance().createArrayItem(currentResults, true)); } else if (currentResults.size() == 1) { values.add(currentResults.get(0)); } else { @@ -121,7 +121,7 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) { } this.hasNext = false; return ItemFactory.getInstance() - .createObjectItem(keys, values, getMetadata()); + .createObjectItem(keys, values, getMetadata(), true); } } } diff --git a/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java b/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java index 256a318fdd..91970ed72d 100644 --- a/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java +++ b/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java @@ -105,6 +105,16 @@ protected Item nextLocal() { return null; } + @Override + public boolean isSequential() { + return this.statementsAndExprIterator.isSequential(); + } + + @Override + public boolean isUpdating() { + return this.statementsAndExprIterator.isUpdating(); + } + @Override public PendingUpdateList getPendingUpdateList(DynamicContext context) { if (!encounteredExitStatement) { diff --git a/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java b/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java index 8f7cc5beb4..bf035392dd 100644 --- a/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java +++ b/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java @@ -156,6 +156,11 @@ public JSoundDataFrame getDataFrame(DynamicContext dynamicContext) { return exprIterator.getDataFrame(dynamicContext); } + @Override + public boolean isUpdating() { + return this.children.get(this.children.size() - 1).isUpdating(); + } + @Override public PendingUpdateList getPendingUpdateList(DynamicContext context) { RuntimeIterator exprIterator = this.children.get(this.children.size() - 1); diff --git a/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java b/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java index b63ebe5004..39f972fe1e 100644 --- a/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java +++ b/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java @@ -23,6 +23,7 @@ import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.functions.sequences.general.TreatAsClosure; +import org.rumbledb.runtime.update.PendingUpdateList; import org.rumbledb.types.ItemType; import org.rumbledb.types.ItemTypeFactory; import org.rumbledb.types.SequenceType; @@ -51,12 +52,14 @@ public class TreatIterator extends HybridRuntimeIterator { public TreatIterator( RuntimeIterator iterator, SequenceType sequenceType, + boolean isUpdating, ErrorCode errorCode, RuntimeStaticContext staticContext ) { super(Collections.singletonList(iterator), staticContext); this.iterator = iterator; this.sequenceType = sequenceType; + this.isUpdating = isUpdating; this.errorCode = errorCode; if (!this.sequenceType.isEmptySequence()) { this.itemType = this.sequenceType.getItemType(); @@ -73,6 +76,15 @@ public TreatIterator( } } + public TreatIterator( + RuntimeIterator iterator, + SequenceType sequenceType, + ErrorCode errorCode, + RuntimeStaticContext staticContext + ) { + this(iterator, sequenceType, false, errorCode, staticContext); + } + @Override public boolean hasNextLocal() { return this.hasNext; @@ -226,6 +238,11 @@ public JSoundDataFrame getDataFrame(DynamicContext dynamicContext) { throw errorToThrow("" + dataItemType); } + @Override + public PendingUpdateList getPendingUpdateList(DynamicContext context) { + return iterator.getPendingUpdateList(context); + } + /** * Converts a homogeneous RDD of atomic values to a DataFrame * diff --git a/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java b/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java index c8666e38c6..2bcb717650 100644 --- a/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java +++ b/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java @@ -389,7 +389,7 @@ private static Item validate(Item item, ItemType itemType, ExceptionMetadata met } Integer minLength = itemType.getMinLengthFacet(); Integer maxLength = itemType.getMaxLengthFacet(); - Item arrayItem = ItemFactory.getInstance().createArrayItem(members); + Item arrayItem = ItemFactory.getInstance().createArrayItem(members, true); if (itemType.getName() == null) { itemType = itemType.getBaseType(); } @@ -453,7 +453,7 @@ private static Item validate(Item item, ItemType itemType, ExceptionMetadata met } } Item objectItem = ItemFactory.getInstance() - .createObjectItem(keys, values, ExceptionMetadata.EMPTY_METADATA); + .createObjectItem(keys, values, ExceptionMetadata.EMPTY_METADATA, true); if (itemType.getName() == null) { itemType = itemType.getBaseType(); } diff --git a/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java b/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java index 6e56434714..346e72d68c 100644 --- a/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java +++ b/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java @@ -17,9 +17,27 @@ public class PendingUpdateList { private Map> delReplaceArrayMap; private Map> renameObjMap; private Comparator targetComparator; + private Comparator arraySelectorComparator; public PendingUpdateList() { + // TODO: diff comparator for delta this.targetComparator = (item1, item2) -> { + boolean itemIsDelta1 = item1.getTableLocation() != null && !item1.getTableLocation().equals("null"); + boolean itemIsDelta2 = item2.getTableLocation() != null && !item2.getTableLocation().equals("null"); + if (itemIsDelta1 && itemIsDelta2) { + int tableComp = item1.getTableLocation().compareTo(item2.getTableLocation()); + if (tableComp != 0) { + return tableComp; + } + int rowComp = Long.compare(item1.getTopLevelID(), item2.getTopLevelID()); + if (rowComp != 0) { + return rowComp; + } + return item1.getPathIn().compareTo(item2.getPathIn()); + } else if (itemIsDelta1 || itemIsDelta2) { + // TODO: what to compare when one is delta and one is not? Never occurs? + return 0; + } int hashCompare = Integer.compare(item1.hashCode(), item2.hashCode()); if (item1.hashCode() != item2.hashCode()) { return hashCompare; @@ -29,6 +47,7 @@ public PendingUpdateList() { } return Integer.compare(System.identityHashCode(item1), System.identityHashCode(item2)); }; + this.arraySelectorComparator = Comparator.comparingInt(Item::getIntValue).reversed(); this.insertObjMap = new TreeMap<>(this.targetComparator); this.insertArrayMap = new TreeMap<>(this.targetComparator); this.delReplaceObjMap = new TreeMap<>(this.targetComparator); @@ -44,39 +63,39 @@ public PendingUpdateList(UpdatePrimitive updatePrimitive) { public void addUpdatePrimitive(UpdatePrimitive updatePrimitive) { Item target = updatePrimitive.getTarget(); if (updatePrimitive.isDeleteObject()) { - Map locSrcMap = delReplaceObjMap.getOrDefault(target, new HashMap<>()); + Map locSrcMap = this.delReplaceObjMap.getOrDefault(target, new HashMap<>()); for (Item locator : updatePrimitive.getContentList()) { locSrcMap.put(locator, null); } - delReplaceObjMap.put(target, locSrcMap); + this.delReplaceObjMap.put(target, locSrcMap); } else if (updatePrimitive.isReplaceObject()) { - Map locSrcMap = delReplaceObjMap.getOrDefault(target, new HashMap<>()); + Map locSrcMap = this.delReplaceObjMap.getOrDefault(target, new HashMap<>()); locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContent()); - delReplaceObjMap.put(target, locSrcMap); + this.delReplaceObjMap.put(target, locSrcMap); } else if (updatePrimitive.isInsertObject()) { - insertObjMap.put(target, updatePrimitive.getContent()); + this.insertObjMap.put(target, updatePrimitive.getContent()); } else if (updatePrimitive.isRenameObject()) { - Map locSrcMap = renameObjMap.getOrDefault(target, new HashMap<>()); + Map locSrcMap = this.renameObjMap.getOrDefault(target, new HashMap<>()); locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContent()); - renameObjMap.put(target, locSrcMap); + this.renameObjMap.put(target, locSrcMap); } else if (updatePrimitive.isDeleteArray()) { - Map locSrcMap = delReplaceArrayMap.getOrDefault(target, new HashMap<>()); + Map locSrcMap = this.delReplaceArrayMap.getOrDefault(target, new HashMap<>()); locSrcMap.put(updatePrimitive.getSelector(), null); - delReplaceArrayMap.put(target, locSrcMap); + this.delReplaceArrayMap.put(target, locSrcMap); } else if (updatePrimitive.isReplaceArray()) { - Map locSrcMap = delReplaceArrayMap.getOrDefault(target, new HashMap<>()); + Map locSrcMap = this.delReplaceArrayMap.getOrDefault(target, new HashMap<>()); locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContent()); - delReplaceArrayMap.put(target, locSrcMap); + this.delReplaceArrayMap.put(target, locSrcMap); } else if (updatePrimitive.isInsertArray()) { - Map> locSrcMap = insertArrayMap.getOrDefault(target, new HashMap<>()); + Map> locSrcMap = this.insertArrayMap.getOrDefault(target, new HashMap<>()); locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContentList()); - insertArrayMap.put(target, locSrcMap); + this.insertArrayMap.put(target, locSrcMap); } else { throw new OurBadException("Invalid UpdatePrimitive created"); } @@ -85,7 +104,9 @@ public void addUpdatePrimitive(UpdatePrimitive updatePrimitive) { public void applyUpdates(ExceptionMetadata metadata) { UpdatePrimitiveFactory upFactory = UpdatePrimitiveFactory.getInstance(); - Map> targetArrayPULs = new HashMap<>(); + // new TreeMap<>(this.targetComparator) sometimes causes null on apply? + Map>> targetArrayPULs = new HashMap<>(); + Map> tempSelPULsMap; List tempArrayPULs; List objectPUL = new ArrayList<>(); @@ -96,9 +117,9 @@ public void applyUpdates(ExceptionMetadata metadata) { ////// OBJECTS // DELETES & REPLACES - for (Item target : delReplaceObjMap.keySet()) { + for (Item target : this.delReplaceObjMap.keySet()) { List toDel = new ArrayList<>(); - tempSelSrcMap = delReplaceObjMap.get(target); + tempSelSrcMap = this.delReplaceObjMap.get(target); for (Item locator : tempSelSrcMap.keySet()) { tempSrc = tempSelSrcMap.get(locator); if (tempSrc == null) { @@ -107,19 +128,21 @@ public void applyUpdates(ExceptionMetadata metadata) { objectPUL.add(upFactory.createReplaceInObjectPrimitive(target, locator, tempSrc, metadata)); } } - objectPUL.add(upFactory.createDeleteFromObjectPrimitive(target, toDel, metadata)); + if (!toDel.isEmpty()) { + objectPUL.add(upFactory.createDeleteFromObjectPrimitive(target, toDel, metadata)); + } } // INSERTS - for (Item target : insertObjMap.keySet()) { - objectPUL.add(upFactory.createInsertIntoObjectPrimitive(target, insertObjMap.get(target))); + for (Item target : this.insertObjMap.keySet()) { + objectPUL.add(upFactory.createInsertIntoObjectPrimitive(target, this.insertObjMap.get(target), metadata)); } // RENAMES - for (Item target : renameObjMap.keySet()) { - tempSelSrcMap = renameObjMap.get(target); + for (Item target : this.renameObjMap.keySet()) { + tempSelSrcMap = this.renameObjMap.get(target); for (Item locator : tempSelSrcMap.keySet()) { objectPUL.add( upFactory.createRenameInObjectPrimitive(target, locator, tempSelSrcMap.get(locator), metadata) @@ -131,9 +154,9 @@ public void applyUpdates(ExceptionMetadata metadata) { // DELETES & REPLACES - for (Item target : delReplaceArrayMap.keySet()) { - tempArrayPULs = targetArrayPULs.getOrDefault(target, new ArrayList<>()); - tempSelSrcMap = delReplaceArrayMap.get(target); + for (Item target : this.delReplaceArrayMap.keySet()) { + tempSelPULsMap = targetArrayPULs.getOrDefault(target, new TreeMap<>(this.arraySelectorComparator)); + tempSelSrcMap = this.delReplaceArrayMap.get(target); for (Item locator : tempSelSrcMap.keySet()) { UpdatePrimitive up; tempSrc = tempSelSrcMap.get(locator); @@ -142,38 +165,31 @@ public void applyUpdates(ExceptionMetadata metadata) { } else { up = upFactory.createReplaceInArrayPrimitive(target, locator, tempSrc, metadata); } - int index = Collections.binarySearch( - tempArrayPULs, - up, - Comparator.comparing(UpdatePrimitive::getIntSelector) - ); - if (index < 0) { - index = -index - 1; - } - tempArrayPULs.add(index, up); + tempArrayPULs = tempSelPULsMap.getOrDefault(locator, new ArrayList<>()); + tempArrayPULs.add(up); + tempSelPULsMap.put(locator, tempArrayPULs); } - targetArrayPULs.put(target, tempArrayPULs); + targetArrayPULs.put(target, tempSelPULsMap); } // INSERTS - for (Item target : insertArrayMap.keySet()) { + for (Item target : this.insertArrayMap.keySet()) { UpdatePrimitive up; - tempArrayPULs = targetArrayPULs.getOrDefault(target, new ArrayList<>()); - tempSelSrcListMap = insertArrayMap.get(target); + tempSelPULsMap = targetArrayPULs.getOrDefault(target, new TreeMap<>(this.arraySelectorComparator)); + tempSelSrcListMap = this.insertArrayMap.get(target); for (Item locator : tempSelSrcListMap.keySet()) { - up = upFactory.createInsertIntoArrayPrimitive(target, locator, tempSelSrcListMap.get(locator)); - int index = Collections.binarySearch( - tempArrayPULs, - up, - Comparator.comparing(UpdatePrimitive::getIntSelector) + up = upFactory.createInsertIntoArrayPrimitive( + target, + locator, + tempSelSrcListMap.get(locator), + metadata ); - if (index < 0) { - index = -index - 1; - } - tempArrayPULs.add(index, up); + tempArrayPULs = tempSelPULsMap.getOrDefault(locator, new ArrayList<>()); + tempArrayPULs.add(up); + tempSelPULsMap.put(locator, tempArrayPULs); } - targetArrayPULs.put(target, tempArrayPULs); + targetArrayPULs.put(target, tempSelPULsMap); } ////// APPLY OBJECTS @@ -183,151 +199,123 @@ public void applyUpdates(ExceptionMetadata metadata) { } ////// APPLY ARRAYS - for (Item target : targetArrayPULs.keySet()) { - tempArrayPULs = targetArrayPULs.get(target); - for (int i = tempArrayPULs.size() - 1; i >= 0; i--) { - tempArrayPULs.get(i).apply(); + tempSelPULsMap = targetArrayPULs.get(target); + for (Item selector : tempSelPULsMap.keySet()) { + tempArrayPULs = tempSelPULsMap.get(selector); + for (UpdatePrimitive up : tempArrayPULs) { + up.apply(); + } } } } - public static PendingUpdateList mergeUpdates( - PendingUpdateList pul1, - PendingUpdateList pul2, + public void mergeUpdates( + PendingUpdateList otherPul, ExceptionMetadata metadata ) { - PendingUpdateList res = new PendingUpdateList(); Map tempSelSrcMap; Map> tempSelSrcListMap; Map tempSelSrcResMap; Map> tempSelSrcResListMap; Item tempSrc; + Item tempSrcRes; List tempSrcList; ////// OBJECTS // DELETES & REPLACES - - for (Item target : pul1.delReplaceObjMap.keySet()) { - tempSelSrcMap = pul1.delReplaceObjMap.get(target); - tempSelSrcResMap = res.delReplaceObjMap.getOrDefault(target, new HashMap<>()); + for (Item target : otherPul.delReplaceObjMap.keySet()) { + tempSelSrcMap = otherPul.delReplaceObjMap.get(target); + tempSelSrcResMap = this.delReplaceObjMap.getOrDefault(target, new HashMap<>()); for (Item selector : tempSelSrcMap.keySet()) { - tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector)); - } - res.delReplaceObjMap.put(target, tempSelSrcResMap); - } - - for (Item target : pul2.delReplaceObjMap.keySet()) { - tempSelSrcMap = pul2.delReplaceObjMap.get(target); - tempSelSrcResMap = res.delReplaceObjMap.getOrDefault(target, new HashMap<>()); - - for (Item selector : tempSelSrcMap.keySet()) { - if (tempSelSrcResMap.containsKey(selector)) { - tempSrc = tempSelSrcResMap.get(selector); - if (tempSrc != null) { + tempSrc = tempSelSrcMap.get(selector); + tempSrcRes = tempSelSrcResMap.get(selector); + boolean srcResMapHasSel = tempSelSrcResMap.containsKey(selector); + if (tempSrc == null) { + boolean hasRename = this.renameObjMap.containsKey(target) + && this.renameObjMap.get(target).containsKey(selector); + if (hasRename) { + this.renameObjMap.get(target).remove(selector); + } + } else { + if (srcResMapHasSel && tempSrcRes != null) { throw new TooManyReplacesOnSameTargetSelectorException( target.getDynamicType().getName().toString(), selector.getStringValue(), metadata ); + } else if (srcResMapHasSel) { + continue; } - continue; } - tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector)); + tempSelSrcResMap.put(selector, tempSrc); } - res.delReplaceObjMap.put(target, tempSelSrcResMap); + this.delReplaceObjMap.put(target, tempSelSrcResMap); } // INSERTS - - res.insertObjMap.putAll(pul1.insertObjMap); - - for (Item target : pul2.insertObjMap.keySet()) { - tempSrc = pul2.insertObjMap.get(target); - if (res.insertObjMap.containsKey(target)) { - tempSrc = InsertIntoObjectPrimitive.mergeSources(res.insertObjMap.get(target), tempSrc, metadata); + for (Item target : otherPul.insertObjMap.keySet()) { + tempSrc = otherPul.insertObjMap.get(target); + if (this.insertObjMap.containsKey(target)) { + tempSrc = InsertIntoObjectPrimitive.mergeSources(this.insertObjMap.get(target), tempSrc, metadata); } - res.insertObjMap.put(target, tempSrc); + this.insertObjMap.put(target, tempSrc); } // RENAME - - for (Item target : pul1.renameObjMap.keySet()) { - tempSelSrcMap = pul1.renameObjMap.get(target); - tempSelSrcResMap = res.renameObjMap.getOrDefault(target, new HashMap<>()); - - for (Item selector : tempSelSrcMap.keySet()) { - tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector)); - } - res.renameObjMap.put(target, tempSelSrcResMap); - } - - for (Item target : pul2.renameObjMap.keySet()) { - tempSelSrcMap = pul2.renameObjMap.get(target); - tempSelSrcResMap = res.renameObjMap.getOrDefault(target, new HashMap<>()); + for (Item target : otherPul.renameObjMap.keySet()) { + tempSelSrcMap = otherPul.renameObjMap.get(target); + tempSelSrcResMap = this.renameObjMap.getOrDefault(target, new HashMap<>()); for (Item selector : tempSelSrcMap.keySet()) { if (tempSelSrcResMap.containsKey(selector)) { throw new TooManyRenamesOnSameTargetSelectorException(selector.getStringValue(), metadata); } + boolean isDelete = this.delReplaceObjMap.containsKey(target) + && this.delReplaceObjMap.get(target).containsKey(selector) + && this.delReplaceObjMap.get(target).get(selector) == null; + if (isDelete) { + continue; + } tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector)); } - res.renameObjMap.put(target, tempSelSrcResMap); + this.renameObjMap.put(target, tempSelSrcResMap); } ////// ARRAYS // DELETES & REPLACES - - for (Item target : pul1.delReplaceArrayMap.keySet()) { - tempSelSrcMap = pul1.delReplaceArrayMap.get(target); - tempSelSrcResMap = res.delReplaceArrayMap.getOrDefault(target, new HashMap<>()); + for (Item target : otherPul.delReplaceArrayMap.keySet()) { + tempSelSrcMap = otherPul.delReplaceArrayMap.get(target); + tempSelSrcResMap = this.delReplaceArrayMap.getOrDefault(target, new HashMap<>()); for (Item selector : tempSelSrcMap.keySet()) { - tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector)); - } - res.delReplaceArrayMap.put(target, tempSelSrcResMap); - } - - for (Item target : pul2.delReplaceArrayMap.keySet()) { - tempSelSrcMap = pul2.delReplaceArrayMap.get(target); - tempSelSrcResMap = res.delReplaceArrayMap.getOrDefault(target, new HashMap<>()); - - for (Item selector : tempSelSrcMap.keySet()) { - if (tempSelSrcResMap.containsKey(selector)) { - tempSrc = tempSelSrcResMap.get(selector); - if (tempSrc != null) { + tempSrc = tempSelSrcMap.get(selector); + tempSrcRes = tempSelSrcResMap.get(selector); + boolean srcResMapHasSel = tempSelSrcResMap.containsKey(selector); + if (tempSrc != null && srcResMapHasSel) { + if (tempSrcRes == null) { + continue; + } else { throw new TooManyReplacesOnSameTargetSelectorException( target.getDynamicType().getName().toString(), Integer.toString(selector.getIntValue()), metadata ); } - continue; } - tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector)); + tempSelSrcResMap.put(selector, tempSrc); } - res.delReplaceArrayMap.put(target, tempSelSrcResMap); + this.delReplaceArrayMap.put(target, tempSelSrcResMap); } // INSERTS - - for (Item target : pul1.insertArrayMap.keySet()) { - tempSelSrcListMap = pul1.insertArrayMap.get(target); - tempSelSrcResListMap = res.insertArrayMap.getOrDefault(target, new HashMap<>()); - - for (Item selector : tempSelSrcListMap.keySet()) { - tempSelSrcResListMap.put(selector, tempSelSrcListMap.get(selector)); - } - res.insertArrayMap.put(target, tempSelSrcResListMap); - } - - for (Item target : pul2.insertArrayMap.keySet()) { - tempSelSrcListMap = pul2.insertArrayMap.get(target); - tempSelSrcResListMap = res.insertArrayMap.getOrDefault(target, new HashMap<>()); + for (Item target : otherPul.insertArrayMap.keySet()) { + tempSelSrcListMap = otherPul.insertArrayMap.get(target); + tempSelSrcResListMap = this.insertArrayMap.getOrDefault(target, new HashMap<>()); for (Item selector : tempSelSrcListMap.keySet()) { tempSrcList = tempSelSrcResListMap.getOrDefault(selector, new ArrayList<>()); @@ -336,10 +324,8 @@ public static PendingUpdateList mergeUpdates( InsertIntoArrayPrimitive.mergeSources(tempSrcList, tempSelSrcListMap.get(selector)) ); } - res.insertArrayMap.put(target, tempSelSrcResListMap); + this.insertArrayMap.put(target, tempSelSrcResListMap); } - - return res; } } diff --git a/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java index 054fe6f2b0..5bf329c486 100644 --- a/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java @@ -1,5 +1,6 @@ package org.rumbledb.runtime.update.expression; +import org.apache.commons.lang3.SerializationUtils; import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; @@ -72,7 +73,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { try { target = this.arrayIterator.materializeExactlyOneItem(context); - content = this.toAppendIterator.materializeExactlyOneItem(context); + content = SerializationUtils.clone(this.toAppendIterator.materializeExactlyOneItem(context)); } catch (NoItemException | MoreThanOneItemException e) { throw new RuntimeException(e); } @@ -81,13 +82,21 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { UpdatePrimitive up; if (target.isArray()) { Item locator = ItemFactory.getInstance().createIntItem(target.getSize() + 1); + if (target.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", this.getMetadata() ); } - up = factory.createInsertIntoArrayPrimitive(target, locator, Collections.singletonList(content)); + up = factory.createInsertIntoArrayPrimitive( + target, + locator, + Collections.singletonList(content), + this.getMetadata() + ); } else { throw new InvalidUpdateTargetException( "Append expression target must be a single array", diff --git a/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java index c9a4dc6aae..e05c026095 100644 --- a/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java @@ -83,6 +83,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.getMetadata() ); } + if (main.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", @@ -97,6 +100,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.getMetadata() ); } + if (main.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", diff --git a/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java index 297156cdd6..f36e3b8ebf 100644 --- a/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java @@ -42,7 +42,7 @@ public InsertExpressionIterator( } public boolean hasPositionIterator() { - return positionIterator != null; + return this.positionIterator != null; } @Override @@ -84,7 +84,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { try { main = this.mainIterator.materializeExactlyOneItem(context); - content = (Item) SerializationUtils.clone(this.toInsertIterator.materializeExactlyOneItem(context)); + content = SerializationUtils.clone(this.toInsertIterator.materializeExactlyOneItem(context)); if (this.hasPositionIterator()) { locator = this.positionIterator.materializeExactlyOneItem(context); } @@ -103,13 +103,16 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.getMetadata() ); } + if (main.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", this.getMetadata() ); } - up = factory.createInsertIntoObjectPrimitive(main, content); + up = factory.createInsertIntoObjectPrimitive(main, content, this.getMetadata()); } else if (main.isArray()) { if (locator == null) { throw new CannotCastUpdateSelectorException("Insert expression selector is null", this.getMetadata()); @@ -120,13 +123,21 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.getMetadata() ); } + if (main.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", this.getMetadata() ); } - up = factory.createInsertIntoArrayPrimitive(main, locator, Collections.singletonList(content)); + up = factory.createInsertIntoArrayPrimitive( + main, + locator, + Collections.singletonList(content), + this.getMetadata() + ); } else { throw new InvalidUpdateTargetException( "Insert expression target must be a single array or object", diff --git a/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java index 57fbf49e50..9f0142399f 100644 --- a/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java @@ -90,6 +90,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.getMetadata() ); } + if (target.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", diff --git a/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java index 25ce38dea5..e32445f544 100644 --- a/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java @@ -74,7 +74,6 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { Item target; Item locator; Item content; - try { target = this.mainIterator.materializeExactlyOneItem(context); locator = this.locatorIterator.materializeExactlyOneItem(context); @@ -94,7 +93,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { for (Item item : tempContent) { copyContent.add((Item) SerializationUtils.clone(item)); } - content = ItemFactory.getInstance().createArrayItem(copyContent); + content = ItemFactory.getInstance().createArrayItem(copyContent, true); } UpdatePrimitiveFactory factory = UpdatePrimitiveFactory.getInstance(); @@ -106,6 +105,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.getMetadata() ); } + if (target.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", @@ -120,6 +122,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) { this.getMetadata() ); } + if (target.getMutabilityLevel() == -1) { + throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata()); + } if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) { throw new TransformModifiesNonCopiedValueException( "Attempt to modify currently immutable target", diff --git a/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java index fb1a24a0f4..85ae6484c8 100644 --- a/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java @@ -46,20 +46,20 @@ public TransformExpressionIterator( protected JavaRDD getRDDAux(DynamicContext context) { PendingUpdateList pul = getPendingUpdateList(context); pul.applyUpdates(this.getMetadata()); - return returnIterator.getRDD(context); + return this.returnIterator.getRDD(context); } @Override protected void openLocal() { PendingUpdateList pul = getPendingUpdateList(this.currentDynamicContextForLocalExecution); pul.applyUpdates(this.getMetadata()); - returnIterator.open(this.currentDynamicContextForLocalExecution); + this.returnIterator.open(this.currentDynamicContextForLocalExecution); } @Override protected void closeLocal() { - returnIterator.close(); - for (Name copyVar : copyDeclMap.keySet()) { + this.returnIterator.close(); + for (Name copyVar : this.copyDeclMap.keySet()) { this.currentDynamicContextForLocalExecution.getVariableValues().removeVariable(copyVar); } } @@ -68,35 +68,39 @@ protected void closeLocal() { protected void resetLocal() { PendingUpdateList pul = getPendingUpdateList(this.currentDynamicContextForLocalExecution); pul.applyUpdates(this.getMetadata()); - returnIterator.reset(this.currentDynamicContextForLocalExecution); + this.returnIterator.reset(this.currentDynamicContextForLocalExecution); } @Override protected boolean hasNextLocal() { - return returnIterator.hasNext(); + return this.returnIterator.hasNext(); } @Override protected Item nextLocal() { - return returnIterator.next(); + return this.returnIterator.next(); } @Override public PendingUpdateList getPendingUpdateList(DynamicContext context) { bindCopyDeclarations(context); - context.setCurrentMutabilityLevel(this.mutabilityLevel); - return modifyIterator.getPendingUpdateList(context); + DynamicContext newCtx = new DynamicContext(context); + newCtx.setCurrentMutabilityLevel(this.mutabilityLevel); + return this.modifyIterator.getPendingUpdateList(newCtx); } private void bindCopyDeclarations(DynamicContext context) { - for (Name copyVar : copyDeclMap.keySet()) { - RuntimeIterator copyIterator = copyDeclMap.get(copyVar); + for (Name copyVar : this.copyDeclMap.keySet()) { + RuntimeIterator copyIterator = this.copyDeclMap.get(copyVar); List toCopy = copyIterator.materialize(context); List copy = new ArrayList<>(); Item temp; for (Item item : toCopy) { - temp = (Item) SerializationUtils.clone(item); + temp = SerializationUtils.clone(item); temp.setMutabilityLevel(this.mutabilityLevel); + // TODO: Currently avoids copied delta items being updated via applyDelta but perhaps should be checked + // with mutability level + temp.setTableLocation(null); copy.add(temp); } context.getVariableValues().addVariableValue(copyVar, copy); diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java index 8cf51f57bb..e204578079 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java @@ -1,8 +1,14 @@ package org.rumbledb.runtime.update.primitives; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.rumbledb.api.Item; import org.rumbledb.exceptions.CannotResolveUpdateSelectorException; import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.types.ItemType; +import org.rumbledb.types.ItemTypeFactory; +import sparksoniq.spark.SparkSessionManager; + public class DeleteFromArrayPrimitive implements UpdatePrimitive { @@ -23,9 +29,53 @@ public DeleteFromArrayPrimitive(Item targetArray, Item positionInt, ExceptionMet @Override public void apply() { + if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) { + this.applyItem(); + } else { + this.applyDelta(); + } + } + + @Override + public void applyItem() { this.target.removeItemAt(this.selector.getIntValue() - 1); } + @Override + public void applyDelta() { + String pathIn = this.target.getPathIn().substring(this.target.getPathIn().indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + + if (startOfArrayIndexing == -1) { + String selectArrayQuery = "SELECT " + + pathIn + + " AS `" + + SparkSessionManager.atomicJSONiqItemColumnName + + "` FROM delta.`" + + location + + "` WHERE rowID == " + + rowID; + + Dataset arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery); + + ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema()) + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType(); + String setClause = "SET " + pathIn + " = "; + this.applyItem(); + setClause = setClause + this.target.getSparkSQLValue(arrayType); + + String query = "UPDATE delta.`" + location + "` " + setClause + " WHERE rowID == " + rowID; + + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + } else { + this.arrayIndexingApplyDelta(); + } + } + @Override public boolean hasSelector() { return true; @@ -33,17 +83,17 @@ public boolean hasSelector() { @Override public Item getTarget() { - return target; + return this.target; } @Override public Item getSelector() { - return selector; + return this.selector; } @Override public int getIntSelector() { - return selector.getIntValue(); + return this.selector.getIntValue(); } @Override diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java index a55b5b9a3e..5bd8918c24 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java @@ -3,11 +3,13 @@ import org.rumbledb.api.Item; import org.rumbledb.exceptions.CannotResolveUpdateSelectorException; import org.rumbledb.exceptions.ExceptionMetadata; +import sparksoniq.spark.SparkSessionManager; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; +import static org.apache.spark.sql.functions.*; + public class DeleteFromObjectPrimitive implements UpdatePrimitive { private Item target; @@ -30,6 +32,15 @@ public DeleteFromObjectPrimitive(Item targetObject, List namesToRemove, Ex @Override public void apply() { + if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) { + this.applyItem(); + } else { + this.applyDelta(); + } + } + + @Override + public void applyItem() { for ( String str : this.content.stream().map(Item::getStringValue).collect(Collectors.toList()) ) { @@ -37,6 +48,28 @@ public void apply() { } } + @Override + public void applyDelta() { + String tempPathIn = this.target.getPathIn() + "."; + String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + + if (startOfArrayIndexing == -1) { + List setFieldsToNulls = this.content.stream() + .map(i -> pathIn + i.getStringValue() + " = NULL") + .collect(Collectors.toList()); + String concatSetNulls = String.join(", ", setFieldsToNulls); + + String query = "UPDATE delta.`" + location + "` SET " + concatSetNulls + " WHERE rowID == " + rowID; + + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + } else { + this.arrayIndexingApplyDelta(); + } + } + @Override public boolean hasSelector() { return false; @@ -44,12 +77,12 @@ public boolean hasSelector() { @Override public Item getTarget() { - return target; + return this.target; } @Override public List getContentList() { - return content; + return this.content; } @Override @@ -57,10 +90,4 @@ public boolean isDeleteObject() { return true; } - public static List mergeSources(List first, List second) { - List merged = new ArrayList<>(first); - merged.addAll(second); - merged = merged.stream().distinct().collect(Collectors.toList()); - return merged; - } } diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java index a6f2d9b4e8..2dc0c8e3c5 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java @@ -1,6 +1,13 @@ package org.rumbledb.runtime.update.primitives; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.rumbledb.api.Item; +import org.rumbledb.exceptions.CannotResolveUpdateSelectorException; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.types.ItemType; +import org.rumbledb.types.ItemTypeFactory; +import sparksoniq.spark.SparkSessionManager; import java.util.ArrayList; import java.util.List; @@ -11,12 +18,17 @@ public class InsertIntoArrayPrimitive implements UpdatePrimitive { private Item selector; private List content; - public InsertIntoArrayPrimitive(Item targetArray, Item positionInt, List sourceSequence) { - if (!targetArray.isArray() || !positionInt.isNumeric()) { - // TODO ERROR - } - if (positionInt.getIntValue() < 0 || positionInt.getIntValue() >= targetArray.getSize()) { - // TODO throw error or do nothing? + public InsertIntoArrayPrimitive( + Item targetArray, + Item positionInt, + List sourceSequence, + ExceptionMetadata metadata + ) { + if (positionInt.getIntValue() <= 0 || positionInt.getIntValue() > targetArray.getSize() + 1) { + throw new CannotResolveUpdateSelectorException( + "Cannot insert item at index out of range of target array", + metadata + ); } this.target = targetArray; @@ -27,9 +39,60 @@ public InsertIntoArrayPrimitive(Item targetArray, Item positionInt, List s @Override public void apply() { + if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) { + this.applyItem(); + } else { + this.applyDelta(); + } + } + + @Override + public void applyItem() { this.target.putItemsAt(this.content, this.selector.getIntValue() - 1); } + @Override + public void applyDelta() { + // TODO: Properly discern ItemType to SQLType + // TODO: Sort out types for value item + // ASSUMES ArrayType ONLY CONTAINS 1 TYPE AND INSERTION OF A DIFF TYPE IS INVALID + // TODO: perhaps check for homogenous typing of array w/o relying on SQL error + + String pathIn = this.target.getPathIn().substring(this.target.getPathIn().indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + // DeltaTable dt = DeltaTable.forPath(SparkSessionManager.getInstance().getOrCreateSession(), location); + + if (startOfArrayIndexing == -1) { + String selectArrayQuery = "SELECT " + + pathIn + + " AS `" + + SparkSessionManager.atomicJSONiqItemColumnName + + "` FROM delta.`" + + location + + "` WHERE rowID == " + + rowID; + + Dataset arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery); + + ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema()) + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType(); + + String setClause = pathIn + " = "; + this.applyItem(); + setClause = setClause + this.target.getSparkSQLValue(arrayType); + + String setFieldQuery = "UPDATE delta.`" + location + "` SET " + setClause + " WHERE rowID == " + rowID; + + SparkSessionManager.getInstance().getOrCreateSession().sql(setFieldQuery); + } else { + this.arrayIndexingApplyDelta(); + } + } + @Override public boolean hasSelector() { return true; @@ -37,22 +100,22 @@ public boolean hasSelector() { @Override public Item getTarget() { - return target; + return this.target; } @Override public Item getSelector() { - return selector; + return this.selector; } @Override public int getIntSelector() { - return selector.getIntValue(); + return this.selector.getIntValue(); } @Override public List getContentList() { - return content; + return this.content; } @Override diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java index 4bcd0eb1a2..e4093e3f06 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java @@ -1,11 +1,15 @@ package org.rumbledb.runtime.update.primitives; +import org.apache.spark.sql.AnalysisException; import org.rumbledb.api.Item; import org.rumbledb.exceptions.*; import org.rumbledb.items.ItemFactory; +import sparksoniq.spark.SparkSessionManager; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; + public class InsertIntoObjectPrimitive implements UpdatePrimitive { @@ -13,9 +17,14 @@ public class InsertIntoObjectPrimitive implements UpdatePrimitive { private Item content; - public InsertIntoObjectPrimitive(Item targetObject, Item contentObject) { - if (!targetObject.isObject() || !contentObject.isObject()) { - // TODO: ERROR + public InsertIntoObjectPrimitive(Item targetObject, Item contentObject, ExceptionMetadata metadata) { + for (String key : contentObject.getKeys()) { + if (targetObject.getItemByKey(key) != null) { + throw new DuplicateKeyOnUpdateApplyException( + "cannot insert a key already present in an object", + metadata + ); + } } this.target = targetObject; this.content = contentObject; @@ -23,6 +32,15 @@ public InsertIntoObjectPrimitive(Item targetObject, Item contentObject) { @Override public void apply() { + if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) { + this.applyItem(); + } else { + this.applyDelta(); + } + } + + @Override + public void applyItem() { try { for (String key : this.content.getKeys()) { this.target.putItemByKey(key, this.content.getItemByKey(key)); @@ -32,6 +50,55 @@ public void apply() { } } + @Override + public void applyDelta() { + // TODO: Properly discern ItemType to SQLType + // TODO: Sort out types for value item + + String tempPathIn = this.target.getPathIn() + "."; + String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + + if (startOfArrayIndexing == -1) { + + List columnsClauseList = new ArrayList<>(); + List setClauseList = new ArrayList<>(); + List keys = this.content.getKeys(); + List values = this.content.getValues(); + for (int i = 0; i < keys.size(); i++) { + columnsClauseList.add(pathIn + keys.get(i) + " " + values.get(i).getSparkSQLType()); + setClauseList.add(pathIn + keys.get(i) + " = " + values.get(i).getSparkSQLValue()); + } + + String setClauses = String.join(", ", setClauseList); + + List insertColumnQueries = columnsClauseList.stream() + .map(c -> "ALTER TABLE delta.`" + location + "` ADD COLUMNS (" + c + ");") + .collect(Collectors.toList()); + + String setFieldQuery = "UPDATE delta.`" + location + "` SET " + setClauses + " WHERE rowID == " + rowID; + + SparkSessionManager manager = SparkSessionManager.getInstance(); + + // SKIP CREATING NEW COL FOR COL THAT ALREADY EXISTS + for (String insertColumnQuery : insertColumnQueries) { + try { + manager.getOrCreateSession().sql(insertColumnQuery); + } catch (Exception e) { + if (!(e instanceof AnalysisException)) { + throw e; + } + } + } + manager.getOrCreateSession().sql(setFieldQuery); + } else { + this.arrayIndexingApplyDelta(); + // TODO: Add new column for changed array and do the null trick -- do not forget the nullable etc + } + } + @Override public boolean hasSelector() { return false; @@ -57,6 +124,44 @@ public boolean isInsertObject() { return true; } + @Override + public boolean updatesSchemaDelta() { + return true; + } + + @Override + public void arrayIndexingUpdateSchemaDelta() { + String tempPathIn = this.target.getPathIn() + "."; + String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1); + String location = this.target.getTableLocation(); + + String pathInSchema = pathIn.replaceAll("\\[\\d+]", ".element"); + + List columnsClauseList = new ArrayList<>(); + List keys = this.content.getKeys(); + List values = this.content.getValues(); + for (int i = 0; i < keys.size(); i++) { + columnsClauseList.add(pathInSchema + keys.get(i) + " " + values.get(i).getSparkSQLType()); + } + + List insertColumnQueries = columnsClauseList.stream() + .map(c -> "ALTER TABLE delta.`" + location + "` ADD COLUMNS (" + c + ");") + .collect(Collectors.toList()); + + SparkSessionManager manager = SparkSessionManager.getInstance(); + + // SKIP CREATING NEW COL FOR COL THAT ALREADY EXISTS + for (String insertColumnQuery : insertColumnQueries) { + try { + manager.getOrCreateSession().sql(insertColumnQuery); + } catch (Exception e) { + if (!(e instanceof AnalysisException)) { + throw e; + } + } + } + } + public static Item mergeSources(Item first, Item second, ExceptionMetadata metadata) { Item res; @@ -67,7 +172,7 @@ public static Item mergeSources(Item first, Item second, ExceptionMetadata metad values.addAll(second.getValues()); try { - res = ItemFactory.getInstance().createObjectItem(keys, values, metadata); + res = ItemFactory.getInstance().createObjectItem(keys, values, metadata, false); } catch (DuplicateObjectKeyException e) { throw new DuplicateObjectInsertSourceException(e.getMessage(), metadata); } diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java index 01c0d4037b..538c36cae3 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java @@ -1,8 +1,16 @@ package org.rumbledb.runtime.update.primitives; +import org.apache.spark.sql.AnalysisException; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.rumbledb.api.Item; import org.rumbledb.exceptions.CannotResolveUpdateSelectorException; import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.types.ItemType; +import org.rumbledb.types.ItemTypeFactory; +import sparksoniq.spark.SparkSessionManager; + +import static org.apache.spark.sql.functions.col; public class RenameInObjectPrimitive implements UpdatePrimitive { @@ -32,6 +40,15 @@ public RenameInObjectPrimitive( @Override public void apply() { + if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) { + this.applyItem(); + } else { + this.applyDelta(); + } + } + + @Override + public void applyItem() { String name = this.selector.getStringValue(); if (this.target.getKeys().contains(name)) { Item item = this.target.getItemByKey(name); @@ -41,6 +58,61 @@ public void apply() { // TODO: implement replace and rename methods for Array & Object to avoid deletion and append } + @Override + public void applyDelta() { + String tempPathIn = this.target.getPathIn() + "."; + String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + + if (startOfArrayIndexing == -1) { + String oldName = this.selector.getStringValue(); + + String fullOldPath = pathIn + oldName; + String fullNewPath = pathIn + this.content.getStringValue(); + + String setOldFieldClause = fullOldPath + " = NULL"; + String setNewFieldClause = fullNewPath + " = " + this.target.getItemByKey(oldName).getSparkSQLValue(); + String type = SparkSessionManager.getInstance() + .getOrCreateSession() + .sql("DESC (SELECT " + fullOldPath + " FROM delta.`" + location + "`)") + .filter(col("col_name").equalTo(oldName)) + .select("data_type") + .collectAsList() + .get(0) + .getString(0); + + String insertNewColumnQuery = "ALTER TABLE delta.`" + + location + + "` ADD COLUMNS (" + + fullNewPath + + " " + + type + + ");"; + String setFieldsQuery = "UPDATE delta.`" + + location + + "` SET " + + setOldFieldClause + + ", " + + setNewFieldClause + + " WHERE rowID == " + + rowID; + + // SKIP INSERTING NEW COL IF COL ALREADY EXISTS + try { + SparkSessionManager.getInstance().getOrCreateSession().sql(insertNewColumnQuery); + } catch (Exception e) { + if (!(e instanceof AnalysisException)) { + throw e; + } + } + SparkSessionManager.getInstance().getOrCreateSession().sql(setFieldsQuery); + } else { + this.arrayIndexingApplyDelta(); + } + } + @Override public boolean hasSelector() { return true; @@ -48,21 +120,71 @@ public boolean hasSelector() { @Override public Item getTarget() { - return target; + return this.target; } @Override public Item getSelector() { - return selector; + return this.selector; } @Override public Item getContent() { - return content; + return this.content; } @Override public boolean isRenameObject() { return true; } + + @Override + public boolean updatesSchemaDelta() { + return true; + } + + @Override + public void arrayIndexingUpdateSchemaDelta() { + String tempPathIn = this.target.getPathIn() + "."; + String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + + String selectColQuery = "SELECT " + + pathIn + + this.selector.getStringValue() + + " AS `" + + SparkSessionManager.atomicJSONiqItemColumnName + + "` FROM delta.`" + + location + + "` WHERE rowID == " + + rowID; + + Dataset colDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectColQuery); + + ItemType colType = ItemTypeFactory.createItemType(colDF.schema()) + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType(); + + String pathInSchema = pathIn.replaceAll("\\[\\d+]", ".element"); + String fullNewPath = pathInSchema + this.content.getStringValue(); + + String insertNewColumnQuery = "ALTER TABLE delta.`" + + location + + "` ADD COLUMNS (" + + fullNewPath + + " " + + colType.getSparkSQLType() + + ");"; + + // SKIP INSERTING NEW COL IF COL ALREADY EXISTS + try { + SparkSessionManager.getInstance().getOrCreateSession().sql(insertNewColumnQuery); + } catch (Exception e) { + if (!(e instanceof AnalysisException)) { + throw e; + } + } + } } diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java index 9be2c98200..04d027b242 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java @@ -1,8 +1,14 @@ package org.rumbledb.runtime.update.primitives; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.rumbledb.api.Item; import org.rumbledb.exceptions.CannotResolveUpdateSelectorException; import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.types.ItemType; +import org.rumbledb.types.ItemTypeFactory; +import sparksoniq.spark.SparkSessionManager; + public class ReplaceInArrayPrimitive implements UpdatePrimitive { @@ -30,6 +36,15 @@ public ReplaceInArrayPrimitive( @Override public void apply() { + if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) { + this.applyItem(); + } else { + this.applyDelta(); + } + } + + @Override + public void applyItem() { int index = this.selector.getIntValue() - 1; if (index >= 0 || index < this.target.getSize()) { this.target.removeItemAt(index); @@ -41,6 +56,47 @@ public void apply() { } } + @Override + public void applyDelta() { + // TODO: Sort out diff types of content Item + // TODO: Find out name of array column + // ASSUME pathIn CONTAINS ARRAYFIELD NAME + // PERHAPS CASE OF REPLACING ARRAY WITH 1 ITEM SHOULD CREATE NEW ARRAYCOL WITH CORRECTED TYPE IF TYPE CHANGES + + String pathIn = this.target.getPathIn().substring(this.target.getPathIn().indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + + if (startOfArrayIndexing == -1) { + String selectArrayQuery = "SELECT " + + pathIn + + " AS `" + + SparkSessionManager.atomicJSONiqItemColumnName + + "` FROM delta.`" + + location + + "` WHERE rowID == " + + rowID; + + Dataset arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery); + + ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema()) + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType(); + + String setField = pathIn + " = "; + this.applyItem(); + setField = setField + this.target.getSparkSQLValue(arrayType); + + String query = "UPDATE delta.`" + location + "` SET " + setField + " WHERE rowID == " + rowID; + + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + } else { + this.arrayIndexingApplyDelta(); + } + } + @Override public boolean hasSelector() { return true; @@ -48,22 +104,22 @@ public boolean hasSelector() { @Override public Item getTarget() { - return target; + return this.target; } @Override public Item getSelector() { - return selector; + return this.selector; } @Override public int getIntSelector() { - return selector.getIntValue(); + return this.selector.getIntValue(); } @Override public Item getContent() { - return content; + return this.content; } @Override diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java index cfa9c68e9c..e8ddd3ab58 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java @@ -3,6 +3,10 @@ import org.rumbledb.api.Item; import org.rumbledb.exceptions.CannotResolveUpdateSelectorException; import org.rumbledb.exceptions.ExceptionMetadata; +import sparksoniq.spark.SparkSessionManager; + + +import static org.apache.spark.sql.functions.*; public class ReplaceInObjectPrimitive implements UpdatePrimitive { @@ -19,7 +23,7 @@ public ReplaceInObjectPrimitive( if (targetObject.getItemByKey(targetName.getStringValue()) == null) { throw new CannotResolveUpdateSelectorException( - "Cannot delete key that does not exist in target object", + "Cannot replace key that does not exist in target object", metadata ); } @@ -31,6 +35,15 @@ public ReplaceInObjectPrimitive( @Override public void apply() { + if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) { + this.applyItem(); + } else { + this.applyDelta(); + } + } + + @Override + public void applyItem() { String name = this.getSelector().getStringValue(); if (this.getTarget().getKeys().contains(name)) { this.getTarget().removeItemByKey(name); @@ -38,6 +51,29 @@ public void apply() { } } + @Override + public void applyDelta() { + // TODO: Sort out diff types of content Item + // PERHAPS CHANGE OF TYPE SHOULD CREATE NEW COLUMN? + + String tempPathIn = this.target.getPathIn() + "."; + String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1); + String location = this.target.getTableLocation(); + long rowID = this.target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + + if (startOfArrayIndexing == -1) { + + String setField = pathIn + this.selector.getStringValue() + " = " + this.content.getSparkSQLValue(); + + String query = "UPDATE delta.`" + location + "` SET " + setField + " WHERE rowID == " + rowID; + + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + } else { + this.arrayIndexingApplyDelta(); + } + } + @Override public boolean hasSelector() { return true; diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java index 7827587d36..af73ecea42 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java @@ -1,13 +1,26 @@ package org.rumbledb.runtime.update.primitives; +import org.apache.spark.api.java.JavaRDD; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.rumbledb.api.Item; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.items.parsing.RowToItemMapper; +import org.rumbledb.types.ItemType; +import org.rumbledb.types.ItemTypeFactory; +import sparksoniq.spark.SparkSessionManager; +import java.util.Arrays; import java.util.List; public interface UpdatePrimitive { void apply(); + void applyItem(); + + void applyDelta(); + boolean hasSelector(); Item getTarget(); @@ -56,5 +69,82 @@ default boolean isRenameObject() { return false; } + default boolean updatesSchemaDelta() { + return false; + } + + default void arrayIndexingUpdateSchemaDelta() { + throw new UnsupportedOperationException("Operation not defined"); + } + + default void arrayIndexingApplyDelta() { + Item target = this.getTarget(); + + String pathIn = target.getPathIn().substring(target.getPathIn().indexOf(".") + 1); + String location = target.getTableLocation(); + long rowID = target.getTopLevelID(); + int startOfArrayIndexing = pathIn.indexOf("["); + + String preIndexingPathIn = pathIn.substring(0, startOfArrayIndexing); + String postIndexingPathIn = pathIn.substring(startOfArrayIndexing); + List fields = Arrays.asList(postIndexingPathIn.split("\\.")); + + // TODO: Perhaps an if here to update schema if required but need to sort out new name of array column -- + if (this.updatesSchemaDelta()) { + this.arrayIndexingUpdateSchemaDelta(); + } + + String selectArrayQuery = "SELECT " + + preIndexingPathIn + + " AS `" + + SparkSessionManager.atomicJSONiqItemColumnName + + "` FROM delta.`" + + location + + "` WHERE rowID == " + + rowID; + + Dataset arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery); + + ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema()) + .getObjectContentFacet() + .get(SparkSessionManager.atomicJSONiqItemColumnName) + .getType(); + + JavaRDD rowRDD = arrayDF.javaRDD(); + JavaRDD itemRDD = rowRDD.map(new RowToItemMapper(ExceptionMetadata.EMPTY_METADATA, arrayType)); + List collectedItems = itemRDD.take(2); + Item originalArray = collectedItems.get(0); + // TODO: errors if 0 items or more than one item + + Item innerItem = originalArray; + for (int i = 0; i < fields.size() - 1; i++) { + String field = fields.get(i); + if (innerItem.isObject()) { + innerItem = innerItem.getItemByKey(field); + } else if (innerItem.isArray()) { + int index = Integer.parseInt(field.substring(field.indexOf("[") + 1, field.indexOf("]"))); + innerItem = innerItem.getItemAt(index); + } + } + + String finalSelector = fields.get(fields.size() - 1); + this.applyItem(); + if (innerItem.isObject()) { + innerItem.removeItemByKey(finalSelector); + innerItem.putItemByKey(finalSelector, this.getTarget()); + } else if (innerItem.isArray()) { + int finalIndex = Integer.parseInt( + finalSelector.substring(finalSelector.indexOf("[") + 1, finalSelector.indexOf("]")) + ); + innerItem.removeItemAt(finalIndex); + innerItem.putItemAt(this.getTarget(), finalIndex); + } + + String setClause = preIndexingPathIn + " = " + originalArray.getSparkSQLValue(arrayType); + String query = "UPDATE delta.`" + location + "` SET " + setClause + " WHERE rowID == " + rowID; + + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + } + } diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java index 2dc938b1c2..c351803af8 100644 --- a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java +++ b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java @@ -32,12 +32,21 @@ public UpdatePrimitive createDeleteFromObjectPrimitive( return new DeleteFromObjectPrimitive(targetObject, selectorStrs, metadata); } - public UpdatePrimitive createInsertIntoArrayPrimitive(Item targetArray, Item selectorInt, List contents) { - return new InsertIntoArrayPrimitive(targetArray, selectorInt, contents); + public UpdatePrimitive createInsertIntoArrayPrimitive( + Item targetArray, + Item selectorInt, + List contents, + ExceptionMetadata metadata + ) { + return new InsertIntoArrayPrimitive(targetArray, selectorInt, contents, metadata); } - public UpdatePrimitive createInsertIntoObjectPrimitive(Item targetObject, Item contentsObject) { - return new InsertIntoObjectPrimitive(targetObject, contentsObject); + public UpdatePrimitive createInsertIntoObjectPrimitive( + Item targetObject, + Item contentsObject, + ExceptionMetadata metadata + ) { + return new InsertIntoObjectPrimitive(targetObject, contentsObject, metadata); } public UpdatePrimitive createReplaceInArrayPrimitive( diff --git a/src/main/java/org/rumbledb/server/RumbleHttpHandler.java b/src/main/java/org/rumbledb/server/RumbleHttpHandler.java index 5899742ed1..8581c4311a 100644 --- a/src/main/java/org/rumbledb/server/RumbleHttpHandler.java +++ b/src/main/java/org/rumbledb/server/RumbleHttpHandler.java @@ -155,7 +155,7 @@ private static Item assembleResponse(RumbleRuntimeConfiguration configuration, L ); } else { if (results != null) { - Item values = ItemFactory.getInstance().createArrayItem(results); + Item values = ItemFactory.getInstance().createArrayItem(results, false); output.putItemByKey("values", values); } } diff --git a/src/main/java/org/rumbledb/types/ArrayItemType.java b/src/main/java/org/rumbledb/types/ArrayItemType.java index ddf40af11e..34d0ab69ee 100644 --- a/src/main/java/org/rumbledb/types/ArrayItemType.java +++ b/src/main/java/org/rumbledb/types/ArrayItemType.java @@ -266,4 +266,12 @@ public boolean isCompatibleWithDataFrames(RumbleRuntimeConfiguration configurati return this.content.isCompatibleWithDataFrames(configuration); } + @Override + public String getSparkSQLType() { + StringBuilder sb = new StringBuilder(); + sb.append("ARRAY<"); + sb.append(this.getArrayContentFacet().getSparkSQLType()); + sb.append(">"); + return sb.toString(); + } } diff --git a/src/main/java/org/rumbledb/types/AtomicItemType.java b/src/main/java/org/rumbledb/types/AtomicItemType.java index 02b3b48e82..a4c3fb22e6 100644 --- a/src/main/java/org/rumbledb/types/AtomicItemType.java +++ b/src/main/java/org/rumbledb/types/AtomicItemType.java @@ -547,4 +547,24 @@ public boolean isCompatibleWithDataFrames(RumbleRuntimeConfiguration configurati } return true; } + + @Override + public String getSparkSQLType() { + if (this.getPrimitiveType().equals(stringItem)) { + return "STRING"; + } + if (this.getPrimitiveType().equals(booleanItem)) { + return "BOOLEAN"; + } + if (this.getPrimitiveType().equals(doubleItem)) { + return "DOUBLE"; + } + if (this.getPrimitiveType().equals(floatItem)) { + return "FLOAT"; + } + if (this.getPrimitiveType().equals(decimalItem)) { + return "DECIMAL"; + } + throw new UnsupportedOperationException("getSparkSQLType is unsupported for " + this.getPrimitiveType()); + } } diff --git a/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java b/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java index 1f7ba3822a..a6e6b27258 100644 --- a/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java +++ b/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java @@ -613,4 +613,21 @@ public void processBaseType() { ExceptionMetadata.EMPTY_METADATA ); } + + @Override + public String getSparkSQLType() { + if (this.equals(BuiltinTypesCatalogue.integerItem)) { + return "INT"; + } + if (this.equals(BuiltinTypesCatalogue.intItem)) { + return "INT"; + } + if (this.equals(BuiltinTypesCatalogue.longItem)) { + return "LONG"; + } + if (this.equals(BuiltinTypesCatalogue.shortItem)) { + return "SHORT"; + } + return this.primitiveType.getSparkSQLType(); + } } diff --git a/src/main/java/org/rumbledb/types/FunctionSignature.java b/src/main/java/org/rumbledb/types/FunctionSignature.java index be9defb075..8e5369e121 100644 --- a/src/main/java/org/rumbledb/types/FunctionSignature.java +++ b/src/main/java/org/rumbledb/types/FunctionSignature.java @@ -26,14 +26,24 @@ public class FunctionSignature implements Serializable { private List parameterTypes; private SequenceType returnType; + private boolean isUpdating; private static final long serialVersionUID = 1L; public FunctionSignature( List parameterTypes, - SequenceType returnType + SequenceType returnType, + boolean isUpdating ) { this.parameterTypes = parameterTypes; this.returnType = returnType; + this.isUpdating = isUpdating; + } + + public FunctionSignature( + List parameterTypes, + SequenceType returnType + ) { + this(parameterTypes, returnType, false); } @@ -45,6 +55,10 @@ public SequenceType getReturnType() { return this.returnType; } + public boolean isUpdating() { + return this.isUpdating; + } + @Override public boolean equals(Object instance) { return instance instanceof FunctionSignature diff --git a/src/main/java/org/rumbledb/types/ItemType.java b/src/main/java/org/rumbledb/types/ItemType.java index 101c5978a6..c51604f2e8 100644 --- a/src/main/java/org/rumbledb/types/ItemType.java +++ b/src/main/java/org/rumbledb/types/ItemType.java @@ -451,6 +451,15 @@ default boolean isCompatibleWithDataFrames(RumbleRuntimeConfiguration configurat return false; } + /** + * Returns the SparkSQL type of the item type for use in a query. + * + * @return String representing the SparkSQL type of the item type. + */ + default String getSparkSQLType() { + throw new UnsupportedOperationException("Operation not defined for type " + this.getName()); + } + String toString(); default boolean isResolved() { diff --git a/src/main/java/org/rumbledb/types/ObjectItemType.java b/src/main/java/org/rumbledb/types/ObjectItemType.java index 7c189dcbb4..5bb2b3f66d 100644 --- a/src/main/java/org/rumbledb/types/ObjectItemType.java +++ b/src/main/java/org/rumbledb/types/ObjectItemType.java @@ -372,4 +372,28 @@ public void checkSubtypeConsistency() { ); } } + + + @Override + public String getSparkSQLType() { + StringBuilder sb = new StringBuilder(); + Map content = this.getObjectContentFacet(); + String[] keys = content.keySet().toArray(new String[0]); + + sb.append("STRUCT<"); + for (int i = 0; i < keys.length; i++) { + String key = keys[i]; + FieldDescriptor field = content.get(key); + + sb.append(key); + sb.append(":"); + sb.append(field.getType().getSparkSQLType()); + if (i < keys.length - 1) { + sb.append(", "); + } + } + sb.append(">"); + + return sb.toString(); + } } diff --git a/src/main/java/sparksoniq/spark/SparkSessionManager.java b/src/main/java/sparksoniq/spark/SparkSessionManager.java index 17923d698a..cca6a293f0 100644 --- a/src/main/java/sparksoniq/spark/SparkSessionManager.java +++ b/src/main/java/sparksoniq/spark/SparkSessionManager.java @@ -83,12 +83,16 @@ public class SparkSessionManager { private SparkSession session; private JavaSparkContext javaSparkContext; - public static String atomicJSONiqItemColumnName = "0d08af5d-10bb-4a73-af84-c6aac917a830"; - public static String emptyObjectJSONiqItemColumnName = "a84bc646-05af-4383-8853-2e9f31a710f2"; - public static String temporaryColumnName = "0f7b4040-b404-4239-99dd-9b4cf2900594"; - public static String countColumnName = "5af0c0c8-e84c-482a-82ce-1887565cf448"; - public static String rightHandSideHashColumnName = "db273b7d-d927-4c0d-b9c1-665af71faa2b "; - public static String leftHandSideHashColumnName = "171bdb70-7400-48ed-a105-d132f4e38a2d"; + public static String atomicJSONiqItemColumnName = "atomic0d08af5d-10bb-4a73-af84-c6aac917a830"; + public static String emptyObjectJSONiqItemColumnName = "emptyobja84bc646-05af-4383-8853-2e9f31a710f2"; + public static String temporaryColumnName = "tmp0f7b4040-b404-4239-99dd-9b4cf2900594"; + public static String countColumnName = "count5af0c0c8-e84c-482a-82ce-1887565cf448"; + public static String rightHandSideHashColumnName = "rhsdb273b7d-d927-4c0d-b9c1-665af71faa2b "; + public static String leftHandSideHashColumnName = "lhs171bdb70-7400-48ed-a105-d132f4e38a2d"; + public static String mutabilityLevelColumnName = "mutabilityLevel"; + public static String rowIdColumnName = "rowID"; + public static String pathInColumnName = "pathIn"; + public static String tableLocationColumnName = "tableLocation"; private SparkSessionManager() { } @@ -126,6 +130,11 @@ private void setDefaultConfiguration() { this.configuration.setAppName(APP_NAME); } this.configuration.set("spark.sql.crossJoin.enabled", "true"); // enables cartesian product + this.configuration.set("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension"); + this.configuration.set( + "spark.sql.catalog.spark_catalog", + "org.apache.spark.sql.delta.catalog.DeltaCatalog" + ); if (!this.configuration.contains("spark.master")) { this.configuration.set("spark.master", "local[*]"); } diff --git a/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java b/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java index 90933724fe..6048587b3a 100644 --- a/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java +++ b/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java @@ -101,7 +101,8 @@ public Item call(Tuple2 a) { List values = new ArrayList<>(); values.add(ItemFactory.getInstance().createDoubleItem((double) a._1())); values.add(ItemFactory.getInstance().createDoubleItem((double) a._2())); - return ItemFactory.getInstance().createObjectItem(keys, values, ExceptionMetadata.EMPTY_METADATA); + return ItemFactory.getInstance() + .createObjectItem(keys, values, ExceptionMetadata.EMPTY_METADATA, true); } } ); diff --git a/src/main/java/sparksoniq/spark/ml/RumbleMLUtils.java b/src/main/java/sparksoniq/spark/ml/RumbleMLUtils.java index ae3938539d..de967113f9 100644 --- a/src/main/java/sparksoniq/spark/ml/RumbleMLUtils.java +++ b/src/main/java/sparksoniq/spark/ml/RumbleMLUtils.java @@ -245,7 +245,7 @@ public static Item removeParameter(Item paramMapItem, String key, ExceptionMetad int indexToRemove = keys.indexOf(key); keys.remove(indexToRemove); values.remove(indexToRemove); - return ItemFactory.getInstance().createObjectItem(keys, values, metadata); + return ItemFactory.getInstance().createObjectItem(keys, values, metadata, true); } public static JSoundDataFrame createDataFrameContainingVectorizedColumn( diff --git a/src/test/java/iq/DeltaUpdateRuntimeTests.java b/src/test/java/iq/DeltaUpdateRuntimeTests.java new file mode 100644 index 0000000000..b426c24c67 --- /dev/null +++ b/src/test/java/iq/DeltaUpdateRuntimeTests.java @@ -0,0 +1,353 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package iq; + +import iq.base.AnnotationsTestsBase; +import org.apache.commons.io.FileUtils; +import org.rumbledb.cli.JsoniqQueryExecutor; +import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.runtime.functions.input.FileSystemUtil; +import utils.annotations.AnnotationParseException; +import utils.annotations.AnnotationProcessor; +import org.apache.spark.SparkConf; +import org.apache.spark.api.java.JavaRDD; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.rumbledb.api.Item; +import org.rumbledb.api.SequenceOfItems; +import scala.Function0; +import scala.util.Properties; +import sparksoniq.spark.SparkSessionManager; +import utils.FileManager; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.net.URI; +import java.util.*; + +@RunWith(Parameterized.class) +public class DeltaUpdateRuntimeTests extends AnnotationsTestsBase { + + public static final File runtimeTestsDirectory = new File( + System.getProperty("user.dir") + + + "/src/test/resources/test_files/runtime-delta-updates" + ); + public static final String javaVersion = + System.getProperty("java.version"); + public static final String scalaVersion = + Properties.scalaPropOrElse("version.number", new Function0() { + @Override + public String apply() { + return "unknown"; + } + }); + + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--dates-with-timezone", + "yes", + "--print-iterator-tree", + "yes", + "--show-error-info", + "yes", + "--apply-updates", + "yes", + "--materialization-cap", + "900000" + } + ); + } + + protected static final RumbleRuntimeConfiguration createDeltaConfiguration = new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--output-format", + "delta", + "--show-error-info", + "yes", + "--apply-updates", + "yes", + } + ); + + protected static final RumbleRuntimeConfiguration deleteDeltaConfiguration = new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--output-format", + "delta", + "--show-error-info", + "yes", + "--apply-updates", + "yes", + } + ); + + protected static Map> _testFilesMap; + + protected final File testFile; + + + public DeltaUpdateRuntimeTests(File testFile) { + this.testFile = testFile; + } + + public static void readFileList(File dir) throws IOException, AnnotationParseException { + Map> updateDimToFileMap = new TreeMap<>(); + Map innerMap; + for (File file : FileManager.loadJiqFiles(dir)) { + FileReader reader = new FileReader(file.getPath()); + String dims = AnnotationProcessor.getUpdateDimensionAnnotation(reader); + String[] dimsArr = dims.substring(1, dims.length() - 1).split(","); + int dim1 = Integer.parseInt(dimsArr[0]); + int dim2 = Integer.parseInt(dimsArr[1]); + innerMap = updateDimToFileMap.getOrDefault(dim1, new TreeMap<>()); + innerMap.put(dim2, file); + updateDimToFileMap.put(dim1, innerMap); + } + DeltaUpdateRuntimeTests._testFilesMap = updateDimToFileMap; + } + + @Parameterized.Parameters(name = "{index}:{0}") + public static Collection testFiles() throws IOException, AnnotationParseException { + List result = new ArrayList<>(); + DeltaUpdateRuntimeTests.readFileList(DeltaUpdateRuntimeTests.runtimeTestsDirectory); + Map innerMap; + File curr; + for (int i : DeltaUpdateRuntimeTests._testFilesMap.keySet()) { + innerMap = DeltaUpdateRuntimeTests._testFilesMap.get(i); + for (int j : innerMap.keySet()) { + curr = innerMap.get(j); + result.add(new Object[] { curr }); + } + } + return result; + } + + @BeforeClass + public static void setupSparkSession() { + System.err.println("Java version: " + javaVersion); + System.err.println("Scala version: " + scalaVersion); + SparkConf sparkConfiguration = new SparkConf(); + sparkConfiguration.setMaster("local[*]"); + sparkConfiguration.set("spark.submit.deployMode", "client"); + sparkConfiguration.set("spark.executor.extraClassPath", "lib/"); + sparkConfiguration.set("spark.driver.extraClassPath", "lib/"); + sparkConfiguration.set("spark.sql.crossJoin.enabled", "true"); // enables cartesian product + sparkConfiguration.set("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension"); // enables delta + // store + sparkConfiguration.set("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog"); // enables + // delta + // store + + // prevents spark from failing to start on MacOS when disconnected from the internet + sparkConfiguration.set("spark.driver.host", "127.0.0.1"); + + + // sparkConfiguration.set("spark.driver.memory", "2g"); + // sparkConfiguration.set("spark.executor.memory", "2g"); + // sparkConfiguration.set("spark.speculation", "true"); + // sparkConfiguration.set("spark.speculation.quantile", "0.5"); + SparkSessionManager.getInstance().initializeConfigurationAndSession(sparkConfiguration, true); + SparkSessionManager.COLLECT_ITEM_LIMIT = defaultConfiguration.getResultSizeCap(); + System.err.println("Spark version: " + SparkSessionManager.getInstance().getJavaSparkContext().version()); + } + + @Test(timeout = 1000000) + public void testRuntimeIterators() throws Throwable { + System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); + try { + this.currentAnnotation = AnnotationProcessor.readAnnotation( + new FileReader(this.testFile.getAbsolutePath()) + ); + } catch (AnnotationParseException e) { + e.printStackTrace(); + Assert.fail(); + } + boolean didDelete = checkTableDeletion(); + boolean didCreate = checkTableCreation(this.testFile.getAbsolutePath()); + if (!(didCreate || didDelete)) { + testAnnotations(this.testFile.getAbsolutePath(), getConfiguration()); + } + } + + private boolean checkTableCreation(String path) throws IOException, InterruptedException { + if (!this.currentAnnotation.shouldCreateTable()) { + return false; + } + + URI tableURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + this.currentAnnotation.getDeltaTablePath(), + DeltaUpdateRuntimeTests.createDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + URI queryURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + path, + DeltaUpdateRuntimeTests.createDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + + DeltaUpdateRuntimeTests.createDeltaConfiguration.setOutputPath(tableURI.getPath()); + DeltaUpdateRuntimeTests.createDeltaConfiguration.setQueryPath(queryURI.getPath()); + JsoniqQueryExecutor executor = new JsoniqQueryExecutor(DeltaUpdateRuntimeTests.createDeltaConfiguration); + executor.runQuery(); + return true; + } + + private boolean checkTableDeletion() { + if (!this.currentAnnotation.shouldDeleteTable()) { + return false; + } + URI tableURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + this.currentAnnotation.getDeltaTablePath(), + DeltaUpdateRuntimeTests.deleteDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + + try { + File oldTable = new File(tableURI.getPath()); + FileUtils.deleteDirectory(oldTable); + System.err.println("Deleted file: " + oldTable.getAbsolutePath()); + } catch (IOException e) { + e.printStackTrace(); + Assert.fail(); + } + return true; + + } + + @Override + protected void checkExpectedOutput( + String expectedOutput, + SequenceOfItems sequence + ) { + String actualOutput; + if (!sequence.availableAsRDD()) { + actualOutput = runIterators(sequence); + } else { + actualOutput = getRDDResults(sequence); + } + Assert.assertTrue( + "Expected output: " + expectedOutput + "\nActual result: " + actualOutput, + expectedOutput.equals(actualOutput) + ); + // unorderedItemSequenceStringsAreEqual(expectedOutput, actualOutput)); + } + + protected String runIterators(SequenceOfItems sequence) { + String actualOutput = getIteratorOutput(sequence); + applyPossibleUpdates(sequence); + return actualOutput; + } + + protected String getIteratorOutput(SequenceOfItems sequence) { + sequence.open(); + Item result = null; + if (sequence.hasNext()) { + result = sequence.next(); + } + if (result == null) { + return ""; + } + String singleOutput = result.serialize(); + if (!sequence.hasNext()) { + return singleOutput; + } else { + int itemCount = 1; + StringBuilder sb = new StringBuilder(); + sb.append("("); + sb.append(result.serialize()); + sb.append(", "); + while ( + sequence.hasNext() + && + ((itemCount < getConfiguration().getResultSizeCap() + && getConfiguration().getResultSizeCap() > 0) + || + getConfiguration().getResultSizeCap() == 0) + ) { + sb.append(sequence.next().serialize()); + sb.append(", "); + itemCount++; + } + if (sequence.hasNext() && itemCount == getConfiguration().getResultSizeCap()) { + System.err.println( + "Warning! The output sequence contains a large number of items but its materialization was capped at " + + SparkSessionManager.COLLECT_ITEM_LIMIT + + " items. This value can be configured with the --result-size parameter at startup" + ); + } + // remove last comma + String output = sb.toString(); + output = output.substring(0, output.length() - 2); + output += ")"; + return output; + } + } + + private String getRDDResults(SequenceOfItems sequence) { + JavaRDD rdd = sequence.getAsRDD(); + applyPossibleUpdates(sequence); + JavaRDD output = rdd.map(o -> o.serialize()); + List collectedOutput = new ArrayList(); + SparkSessionManager.collectRDDwithLimitWarningOnly(output, collectedOutput); + + + if (collectedOutput.isEmpty()) { + return ""; + } + + if (collectedOutput.size() == 1) { + return collectedOutput.get(0); + } + + StringBuilder sb = new StringBuilder(); + sb.append("("); + for (String item : collectedOutput) { + sb.append(item); + sb.append(", "); + } + + String result = sb.toString(); + result = result.substring(0, result.length() - 2); + result += ")"; + return result; + } + + private void applyPossibleUpdates(SequenceOfItems sequence) { + if (getConfiguration().applyUpdates() && sequence.availableAsPUL()) { + sequence.applyPUL(); + } + } + +} diff --git a/src/test/java/iq/JavaAPITest.java b/src/test/java/iq/JavaAPITest.java index 4eda7162ff..9cb946774c 100644 --- a/src/test/java/iq/JavaAPITest.java +++ b/src/test/java/iq/JavaAPITest.java @@ -34,6 +34,8 @@ import java.util.List; +import static org.apache.spark.sql.functions.*; + public class JavaAPITest { public JavaAPITest() { @@ -48,6 +50,9 @@ public static void setupSparkSession() { sparkConfiguration.set("spark.driver.extraClassPath", "lib/"); sparkConfiguration.set("spark.driver.host", "127.0.0.1"); sparkConfiguration.set("spark.driver.bindAddress", "127.0.0.1"); + sparkConfiguration.set("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension"); + sparkConfiguration.set("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog"); + sparkConfiguration.set("spark.databricks.delta.schema.autoMerge.enabled", "true"); SparkSessionManager.getInstance().initializeConfigurationAndSession(sparkConfiguration, true); } diff --git a/src/test/java/iq/RuntimeTests.java b/src/test/java/iq/RuntimeTests.java index 710f731328..78b31afc69 100644 --- a/src/test/java/iq/RuntimeTests.java +++ b/src/test/java/iq/RuntimeTests.java @@ -33,14 +33,15 @@ import org.junit.runners.Parameterized; import org.rumbledb.api.Item; import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.context.Name; +import org.rumbledb.items.ItemFactory; import scala.util.Properties; import sparksoniq.spark.SparkSessionManager; import utils.FileManager; import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; @RunWith(Parameterized.class) public class RuntimeTests extends AnnotationsTestsBase { @@ -66,6 +67,33 @@ public RuntimeTests(File testFile) { this.testFile = testFile; } + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--variable:externalUnparsedString", + "unparsed string", + "--apply-updates", + "yes" } + ).setExternalVariableValue( + Name.createVariableInNoNamespace("externalStringItem"), + Collections.singletonList(ItemFactory.getInstance().createStringItem("this is a string")) + ) + .setExternalVariableValue( + Name.createVariableInNoNamespace("externalIntegerItems"), + Arrays.asList( + new Item[] { + ItemFactory.getInstance().createIntItem(1), + ItemFactory.getInstance().createIntItem(2), + ItemFactory.getInstance().createIntItem(3), + ItemFactory.getInstance().createIntItem(4), + ItemFactory.getInstance().createIntItem(5), + } + ) + ); + } + public static void readFileList(File dir) { FileManager.loadJiqFiles(dir).forEach(file -> RuntimeTests._testFiles.add(file)); } @@ -88,6 +116,11 @@ public static void setupSparkSession() { sparkConfiguration.set("spark.executor.extraClassPath", "lib/"); sparkConfiguration.set("spark.driver.extraClassPath", "lib/"); sparkConfiguration.set("spark.sql.crossJoin.enabled", "true"); // enables cartesian product + sparkConfiguration.set("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension"); // enables delta + // store + sparkConfiguration.set("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog"); // enables + // delta + // store // prevents spark from failing to start on MacOS when disconnected from the internet sparkConfiguration.set("spark.driver.host", "127.0.0.1"); diff --git a/src/test/java/iq/RuntimeTestsNoInlining.java b/src/test/java/iq/RuntimeTestsNoInlining.java index 04459353dd..8a9c5222eb 100644 --- a/src/test/java/iq/RuntimeTestsNoInlining.java +++ b/src/test/java/iq/RuntimeTestsNoInlining.java @@ -48,7 +48,9 @@ public RumbleRuntimeConfiguration getConfiguration() { "--variable:externalUnparsedString", "unparsed string", "--function-inlining", - "no" } + "no", + "--apply-updates", + "yes" } ).setExternalVariableValue( Name.createVariableInNoNamespace("externalStringItem"), Collections.singletonList(ItemFactory.getInstance().createStringItem("this is a string")) diff --git a/src/test/java/iq/UpdatesForRumbleBenchmark.java b/src/test/java/iq/UpdatesForRumbleBenchmark.java new file mode 100644 index 0000000000..5e46651afe --- /dev/null +++ b/src/test/java/iq/UpdatesForRumbleBenchmark.java @@ -0,0 +1,714 @@ +package iq; + +import org.apache.commons.io.FileUtils; +import org.apache.log4j.LogManager; +import org.apache.spark.SparkConf; +import org.junit.Assert; +import org.rumbledb.api.Item; +import org.rumbledb.api.Rumble; +import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.cli.JsoniqQueryExecutor; +import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.runtime.functions.input.FileSystemUtil; +import scala.Function0; +import scala.util.Properties; +import sparksoniq.spark.SparkSessionManager; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.net.URI; +import java.util.*; +import java.util.function.Consumer; + +public class UpdatesForRumbleBenchmark { + + private static final String APP_NAME = "Rumble application"; + public static final String javaVersion = + System.getProperty("java.version"); + public static final String scalaVersion = + Properties.scalaPropOrElse("version.number", new Function0() { + @Override + public String apply() { + return "unknown"; + } + }); + + public List benchmarkFiles; + + protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--dates-with-timezone", + "yes", + "--print-iterator-tree", + "yes", + "--apply-updates", + "yes", + "--show-error-info", + "yes", + "--materialization-cap", + "900000" + } + ); + + protected static final RumbleRuntimeConfiguration createDeltaConfiguration = new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--output-format", + "delta", + "--show-error-info", + "yes", + "--apply-updates", + "yes", + "--materialization-cap", + "900000" + } + ); + + public UpdatesForRumbleBenchmark() { + this.benchmarkFiles = new ArrayList<>(); + List powersOf2 = new ArrayList<>(); + powersOf2.add(2); + powersOf2.add(4); + powersOf2.add(8); + powersOf2.add(16); + powersOf2.add(32); + powersOf2.add(64); + powersOf2.add(128); + + ////// GH_Q1 + // RUMBLE + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_" + power + + // ".jq", + // "null", + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/createTables/create_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q1/RUMBLE_" + power + ".txt", + // false + // )); + // } + // + // //SPARK + // String queryFirstHalf = "UPDATE delta.`"; + // String queryLastHalf = "` SET public = (NOT public)"; + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "null", + // queryFirstHalf + + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power + queryLastHalf, + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/GH_Q1/createTables/create_table_" + // + power +".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q1/SPARK_" + power + ".txt", + // true + // )); + // } + + ////// GH_Q2 + // RUMBLE + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/GH_Q2/q2_" + power + ".jq", + // "null", + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/createTables/create_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q2/RUMBLE_" + power + ".txt", + // false + // )); + // } + // + // //SPARK + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "null", + // (tables) -> { + // String updateSchemaQuery = "ALTER TABLE delta.`" + tables.get(0) + "` ADD COLUMNS (repo.nickname STRING, + // repo.popularity_rating INT)"; + // String setQuery = "UPDATE delta.`" + tables.get(0) +"` SET repo.nickname = 'cool_nickname', + // repo.popularity_rating = -1;"; + // SparkSessionManager.getInstance().getOrCreateSession().sql(updateSchemaQuery); + // SparkSessionManager.getInstance().getOrCreateSession().sql(setQuery); + // }, + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/createTables/create_table_" + // + power +".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q2/SPARK_" + power + ".txt", + // true + // )); + // } + + ////// GH_Q3 + // RUMBLE + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/GH_Q3/q3_" + power + ".jq", + // "null", + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/createTables/create_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q3/RUMBLE_" + power + ".txt", + // false + // )); + // } + // + // //SPARK + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "null", + // (tables) -> { + // String insertSchemaQuery = "ALTER TABLE delta.`" + tables.get(0) + "` ADD COLUMNS (ids ARRAY>)"; + // String setQuery = "UPDATE delta.`" + tables.get(0) +"` SET ids = array(named_struct('repo_id', repo.id, + // 'actor_id', actor.id, 'id', id)), repo.id = NULL, actor.id = NULL, id = NULL;"; + // SparkSessionManager.getInstance().getOrCreateSession().sql(insertSchemaQuery); + // SparkSessionManager.getInstance().getOrCreateSession().sql(setQuery); + // }, + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/createTables/create_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q3/SPARK_" + power + ".txt", + // true + // )); + // } + + ////// NEW ORDER TRANSACTION + // RUMBLE + for (Integer power : powersOf2) { + benchmarkFiles.add( + new FileTuple( + "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_" + + power + + ".jq", + "null", + Collections.singletonList( + "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/newOrderTable" + + power + ), + Collections.singletonList( + "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_" + + power + + ".jq" + ), + "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/NEW_ORDER_TRANS/RUMBLE_NEW_ORDER_INC_" + + power + + ".txt", + false + ) + ); + } + + // SPARK + for (Integer power : powersOf2) { + benchmarkFiles.add( + new FileTuple( + null, + (tables) -> { + String query = "UPDATE delta.`" + tables.get(0) + "` SET NO_O_ID = (NO_O_ID + 1);"; + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + }, + Collections.singletonList( + "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/newOrderTable" + + power + ), + Collections.singletonList( + "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_" + + power + + ".jq" + ), + "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/NEW_ORDER_TRANS/SPARK_NEW_ORDER_INC_" + + power + + ".txt", + true + ) + ); + } + // benchmarkFiles.add(new FileTuple( + // null, + // (tables) -> { + // String query = "WITH updates AS ( SELECT S_I_ID, OL_QUANTITY FROM delta.`" + tables.get(0) +"` JOIN delta.`" + // + tables.get(1) + "` ON S_I_ID = OL_I_ID AND S_W_ID = OL_SUPPLY_W_ID )" + + // " MERGE INTO delta.`" + tables.get(0) + "` USING updates" + + // " ON delta.`" + tables.get(0) + "`.S_I_ID = updates.S_I_ID " + + // "WHEN MATCHED THEN UPDATE SET S_QUANTITY = CASE WHEN S_QUANTITY - OL_QUANTITY >= 10 THEN S_QUANTITY - + // OL_QUANTITY ELSE S_QUANTITY - OL_QUANTITY + 91," + + // " S_YTD = S_YTD + OL_QUANTITY, S_ORDER_CNT = S_ORDER_CNT + 1"; + // SparkSessionManager.getInstance().getOrCreateSession().sql(query); + // }, + // Arrays.asList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/stockTable32", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/orderLineTable"), + // Arrays.asList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/new_order_trans/create_stock_table_32.jq", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/new_order_trans/create_order_line_table.jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/NEW_ORDER_TRANS/SPARK_STOCK_OL_UP.txt", + // true + // )); + + ////// PAYMENT TRANSACTION + // RUMBLE + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/payment_trans/payment" + + // power + ".jq", + // "null", + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/customerTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/PAYMENT_TRANS/RUMBLE_CUSTOMER_IF_" + power + ".txt", + // false + // )); + // } + // + // // SPARK + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // null, + // (tables) -> { + // int h_amt = 343; + // String query = "UPDATE delta.`" + tables.get(0) +"` SET C_BALANCE = (C_BALANCE + " + h_amt + "), C_DATA = + // if(C_CREDIT == 'BC', concat(C_DATA, C_ID, C_D_ID, C_W_ID, " + h_amt + "), C_DATA);"; + // SparkSessionManager.getInstance().getOrCreateSession().sql(query); + // }, + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/customerTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/PAYMENT_TRANS/SPARK_CUSTOMER_IF_" + power + ".txt", + // true + // )); + // } + + ////// DELIVERY TRANSACTION + // RUMBLE + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/delivery" + + // power + ".jq", + // "null", + // Arrays.asList( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/customerTable" + power, + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/districtTable", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/orderLineTable" + // ), + // Arrays.asList( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_" + // + power + ".jq", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_district_table.jq", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_order_line_table.jq" + // ), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/DELIVERY_TRANS/RUMBLE_CUSTOMER_JOIN_" + power + + // ".txt", + // false + // )); + // } + // + // // SPARK + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // null, + // (tables) -> { + // int no_o_id = 4; + // int w_id = 1; + // String query = "WITH ol_total_per_dist AS ( " + + // "SELECT D_ID, SUM(OL_AMOUNT) AS OL_TOTAL FROM delta.`" + tables.get(1) + "` JOIN delta.`" + tables.get(2) + + // "` ON D_ID = OL_D_ID" + + // " WHERE OL_W_ID = " + w_id + " AND OL_O_ID = " + no_o_id + + // " GROUP BY D_ID" + + // ")" + + // " MERGE INTO delta.`" + tables.get(0) +"` USING ol_total_per_dist" + + // " ON delta.`" + tables.get(0) +"`.C_D_ID = ol_total_per_dist.D_ID" + + // " WHEN MATCHED THEN UPDATE SET C_BALANCE = (C_BALANCE + ol_total_per_dist.OL_TOTAL);"; + // SparkSessionManager.getInstance().getOrCreateSession().sql(query); + // }, + // Arrays.asList( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/customerTable" + power, + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/districtTable", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/orderLineTable" + // ), + // Arrays.asList( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_" + // + power + ".jq", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_district_table.jq", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_order_line_table.jq" + // ), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/DELIVERY_TRANS/SPARK_CUSTOMER_JOIN_" + power + ".txt", + // true + // )); + // } + + } + + public static void setupSparkSession() { + + System.err.println("Java version: " + javaVersion); + System.err.println("Scala version: " + scalaVersion); + SparkConf sparkConfiguration = new SparkConf(); + if (sparkConfiguration.get("spark.app.name", "").equals(" benchmarkDeltaTest(Rumble rumble, URI uri) throws IOException { + SequenceOfItems sequence = rumble.runQuery(uri); + List res = new ArrayList<>(); + sequence.populateList(res); + return res; + } + + public void benchmarkDelta( + String queryPath, + List tablePaths, + List createTablePaths, + String outputPath + ) + throws IOException { + long total = 0; + long[] diffs = new long[10]; + long start; + long end; + long diff; + List res; + + this.appendToFile(outputPath, "RUMBLE"); + this.appendToFile(outputPath, queryPath); + + URI uri = FileSystemUtil.resolveURIAgainstWorkingDirectory( + queryPath, + configuration, + ExceptionMetadata.EMPTY_METADATA + ); + Rumble rumble = new Rumble(configuration); + + // WARMUP + for (int i = 0; i < 3; i++) { + this.createTables(tablePaths, createTablePaths); + res = this.benchmarkDeltaTest(rumble, uri); + this.deleteTables(tablePaths); + } + this.appendToFile(outputPath, "WARMUP DONE"); + + // TIMING + for (int i = 0; i < 10; i++) { + this.createTables(tablePaths, createTablePaths); + start = System.nanoTime(); + res = this.benchmarkDeltaTest(rumble, uri); + end = System.nanoTime(); + this.deleteTables(tablePaths); + diff = (end - start) / 1000000; + diffs[i] = diff; + total += diff; + this.appendToFile(outputPath, "ITERATION" + i); + this.appendToFile(outputPath, String.valueOf(diff)); + } + + this.appendToFile(outputPath, "##########################################"); + this.appendToFile(outputPath, "DONE"); + this.appendToFile(outputPath, queryPath); + this.appendToFile(outputPath, "MS"); + this.appendToFile(outputPath, "TOTAL: " + total); + this.appendToFile(outputPath, "DIFFS: " + Arrays.toString(diffs)); + this.appendToFile(outputPath, "AVG: " + (total / 10)); + this.appendToFile(outputPath, "SD: " + sd(diffs)); + this.appendToFile(outputPath, "##########################################"); + } + + + public void benchmarkSparkSQLTest(String query) { + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + } + + public void benchmarkSpark( + String query, + List tablePaths, + List createTablePaths, + String outputPath, + Optional>> possSqlFunc + ) + throws IOException { + long total = 0; + long[] diffs = new long[10]; + long start; + long end; + long diff; + + this.appendToFile(outputPath, "SPARK"); + for (String tablePath : tablePaths) { + this.appendToFile(outputPath, tablePath); + } + + Consumer> func = null; + if (possSqlFunc.isPresent()) { + func = possSqlFunc.get(); + } + + // WARMUP + for (int i = 0; i < 3; i++) { + this.createTables(tablePaths, createTablePaths); + if (func != null) { + func.accept(tablePaths); + } else { + this.benchmarkSparkSQLTest(query); + } + this.deleteTables(tablePaths); + } + this.appendToFile(outputPath, "WARMUP DONE"); + + // TIMING + if (func != null) { + for (int i = 0; i < 10; i++) { + this.createTables(tablePaths, createTablePaths); + start = System.nanoTime(); + func.accept(tablePaths); + end = System.nanoTime(); + this.deleteTables(tablePaths); + diff = (end - start) / 1000000; + diffs[i] = diff; + total += diff; + this.appendToFile(outputPath, "ITERATION" + i); + this.appendToFile(outputPath, String.valueOf(diff)); + } + } else { + for (int i = 0; i < 10; i++) { + this.createTables(tablePaths, createTablePaths); + start = System.nanoTime(); + this.benchmarkSparkSQLTest(query); + end = System.nanoTime(); + this.deleteTables(tablePaths); + diff = (end - start) / 1000000; + diffs[i] = diff; + total += diff; + this.appendToFile(outputPath, "ITERATION" + i); + this.appendToFile(outputPath, String.valueOf(diff)); + } + } + + this.appendToFile(outputPath, "##########################################"); + this.appendToFile(outputPath, "DONE"); + for (String tablePath : tablePaths) { + this.appendToFile(outputPath, tablePath); + } + this.appendToFile(outputPath, "MS"); + this.appendToFile(outputPath, "TOTAL: " + total); + this.appendToFile(outputPath, "DIFFS: " + Arrays.toString(diffs)); + this.appendToFile(outputPath, "AVG: " + (total / 10)); + this.appendToFile(outputPath, "SD: " + sd(diffs)); + this.appendToFile(outputPath, "##########################################"); + } + + public void appendToFile(String path, String str) { + try ( + FileWriter writer = new FileWriter(path, true); + BufferedWriter bufferedWriter = new BufferedWriter(writer) + ) { + bufferedWriter.write(str); + bufferedWriter.newLine(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public void createTable(String path, String query) throws IOException { + URI tableURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + path, + DeltaUpdateRuntimeTests.createDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + URI queryURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + query, + DeltaUpdateRuntimeTests.createDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + + UpdatesForRumbleBenchmark.createDeltaConfiguration.setOutputPath(tableURI.getPath()); + UpdatesForRumbleBenchmark.createDeltaConfiguration.setQueryPath(queryURI.getPath()); + JsoniqQueryExecutor executor = new JsoniqQueryExecutor(UpdatesForRumbleBenchmark.createDeltaConfiguration); + executor.runQuery(); + } + + public void createTables(List paths, List queries) throws IOException { + for (int i = 0; i < paths.size(); i++) { + this.createTable(paths.get(i), queries.get(i)); + } + } + + public void deleteTable(String path) { + URI tableURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + path, + UpdatesForRumbleBenchmark.createDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + + try { + File oldTable = new File(tableURI.getPath()); + FileUtils.deleteDirectory(oldTable); + System.err.println("Deleted file: " + oldTable.getAbsolutePath()); + } catch (IOException e) { + e.printStackTrace(); + Assert.fail(); + } + } + + public void deleteTables(List paths) { + for (String path : paths) { + this.deleteTable(path); + } + } + + public static double sd(long[] arr) { + double sd = 0.0; + + long sum = Arrays.stream(arr).sum(); + long N = arr.length; + double mean = (double) sum / N; + + for (long x : arr) { + sd += Math.pow(x - mean, 2); + } + + return Math.sqrt(sd / N); + } + + + public static void main(String[] args) throws IOException { + + UpdatesForRumbleBenchmark benchmark = new UpdatesForRumbleBenchmark(); + setupSparkSession(); + + for (FileTuple ft : benchmark.benchmarkFiles) { + if (ft.isSQL()) { + benchmark.benchmarkSpark( + ft.getQueryMaterial(), + ft.getTablePaths(), + ft.getCreateTablePaths(), + ft.getOutputPath(), + Optional.ofNullable(ft.getSqlQueryFunc()) + ); + } else { + benchmark.benchmarkDelta( + ft.getQueryMaterial(), + ft.getTablePaths(), + ft.getCreateTablePaths(), + ft.getOutputPath() + ); + } + } + + System.out.println("##########################################"); + System.out.println("DONE"); + System.out.println("##########################################"); + + } + + class FileTuple { + + private String queryPath; + private String sqlQuery; + private Consumer> sqlQueryFunc; + private List tablePaths; + private List createTablePaths; + private String outputPath; + private boolean isSQL; + + public FileTuple( + String queryPath, + String sqlQuery, + List tablePaths, + List createTablePaths, + String outputPath, + boolean isSQL + ) { + this.queryPath = queryPath; + this.sqlQuery = sqlQuery; + this.tablePaths = tablePaths; + this.createTablePaths = createTablePaths; + this.outputPath = outputPath; + this.isSQL = isSQL; + } + + public FileTuple( + String queryPath, + Consumer> sqlQueryFunc, + List tablePaths, + List createTablePaths, + String outputPath, + boolean isSQL + ) { + this.queryPath = queryPath; + this.sqlQuery = null; + this.sqlQueryFunc = sqlQueryFunc; + this.tablePaths = tablePaths; + this.createTablePaths = createTablePaths; + this.outputPath = outputPath; + this.isSQL = isSQL; + } + + public String getQueryMaterial() { + return this.isSQL() ? this.sqlQuery : this.queryPath; + } + + public Consumer> getSqlQueryFunc() { + return this.sqlQueryFunc; + } + + public List getTablePaths() { + return tablePaths; + } + + public List getCreateTablePaths() { + return createTablePaths; + } + + public String getOutputPath() { + return outputPath; + } + + public boolean isSQL() { + return isSQL; + } + } +} diff --git a/src/test/java/utils/annotations/AnnotationProcessor.java b/src/test/java/utils/annotations/AnnotationProcessor.java index bc90d83995..c34a4f9d86 100644 --- a/src/test/java/utils/annotations/AnnotationProcessor.java +++ b/src/test/java/utils/annotations/AnnotationProcessor.java @@ -33,6 +33,10 @@ public class AnnotationProcessor { public static final String OUTPUT_KEY = "Output"; + public static final String UPDATE_DIM_KEY = "UpdateDim"; + public static final String UPDATE_TABLE_KEY = "UpdateTable"; + public static final String CREATE_TABLE = "CreateTable"; + public static final String DELETE_TABLE = "DeleteTable"; public static final String ERROR_MESSAGE = "ErrorCode"; public static final String ERROR_METADATA = "ErrorMetadata"; public static final String SHOULD_PARSE = "ShouldParse"; @@ -68,6 +72,12 @@ public static TestAnnotation readAnnotation(Reader reader) throws IOException, A Optional shouldCompile = Optional.empty(); Optional shouldRun = Optional.empty(); + Optional deleteTable = Optional.of(false); + Optional createTable = Optional.of(false); + + Optional updateDim1 = Optional.empty(); + Optional updateDim2 = Optional.empty(); + Map parameters = new HashMap<>(); for (String token : annotationTokens) { if (token.equals(SHOULD_PARSE)) { @@ -84,6 +94,10 @@ public static TestAnnotation readAnnotation(Reader reader) throws IOException, A shouldRun = Optional.of(true); } else if (token.equals(SHOULD_CRASH)) { shouldRun = Optional.of(false); + } else if (token.equals(DELETE_TABLE)) { + deleteTable = Optional.of(true); + } else if (token.equals(CREATE_TABLE)) { + createTable = Optional.of(true); } else if (token.contains("=")) { String[] tokenParts = token.split("=", 2); @@ -93,6 +107,12 @@ public static TestAnnotation readAnnotation(Reader reader) throws IOException, A if (value.startsWith("\"")) { value = value.substring(1, value.length() - 1); } + if (key.equals(UPDATE_DIM_KEY)) { + String[] dimsArr = value.substring(1, value.length() - 1).split(","); + updateDim1 = Optional.of(Integer.parseInt(dimsArr[0])); + updateDim2 = Optional.of(Integer.parseInt(dimsArr[1])); + } + value = value.replaceAll("([^\\\\])\\\\n", "$1\n").replaceAll("\\\\\\\\n", "\\\\n"); parameters.put(key, value); } @@ -107,7 +127,18 @@ public static TestAnnotation readAnnotation(Reader reader) throws IOException, A if (shouldRun.isPresent()) { if (shouldRun.get()) - return new RunnableTestAnnotation(parameters.get(OUTPUT_KEY)); + if (updateDim1.isPresent() && updateDim2.isPresent()) { + return new UpdatingRunnableTestAnnotation( + parameters.get(OUTPUT_KEY), + parameters.get(UPDATE_TABLE_KEY), + updateDim1.get(), + updateDim2.get(), + deleteTable.get(), + createTable.get() + ); + } else { + return new RunnableTestAnnotation(parameters.get(OUTPUT_KEY)); + } else return new UnrunnableTestAnnotation( parameters.get(ERROR_MESSAGE), @@ -134,10 +165,38 @@ public static TestAnnotation readAnnotation(Reader reader) throws IOException, A ); } + public static String getUpdateDimensionAnnotation(Reader reader) throws IOException, AnnotationParseException { + String annotationText = readAnnotationText(reader); + if (annotationText.isEmpty()) { + throw new AnnotationParseException(annotationText, "Found empty annotation."); + } + String[] annotationTokens = annotationText.split("\\s*;\\s*"); + for (String token : annotationTokens) { + if (token.contains(UPDATE_DIM_KEY)) { + + String[] tokenParts = token.split("=", 2); + String value = tokenParts[1].trim(); + if (!value.matches("\\[\\d+,\\d+]")) { + throw new AnnotationParseException( + annotationText, + "UpdateDim key does not match regex: \"\\[\\d+,\\d+]\"" + ); + } + return value; + } + } + throw new AnnotationParseException(annotationText, "No UpdateDim key found."); + } + public static abstract class TestAnnotation { protected String expectedOutput = ""; protected String errorCode = ""; protected String errorMetadata = ""; + protected String deltaTablePath = ""; + protected int updatingDim1 = -1; + protected int updatingDim2 = -1; + protected boolean shouldDeleteTable = false; + protected boolean shouldCreateTable = false; public TestAnnotation() { } @@ -154,6 +213,26 @@ public String getErrorMetadata() { return this.errorMetadata; } + public String getDeltaTablePath() { + return this.deltaTablePath; + } + + public int getUpdatingDim1() { + return this.updatingDim1; + } + + public int getUpdatingDim2() { + return this.updatingDim2; + } + + public boolean shouldDeleteTable() { + return this.shouldDeleteTable; + } + + public boolean shouldCreateTable() { + return this.shouldCreateTable; + } + public abstract boolean shouldParse(); public abstract boolean shouldCompile(); @@ -189,6 +268,39 @@ public boolean shouldRun() { } } + public static class UpdatingRunnableTestAnnotation extends RunnableTestAnnotation { + public UpdatingRunnableTestAnnotation( + String expectedOut, + String deltaTablePath, + int dim1, + int dim2, + boolean shouldDeleteTable, + boolean shouldCreateTable + ) { + super(expectedOut); + this.deltaTablePath = deltaTablePath; + this.updatingDim1 = dim1; + this.updatingDim2 = dim2; + this.shouldDeleteTable = shouldDeleteTable; + this.shouldCreateTable = shouldCreateTable; + } + + @Override + public boolean shouldParse() { + return true; + } + + @Override + public boolean shouldCompile() { + return true; + } + + @Override + public boolean shouldRun() { + return true; + } + } + public static class UnrunnableTestAnnotation extends TestAnnotation { public UnrunnableTestAnnotation(String errorCode, String errorMetadata) { diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_1024.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_1024.jq new file mode 100644 index 0000000000..2e15a1595d --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_1024.jq @@ -0,0 +1,4 @@ +let $data := delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable1024") +return + for $d in $data + return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_128.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_128.jq new file mode 100644 index 0000000000..5829e78979 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_128.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable128") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_16.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_16.jq new file mode 100644 index 0000000000..5802ca9cd0 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_16.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable16") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_2.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_2.jq new file mode 100644 index 0000000000..f82079b88c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_2.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable2") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_256.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_256.jq new file mode 100644 index 0000000000..59f777293f --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_256.jq @@ -0,0 +1,4 @@ +let $data := delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable256") +return + for $d in $data + return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_32.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_32.jq new file mode 100644 index 0000000000..649616afa3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_32.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable32") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_4.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_4.jq new file mode 100644 index 0000000000..841d911858 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_4.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable4") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_512.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_512.jq new file mode 100644 index 0000000000..40f34d7ca9 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_512.jq @@ -0,0 +1,4 @@ +let $data := delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable512") +return + for $d in $data + return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_64.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_64.jq new file mode 100644 index 0000000000..c9b7f957be --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_64.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable64") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_8.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_8.jq new file mode 100644 index 0000000000..0f9bc71d6c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_8.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable8") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_128.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_128.jq new file mode 100644 index 0000000000..06a22738f3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_128.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable128") +return insert "nickname" : "cool_nickname", "popularity_rating" : -1 into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_16.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_16.jq new file mode 100644 index 0000000000..23c6e67d3e --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_16.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable16") +return insert { "nickname" : "cool_nickname", "popularity_rating" : -1 } into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_2.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_2.jq new file mode 100644 index 0000000000..1547b12913 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_2.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable2") +return insert "nickname" : "cool_nickname", "popularity_rating" : -1 into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_32.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_32.jq new file mode 100644 index 0000000000..2093d7a1ce --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_32.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable32") +return insert { "nickname" : "cool_nickname", "popularity_rating" : -1 } into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_4.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_4.jq new file mode 100644 index 0000000000..410b3b377c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_4.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable4") +return insert { "nickname" : "cool_nickname", "popularity_rating" : -1 } into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_64.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_64.jq new file mode 100644 index 0000000000..3711d4999a --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_64.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable64") +return insert { "nickname" : "cool_nickname", "popularity_rating" : -1 } into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_8.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_8.jq new file mode 100644 index 0000000000..5021eacd49 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_8.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable8") +return insert { "nickname" : "cool_nickname", "popularity_rating" : -1 } into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_128.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_128.jq new file mode 100644 index 0000000000..84e471bd83 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_128.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable128") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_16.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_16.jq new file mode 100644 index 0000000000..6589171005 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_16.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable16") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_2.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_2.jq new file mode 100644 index 0000000000..2dc942b7e6 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_2.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable2") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_32.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_32.jq new file mode 100644 index 0000000000..891bcfd8eb --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_32.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable32") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_4.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_4.jq new file mode 100644 index 0000000000..d384fb3915 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_4.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable4") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_64.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_64.jq new file mode 100644 index 0000000000..41f1ddcd93 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_64.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable64") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_8.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_8.jq new file mode 100644 index 0000000000..79ae554e44 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_8.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable8") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_1024.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_1024.jq new file mode 100644 index 0000000000..097b0c995f --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_1024.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 1024 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_128.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_128.jq new file mode 100644 index 0000000000..fae644a404 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_128.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 128 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_16.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_16.jq new file mode 100644 index 0000000000..d64f128d57 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_16.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 16 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_2.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_2.jq new file mode 100644 index 0000000000..7bd206f010 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_2.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 2 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_256.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_256.jq new file mode 100644 index 0000000000..efad60cf3e --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_256.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 256 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_32.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_32.jq new file mode 100644 index 0000000000..6731689230 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_32.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 32 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_4.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_4.jq new file mode 100644 index 0000000000..cde52b0290 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_4.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 4 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_512.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_512.jq new file mode 100644 index 0000000000..fb815bb7c9 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_512.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 512 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_64.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_64.jq new file mode 100644 index 0000000000..bc0ddb4ac3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_64.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 64 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_8.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_8.jq new file mode 100644 index 0000000000..405cf2a591 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_8.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 8 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_128.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_128.jq new file mode 100644 index 0000000000..7797c1b486 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_128.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 128 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_16.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_16.jq new file mode 100644 index 0000000000..183462f129 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_16.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 16 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_2.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_2.jq new file mode 100644 index 0000000000..6adeb995c7 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_2.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 2 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_32.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_32.jq new file mode 100644 index 0000000000..f1a9ec0efa --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_32.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 32 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_4.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_4.jq new file mode 100644 index 0000000000..b66eb4d43c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_4.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 4 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_64.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_64.jq new file mode 100644 index 0000000000..c970ea676f --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_64.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 64 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_8.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_8.jq new file mode 100644 index 0000000000..ebd23bdbe3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_8.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 8 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_district_table.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_district_table.jq new file mode 100644 index 0000000000..5d96bb135c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_district_table.jq @@ -0,0 +1,2 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/district.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_order_line_table.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_order_line_table.jq new file mode 100644 index 0000000000..5490e977e4 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_order_line_table.jq @@ -0,0 +1,2 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/order_line.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery128.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery128.jq new file mode 100644 index 0000000000..921c7b140a --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery128.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable128")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery16.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery16.jq new file mode 100644 index 0000000000..fc05618036 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery16.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable16")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery2.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery2.jq new file mode 100644 index 0000000000..46f73aeecd --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery2.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable2")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery32.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery32.jq new file mode 100644 index 0000000000..aeb4e3ef2a --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery32.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable32")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery4.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery4.jq new file mode 100644 index 0000000000..0956fc927f --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery4.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable4")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery64.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery64.jq new file mode 100644 index 0000000000..bea5c6cce8 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery64.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable64")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery8.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery8.jq new file mode 100644 index 0000000000..306def01bb --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery8.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable8")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_district_table.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_district_table.jq new file mode 100644 index 0000000000..5d96bb135c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_district_table.jq @@ -0,0 +1,2 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/district.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_128.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_128.jq new file mode 100644 index 0000000000..e71e9f916a --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_128.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 128 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_16.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_16.jq new file mode 100644 index 0000000000..fd520ab0d6 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_16.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 16 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_2.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_2.jq new file mode 100644 index 0000000000..05802c9ce6 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_2.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 2 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_32.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_32.jq new file mode 100644 index 0000000000..a870e414e3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_32.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 32 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_4.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_4.jq new file mode 100644 index 0000000000..4363d9b5a2 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_4.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 4 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_64.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_64.jq new file mode 100644 index 0000000000..c41f9c6706 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_64.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 64 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_8.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_8.jq new file mode 100644 index 0000000000..35dc83ca68 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_8.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 8 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_district.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_district.jq new file mode 100644 index 0000000000..1241944250 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_district.jq @@ -0,0 +1,3 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/districtTable") +where $d.D_ID eq 3 and $d.D_W_ID eq 1 +return replace value of $d.D_NEXT_O_ID with ($d.D_NEXT_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_128.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_128.jq new file mode 100644 index 0000000000..84aed67ddb --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_128.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable128") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_16.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_16.jq new file mode 100644 index 0000000000..9a3adbec20 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_16.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable16") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_2.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_2.jq new file mode 100644 index 0000000000..33b2fed59a --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_2.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable2") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_32.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_32.jq new file mode 100644 index 0000000000..e9b0551fe8 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_32.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable32") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_4.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_4.jq new file mode 100644 index 0000000000..124012776e --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_4.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable4") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_64.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_64.jq new file mode 100644 index 0000000000..f6de66971c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_64.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable64") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_8.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_8.jq new file mode 100644 index 0000000000..d31d121d48 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_8.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable8") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_128.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_128.jq new file mode 100644 index 0000000000..7797c1b486 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_128.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 128 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_16.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_16.jq new file mode 100644 index 0000000000..183462f129 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_16.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 16 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_2.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_2.jq new file mode 100644 index 0000000000..6adeb995c7 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_2.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 2 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_32.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_32.jq new file mode 100644 index 0000000000..f1a9ec0efa --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_32.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 32 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_4.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_4.jq new file mode 100644 index 0000000000..b66eb4d43c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_4.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 4 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_64.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_64.jq new file mode 100644 index 0000000000..c970ea676f --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_64.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 64 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_8.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_8.jq new file mode 100644 index 0000000000..ebd23bdbe3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_8.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 8 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment128.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment128.jq new file mode 100644 index 0000000000..b62f191196 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment128.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable128") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment16.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment16.jq new file mode 100644 index 0000000000..dae4bbcc23 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment16.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable16") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment2.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment2.jq new file mode 100644 index 0000000000..06e5224f22 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment2.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable2") +return + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + if ($c.C_CREDIT eq "BC") + then + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + else + () + ) diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment32.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment32.jq new file mode 100644 index 0000000000..10c3a7fe66 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment32.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable32") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment4.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment4.jq new file mode 100644 index 0000000000..5840c4d7fe --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment4.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable4") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment64.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment64.jq new file mode 100644 index 0000000000..5a65d5f25d --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment64.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable64") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment8.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment8.jq new file mode 100644 index 0000000000..ce47364f95 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment8.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable8") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..7ff1d10a07 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..21b493d056 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..f9d97bc47e Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..6ceaf6d6d5 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..021c5fc602 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..01f7ba6892 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..a053d2b7d8 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..f8dfb82774 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..48010533b1 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..7b4b820771 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..f70a259448 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..30b9fc645a Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..b58d9de8fe Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..88e70a2eb4 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..5e7dd6a7e8 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..0ccc0e3f1e Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..3012443cac Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..a9826c146b Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/customer.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/customer.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/customer.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/customer.parquet/.part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/customer.parquet/.part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet.crc new file mode 100644 index 0000000000..8f5ec23f1b Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/customer.parquet/.part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/customer.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/customer.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/customer.parquet/part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/customer.parquet/part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet new file mode 100644 index 0000000000..5a53151735 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/customer.parquet/part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/district.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/district.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/district.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/district.parquet/.part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/district.parquet/.part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet.crc new file mode 100644 index 0000000000..03f5b4a9bf Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/district.parquet/.part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/district.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/district.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/district.parquet/part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/district.parquet/part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet new file mode 100644 index 0000000000..1f5e7cf1b9 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/district.parquet/part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/history.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/history.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/history.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/history.parquet/.part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/history.parquet/.part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet.crc new file mode 100644 index 0000000000..2096c24645 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/history.parquet/.part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/history.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/history.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/history.parquet/part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/history.parquet/part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet new file mode 100644 index 0000000000..18c1626200 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/history.parquet/part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/item.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/item.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/item.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/item.parquet/.part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/item.parquet/.part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet.crc new file mode 100644 index 0000000000..ae1171c149 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/item.parquet/.part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/item.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/item.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/item.parquet/part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/item.parquet/part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet new file mode 100644 index 0000000000..c671faefd6 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/item.parquet/part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/new_order.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/new_order.parquet/.part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/.part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet.crc new file mode 100644 index 0000000000..1dfee0c6a9 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/.part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/new_order.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/new_order.parquet/part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet new file mode 100644 index 0000000000..87a78c631e Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/order.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/order.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/order.parquet/.part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/order.parquet/.part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet.crc new file mode 100644 index 0000000000..aaceec6e1c Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order.parquet/.part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/order.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/order.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/order.parquet/part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/order.parquet/part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet new file mode 100644 index 0000000000..46882244d5 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order.parquet/part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/order_line.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/order_line.parquet/.part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/.part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet.crc new file mode 100644 index 0000000000..faa3168a06 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/.part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/order_line.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/order_line.parquet/part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet new file mode 100644 index 0000000000..7ae0da0023 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/stock.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/stock.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/stock.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/stock.parquet/.part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/stock.parquet/.part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet.crc new file mode 100644 index 0000000000..b3afa45e61 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/stock.parquet/.part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/stock.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/stock.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/stock.parquet/part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/stock.parquet/part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet new file mode 100644 index 0000000000..3b8fcfbbc1 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/stock.parquet/part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/.part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/.part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet.crc new file mode 100644 index 0000000000..349d348d83 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/.part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet new file mode 100644 index 0000000000..6f4761a7f4 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet differ diff --git a/src/test/resources/queries/multirow.parquet/._SUCCESS.crc b/src/test/resources/queries/multirow.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/multirow.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/multirow.parquet/.part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet.crc b/src/test/resources/queries/multirow.parquet/.part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet.crc new file mode 100644 index 0000000000..3d4106ee49 Binary files /dev/null and b/src/test/resources/queries/multirow.parquet/.part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/multirow.parquet/_SUCCESS b/src/test/resources/queries/multirow.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/multirow.parquet/part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet b/src/test/resources/queries/multirow.parquet/part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet new file mode 100644 index 0000000000..ea1eb4d227 Binary files /dev/null and b/src/test/resources/queries/multirow.parquet/part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet differ diff --git a/src/test/resources/queries/nested_parquet/._SUCCESS.crc b/src/test/resources/queries/nested_parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/nested_parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/nested_parquet/.part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet.crc b/src/test/resources/queries/nested_parquet/.part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet.crc new file mode 100644 index 0000000000..9534b589d9 Binary files /dev/null and b/src/test/resources/queries/nested_parquet/.part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/nested_parquet/_SUCCESS b/src/test/resources/queries/nested_parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/nested_parquet/part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet b/src/test/resources/queries/nested_parquet/part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet new file mode 100644 index 0000000000..58b2ec9422 Binary files /dev/null and b/src/test/resources/queries/nested_parquet/part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet differ diff --git a/src/test/resources/queries/sample_json_delta/.part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet.crc b/src/test/resources/queries/sample_json_delta/.part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet.crc new file mode 100644 index 0000000000..d3fe12f6bd Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/.part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/sample_json_delta/.part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet.crc b/src/test/resources/queries/sample_json_delta/.part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet.crc new file mode 100644 index 0000000000..4937e844ba Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/.part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/sample_json_delta/.part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet.crc b/src/test/resources/queries/sample_json_delta/.part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet.crc new file mode 100644 index 0000000000..d3fe12f6bd Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/.part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/sample_json_delta/.part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet.crc b/src/test/resources/queries/sample_json_delta/.part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet.crc new file mode 100644 index 0000000000..c62e953f4b Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/.part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000000.json.crc b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000000.json.crc new file mode 100644 index 0000000000..2501e41449 Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000000.json.crc differ diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000001.json.crc b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000001.json.crc new file mode 100644 index 0000000000..e8e4d1e22e Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000001.json.crc differ diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000002.json.crc b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000002.json.crc new file mode 100644 index 0000000000..25d19030f1 Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000002.json.crc differ diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000003.json.crc b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000003.json.crc new file mode 100644 index 0000000000..516142b2fd Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000003.json.crc differ diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000000.json b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000000.json new file mode 100644 index 0000000000..f9ea9edf6b --- /dev/null +++ b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000000.json @@ -0,0 +1,4 @@ +{"commitInfo":{"timestamp":1689813691596,"operation":"WRITE","operationParameters":{"mode":"ErrorIfExists","partitionBy":"[]"},"isolationLevel":"Serializable","isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputRows":"1","numOutputBytes":"6700"},"engineInfo":"Apache-Spark/3.3.2 Delta-Lake/2.3.0","txnId":"16dbf65a-b299-458f-83d9-e03565c90b09"}} +{"protocol":{"minReaderVersion":1,"minWriterVersion":2}} +{"metaData":{"id":"2f77d9ee-52ac-42d0-9880-56879974d5fd","format":{"provider":"parquet","options":{}},"schemaString":"{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"bool_array\",\"type\":{\"type\":\"array\",\"elementType\":\"boolean\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float_array\",\"type\":{\"type\":\"array\",\"elementType\":\"double\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64_array\",\"type\":{\"type\":\"array\",\"elementType\":\"long\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"object_array\",\"type\":{\"type\":\"array\",\"elementType\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"string_array\",\"type\":{\"type\":\"array\",\"elementType\":\"string\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}}]}","partitionColumns":[],"configuration":{},"createdTime":1689813688368}} +{"add":{"path":"part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet","partitionValues":{},"size":6700,"modificationTime":1689813691396,"dataChange":true,"stats":"{\"numRecords\":1,\"minValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\"},\"maxValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\"},\"nullCount\":{\"bool\":0,\"bool_array\":0,\"float\":0,\"float_array\":0,\"int64\":0,\"int64_array\":0,\"null\":1,\"object\":{\"bool\":0,\"float\":0,\"int64\":0,\"null\":1,\"object\":{\"bool\":0,\"null\":1},\"string\":0},\"object_array\":0,\"string\":0,\"string_array\":0}}"}} diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000001.json b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000001.json new file mode 100644 index 0000000000..fe993a51aa --- /dev/null +++ b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000001.json @@ -0,0 +1,4 @@ +{"commitInfo":{"timestamp":1689813791145,"operation":"WRITE","operationParameters":{"mode":"Overwrite","partitionBy":"[]"},"readVersion":0,"isolationLevel":"Serializable","isBlindAppend":false,"operationMetrics":{"numFiles":"1","numOutputRows":"1","numOutputBytes":"6952"},"engineInfo":"Apache-Spark/3.3.2 Delta-Lake/2.3.0","txnId":"fbc16a9a-8ebb-48b4-b481-23a17dab9b1e"}} +{"metaData":{"id":"2f77d9ee-52ac-42d0-9880-56879974d5fd","format":{"provider":"parquet","options":{}},"schemaString":"{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"bool_array\",\"type\":{\"type\":\"array\",\"elementType\":\"boolean\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float_array\",\"type\":{\"type\":\"array\",\"elementType\":\"double\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64_array\",\"type\":{\"type\":\"array\",\"elementType\":\"long\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"object_array\",\"type\":{\"type\":\"array\",\"elementType\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"string_array\",\"type\":{\"type\":\"array\",\"elementType\":\"string\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"rowID\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}}]}","partitionColumns":[],"configuration":{},"createdTime":1689813688368}} +{"add":{"path":"part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet","partitionValues":{},"size":6952,"modificationTime":1689813790779,"dataChange":true,"stats":"{\"numRecords\":1,\"minValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"maxValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"nullCount\":{\"bool\":0,\"bool_array\":0,\"float\":0,\"float_array\":0,\"int64\":0,\"int64_array\":0,\"null\":1,\"object\":{\"bool\":0,\"float\":0,\"int64\":0,\"null\":1,\"object\":{\"bool\":0,\"null\":1},\"string\":0},\"object_array\":0,\"string\":0,\"string_array\":0,\"rowID\":0}}"}} +{"remove":{"path":"part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet","deletionTimestamp":1689813791143,"dataChange":true,"extendedFileMetadata":true,"partitionValues":{},"size":6700}} diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000002.json b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000002.json new file mode 100644 index 0000000000..d68b854a7d --- /dev/null +++ b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000002.json @@ -0,0 +1,3 @@ +{"commitInfo":{"timestamp":1689813799061,"operation":"UPDATE","operationParameters":{"predicate":"(rowID#1974L = 0)"},"readVersion":1,"isolationLevel":"Serializable","isBlindAppend":false,"operationMetrics":{"numRemovedFiles":"1","numRemovedBytes":"6952","numCopiedRows":"0","numAddedChangeFiles":"0","executionTimeMs":"4326","scanTimeMs":"3529","numAddedFiles":"1","numUpdatedRows":"1","numAddedBytes":"6937","rewriteTimeMs":"791"},"engineInfo":"Apache-Spark/3.3.2 Delta-Lake/2.3.0","txnId":"89f89e3a-6ffb-4955-9d1d-50274b0a0b65"}} +{"remove":{"path":"part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet","deletionTimestamp":1689813799056,"dataChange":true,"extendedFileMetadata":true,"partitionValues":{},"size":6952}} +{"add":{"path":"part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet","partitionValues":{},"size":6937,"modificationTime":1689813799023,"dataChange":true,"stats":"{\"numRecords\":1,\"minValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"maxValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"nullCount\":{\"bool\":1,\"bool_array\":0,\"float\":0,\"float_array\":0,\"int64\":0,\"int64_array\":0,\"null\":1,\"object\":{\"bool\":0,\"float\":0,\"int64\":0,\"null\":1,\"object\":{\"bool\":0,\"null\":1},\"string\":0},\"object_array\":0,\"string\":0,\"string_array\":0,\"rowID\":0}}"}} diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000003.json b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000003.json new file mode 100644 index 0000000000..ab4f031b8e --- /dev/null +++ b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000003.json @@ -0,0 +1,3 @@ +{"commitInfo":{"timestamp":1689813802612,"operation":"WRITE","operationParameters":{"mode":"Overwrite","partitionBy":"[]"},"readVersion":2,"isolationLevel":"Serializable","isBlindAppend":false,"operationMetrics":{"numFiles":"1","numOutputRows":"1","numOutputBytes":"6937"},"engineInfo":"Apache-Spark/3.3.2 Delta-Lake/2.3.0","txnId":"f4fe7ea7-81c9-4545-b379-f31282894f71"}} +{"add":{"path":"part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet","partitionValues":{},"size":6937,"modificationTime":1689813802246,"dataChange":true,"stats":"{\"numRecords\":1,\"minValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"maxValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"nullCount\":{\"bool\":1,\"bool_array\":0,\"float\":0,\"float_array\":0,\"int64\":0,\"int64_array\":0,\"null\":1,\"object\":{\"bool\":0,\"float\":0,\"int64\":0,\"null\":1,\"object\":{\"bool\":0,\"null\":1},\"string\":0},\"object_array\":0,\"string\":0,\"string_array\":0,\"rowID\":0}}"}} +{"remove":{"path":"part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet","deletionTimestamp":1689813802610,"dataChange":true,"extendedFileMetadata":true,"partitionValues":{},"size":6937}} diff --git a/src/test/resources/queries/sample_json_delta/part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet b/src/test/resources/queries/sample_json_delta/part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet new file mode 100644 index 0000000000..0601ad41e4 Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet differ diff --git a/src/test/resources/queries/sample_json_delta/part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet b/src/test/resources/queries/sample_json_delta/part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet new file mode 100644 index 0000000000..62667e229a Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet differ diff --git a/src/test/resources/queries/sample_json_delta/part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet b/src/test/resources/queries/sample_json_delta/part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet new file mode 100644 index 0000000000..0601ad41e4 Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet differ diff --git a/src/test/resources/queries/sample_json_delta/part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet b/src/test/resources/queries/sample_json_delta/part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet new file mode 100644 index 0000000000..5b182bc3cb Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet differ diff --git a/src/test/resources/queries/xQuery_update_R_data/R.parquet/._SUCCESS.crc b/src/test/resources/queries/xQuery_update_R_data/R.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/xQuery_update_R_data/R.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/xQuery_update_R_data/R.parquet/.part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet.crc b/src/test/resources/queries/xQuery_update_R_data/R.parquet/.part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet.crc new file mode 100644 index 0000000000..819ca5424d Binary files /dev/null and b/src/test/resources/queries/xQuery_update_R_data/R.parquet/.part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/xQuery_update_R_data/R.parquet/_SUCCESS b/src/test/resources/queries/xQuery_update_R_data/R.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/xQuery_update_R_data/R.parquet/part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet b/src/test/resources/queries/xQuery_update_R_data/R.parquet/part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet new file mode 100644 index 0000000000..72699f151d Binary files /dev/null and b/src/test/resources/queries/xQuery_update_R_data/R.parquet/part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet differ diff --git a/src/test/resources/test_files/composability/FunctionDecl1.jq b/src/test/resources/test_files/composability/FunctionDecl1.jq index 7af7070021..5f4d7585df 100644 --- a/src/test/resources/test_files/composability/FunctionDecl1.jq +++ b/src/test/resources/test_files/composability/FunctionDecl1.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldCompile :) -declare %an:nonsequential function foo() { +declare %nonsequential function foo() { variable $x := 3; while ($x eq 3) { if ($x eq 3) then { diff --git a/src/test/resources/test_files/composability/FunctionDecl2.jq b/src/test/resources/test_files/composability/FunctionDecl2.jq index 4e28983171..73998d16e6 100644 --- a/src/test/resources/test_files/composability/FunctionDecl2.jq +++ b/src/test/resources/test_files/composability/FunctionDecl2.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldCompile :) -declare %an:nonsequential function foo() { +declare %nonsequential function foo() { exit returning 1; }; diff --git a/src/test/resources/test_files/composability/FunctionDecl3.jq b/src/test/resources/test_files/composability/FunctionDecl3.jq index a7595b9837..211b34a7e8 100644 --- a/src/test/resources/test_files/composability/FunctionDecl3.jq +++ b/src/test/resources/test_files/composability/FunctionDecl3.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldCompile :) -declare %an:nonsequential function foo() { +declare %nonsequential function foo() { copy $je := {"a" : 1} modify delete json $je.b return $je diff --git a/src/test/resources/test_files/composability/FunctionDeclErr1.jq b/src/test/resources/test_files/composability/FunctionDeclErr1.jq index b19b7b8323..7fc8e7a1ac 100644 --- a/src/test/resources/test_files/composability/FunctionDeclErr1.jq +++ b/src/test/resources/test_files/composability/FunctionDeclErr1.jq @@ -1,4 +1,4 @@ (:JIQS: ShouldNotCompile; ErrorCode="XQAN0001"; ErrorMetadata="LINE:2:COLUMN:0:" :) -declare %an:sequential %an:nonsequential function foo() { 1 }; +declare %sequential %nonsequential function foo() { 1 }; (: it is a static error to have both sequential and nonsequential annotations :) \ No newline at end of file diff --git a/src/test/resources/test_files/composability/FunctionDeclErr2.jq b/src/test/resources/test_files/composability/FunctionDeclErr2.jq index 2c5dedfe95..ac2d1d5a11 100644 --- a/src/test/resources/test_files/composability/FunctionDeclErr2.jq +++ b/src/test/resources/test_files/composability/FunctionDeclErr2.jq @@ -1,6 +1,6 @@ (:JIQS: ShouldNotCompile; ErrorCode="SCCP0006"; ErrorMetadata="LINE:4:COLUMN:0:" :) -declare %an:sequential function barseq() { 0 }; +declare %sequential function barseq() { 0 }; declare function bar() { barseq() }; -declare %an:nonsequential function foo() {bar()}; +declare %nonsequential function foo() {bar()}; (: declared nonsequential with sequential body is not valid :) \ No newline at end of file diff --git a/src/test/resources/test_files/composability/FunctionDeclErr3.jq b/src/test/resources/test_files/composability/FunctionDeclErr3.jq index e7414b521e..1a35893026 100644 --- a/src/test/resources/test_files/composability/FunctionDeclErr3.jq +++ b/src/test/resources/test_files/composability/FunctionDeclErr3.jq @@ -1,6 +1,6 @@ (:JIQS: ShouldNotCompile; ErrorCode="SCCP0006"; ErrorMetadata="LINE:3:COLUMN:0:" :) -declare %an:sequential function bar() { 1 }; -declare %an:nonsequential function foo() { +declare %sequential function bar() { 1 }; +declare %nonsequential function foo() { bar() }; diff --git a/src/test/resources/test_files/composability/FunctionDeclErr4.jq b/src/test/resources/test_files/composability/FunctionDeclErr4.jq index fb850f17ea..922f053a2e 100644 --- a/src/test/resources/test_files/composability/FunctionDeclErr4.jq +++ b/src/test/resources/test_files/composability/FunctionDeclErr4.jq @@ -1,6 +1,6 @@ (:JIQS: ShouldNotCompile; ErrorCode="SCCP0006"; ErrorMetadata="LINE:3:COLUMN:0:" :) -declare %an:sequential function bar() { 1 }; -declare %an:nonsequential function foo() { +declare %sequential function bar() { 1 }; +declare %nonsequential function foo() { bar(); }; diff --git a/src/test/resources/test_files/composability/VariableDecl1.jq b/src/test/resources/test_files/composability/VariableDecl1.jq index cf89be90b1..e2f2416676 100644 --- a/src/test/resources/test_files/composability/VariableDecl1.jq +++ b/src/test/resources/test_files/composability/VariableDecl1.jq @@ -1,3 +1,3 @@ (:JIQS: ShouldCompile:) -declare %an:nonsequential function foo() { 1 }; +declare %nonsequential function foo() { 1 }; declare variable $var := foo(); diff --git a/src/test/resources/test_files/composability/VariableDeclErr1.jq b/src/test/resources/test_files/composability/VariableDeclErr1.jq index d1bdc8cd7f..57224cad6b 100644 --- a/src/test/resources/test_files/composability/VariableDeclErr1.jq +++ b/src/test/resources/test_files/composability/VariableDeclErr1.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldNotCompile; ErrorCode="SCCP0001"; ErrorMetadata="LINE:3:COLUMN:0:" :) -declare %an:sequential function foo() { 1 }; +declare %sequential function foo() { 1 }; declare variable $var := foo(); (: variable declaration not allowed with non-updating and non-sequential expressions :) \ No newline at end of file diff --git a/src/test/resources/test_files/composability/VariableDeclarationStatementErr2.jq b/src/test/resources/test_files/composability/VariableDeclarationStatementErr2.jq index d15310222e..3e80507965 100644 --- a/src/test/resources/test_files/composability/VariableDeclarationStatementErr2.jq +++ b/src/test/resources/test_files/composability/VariableDeclarationStatementErr2.jq @@ -1,4 +1,4 @@ (:JIQS: ShouldNotCompile; ErrorCode="SCIN0001"; ErrorMetadata="LINE:2:COLUMN:0:" :) -%an:nonassignable variable $je; +%nonassignable variable $je; (: at least one expr is not simple :) \ No newline at end of file diff --git a/src/test/resources/test_files/parser/VariableDeclarationStatement.jq b/src/test/resources/test_files/parser/VariableDeclarationStatement.jq index e94cb569f5..67a82ced36 100644 --- a/src/test/resources/test_files/parser/VariableDeclarationStatement.jq +++ b/src/test/resources/test_files/parser/VariableDeclarationStatement.jq @@ -1,2 +1,2 @@ (:JIQS: ShouldParse :) -%an:nonassignable variable $uid := doc("users.xml").users.user_tuple[$$ eq "Roger Smith"].userid; \ No newline at end of file +%nonassignable variable $uid := doc("users.xml").users.user_tuple[$$ eq "Roger Smith"].userid; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/CreateDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/CreateDeltaTable.jq new file mode 100644 index 0000000000..80eb0295c5 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/CreateDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[4,0]; CreateTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/check-delta-transform/tempDeltaTable"; Output="" :) +let $data := parquet-file("../../../queries/sample-json.snappy.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/DeleteDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/DeleteDeltaTable.jq new file mode 100644 index 0000000000..fcbea7a15f --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/DeleteDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[4,3]; DeleteTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/check-delta-transform/tempDeltaTable"; Output="" :) +let $data := "" +return "" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDelta.jq b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDelta.jq new file mode 100644 index 0000000000..a3abf80a3b --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDelta.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[4,1]; Output="{ "bool" : true, "bool_array" : [ true ], "float" : 4.2, "float_array" : [ 4.2 ], "int64" : 42, "int64_array" : [ 42 ], "object" : { "bool" : true, "float" : 4.2, "int64" : 42, "object" : { "bool" : true }, "string" : "hello" }, "object_array" : [ { "bool" : true, "float" : 4.2, "int64" : 42, "object" : { "bool" : true }, "string" : "hello" } ], "string_array" : [ "hello" ], "string" : "null" }" :) +copy $je := delta-file("./tempDeltaTable") +modify replace value of json $je.string with "null" +return $je \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDeltaErr.jq b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDeltaErr.jq new file mode 100644 index 0000000000..9a6d699d59 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDeltaErr.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldCrash; UpdateDim=[4,2]; ErrorCode="XUDY0014"; ErrorMetadata="LINE:5:COLUMN:11:" :) +let $data := delta-file("./tempDeltaTable") +return ( + copy $je := {"a" : 1} + modify delete json $data.string + return $je +) +(: Attempt to modify mutable delta file value inside transform without copy :) diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayDelete.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayDelete.jq new file mode 100644 index 0000000000..fe541dcd82 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayDelete.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[5,7]; Output="[ "SUCCESS" ]" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.new_array[[1]]; +delta-file("./tempDeltaTable").new_array \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayInsert.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayInsert.jq new file mode 100644 index 0000000000..e74f7460fd --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayInsert.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[5,5]; Output="SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return insert json "SUCCESS" into $data.new_array at position 1; +delta-file("./tempDeltaTable").new_array[[1]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayReplace.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayReplace.jq new file mode 100644 index 0000000000..12858250db --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayReplace.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[5,6]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.new_array[[1]] with "DOUBLE SUCCESS"; +delta-file("./tempDeltaTable").new_array[[1]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectDelete.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectDelete.jq new file mode 100644 index 0000000000..177b46c424 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectDelete.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[5,4]; Output="null" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.success; +delta-file("./tempDeltaTable").success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectInsert.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectInsert.jq new file mode 100644 index 0000000000..19bd6bade4 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectInsert.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[5,1]; Output="(SUCCESS, [ "SUCCESS" ])" :) +let $data := delta-file("./tempDeltaTable") +return (insert json "new_ins" : "SUCCESS" into $data, insert json "new_array" : ["SUCCESS"] into $data); +(delta-file("./tempDeltaTable").new_ins, delta-file("./tempDeltaTable").new_array) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectRename.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectRename.jq new file mode 100644 index 0000000000..5614b20b56 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectRename.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[5,3]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return rename json $data.new_ins as "success"; +delta-file("./tempDeltaTable").success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectReplace.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectReplace.jq new file mode 100644 index 0000000000..212df1297d --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectReplace.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[5,2]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.new_ins with "DOUBLE SUCCESS"; +delta-file("./tempDeltaTable").new_ins \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionsCreateDeltaLakeTable.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionsCreateDeltaLakeTable.jq new file mode 100644 index 0000000000..2003ce8a59 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionsCreateDeltaLakeTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[5,0]; Output="true" :) +let $ret := create-delta-lake-table("./tempDeltaTable") +return $ret \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionsDeleteDeltaLakeTable.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionsDeleteDeltaLakeTable.jq new file mode 100644 index 0000000000..55473e11da --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionsDeleteDeltaLakeTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[5,8]; Output="true" :) +let $ret := delete-delta-lake-table("./tempDeltaTable") +return $ret \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/CreateDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/CreateDeltaTable.jq new file mode 100644 index 0000000000..e33e4fe550 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/CreateDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,0]; CreateTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/multirow-updates/tempDeltaTable"; Output="" :) +let $data := parquet-file("../../../queries/multirow.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/DeleteDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/DeleteDeltaTable.jq new file mode 100644 index 0000000000..005432527a --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/DeleteDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,20]; DeleteTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/multirow-updates/tempDeltaTable"; Output="" :) +let $data := "" +return "" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaArrayDelete.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaArrayDelete.jq new file mode 100644 index 0000000000..8a9f00780f --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaArrayDelete.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldRun; UpdateDim=[2,5]; Output="" :) +for $arr in delta-file("./tempDeltaTable").foobar +count $c1 +return + for $val in $arr[] + count $c2 + where $c1 eq $c2 + return delete json $arr[[$c2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck1.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck1.jq new file mode 100644 index 0000000000..b9e95c4802 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck1.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,2]; Output="(-1, -1)" :) +for $data in delta-file("./tempDeltaTable") +return $data.foo \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck2.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck2.jq new file mode 100644 index 0000000000..2de79a4a98 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck2.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,4]; Output="({ "is_1" : true, "is_not_1" : null }, { "is_1" : null, "is_not_1" : true })" :) +for $data in delta-file("./tempDeltaTable") +return {"is_1" : $data.is_1, "is_not_1" : $data.is_not_1} \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck3.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck3.jq new file mode 100644 index 0000000000..d19724c780 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck3.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,6]; Output="([ "test2" ], [ "test4" ])" :) +for $data in delta-file("./tempDeltaTable") +return $data.foobar \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck4.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck4.jq new file mode 100644 index 0000000000..57bb8e5e50 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck4.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,8]; Output="({ "is_1" : true, "is_not_1" : false }, { "is_1" : false, "is_not_1" : true })" :) +for $data in delta-file("./tempDeltaTable") +return {"is_1" : $data.is_1, "is_not_1" : $data.is_not_1} \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck5.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck5.jq new file mode 100644 index 0000000000..7a102cdda2 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck5.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,10]; Output="({ "is_1_2" : true, "is_not_1_2" : null }, { "is_1_2" : null, "is_not_1_2" : true })" :) +for $data in delta-file("./tempDeltaTable") +return {"is_1_2" : $data.is_1_2, "is_not_1_2" : $data.is_not_1_2} \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck6.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck6.jq new file mode 100644 index 0000000000..58f8cefb04 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck6.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,12]; Output="({ "is_1_2" : true, "is_not_1_2" : false }, { "is_1_2" : false, "is_not_1_2" : true })" :) +for $data in delta-file("./tempDeltaTable") +return {"is_1_2" : $data.is_1_2, "is_not_1_2" : $data.is_not_1_2} \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck7.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck7.jq new file mode 100644 index 0000000000..da94780307 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck7.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,14]; Output="({ "key1" : "value1" }, { "key1" : "value1" })" :) +for $data in delta-file("./tempDeltaTable") +return $data.nest \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck8.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck8.jq new file mode 100644 index 0000000000..e0b1e0bd90 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck8.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,16]; Output="({ "key1" : "value1", "key2" : "value2" }, { "key1" : "value1", "key2" : "value2" })" :) +for $data in delta-file("./tempDeltaTable") +return $data.nest \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert1.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert1.jq new file mode 100644 index 0000000000..dec3ec9841 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert1.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,13]; Output="" :) +for $data in delta-file("./tempDeltaTable") +return insert json { "nest" : { "key1" : "value1" } } into $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert2.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert2.jq new file mode 100644 index 0000000000..06f1ec6f69 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert2.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,15]; Output="" :) +for $data in delta-file("./tempDeltaTable") +return insert json "key2" : "value2" into $data.nest \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert.jq new file mode 100644 index 0000000000..9840b1fb22 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert.jq @@ -0,0 +1,9 @@ +(:JIQS: ShouldRun; UpdateDim=[2,3]; Output="" :) +for $data in delta-file("./tempDeltaTable") +count $c +return + if ($c eq 1) + then + insert json {"is_1" : true} into $data + else + insert json {"is_not_1" : true} into $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert2.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert2.jq new file mode 100644 index 0000000000..2bf0c4899d --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert2.jq @@ -0,0 +1,9 @@ +(:JIQS: ShouldRun; UpdateDim=[2,9]; Output="" :) +for $data in delta-file("./tempDeltaTable") +count $c +return + if ($c eq 1) + then + insert json {"is_1_2" : true} into $data + else + insert json {"is_not_1_2" : true} into $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert3.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert3.jq new file mode 100644 index 0000000000..b02277092c --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert3.jq @@ -0,0 +1,9 @@ +(:JIQS: ShouldRun; UpdateDim=[2,11]; Output="" :) +for $data in delta-file("./tempDeltaTable") +count $c +return + if ($c eq 1) + then + insert json {"is_not_1_2" : false} into $data + else + insert json {"is_1_2" : false} into $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectReplace.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectReplace.jq new file mode 100644 index 0000000000..f05fb5b2a6 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectReplace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,1]; Output="" :) +for $data in delta-file("./tempDeltaTable") +return replace value of json $data.foo with -1 \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaUpsert.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaUpsert.jq new file mode 100644 index 0000000000..f17973da44 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaUpsert.jq @@ -0,0 +1,14 @@ +(:JIQS: ShouldRun; UpdateDim=[2,7]; Output="" :) +declare updating function local:upsert($o as object, $key as string, $val as item) { + if($o.$key) + then + replace value of json $o.$key with $val + else + insert json $key : $val into $o +}; +for $data in delta-file("./tempDeltaTable") +count $c +return ( + local:upsert($data, "is_1", $c eq 1), + local:upsert($data, "is_not_1", $c ne 1) +) diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/CreateDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/CreateDeltaTable.jq new file mode 100644 index 0000000000..a0cb994520 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/CreateDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,0]; CreateTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/nested-updates/tempDeltaTable"; Output="" :) +let $data := parquet-file("../../../queries/nested_parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/DeleteDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/DeleteDeltaTable.jq new file mode 100644 index 0000000000..a9ed501929 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/DeleteDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,15]; DeleteTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/nested-updates/tempDeltaTable"; Output="" :) +let $data := "" +return "" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayDelete.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayDelete.jq new file mode 100644 index 0000000000..4334f51dde --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayDelete.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,13]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.object.object.object_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayInsert.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayInsert.jq new file mode 100644 index 0000000000..948015557e --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayInsert.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,9]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return insert json {"string" : "NEW SUCCESS" } into $data.object.object.object_array at position 2 \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayReplace.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayReplace.jq new file mode 100644 index 0000000000..0d1d9c9eda --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayReplace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,11]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.object.object.object_array[[2]] with { "string" : "NEW DOUBLE SUCCESS" } \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck1.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck1.jq new file mode 100644 index 0000000000..3cd20c96f3 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck1.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,2]; Output="SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[1]].new_ins \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck2.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck2.jq new file mode 100644 index 0000000000..25ea91ad00 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck2.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,4]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[1]].new_ins \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck3.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck3.jq new file mode 100644 index 0000000000..b3fd3479fc --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck3.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,6]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[1]].success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck4.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck4.jq new file mode 100644 index 0000000000..cb27982197 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck4.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,8]; Output="null" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[1]].success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck5.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck5.jq new file mode 100644 index 0000000000..49eee99bf5 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck5.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,10]; Output="{ "string" : "NEW SUCCESS" }" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck6.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck6.jq new file mode 100644 index 0000000000..5a23d90e0d --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck6.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,12]; Output="{ "string" : "NEW DOUBLE SUCCESS" }" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck7.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck7.jq new file mode 100644 index 0000000000..3af8cc118b --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck7.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,14]; Output="[ { "string" : "hello" } ]" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectDelete.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectDelete.jq new file mode 100644 index 0000000000..ad085737b3 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectDelete.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,7]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.object.object.object_array[[1]].success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectInsert.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectInsert.jq new file mode 100644 index 0000000000..1225fd497e --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectInsert.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,1]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return insert json "new_ins" : "SUCCESS" into $data.object.object.object_array[[1]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectRename.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectRename.jq new file mode 100644 index 0000000000..3f832e9c20 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectRename.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,5]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return rename json $data.object.object.object_array[[1]].new_ins as "success" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectReplace.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectReplace.jq new file mode 100644 index 0000000000..762c7b1d0c --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectReplace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,3]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.object.object.object_array[[1]].new_ins with "DOUBLE SUCCESS" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/CreateDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/CreateDeltaTable.jq new file mode 100644 index 0000000000..aaf6ee4972 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/CreateDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,0]; CreateTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/simple-updates/tempDeltaTable"; Output="" :) +let $data := parquet-file("../../../queries/sample-json.snappy.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/DeleteDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/DeleteDeltaTable.jq new file mode 100644 index 0000000000..52f4b677bb --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/DeleteDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,15]; DeleteTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/simple-updates/tempDeltaTable"; Output="" :) +let $data := "" +return "" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayDelete.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayDelete.jq new file mode 100644 index 0000000000..8cda6c5961 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayDelete.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,13]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.string_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayInsert.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayInsert.jq new file mode 100644 index 0000000000..e6190a18d8 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayInsert.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,9]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return insert json "SUCCESS" into $data.string_array at position 2 \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayReplace.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayReplace.jq new file mode 100644 index 0000000000..dc3eab8bf4 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayReplace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,11]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.string_array[[2]] with "DOUBLE SUCCESS" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck1.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck1.jq new file mode 100644 index 0000000000..38a5429ba7 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck1.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,2]; Output="null" :) +let $data := delta-file("./tempDeltaTable") +return $data.bool \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck2.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck2.jq new file mode 100644 index 0000000000..9a8b6e73fa --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck2.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,4]; Output="SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.new_ins \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck3.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck3.jq new file mode 100644 index 0000000000..a9d5a32a21 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck3.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,6]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.new_ins \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck4.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck4.jq new file mode 100644 index 0000000000..70ad65ad1b --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck4.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,8]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck5.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck5.jq new file mode 100644 index 0000000000..065f117e7d --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck5.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,10]; Output="SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.string_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck6.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck6.jq new file mode 100644 index 0000000000..44f6d47e97 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck6.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,12]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.string_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck7.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck7.jq new file mode 100644 index 0000000000..883594e1da --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck7.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,14]; Output="[ "hello" ]" :) +let $data := delta-file("./tempDeltaTable") +return $data.string_array \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectDelete.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectDelete.jq new file mode 100644 index 0000000000..2272f9b7ed --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectDelete.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,1]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.bool \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectInsert.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectInsert.jq new file mode 100644 index 0000000000..072bd22d5f --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectInsert.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,3]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return insert json "new_ins" : "SUCCESS" into $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectRename.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectRename.jq new file mode 100644 index 0000000000..0c3e0e50e2 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectRename.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,7]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return rename json $data.new_ins as "success" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectReplace.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectReplace.jq new file mode 100644 index 0000000000..e3e29f83d6 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectReplace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,5]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.new_ins with "DOUBLE SUCCESS" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/CreateDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/CreateDeltaTable.jq new file mode 100644 index 0000000000..9fc124a3d2 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/CreateDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,0]; CreateTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/R"; Output="" :) +let $data := parquet-file("../../../queries/xQuery_update_R_data/R.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/DeleteDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/DeleteDeltaTable.jq new file mode 100644 index 0000000000..bbe196ccd5 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/DeleteDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,20]; DeleteTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/R"; Output="" :) +let $data := "" +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1.jq new file mode 100644 index 0000000000..f4a0b62e42 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,1]; Output="" :) +let $users := delta-file("./R").users +return append json {"userID" : "U07", "name" : "Annabel Lee"} into $users \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1Check.jq new file mode 100644 index 0000000000..c42bf70c15 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,2]; Output="[ { "name" : "Tom Jones", "rating" : "B", "userID" : "U01" }, { "name" : "Mary Doe", "rating" : "A", "userID" : "U02" }, { "name" : "Dee Linquent", "rating" : "D", "userID" : "U03" }, { "name" : "Roger Smith", "rating" : "C", "userID" : "U04" }, { "name" : "Jack Sprat", "rating" : "B", "userID" : "U05" }, { "name" : "Rip Van Winkle", "rating" : "B", "userID" : "U06" }, { "name" : "Annabel Lee", "userID" : "U07" } ]" :) +let $users := delta-file("./R").users +return $users \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2.jq new file mode 100644 index 0000000000..8e3914ee2e --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,3]; Output="" :) +let $bids := delta-file("./R").bids +return append json {"userID" : "U07", "itemNO" : 1001, "bid" : 60, "bid_date" : "1999-02-01"} into $bids \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2Check.jq new file mode 100644 index 0000000000..f48dbc19f5 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,4]; Output="[ { "bid" : 35, "bid_date" : "1999-01-07", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 40, "bid_date" : "1999-01-08", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 45, "bid_date" : "1999-01-11", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 50, "bid_date" : "1999-01-13", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 55, "bid_date" : "1999-01-15", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 400, "bid_date" : "1999-02-14", "itemNO" : 1002, "userID" : "U01" }, { "bid" : 600, "bid_date" : "1999-02-16", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 800, "bid_date" : "1999-02-17", "itemNO" : 1002, "userID" : "U03" }, { "bid" : 1000, "bid_date" : "1999-02-25", "itemNO" : 1002, "userID" : "U04" }, { "bid" : 1200, "bid_date" : "1999-03-02", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 15, "bid_date" : "1999-01-22", "itemNO" : 1003, "userID" : "U04" }, { "bid" : 20, "bid_date" : "1999-02-03", "itemNO" : 1003, "userID" : "U05" }, { "bid" : 40, "bid_date" : "1999-03-05", "itemNO" : 1004, "userID" : "U01" }, { "bid" : 175, "bid_date" : "1999-01-25", "itemNO" : 1007, "userID" : "U03" }, { "bid" : 200, "bid_date" : "1999-02-08", "itemNO" : 1007, "userID" : "U05" }, { "bid" : 225, "bid_date" : "1999-02-12", "itemNO" : 1007, "userID" : "U04" }, { "bid" : 60, "bid_date" : "1999-02-01", "itemNO" : 1001, "userID" : "U07" } ]" :) +let $bids := delta-file("./R").bids +return $bids \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3.jq new file mode 100644 index 0000000000..3af1edb570 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3.jq @@ -0,0 +1,7 @@ +(:JIQS: ShouldRun; UpdateDim=[3,5]; Output="" :) +let $R := delta-file("./R") +let $users := $R.users[] +let $bids := $R.bids[] +let $uid := $users[$$.name eq "Annabel Lee"].userID +let $top_bid := max($bids[$$.itemNO eq 1002].bid) +return append json {"userID" : $uid, "itemNO" : 1002, "bid" : $top_bid * 1.1, "bid_date" : "1999-02-01"} into $R.bids \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3Check.jq new file mode 100644 index 0000000000..0276f2c2aa --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,6]; Output="({ "bid" : 35, "bid_date" : "1999-01-07", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 40, "bid_date" : "1999-01-08", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 45, "bid_date" : "1999-01-11", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 50, "bid_date" : "1999-01-13", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 55, "bid_date" : "1999-01-15", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 400, "bid_date" : "1999-02-14", "itemNO" : 1002, "userID" : "U01" }, { "bid" : 600, "bid_date" : "1999-02-16", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 800, "bid_date" : "1999-02-17", "itemNO" : 1002, "userID" : "U03" }, { "bid" : 1000, "bid_date" : "1999-02-25", "itemNO" : 1002, "userID" : "U04" }, { "bid" : 1200, "bid_date" : "1999-03-02", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 15, "bid_date" : "1999-01-22", "itemNO" : 1003, "userID" : "U04" }, { "bid" : 20, "bid_date" : "1999-02-03", "itemNO" : 1003, "userID" : "U05" }, { "bid" : 40, "bid_date" : "1999-03-05", "itemNO" : 1004, "userID" : "U01" }, { "bid" : 175, "bid_date" : "1999-01-25", "itemNO" : 1007, "userID" : "U03" }, { "bid" : 200, "bid_date" : "1999-02-08", "itemNO" : 1007, "userID" : "U05" }, { "bid" : 225, "bid_date" : "1999-02-12", "itemNO" : 1007, "userID" : "U04" }, { "bid" : 60, "bid_date" : "1999-02-01", "itemNO" : 1001, "userID" : "U07" }, { "bid" : 1320, "bid_date" : "1999-02-01", "itemNO" : 1002, "userID" : "U07" })" :) +let $bids := delta-file("./R").bids[] +return $bids \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4.jq new file mode 100644 index 0000000000..956b2c7502 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4.jq @@ -0,0 +1,9 @@ +(:JIQS: ShouldRun; UpdateDim=[3,7]; Output="" :) +for $user in delta-file("./R").users[] +where $user.name eq "Annabel Lee" +return + if ($user.rating) + then + replace value of json $user.rating with "B" + else + insert json "rating" : "B" into $user \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4Check.jq new file mode 100644 index 0000000000..efc46afd7c --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,8]; Output="[ { "name" : "Tom Jones", "rating" : "B", "userID" : "U01" }, { "name" : "Mary Doe", "rating" : "A", "userID" : "U02" }, { "name" : "Dee Linquent", "rating" : "D", "userID" : "U03" }, { "name" : "Roger Smith", "rating" : "C", "userID" : "U04" }, { "name" : "Jack Sprat", "rating" : "B", "userID" : "U05" }, { "name" : "Rip Van Winkle", "rating" : "B", "userID" : "U06" }, { "name" : "Annabel Lee", "rating" : "B", "userID" : "U07" } ]" :) +let $users := delta-file("./R").users +return $users \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5.jq new file mode 100644 index 0000000000..8299917db7 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5.jq @@ -0,0 +1,12 @@ +(:JIQS: ShouldRun; UpdateDim=[3,9]; Output="" :) +let $R := delta-file("./R") +let $bids := $R.bids[] +let $users := $R.users[] +let $uid := $users[$$.name eq "Annabel Lee"].userID +let $top_bid := max($bids[$$.itemNO eq 1007].bid) +return + if ($top_bid * 1.1 le 200) + then + append json {"userID" : $uid, "itemNO" : 1007, "bid" : $top_bid * 1.1, "bid_date" : "1999-02-01"} into $R.bids + else + () \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5Check.jq new file mode 100644 index 0000000000..34afea2d7c --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,10]; Output="[ { "bid" : 35, "bid_date" : "1999-01-07", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 40, "bid_date" : "1999-01-08", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 45, "bid_date" : "1999-01-11", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 50, "bid_date" : "1999-01-13", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 55, "bid_date" : "1999-01-15", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 400, "bid_date" : "1999-02-14", "itemNO" : 1002, "userID" : "U01" }, { "bid" : 600, "bid_date" : "1999-02-16", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 800, "bid_date" : "1999-02-17", "itemNO" : 1002, "userID" : "U03" }, { "bid" : 1000, "bid_date" : "1999-02-25", "itemNO" : 1002, "userID" : "U04" }, { "bid" : 1200, "bid_date" : "1999-03-02", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 15, "bid_date" : "1999-01-22", "itemNO" : 1003, "userID" : "U04" }, { "bid" : 20, "bid_date" : "1999-02-03", "itemNO" : 1003, "userID" : "U05" }, { "bid" : 40, "bid_date" : "1999-03-05", "itemNO" : 1004, "userID" : "U01" }, { "bid" : 175, "bid_date" : "1999-01-25", "itemNO" : 1007, "userID" : "U03" }, { "bid" : 200, "bid_date" : "1999-02-08", "itemNO" : 1007, "userID" : "U05" }, { "bid" : 225, "bid_date" : "1999-02-12", "itemNO" : 1007, "userID" : "U04" }, { "bid" : 60, "bid_date" : "1999-02-01", "itemNO" : 1001, "userID" : "U07" }, { "bid" : 1320, "bid_date" : "1999-02-01", "itemNO" : 1002, "userID" : "U07" } ]" :) +let $bids := delta-file("./R").bids +return $bids \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6.jq new file mode 100644 index 0000000000..b39a77026b --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6.jq @@ -0,0 +1,21 @@ +(:JIQS: ShouldRun; UpdateDim=[3,11]; Output="" :) +let $R := delta-file("./R") +let $usersSeq := $R.users[] +let $remove_uid := $usersSeq[$$.name eq "Dee Linquent"].userID +return + ( + for $item in $R.items[] + count $c + where $item.offered_by = $remove_uid + return delete json $R.items[[$c]] + , + for $bid in $R.bids[] + count $c + where $bid.userID = $remove_uid + return delete json $R.bids[[$c]] + , + for $user in $R.users[] + count $c + where $user.name eq "Dee Linquent" + return delete json $R.users[[$c]] + ) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6Check.jq new file mode 100644 index 0000000000..177704a837 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,12]; Output="{ "bids" : [ { "bid" : 35, "bid_date" : "1999-01-07", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 40, "bid_date" : "1999-01-08", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 45, "bid_date" : "1999-01-11", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 50, "bid_date" : "1999-01-13", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 55, "bid_date" : "1999-01-15", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 400, "bid_date" : "1999-02-14", "itemNO" : 1002, "userID" : "U01" }, { "bid" : 600, "bid_date" : "1999-02-16", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 1000, "bid_date" : "1999-02-25", "itemNO" : 1002, "userID" : "U04" }, { "bid" : 1200, "bid_date" : "1999-03-02", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 15, "bid_date" : "1999-01-22", "itemNO" : 1003, "userID" : "U04" }, { "bid" : 20, "bid_date" : "1999-02-03", "itemNO" : 1003, "userID" : "U05" }, { "bid" : 40, "bid_date" : "1999-03-05", "itemNO" : 1004, "userID" : "U01" }, { "bid" : 200, "bid_date" : "1999-02-08", "itemNO" : 1007, "userID" : "U05" }, { "bid" : 225, "bid_date" : "1999-02-12", "itemNO" : 1007, "userID" : "U04" }, { "bid" : 60, "bid_date" : "1999-02-01", "itemNO" : 1001, "userID" : "U07" }, { "bid" : 1320, "bid_date" : "1999-02-01", "itemNO" : 1002, "userID" : "U07" } ], "items" : [ { "description" : "Red Bicycle", "end_date" : "1999-01-20", "itemNO" : "1001", "offered_by" : "U01", "reserve_price" : 40, "start_date" : "1999-01-05" }, { "description" : "Motorcycle", "end_date" : "1999-03-15", "itemNO" : "1002", "offered_by" : "U02", "reserve_price" : 500, "start_date" : "1999-02-11" }, { "description" : "Old Bicycle", "end_date" : "1999-02-20", "itemNO" : "1003", "offered_by" : "U02", "reserve_price" : 25, "start_date" : "1999-01-10" }, { "description" : "Tricycle", "end_date" : "1999-03-08", "itemNO" : "1004", "offered_by" : "U01", "reserve_price" : 15, "start_date" : "1999-02-25" }, { "description" : "Racing Bicycle", "end_date" : "1999-02-20", "itemNO" : "1007", "offered_by" : "U04", "reserve_price" : 200, "start_date" : "1999-01-20" }, { "description" : "Broken Bicycle", "end_date" : "1999-03-06", "itemNO" : "1008", "offered_by" : "U01", "reserve_price" : 25, "start_date" : "1999-02-05" } ], "users" : [ { "name" : "Tom Jones", "rating" : "B", "userID" : "U01" }, { "name" : "Mary Doe", "rating" : "A", "userID" : "U02" }, { "name" : "Roger Smith", "rating" : "C", "userID" : "U04" }, { "name" : "Jack Sprat", "rating" : "B", "userID" : "U05" }, { "name" : "Rip Van Winkle", "rating" : "B", "userID" : "U06" }, { "name" : "Annabel Lee", "rating" : "B", "userID" : "U07" } ] }" :) +let $R := delta-file("./R") +return $R \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-spark/FileInputs/Delta.jq b/src/test/resources/test_files/runtime-spark/FileInputs/Delta.jq new file mode 100644 index 0000000000..2d0ba36f97 --- /dev/null +++ b/src/test/resources/test_files/runtime-spark/FileInputs/Delta.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; Output="{ "bool_array" : [ true ], "float" : 4.2, "float_array" : [ 4.2 ], "int64" : 42, "int64_array" : [ 42 ], "object" : { "bool" : true, "float" : 4.2, "int64" : 42, "object" : { "bool" : true }, "string" : "hello" }, "object_array" : [ { "bool" : true, "float" : 4.2, "int64" : 42, "object" : { "bool" : true }, "string" : "hello" } ], "string" : "hello", "string_array" : [ "hello" ] }" :) +delta-file("../../../queries/sample_json_delta") + diff --git a/src/test/resources/test_files/runtime-spark/FileInputs/DeltaFile-Error-NotFound1.jq b/src/test/resources/test_files/runtime-spark/FileInputs/DeltaFile-Error-NotFound1.jq new file mode 100644 index 0000000000..96782c23c5 --- /dev/null +++ b/src/test/resources/test_files/runtime-spark/FileInputs/DeltaFile-Error-NotFound1.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldCrash; ErrorCode="FODC0002"; ErrorMetadata="LINE:2;COLUMN:0;" :) +delta-file("./does-not-exist") diff --git a/src/test/resources/test_files/runtime/ScriptingComplex/RecursiveFunctionWithLocalArgument.jq b/src/test/resources/test_files/runtime/ScriptingComplex/RecursiveFunctionWithLocalArgument.jq index 96ea32b888..016846e132 100644 --- a/src/test/resources/test_files/runtime/ScriptingComplex/RecursiveFunctionWithLocalArgument.jq +++ b/src/test/resources/test_files/runtime/ScriptingComplex/RecursiveFunctionWithLocalArgument.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldRun; Output="0":) -declare %an:assignable variable $x := 3; +declare %assignable variable $x := 3; declare function local:recursive_decrement_x($to_change) { if ($x gt 0) then { $x := $x - 1; diff --git a/src/test/resources/test_files/runtime/ScriptingComplex/UpdateGlobalVariableWithUsernames.jq b/src/test/resources/test_files/runtime/ScriptingComplex/UpdateGlobalVariableWithUsernames.jq index 5f8edf653d..0ec946fda6 100644 --- a/src/test/resources/test_files/runtime/ScriptingComplex/UpdateGlobalVariableWithUsernames.jq +++ b/src/test/resources/test_files/runtime/ScriptingComplex/UpdateGlobalVariableWithUsernames.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldRun; Output="({ "name" : "test@test.com", "failed" : false, "email_verified" : true, "access-attempt" : "2016-11-28T16:00:47.203Z" }, { "name" : "test1@test.com", "failed" : false, "email_verified" : true, "access-attempt" : "2016-11-28T16:00:47.203Z" }, { "name" : "aaa@aaa.com", "failed" : false, "email_verified" : true, "access-attempt" : "2016-11-28T16:00:47.203Z" }, { "name" : "a@a.com", "failed" : false, "email_verified" : true, "access-attempt" : "2016-11-28T16:00:47.203Z" }, { "name" : "test9999@test.com", "failed" : false, "email_verified" : true, "access-attempt" : "2016-11-28T16:00:47.203Z" })" :) -declare %an:assignable variable $res as item* := (); +declare %assignable variable $res as item* := (); declare function local:validate-and-return($username as xs:string) { variable $user-doc := json-doc("../../../queries/user-names.json"); variable $log := {}; diff --git a/src/test/resources/test_files/runtime/Updating/MultipleUpdatesArray6.jq b/src/test/resources/test_files/runtime/Updating/MultipleUpdatesArray6.jq new file mode 100644 index 0000000000..b5bd41bff6 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/MultipleUpdatesArray6.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; Output="[ 1, 2, 4 ]" :) +copy $je := [1 to 4] +modify (replace value of json $je[[3]] with 6, delete json $je[[3]]) +return $je \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/MultipleUpdatesObject5.jq b/src/test/resources/test_files/runtime/Updating/MultipleUpdatesObject5.jq new file mode 100644 index 0000000000..e77eb37e3a --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/MultipleUpdatesObject5.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; Output="{ "b" : 2, "c" : 3, "d" : 4 }" :) +copy $je := {"a": 1, "b": 2, "c": 3, "d": 4} +modify (delete json $je.a, replace value of json $je.a with 5) +return $je \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/SimpleDeleteErr7.jq b/src/test/resources/test_files/runtime/Updating/SimpleDeleteErr7.jq new file mode 100644 index 0000000000..c16a2967af --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/SimpleDeleteErr7.jq @@ -0,0 +1,6 @@ +(:JIQS: ShouldCrash; ErrorCode="JNUP0016"; ErrorMetadata="LINE:3:COLUMN:38:" :) +copy $je := {"a" : 1} +modify (insert json "b" : 4 into $je, delete json $je.b) +return $je + +(: selector string does not exist in target object in snapshot :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/SimpleInsertErr10.jq b/src/test/resources/test_files/runtime/Updating/SimpleInsertErr10.jq new file mode 100644 index 0000000000..6585bc5cfe --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/SimpleInsertErr10.jq @@ -0,0 +1,6 @@ +(:JIQS: ShouldCrash; ErrorCode="JNUP0016"; ErrorMetadata="LINE:3:COLUMN:7:" :) +copy $je := [1 to 4] +modify insert json 5 into $je at position 6 +return $je + +(: selector expr does not evaluate to int within range of the target array :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/SimpleInsertErr11.jq b/src/test/resources/test_files/runtime/Updating/SimpleInsertErr11.jq new file mode 100644 index 0000000000..ace107d8de --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/SimpleInsertErr11.jq @@ -0,0 +1,6 @@ +(:JIQS: ShouldCrash; ErrorCode="JNUP0006"; ErrorMetadata="LINE:3:COLUMN:27:" :) +copy $je := {"a": 1, "b": 2, "c": 3, "d": 4} +modify (delete json $je.a, insert json "a" : 10 into $je) +return $je + +(: selector key already exists in object in snapshot :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/SimpleTransformErr10.jq b/src/test/resources/test_files/runtime/Updating/SimpleTransformErr10.jq new file mode 100644 index 0000000000..f382ed3c90 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/SimpleTransformErr10.jq @@ -0,0 +1,20 @@ +(:JIQS: ShouldCrash; ErrorCode="XUDY0014"; ErrorMetadata="LINE:10:COLUMN:27:" :) +copy $je := [1 to 4] +modify () +return ( + let $x := ( + copy $ej := [5 to 8] + modify ( + let $x := ( + copy $ee := [5 to 8] + modify delete json $je[[1]] + return $ee + ) + return delete json $ej[[2]] + ) + return $ej + ) + return $je +) + +(: target of modify is not same level copy var :) diff --git a/src/test/resources/test_files/runtime/Updating/SimpleTransformErr6.jq b/src/test/resources/test_files/runtime/Updating/SimpleTransformErr6.jq index 488b27d517..46fae609c8 100644 --- a/src/test/resources/test_files/runtime/Updating/SimpleTransformErr6.jq +++ b/src/test/resources/test_files/runtime/Updating/SimpleTransformErr6.jq @@ -5,4 +5,4 @@ let $y := copy $je := [1 to 4] return $je return $x -(: target of modify is not same level copy var :) +(: target of modify is not mutable :) diff --git a/src/test/resources/test_files/runtime/Updating/SimpleUpdateErr1.jq b/src/test/resources/test_files/runtime/Updating/SimpleUpdateErr1.jq new file mode 100644 index 0000000000..1105d41ac6 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/SimpleUpdateErr1.jq @@ -0,0 +1,5 @@ +(:JIQS: ShouldRun; Output="" :) +let $data := {"bool" : true, "int": 10} +return delete json $data.bool + +(: attempt to modify immutable variable :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunction1.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunction1.jq new file mode 100644 index 0000000000..c8959ac0ac --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunction1.jq @@ -0,0 +1,11 @@ +(:JIQS: ShouldRun; Output="{ "a" : 1, "b" : 2, "c" : 3 }" :) +declare updating function local:upsert($o as object, $key as string, $val as item) { + if($o.$key) + then + replace value of json $o.$key with $val + else + insert json $key : $val into $o +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert($je, "c", 3) +return $je diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunction2.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunction2.jq new file mode 100644 index 0000000000..4bd8628fa2 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunction2.jq @@ -0,0 +1,7 @@ +(:JIQS: ShouldRun; Output="{ "a" : 1, "b" : 2 }" :) +declare updating function local:upsert($o as object, $key as string, $val as item) { + () +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert($je, "c", 3) +return $je diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr1.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr1.jq new file mode 100644 index 0000000000..0ffb4c760e --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr1.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldCrash; ErrorCode="XUST0001"; ErrorMetadata="LINE:6:COLUMN:20:" :) +declare updating function local:upsert($o as object, $key as string, $val as item) { + () +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert(insert json "c" : 3 into $je, "c", 3) +return $je +(: argument of function call is not simple :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr2.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr2.jq new file mode 100644 index 0000000000..54e06fd8c0 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr2.jq @@ -0,0 +1,7 @@ +(:JIQS: ShouldCrash; ErrorCode="XUST0001"; ErrorMetadata="LINE:2:COLUMN:0:" :) +declare function local:upsert($o as object, $key as string, $val as item) { + insert json $key : $val into $o +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert($je, "c", 3) +return $je diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr3.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr3.jq new file mode 100644 index 0000000000..cb44b83486 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr3.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldCrash; ErrorCode="XUST0028"; ErrorMetadata="LINE:2:COLUMN:0:" :) +declare updating function local:upsert($o as object, $key as string, $val as item) as item* { + () +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert($je, "c", 3) +return $je +(: declared updating function has return type :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr4.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr4.jq new file mode 100644 index 0000000000..3a0a8f7a5b --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr4.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldCrash; ErrorCode="XUST0002"; ErrorMetadata="LINE:2:COLUMN:0:" :) +declare updating function local:upsert($o as object, $key as string, $val as item) { + $val +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert($je, "c", 3) +return $je +(: updating function has simple body :) \ No newline at end of file diff --git a/src/test/resources/test_files/sequential/BlockStatementSequential.jq b/src/test/resources/test_files/sequential/BlockStatementSequential.jq index d8bee5457c..c7c92f713a 100644 --- a/src/test/resources/test_files/sequential/BlockStatementSequential.jq +++ b/src/test/resources/test_files/sequential/BlockStatementSequential.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldCompile :) -declare %an:sequential function foo() { 1 }; +declare %sequential function foo() { 1 }; { variable $x := 3; diff --git a/src/test/resources/test_files/sequential/non-sequential/NonSequential7.jq b/src/test/resources/test_files/sequential/non-sequential/NonSequential7.jq index 8ff7481c3b..74aa093cdb 100644 --- a/src/test/resources/test_files/sequential/non-sequential/NonSequential7.jq +++ b/src/test/resources/test_files/sequential/non-sequential/NonSequential7.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldCompile :) -declare %an:nonsequential function foo() { 1 }; +declare %nonsequential function foo() { 1 }; { variable $x := 3;